Browse Source

Update hbios.asm

Resync
pull/187/head
b1ackmai1er 5 years ago
parent
commit
886621397e
  1. 202
      Source/HBIOS/hbios.asm

202
Source/HBIOS/hbios.asm

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

Loading…
Cancel
Save