227 lines
4.4 KiB
ArmAsm
227 lines
4.4 KiB
ArmAsm
|
|
;
|
|
; Z80 Virtual Machine BIOS for CP/M
|
|
;
|
|
|
|
|
|
; Virtual BIOS memory map
|
|
|
|
; $FE00 - $FE63 - jumptable, 3*33 bytes
|
|
; $FE63 - $FE84 - magic HALT instructions to select BIOS routines
|
|
; $FE85 - $FFFF - unassigned as of yet
|
|
|
|
!addr zvm_BIOS_return = Z80_instr_C9 ; RET instruction
|
|
|
|
|
|
zvm_BIOS_vectable:
|
|
|
|
!word zvm_BIOS_00_BOOT
|
|
!word zvm_BIOS_01_WBOOT
|
|
!word zvm_BIOS_02_CONST
|
|
!word zvm_BIOS_03_CONIN
|
|
!word zvm_BIOS_04_CONOUT
|
|
!word zvm_BIOS_05_LIST
|
|
!word zvm_BIOS_06_AUXOUT
|
|
!word zvm_BIOS_07_AUXIN
|
|
!word zvm_BIOS_08_HOME
|
|
!word zvm_BIOS_09_SELDSK
|
|
!word zvm_BIOS_10_SETTRK
|
|
!word zvm_BIOS_11_SETSEC
|
|
!word zvm_BIOS_12_SETDMA
|
|
!word zvm_BIOS_13_READ
|
|
!word zvm_BIOS_14_WRITE
|
|
!word zvm_BIOS_15_LISTST
|
|
!word zvm_BIOS_16_SECTRN
|
|
!word zvm_BIOS_17_CONOST
|
|
!word zvm_BIOS_18_AUXIST
|
|
!word zvm_BIOS_19_AUXOST
|
|
!word zvm_BIOS_20_DEVTBL
|
|
!word zvm_BIOS_21_DEVINI
|
|
!word zvm_BIOS_22_DRVTBL
|
|
!word zvm_BIOS_23_MULTIO
|
|
!word zvm_BIOS_24_FLUSH
|
|
!word zvm_BIOS_25_MOVE
|
|
!word zvm_BIOS_26_TIME
|
|
!word zvm_BIOS_27_SELMEM
|
|
!word zvm_BIOS_28_SETBNK
|
|
!word zvm_BIOS_29_XMOVE
|
|
!word zvm_BIOS_30_USERF
|
|
!word zvm_BIOS_31_RESERV1
|
|
!word zvm_BIOS_32_RESERV2
|
|
|
|
zvm_BIOS_00_BOOT: ; Cold start
|
|
|
|
; XXX !!!
|
|
|
|
; XXX fetch RAM disk image
|
|
; XXX close all the files, reset I/O, set screen mode
|
|
; XXX clear memory
|
|
|
|
; Reset registers and internal emulation data
|
|
|
|
ldz #$00 ; .Z is required to be 0 all the time
|
|
lda #$00
|
|
tay
|
|
@1:
|
|
sta REG_AF, y
|
|
iny
|
|
cmp #(REG_IFF2+1)
|
|
bne @1
|
|
|
|
dew REG_AF ; AF and SP have $FFFF value on start
|
|
dew REG_SP
|
|
|
|
lda TIME+2 ; give a little initial randomness to register R
|
|
sta REG_R06
|
|
|
|
; XXX restore all *_EXT1 values
|
|
|
|
; XXX load CPM3.SYS
|
|
|
|
; FALLTROUGH
|
|
|
|
zvm_BIOS_01_WBOOT: ; Warm start
|
|
zvm_BIOS_31_RESERV1: ; Reserved
|
|
zvm_BIOS_32_RESERV2: ; Reserved
|
|
|
|
; XXX !!!
|
|
|
|
; Select bank 1 as the default one
|
|
|
|
jsr ZVM_set_bank_1
|
|
|
|
; XXX put command processor in memory
|
|
|
|
; XXX setup VEC_MOVE_fetch, VEC_MOVE_store, VEC_DISKIO_store somewhere
|
|
|
|
zvm_BIOS_02_CONST: ; Check if input character available
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_03_CONIN: ; Console input
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_04_CONOUT: ; Console output
|
|
|
|
; XXX
|
|
|
|
zvm_BIOS_05_LIST: ; Provide list of character output devices
|
|
|
|
; XXX
|
|
|
|
zvm_BIOS_06_AUXOUT: ; AUX output
|
|
|
|
; XXX
|
|
|
|
zvm_BIOS_07_AUXIN: ; AUX input
|
|
|
|
; XXX
|
|
|
|
zvm_BIOS_08_HOME: ; Go to track 0
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_09_SELDSK: ; Select drive
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_10_SETTRK: ; Set track number
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_11_SETSEC: ; Set sector number
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_12_SETDMA: ; Set DMA address
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_13_READ: ; Read sector
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_14_WRITE: ; Write sector
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_15_LISTST: ; List status
|
|
zvm_BIOS_17_CONOST: ; Console output status
|
|
|
|
; Always report the printer / output console as ready
|
|
lda #$FF
|
|
sta REG_A
|
|
jmp zvm_BIOS_return
|
|
|
|
zvm_BIOS_16_SECTRN: ; Convert logical to physical sector
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_18_AUXIST: ; AUX input status
|
|
|
|
; XXX
|
|
|
|
zvm_BIOS_19_AUXOST: ; AUX output status
|
|
|
|
; XXX
|
|
|
|
zvm_BIOS_20_DEVTBL: ; Character device table address
|
|
|
|
; XXX
|
|
|
|
zvm_BIOS_21_DEVINI: ; Initialize character device
|
|
|
|
; XXX
|
|
|
|
zvm_BIOS_22_DRVTBL: ; Disk drive table address
|
|
|
|
; XXX
|
|
|
|
zvm_BIOS_23_MULTIO: ; Set number of logically consecutive sectors
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_24_FLUSH: ; Force buffer flushing for user deblocking
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_25_MOVE: ; Memory move
|
|
|
|
lda REG_B
|
|
ora REG_C
|
|
beq @2 ; branch if nothing to be copied
|
|
@1:
|
|
jsr (VEC_MOVE_fetch)
|
|
jsr (VEC_MOVE_store)
|
|
inw REG_DE ; source address
|
|
inw REG_HL ; destination address
|
|
dew REG_BC ; count
|
|
bne @1
|
|
@2:
|
|
; XXX setup VEC_MOVE_fetch (to bank 1), VEC_MOVE_store (to bank 1)
|
|
jmp zvm_BIOS_return
|
|
|
|
zvm_BIOS_26_TIME: ; Get or set time
|
|
|
|
; XXX !!!
|
|
|
|
zvm_BIOS_27_SELMEM: ; Select memory bank
|
|
|
|
; XXX !!!
|
|
; XXX setup VEC_MOVE_fetch (REG_A), VEC_MOVE_store (REG_A)
|
|
|
|
zvm_BIOS_28_SETBNK: ; Set bank for disk DMA operation
|
|
|
|
; XXX !!!
|
|
; XXX setup VEC_DISKIO_store (REG_A)
|
|
|
|
zvm_BIOS_29_XMOVE: ; Set bank if buffer is in bank other than 1 or 2
|
|
|
|
; XXX !!!
|
|
; XXX setup VEC_MOVE_fetch (REG_C), VEC_MOVE_store (REG_B)
|
|
|
|
zvm_BIOS_30_USERF: ; Implementation-specific functionality
|
|
|
|
; XXX implement function to save RAM DISK back to SD CARD
|