|
|
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.