mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Update hbios.asm
Resync
This commit is contained in:
@@ -115,12 +115,23 @@ MODCNT .SET MODCNT + 1
|
||||
; NO INTERRUPT HANDLING
|
||||
#DEFINE HB_DI ;
|
||||
#DEFINE HB_EI ;
|
||||
#ENDIF
|
||||
#IF ((INTMODE == 1) | (INTMODE == 2) | (INTMODE == 3))
|
||||
; MODE 1 OR 2 OR 3 INTERRUPT HANDLING
|
||||
#ELSE
|
||||
#IF (CPUFAM == CPU_Z280)
|
||||
#IF (INTMODE == 3)
|
||||
; Z280 MODE 3 INTERRUPT HANDLING (INTA & UART ENABLED)
|
||||
#DEFINE HB_DI DI
|
||||
#DEFINE HB_EI .DB $ED,$F7,$09
|
||||
#ELSE
|
||||
; Z280 MODE 1/2 INTERRUPT HANDLING
|
||||
#DEFINE HB_DI DI
|
||||
#DEFINE HB_EI EI
|
||||
#ENDIF
|
||||
#ELSE
|
||||
#DEFINE HB_DI DI
|
||||
#DEFINE HB_EI EI
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF (INTMODE > 3)
|
||||
.ECHO "*** ERROR: INVALID INTMODE SETTING!!!\n"
|
||||
!!! ; FORCE AN ASSEMBLY ERROR
|
||||
@@ -300,10 +311,7 @@ HBX_IDENT:
|
||||
; ACCOMMODATE FREERTOS. HBX_BUF IS ONLY USED AS A BOUNCE BUFFER, SO IT'S
|
||||
; USE WILL NEVER OVERLAP WITH BELOW.
|
||||
;
|
||||
; HBX_INVOKE IS NOT RE-ENTRANT! HB_INVBNK CAN BE USED GLOBALLY TO DETERMINE
|
||||
; IF HBIOS IS ALREADY ACTIVE. HB_INVBNK WILL HAVE A VALUE != $FF WHEN HBIOS
|
||||
; IS ACTIVE. ON RETURN, HB_INVBNK IS SET TO $FF TO INDICATE HBIOS IS NOT
|
||||
; ACTIVE.
|
||||
; WARNING: HBX_INVOKE IS *NOT* REENTRANT!
|
||||
;
|
||||
HBX_INVOKE:
|
||||
|
||||
@@ -500,10 +508,10 @@ HBX_BNKCPY:
|
||||
.DB $ED,$66 ; LDCTL HL,(C)
|
||||
POP BC
|
||||
EX (SP),HL
|
||||
DI
|
||||
HB_DI
|
||||
#ELSE
|
||||
LD A,I
|
||||
DI
|
||||
HB_DI
|
||||
PUSH AF
|
||||
#ENDIF
|
||||
LD (HBX_BC_SP),SP ; PUT STACK
|
||||
@@ -545,7 +553,7 @@ HBX_BC_SP .EQU $ - 2 ; ... TO ORIGINAL VALUE
|
||||
#ELSE
|
||||
POP AF
|
||||
JP PO,$+4
|
||||
EI
|
||||
HB_EI
|
||||
#ENDIF
|
||||
RET
|
||||
;
|
||||
@@ -576,6 +584,48 @@ HBX_BC_ITER:
|
||||
; ON INPUT A=TARGET BANK, IX=TARGET ADDRESS
|
||||
;
|
||||
HBX_BNKCALL:
|
||||
;
|
||||
#IF (MEMMGR == MM_Z280)
|
||||
JR HBX_BNKCALL2
|
||||
|
||||
CP BID_BIOS ; CALLING HBIOS?
|
||||
JR NZ,HBX_BNKCALL2 ; NOPE, DO NORMAL PROCESSING
|
||||
|
||||
;PUSH AF
|
||||
;LD A,'['
|
||||
;.DB $ED,$71 ; SC
|
||||
;.DW COUT ; SC PARAMETER
|
||||
;POP AF
|
||||
|
||||
;
|
||||
;LD A,(HB_CURBNK) ; GET CURRENT BANK
|
||||
;LD (HB_INVBNK),A ; SAVE INVOCATION BANK
|
||||
;
|
||||
;LD A,BID_BIOS ; HBIOS BANK
|
||||
;LD (HB_CURBNK),A ; SET AS CURRENT BANK
|
||||
|
||||
LD (HBX_BNKCALL1+2),IX ; SETUP TARGET ADDRESS
|
||||
HBX_BNKCALL1:
|
||||
.DB $ED,$71 ; SC
|
||||
.DW $FFFF ; SC PARAMETER (SET ABOVE)
|
||||
|
||||
;PUSH AF
|
||||
;LD A,']'
|
||||
;.DB $ED,$71 ; SC
|
||||
;.DW COUT ; SC PARAMETER
|
||||
;POP AF
|
||||
|
||||
;PUSH AF
|
||||
;LD A,(HB_INVBNK)
|
||||
;LD (HB_CURBNK),A
|
||||
;POP AF
|
||||
|
||||
|
||||
|
||||
RET
|
||||
#ENDIF
|
||||
|
||||
HBX_BNKCALL2:
|
||||
LD (HBX_TGTBNK),A ; STUFF TARGET BANK TO CALL INTO CODE BELOW
|
||||
LD (HBX_TGTADR),IX ; STUFF ADDRESS TO CALL INTO CODE BELOW
|
||||
LD A,(HB_CURBNK) ; GET CURRENT BANK
|
||||
@@ -956,7 +1006,7 @@ HB_START:
|
||||
; INITIALIZE MMU
|
||||
; START BY SELECTING I/O PAGE $FF
|
||||
LD L,$FF ; MMU AND DMA PAGE I/O REG IS $FF
|
||||
LD C,$08 ; REG C POINTS TO I/O PAGE REGISTER
|
||||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER
|
||||
.DB $ED,$6E ; LDCTL (C),HL
|
||||
;
|
||||
; INITIALIZE ALL OF THE SYSTEM PAGE DESCRIPTORS WITH BLOCK MOVE
|
||||
@@ -979,13 +1029,18 @@ HB_START:
|
||||
LD C,Z280_MMUMCR ; MMU MASTER CONTROL REGISTER
|
||||
LD HL,$BBFF ; ENABLE USER & SYSTEM TRANSLATE
|
||||
.DB $ED,$BF ; OUTW (C),HL
|
||||
;
|
||||
;
|
||||
; DISABLE MEMORY REFRESH CYCLES
|
||||
LD A,$08 ; DISABLED
|
||||
OUT (Z280_RRR),A ; SET REFRESH RATE REGISTER
|
||||
|
||||
; RESTORE I/O PAGE TO $00
|
||||
LD L,$00 ; NORMAL I/O REG IS $00
|
||||
LD C,$08 ; REG C POINTS TO I/O PAGE REGISTER
|
||||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER
|
||||
.DB $ED,$6E ; LDCTL (C),HL
|
||||
;
|
||||
; CONFIGURE Z280 INT/TRAP VECTOR TABLE POINTER REGISTER
|
||||
; WILL POINT TO ROM COPY FOR NOW, UPDATED TO RAM LATER ON
|
||||
LD C,Z280_VPR
|
||||
LD HL,Z280_IVT >> 8 ; TOP 16 BITS OF PHYSICAL ADR OF IVT
|
||||
.DB $ED,$6E ; LDCTL (C),HL
|
||||
@@ -2037,6 +2092,9 @@ HB_PCINITTBL:
|
||||
#IF (ACIAENABLE)
|
||||
.DW ACIA_PREINIT
|
||||
#ENDIF
|
||||
#IF (Z2UENABLE)
|
||||
.DW Z2U_PREINIT
|
||||
#ENDIF
|
||||
#IF (PIO_4P | PIO_ZP)
|
||||
.DW PIO_PREINIT
|
||||
#ENDIF
|
||||
@@ -2080,6 +2138,9 @@ HB_INITTBL:
|
||||
#IF (ACIAENABLE)
|
||||
.DW ACIA_INIT
|
||||
#ENDIF
|
||||
#IF (Z2UENABLE)
|
||||
.DW Z2U_INIT
|
||||
#ENDIF
|
||||
#IF (DSRTCENABLE)
|
||||
.DW DSRTC_INIT
|
||||
#ENDIF
|
||||
@@ -2798,7 +2859,7 @@ SYS_VER:
|
||||
; SET ACTIVE MEMORY BANK AND RETURN PREVIOUSLY ACTIVE MEMORY BANK
|
||||
; NOTE THAT IT GOES INTO EFFECT AS HBIOS FUNCTION IS EXITED
|
||||
; HERE, WE JUST SET THE CURRENT BANK
|
||||
; CALLER MUST ESTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION!
|
||||
; CALLER MUST EXTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION!
|
||||
;
|
||||
SYS_SETBNK:
|
||||
#IF (MEMMGR == MM_Z280)
|
||||
@@ -3189,10 +3250,10 @@ SYS_PEEK:
|
||||
LD C,Z280_MSR
|
||||
.DB $FD,$ED,$66 ; LDCTL IY,(C)
|
||||
PUSH IY
|
||||
DI
|
||||
HB_DI
|
||||
#ELSE
|
||||
LD A,I ; SAVE THE INTERRUPT STATUS
|
||||
DI ; COPY IFF2 TO P/V FLAG
|
||||
LD A,I
|
||||
DI
|
||||
PUSH AF
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
@@ -3204,9 +3265,9 @@ SYS_PEEK:
|
||||
.DB $FD,$ED,$6E ; LDCTL (C),IY
|
||||
POP IY
|
||||
#ELSE
|
||||
POP AF ; RECALL INITIAL INTERRUPT STATUS
|
||||
JP PO,$+4 ; RETURN TO INITIAL STATE
|
||||
EI
|
||||
POP AF
|
||||
JP PO,$+4
|
||||
HB_EI
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
XOR A
|
||||
@@ -3226,10 +3287,10 @@ SYS_POKE:
|
||||
LD C,Z280_MSR
|
||||
.DB $FD,$ED,$66 ; LDCTL IY,(C)
|
||||
PUSH IY
|
||||
DI
|
||||
HB_DI
|
||||
#ELSE
|
||||
LD A,I
|
||||
DI
|
||||
HB_DI
|
||||
PUSH AF
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
@@ -3243,7 +3304,7 @@ SYS_POKE:
|
||||
#ELSE
|
||||
POP AF
|
||||
JP PO,$+4
|
||||
EI
|
||||
HB_EI
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
XOR A
|
||||
@@ -3495,63 +3556,65 @@ Z280_BADINTSTR .TEXT "\n\n*** Z280 BAD INT @$"
|
||||
#IF (MEMMGR == MM_Z280)
|
||||
;
|
||||
Z280_PRIVINST:
|
||||
; SAVE HL AND MSR FOR POSSIBLE RETURN VIA RETIL
|
||||
EX (SP),HL ; GET MSR, SAVE HL
|
||||
LD (HB_MSRSAV),HL ; SAVE IT
|
||||
POP HL ; RECOVER HL, POP STACK
|
||||
EX (SP),HL ; GET ADR, SAVE HL
|
||||
|
||||
;
|
||||
PUSH AF
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
|
||||
;
|
||||
.DB $ED,$96 ; LDUP A,(HL)
|
||||
INC HL ; BUMP PAST PRIV INST
|
||||
|
||||
;CALL PC_LBKT
|
||||
;CALL PRTHEXBYTE
|
||||
;CALL PC_RBKT
|
||||
|
||||
;
|
||||
; HANDLE DI
|
||||
CP $F3 ; DI?
|
||||
JR NZ,Z280_PRIVINST2
|
||||
DI ; DO THE DI
|
||||
HB_DI ; DO THE DI
|
||||
INC HL ; BUMP PAST IT
|
||||
JR Z280_PRIVINSTX
|
||||
|
||||
;
|
||||
Z280_PRIVINST2:
|
||||
; HANDLE EI
|
||||
CP $FB ; EI?
|
||||
JR NZ,Z280_PRIVINST_HALT
|
||||
EI ; DO THE EI
|
||||
JR NZ,Z280_PRIVINST3
|
||||
HB_EI ; DO THE EI
|
||||
INC HL ; BUMP PAST IT
|
||||
JR Z280_PRIVINSTX
|
||||
|
||||
Z280_PRIVINST_HALT:
|
||||
;
|
||||
Z280_PRIVINST3:
|
||||
; SOMETHING ELSE, DIAGNOSE & HALT SYSTEM
|
||||
|
||||
PUSH HL
|
||||
LD DE,Z280_PRIVSTR
|
||||
CALL WRITESTR
|
||||
CALL PRTHEXWORDHL
|
||||
;
|
||||
; DUMP 16 BYTES OF USER ADDRESS SPACE
|
||||
CALL PC_SPACE
|
||||
CALL PC_LBKT
|
||||
CALL PRTHEXBYTE
|
||||
LD B,$10
|
||||
Z280_PRIVINST4:
|
||||
.DB $ED,$96 ; LDUP A,(HL)
|
||||
CALL PRTHEXBYTE
|
||||
INC HL
|
||||
.DB $ED,$96 ; LDUP A,(HL)
|
||||
CALL PRTHEXBYTE
|
||||
DJNZ Z280_PRIVINST4
|
||||
CALL PC_RBKT
|
||||
POP HL
|
||||
|
||||
CALL NEWLINE
|
||||
LD DE,Z280_PRIVSTR
|
||||
CALL WRITESTR
|
||||
DEC HL
|
||||
CALL PRTHEXWORDHL
|
||||
|
||||
;
|
||||
; GO NO FURTHER
|
||||
DI
|
||||
HALT
|
||||
|
||||
Z280_PRIVINSTX:
|
||||
;
|
||||
Z280_PRIVINSTX:
|
||||
; RESTORE REGISTERS
|
||||
POP DE
|
||||
POP BC
|
||||
POP AF
|
||||
|
||||
;
|
||||
; RECOVER HL AND MSR, THEN RETURN VIA RETIL
|
||||
EX (SP),HL ; RECOVER HL, ADR TO STK
|
||||
PUSH HL ; SAVE HL
|
||||
LD HL,(HB_MSRSAV) ; GET SAVED MSR
|
||||
@@ -3560,7 +3623,7 @@ Z280_PRIVINSTX:
|
||||
;
|
||||
HB_MSRSAV .DW 0
|
||||
;
|
||||
Z280_PRIVSTR .TEXT "\n\n*** Privileged Instruction @$"
|
||||
Z280_PRIVSTR .TEXT "\r\n\r\n*** Privileged Instruction @$"
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
@@ -3737,7 +3800,7 @@ HB_TMPREF .DW 0
|
||||
; Z280 INTERRUPT VECTOR TABLE
|
||||
;==================================================================================================
|
||||
;
|
||||
#IF (MEMMGR = MM_Z280)
|
||||
#IF (MEMMGR == MM_Z280)
|
||||
;
|
||||
.FILL $1000 - ($ & $FFF) ; MUST BE 4K ALIGNED!
|
||||
;
|
||||
@@ -3834,19 +3897,17 @@ Z280_BNKSEL:
|
||||
LD C,Z280_IOPR ; I/O PAGE REGISTER TO C
|
||||
.DB $ED,$6E ; LDCTL (C),HL
|
||||
;
|
||||
; POINT HL TO PORTION OF TABLE TO PROGRAM PDRS WITH
|
||||
LD HL,Z280_PDRTBL ; POINT TO PDR TABLE
|
||||
SLA A ; BANK ID TIMES TWO, RAM BIT TO C
|
||||
JR NC,Z280_BNKSEL1 ; IF ROM, SKIP AHEAD
|
||||
INC H ; HANDLE RAM OFFSET
|
||||
; POINT HL TO STARTING ENTRY TO PROGRAM
|
||||
; OPTIMIZED TO ASSUME HL IS PAGE ALIGNED!
|
||||
LD H,Z280_PDRTBL >> 8
|
||||
SLA A
|
||||
JR NC,Z280_BNKSEL1
|
||||
INC H
|
||||
Z280_BNKSEL1:
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
ADD A,L
|
||||
LD L,A
|
||||
JR NC,Z280_BNKSEL2 ; NO CARRY, SKIP AHEAD
|
||||
INC H ; HANDLE CARRY
|
||||
;
|
||||
Z280_BNKSEL2:
|
||||
; POINT TO FIRST PDR TO PROGRAM ($00=USER, $10=SYSTEM)
|
||||
@@ -3867,6 +3928,11 @@ Z280_BNKSEL2:
|
||||
POP BC
|
||||
RET
|
||||
;
|
||||
#IF (($ & $FF) != 0)
|
||||
; PAGE ALIGN THE TABLE
|
||||
.FILL $100 - ($ & $FF)
|
||||
#ENDIF
|
||||
;
|
||||
#IF (($ % 2) == 1)
|
||||
; BYTE ALIGN THE TABLE
|
||||
.DB 0
|
||||
@@ -4172,7 +4238,7 @@ Z280_BNKSEL:
|
||||
PUSH DE
|
||||
PUSH BC
|
||||
LD L,$FF ; MMU PAGE I/O REG IS $FF
|
||||
LD C,8 ; REG C POINTS TO I/O PAGE REGISTER
|
||||
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER
|
||||
.DB $ED,$6E ; OP CODE FOR LDCTL (C),HL
|
||||
LD E,0 ; DE IS TEMPLATE
|
||||
BIT 7,A
|
||||
@@ -4236,7 +4302,7 @@ W_MMU1:
|
||||
W_MMU2:
|
||||
;.DB $ED,$65 ; PCACHE
|
||||
LD L,0 ; RESTORE I/O PAGE REG TO 0
|
||||
LD C,8
|
||||
LD C,Z280_IOPR
|
||||
.DB $ED,$6E ; LDCTL (C),HL
|
||||
POP BC
|
||||
POP DE
|
||||
@@ -4453,6 +4519,15 @@ SIZ_ACIA .EQU $ - ORG_ACIA
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (Z2UENABLE)
|
||||
ORG_Z2U .EQU $
|
||||
#INCLUDE "z2u.asm"
|
||||
SIZ_Z2U .EQU $ - ORG_Z2U
|
||||
.ECHO "Z2U occupies "
|
||||
.ECHO SIZ_Z2U
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (VGAENABLE)
|
||||
ORG_VGA .EQU $
|
||||
#INCLUDE "vga.asm"
|
||||
@@ -5483,8 +5558,8 @@ PS_FLP_DSTR: .TEXT "SD$" ; PS_FLPSD
|
||||
; CHARACTER DEVICE STRINGS
|
||||
;
|
||||
PS_SDSTRREF:
|
||||
.DW PS_SDUART, PS_SDASCI, PS_SDTERM
|
||||
.DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO, PS_SDACIA, PS_SDPIO,PS_SDUF,PS_SDDUART
|
||||
.DW PS_SDUART, PS_SDASCI, PS_SDTERM, PS_SDPRPCON, PS_SDPPPCON
|
||||
.DW PS_SDSIO, PS_SDACIA, PS_SDPIO, PS_SDUF, PS_SDDUART, PS_SDZ2U
|
||||
;
|
||||
PS_SDUART .TEXT "UART$"
|
||||
PS_SDASCI .TEXT "ASCI$"
|
||||
@@ -5496,6 +5571,7 @@ PS_SDACIA .TEXT "ACIA$"
|
||||
PS_SDPIO .TEXT "PORT$"
|
||||
PS_SDUF .TEXT "UF$"
|
||||
PS_SDDUART .TEXT "DUART$"
|
||||
PS_SDZ2U .TEXT "Z2U$"
|
||||
;
|
||||
; CHARACTER SUB TYPE STRINGS
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user