Вызывай эту процедуру с параметром в HL.
Вид для печати
Вызывай эту процедуру с параметром в HL.
как это по удобней сделать чтоб, с учетом того что я работаю из под бэйсика?
Из бейсика делаешь два POKE и вызываеш процедуру.
Или делай много входов процедуру:
Код:PIC1: ld hl,50000
jr MAIN
PIC2: ld hl,50400
jr MAIN
....
PICX: ld hl,xxxxxx
jr MAIN
MAIN: ld ix,32774
loop ld a,(hl)
ld (ix + 2),a
inc hl
ld a,(hl)
ld (ix + 0),
Смотрите, у вас программа начинается с адреса 30000 (любимое всеми новичками). Тогда команда LD HL,XXYY будет занимать ячейки 30000, 30001 и 30002.
Младший байт адреса будет в ячейке 30001, старший в 30002.
Тогда из Бейсика достаточно написать POKE 30001,<некое нравящееся число> и потом делать запуск.
Зачем надо для каждого момента создавать новую тему? Пиши в той же. Посты перенес.
Сначала поворчу:
Поаккуратнее так... Могут прокомментировать жоско.
А вот так не делаем больше совсем. Всегда пишем как не работает, что показывается/не показывается, как ведет себя программа/компилятор...
Теперь по делу. Итак, как я понимаю, у тебя есть табличка типа этого:
Еще допустим, что ты дописал первой строчкой к моему коду ORG 40000, то есть, положил программу в 40000 и оттуда же ее запускаешь.Код:Экран Адрес
--------------
1 50000
2 51000
3 52000
...
Тебе предложили несколько способов вызова, сейчас распишу подробнее.
Итак, способ №1, самый простой и самый медленный: адрес спрайтовой карты задается в коде первой строкой: ld hl,50000. Чтобы менять его из BASIC'а, надо сделать так примерно:
Способ №2 - побыстрее способа №1, но его нельзя использовать если в отсальной программе используется функция Бэйсика RNDКод:1000 LET HL=50000: REM HL - адрес нужной карты спрйатов (51000, 52000...)
1010 LET H=INT(HL/256): LET L=HL-H*256
1020 POKE 50001,L: POKE 50002,H
1030 RANDOMIZE USR 40000
Эти 2 способа не требуют изменения ассемблерной программы.Код:1000 LET HL=50000: REM HL - адрес нужной карты спрйатов (51000, 52000...)
1010 RANDOMIZE HL
1020 POKE 50001,PEEK 23670: POKE 50002,PEEK 23671
1030 RANDOMIZE USR 40000
Способ №3 - самый быстрый, но несколько расточительный по памяти.
Что надо:
1) убрать строку ld hl,50000 в начале программы.
2) в следующую после убранной строчку в поле меток написать метку main
3) для каждой спрайтовой карты дописать перед строкой с main (после ORG) такие строки:
4) если номер спрайтовой карты хранится в переменной N, то для вывода каждой карты надо написать RANDOMNIZE USR 40000+N*5 (потому что ld hl,NNNN: jr main занимает 5 байт).Код:ld hl,50000
jr main
ld hl,51000
jr main
ld hl,52000
jr main
...
Есть способы еще поменьше и побыстрее, но предлагаю их пока отложить.
Кстати, у меня к тебе есть 2 вопроса:
1) зачем ты загружаешь код вывода спрайтов в 32768? У тебя для Бэйсика останется всего 32768-23755 =~ 9 Кб, что очень мало для игры. Ты говорил, что не смог написать игру с помощью Laser Basic'а потому, что тебе не хватило места - но он располагается гораздо ниже, в районе 50000 примерно, то есть под Бэйсик оставалось 26 Кб - и этого тебе не хватило.
2) Если ты исползуешь Sprite Graber, то процедура вывода карты может быть уменьшена и ускорена. Если надо - обращайся.
32768 это временное место расположение. Подниму выше. На лазерб не хватило памяти, потому что я расположение координаты спрайтов хранил в том же бэйсике, а это много занимало. Сейчас же у меня 40 экранов вместе с координатами весят 10 кб. и их я могу засунуть куда угодно). А сколько как правило памяти занимают переменные в бэйсике? Есть способы узнать это?