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

;
; 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