Annotation of nono/util/runcom/system.asm, revision 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.