Annotation of nono/util/runcom/system.asm, revision 1.1.1.1

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, '$'

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.