IFUSED для sjasmplus

 Как-то раз я решил использовать эту директиву в разных целях. Меня ввело в заблуждение описание:

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


Дальше я решил использовать в загрузчике, так как надоело прописывать код загрузки разных страниц.

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

Теперь остался один шаг к написанию универсального загрузчика.

Комментарии