; IPL command hipl equ 0fe03h ; IPLコマンドフックアドレス frmqnt equ 542fh ; 式を2バイト整数で評価 chput equ 0a2h ; 1文字出力 chrgtr equ 4666h ; コマンドラインから1文字取り出す latch equ 0a0h ; PSGアドレスラッチ write equ 0a1h ; データライト read equ 0a2h ; データリード org 0d000h ld bc,5 ld de,hipl ld hl,hookcmd ldir ret hookcmd: jp iplmain nop nop command: defs 1 file1: defs 40 file2: defs 40 addr1: defs 2 addr2: defs 2 addrflg: defs 1 error: defs 2 portb: defs 1 iplmain: pop bc ld (error),bc ; エラー処理アドレス保存 xor a ld (command),a ld (file1),a ld (file2),a ld (addrflg),a ; 0..未設定 1..addr1設定済 2..addr2も設定 dec hl ; 最初の1文字目の位置に戻す cmdloop: call chrgtr ; コマンドライン読み取りループ jr z,cmdcheck cp 20h ; 0B〜1Fは数値の識別コード jr c,evaluat cp '"' jr z,getname cp ',' jr z,cmdloop ; カンマは無視 ld (command),a jr cmdloop getname: ld a,(file1) or a jr nz,skip1st ld bc,file1 jr skip2nd skip1st: ld a,(file2) or a jr nz,errexit ld bc,file2 skip2nd: call chrgtr cp '"' jr z,setnull ld (bc),a inc bc jr skip2nd setnull: xor a ld (bc),a ; 文字列の終端セット jr cmdloop evaluat: call frmqnt ld a,(addrflg) or a jr nz,skipadd1 ; addr1は設定済み ld (addr1),de ld a,1 ld (addrflg),a ; addr1を設定した jr cmdloop skipadd1: cp 1 jr nz,errexit ; addr2まで設定してある ld (addr2),de ld a,2 ld (addrflg),a jr cmdloop cmdcheck: ld a,(command) cp 'F' jr z,files cp 'L' jr z,load cp 'S' jr z,save cp 'R' jr z,rename cp 'K' jr z,kill jr errexit errexit: ld bc,(error) push bc ; エラー処理アドレス復元 exit: ret files: load: save: rename: kill: call chput call crlf ld bc,file1 call strprint call crlf ld bc,file2 call strprint call crlf ld a,(addrflg) or a ret z ld bc,addr1 call hexprint inc bc call hexprint call crlf ld a,(addrflg) cp 2 ret nz ld bc,addr2 call hexprint inc bc call hexprint call crlf ret crlf: ld a,0dh call chput ld a,0ah call chput ret strprint: ld a,(bc) inc bc or a ret z call chput jr strprint hexprint: ld a,(bc) srl a ; 上位4ビットを下位にシフト srl a srl a srl a call pr4bit ld a,(bc) and 0fh ; 上位4ビット消去 call pr4bit ret pr4bit: cp 10 jr c,decimal add a,37h ; A〜F call chput ret decimal: add a,'0' ; 0〜9 call chput ret