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

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