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.
251 lines
6.1 KiB
251 lines
6.1 KiB
;:::::::::::::::::::::::::::::::::::::::*****************************
|
|
; HBIOS - HBios Interface Routines ***** Hardware-Specific *****
|
|
; *****************************
|
|
; - Retro Brew -
|
|
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
;
|
|
; HBIOS Functions
|
|
;
|
|
HBF_ALLOC EQU 0F6H ; HBIOS Func: ALLOCATE Heap Memory
|
|
HBF_BNKINFO EQU 0F8F2H ; HBIOS Func: Get Bank Info
|
|
;
|
|
; HBIOS Proxy Addresses
|
|
;
|
|
HBX_INVOKE EQU 0FFF0H
|
|
HBX_BNKSEL EQU 0FFF3H
|
|
HBX_BNKCPY EQU 0FFF6H
|
|
HBX_BNKCALL EQU 0FFF9H
|
|
|
|
HB_CURBNK EQU 0FFE0H
|
|
HB_INVBNK EQU 0FFE1H
|
|
HB_SRCADR EQU 0FFE2H
|
|
HB_SRCBNK EQU 0FFE4H
|
|
HB_DSTADR EQU 0FFE5H
|
|
HB_DSTBNK EQU 0FFE7H
|
|
HB_CPYLEN EQU 0FFE8H
|
|
|
|
CSEG
|
|
|
|
;
|
|
;==================================================================================================
|
|
; HBIOS INITIALIZATION
|
|
;==================================================================================================
|
|
;
|
|
; This code should be moved to follow CBOOT so that it will be reused
|
|
; by RAM data.
|
|
;
|
|
HBX_INIT:
|
|
|
|
; Setup RST 08 vector
|
|
LD A,0C3H ; $C3 = JP
|
|
LD (08H),A
|
|
LD HL,HBX_INVOKE
|
|
LD (09H),HL
|
|
|
|
;; Init HB data fields
|
|
;LD A,BID_USR
|
|
;LD (HB_CURBNK),A
|
|
;LD (HB_SRCBNK),A
|
|
;LD (HB_DSTBNK),A
|
|
|
|
; Initialize BPBIOS bank numbers from HBIOS
|
|
; BNKU (UABNK) --> 0 (DISABLED)
|
|
; BNK0 (TPABNK) --> BID_USR
|
|
; BNK1 --> BID_COM
|
|
; BNK2 (SYSBNK) --> BID_AUX (BID_BIOS - 1)
|
|
; BNK3 (RAMBNK) --> BID_RAMD0 (0x80)
|
|
; BNKM (MAXBNK) --> BID_RAMDN (BID_BIOS - 5)
|
|
LD BC,HBF_BNKINFO ; HBIOS BNKINFO function
|
|
CALL HBX_INVOKE ; DO IT, D=BID_BIOS, E=BID_USER
|
|
LD A,E ; BID_USR
|
|
LD (TPABNK),A ; SET BNK0 (TPABNK)
|
|
LD A,D ; BID_BIOS
|
|
LD (HBX_BNKBIOS),A ; SET HBX_BNKBIOS
|
|
DEC A ; BID_AUX
|
|
LD (SYSBNK),A ; SET BNK2 (SYSBNK)
|
|
SUB 4 ; BID_RAMDN
|
|
LD (MAXBNK),A ; SET BNKM (MAXBNK)
|
|
LD A,80H ; FIRST PHYSICAL RAM BANK IS ALWAYS 0x80
|
|
LD (RAMBNK),A ; SET BNK3 (RAMBNK)
|
|
|
|
IF BANKED
|
|
|
|
; Copy vectors from TPA page zero to SYS page zero
|
|
LD BC,(TPABNK) ; C := TPABNK, B := SYSBNK
|
|
CALL XMOVE ; Set source/dest banks for copy
|
|
LD HL,0 ; Source address is zero
|
|
LD DE,0 ; Destination address is zero
|
|
LD BC,40H ; Copy 40H bytes
|
|
CALL MOVE ; Do it
|
|
LD A,(TPABNK) ; Set all Bank regs to TPA
|
|
|
|
ENDIF ;BANKED
|
|
|
|
; begin debug
|
|
|
|
CALL NEWLINE2
|
|
LD DE,HB_STR_TAG
|
|
CALL WRITESTR
|
|
|
|
CALL NEWLINE
|
|
LD DE,HB_STR_CSEG
|
|
CALL WRITESTR
|
|
LD BC,BIOSJT
|
|
CALL PRTHEXWORD
|
|
LD DE,HB_STR_DSEG
|
|
CALL WRITESTR
|
|
LD BC,CBOOT
|
|
CALL PRTHEXWORD
|
|
|
|
IF BANKED
|
|
LD DE,HB_STR_BANK2
|
|
CALL WRITESTR
|
|
LD BC,ROMJT
|
|
CALL PRTHEXWORD
|
|
LD DE,HB_STR_B2RAM
|
|
CALL WRITESTR
|
|
LD BC,CBOOT0
|
|
CALL PRTHEXWORD
|
|
LD DE,HB_STR_RESVD
|
|
CALL WRITESTR
|
|
LD BC,ALV$50
|
|
CALL PRTHEXWORD
|
|
ENDIF ;BANKED
|
|
|
|
CALL NEWLINE
|
|
|
|
RET
|
|
|
|
HB_STR_TAG: DB "HBIOS: $"
|
|
HB_STR_CSEG: DB "CSEG=$"
|
|
HB_STR_DSEG: DB ", DSEG=$"
|
|
HB_STR_BANK2: DB ", BANK2=$"
|
|
HB_STR_B2RAM: DB ", B2RAM=$"
|
|
HB_STR_RESVD: DB ", RESVD=$"
|
|
|
|
; end debug
|
|
|
|
CSEG
|
|
|
|
HBX_BNKBIOS DEFB 0 ; Bank id of HBIOS bank
|
|
|
|
;
|
|
;==================================================================================================
|
|
; HBIOS INTERFACE
|
|
;==================================================================================================
|
|
;
|
|
; TODO: Move the following into ibmv-ww.z80 which is where it belongs.
|
|
;
|
|
HBX_XCOPY:
|
|
LD A,C
|
|
LD (HB_SRCBNK),A
|
|
LD A,B
|
|
LD (HB_DSTBNK),A
|
|
RET
|
|
|
|
HBX_COPY:
|
|
JP HBX_BNKCPY
|
|
|
|
;==================================================================================================
|
|
; LD A,(C:HL)
|
|
;==================================================================================================
|
|
|
|
HBX_FRGETB:
|
|
LD (HBX_STKSAV),SP ; Save current stack
|
|
LD SP,HBX_TMPSTK ; Activate our private stack
|
|
LD A,(HB_CURBNK) ; Get current bank
|
|
LD (HBX_BNKSAV),A ; Save current bank
|
|
PUSH BC
|
|
LD A,C
|
|
HB_DI
|
|
CALL HBX_BNKSEL
|
|
LD C,(HL)
|
|
LD A,(HBX_BNKSAV)
|
|
CALL HBX_BNKSEL
|
|
HB_EI
|
|
LD A,C
|
|
POP BC
|
|
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
|
|
RET
|
|
|
|
;==================================================================================================
|
|
; LD DE,(C:HL)
|
|
;==================================================================================================
|
|
|
|
HBX_FRGETW:
|
|
LD (HBX_STKSAV),SP ; Save current stack
|
|
LD SP,HBX_TMPSTK ; Activate our private stack
|
|
LD A,(HB_CURBNK) ; Get current bank
|
|
LD (HBX_BNKSAV),A ; Save current bank
|
|
LD A,C
|
|
HB_DI
|
|
CALL HBX_BNKSEL
|
|
LD E,(HL)
|
|
INC HL
|
|
LD D,(HL)
|
|
DEC HL
|
|
LD A,(HBX_BNKSAV)
|
|
CALL HBX_BNKSEL
|
|
HB_EI
|
|
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
|
|
RET
|
|
|
|
;==================================================================================================
|
|
; LD (C:HL),A
|
|
;==================================================================================================
|
|
|
|
HBX_FRPUTB:
|
|
LD (HBX_STKSAV),SP ; Save current stack
|
|
LD SP,HBX_TMPSTK ; Activate our private stack
|
|
PUSH AF
|
|
LD A,(HB_CURBNK) ; Get current bank
|
|
LD (HBX_BNKSAV),A ; Save current bank
|
|
POP AF
|
|
PUSH BC
|
|
LD B,A
|
|
LD A,C
|
|
HB_DI
|
|
CALL HBX_BNKSEL
|
|
LD (HL),B
|
|
LD A,(HBX_BNKSAV)
|
|
CALL HBX_BNKSEL
|
|
HB_EI
|
|
POP BC
|
|
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
|
|
RET
|
|
|
|
;==================================================================================================
|
|
; LD (C:HL),DE
|
|
;==================================================================================================
|
|
|
|
HBX_FRPUTW:
|
|
LD (HBX_STKSAV),SP ; Save current stack
|
|
LD SP,HBX_TMPSTK ; Activate our private stack
|
|
LD A,(HB_CURBNK) ; Get current bank
|
|
LD (HBX_BNKSAV),A ; Save current bank
|
|
LD A,C
|
|
HB_DI
|
|
CALL HBX_BNKSEL
|
|
LD (HL),E
|
|
INC HL
|
|
LD (HL),D
|
|
DEC HL
|
|
LD A,(HBX_BNKSAV)
|
|
CALL HBX_BNKSEL
|
|
HB_EI
|
|
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
|
|
RET
|
|
|
|
;==================================================================================================
|
|
; PRIVATE DATA
|
|
;==================================================================================================
|
|
|
|
DSEG
|
|
|
|
HB_DSKBUF: DEFW 0 ; Address of physical disk buffer in HBIOS bank
|
|
HBX_BNKSAV: DEFB 0 ; Saved bank id during HBIOS calls
|
|
HBX_STKSAV: DEFW 0 ; Saved stack pointer during HBIOS calls
|
|
DEFS 32 ; Private stack for HBIOS
|
|
HBX_TMPSTK EQU $ ; Top of private stack
|
|
|
|
|