|
|
1.1 ! root 1: ; vi:set ts=8: ! 2: ! 3: ; ! 4: ; nono ! 5: ; Copyright (C) 2023 nono project ! 6: ; Licensed under nono-license.txt ! 7: ; ! 8: ! 9: ; MSX-DOS エミュレーションのような何か。 ! 10: ; 0005H にシステムコールを用意して、0100H 番地からプログラムを実行する。 ! 11: ; ! 12: ; 0000H〜 : 各種ハンドラ ! 13: ; 0100H : エントリポイント ! 14: ; 7000H : ROM 相当のプログラムコード置き場 ! 15: ; 7EFDH〜7FFFH: 転送用リングバッファ ! 16: ; F000H : スタック初期値 ! 17: ! 18: RINGADDR equ 07F00H ! 19: ! 20: org 7000H ! 21: start: ! 22: LD A,3CH ! 23: ;OUT0 (36H),A ; Disable Refresh ! 24: defb 0EDH, 39H, 36H ; HD64180 命令… ! 25: ! 26: LD SP,0F000H ! 27: ; puts のための初期化 ! 28: LD HL,7F00H-3 ! 29: XOR A ! 30: LD (HL),A ; (RINGADDR-3) = 0 ! 31: INC HL ! 32: LD (HL),A ; (RINGADDR-2) = 0 ! 33: INC HL ! 34: LD A,7FH ! 35: LD (HL),A ; (RINGADDR-1) = 0x7F ! 36: ! 37: ; 0000H に TRAP ハンドラ ! 38: ; 0005H にシステムコールハンドラ ! 39: LD BC,0008H ! 40: LD DE,0000H ! 41: LD HL,handler_0000 ! 42: LDIR ! 43: ! 44: CALL 0100H ! 45: exit: ! 46: JR doscall_00 ! 47: ; not reached ! 48: ! 49: ; TRAP ハンドラ ! 50: trap_handler: ! 51: LD HL,msg_trap_exit ! 52: CALL puts ! 53: ; not reached ! 54: ! 55: ; MSX-DOS コール ! 56: ; 基本的にレジスタは破壊されると思ってよい。 ! 57: doscall_handler: ! 58: LD A,C ! 59: OR A ! 60: JR Z,doscall_00 ! 61: CP 02H ! 62: JR Z,doscall_02 ! 63: CP 09H ! 64: JR Z,doscall_09 ! 65: ! 66: ! 67: ; --- ! 68: ; C=$00 EXIT ! 69: ; 終了する。 ! 70: doscall_00: ! 71: LD A,1AH ! 72: JR putc ! 73: ! 74: ; --- ! 75: ; C=$02 PUTC ! 76: ; ! 77: ; E に出力する文字コード。 ! 78: ; ここでは '^Z' 出力でプログラム終了。 ! 79: doscall_02: ! 80: LD A,E ! 81: JR putc ! 82: ! 83: ; --- ! 84: ; C=$09 PUTS ! 85: ; DE に出力する文字列の開始番地 ('$' で終端)。 ! 86: doscall_09: ! 87: EX DE,HL ! 88: JR puts ! 89: ! 90: ; --- ! 91: ; 内部で putc として呼ぶ場合は A に出力する文字コード。 ! 92: ; レジスタはすべて保存される。 ! 93: putc: ! 94: PUSH AF ! 95: PUSH HL ! 96: ! 97: LD HL,(RINGADDR-2) ; HL <- dst ! 98: LD (HL),A ; 1文字出力 ! 99: INC L ; 256バイト循環バッファ ! 100: LD (RINGADDR-2),HL ; カーソルを更新 ! 101: ! 102: CP 1AH ; 書いたのが '^Z' なら終了 ! 103: JR Z,_putc_term ! 104: ! 105: LD A,L ! 106: AND 7FH ; 0x00/0x80 に来たら同期をとる ! 107: JR NZ,_putc_done ! 108: _putc_sync: ! 109: LD A,(RINGADDR-3) ! 110: CP L ! 111: JR NZ,_putc_sync ! 112: _putc_done: ! 113: POP HL ! 114: POP AF ! 115: RET ! 116: ! 117: _putc_term: ; 無限ループ ! 118: JR _putc_term ! 119: ! 120: ; --- ! 121: ; 内部で puts として呼ぶ時は HL に開始番地。'$' で終端。 ! 122: ; レジスタはすべて保存される。 ! 123: puts: ! 124: PUSH AF ! 125: PUSH HL ! 126: puts_loop: ! 127: LD A,(HL) ! 128: INC HL ! 129: CP '$' ; '$' ならこれを出力せずに終了 ! 130: JR Z,_puts_done ! 131: ! 132: CALL putc ; A を出力 ! 133: JR puts_loop ! 134: _puts_done: ! 135: POP HL ! 136: POP AF ! 137: RET ! 138: ! 139: ; 0000H に転送する部分 ! 140: handler_0000: ! 141: defb 0C3H ; 0000 JP ! 142: defw trap_handler ; 0001 trap_handler ! 143: defb 0, 0 ; 0003 ! 144: defb 0C3H ; 0005 JP ! 145: defw doscall_handler ; 0006 doscall_handler ! 146: ! 147: msg_trap_exit: ! 148: defm "TRAP occurred!" ! 149: defb 0DH, 0AH, '$'
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.