Как-то раз я решил использовать эту директиву в разных целях. Меня ввело в заблуждение описание:
IFUSED <label>
The condition is true if there is an label used somewhere in the code. You can create libraries of useful functions using IFUSED pseudo-op
Первый код, который использован:
device zxspectrum128
ORG #6000
begin
;border
MACRO brd n
ld a,n
out ($FE),a
ENDM
;liney
;atrxy
jr $
call nbde
IFUSED nbde
nbde INC D:LD A,D:AND 7:RET NZ
LD A,E:ADD A,#20:LD E,A:RET C
LD A,D:SUB 8:LD D,A:RET
ENDIF
IFUSED nbhl
nbhl INC h:LD A,h:AND 7:RET NZ
LD A,L:ADD A,#20:LD L,A:RET C
LD A,H:SUB 8:LD H,A:RET
ENDIF
end
display /d,end-begin
savesna "!void.sna",begin
ORG #6000
begin
;border
MACRO brd n
ld a,n
out ($FE),a
ENDM
;liney
;atrxy
jr $
call nbde
IFUSED nbde
nbde INC D:LD A,D:AND 7:RET NZ
LD A,E:ADD A,#20:LD E,A:RET C
LD A,D:SUB 8:LD D,A:RET
ENDIF
IFUSED nbhl
nbhl INC h:LD A,h:AND 7:RET NZ
LD A,L:ADD A,#20:LD L,A:RET C
LD A,H:SUB 8:LD H,A:RET
ENDIF
end
display /d,end-begin
savesna "!void.sna",begin
Дальше я решил использовать в загрузчике, так как надоело прописывать код загрузки разных страниц.
IFUSED page0b
di
ld de,(#5CF4)
ld hl, #C000
sectors page0b,page0e
call #3d13
ENDIF
;save page 0 to .TRD
EMPTYTRD "dust.trd" ;create empty TRD image
SAVETRD "dust.trd", "boot.B", boot.Basic, boot.EndBasic - boot.Basic
SAVETRD "dust.trd","demo.C",begin,end-begin
IFUSED page0b
PAGE 0
SAVETRD "dust.trd","pg0.C",page0b,page0e-page0b
ENDIF
Не работает. Стал разбираться. Вышло, что IFUSED принимает значение True, если используется
CALL label или LD(label),A. Как же использовать? krt17 подсказал обратиться к метке, например huj equ page0b. Но, опять же, если метки нет в коде(страница 0,1,3,4,6,7 не используется), то ассемблер подавится.
Как я только не извращался с кодом, например:
LUA
if sj.get_label("page0b")~=-1 then
sj.insert_label("nop0", 1)
else
sj.insert_label("nop0", 0)
end
ENDLUA
Но, проще показалось другое решение:
page 0
org $C000
page0b:
DEFINE pg0
IFDEF pg0
di
ld de,(#5CF4)
ld hl, #C000
sectors page0b,page0e
call #3d13
ENDIF
IFDEF pg0
PAGE 0
SAVETRD "dust.trd","pg0.C",page0b,page0e-page0b
ENDIF
Теперь остался один шаг к написанию универсального загрузчика.
Комментарии
Отправить комментарий