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