@ -32,15 +32,17 @@
; HBIOS APPLICATION BINARY. THE APPENDED OS IMAGES ARE COPIED TO THE AUX RAM
; BANK AND LAUNCHED AFTER HBIOS HAS INSTALLED ITSELF.
;
;;;; - IMGBOOT: BOOT FROM AN IMAGE FILE THAT HAS BEEN PLACED IN THE USER BANK
;;;;
;;;; WHEN IMGBOOT IS DEFINED, THE FILE IS ASSEMBLED SUCH THAT IT CAN BE PRELOADED
;;;; INTO THE RAM USER BANK BY AN EXTERNAL PROCESS THAT SUBSEQUENTLY LAUNCHES
;;;; THE CODE AT ADDRESS 0. THE MOST COMMON EXAMPLE OF THIS IS THE UNA FSFAT
;;;; TOOL WHICH CAN LOAD AN IMAGE FROM A DOS FAT FILESYSTEM PROVIDING A SIMPLE
;;;; WAY TO LOAD A TEST COPY OF HBIOS. AS IS THE CASE WITH APPBOOT, IT IS ASSUMED
;;;; THAT AN OS IMAGES FILE IS APPENDED TO THE END OF THE IMAGE AND IS LAUNCHED
;;;; AFTER HBIOS IS INSTALLED.
; - IMGBOOT: BOOT FROM AN IMAGE FILE THAT HAS BEEN PLACED IN THE USER BANK
;
; NOTE: THIS BOOT MODE IS DEPRECATED.
;
; WHEN IMGBOOT IS DEFINED, THE FILE IS ASSEMBLED SUCH THAT IT CAN BE PRELOADED
; INTO THE RAM USER BANK BY AN EXTERNAL PROCESS THAT SUBSEQUENTLY LAUNCHES
; THE CODE AT ADDRESS 0. THE MOST COMMON EXAMPLE OF THIS IS THE UNA FSFAT
; TOOL WHICH CAN LOAD AN IMAGE FROM A DOS FAT FILESYSTEM PROVIDING A SIMPLE
; WAY TO LOAD A TEST COPY OF HBIOS. AS IS THE CASE WITH APPBOOT, IT IS ASSUMED
; THAT AN OS IMAGES FILE IS APPENDED TO THE END OF THE IMAGE AND IS LAUNCHED
; AFTER HBIOS IS INSTALLED.
;
; INCLUDE FILE NESTING:
;
@ -102,10 +104,17 @@
;
# DEFINE HBIOS
;
; INCLUDE GENERIC STUFF
;
# INCLUDE "std.asm"
;
; MAKE SURE EXACTLY ONE OF ROMBOOT, APPBOOT, IMGBOOT IS DEFINED.
;
MODCNT .EQU 0
BOOTMODE .EQU 0
;
# IFDEF ROMBOOT
BOOTMODE .SET BM_ROMBOOT
MODCNT .SET MODCNT + 1
;
# DEFINE BNKINFO
@ -114,12 +123,17 @@ MODCNT .SET MODCNT + 1
# DEFINE SYSINFO
;
# ENDIF
;
# IFDEF APPBOOT
BOOTMODE .SET BM_APPBOOT
MODCNT .SET MODCNT + 1
# ENDIF
# IFDEF IMGBOOT
;
# IFDEF IMGBOOT ; *** DEPRECATED ***
BOOTMODE .SET BM_IMGBOOT
MODCNT .SET MODCNT + 1
# ENDIF
;
# IF ( MODCNT ! = 1 )
.ECHO "*** ERROR: PLEASE DEFINE ONE AND ONLY ONE OF ROMBOOT, APPBOOT, IMGBOOT!!!\n"
! ! ! ; FORCE AN ASSEMBLY ERROR
@ -141,10 +155,6 @@ MODCNT .SET MODCNT + 1
# DEFINE MEMECHO \ ;
# ENDIF
;
; INCLUDE GENERIC STUFF
;
# INCLUDE "std.asm"
;
SUPCTS .EQU FALSE ; SUPPRESS CTS DURING HBIOS BOOT
;
; HELPER MACROS
@ -195,7 +205,8 @@ SUPCTS .EQU FALSE ; SUPPRESS CTS DURING HBIOS BOOT
# ENDIF
# IF ( LEDMODE = = LEDMODE_NABU )
# DEFINE DI AG ( N ) PUSH AF
# DEFCONT \ LD A , + (( N << 3 ) & % 00011000 )
;#DEFCONT \ LD A,+((N << 3) & %00011000)
# DEFCONT \ LD A , + (( N << 3 ) & % 00111000 )
# DEFCONT \ OUT ( LEDPORT ), A
# DEFCONT \ POP AF
# ENDIF
@ -427,6 +438,7 @@ CB_CRTDEV .DB $FF ; PRIMARY CRT UNIT, $FF UNTIL AFTER HBIOS INIT
CB_CONDEV .DB $ FF ; CONSOLE UNIT, $FF UNTIL AFTER HBIOS INIT
;
CB_DIAGLVL .DB DI AGLVL ; ROMWBW HBIOS DIAGNOSTIC LEVEL
CB_BOOTMODE .DB BOOTMODE ; HBIOS BOOTMODE
;
; MEMORY MANAGEMENT VARIABLES START AT $20
;
@ -1037,26 +1049,26 @@ HBX_INTSTK .EQU $
;
# ENDIF
;
; HBIOS INTERRUPT SLOT ASSIGNMENTS
; HBIOS INTERRUPT MODE 2 SLOT ASSIGNMENTS (SEE STD.ASM)
;
; # Z80 Z180
; --- -------------- --------------
; 0 CTC0A INT1 -+
; 1 CTC0B INT2 |
; 2 CTC0C TIM0 |
; 3 CTC0D TIM1 |
; 4 UART0 DMA0 +- Z180 INTERNAL
; 5 UART1 DMA1 |
; 6 CSIO |
; 7 SIO0 SER0 |
; 8 SIO1 SER1 -+
; 9 PIO0A PIO0A
; 10 PIO0B PIO0B
; 11 PIO1A PIO1A
; 12 PIO1B PIO1B
; 13 SIO0
; 14 SIO1
; 15
; # Z80/Z280 Z180 MBC DUO NABU
; --- -------------- -------------- -------------- -------------- --------------
; 0 CTC0A INT1 -+ -+ -+ HCCARCV -+
; 1 CTC0B INT2 | | | HCCASND |
; 2 CTC0C TIM0 | | IM2 | IM2 NABUKB | IM2
; 3 CTC0D TIM1 | | INT | INT VDP | INT
; 4 UART0 DMA0 | Z180 UART0 | VEC UART0 | VEC OPTCRD0 | VEC
; 5 UART1 DMA1 | CPU UART1 | GEN UART1 | GEN OPTCRD1 | GEN
; 6 CSIO | | | OPTCRD2 |
; 7 SIO0 SER0 | -+ -+ OPTCRD3 -+
; 8 SIO1 SER1 -+ SIO0 SIO0
; 9 PIO0A PIO0A SIO1 SIO1
; 10 PIO0B PIO0B PIO0A PIO0A
; 11 PIO1A PIO1A PIO0B PIO0B
; 12 PIO1B PIO1B CTC0A CTC0A
; 13 SIO0 CTC0B CTC0B
; 14 SIO1 CTC0C CTC0C
; 15 CTC0D CTC0D
;
; IVT MUST START AT PAGE BOUNDARY
ALIGN ( $ 100 )
@ -1341,13 +1353,26 @@ HB_START:
CALL HB_APPBOOT ; PREPARE APP BOOT
RET NZ ; RETURN ON ERROR
;
HB_APPBOOT_Z:
;
# ENDIF
;
HB_RESTART:
;
DI ; NO INTERRUPTS
IM 1 ; INTERRUPT MODE 1
;
# IFDEF APPBOOT
;
; IF THIS IS AN APPLICATION BOOT, WE CAPTURE THE CURRENT BANK ID
; AND UPDATE THE PROXY IMAGE. LATER, WHEN THE PROXY IMAGE IS COPIED
; TO IT'S RUNNING LOCATION AT TOP OF RAM, THE CORRECT HB_CURBNK
; VALUE WILL BE INSTALLED. NOTE: THE ADDRESSES IN THE PROXY
; IMAGE ARE FOR IT'S RUNNING LOCATION, SO WE NEED TO USE *MATH*
; TO DERIVE THE LOCATION OF HB_CURBNK IN THE IMAGE.
LD A ,( HB_CURBNK )
LD ( HB_CURBNK - HBX_LOC + HBX_IMG ), A
;
# ENDIF
;
# IF (( PLATFORM = = PLT_DUO ) & TRUE )
; THIS ARBITRARY DELAY SEEMS TO HELP DUODYNE CPU V1.0 SYSTEMS
; STARTUP CLEANLY. DOUDYNE CPU V1.1 INTRODUCES A RESET
@ -2012,6 +2037,41 @@ CB_IDS: LD (HL),A ; POPULATE CB_BIDCOM
LD ( RTC_DISPACT ), A ; RTC DEVICE
LD ( DS KY_DISPACT ), A ; DSKY DEVICE
;
; CLEAR INTERRUPT VECTOR TABLES
;
; THIS IS REALLY ONLY REQUIRED ON A RESTART, BUT IT DOESN'T HURT TO
; DO IT ALL THE TIME.
;
LD HL , HB_IVT + 1 ; FIRST VECTOR (IM2)
LD B , 16 ; CLEAR 16 VECTORS
CALL HB_CLRIVT ; DO IT
LD HL , HB_IM1INT + 1 ; FIRST VECTOR (IM1)
LD B , 8 ; CLEAR 8 VECTORS
CALL HB_CLRIVT ; DO IT
XOR A ; ZERO ACCUM
LD ( HB_IM1CNT ), A ; ... TO CLEAR IM1 VECTOR CNT
LD HL , HB_IM1INT ; POINTER TO START OF IM1 IVT
LD ( HB_IM1PTR ), HL ; ... TO CLEAR IM1 PTR
LD HL , HB_TICK
LD ( VEC_TICK + 1 ), HL
LD HL , HB_SECOND
LD ( VEC_SECOND + 1 ), HL
JR HB_CLRIVT_Z ; DONE, JUMP OVER SUBROUTINE
;
HB_CLRIVT:
LD ( HL ), HB_BADINT & $ FF
INC HL
LD ( HL ), HB_BADINT >> 8
INC HL
INC HL
INC HL
DJNZ HB_CLRIVT
RET
;
HB_CLRIVT_Z:
;
; INITIALIZE HEAP STORAGE
;
; INITIALIZE POINTERS
@ -2707,34 +2767,6 @@ NXTMIO: LD A,(HL)
NOT_REC_M2:
;
FPLEDS ( DI AG_08 )
# IF ( PLATFORM = = PLT_NABU ) & TRUE
;
; GET CURRENT VALUE OF PSG ENABLE REGISTER
LD A , 7
OUT ( NABU_RSEL ), A
NOP
IN A ,( NABU_RDAT )
LD B , A
;
; GET CURRENT VALUE OF PSG ENABLE REGISTER
LD A , 7
OUT ( NABU_RSEL ), A
NOP
IN A ,( NABU_RDAT )
LD C , A
;
; DUMP IT
CALL PC_ASTERISK
LD A , B
CALL PRTHEXBYTE
LD A , C
CALL PRTHEXBYTE
CALL PC_ASTERISK
;
# ENDIF
;
;--------------------------------------------------------------------------------------------------
; IO PORT SCAN
@ -4537,32 +4569,39 @@ SYS_RESWARM:
; RESTART SYSTEM AS THOUGH POWER HAD JUST BEEN TURNED ON
;
SYS_RESCOLD:
;
# IFDEF APPBOOT
JP HB_RESTART
# ELSE
;
; MAKE ROM BOOT BANK ACTIVE IN LOW SYS MEM
;
# IF ( MEMMGR = = MM_Z280 )
; FOR Z280, NEED TO REMAP THE LOW 32K IN SYSTEM MODE AND
; CONTINUE AT ADDRESS ZERO. WE CANNOT RETURN HERE AFTER THE
; BNKSEL IS DONE BECAUSE THE SYSTEM BANK HAS BEEN CHANGED!
; SO, WE PRESET THE STACK TO CAUSE A JUMP TO ADDRESS ZERO
; ON RETURN FROM THE BNKSEL. SLICK, RIGHT?
; SO, WE PRESET THE STACK TO CAUSE A JUMP TO THE RESTART
; ADDRESS ON RETURN FROM THE BNKSEL. SLICK, RIGHT?
DI ; KILL INTERRUPTS
LD SP , HBX_LOC ; STACK IN HIGH MEMORY
LD HL , 0 ; VALUE TO RESUME
LD HL , HB_RESTART ; RESUME AT RESTART ADDRESS
PUSH HL ; ... IS PRESET ON STACK
;
; MAKE ROM BOOT BANK ACTIVE IN LOW SYS MEM
LD A , BID_BOOT ; BOOT BANK
LD A , BID_BOOT ; BANK TO LAUNCH RESTART
LD B , $ 10 ; FIRST SYS PDR
JP Z280_BNKSEL ; DO IT AND RESUME FROM STACK
# ELSE
; FOR OTHER THAN Z280, JUST DO AN INTERBANK CALL TO THE
; RESTART ADDRESS.
DI
LD SP , HBX_LOC ; STACK JUST BELOW HBIOS PROXY
LD A , BID_BOOT ; BOOT BANK
LD IX , 0 ; ADDRESS ZERO
LD A , BID_BOOT ; BANK TO LAUNCH RESTART
LD IX , HB_RESTART ; RESUME AT RESTART ADDRESS
CALL HB_BNKCALL ; DOES NOT RETURN
# ENDIF
# ENDIF
;
; HOOK CALLED WHEN A USERLAND RESET IS INVOKED, TYPICALLY VIA A JUMP
; TO LOGICAL CPU ADDRESS $0000
; TO CPU ADDRESS $0000
;
; CREDIT TO PHILLIP STEVENS FOR SUGGESTING AND SIGNIFICANT CONTRIBUTIONS
; TO THE Z180 INVALID OPCODE TRAP ENHANCEMENT.
@ -5541,7 +5580,7 @@ SYS_INTINFO:
LD A ,( HB_IM1CNT ) ; RETURN IM1 CALL LIST SIZE
LD E , A
# ENDIF
# IF ( INTMODE = = 2 )
# IF (( INTMODE = = 2 ) | ( INTMODE = = 3 ))
LD E , HBX_IVTCNT ; RETURN INT VEC TABLE SIZE
# ENDIF
XOR A ; INDICATE SUCCESS
@ -5560,7 +5599,7 @@ SYS_INTVECADR:
INC A ; ALLOW FOR EXTRA ENTRY TO APPEND AT END
LD C , A ; SAVE IN C FOR COMPARE
# ENDIF
# IF ( INTMODE = = 2 )
# IF (( INTMODE = = 2 ) | ( INTMODE = = 3 ))
LD C , HBX_IVTCNT ; GET CURRENT ENTRY COUNT
# ENDIF
LD A , E ; INCOMING INDEX POSITION TO A
@ -5578,7 +5617,7 @@ SYS_INTGET1:
# IF ( INTMODE = = 1 )
LD DE , HB_IM1INT ; DE := START OF VECTOR TABLE
# ENDIF
# IF ( INTMODE = = 2 )
# IF (( INTMODE = = 2 ) | ( INTMODE = = 3 ))
LD DE , HB_IVT ; DE := START OF VECTOR TABLE
# ENDIF
ADD HL , DE ; HL := ADR OF VECTOR
@ -6026,9 +6065,9 @@ HB_TIMDBG1:
; THESE CAN BE HOOKED AS DESIRED BY DRIVERS
;
VEC_TICK:
JP HB_TICK ; TICK PROCESSING VECTOR
JP HB_TICK ; TICKS PROCESSING VECTOR
VEC_SECOND:
JP HB_SECOND ; SECOND PROCESSING VECTOR
JP HB_SECOND ; SECONDS PROCESSING VECTOR
;
; TIMER HANDLERS
;
@ -8484,15 +8523,6 @@ STR_APPBOOT .DB "\r\n\r\n*** Launching RomWBW HBIOS v", BIOSVER, ", ", TIMESTAMP
.DB "\r\n\r\n " , PLATFORM_NAME , "$"
;
HB_APPBOOT2:
; IF THIS IS AN APPLICATION BOOT, WE CAPTURE THE CURRENT BANK ID
; AND UPDATE THE PROXY IMAGE. LATER, WHEN THE PROXY IMAGE IS COPIED
; TO IT'S RUNNING LOCATION AT TOP OF RAM, THE CORRECT HB_CURBNK
; VALUE WILL BE INSTALLED. NOTE: THE ADDRESSES IN THE PROXY
; IMAGE ARE FOR IT'S RUNNING LOCATION. WE NEED TO USE *MATH*
; TO DERIVE THE LOCATION OF HB_CURBNK IN THE IMAGE.
LD A ,( HB_CURBNK )
LD ( HB_CURBNK - HBX_LOC + HBX_IMG ), A
;
; FOR AN APPLICATION BOOT, WE ALSO COPY THE CONCATENATED OS
; IMAGES TO THE AUX BANK WHERE WE WILL JUMP TO ROMLDR LATER.
; THE AUX BANK WILL BE DESTROYED IF CP/M 3 IS LOADED. WE DON'T
@ -8512,12 +8542,15 @@ HB_APPBOOT2:
; WE NEED TO SWITCH FROM USER MODE TO SYSTEM MODE, BUT CONTINUE
; RUNNING IN THE CURRENT BANK. THIS IS A LITTLE MESSY.
;
; FIRST, OVERLAY PROXY CODE WITH NEW CODE SO WE CAN USE THE
; FIRST, OVERLAY PROXY CODE WITH FRESH CODE SO WE CAN USE THE
; PROXY ROUTINES SAFELY.
LD A ,( HB_CURBNK ) ; GET CURBNK
LD DE , HBX_LOC ; RUNNING LOCATION
LD HL , HBX_IMG ; LOCATION IN IMAGE
LD BC , HBX_SIZ ; SIZE
LDIR ; INSTALL IT
LD ( HB_CURBNK ), A ; RESTORE CURBNK
;
; NEXT, COPY A BIT OF CODE TO DO THE SYSTEM TRANSITION TO
; UPPER MEM. WE CAN BORROW THE PROXY BOUNCE BUFFER FOR THIS.
@ -8541,7 +8574,7 @@ Z280_GOSYS:
LD A ,( HB_CURBNK ) ; CURRENT BANK
LD B , $ 10 ; FIRST SYSTEM PDR
CALL Z280_BNKSEL ; DO THE SWITCH
JP HB_APPBOOT_Z ; AND RESUME BOOT
JP HB_RESTART ; AND RESUME BOOT
;
Z280_GOSYS_LEN .EQU $ - Z280_GOSYS
;