Вход

Просмотр полной версии : Что не так в коде?



shuran33
09.11.2013, 23:03
Подскажите, что не так в простом коде? Вроде должно все работать, но выдает ошибку "B Integer Out of Range" :v2_conf2:


ORG 40000
LD BC,#6464 ;координаты точки
LD L,30
L1 CALL #22E5 ;процедура печати точки
INC BC
DEC L
JR NZ,L1
RET

lisica
09.11.2013, 23:18
Хм, а мож надо перед вызовом сохранить BC и HL в стеке, а после восстановить?

shuran33
09.11.2013, 23:23
Да, все получилось. Значит процедура печати точки портит регистры? Получается всегда надо сохранять значения, чтобы воспользоваться подпрограммами ПЗУ?

lisica
09.11.2013, 23:24
Выходит что так.

Shadow Maker
09.11.2013, 23:46
Shuran33, ну ты бы защел и посмотрел в этой процедуре что происходит, вопросов бы лишних и не возникло, благо щас в любом эмуляторе можно посмотреть.

Лас
10.11.2013, 01:23
Получается всегда надо сохранять значения, чтобы воспользоваться подпрограммами ПЗУ?
Если бы в каждой подпрограмме ПЗУ Спектрума выполнялись операции сохранения и восстановления регистров, то Викерс бы не уложился в объем 16 КБ. :)

Alex Rider
10.11.2013, 03:44
Выходит что так.
Вы тут ща запугаете народ - они и перед RST #10 или #1f54 начнут сохранять все, включая альтернативные и индексные регистры :)

drbars
14.11.2013, 06:34
Там после процедуры вывода точки похоже нужно делать так:



ORG 40000
LD BC,#6464 ;координаты точки
LD L,30
L1 CALL #22E5 ;процедура печати точки
LD BC,(#5C7D)
INC BC
DEC L
JR NZ,L1
RET

Alex Rider
14.11.2013, 14:42
Там после процедуры вывода точки похоже нужно делать так:
Регистр L надо сохранять, в нем счетчик точек. И INC BC там не к чему - надо делать INC C.

shuran33
14.11.2013, 21:16
А тогда еще вопрос. Как в аласме можно хранить переменные?

Вот так можно? :


LD A,(date)
RST #10

date 62,63,45,43



И еще интересно где лучше хранить данные? На стеке нежелательно наверное?

goodboy
14.11.2013, 22:19
Как в аласме можно хранить переменные?
скорее смотри в сторону EQU

nyuk
14.11.2013, 23:01
скорее смотри в сторону EQU
Да можно и предложенным автором способом тоже. Можно и прямо в коде, типа:


ld (LABEL1 +1), 62
...
...
ld (LABEL1 +1), 63
...
...
LABEL1 ld A, #00
Всё от конкретной задачи зависит.

Alex Rider
15.11.2013, 10:36
скорее смотри в сторону EQU
EQU определяет константы.

Да можно и предложенным автором способом тоже. Можно и прямо в коде, типа:
Код:
ld (LABEL1 +1), 62
...
...
ld (LABEL1 +1), 63
...
...
LABEL1 ld A, #00

Ужас!!! Откуда вы взяли, что Z80 может заслать константу в ячейку памяти без использования регистров вообще?!

Вот так можно?
Можно-то можно, только не понятно у тебя что такое date. Это именно массив из четырех чисел (букв)? Тогда обращения будут ld a,(data), ld a,(data + 1) и так далее.

И еще интересно где лучше хранить данные?
А что за данные? Вообще, присваиваешь им метку и перечисляешь их после db, dw. Если данных много и они во внешнем файле на PC (например, картинка или музыка), подключаешь их INCBIN'ом с меткой. Просто в обычной памяти, для начала, желательно после #6000 = 24576.


На стеке нежелательно наверное?
Да, стек не для этого придуман. Стек нужен для временного запоминания неиспользуемых в данный момент регистров чтобы можно было загрузитьв них что-то более нужное в данный момент. Ну и да, в стеке хранятся адреса возврата из подпрограмм. Большие данные в стеке хранить вообще говоря не запрещено, но это нетривиально и черевато ошибками.

shuran33
15.11.2013, 15:15
А что за данные? Вообще, присваиваешь им метку и перечисляешь их после db, dw. Если данных много и они во внешнем файле на PC (например, картинка или музыка), подключаешь их INCBIN'ом с меткой. Просто в обычной памяти, для начала, желательно после #6000 = 24576.

Данные будут координаты - x,y. Координат будет около 10 и все они будут постоянно меняться.

На счет EQU - то постоянные тоже будут, так что думаю это тоже пригодится

Alex Rider
15.11.2013, 18:02
Данные будут координаты - x,y. Координат будет около 10 и все они будут постоянно меняться.
В цикле будешь их перебирать? Если так, то да, твой вариант оптимальный.

nyuk
15.11.2013, 18:26
Ужас!!! Откуда вы взяли, что Z80 может заслать константу в ячейку памяти без использования регистров вообще?!
Извините, писал в измененном сознании. Больше не повторится.
Естественно, имелось ввиду что-то типа ld hl, LABEL1 + 1 : ld (hl), 62 или ld a, 62 : ld (LABEL + 1), a

Ну раз уж концепция хранения переменных в коде не канает в качестве ОДНОГО ИЗ ВАРИАНТОВ, можно забыть.

Andrew771
19.11.2013, 11:06
А тогда еще вопрос. Как в аласме можно хранить переменные?

Вот так можно? :
PHP код:
***LD***A,(date)
***RST***#10

date*62,63,45,43*
И еще интересно где лучше хранить данные? На стеке нежелательно наверное?

Вот так:


value_coord equ 10 ; количество координат
ld hl,data
ld b,value_coord
loop_01 push bc
push hl
ld a,(hl)
rst #10
pop hl
inc hl
pop bc
djnz loop_01
ret
data defb 62,65,78,71,69...

Alex Rider
19.11.2013, 19:04
А вот rst #10 - как раз тот самый "волшебный" вызов, который не портит hl, de и bc, и сохранять их не обязательно :)

shuran33
19.11.2013, 20:39
Всем спасибо за ответы. RST #10 не собирался использовать, просто для примера написал.

Andrew771, пытаюсь свой велосипед изобрести, так что за пример спасибо. :v2_dizzy_botan:

Из всего вышеперечисленного сделал полезный вывод, что очень часто при вызовах подпрограмм надо сохранять регистры. Почему то раньше мне не приходило это в голову.
Ну и с переменными разобрался.

Andrew771
20.11.2013, 10:42
Еще про константы equ хочу добавить: я их использую, как правило, только в самом начале программ. Обычно в них всяческие значения параметров и настроек. Удобно их задавать, даже если в коде используется один раз (а если много раз, то тем более). Если потом нужно будет поменять значение константы, то не надо будет лазить и искать ее по коду, а просто поменять в начале в директиве equ.