@ -105,10 +105,11 @@ MODCNT .SET MODCNT + 1
;
;
;
;
;
;
# IF ( DI AG ENABLE)
# IF ( FPLED_ ENABLE)
# DEFINE DI AG ( N ) PUSH AF
# DEFINE DI AG ( N ) PUSH AF
# DEFCONT \ LD A , N
# DEFCONT \ LD A , N
# DEFCONT \ OUT ( DI AGPORT ), A
; #DEFCONT \ OUT (DIAGPORT),A
# DEFCONT \ CALL FP_SETLEDS
# DEFCONT \ POP AF
# DEFCONT \ POP AF
# ELSE
# ELSE
# DEFINE DI AG ( N ) \ ;
# DEFINE DI AG ( N ) \ ;
@ -1109,16 +1110,9 @@ HB_START:
;
;
# IFDEF APPBOOT
# IFDEF APPBOOT
# IF ( MEMMGR = = MM_Z280 )
# IF ( MEMMGR = = MM_Z280 )
LD A , DI AG_01
OUT ( DI AGPORT ), A
LD DE , Z280_BOOTERR
LD C , 9
LD A , DI AG_02
OUT ( DI AGPORT ), A
CALL $ 0005
LD A , DI AG_04
OUT ( DI AGPORT ), A
RET
LD DE , Z280_BOOTERR ; POINT TO ERROR MESSAGE
LD C , 9 ; BDOS FUNC 9: WRITE STR
JP $ 0005 ; DO IT AND RETURN TO OS
;
;
Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 native memory management!!!\r\n\r\n$"
Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 native memory management!!!\r\n\r\n$"
# ENDIF
# ENDIF
@ -1144,9 +1138,10 @@ Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 n
OUT0 ( RPH_ACR ), A ; ... REGISTER IS INITIALIZED
OUT0 ( RPH_ACR ), A ; ... REGISTER IS INITIALIZED
# ENDIF
# ENDIF
;
;
# IF ( DI AGENABLE )
# IF ( FPLED_ENABLE )
; NO STACK YET, SO CAN'T USE DIAG() MACRO
LD A , DI AG_01
LD A , DI AG_01
OUT ( DI AGPORT ), A
OUT ( FPLED_IO ), A
# ENDIF
# ENDIF
# IF ( LEDENABLE )
# IF ( LEDENABLE )
# IF ( LEDMODE = = LEDMODE_STD )
# IF ( LEDMODE = = LEDMODE_STD )
@ -1255,8 +1250,6 @@ Z280_INITZ:
LD A , Z180_BASE
LD A , Z180_BASE
OUT0 ( $ 3 F ), A ; AT RESET, ICR IS AT $3F
OUT0 ( $ 3 F ), A ; AT RESET, ICR IS AT $3F
DIAG ( DI AG_02 )
; DISABLE REFRESH
; DISABLE REFRESH
XOR A
XOR A
OUT0 ( Z180_RCR ), A
OUT0 ( Z180_RCR ), A
@ -1349,10 +1342,12 @@ Z280_INITZ:
; NOT WANT TO EFFECT RAM UNTIL AFTER THE BACKUP BATTERY STATUS CHECK
; NOT WANT TO EFFECT RAM UNTIL AFTER THE BACKUP BATTERY STATUS CHECK
; IS PERFORMED NEXT.
; IS PERFORMED NEXT.
;
;
# IF ( DI AGENABLE )
# IF ( FPLED_ENABLE )
; NO STACK YET, SO CAN'T USE DIAG() MACRO
LD A , DI AG_02
LD A , DI AG_02
OUT ( DI AGPORT ), A
OUT ( FPLED_IO ), A
# ENDIF
# ENDIF
;
;
; WE USE THE TWO BYTES IMMEDIATELY BELOW THE PROXY TO STORE A COUPLE
; WE USE THE TWO BYTES IMMEDIATELY BELOW THE PROXY TO STORE A COUPLE
; VALUES TEMPORARILY BECAUSE WE MAY BE OPERATING IN ROM AT THIS POINT.
; VALUES TEMPORARILY BECAUSE WE MAY BE OPERATING IN ROM AT THIS POINT.
@ -2232,29 +2227,6 @@ NOT_REC_M0:
CALL DS KY_SHOW
CALL DS KY_SHOW
# ENDIF
# ENDIF
;
;
# IF FPENABLE
;
; IF FRONT PANEL IS ENABLED IN CONFIG, WE NEED TO CHECK TO SEE IF THE
; HARDWARE REALLY EXISTS. THE ONLY WAY TO DO THAT IS TO SEE IF THE
; FRONT PANEL PORT SEEMS TO BE VALID (NOT FLOATING). HERE WE JUST
; DO THE CHECKING AND RECORD WHETHER THE FP SWITCHES ARE USEABLE.
;
; THE SWITCH HARDWARE MAY OR MAY NOT BE INSTALLED. SO, HERE WE
; ATTEMPT TO CONFIRM WE HAVE A VALID PORT. CREDIT TO STEPHEN
; COUSINS FOR THIS APPROACH.
LD C , FPBASE ; ADR OF SWITCH PORT
IN C ,( C ) ; READ IT USING IN (C)
IN A ,( FPBASE ) ; READ IT USING IN (PORT)
CP C ; PORT FLOATING ON MISMATCH
JR NZ , HB_SWZ ; ABORT IF FLOATING
CP $ FF ; $FF ALSO MEANS PORT INACTIVE
JR Z , HB_SWZ ; ABORT IF SO
OR $ FF ; SIGNAL FP EXISTS
LD ( HB_HASFP ), A ; AND SAVE IT
HB_SWZ:
;
# ENDIF
;
# IF FALSE
# IF FALSE
;
;
; TEST DEBUG ***************************************************************************************
; TEST DEBUG ***************************************************************************************
@ -2792,7 +2764,12 @@ HB_WDZ:
;
;
# ENDIF
# ENDIF
;
;
# IF FPENABLE
; THIS IS A GOOD PLACE TO DETERMINE IF FRONT PANEL HARDWARE REALLY
; EXISTS.
;
CALL FP_DETECT
;
# IF ( FPSW_ENABLE )
;
;
; IF WE HAVE FRONT PANEL SWITCHES, THIS IS THE RIGHT PLACE TO HANDLE
; IF WE HAVE FRONT PANEL SWITCHES, THIS IS THE RIGHT PLACE TO HANDLE
; ANY CONSOLE CHANGE REQUESTS. THE FRONT PANEL HAS TWO SWITCHES
; ANY CONSOLE CHANGE REQUESTS. THE FRONT PANEL HAS TWO SWITCHES
@ -2802,12 +2779,12 @@ HB_WDZ:
; DEVICE.
; DEVICE.
;
;
PRTS ( "\r\nFP: IO=0x$" )
PRTS ( "\r\nFP: IO=0x$" )
LD A , FPBASE
LD A , FPSW_IO
CALL PRTHEXBYTE
CALL PRTHEXBYTE
;
;
; THE EXISTENCE OF THE FP WAS TESTED EARLIER. IF IT DOESN'T
; THE EXISTENCE OF THE FP WAS TESTED EARLIER. IF IT DOESN'T
; EXIST, BAIL OUT.
; EXIST, BAIL OUT.
LD A ,( HB_HASFP ) ; GET FP EXISTENCE FLAG
LD A ,( FPSW_ACTIVE ) ; GET FP EXISTENCE FLAG
OR A ; SET FLAGS
OR A ; SET FLAGS
JR NZ , HB_FP1 ; IF WE HAVE ONE, CONTINUE
JR NZ , HB_FP1 ; IF WE HAVE ONE, CONTINUE
;
;
@ -2823,7 +2800,7 @@ HB_FP1:
; OF A CRT DEVICE -- IT WILL JUST FAILBACK TO FIRST SERIAL
; OF A CRT DEVICE -- IT WILL JUST FAILBACK TO FIRST SERIAL
; PORT.
; PORT.
PRTS ( " SWITCHES=0x$" ) ; TAG
PRTS ( " SWITCHES=0x$" ) ; TAG
IN A ,( FPBASE ) ; GET SWITCH SETTINGS
CALL FP_GETSWITCHES ; GET SWITCH SETTINGS
CALL PRTHEXBYTE ; DISPLAY VALUE
CALL PRTHEXBYTE ; DISPLAY VALUE
LD B , A ; SAVE IN REG B
LD B , A ; SAVE IN REG B
AND SW_CRT ; TEST CRT BIT
AND SW_CRT ; TEST CRT BIT
@ -3491,7 +3468,7 @@ HB_DSKREAD:
;
;
LD ( HB_DSKCMD ), BC ; SAVE HBIOS FUNC & UNIT
LD ( HB_DSKCMD ), BC ; SAVE HBIOS FUNC & UNIT
;
;
# IF ( DI AGENABLE )
# IF ( FPLED_ENABLE & FPLED_DSKACT )
; SAVE DISK UNIT NUMBER BIT MASK
; SAVE DISK UNIT NUMBER BIT MASK
LD A , C ; GET DISK UNIT NUMBER
LD A , C ; GET DISK UNIT NUMBER
LD B , A ; PUT IN B FOR LOOP COUNTER
LD B , A ; PUT IN B FOR LOOP COUNTER
@ -3581,7 +3558,7 @@ HB_DSKWRITE:
;
;
LD ( HB_DSKCMD ), BC ; SAVE HBIOS FUNC & UNIT
LD ( HB_DSKCMD ), BC ; SAVE HBIOS FUNC & UNIT
;
;
# IF ( DI AGENABLE )
# IF ( FPLED_ENABLE & FPLED_DSKACT )
; SAVE DISK UNIT NUMBER BIT MASK
; SAVE DISK UNIT NUMBER BIT MASK
LD A , C ; GET DISK UNIT NUMBER
LD A , C ; GET DISK UNIT NUMBER
LD B , A ; PUT IN B FOR LOOP COUNTER
LD B , A ; PUT IN B FOR LOOP COUNTER
@ -3678,9 +3655,9 @@ HB_DSKIOX:
;
;
HB_DSKFN:
HB_DSKFN:
PUSH BC ; SAVE COUNTERS
PUSH BC ; SAVE COUNTERS
# IF ( DI AGENABLE & DI AGDISKIO )
# IF ( FPLED_ENABLE & FPLED_DSKACT )
LD A ,( HB_DSKBIT ) ; LOAD UNIT DISK BIT MASK
LD A ,( HB_DSKBIT ) ; LOAD UNIT DISK BIT MASK
OUT ( DI AGPORT ), A ; DISPLAY ON DIAG LEDS
CALL FP_SETLEDS ; DISPLAY ON DIAG LEDS
# ENDIF
# ENDIF
# IF ( LEDENABLE & LEDDISKIO )
# IF ( LEDENABLE & LEDDISKIO )
LED ( % 00000101 ) ; BIT 0 FOR TINY Z80 & MBC, BIT 2 FOR SCXXX
LED ( % 00000101 ) ; BIT 0 FOR TINY Z80 & MBC, BIT 2 FOR SCXXX
@ -3688,8 +3665,8 @@ HB_DSKFN:
LD E , 1 ; ONE SECTOR
LD E , 1 ; ONE SECTOR
HB_DSKFNADR .EQU $ + 1
HB_DSKFNADR .EQU $ + 1
CALL PANIC ; READ ONE SECTOR
CALL PANIC ; READ ONE SECTOR
# IF ( DI AGENABLE & DI AGDISKIO )
DIAG ( DI AG_ 00) ; CLEAR DIAG LEDS
# IF ( FPLED_ENABLE & FPLED_DSKACT )
DIAG ( $ 00 ) ; CLEAR DIAG LEDS
# ENDIF
# ENDIF
# IF ( LEDENABLE & LEDDISKIO )
# IF ( LEDENABLE & LEDDISKIO )
LED ( $ 00 )
LED ( $ 00 )
@ -4539,11 +4516,11 @@ SYS_GETCPUSPD1:
;
;
SYS_GETPANEL:
SYS_GETPANEL:
;
;
# IF FPENABLE
LD A ,( HB_HASFP ) ; GET FP EXISTS FLAG
# IF ( FPSW_ ENABLE )
LD A ,( FPSW_ACTIVE ) ; FP SWITCHES ACTIVE?
OR A ; SET FLAGS
OR A ; SET FLAGS
JR Z , SYS_GETPANEL1 ; HANDLE NOT EXISTS
JR Z , SYS_GETPANEL1 ; HANDLE NOT EXISTS
IN A ,( FPBASE ) ; READ SWITCHES
CALL FP_GETSWITCHES ; READ SWITCHES
LD H , 0 ; FOR FUTURE
LD H , 0 ; FOR FUTURE
LD L , A ; PUT SWITCHES VALUE IN L
LD L , A ; PUT SWITCHES VALUE IN L
XOR A ; SIGNAL SUCCESS
XOR A ; SIGNAL SUCCESS
@ -4851,9 +4828,9 @@ SYS_SETCPUSPD_ERR:
;
;
SYS_SETPANEL:
SYS_SETPANEL:
;
;
# IF DI AGENABLE
# IF ( FPLED_ENABLE )
LD A , L
LD A , L
OUT ( DI AGPORT ), A
CALL FP_SETLEDS
XOR A
XOR A
RET
RET
# ELSE
# ELSE
@ -6454,7 +6431,97 @@ SIZ_YM2612 .EQU $ - ORG_YM2612
# INCLUDE "unlzsa2s.asm"
# INCLUDE "unlzsa2s.asm"
# ENDIF
# ENDIF
;
;
; DETECT CPU SPEED USING DS-1302 RTC
;==================================================================================================
; FRONT PANEL SUPPORT
;==================================================================================================
;
; FRONT PANEL HARDWARE DETECTION
;
; WE ARE REALLY JUST CHECKING FOR SWITCHES. NO WAY TO QUERY FOR
; LEDS. WE CHECK FOR I/O CONFLICT WITH VGARC IF ACTIVE.
;
FP_DETECT:
; D: LEDS ACTIVE, E: SWITCHES ACTIVE
LD D , TRUE ; ASSUME ACTIVE FOR NOW
LD E , TRUE ; ASSUME ACTIVE FOR NOW
;
; IF VGARC IS ENABLED, CHECK IF IT IS ACTIVE. IF SO AND THE
; I/O PORTS CONFLICT, DEACTIVATE FRONT PANEL.
;
# IF ( VRCENABLE )
LD A ,( VRC_ACTIVE ) ; GET VGARC ACTIVE STATUS
OR A ; SET FLAGS
JR Z , FP_DETECT1 ; IF NO, CONTINUE
# IF (( FPLED_IO > = $ 00 ) & ( FPLED_IO < = $ 0 F ))
; CONFLICT, DEACTIVATE LEDS
LD D , FALSE ; FP LEDS NOT ACTIVE
# ENDIF
# IF (( FPSW_IO > = $ 00 ) & ( FPSW_IO < = $ 0 F ))
; CONFLICT, DEACTIVATE SWITCHES
LD E , FALSE ; FP SWITCHES NOT ACTIVE
# ENDIF
# ENDIF
;
FP_DETECT1:
; THE SWITCH HARDWARE MAY OR MAY NOT BE INSTALLED. SO, HERE WE
; ATTEMPT TO CONFIRM WE HAVE A VALID PORT. CREDIT TO STEPHEN
; COUSINS FOR THIS APPROACH.
LD C , FPSW_IO ; ADR OF SWITCH PORT
IN C ,( C ) ; READ IT USING IN (C)
IN A ,( FPSW_IO ) ; READ IT USING IN (PORT)
CP C ; PORT FLOATING ON MISMATCH
JR NZ , FP_DETECT2 ; NO H/W, SET FLAG
CP $ FF ; PORT FLOATING ON $FF
JR Z , FP_DETECT2 ; NO H/W, SET FLAG
JR FP_DETECTZ ; H/W EXISTS, DONE
;
FP_DETECT2:
LD E , FALSE ; RECORD NOT PRESENT
;
FP_DETECTZ:
LD ( FP_ACTIVE ), DE ; RECORD RESULTS
RET ; DONE
;
# IF ( FPLED_ENABLE )
;
; SET FRONT PANEL LEDS FROM VALUE IN A
;
FP_SETLEDS:
PUSH HL ; SAVE HL
LD L , A ; LED VALUE TO L
LD A ,( FPLED_ACTIVE ) ; LEDS ACTIVE?
OR A ; SET FLAGS
LD A , L ; RESTORE REG A
JR Z , FP_SETLEDS1 ; BAIL OUT IF NOT ACTIVE
OUT ( FPLED_IO ), A ; WRITE
FP_SETLEDS1:
POP HL ; RESTORE HL
RET ; DONE
;
;
# ENDIF
;
# IF ( FPSW_ENABLE )
;
; GET FRONT PANEL SWITCH SETTINGS
;
FP_GETSWITCHES:
LD A ,( FPSW_ACTIVE ) ; SWITCHES ACTIVE?
OR A ; SET FLAGS
RET Z ; BAIL OUT IF NOT ACTIVE
IN A ,( FPSW_IO ) ; READ SWITCHES
RET ; DONE
;
;
# ENDIF
;
FP_ACTIVE:
FPSW_ACTIVE .DB TRUE
FPLED_ACTIVE .DB TRUE
;
;==================================================================================================
; CPU SPEED DETECTION USING DS-1302 RTC
;==================================================================================================
;
;
HB_CPUSPD:
HB_CPUSPD:
;
;
@ -6570,116 +6637,6 @@ HB_CPUSPD2:
OR $ FF ; SIGNAL ERROR
OR $ FF ; SIGNAL ERROR
RET ; AND DONE
RET ; AND DONE
;
;
; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE?
;
SYSCHKA:
; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY
PUSH AF ; PRESERVE INCOMING AF VALUE
LD A ,( CB_DIAGLVL ) ; GET DIAGNOSTIC LEVEL
CP DL _ERROR ; >= ERROR LEVEL
JR C , SYSCHK1 ; IF NOT, GO HOME
POP AF ; RESTORE INCOMING AF VALUE
;
; DISPLAY SYSCHK MESSAGE
PUSH DE ; PRESERVE DE VALUE
LD DE , STR_SYSCHK ; POINT TO PREFIX STRING
CALL WRITESTR ; PRINT IT
POP DE ; RESTORE DE VALUE
CALL XREGDMP ; DUMP REGISTERS
; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX
EX ( SP ), HL ; GET RETURN ADDRESS
INC HL ; POINT TO THE ERROR CODE
PUSH AF
LD A ,( HL ) ; DISPLAY
CALL PRTHEXBYTE
POP AF
DEC HL ; RESTORE RETURN ADDRESS
EX ( SP ), HL
;
JR CONTINUE ; CHECK W/ USER
;
SYSCHK1:
; RETURN IF MESSAGING BYPASSED BY DIAG LEVEL
POP AF
RET
;
; PANIC: DUMP MACHINE STATE AND HALT
;
PANIC:
PUSH DE
LD DE , STR_PANIC
CALL WRITESTR
POP DE
CALL XREGDMP ; DUMP REGISTERS
JR SYSHALT ; FULL STOP
;
;
;
CONTINUE:
PUSH AF
CONTINUE1:
PUSH DE
LD DE , STR_CONTINUE
CALL WRITESTR
POP DE
CALL CIN
RES 5 , A ; FORCE UPPERCASE (IMPERFECTLY)
CALL COUT ; ECHO
CP 'Y'
JR Z , CONTINUE3
CP 'N'
JR Z , SYSHALT
JR CONTINUE1
CONTINUE3:
CALL NEWLINE
POP AF
RET
;
;
;
SYSHALT:
LD DE , STR_HALT
CALL WRITESTR
DI
HALT
;
; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000
;
PRTD3M:
PUSH BC
PUSH DE
PUSH HL
LD E , '0'
LD BC , - 10000
CALL PRTD3M1
LD E , 0
LD BC , - 1000
CALL PRTD3M1
CALL PC_PERIOD
LD BC , - 100
CALL PRTD3M1
LD C , - 10
CALL PRTD3M1
LD C , - 1
CALL PRTD3M1
POP HL
POP DE
POP BC
RET
PRTD3M1:
LD A , '0' - 1
PRTD3M2:
INC A
ADD HL , BC
JR C , PRTD3M2
SBC HL , BC
CP E
JR Z , PRTD3M3
LD E , 0
CALL COUT
PRTD3M3:
RET
;==================================================================================================
;==================================================================================================
; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES
; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES
;==================================================================================================
;==================================================================================================
@ -7373,7 +7330,7 @@ CST2:
RET
RET
;
;
;==================================================================================================
;==================================================================================================
; MISCELLANEOUS UTILITY FUNCTIONS
; INTERNAL UTILITY FUNCTIONS
;==================================================================================================
;==================================================================================================
;
;
; SET HL TO IY+A, A IS TRASHED
; SET HL TO IY+A, A IS TRASHED
@ -7410,6 +7367,117 @@ HB_CHS2LBA:
XOR A
XOR A
RET
RET
;
;
; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE?
;
SYSCHKA:
; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY
PUSH AF ; PRESERVE INCOMING AF VALUE
LD A ,( CB_DIAGLVL ) ; GET DIAGNOSTIC LEVEL
CP DL _ERROR ; >= ERROR LEVEL
JR C , SYSCHK1 ; IF NOT, GO HOME
POP AF ; RESTORE INCOMING AF VALUE
;
; DISPLAY SYSCHK MESSAGE
PUSH DE ; PRESERVE DE VALUE
LD DE , STR_SYSCHK ; POINT TO PREFIX STRING
CALL WRITESTR ; PRINT IT
POP DE ; RESTORE DE VALUE
CALL XREGDMP ; DUMP REGISTERS
; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX
EX ( SP ), HL ; GET RETURN ADDRESS
INC HL ; POINT TO THE ERROR CODE
PUSH AF
LD A ,( HL ) ; DISPLAY
CALL PRTHEXBYTE
POP AF
DEC HL ; RESTORE RETURN ADDRESS
EX ( SP ), HL
;
JR CONTINUE ; CHECK W/ USER
;
SYSCHK1:
; RETURN IF MESSAGING BYPASSED BY DIAG LEVEL
POP AF
RET
;
; PANIC: DUMP MACHINE STATE AND HALT
;
PANIC:
PUSH DE
LD DE , STR_PANIC
CALL WRITESTR
POP DE
CALL XREGDMP ; DUMP REGISTERS
JR SYSHALT ; FULL STOP
;
;
;
CONTINUE:
PUSH AF
CONTINUE1:
PUSH DE
LD DE , STR_CONTINUE
CALL WRITESTR
POP DE
CALL CIN
RES 5 , A ; FORCE UPPERCASE (IMPERFECTLY)
CALL COUT ; ECHO
CP 'Y'
JR Z , CONTINUE3
CP 'N'
JR Z , SYSHALT
JR CONTINUE1
CONTINUE3:
CALL NEWLINE
POP AF
RET
;
;
;
SYSHALT:
LD DE , STR_HALT
CALL WRITESTR
DI
HALT
;
; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000
;
PRTD3M:
PUSH BC
PUSH DE
PUSH HL
LD E , '0'
LD BC , - 10000
CALL PRTD3M1
LD E , 0
LD BC , - 1000
CALL PRTD3M1
CALL PC_PERIOD
LD BC , - 100
CALL PRTD3M1
LD C , - 10
CALL PRTD3M1
LD C , - 1
CALL PRTD3M1
POP HL
POP DE
POP BC
RET
PRTD3M1:
LD A , '0' - 1
PRTD3M2:
INC A
ADD HL , BC
JR C , PRTD3M2
SBC HL , BC
CP E
JR Z , PRTD3M3
LD E , 0
CALL COUT
PRTD3M3:
RET
;
;==================================================================================================
;==================================================================================================
; HBIOS GLOBAL DATA
; HBIOS GLOBAL DATA
;==================================================================================================
;==================================================================================================