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.
229 lines
5.2 KiB
229 lines
5.2 KiB
;:::::::::::::::::::::::::::::::::::::::*****************************
|
|
; HBIOS - HBios Interface Routines ***** Hardware-Specific *****
|
|
; *****************************
|
|
; - Retro Brew -
|
|
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
;
|
|
; HBIOS Functions
|
|
;
|
|
HBF_ALLOC EQU 0F6H ; HBIOS Func: ALLOCATE Heap Memory
|
|
HBF_PEEK EQU 0FAH ; HBIOS Func: Peek Byte
|
|
HBF_POKE EQU 0FBH ; HBIOS Func: Poke Byte
|
|
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
|
|
|
|
HBX_CURBNK EQU 0FFE0H
|
|
HBX_INVBNK EQU 0FFE1H
|
|
HBX_SRCADR EQU 0FFE2H
|
|
HBX_SRCBNK EQU 0FFE4H
|
|
HBX_DSTADR EQU 0FFE5H
|
|
HBX_DSTBNK EQU 0FFE7H
|
|
HBX_CPYLEN EQU 0FFE8H
|
|
|
|
CSEG
|
|
|
|
|
|
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
; Trap initial SELMEM call and fixup HBIOS bank ids.
|
|
; A = Bank
|
|
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
|
|
; LDSYS calls the SELMEM entry point of BIOSJT in order to
|
|
; place memory contents in SYSBNK. It does this prior to
|
|
; calling CBOOT to start the system. Since we need to adjust
|
|
; the bank numbers on-the-fly at startup to adjust for
|
|
; HBIOS actual RAM size, we intercept the initial HB_SELMEM
|
|
; call here, make required changes, then update the
|
|
; BIOSJT to point directly to the normal SELMEM routine for
|
|
; all subsequent calls.
|
|
|
|
; BPBIOS HBIOS Typical
|
|
; ------------ -------------- --------------
|
|
; -1: <COMMON> BID_COM 90h - 1 = 8Fh
|
|
; -2: TPABNK BID_USR 90h - 2 = 8Eh
|
|
; -3: <HBIOS> BID_BIOS 90h - 3 = 8Dh
|
|
; -4: SYSBNK BID_AUX 90h - 4 = 8Ch
|
|
; -9: BNKM BID_AUX-5 90h - 9 = 87h
|
|
; -16: RAMBNK RAMD0 90h - 16 = 80h
|
|
|
|
HB_SELMEM:
|
|
PUSH AF
|
|
PUSH BC
|
|
PUSH DE
|
|
PUSH HL
|
|
|
|
LD BC,HBF_BNKINFO ; HBIOS BNKINFO function
|
|
CALL HBX_INVOKE ; DO IT, D=BID_BIOS, E=BID_USER
|
|
LD A,D ; BID_BIOS
|
|
LD (HB_BNKBIOS),A ; SET HB_BNKBIOS
|
|
ADD A,3 ; HBIOS + 3
|
|
LD (HB_BNKEND),A ; ... is the ending RAM bank
|
|
IF BANKED
|
|
LD (BNKADJ+1),A ; Dynamically update SELBNK
|
|
ENDIF
|
|
|
|
LD HL,SELMEM ; Future SELMEM calls will
|
|
LD (BIOSJT+(27*3)+1),HL ; ... go to real SELMEM
|
|
|
|
POP HL
|
|
POP DE
|
|
POP BC
|
|
POP AF
|
|
JP SELMEM
|
|
|
|
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
; Move Data - Possibly between banks. This resembles CP/M 3, but
|
|
; usage of the HL and DE registers is reversed.
|
|
; Enter: HL = Source Address
|
|
; DE = Destination Address
|
|
; BC = Number of bytes to move
|
|
; Exit : None
|
|
; Uses : AF,BC,DE,HL
|
|
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
|
|
HB_MOVE:
|
|
PUSH HL
|
|
LD HL,HB_BNKEND
|
|
LD A,(HB_SRCBNK)
|
|
ADD A,(HL) ; Adjust for HBIOS bank ids
|
|
LD (HBX_SRCBNK),A
|
|
LD A,(HB_DSTBNK)
|
|
ADD A,(HL) ; Adjust for HBIOS bank ids
|
|
LD (HBX_DSTBNK),A
|
|
POP HL
|
|
CALL HBX_BNKCPY
|
|
PUSH HL
|
|
LD HL,(TPABNK) ; Get TPA Bank #
|
|
LD H,L ; .to both H and L
|
|
LD (HB_SRCBNK),HL ; ..set Source & Destination Bank # to TPA
|
|
POP HL
|
|
RET
|
|
|
|
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
; Set Banks for Inter-Bank Xfer. Save all Registers.
|
|
; B = Destination Bank, C = Source Bank
|
|
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
|
|
HB_XMOVE:
|
|
LD (HB_SRCBNK),BC
|
|
RET
|
|
|
|
;
|
|
;==================================================================================================
|
|
; HBIOS INITIALIZATION
|
|
;==================================================================================================
|
|
;
|
|
HB_INIT:
|
|
;; Setup RST 08 vector
|
|
;LD A,0C3H ; $C3 = JP
|
|
;LD (08H),A
|
|
;LD HL,HBX_INVOKE
|
|
;LD (09H),HL
|
|
|
|
;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
|
|
;
|
|
;ENDIF ;BANKED
|
|
|
|
IF HB_DEBUG
|
|
|
|
CSEG
|
|
XORG DEFL $
|
|
ORG 0
|
|
ORG_CSEG EQU $
|
|
ORG XORG
|
|
|
|
DSEG
|
|
XORG DEFL $
|
|
ORG 0
|
|
ORG_DSEG EQU $
|
|
ORG XORG
|
|
|
|
IF BANKED
|
|
|
|
COMMON /BANK2/
|
|
XORG DEFL $
|
|
ORG 0
|
|
ORG_BANK2 EQU $
|
|
ORG XORG
|
|
|
|
COMMON /B2RAM/
|
|
XORG DEFL $
|
|
ORG 0
|
|
ORG_B2RAM EQU $
|
|
ORG XORG
|
|
|
|
COMMON /RESVD/
|
|
XORG DEFL $
|
|
ORG 0
|
|
ORG_RESVD EQU $
|
|
ORG XORG
|
|
|
|
ENDIF
|
|
|
|
CALL NEWLINE2
|
|
LD DE,HB_STR_TAG
|
|
CALL WRITESTR
|
|
|
|
LD DE,HB_STR_CSEG
|
|
CALL WRITESTR
|
|
LD BC,ORG_CSEG
|
|
CALL PRTHEXWORD
|
|
LD DE,HB_STR_DSEG
|
|
CALL WRITESTR
|
|
LD BC,ORG_DSEG
|
|
CALL PRTHEXWORD
|
|
|
|
IF BANKED
|
|
LD DE,HB_STR_BANK2
|
|
CALL WRITESTR
|
|
LD BC,ORG_BANK2
|
|
CALL PRTHEXWORD
|
|
LD DE,HB_STR_B2RAM
|
|
CALL WRITESTR
|
|
LD BC,ORG_B2RAM
|
|
CALL PRTHEXWORD
|
|
LD DE,HB_STR_RESVD
|
|
CALL WRITESTR
|
|
LD BC,ORG_RESVD
|
|
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=$"
|
|
|
|
ELSE ; [HB_DEBUG]
|
|
|
|
RET
|
|
|
|
ENDIF ; [HB_DEBUG]
|
|
|
|
CSEG
|
|
|
|
HB_SRCBNK: DEFS 1 ; Move Source Bank #
|
|
HB_DSTBNK: DEFS 1 ; Move Destination Bank #
|
|
HB_BNKBIOS: DEFS 1 ; Bank id of HBIOS bank
|
|
HB_BNKEND: DEFS 1 ; End of available RAM banks (last bank + 1)
|
|
HB_DSKBUF: DEFS 2 ; Address of physical disk buffer in HBIOS bank
|
|
|