mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
502 lines
11 KiB
502 lines
11 KiB
;__________________________________________________________________________________________________
|
|
;
|
|
; BANK1
|
|
;__________________________________________________________________________________________________
|
|
;
|
|
|
|
; bnk1.asm 5/23/2012 dwg Beta 4 - Enhanced SYS_GETCFG and SYS_SETCFG
|
|
|
|
|
|
.ORG 1000H
|
|
;
|
|
; INCLUDE GENERIC STUFF
|
|
;
|
|
#INCLUDE "std.asm"
|
|
;
|
|
;==================================================================================================
|
|
; BANK 1 ENTRY / JUMP TABLE
|
|
;==================================================================================================
|
|
;
|
|
; THIS IS THE ENTRY DISPATCH POINT FOR BANK1
|
|
;__________________________________________________________________________________________________
|
|
;
|
|
JP INITSYS
|
|
JP BIOS_DISPATCH
|
|
;
|
|
;==================================================================================================
|
|
; SYSTEM INITIALIZATION
|
|
;==================================================================================================
|
|
;
|
|
; AT THIS POINT, IT IS ASSUMED WE ARE OPERATING FROM RAM PAGE 1
|
|
;
|
|
INITSYS:
|
|
;
|
|
; INSTALL HBIOS PROXY IN UPPER MEMORY
|
|
;
|
|
LD HL,HB_IMG
|
|
LD DE,HB_LOC
|
|
LD BC,HB_SIZ
|
|
LDIR
|
|
;
|
|
LD HL,$8000 ; DEFAULT DISK XFR BUF ADDRESS
|
|
LD (DIOBUF),HL ; SAVE IT
|
|
;
|
|
#IF (PLATFORM != PLT_N8)
|
|
IN A,(RTC) ; RTC PORT, BIT 6 HAS STATE OF CONFIG JUMPER
|
|
; LD A,40H ; *DEBUG* SIMULATE JUMPER OPEN
|
|
; LD A,00H ; *DEBUG* SIMULATE JUMPER SHORTED
|
|
AND 40H ; ISOLATE BIT 6
|
|
JR Z,INITSYS1 ; IF BIT6=0, SHORTED, USE ALT CONSOLE
|
|
LD A,DEFCON ; LOAD DEF CONSOLE DEVICE CODE
|
|
JR INITSYS2 ; CONTINUE
|
|
INITSYS1:
|
|
LD A,ALTCON ; LOAD ALT CONSOLE DEVICE CODE
|
|
INITSYS2:
|
|
LD (CONDEV),A ; SET THE ACTIVE CONSOLE DEVICE
|
|
#ENDIF
|
|
;
|
|
; PERFORM DEVICE INITIALIZATION
|
|
;
|
|
#IF (UARTENABLE)
|
|
CALL UART_INIT
|
|
#ENDIF
|
|
#IF (VDUENABLE)
|
|
CALL VDU_INIT
|
|
#ENDIF
|
|
#IF (PRPENABLE)
|
|
CALL PRP_INIT
|
|
#ENDIF
|
|
#IF (PPPENABLE)
|
|
CALL PPP_INIT
|
|
#ENDIF
|
|
#IF (DSKYENABLE)
|
|
CALL DSKY_INIT
|
|
#ENDIF
|
|
#IF (FDENABLE)
|
|
CALL FD_INIT
|
|
#ENDIF
|
|
#IF (IDEENABLE)
|
|
CALL IDE_INIT
|
|
#ENDIF
|
|
#IF (PPIDEENABLE)
|
|
CALL PPIDE_INIT
|
|
#ENDIF
|
|
#IF (SDENABLE)
|
|
CALL SD_INIT
|
|
#ENDIF
|
|
#IF (HDSKENABLE)
|
|
CALL HDSK_INIT
|
|
#ENDIF
|
|
;
|
|
RET
|
|
;
|
|
;==================================================================================================
|
|
; IDLE
|
|
;==================================================================================================
|
|
;
|
|
;__________________________________________________________________________________________________
|
|
;
|
|
IDLE:
|
|
#IF (FDENABLE)
|
|
CALL FD_IDLE
|
|
#ENDIF
|
|
RET
|
|
;
|
|
;==================================================================================================
|
|
; BIOS FUNCTION DISPATCHER
|
|
;==================================================================================================
|
|
;
|
|
; MAIN BIOS FUNCTION
|
|
; B: FUNCTION
|
|
;__________________________________________________________________________________________________
|
|
;
|
|
BIOS_DISPATCH:
|
|
LD A,B ; REQUESTED FUNCTION IS IN B
|
|
CP BF_CIO + $10
|
|
JR C,CIO_DISPATCH
|
|
CP BF_DIO + $10
|
|
JR C,DIO_DISPATCH
|
|
CP BF_CLK + $10
|
|
JR C,CLK_DISPATCH
|
|
CP BF_VDU + $10
|
|
JR C,CRT_DISPATCH
|
|
|
|
CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0
|
|
CALL C,PANIC ; PANIC IF LESS THAN BF_SYS
|
|
JR SYS_DISPATCH ; OTHERWISE SYS CALL
|
|
CALL PANIC ; THIS SHOULD NEVER BE REACHED
|
|
;
|
|
; SETUP AND CALL CHARACTER DRIVER
|
|
; B: FUNCTION
|
|
; C: DEVICE/UNIT
|
|
; E: CHARACTER IN/OUT
|
|
;
|
|
CIO_DISPATCH:
|
|
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
|
|
AND $F0 ; ISOLATE THE DEVICE PORTION
|
|
#IF (UARTENABLE)
|
|
CP CIODEV_UART
|
|
JP Z,UART_DISPATCH
|
|
#ENDIF
|
|
#IF (PRPENABLE & PRPCONENABLE)
|
|
CP CIODEV_PRPCON
|
|
JP Z,PRPCON_DISPATCH
|
|
#ENDIF
|
|
#IF (PPPENABLE & PPPCONENABLE)
|
|
CP CIODEV_PPPCON
|
|
JP Z,PPPCON_DISPATCH
|
|
#ENDIF
|
|
#IF (VDUENABLE)
|
|
CP CIODEV_VDU
|
|
JP Z,VDU_DISPATCH
|
|
#ENDIF
|
|
CALL PANIC
|
|
;
|
|
;
|
|
;
|
|
DIO_DISPATCH:
|
|
LD A,B
|
|
|
|
; DIO FUNCTIONS STARTING AT $18 ARE COMMON
|
|
; AND DO NOT DISPATCH TO DRIVERS
|
|
CP $18
|
|
JR NC,DIO_COMMON
|
|
|
|
; DISPATCH FUCNTION TO APPROPRIATE DRIVER
|
|
AND $0F ;
|
|
|
|
; HACK TO FILL IN HSTTRK AND HSTSEC
|
|
; BUT ONLY FOR READ/WRITE FUNCTION CALLS
|
|
; ULTIMATELY, HSTTRK AND HSTSEC ARE TO BE REMOVED
|
|
CP 2
|
|
JR NC,DIO_DISPATCH1
|
|
LD (HSTTRK),HL
|
|
LD (HSTSEC),DE
|
|
DIO_DISPATCH1:
|
|
LD A,C ; REQUESTED DEVICE/UNIT IS IN C
|
|
LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK
|
|
AND $F0 ; ISOLATE THE DEVICE PORTION
|
|
#IF (FDENABLE)
|
|
CP DIODEV_FD
|
|
JP Z,FD_DISPATCH
|
|
#ENDIF
|
|
#IF (IDEENABLE)
|
|
CP DIODEV_IDE
|
|
JP Z,IDE_DISPATCH
|
|
#ENDIF
|
|
#IF (PPIDEENABLE)
|
|
CP DIODEV_PPIDE
|
|
JP Z,PPIDE_DISPATCH
|
|
#ENDIF
|
|
#IF (SDENABLE)
|
|
CP DIODEV_SD
|
|
JP Z,SD_DISPATCH
|
|
#ENDIF
|
|
#IF (PRPENABLE & PRPSDENABLE)
|
|
CP DIODEV_PRPSD
|
|
JP Z,PRPSD_DISPATCH
|
|
#ENDIF
|
|
#IF (PPPENABLE & PPPSDENABLE)
|
|
CP DIODEV_PPPSD
|
|
JP Z,PPPSD_DISPATCH
|
|
#ENDIF
|
|
#IF (HDSKENABLE)
|
|
CP DIODEV_HDSK
|
|
JP Z,HDSK_DISPATCH
|
|
#ENDIF
|
|
CALL PANIC
|
|
;
|
|
; HANDLE COMMON DISK FUNCTIONS (NOT DEVICE DRIVER SPECIFIC)
|
|
;
|
|
DIO_COMMON:
|
|
SUB $18
|
|
JR Z,DIO_GBA
|
|
DEC A
|
|
JR Z,DIO_SBA
|
|
CALL PANIC
|
|
;
|
|
; DISK: GET BUFFER ADDRESS
|
|
;
|
|
DIO_GBA:
|
|
LD HL,(DIOBUF)
|
|
XOR A
|
|
RET
|
|
;
|
|
; DISK: SET BUFFER ADDRESS
|
|
;
|
|
DIO_SBA:
|
|
BIT 7,H ; IS HIGH ORDER BIT SET?
|
|
CALL Z,PANIC ; IF NOT, ADR IS IN LOWER 32K, NOT ALLOWED!!!
|
|
LD (DIOBUF),HL
|
|
XOR A
|
|
RET
|
|
;
|
|
;
|
|
;
|
|
CLK_DISPATCH:
|
|
CALL PANIC
|
|
;
|
|
;
|
|
;
|
|
CRT_DISPATCH:
|
|
CALL PANIC
|
|
;
|
|
;
|
|
;
|
|
SYS_DISPATCH:
|
|
LD A,B
|
|
CP BF_SYSGETCFG
|
|
JR Z,SYS_GETCFG
|
|
CP BF_SYSSETCFG
|
|
JR Z,SYS_SETCFG
|
|
CP BF_SYSBNKCPY
|
|
JR Z,SYS_BNKCPY
|
|
CALL PANIC
|
|
;
|
|
SYS_GETCFG:
|
|
LD HL,$0200 ; SETUP SOURCE OF CONFIG DATA
|
|
LD BC,$0100 ; SIZE OF CONFIG DATA
|
|
LDIR ; COPY IT
|
|
RET
|
|
;
|
|
SYS_SETCFG:
|
|
LD HL,$0200 ; SETUP SOURCE OF CONFIG DATA
|
|
LD BC,$0100
|
|
EX DE,HL
|
|
LDIR
|
|
RET
|
|
;
|
|
SYS_BNKCPY:
|
|
LD A,C ; BANK SELECTION TO A
|
|
PUSH IX
|
|
POP BC ; BC = BYTE COUNT TO COPY
|
|
JP $FF03 ; JUST PASS CONTROL TO HBIOS STUB IN UPPER MEMORY
|
|
;
|
|
; COMMON ROUTINE THAT IS CALLED BY CHARACTER IO DRIVERS WHEN
|
|
; AN IDLE CONDITION IS DETECTED (WAIT FOR INPUT/OUTPUT)
|
|
;
|
|
CIO_IDLE:
|
|
LD HL,IDLECOUNT ; POINT TO IDLE COUNT
|
|
DEC (HL) ; 256 TIMES?
|
|
CALL Z,IDLE ; RUN IDLE PROCESS EVERY 256 ITERATIONS
|
|
XOR A ; SIGNAL NO CHAR READY
|
|
RET ; AND RETURN
|
|
;
|
|
;==================================================================================================
|
|
; DEVICE DRIVERS
|
|
;==================================================================================================
|
|
;
|
|
#IF (UARTENABLE)
|
|
ORG_UART .EQU $
|
|
#INCLUDE "uart.asm"
|
|
SIZ_UART .EQU $ - ORG_UART
|
|
.ECHO "UART occupies "
|
|
.ECHO SIZ_UART
|
|
.ECHO " bytes.\n"
|
|
#ENDIF
|
|
;
|
|
#IF (VDUENABLE)
|
|
ORG_VDU .EQU $
|
|
#INCLUDE "vdu.asm"
|
|
SIZ_VDU .EQU $ - ORG_VDU
|
|
.ECHO "VDU occupies "
|
|
.ECHO SIZ_VDU
|
|
.ECHO " bytes.\n"
|
|
#ENDIF
|
|
;
|
|
#IF (PRPENABLE)
|
|
ORG_PRP .EQU $
|
|
#INCLUDE "prp.asm"
|
|
SIZ_PRP .EQU $ - ORG_PRP
|
|
.ECHO "PRP occupies "
|
|
.ECHO SIZ_PRP
|
|
.ECHO " bytes.\n"
|
|
#ENDIF
|
|
;
|
|
#IF (PPPENABLE)
|
|
ORG_PPP .EQU $
|
|
#INCLUDE "ppp.asm"
|
|
SIZ_PPP .EQU $ - ORG_PPP
|
|
.ECHO "PPP occupies "
|
|
.ECHO SIZ_PPP
|
|
.ECHO " bytes.\n"
|
|
#ENDIF
|
|
;
|
|
#IF (FDENABLE)
|
|
ORG_FD .EQU $
|
|
#INCLUDE "fd.asm"
|
|
SIZ_FD .EQU $ - ORG_FD
|
|
.ECHO "FD occupies "
|
|
.ECHO SIZ_FD
|
|
.ECHO " bytes.\n"
|
|
#ENDIF
|
|
|
|
#IF (IDEENABLE)
|
|
ORG_IDE .EQU $
|
|
#INCLUDE "ide.asm"
|
|
SIZ_IDE .EQU $ - ORG_IDE
|
|
.ECHO "IDE occupies "
|
|
.ECHO SIZ_IDE
|
|
.ECHO " bytes.\n"
|
|
#ENDIF
|
|
|
|
#IF (PPIDEENABLE)
|
|
ORG_PPIDE .EQU $
|
|
#INCLUDE "ppide.asm"
|
|
SIZ_PPIDE .EQU $ - ORG_PPIDE
|
|
.ECHO "PPIDE occupies "
|
|
.ECHO SIZ_PPIDE
|
|
.ECHO " bytes.\n"
|
|
#ENDIF
|
|
|
|
#IF (SDENABLE)
|
|
ORG_SD .EQU $
|
|
#INCLUDE "sd.asm"
|
|
SIZ_SD .EQU $ - ORG_SD
|
|
.ECHO "SD occupies "
|
|
.ECHO SIZ_SD
|
|
.ECHO " bytes.\n"
|
|
#ENDIF
|
|
|
|
#IF (HDSKENABLE)
|
|
ORG_HDSK .EQU $
|
|
#INCLUDE "hdsk.asm"
|
|
SIZ_HDSK .EQU $ - ORG_HDSK
|
|
.ECHO "HDSK occupies "
|
|
.ECHO SIZ_HDSK
|
|
.ECHO " bytes.\n"
|
|
#ENDIF
|
|
;
|
|
#DEFINE CIOMODE_CONSOLE
|
|
#DEFINE DSKY_KBD
|
|
#INCLUDE "util.asm"
|
|
;
|
|
;;;;#INCLUDE "memmgr.asm"
|
|
;
|
|
;==================================================================================================
|
|
; BANK ONE GLOBAL DATA
|
|
;==================================================================================================
|
|
;
|
|
CONDEV .DB DEFCON
|
|
;
|
|
IDLECOUNT .DB 0
|
|
;
|
|
HSTDSK .DB 0 ; DISK IN BUFFER
|
|
HSTTRK .DW 0 ; TRACK IN BUFFER
|
|
HSTSEC .DW 0 ; SECTOR IN BUFFER
|
|
;
|
|
DIOBUF .DW $FD00 ; PTR TO 512 BYTE DISK XFR BUFFER
|
|
;
|
|
;==================================================================================================
|
|
; FILL REMAINDER OF BANK
|
|
;==================================================================================================
|
|
;
|
|
SLACK: .EQU (7F00H - $)
|
|
.FILL SLACK,0FFH
|
|
;
|
|
.ECHO "BNK1 space remaining: "
|
|
.ECHO SLACK
|
|
.ECHO " bytes.\n"
|
|
;
|
|
;==================================================================================================
|
|
; HBIOS UPPER MEMORY STUB
|
|
;==================================================================================================
|
|
;
|
|
; THE FOLLOWING CODE IS RELOCATED TO THE TOP PAGE IN MEMORY TO HANDLE INVOCATION DISPATCHING
|
|
;
|
|
HB_IMG .EQU $
|
|
.ORG HB_LOC
|
|
;
|
|
;==================================================================================================
|
|
; HBIOS DISPATCH
|
|
;==================================================================================================
|
|
;
|
|
; DISPATCH JUMP TABLE FOR UPPER MEMORY HBIOS FUNCTIONS
|
|
;
|
|
JP HB_INIT
|
|
JP HB_BNKCPY
|
|
;
|
|
; MEMORY MANAGER
|
|
;
|
|
#INCLUDE "memmgr.asm"
|
|
;
|
|
;==================================================================================================
|
|
; HBIOS BOOT ROUTINE
|
|
;==================================================================================================
|
|
;
|
|
; SETUP RST 08 TO HANDLE MAIN BIOS FUNCTIONS
|
|
;
|
|
HB_INIT:
|
|
LD A,0C3H ; $C3 = JP
|
|
LD (8H),A
|
|
LD HL,HB_ENTRY
|
|
LD (9H),HL
|
|
RET
|
|
;
|
|
;==================================================================================================
|
|
; HBIOS BNKCPY ROUTINE
|
|
;==================================================================================================
|
|
;
|
|
; SELECT A DESIGNATED RAM/ROM BANK INTO LOWER 32K, THEN PERFORM A BULK MEMORY COPY
|
|
; A: BANK SELECTION (BIT 7: 1=RAM/0=ROM, BITS 0-6: BANK NUMBER)
|
|
; DE: DESTINATION ADDRESS
|
|
; HL: SOURCE ADDRESS
|
|
; BC: COUNT OF BYTES TO COPY;
|
|
;
|
|
HB_BNKCPY:
|
|
BIT 7,A ; CHECK BIT 7
|
|
JR NZ,HB_BNKCPY1 ; RAM PAGE
|
|
;
|
|
CALL ROMPG ; SELECT ROM PAGE
|
|
JR HB_BNKCPY2 ; GO TO COMMON STUFF
|
|
;
|
|
HB_BNKCPY1:
|
|
RES 7,A ; CLEAR BIT 7
|
|
CALL RAMPG ; SELECT RAM PAGE AND FALL THRU
|
|
;
|
|
HB_BNKCPY2:
|
|
LDIR ; DO THE COPY
|
|
LD A,1 ; RESELECT RAM PAGE 1
|
|
CALL RAMPG ; DO IT
|
|
RET ; BACK TO LOWER MEMORY
|
|
;
|
|
;==================================================================================================
|
|
; HBIOS ENTRY FOR RST 08 PROCESSING
|
|
;==================================================================================================
|
|
;
|
|
; ENTRY POINT FOR BIOS FUNCTIONS (TARGET OF RST 08)
|
|
;
|
|
HB_ENTRY:
|
|
LD (STACKSAV),SP ; SAVE ORIGINAL STACK FRAME
|
|
LD SP,STACK ; SETUP NEW STACK FRAME
|
|
|
|
PGRAMF(1) ; MAP RAM PAGE 1 INTO LOWER 32K
|
|
|
|
CALL 1003H ; CALL BANK 1 HBIOS FUNCTION DISPATCHER
|
|
|
|
PUSH AF ; SAVE AF (FUNCTION RETURN)
|
|
PGRAMF(0) ; MAP RAM PAGE 0 INTO LOWER 32K
|
|
POP AF ; RESTORE AF
|
|
|
|
LD SP,(STACKSAV) ; RESTORE ORIGINAL STACK FRAME
|
|
|
|
RET ; RETURN TO CALLER
|
|
;
|
|
; PRIVATE DATA
|
|
;
|
|
STACKSAV .DW 0
|
|
;
|
|
; JUST FOR FUN, PRIVATE STACK IS LOCATED AT TOP OF MEMORY...
|
|
;
|
|
STACK .EQU 0
|
|
;
|
|
;
|
|
;
|
|
HB_SLACK .EQU (HB_END - $)
|
|
.ECHO "STACK space remaining: "
|
|
.ECHO HB_SLACK
|
|
.ECHO " bytes.\n"
|
|
;
|
|
.FILL HB_SLACK,0FFH
|
|
;
|
|
.END
|