mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Interrupt framework implementation
- Interrupt framework - Documentation in progress w/ Latex conversion
This commit is contained in:
@@ -283,8 +283,8 @@ DPBCNT .EQU ($ - DPBMAP) / 2
|
||||
;__________________________________________________________________________________________________
|
||||
BOOT:
|
||||
; STANDARD BOOT INVOCATION
|
||||
DI
|
||||
IM 1
|
||||
;DI
|
||||
;IM 1
|
||||
LD SP,STACK ; STACK FOR INITIALIZATION
|
||||
;
|
||||
CALL INIT ; EXECUTE COLD BOOT ROUTINE
|
||||
@@ -301,11 +301,13 @@ BOOT:
|
||||
REBOOT:
|
||||
; REBOOT FROM ROM, REPLACES BOOT AFTER INIT
|
||||
#IFDEF PLTUNA
|
||||
DI ; NO INTERRUPTS
|
||||
LD BC,$01FB ; UNA FUNC = SET BANK
|
||||
LD DE,0 ; ROM BOOT BANK
|
||||
CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
|
||||
#ENDIF
|
||||
#IFDEF PLTWBW
|
||||
DI ; NO INTERRUPTS
|
||||
LD A,0 ; ROM BOOT BANK
|
||||
CALL HB_BNKSEL ; SELECT IT INTO LOW MEMORY
|
||||
#ENDIF
|
||||
@@ -315,8 +317,8 @@ REBOOT:
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
WBOOT:
|
||||
DI
|
||||
IM 1
|
||||
;DI
|
||||
;IM 1
|
||||
;
|
||||
LD SP,STACK ; STACK FOR INITIALIZATION
|
||||
;
|
||||
@@ -1083,7 +1085,6 @@ BLK_BLOCK:
|
||||
LDIR
|
||||
RET
|
||||
#ELSE
|
||||
;LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
|
||||
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
|
||||
LD A,(BNKUSER) ; GET USER BANK
|
||||
LD E,A ; E = SOURCE (USER BANK)
|
||||
@@ -1092,13 +1093,9 @@ BLK_BLOCK:
|
||||
LD HL,128 ; HL = COPY LEN = DMA BUFFER SIZE
|
||||
RST 08 ; DO IT
|
||||
CALL BLK_SETUP ; SETUP SOURCE AND DESTINATION
|
||||
;LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
|
||||
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
|
||||
EX DE,HL ; SWAP HL/DE FOR BLOCK OPERATION
|
||||
;PUSH IX ; SAVE IX
|
||||
;LD IX,128 ; DMA BUFFER SIZE
|
||||
RST 08 ; DO IT
|
||||
;POP IX ; RESTORE IX
|
||||
RET
|
||||
#ENDIF
|
||||
;
|
||||
@@ -1113,18 +1110,13 @@ BLK_DEBLOCK:
|
||||
LDIR
|
||||
RET
|
||||
#ELSE
|
||||
;LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
|
||||
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
|
||||
LD DE,(BNKBIOS) ; E = SOURCE (BIOS BANK), D = DEST (USER BANK)
|
||||
LD HL,128 ; HL = COPY LEN = DMA BUFFER SIZE
|
||||
RST 08 ; DO IT
|
||||
CALL BLK_SETUP ; SETUP SOURCE AND DESTINATION
|
||||
;LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
|
||||
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
|
||||
;PUSH IX ; SAVE IX
|
||||
;LD IX,128 ; DMA BUFFER SIZE
|
||||
RST 08 ; DO IT
|
||||
;POP IX ; RESTORE IX
|
||||
RET
|
||||
#ENDIF
|
||||
;
|
||||
@@ -1809,6 +1801,8 @@ HEAPEND .EQU CBIOS_END - 64 ; TOP OF HEAP MEM, END OF CBIOS LESS 32 ENTRY STACK
|
||||
.FILL 16 * 16,0 ; SKIP DPH TABLE AREA
|
||||
;
|
||||
INIT:
|
||||
DI ; NO INTERRUPTS FOR NOW
|
||||
|
||||
; ADJUST BOOT VECTOR TO REBOOT ROUTINE
|
||||
LD HL,REBOOT ; GET REBOOT ADDRESS
|
||||
LD (CBIOS_LOC + 1),HL ; STORE IT IN FIRST ENTRY OF CBIOS JUMP TABLE
|
||||
@@ -1819,50 +1813,56 @@ INIT:
|
||||
LD DE,BID_USR ; SWITCH BACK TO EXEC BANK
|
||||
CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED)
|
||||
|
||||
; COPY BIOS PAGE ZERO TO USER BANK
|
||||
LD BC,$01FB ; UNA FUNC = SET BANK
|
||||
LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC)
|
||||
CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED)
|
||||
PUSH DE ; SAVE PREVIOUS BANK
|
||||
|
||||
LD HL,0 ; FROM ADDRESS 0 (PAGE ZERO)
|
||||
LD DE,SECBUF ; USE SECBUF AS BOUNCE BUFFER
|
||||
LD BC,256 ; ONE PAGE IS 256 BYTES
|
||||
LDIR ; DO IT
|
||||
|
||||
LD BC,$01FB ; UNA FUNC = SET BANK
|
||||
POP DE ; RECOVER OPERATING BANK
|
||||
CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED)
|
||||
|
||||
LD HL,SECBUF ; FROM SECBUF (BUNCE BUFFER)
|
||||
LD DE,0 ; TO PAGE ZERO OF OPERATING BANK
|
||||
LD BC,256 ; ONE PAGE IS 256 BYTES
|
||||
LDIR ; DO IT
|
||||
|
||||
; INSTALL UNA INVOCATION VECTOR FOR RST 08
|
||||
LD A,$C3 ; JP INSTRUCTION
|
||||
LD (8),A ; STORE AT 0x0008
|
||||
LD HL,($FFFE) ; UNA ENTRY VECTOR
|
||||
LD (9),HL ; STORE AT 0x0009
|
||||
#ELSE
|
||||
; GET CRITICAL BANK ID'S
|
||||
LD B,BF_SYSGET ; HBIOS FUNC=GET SYS INFO
|
||||
LD C,BF_SYSGET_BNKINFO ; HBIOS SUBFUNC=GET BANK ASSIGNMENTS
|
||||
CALL $FFF0 ; CALL HBIOS, RST 08 NOT YET INSTALLED
|
||||
RST 08 ; CALL HBIOS
|
||||
LD A,D ; GET HBIOS BANK RETURNED IN D
|
||||
LD (BNKBIOS),A ; ... AND SAVE IT
|
||||
LD A,E ; GET USER BANK RETURNED IN E
|
||||
LD (BNKUSER),A ; ... AND SAVE IT
|
||||
|
||||
; MAKE SURE USER BANK IS ACTIVE
|
||||
LD B,BF_SYSSETBNK ; HB FUNC: SET BANK
|
||||
LD A,(BNKUSER) ; SELECT USER BANK
|
||||
LD C,A ; PUT IN C
|
||||
CALL $FFF0 ; RST 8 IS NOT YET INSTALLED
|
||||
|
||||
; INSTALL HBIOS INVOCATION VECTOR FOR RST 08
|
||||
LD A,$C3 ; JP INSTRUCTION
|
||||
LD (8),A ; STORE AT 0x0008
|
||||
LD HL,($FFF1) ; HBIOS ENTRY VECTOR
|
||||
LD (9),HL ; STORE AT 0x0009
|
||||
|
||||
; SOFT REST HBIOS
|
||||
; SOFT RESET HBIOS
|
||||
LD B,BF_SYSRESET ; HB FUNC: RESET
|
||||
RST 08 ; DO IT
|
||||
|
||||
|
||||
; CREATE A TEMP COPY OF THE HBIOS CONFIG BLOCK (HCB)
|
||||
; FOR REFERENCE USE DURING INIT
|
||||
;LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
|
||||
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
|
||||
LD DE,(BNKBIOS) ; D = DEST (USER BANK), E = SOURCE (BIOS BANK)
|
||||
LD HL,HCB_SIZ ; HL = COPY LEN = SIZE OF HCB
|
||||
RST 08 ; DO IT
|
||||
;LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
|
||||
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
|
||||
LD HL,HCB_LOC ; COPY FROM FIXED LOCATION IN HB BANK
|
||||
LD DE,HCB ; TO TEMP LOCATION IN USR BANK
|
||||
;LD IX,HCB_SIZ ; COPY CONTENTS OF HCB
|
||||
RST 08 ; DO IT
|
||||
|
||||
|
||||
; CAPTURE RAM DRIVE STARTING BANK
|
||||
LD A,(HCB + HCB_BIDRAMD0)
|
||||
LD (BNKRAMD),A
|
||||
@@ -2131,6 +2131,7 @@ MD_INIT4:
|
||||
; FILL FIRST 8K OF RAM DISK TRACK 1 WITH 'E5'
|
||||
;
|
||||
#IF (CLRRAMDISK != CLR_NEVER)
|
||||
DI ; NO INTERRUPTS
|
||||
LD BC,$01FB ; UNA FUNC = SET BANK
|
||||
LD DE,BID_RAMD0 ; FIRST BANK OF RAM DISK
|
||||
CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
|
||||
@@ -2176,6 +2177,7 @@ CLRRAM3:
|
||||
LD BC,$01FB ; UNA FUNC = SET BANK
|
||||
LD DE,BID_USR ; SWITCH BACK TO EXEC BANK
|
||||
CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
|
||||
EI ; RESUME INTERRUPTS
|
||||
|
||||
#ENDIF
|
||||
|
||||
@@ -2185,10 +2187,9 @@ CLRRAM3:
|
||||
; FILL FIRST 8K OF RAM DISK TRACK 1 WITH 'E5'
|
||||
;
|
||||
#IF (CLRRAMDISK != CLR_NEVER)
|
||||
LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
|
||||
DI ; NO INTERRUPTS
|
||||
LD A,(BNKRAMD) ; FIRST BANK OF RAM DISK
|
||||
LD C,A ; ... TO C
|
||||
CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
|
||||
CALL HB_BNKSEL ; SELECT BANK
|
||||
|
||||
#IF (CLRRAMDISK == CLR_AUTO)
|
||||
; CHECK FIRST 32 DIRECTORY ENTRIES. IF ANY START WITH AN INVALID
|
||||
@@ -2211,26 +2212,21 @@ CLRRAM1:
|
||||
JR CLRRAM3 ; ALL ENTRIES VALID, BYPASS INIT
|
||||
CLRRAM2:
|
||||
#ENDIF
|
||||
LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
|
||||
LD A,(BNKUSER) ; SWITCH BACK TO USER BANK
|
||||
LD C,A ; ... TO REG C
|
||||
CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
|
||||
CALL HB_BNKSEL ; SELECT BANK
|
||||
CALL NEWLINE2 ; FORMATTING
|
||||
LD DE,STR_INITRAMDISK ; RAM DISK INIT MESSAGE
|
||||
CALL WRITESTR ; DISPLAY IT
|
||||
LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
|
||||
LD A,(BNKRAMD) ; SWITCH BACK TO FIRST BANK
|
||||
LD C,A ; ... TO REG C
|
||||
CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
|
||||
CALL HB_BNKSEL ; SELECT BANK
|
||||
LD HL,0 ; SOURCE ADR FOR FILL
|
||||
LD BC,$2000 ; LENGTH OF FILL IS 8K
|
||||
LD A,$E5 ; FILL VALUE
|
||||
CALL FILL ; DO IT
|
||||
CLRRAM3:
|
||||
LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
|
||||
LD A,(BNKUSER) ; USR BANK (TPA)
|
||||
LD C,A ; ... TO REG C
|
||||
CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
|
||||
CALL HB_BNKSEL ; SELECT BANK
|
||||
EI ; RESUME INTRRUPTS
|
||||
#ENDIF
|
||||
;
|
||||
#ENDIF
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
CPUOSC .EQU 18432000 ; CPU OSC FREQ
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE)
|
||||
INTTYPE .EQU IT_Z180 ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
|
||||
;
|
||||
CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP
|
||||
VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
CPUOSC .EQU 18432000 ; CPU OSC FREQ
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE)
|
||||
INTTYPE .EQU IT_Z180 ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
|
||||
;
|
||||
CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP
|
||||
VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
CPUOSC .EQU 8000000 ; CPU OSC FREQ
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE)
|
||||
INTTYPE .EQU IT_NONE ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
|
||||
;
|
||||
CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP
|
||||
VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
CPUOSC .EQU 20000000 ; CPU OSC FREQ
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE)
|
||||
INTTYPE .EQU IT_NONE ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
|
||||
;
|
||||
CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP
|
||||
VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
|
||||
@@ -7,4 +7,6 @@
|
||||
;
|
||||
#INCLUDE "Config/plt_zeta.asm" ; USE ZETA CONFIG TO START
|
||||
;
|
||||
INTTYPE .SET IT_CTC ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
|
||||
;
|
||||
FDMODE .SET FDMODE_ZETA2 ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
;
|
||||
CPUOSC .SET 20000000 ; EMULATOR RUNS FAST...
|
||||
;
|
||||
INTTYPE .SET IT_SIMH
|
||||
;
|
||||
SIMRTCENABLE .SET TRUE
|
||||
DSRTCENABLE .SET FALSE
|
||||
;
|
||||
|
||||
@@ -428,7 +428,7 @@ ASCI_CNTLB:
|
||||
;CALL TSTPT
|
||||
RET NZ ; ABORT ON ERROR
|
||||
PUSH HL ; HL HAS (BAUD / 75), SAVE IT
|
||||
LD HL,(HCB + HCB_CPUKHZ) ; GET CPU CLK IN KHZ
|
||||
LD HL,(CB_CPUKHZ) ; GET CPU CLK IN KHZ
|
||||
;LD HL,CPUKHZ ; CPU CLK IN KHZ
|
||||
;LD HL,9216 ; *DEBUG*
|
||||
|
||||
|
||||
@@ -182,7 +182,7 @@ DSRTC_GETTIM:
|
||||
LD HL,DSRTC_TIMBUF ; SOURCE ADR
|
||||
POP DE ; DEST ADR
|
||||
LD BC,6 ; LENGTH IS 6 BYTES
|
||||
CALL BNKCPY ; COPY THE CLOCK DATA
|
||||
CALL HBX_BNKCPY ; COPY THE CLOCK DATA
|
||||
;
|
||||
; CLEAN UP AND RETURN
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
@@ -207,7 +207,7 @@ DSRTC_SETTIM:
|
||||
LD (HB_DSTBNK),A ; SET IT
|
||||
LD DE,DSRTC_TIMBUF ; DEST ADR
|
||||
LD BC,6 ; LENGTH IS 6 BYTES
|
||||
CALL BNKCPY ; COPY THE CLOCK DATA
|
||||
CALL HBX_BNKCPY ; COPY THE CLOCK DATA
|
||||
;
|
||||
; WRITE TO CLOCK
|
||||
LD HL,DSRTC_TIMBUF ; POINT TO TIME BUFFER
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
#INCLUDE "std.asm"
|
||||
;
|
||||
; MAKE SURE EXACTLY ONE OF ROMBOOT, APPBOOT, IMGBOOT IS DEFINED.
|
||||
;
|
||||
MODCNT .EQU 0
|
||||
#IFDEF ROMBOOT
|
||||
MODCNT .SET MODCNT + 1
|
||||
@@ -65,19 +66,28 @@ MODCNT .SET MODCNT + 1
|
||||
#ENDIF
|
||||
;
|
||||
;
|
||||
;
|
||||
#IF (INTTYPE != IT_NONE)
|
||||
#DEFINE HB_EI EI
|
||||
#DEFINE HB_DI DI
|
||||
#ELSE
|
||||
#DEFINE HB_EI ;
|
||||
#DEFINE HB_DI ;
|
||||
#ENDIF
|
||||
;
|
||||
#IFNDEF APPBOOT
|
||||
;
|
||||
.ORG 0
|
||||
;
|
||||
;==================================================================================================
|
||||
; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE
|
||||
; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE, LEAVE INTERRUPTS DISABLED
|
||||
;==================================================================================================
|
||||
;
|
||||
.FILL (000H - $),0FFH ; RST 0
|
||||
JP HB_START
|
||||
.DW ROM_SIG
|
||||
.FILL (008H - $),0FFH ; RST 8
|
||||
JP HB_DISPATCH
|
||||
JP HBX_INVOKE ; INVOKE HBIOS FUNCTION
|
||||
.FILL (010H - $),0FFH ; RST 10
|
||||
RET
|
||||
.FILL (018H - $),0FFH ; RST 18
|
||||
@@ -88,7 +98,7 @@ MODCNT .SET MODCNT + 1
|
||||
RET
|
||||
.FILL (030H - $),0FFH ; RST 30
|
||||
RET
|
||||
.FILL (038H - $),0FFH ; INT
|
||||
.FILL (038H - $),0FFH ; RST 38 / INT
|
||||
RETI
|
||||
.FILL (066H - $),0FFH ; NMI
|
||||
RETN
|
||||
@@ -106,7 +116,7 @@ ROM_SIG:
|
||||
;
|
||||
NAME .DB "ROMWBW v", BIOSVER, ", ", TIMESTAMP, 0
|
||||
AUTH .DB "WBW",0
|
||||
DESC .DB "ROMWBW v", BIOSVER, ", Copyright 2015, Wayne Warthen, GNU GPL v3", 0
|
||||
DESC .DB "ROMWBW v", BIOSVER, ", Copyright (C) 2015, Wayne Warthen, GNU GPL v3", 0
|
||||
;
|
||||
.FILL ($100 - $),$FF ; PAD REMAINDER OF PAGE ZERO
|
||||
;
|
||||
@@ -171,18 +181,16 @@ CB_BIDROMDN .DB BID_ROMDN
|
||||
.ORG HBX_LOC ; ADJUST FOR RELOCATION
|
||||
;
|
||||
; MEMORY LAYOUT:
|
||||
;
|
||||
; HBIOS PROXY CODE $FE00 (256 BYTES)
|
||||
; INTERRUPT VECTORS $FF00 (32 BYTES, 16 ENTRIES)
|
||||
; HBIOS PROXY COPY BUFFER $FF20 (128 BYTES)
|
||||
; HBIOS PROXY PRIVATE STACK $FFA0 (64 BYTES, 32 ENTRIES)
|
||||
; INTERRUPT HANDLER STUBS $FF20 (128 BYTES)
|
||||
; HBIOS PROXY COPY BUFFER $FF80 (64 BYTES)
|
||||
; HBIOS PROXY MGMT BLOCK $FFE0 (32 BYTES)
|
||||
;
|
||||
; DEFINITIONS
|
||||
;
|
||||
HBX_CODSIZ .EQU $100 ; 256 BYTE CODE SPACE
|
||||
HBX_IVTSIZ .EQU $20 ; INT VECTOR TABLE SIZE (16 ENTRIES)
|
||||
HBX_BUFSIZ .EQU $80 ; INTERBANK COPY BUFFER
|
||||
HBX_STKSIZ .EQU $40 ; PRIVATE STACK SIZE
|
||||
HBX_BUFSIZ .EQU $40 ; INTERBANK COPY BUFFER
|
||||
;
|
||||
; HBIOS IDENTIFICATION DATA BLOCK
|
||||
;
|
||||
@@ -197,24 +205,28 @@ HBX_IDENT:
|
||||
;
|
||||
HBX_INVOKE:
|
||||
LD (HBX_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
|
||||
LD SP,HBX_STACK ; SETUP NEW STACK FRAME
|
||||
|
||||
LD A,(HB_CURBNK) ; GET CURRENT BANK
|
||||
LD (HBX_INVBNK),A ; SETUP TO RESTORE AT EXIT
|
||||
|
||||
HB_DI
|
||||
LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM
|
||||
LD A,BID_BIOS ; HBIOS BANK
|
||||
CALL HBX_BNKSEL ; SELECT IT
|
||||
LD SP,HB_STACK ; NOW USE FULL HBIOS STACK IN HBIOS BANK
|
||||
HB_EI
|
||||
|
||||
CALL HB_DISPATCH ; CALL HBIOS FUNCTION DISPATCHER
|
||||
|
||||
HB_DI
|
||||
LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM
|
||||
PUSH AF ; SAVE AF (FUNCTION RETURN)
|
||||
LD A,$FF ; LOAD ORIGINAL BANK ($FF IS REPLACED AT ENTRY)
|
||||
HBX_INVBNK .EQU $ - 1
|
||||
CALL HBX_BNKSEL ; SELECT IT
|
||||
POP AF ; RESTORE AF
|
||||
|
||||
LD SP,0 ; RESTORE ORIGINAL STACK FRAME
|
||||
HBX_STKSAV .EQU $ - 2
|
||||
HB_EI
|
||||
|
||||
RET ; RETURN TO CALLER
|
||||
;
|
||||
@@ -222,11 +234,14 @@ HBX_STKSAV .EQU $ - 2
|
||||
;; SETBNK - Switch Memory Bank to Bank in A.
|
||||
;; Preserve all Registers including Flags.
|
||||
;; Does NOT update current bank.
|
||||
;; Interrupts should be disabled by caller
|
||||
;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
;
|
||||
HBX_BNKSEL:
|
||||
LD (HB_CURBNK),A ; RECORD NEW CURRENT BANK
|
||||
;
|
||||
HBX_BNKSEL_INT:
|
||||
;
|
||||
#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_ZETA))
|
||||
OUT (MPCL_ROM),A ; SET ROM PAGE SELECTOR
|
||||
OUT (MPCL_RAM),A ; SET RAM PAGE SELECTOR
|
||||
@@ -294,6 +309,10 @@ HBX_BNKSEL1:
|
||||
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||
;
|
||||
HBX_BNKCPY:
|
||||
HB_DI
|
||||
LD (HBX_BC_SP),SP
|
||||
LD SP,HBX_STACK
|
||||
|
||||
LD A,(HB_CURBNK) ; GET CURRENT BANK
|
||||
PUSH AF ; AND SAVE TO RESTORE LATER
|
||||
PUSH BC ; CUR LEN -> (SP)
|
||||
@@ -316,7 +335,11 @@ HBX_BC_LAST:
|
||||
POP BC ; BC := REM LEN
|
||||
CALL NZ,HBX_BC_ITER ; DO FINAL CHUNK, BUT ONLY IF NOT ZERO BYTES
|
||||
POP AF ; RECOVER ORIGINAL BANK
|
||||
JP HBX_BNKSEL ; SWITCH TO CURRENT BANK AND EXIT
|
||||
CALL HBX_BNKSEL ; SWITCH TO CURRENT BANK AND EXIT
|
||||
LD SP,$FFFF
|
||||
HBX_BC_SP .EQU $ - 2
|
||||
HB_EI
|
||||
RET
|
||||
;
|
||||
HBX_BC_ITER:
|
||||
; HL = SRC ADR, DE = DEST ADR, BC = LEN
|
||||
@@ -342,6 +365,7 @@ HBX_BC_ITER:
|
||||
; On input A=target bank, HL=target address
|
||||
;
|
||||
HBX_BNKCALL:
|
||||
HB_DI
|
||||
LD (HBX_TGTBNK),A ; stuff target bank to call into code below
|
||||
LD (HBX_TGTADR),HL ; stuff address to call into code below
|
||||
LD A,(HB_CURBNK) ; get current bank
|
||||
@@ -349,17 +373,82 @@ HBX_BNKCALL:
|
||||
HBX_TGTBNK .EQU $ + 1
|
||||
LD A,$FF ; load bank to call ($FF overlaid at entry)
|
||||
CALL HBX_BNKSEL ; activate the new bank
|
||||
HB_EI
|
||||
|
||||
HBX_TGTADR .EQU $ + 1
|
||||
CALL $FFFF ; call routine ($FFFF is overlaid above)
|
||||
|
||||
HB_DI
|
||||
EX (SP),HL ; save hl and get bank to restore in hl
|
||||
PUSH AF ; save af
|
||||
LD A,H ; bank to restore to a
|
||||
CALL HBX_BNKSEL ; restore it
|
||||
POP AF ; recover af
|
||||
POP HL ; recover hl
|
||||
HB_EI
|
||||
RET
|
||||
;
|
||||
; INTERRUPT HANDLER DISPATCHING
|
||||
; PEEK & POKE ROUTINES
|
||||
; ADDRESS IN HL, BANK IN D, VALUE IN/OUT IN E, A IS TRASHED
|
||||
;
|
||||
HBX_PEEK:
|
||||
HB_DI
|
||||
LD A,(HB_CURBNK)
|
||||
PUSH AF
|
||||
LD A,D
|
||||
CALL HBX_BNKSEL
|
||||
LD E,(HL)
|
||||
JR HBX_PPRET
|
||||
;
|
||||
HBX_POKE:
|
||||
HB_DI
|
||||
LD A,(HB_CURBNK)
|
||||
PUSH AF
|
||||
LD A,D
|
||||
CALL HBX_BNKSEL
|
||||
LD (HL),E
|
||||
;
|
||||
HBX_PPRET:
|
||||
POP AF
|
||||
CALL HBX_BNKSEL
|
||||
HB_EI
|
||||
RET
|
||||
;
|
||||
; PRIVATE STACK AT END OF HBIOS CODE
|
||||
; OCCUPIES SPACE BEFORE IVT
|
||||
;
|
||||
HBX_STKSIZ .EQU $FF00 - $
|
||||
.ECHO "HBIOS STACK space: "
|
||||
.ECHO HBX_STKSIZ
|
||||
.ECHO " bytes.\n"
|
||||
.FILL HBX_STKSIZ,$FF
|
||||
HBX_STACK .EQU $
|
||||
;
|
||||
; HBIOS INTERRUPT VECTOR TABLE (16 ENTRIES)
|
||||
;
|
||||
HBX_IVT:
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
;
|
||||
; INTERRUPT HANDLER STUBS
|
||||
;
|
||||
; THE FOLLOWING INTERRUPT STUBS RECEIVE CONTROL FROM THE
|
||||
; INTERRUPT, SETUP A HANDLER VECTOR IN HBIOS AND THEN
|
||||
; BRANCH TO THE COMMON INTERRUPT DISPATCHER
|
||||
;
|
||||
INT_TIMER: ; TIMER INTERRUPT HANDLER
|
||||
PUSH HL ; SAVE HL
|
||||
@@ -377,159 +466,49 @@ INT_BAD: ; BAD INTERRUPT HANDLER
|
||||
HBX_INT: ; COMMON INTERRUPT ROUTING CODE
|
||||
;
|
||||
; SAVE STATE (ASSUMES HL SAVED PREVIOUSLY)
|
||||
PUSH AF ; SAVE AF
|
||||
PUSH BC ; SAVE BC
|
||||
PUSH DE ; SAVE DE
|
||||
PUSH AF ; SAVE AF
|
||||
PUSH BC ; SAVE BC
|
||||
PUSH DE ; SAVE DE
|
||||
|
||||
; ACTIVATE BIOS BANK
|
||||
#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_ZETA))
|
||||
LD A,BID_BIOS ; BIOS PAGE INDEX TO ACCUM
|
||||
OUT (MPCL_ROM),A ; SET ROM PAGE SELECTOR
|
||||
OUT (MPCL_RAM),A ; SET RAM PAGE SELECTOR
|
||||
#ENDIF
|
||||
#IF (PLATFORM == PLT_ZETA2)
|
||||
LD A,(BID_BIOS - $80 + $10) * 2 ; BIOS BID -> PAGE INDEX -> A
|
||||
OUT (MPGSEL_0),A ; BANK_0: 0K - 16K
|
||||
INC A ;
|
||||
OUT (MPGSEL_1),A ; BANK_1: 16K - 32K
|
||||
#ENDIF
|
||||
#IF (PLATFORM == PLT_N8)
|
||||
LD A,(BID_BIOS << 3) & $FF ; BIOS BID -> BBR VAL -> A
|
||||
OUT0 (Z180_BBR),A ; WRITE TO Z180 BANK BASE REG
|
||||
LD A,N8_DEFACR | $80 ; BIT 7 SET FOR RAM
|
||||
OUT0 (N8_ACR),A ; WRITE TO N8 ACR
|
||||
#ENDIF
|
||||
#IF (PLATFORM == PLT_MK4)
|
||||
LD A,(BID_BIOS << 3) & $FF | $80 ; BIOS BID -> PAGE INDEX -> A
|
||||
OUT0 (Z180_BBR),A ; WRITE TO Z180 BANK BASE REG
|
||||
#ENDIF
|
||||
LD (HBX_INT_SP),SP ; SAVE ORIGINAL STACK FRAME
|
||||
LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM
|
||||
|
||||
LD A,BID_BIOS ; HBIOS BANK
|
||||
CALL HBX_BNKSEL_INT ; SELECT IT
|
||||
|
||||
; SETUP INTERRUPT PROCESSING STACK IN HBIOS
|
||||
LD (HB_INTSTKSAV),SP ; SAVE STACK POINTER
|
||||
LD SP,HB_INTSTK ; SWITCH TO INTERRUPT STACK
|
||||
LD SP,HB_ISTACK ; NOW USE INT STACK IN HBIOS BANK
|
||||
|
||||
; DO THE REAL WORK
|
||||
CALL JPHL ; CALL INTERRUPT ROUTINE
|
||||
CALL JPHL ; CALL INTERRUPT ROUTINE
|
||||
|
||||
; RESTORE STACK
|
||||
LD SP,(HB_INTSTKSAV) ; RESTORE STACK
|
||||
LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM
|
||||
|
||||
LD A,(HB_CURBNK) ; GET PRE-INT BANK
|
||||
CALL HBX_BNKSEL ; SELECT IT
|
||||
|
||||
LD SP,$FFFF ; RESTORE ORIGINAL STACK FRAME
|
||||
HBX_INT_SP .EQU $ - 2
|
||||
|
||||
; RESTORE BANK
|
||||
LD A,(HB_CURBNK) ; GET PRE-INT BANK
|
||||
;
|
||||
#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_ZETA))
|
||||
OUT (MPCL_ROM),A ; SET ROM PAGE SELECTOR
|
||||
OUT (MPCL_RAM),A ; SET RAM PAGE SELECTOR
|
||||
#ENDIF
|
||||
#IF (PLATFORM == PLT_ZETA2)
|
||||
BIT 7,A ; BIT 7 SET REQUESTS RAM PAGE
|
||||
JR Z,HBX_INT1 ; NOT SET, SELECT ROM PAGE
|
||||
RES 7,A ; RAM PAGE REQUESTED: CLEAR ROM BIT
|
||||
ADD A,16 ; ADD 16 x 32K - RAM STARTS FROM 512K
|
||||
;
|
||||
HBX_INT1:
|
||||
RLCA ; TIMES 2 - GET 16K PAGE INSTEAD OF 32K
|
||||
OUT (MPGSEL_0),A ; BANK_0: 0K - 16K
|
||||
INC A ;
|
||||
OUT (MPGSEL_1),A ; BANK_1: 16K - 32K
|
||||
#ENDIF
|
||||
#IF (PLATFORM == PLT_N8)
|
||||
BIT 7,A ; TEST BIT 7 FOR RAM VS. ROM
|
||||
JR Z,HBX_INT1 ; IF NOT SET, SELECT ROM PAGE
|
||||
;
|
||||
RES 7,A ; CLEAR BIT 7 FOR RAM VS. ROM
|
||||
RLCA ; SCALE SELECTOR TO
|
||||
RLCA ; ... GO FROM Z180 4K PAGE SIZE
|
||||
RLCA ; ... TO DESIRED 32K PAGE SIZE
|
||||
OUT0 (Z180_BBR),A ; WRITE TO BANK BASE
|
||||
JR HBX_INT2 ; CONTINUE
|
||||
;
|
||||
HBX_INT1: ; SELECT ROM PAGE
|
||||
XOR A ; ZERO ACCUM
|
||||
OUT0 (Z180_BBR),A ; ZERO BANK BASE
|
||||
LD A,N8_DEFACR ; SELECT ROM BY CLEARING BIT 7
|
||||
OUT0 (N8_ACR),A ; ... IN N8 ACR REGISTER
|
||||
;
|
||||
HBX_INT2:
|
||||
#ENDIF
|
||||
#IF (PLATFORM == PLT_MK4)
|
||||
RLCA ; RAM FLAG TO CARRY AND BIT 0
|
||||
JR NC,HBX_INT1 ; IF NC, ROM, SKIP AHEAD
|
||||
XOR %00100001 ; SET BIT FOR HI 512K, CLR BIT 0
|
||||
HBX_INT1:
|
||||
RLCA ; ROTATE
|
||||
RLCA ; ... AGAIN
|
||||
OUT0 (Z180_BBR),A ; WRITE TO BANK REGISTER
|
||||
#ENDIF
|
||||
;
|
||||
; RESTORE STATE
|
||||
POP DE ; RESTORE DE
|
||||
POP BC ; RESTORE BC
|
||||
POP AF ; RESTORE AF
|
||||
POP HL ; RESTORE HL
|
||||
|
||||
; DONE
|
||||
RETI ; IMPLICITLY REENABLES INTERRUPTS!
|
||||
EI ; ENABLE INTERRUPTS
|
||||
RETI ; AND RETURN
|
||||
;
|
||||
; PEEK & POKE ROUTINES
|
||||
; ADDRESS IN HL, BANK IN D, VALUE IN/OUT IN E, A IS TRASHED
|
||||
; FILL TO START OF BOUNCE BUFFER
|
||||
;
|
||||
HBX_PEEK:
|
||||
LD A,(HB_CURBNK)
|
||||
PUSH AF
|
||||
LD A,D
|
||||
CALL HBX_BNKSEL
|
||||
LD E,(HL)
|
||||
POP AF
|
||||
JP HBX_BNKSEL
|
||||
;
|
||||
HBX_POKE:
|
||||
LD A,(HB_CURBNK)
|
||||
PUSH AF
|
||||
LD A,D
|
||||
CALL HBX_BNKSEL
|
||||
LD (HL),E
|
||||
POP AF
|
||||
JP HBX_BNKSEL
|
||||
;
|
||||
; FILLER FOR UNUSED HBIOS PROXY CODE SPACE
|
||||
; PAD TO START OF INTERRUPT VECTOR TABLE
|
||||
;
|
||||
HBX_SLACK .EQU (HBX_LOC + HBX_CODSIZ - $)
|
||||
.ECHO "HBIOS PROXY space remaining: "
|
||||
.ECHO HBX_SLACK
|
||||
HBX_INTFILL .EQU (HBX_XFC - HBX_BUFSIZ - $)
|
||||
.ECHO "HBIOS INT space remaining: "
|
||||
.ECHO HBX_INTFILL
|
||||
.ECHO " bytes.\n"
|
||||
.FILL HBX_SLACK,$FF
|
||||
.FILL HBX_INTFILL,$FF
|
||||
;
|
||||
; HBIOS INTERRUPT VECTOR TABLE (16 ENTRIES)
|
||||
;
|
||||
HBX_IVT:
|
||||
.DW INT_TIMER
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
.DW INT_BAD
|
||||
;
|
||||
; INTERBANK COPY BUFFER (128 BYTES)
|
||||
; INTERBANK COPY BUFFER (64 BYTES)
|
||||
;
|
||||
HBX_BUF .FILL HBX_BUFSIZ,0
|
||||
;
|
||||
; PRIVATE STACK (64 BYTES, 32 ENTRIES)
|
||||
;
|
||||
.FILL HBX_STKSIZ,$FF
|
||||
HBX_STACK .EQU $
|
||||
;
|
||||
; HBIOS PROXY MGMT BLOCK (TOP 32 BYTES)
|
||||
;
|
||||
#IFDEF ROMBOOT
|
||||
@@ -558,6 +537,8 @@ HBX_STACK .EQU $
|
||||
; HBIOS CORE
|
||||
;==================================================================================================
|
||||
;
|
||||
HB_STKSIZ .EQU $60 ; HBIOS PRIVATE STACK SIZE
|
||||
HB_ISTKSIZ .EQU $40 ; HBIOS INTERRUPT STACK SIZE
|
||||
;
|
||||
;==================================================================================================
|
||||
; ENTRY VECTORS (JUMP TABLE)
|
||||
@@ -584,6 +565,10 @@ HB_START:
|
||||
XOR A
|
||||
OUT0 (Z180_RCR),A
|
||||
|
||||
; MASK OFF TIMER INTERRUPTS
|
||||
XOR A
|
||||
OUT0 (Z180_TCR),A
|
||||
|
||||
; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2)
|
||||
XOR A
|
||||
OUT0 (Z180_CCR),A
|
||||
@@ -656,7 +641,10 @@ HB_START:
|
||||
LD HL,0
|
||||
LD DE,0
|
||||
LD BC,$8000
|
||||
CALL HB_BNKCPY
|
||||
CALL HBX_BNKCPY
|
||||
;
|
||||
; INTERRUPTS ARE ENABLED BY BNKCPY!!!
|
||||
DI ; RE-DISABLE INTERRUPTS
|
||||
;
|
||||
; TRANSITION TO HBIOS IN RAM BANK
|
||||
;
|
||||
@@ -670,6 +658,10 @@ HB_RAMFLAG .DB FALSE ; ASSUME FALSE, SET TO TRUE BELOW AFTER RAM TRANSITION
|
||||
; EXECUTION RESUMES HERE AFTER SWITCH TO RAM BANK
|
||||
;
|
||||
HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
|
||||
;
|
||||
; INTERRUPTS ARE ENABLED BY BNKCALL!!!
|
||||
DI ; RE-DISABLE INTERRUTPS
|
||||
;
|
||||
LD SP,HBX_LOC ; RESET STACK SINCE WE DO NOT RETURN
|
||||
LD A,TRUE ; ACCUM := TRUE
|
||||
LD (HB_RAMFLAG),A ; SET RAMFLAG
|
||||
@@ -719,6 +711,63 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
|
||||
;
|
||||
CALL NEWLINE2
|
||||
PRTX(STR_BANNER)
|
||||
;
|
||||
; WE CAN HANDLE INTERRUPTS NOW (HOPEFULLY)
|
||||
;
|
||||
HB_DI ; START OF CRITICAL SECTION
|
||||
|
||||
#IF (INTTYPE != IT_NONE)
|
||||
;
|
||||
#IF (INTTYPE == IT_SIMH)
|
||||
;
|
||||
; SETUP TIMER INT VECTOR VIA INT MODE 1 IN PAGE ZERO
|
||||
LD A,$C3 ; JP OPCODE
|
||||
LD ($38),A ; ... AT INT VECTOR ADDRESS
|
||||
LD HL,INT_TIMER ; ADDRESS OF TIMER INT HANDLER
|
||||
LD ($39),HL ; ... IS TARGET OF JP
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
#IF (INTTYPE == IT_Z180)
|
||||
;
|
||||
; SETUP Z180 IVT
|
||||
LD A,HBX_IVT >> 8 ; SETUP HI BYTE OF IVT ADDRESS
|
||||
LD I,A ; ... AND PLACE IT IN I REGISTER
|
||||
XOR A ; SETUP LO BYTE OF IVT ADDRESS
|
||||
OUT0 (Z180_IL),A ; ... AND PLACE IN Z180 IL REGISTER
|
||||
;
|
||||
IM 2 ; SWITCH TO INT MODE 2
|
||||
;
|
||||
; MASK ALL EXTERNAL INTERRUPTS FOR NOW
|
||||
XOR A ; INT0-2 DISABLED
|
||||
OUT0 (Z180_ITC),A ; WRITE TO INT/TRAP CONTROL REGISTER
|
||||
;
|
||||
; SETUP Z180 TIMER0 INTERRUPT VECTOR IN IVT
|
||||
LD HL,INT_TIMER
|
||||
LD (HBX_IVT + Z180_IVTIM0),HL
|
||||
|
||||
; SETUP PERIODIC TIMER INTERRUPT ON TIMER 0
|
||||
LD HL,(CB_CPUKHZ) ; 50HZ = 18432000 / 20 / 50 / X, SO X = CPU KHZ
|
||||
LD B,0
|
||||
LD C,Z180_RLDR0L ; INITIALIZE TIMER 0 RELOAD REGISTER
|
||||
OUT (C),L
|
||||
INC C
|
||||
OUT (C),H
|
||||
LD C,Z180_TMDR0L ; INITIALIZE TIMER 0 DATA REGISTER
|
||||
OUT (C),L
|
||||
INC C
|
||||
OUT (C),H
|
||||
LD A,%00010001 ; ENABLE TIMER0 INT AND DOWN COUNTING
|
||||
OUT0 (Z180_TCR),A
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
#ENDIF
|
||||
|
||||
HB_EI ; END OF CRITICAL SECTION
|
||||
;
|
||||
; DISPLAY PLATFORM INFORMATION
|
||||
;
|
||||
CALL NEWLINE2
|
||||
PRTX(STR_PLATFORM)
|
||||
PRTS(" @ $")
|
||||
@@ -788,13 +837,20 @@ INITSYS3:
|
||||
;
|
||||
CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE
|
||||
;
|
||||
;
|
||||
;
|
||||
; CALL TSTPT
|
||||
; LD HL,($FF00 + 2)
|
||||
; CALL JPHL
|
||||
; CALL TSTPT
|
||||
;
|
||||
; CHAIN TO OS LOADER
|
||||
;
|
||||
#IFDEF ROMBOOT
|
||||
; PERFORM BANK CALL TO OS IMAGES BANK
|
||||
LD A,BID_OSIMG ; CHAIN TO OS IMAGES BANK
|
||||
LD HL,0 ; ENTER AT ADDRESS 0
|
||||
CALL HB_BNKCALL ; GO THERE
|
||||
CALL HBX_BNKCALL ; GO THERE
|
||||
HALT ; WE SHOULD NEVER COME BACK!
|
||||
#ELSE
|
||||
; COPY OS IMAGE: BID_USR:<IMG START> --> BID_USR:0
|
||||
@@ -804,12 +860,12 @@ INITSYS3:
|
||||
LD HL,HB_END
|
||||
LD DE,0
|
||||
LD BC,$8000
|
||||
CALL HB_BNKCPY
|
||||
CALL HBX_BNKCPY
|
||||
;
|
||||
; PERFORM BANK CALL TO OS IMAGES BANK
|
||||
LD A,BID_USR ; CHAIN TO OS IMAGES BANK
|
||||
LD HL,0 ; ENTER AT ADDRESS 0
|
||||
CALL HB_BNKCALL ; GO THERE
|
||||
CALL HBX_BNKCALL ; GO THERE
|
||||
HALT ; WE SHOULD NEVER COME BACK!
|
||||
|
||||
|
||||
@@ -924,11 +980,11 @@ HB_DISPATCH:
|
||||
;
|
||||
; CHECK STACK INTEGRITY
|
||||
PUSH AF
|
||||
LD A,(HBX_STACK - HBX_STKSIZ + $08)
|
||||
LD A,(HB_STACK - HB_STKSIZ + $08)
|
||||
CP $FF
|
||||
CALL NZ,PANIC
|
||||
LD A,$FF
|
||||
LD (HBX_STACK - HBX_STKSIZ + $08),A
|
||||
LD (HB_STACK - HB_STKSIZ + $08),A
|
||||
POP AF
|
||||
RET
|
||||
HB_DISPCALL:
|
||||
@@ -1473,7 +1529,7 @@ SYS_BNKCPY:
|
||||
;POP AF
|
||||
; *DEBUG* END
|
||||
|
||||
CALL BNKCPY
|
||||
CALL HBX_BNKCPY
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
@@ -1719,17 +1775,55 @@ CIO_IDLE:
|
||||
; TIMER INTERRUPT
|
||||
;
|
||||
HB_TIMINT:
|
||||
; INCREMENT TICK COUNTER (32 BIT)
|
||||
LD HL,HB_TICKS ; POINT TO TICK COUNTER
|
||||
INC (HL)
|
||||
JR NZ,HB_TIMINT1
|
||||
INC HL
|
||||
INC (HL)
|
||||
JR NZ,HB_TIMINT1
|
||||
INC HL
|
||||
INC (HL)
|
||||
JR NZ,HB_TIMINT1
|
||||
INC HL
|
||||
INC (HL)
|
||||
;
|
||||
HB_TIMINT1:
|
||||
;
|
||||
#IF 0
|
||||
;
|
||||
LD HL,TEMPCNT
|
||||
DEC (HL)
|
||||
JR NZ,HB_TIMINT2
|
||||
LD (HL),250
|
||||
;
|
||||
LD A,'*'
|
||||
CALL COUT
|
||||
JR HB_TIMINT2
|
||||
;
|
||||
TEMPCNT .DB 250
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
HB_TIMINT2:
|
||||
;
|
||||
#IF (INTTYPE == IT_Z180)
|
||||
; ACK/RESET INTERRUPT
|
||||
IN0 A,(Z180_TCR)
|
||||
IN0 A,(Z180_TMDR0L)
|
||||
#ENDIF
|
||||
;
|
||||
RET
|
||||
;
|
||||
; BAD INTERRUPT HANDLER
|
||||
;
|
||||
HB_BADINT:
|
||||
CALL NEWLINE2
|
||||
PRTS("+++ BAD INT: $")
|
||||
CALL _REGDMP
|
||||
CALL CONTINUE
|
||||
RET
|
||||
;
|
||||
; WRAPPER FOR CALL TO HB_BNKCPY FOR USE BY INTERNAL HBIOS FUNCTIONS
|
||||
;
|
||||
BNKCPY .EQU HB_BNKCPY
|
||||
;
|
||||
; ADD AN ENTRY TO THE UNIT TABLE AT ADDRESS IN HL
|
||||
; C: DEVICE TYPE ID
|
||||
; B: UNIT INDEX
|
||||
@@ -2838,9 +2932,13 @@ HSTHEAD .DB 0 ; HEAD (0-255)
|
||||
;
|
||||
HEAPCURB .DW 0 ; MARK HEAP ADDRESS AFTER INITIALIZATION
|
||||
;
|
||||
HB_INTSTKSAV .DW 0 ; SAVED STACK POINTER DURING INT PROCESSING
|
||||
.FILL $40,$FF ; 32 ENTRY STACK FOR INTERRUPT PROCESSING
|
||||
HB_INTSTK .EQU $ ; TOP OF INTERRUPT PROCESSING STACK
|
||||
HB_TICKS .FILL 4,0 ; 32 BIT TICK COUNTER
|
||||
;
|
||||
.FILL HB_STKSIZ,$FF ; 48 ENTRY STACK FOR HBIOS FUNCTION PROCESSING
|
||||
HB_STACK .EQU $ ; TOP OF HBIOS STACK
|
||||
;
|
||||
.FILL HB_ISTKSIZ,$FF ; 32 ENTRY STACK FOR INTERRUPT PROCESSING
|
||||
HB_ISTACK .EQU $ ; TOP OF INTERRUPT PROCESSING STACK
|
||||
;
|
||||
STR_BANNER .DB "RetroBrew HBIOS v", BIOSVER, ", ", TIMESTAMP, "$"
|
||||
STR_PLATFORM .DB PLATFORM_NAME, "$"
|
||||
|
||||
@@ -190,7 +190,7 @@ MD_READ:
|
||||
LD A,B ; GET DESTINATION BANK
|
||||
LD (HB_DSTBNK),A ; SET IT
|
||||
POP BC
|
||||
CALL BNKCPY ; DO THE INTERBANK COPY
|
||||
CALL HBX_BNKCPY ; DO THE INTERBANK COPY
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
@@ -222,7 +222,7 @@ MD_WRITE:
|
||||
LD A,B ; GET DESTINATION BANK
|
||||
LD (HB_DSTBNK),A ; SET IT
|
||||
POP BC
|
||||
CALL BNKCPY ; DO THE INTERBANK COPY
|
||||
CALL HBX_BNKCPY ; DO THE INTERBANK COPY
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
|
||||
@@ -76,7 +76,7 @@ PPK_INIT:
|
||||
CALL PRTHEXBYTE
|
||||
;
|
||||
; PRECOMPUTE TIMEOUT LOOP COUNT (CPU KHZ / 16)
|
||||
LD HL,(CPUKHZ) ; GET CPU SPEED IN KHZ
|
||||
LD HL,(CB_CPUKHZ) ; GET CPU SPEED IN KHZ
|
||||
LD B,4 ; SHIFT 4 TIMES TO DIVIDE BY 16
|
||||
PPK_INIT1:
|
||||
SRL H ; RIGHT SHIFT
|
||||
|
||||
@@ -23,7 +23,7 @@ ZSYSIMG .EQU $5000
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
JP $FFFD ; INVOKE UBIOS FUNCTION
|
||||
#ELSE
|
||||
JP $FFF0 ; INVOKE HBIOS FUNCTION
|
||||
JP HB_INVOKE ; INVOKE HBIOS FUNCTION
|
||||
#ENDIF
|
||||
.FILL (010H - $),0FFH ; RST 10
|
||||
RET
|
||||
@@ -47,8 +47,9 @@ ZSYSIMG .EQU $5000
|
||||
; LOADER
|
||||
;==================================================================================================
|
||||
;
|
||||
DI ; NO INTERRUPTS
|
||||
IM 1 ; INTERRUPT MODE 1
|
||||
;DI ; NO INTERRUPTS
|
||||
;IM 1 ; INTERRUPT MODE 1
|
||||
;
|
||||
LD SP,BL_STACK ; SETUP STACK
|
||||
;
|
||||
; COPY OURSELVES TO HI RAM FOR PHASE 2
|
||||
@@ -74,6 +75,19 @@ PHASE2:
|
||||
CALL DELAY_INIT
|
||||
#ENDIF
|
||||
|
||||
#IF (PLATFORM != PLT_UNA)
|
||||
; PREP THE USER BANK (SETUP DEFAULT PAGE ZERO)
|
||||
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
|
||||
LD D,BID_USR ; D = DEST BANK = USER BANK
|
||||
LD E,BID_BIOS ; E = SRC BANK = BIOS BANK
|
||||
LD HL,256 ; HL = COPY LEN = 1 PAGE = 256 BYTES
|
||||
RST 08 ; DO IT
|
||||
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
|
||||
LD HL,0 ; COPY FROM BIOS ADDRESS 0
|
||||
LD DE,0 ; TO USER ADDRESS 0
|
||||
RST 08 ; DO IT
|
||||
#ENDIF
|
||||
|
||||
; RUN THE BOOT LOADER MENU
|
||||
JP DOBOOTMENU
|
||||
;
|
||||
@@ -190,11 +204,13 @@ DB_INVALID:
|
||||
;
|
||||
GOMON:
|
||||
CALL LDMON
|
||||
JP MON_SERIAL
|
||||
LD HL,MON_SERIAL ; JUMP TO MONITOR, SERIAL ENTRY
|
||||
JR EXECUSR
|
||||
;
|
||||
GOMONDSKY:
|
||||
CALL LDMON
|
||||
JP MON_DSKY
|
||||
LD HL,MON_DSKY
|
||||
JR EXECUSR
|
||||
;
|
||||
LDMON:
|
||||
LD DE,STR_BOOTMON
|
||||
@@ -219,9 +235,6 @@ GOCPM2:
|
||||
LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY
|
||||
RST 08 ; CALL UNA
|
||||
#ELSE
|
||||
;LD B,BF_SYSHCBPUTW ; HB FUNC: PUT HCB WORD
|
||||
;LD C,HCB_BOOTVOL ; BOOT VOLUME (UNIT, SLICE)
|
||||
;LD DE,$0100
|
||||
LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER
|
||||
LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO
|
||||
LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA
|
||||
@@ -229,7 +242,8 @@ GOCPM2:
|
||||
LD DE,$0100 ; BOOT VOLUME (UNIT, SLICE)
|
||||
RST 08
|
||||
#ENDIF
|
||||
JP CPM_ENT
|
||||
LD HL,CPM_ENT ; CPM ENTRY VECTOR
|
||||
JR EXECUSR
|
||||
;
|
||||
GOZSYS:
|
||||
LD DE,STR_BOOTZSYS
|
||||
@@ -237,6 +251,15 @@ GOZSYS:
|
||||
LD HL,ZSYSIMG
|
||||
JR GOCPM2
|
||||
;
|
||||
EXECUSR:
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
JP (HL)
|
||||
#ELSE
|
||||
LD A,BID_USR ; WITH USER BANK ACTIVE
|
||||
CALL HB_BNKCALL ; GO THERE
|
||||
CALL PANIC ; WE ARE NOT SUPPOSED TO RETURN
|
||||
#ENDIF
|
||||
;
|
||||
GOLIST:
|
||||
LD DE,STR_LIST
|
||||
CALL WRITESTR
|
||||
@@ -352,7 +375,8 @@ BOOTDISK:
|
||||
; JUMP TO COLD BOOT ENTRY
|
||||
CALL NEWLINE ; FORMATTING
|
||||
LD HL,(BB_CPMENT) ; GET THE ENTRY POINT
|
||||
JP (HL) ; ... AND GO
|
||||
;JP (HL) ; ... AND GO
|
||||
JP EXECUSR ; ... AND GO
|
||||
;
|
||||
; PRINT LIST OF ALL DRIVES UNDER UNA
|
||||
;
|
||||
@@ -882,6 +906,11 @@ CIN:
|
||||
;
|
||||
CST:
|
||||
; SAVE INCOMING REGISTERS (AF IS OUTPUT)
|
||||
CALL DLY64
|
||||
CALL DLY64
|
||||
CALL DLY64
|
||||
CALL DLY64
|
||||
CALL DLY64
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
@@ -889,6 +918,8 @@ CST:
|
||||
; GET CONSOLE INPUT STATUS VIA HBIOS
|
||||
LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C
|
||||
LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS
|
||||
;XOR A ; *DEBUG*
|
||||
;INC A ; *DEBUG*
|
||||
RST 08 ; HBIOS RETURNS STATUS IN A
|
||||
;
|
||||
; RESTORE REGISTERS (AF IS OUTPUT)
|
||||
|
||||
@@ -71,7 +71,7 @@ SIMRTC_GETTIM:
|
||||
LD HL,SIMRTC_BUF ; SOURCE ADR
|
||||
POP DE ; DEST ADR
|
||||
LD BC,SIMRTC_BUFSIZ ; LENGTH
|
||||
CALL BNKCPY ; COPY THE CLOCK DATA
|
||||
CALL HBX_BNKCPY ; COPY THE CLOCK DATA
|
||||
;
|
||||
LD DE,60 ; DELAY 60 * 16US = ~1MS
|
||||
CALL VDELAY ; SLOW DOWN SIMH FOR CLOCK TICKING TEST
|
||||
@@ -101,7 +101,7 @@ SIMRTC_SETTIM:
|
||||
LD (HB_DSTBNK),A ; SET IT
|
||||
LD DE,SIMRTC_BUF ; DEST ADR
|
||||
LD BC,SIMRTC_BUFSIZ ; LENGTH
|
||||
CALL BNKCPY ; COPY THE CLOCK DATA
|
||||
CALL HBX_BNKCPY ; COPY THE CLOCK DATA
|
||||
;
|
||||
LD HL,SIMRTC_BUF ; POINT TO TEMP BUF
|
||||
LD A,SIMRTC_CLKWRITE ; WRITE CLOCK COMMAND
|
||||
|
||||
@@ -121,7 +121,7 @@ SER_PARSPACE .EQU 7 << 3
|
||||
SER_STOP1 .EQU 0 << 2
|
||||
SER_STOP2 .EQU 1 << 2
|
||||
;
|
||||
; SEREIAL BAUD RATES ENCODED AS V = 75 * 2^X * 3^Y
|
||||
; SERIAL BAUD RATES ENCODED AS V = 75 * 2^X * 3^Y
|
||||
; AND STORED AS 5 BITS: YXXXX
|
||||
;
|
||||
SER_BAUD300 .EQU $02 << 8
|
||||
@@ -154,6 +154,13 @@ SER_115200_8N1 .EQU SER_BAUD115200 | SER_DATA8 | SER_PARNONE | SER_STOP1
|
||||
SER_230400_8N1 .EQU SER_BAUD230400 | SER_DATA8 | SER_PARNONE | SER_STOP1
|
||||
SER_460800_8N1 .EQU SER_BAUD460800 | SER_DATA8 | SER_PARNONE | SER_STOP1
|
||||
;
|
||||
; INTERRUPT TYPE OPTIONS
|
||||
;
|
||||
IT_NONE .EQU 0
|
||||
IT_SIMH .EQU 1
|
||||
IT_Z180 .EQU 2
|
||||
IT_CTC .EQU 3
|
||||
;
|
||||
#INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE
|
||||
;
|
||||
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
#DEFINE RMN 8
|
||||
#DEFINE RUP 0
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.8.0-pre.5"
|
||||
#DEFINE BIOSVER "2.8.0-pre.6"
|
||||
|
||||
@@ -65,3 +65,13 @@ Z180_CBAR .EQU Z180_BASE + $3A ; MMU COMMON/BANK AREA REGISTER
|
||||
;
|
||||
Z180_OMCR .EQU Z180_BASE + $3E ; OPERATION MODE CONTROL
|
||||
Z180_ICR .EQU $3F ; I/O CONTROL REGISTER (NOT RELOCATED!!!)
|
||||
;
|
||||
Z180_IVINT1 .EQU 0
|
||||
Z180_IVINT2 .EQU 2
|
||||
Z180_IVTIM0 .EQU 4
|
||||
Z180_IVTIM1 .EQU 6
|
||||
Z180_IVDMA0 .EQU 8
|
||||
Z180_IVDMA1 .EQU 10
|
||||
Z180_IVCSIO .EQU 12
|
||||
Z180_IVSER0 .EQU 14
|
||||
Z180_IVSER1 .EQU 16
|
||||
|
||||
Reference in New Issue
Block a user