quarta-feira, maio 17, 2023

MSX: Chamando a BIOS a partir do MSX-DOS

Aqui vão alguns pequenos exemplos, apenas como referência e tira-dúvidas, quando voltei a programar para MSX, um monte de coisa já tinha escapado da minha cabeça de bagre, e hoje, estou meio velho para decorar estes trecos, enquanto eu estou programando vai de boa, mas basta eu dar uma pausa de algumas semanas ou meses, e pronto, não lembro mais de alguns detalhes, então vou compilar aqui alguns exemplos de tarefas que podem ser interessantes.São exemplos os mais toscos possíveis, tem jeito de fazer melhor? com certeza, mas para o objetivo proposto está legal

Chamada da BIOS (MAIN ROM) a partir do MSX-DOS

CALSLT  equ     #001c
EXPTBL  equ     #fcc1
CHGCLR  equ     #0062
FORCLR  equ     #f3f9
BAKCLR  equ     #F3ea
start   ld      a,15
        ld      (FORCLR),a
        ld      a,4
        ld      (BAKCLR),a
        call    xColor
        ret     xColor               ; Faz uma chamada interslots para a BIOS
        ld      iy,(EXPTBL-1)        ; Funciona apenas para a MAIN ROM
        ld      ix,CHGCLR            ; Para a SUB ROM, deve ser visto o outro
        call    CALSLT               ; Exemplo
        ret

Chamada da BIOS (SUB ROM) a partir do MSX-DOS

; CALSUB
;
; In: IX = address of routine in MSX2 SUBROM
;     AF, HL, DE, BC = parameters for the routine
;
; Out: AF, HL, DE, BC = depending on the routine
;
; Changes: IX, IY, AF’, BC’, DE’, HL’
;
; Call MSX2 subrom from MSXDOS. Should work with all versions of MSXDOS.
;
; Notice: NMI hook will be changed. This should pose no problem as NMI is
; not supported on the MSX at all.
;
CALSLT:  EQU    #001C
NMI:     EQU    #0066
EXTROM:  EQU    #015f
EXPTBL:  EQU    #fcc1
H_NMI:   EQU    #fdd6
;
CALSUB:  exx
         ex     af,af’       ; store all registers
         ld     hl,EXTROM
         push   hl
         ld     hl,#C300
         push   hl           ; push NOP ; JP EXTROM
         push   ix
         ld     hl,#21DD
         push   hl           ; push LD IX,[entry]
         ld     hl,#3333
         push   hl           ; push INC SP; INC SP
         ld     hl,0
         add    hl,sp        ; HL = offset of routine
         ld     a,#C3
         ld     (H_NMI),a
         ld     (H_NMI+1),hl ; JP [routine] in NMI hook
         ex     af,af’
         exx                 ; restore all registers
         ld     ix,NMI
         ld     iy,(EXPTBL-1)
         call   CALLSLT      ; call NMI-hook via NMI entry in ROMBIOS
                             ; NMI-hook will call SUBROM
         exx
         ex     af,af’       ; store all returned registers
         ld     hl,10
         add    hl,sp
         ld     sp,hl        ; remove routine from stack
         ex     af,af’
         exx                 ; restore all returned registers
         ret