CALL page2
CALL page2
カートリッジによるCALL文の拡張に使うヘッダのSTATEMENT値はページ1(4000H~7FFFH)の範囲とすることになっていますが、ページ2(8000H~BFFFH)でも動くようです。
ただし呼び出し元のBASICのCALL文がページ2に格納されていた場合、HLレジスタの指す引数を読むことが困難です。ページ2のRAMスロットを特定して、インタースロット読み出しする必要があります。DISK BASIC以外では確実にスロットを特定する手段はありません。
CALL文実行時のスタックがページ2にある場合も戻り先アドレスが取得できずに暴走するようです。先行スロットで処理が完了した場合は問題ありません。
PHC-70FD/FD2に内蔵されたべーしっ君を裏RAMに転送する CALL BC
がページ2に配置されているようです。
どうしてわざわざ裏RAMを破壊する仕様にしたのか疑問ですが、スロットマップを見る限り製造コストダウンのためにスロット0を拡張したくなったのではないかと推測されます。
_HOGEをページ2に配置するサンプル(sjasm)
org 04000h
db "AB" ;ID
dw 0 ;INIT
dw 0 ;STATEMENT
dw 0 ;DEVICE
dw 0 ;TEXT
ds 6,0 ;RESERVE
ds 08000h-$,0ffh
db "AB" ;ID
dw 0 ;INIT
dw STATEMENT ;STATEMENT
dw 0 ;DEVICE
dw 0 ;TEXT
ds 6,0 ;RESERVE
CHPUT equ 000A2H
PROCNM equ 0FD89H
STATEMENT:
push de
ld de,PROC1NM1
call PROCNMCMP
jr z,PROC1
pop de
scf
ret
PROCNMCMP:
push hl
ld hl,PROCNM
call MEMCMP
pop hl
ret
MEMCMP:
ld a,(de)
cp (hl)
ret nz
or a
inc hl
inc de
jr nz,MEMCMP
ret
PROC1:
push hl
ld hl,.MSG1
.MSG1LP:
ld a,(hl)
or a
jr z,.MSG1END
inc hl
call CHPUT
jr .MSG1LP
.MSG1END:
pop hl
pop de
xor a
ret
.MSG1:
db "TEST",0
PROC1NM1:
db "HOGE",0
ds 0C000h-$,0ffh