diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index e696311f..bd9bf181 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 ;