mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
5.6 KiB
178 lines
5.6 KiB
;
|
|
; HBIOS FUNCTIONS
|
|
;
|
|
;
|
|
BF_DIO .EQU 010H
|
|
BF_DIOSTATUS .EQU BF_DIO + 0 ; DISK STATUS
|
|
BF_DIORESET .EQU BF_DIO + 1 ; DISK RESET
|
|
BF_DIOSEEK .EQU BF_DIO + 2 ; DISK SEEK
|
|
BF_DIOREAD .EQU BF_DIO + 3 ; DISK READ SECTORS
|
|
BF_DIOWRITE .EQU BF_DIO + 4 ; DISK WRITE SECTORS
|
|
BF_DIOVERIFY .EQU BF_DIO + 5 ; DISK VERIFY SECTORS
|
|
BF_DIOFORMAT .EQU BF_DIO + 6 ; DISK FORMAT TRACK
|
|
BF_DIODEVICE .EQU BF_DIO + 7 ; DISK DEVICE INFO REPORT
|
|
BF_DIOMEDIA .EQU BF_DIO + 8 ; DISK MEDIA REPORT
|
|
BF_DIODEFMED .EQU BF_DIO + 9 ; DEFINE DISK MEDIA
|
|
BF_DIOCAP .EQU BF_DIO + 10 ; DISK CAPACITY REPORT
|
|
BF_DIOGEOM .EQU BF_DIO + 11 ; DISK GEOMETRY REPORT
|
|
;
|
|
BF_SYS .EQU 0F0H
|
|
BF_SYSRESET .EQU BF_SYS + 0 ; SOFT RESET HBIOS
|
|
BF_SYSVER .EQU BF_SYS + 1 ; GET HBIOS VERSION
|
|
BF_SYSSETBNK .EQU BF_SYS + 2 ; SET CURRENT BANK
|
|
BF_SYSGETBNK .EQU BF_SYS + 3 ; GET CURRENT BANK
|
|
BF_SYSSETCPY .EQU BF_SYS + 4 ; BANK MEMORY COPY SETUP
|
|
BF_SYSBNKCPY .EQU BF_SYS + 5 ; BANK MEMORY COPY
|
|
BF_SYSALLOC .EQU BF_SYS + 6 ; ALLOC HBIOS HEAP MEMORY
|
|
BF_SYSFREE .EQU BF_SYS + 7 ; FREE HBIOS HEAP MEMORY
|
|
BF_SYSGET .EQU BF_SYS + 8 ; GET HBIOS INFO
|
|
BF_SYSSET .EQU BF_SYS + 9 ; SET HBIOS PARAMETERS
|
|
BF_SYSPEEK .EQU BF_SYS + 10 ; GET A BYTE VALUE FROM ALT BANK
|
|
BF_SYSPOKE .EQU BF_SYS + 11 ; SET A BYTE VALUE IN ALT BANK
|
|
BF_SYSINT .EQU BF_SYS + 12 ; MANAGE INTERRUPT VECTORS
|
|
;
|
|
BF_SYSGET_CIOCNT .EQU 00h ; GET CHAR UNIT COUNT
|
|
BF_SYSGET_CIOFN .EQU 01h ; GET CIO UNIT FN/DATA ADR
|
|
BF_SYSGET_DIOCNT .EQU 10h ; GET DISK UNIT COUNT
|
|
BF_SYSGET_DIOFN .EQU 11h ; GET DIO UNIT FN/DATA ADR
|
|
BF_SYSGET_RTCCNT .EQU 20h ; GET RTC UNIT COUNT
|
|
BF_SYSGET_DSKYCNT .EQU 30h ; GET DSKY UNIT COUNT
|
|
BF_SYSGET_VDACNT .EQU 40h ; GET VDA UNIT COUNT
|
|
BF_SYSGET_VDAFN .EQU 41h ; GET VDA UNIT FN/DATA ADR
|
|
BF_SYSGET_SNDCNT .EQU 50h ; GET VDA UNIT COUNT
|
|
BF_SYSGET_SNDFN .EQU 51h ; GET SND UNIT FN/DATA ADR
|
|
BF_SYSGET_TIMER .EQU 0D0h ; GET CURRENT TIMER VALUE
|
|
BF_SYSGET_SECS .EQU 0D1h ; GET CURRENT SECONDS VALUE
|
|
BF_SYSGET_BOOTINFO .EQU 0E0h ; GET BOOT INFORMATION
|
|
BF_SYSGET_CPUINFO .EQU 0F0h ; GET CPU INFORMATION
|
|
BF_SYSGET_MEMINFO .EQU 0F1h ; GET MEMORY CAPACTITY INFO
|
|
BF_SYSGET_BNKINFO .EQU 0F2h ; GET BANK ASSIGNMENT INFO
|
|
BF_SYSGET_CPUSPD .EQU 0F3h ; GET CLOCK SPEED & WAIT STATES
|
|
BF_SYSGET_PANEL .EQU 0F4h ; GET FRONT PANEL SWITCHES VAL
|
|
BF_SYSGET_APPBNKS .EQU 0F5h ; GET APP BANK INFORMATION
|
|
;
|
|
; MEDIA ID VALUES
|
|
;
|
|
MID_NONE .EQU 0
|
|
MID_MDROM .EQU 1
|
|
MID_MDRAM .EQU 2
|
|
MID_RF .EQU 3
|
|
MID_HD .EQU 4
|
|
MID_FD720 .EQU 5
|
|
MID_FD144 .EQU 6
|
|
MID_FD360 .EQU 7
|
|
MID_FD120 .EQU 8
|
|
MID_FD111 .EQU 9
|
|
MID_HDNEW .EQU 10
|
|
|
|
; -----------------
|
|
;
|
|
; Read timer in sconds.
|
|
;
|
|
sysgetseconds:
|
|
ld b,BF_SYSGET
|
|
ld c,BF_SYSGET_SECS
|
|
rst 08 ; do it
|
|
ret
|
|
|
|
; -----------------
|
|
;
|
|
; Return non zero if A (media ID)
|
|
; is a type of hard drive
|
|
; If not A=0 and Z flag is set
|
|
;
|
|
isaharddrive:
|
|
cp MID_HD
|
|
jr z, ishdd1
|
|
cp MID_HDNEW
|
|
jr z, ishdd1
|
|
xor a ; clear A and set Z flag
|
|
ret
|
|
ishdd1:
|
|
or a ; set Z flag and return
|
|
ret
|
|
|
|
; -------------------------------------
|
|
;
|
|
; used to pass the buffer address argument
|
|
;
|
|
bankid .DB 0 ; bank id used for read writes
|
|
dma .DW 8000h ; address argument for read write
|
|
;
|
|
;
|
|
; basic setup for disk io
|
|
; call to get the current bank IO
|
|
;
|
|
initdiskio:
|
|
; Get current RAM bank
|
|
ld b,BF_SYSGETBNK ; HBIOS GetBank function
|
|
RST 08 ; do it via RST vector, C=bank id
|
|
JP NZ, err_hbios
|
|
ld a,c ; put bank id in A
|
|
ld (bankid),a ; put bank id in Argument
|
|
RET
|
|
;
|
|
;
|
|
; Read disk sector(s)
|
|
; DE:HL is LBA, B is sector count, C is disk unit
|
|
; (dma) is the buffer address
|
|
; (bankid) is the memory bank
|
|
; Returns E sectors read, and A status
|
|
;
|
|
diskread:
|
|
; Seek to requested sector in DE:HL
|
|
push bc ; save unit & count
|
|
set 7,d ; set LBA access flag
|
|
ld b,BF_DIOSEEK ; HBIOS func: seek
|
|
rst 08 ; do it
|
|
pop bc ; recover unit & count
|
|
jp nz,err_diskio ; handle error
|
|
|
|
; Read sector(s) into buffer
|
|
ld e,b ; transfer count
|
|
ld b,BF_DIOREAD ; HBIOS func: disk read
|
|
ld hl,(dma) ; read into info sec buffer
|
|
ld a,(bankid) ; user bank
|
|
ld d,a
|
|
rst 08 ; do it
|
|
jp nz,err_diskio ; handle error
|
|
xor a ; signal success
|
|
ret ; and done
|
|
;
|
|
; Write disk sector(s)
|
|
; DE:HL is LBA, B is sector count, C is disk unit
|
|
; (dma) is the buffer address
|
|
; (bankid) is the memory bank
|
|
; Returns E sectors written, and A status
|
|
;
|
|
diskwrite:
|
|
; Seek to requested sector in DE:HL
|
|
push bc ; save unit & count
|
|
set 7,d ; set LBA access flag
|
|
ld b,BF_DIOSEEK ; HBIOS func: seek
|
|
rst 08 ; do it
|
|
pop bc ; recover unit & count
|
|
jp nz,err_diskio ; handle error
|
|
|
|
; Write sector(s) from buffer
|
|
ld e,b ; transfer count
|
|
ld b,BF_DIOWRITE ; HBIOS func: disk write
|
|
ld hl,(dma) ; write from sec buffer
|
|
ld a,(bankid) ; user bank
|
|
ld d,a
|
|
rst 08 ; do it
|
|
jp nz,err_diskio ; handle error
|
|
xor a ; signal success
|
|
ret ; and done
|
|
;
|
|
err_diskio:
|
|
; push hl
|
|
; ld hl,str_err_prefix
|
|
; call prtstr
|
|
; pop hl
|
|
; or 0ffh ; signal error
|
|
ret ; done
|
|
|
|
;str_err_prefix db 13,10,13,10,"*** ",0
|
|
|
|
|
|
|