Хорошо, а команды типа CALL (JSR) и RET (RTI) будут корректно работать с нечетным стеком?
А если поставить команду SOB PC,nn? Тут вопрос даже не в нулевом смещении, а в изменении PC самой командой.
Неа, у меня сократилось аж на 16 байт =) Правда, тоже задействовал один дополнительный регистр, зато ощутимый выигрыш по объему.
Заработало с первого раза без багов, хотя в асме БК я вообще нубас =) Настрочил в блокнотике, скомпилил - ура, работает.
В плане быстродействия где-то одинаково за счет того, что внутри цикла (основного) нет адресаций через память.
А если задействовать еще один регистр под хранение числа #100, то и перед SOB можно убрать выборку из памяти, а размер будет тот же.
Кстати, команда CLC не нужна, т.к. ADD reg,PC в любом случае обнулит флаг переноса.
scroller.zip
Вложил оба варианта: первоначальный от Manwe и свой. Внутри исходники + готовый код. Ниже под спойлером текст исходника, если кому лень загружать файл.
Скроллится кусочек вверху экрана, время около 18 сек, можно перезапустить командой S монитора. Удобно запускать прямо в эмуляторе.
Развернул команды скролла, т.к. компилер BKTurbo8 не понимает этой конструкции с копиями. Как в нем задать повтор куска кода?
Скрытый текст
Код:.LA 1000 MOV #1000,R5 SCRL: MOV #40000,R0 MOV #30,R1 MOV #100,R2 CALL ScrollRight SOB R5,SCRL HALT ; R0 - screen address ; R1 - width in words ; R2 - height in rows ScrollRight: ASL R1 NEG R1 ADD #100,R1 ;R1=64-(width*2) ROLL: MOV R0,R3 ;save scr addr ROLL1: ADD R1,PC ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ROL (R0)+ ; scroll row ROL (R0)+ ROL (R0)+ ROL (R0)+ MOV R3,R0 ; restore scr addr ADC (R0) ; shift from last word to 1st INC PC BR ROLL1 ADD #100,R0 SOB R2,ROLL RET .END[свернуть]





Ответить с цитированием