diff --git a/Source/Apps/FAT/ReadMe.md b/Source/Apps/FAT/ReadMe.md index c54eda9f..1c76023b 100644 --- a/Source/Apps/FAT/ReadMe.md +++ b/Source/Apps/FAT/ReadMe.md @@ -1,7 +1,7 @@ # RomWBW HBIOS CP/M FAT Utility ("FAT.COM") Author: Wayne Warthen \ -Updated: 6-Jan-2024 +Updated: 6-May-2024 This application allows copying files between CP/M filesystems and FAT filesystems (DOS, Windows, Mac, Linux, etc.). The application runs on @@ -72,6 +72,38 @@ creation. - Wildcard matching in FAT filesystems is a bit unusual as implemented by FatFs. See FatFs documentation. + - The `FAT FORMAT` command will not perform a physical format on + floppy disks. You must use FDU to do this prior to using + `FAT FORMAT`. + + - Formatting (`FAT FORMAT`) of floppies does not work well. The + underlying FatFs library uses some non-standard fields. The + resulting floppy may or may not be useable on other systems. It is + best to format a FAT floppy on a Windows or DOS system. You should + have no problems copying files to/from such a floppy using `FAT`. + +### Known Issues + + - CP/M (and workalike) OSes have significant restrictions on filename + characters. The FAT application will block any attempt to create a + file on the CP/M filesystem containing any of these prohibited + characters: + +| `< > . , ; : ? * [ ] |/ \` + + The operation will be aborted with "`Error: Invalid Path Name`" if such + a filename character is encountered. + + Since MS-DOS does allow some of these characters, you can have + issues when copying files from MS-DOS to CP/M if the MS-DOS filenames + use these characters. Unfortunately, FAT is not yet smart enough to + substitute illegal characters with legal ones. So, you will need to + clean the filenames before trying to copy them to CP/M. + + - The FAT application does try to detect the scenario where you are + copying a file to itself. However, this detection is not perfect and + can corrupt a file if it occurs. Be careful to avoid this. + ### License: GNU GPLv3 (see file LICENSE.txt) @@ -123,3 +155,4 @@ creation. | 12-Oct-2023 | v0.9.9 | (beta) handle updated HBIOS Disk Device call | | 6-Jan-2024 | v1.0.0 | updated to latest FsFat (v0.15) | | | | updated to latest SDCC (v4.3) | +| 6-May-2024 | v1.1.0 | improve floppy format boot record | diff --git a/Source/Apps/FAT/fat.com b/Source/Apps/FAT/fat.com index 004760fb..9c6d2f2c 100644 Binary files a/Source/Apps/FAT/fat.com and b/Source/Apps/FAT/fat.com differ diff --git a/Source/HBIOS/asci.asm b/Source/HBIOS/asci.asm index 85cbb0f5..5f6c00dd 100644 --- a/Source/HBIOS/asci.asm +++ b/Source/HBIOS/asci.asm @@ -618,7 +618,7 @@ ASCI_DETECT: ; Z180 DIVISOR IS ALWAYS A FACTOR OF 160 ; ; CNTLB= XXPXDSSS -; FAILSAVE = 00100000 +; FAILSAFE = 00100000 ; ; PS (PRESCALE): 0=/10, 1=/30 ; DR (DIVIDE RATIO): 0=/16, 1=/64 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 05f5fde8..f348a336 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -72,7 +72,7 @@ ; HBIOS Control Block 0x0100 0x0100 ; Proxy Image 0x0200 0x0200 ; Entry Vectors / Stack 0x0400 0x0100 -; Interrupt Vectors 0x0500 Varies +; Interrupt Vector Table 0x0500 Varies ; System Initialization Varies Varies ; Function Dispatching Varies Varies ; System API Varies Varies @@ -682,7 +682,7 @@ HBX_ROM: OR A ; SET FLAGS JP P,HBX_ROM ; BIT 7 INDICATES RAM OUT (MPCL_ROM),A ; ENSURE ROM PAGE OUT OF MEMORY BEFORE SWITCH - ; SEE MBC RUNTIME MEMORY SIZE ADJUSTMENT + ; SEE MBC BANK SELECT MASK SETUP ROUTINE ABOVE HBX_MBCMSK .EQU $+1 ; FORCE TOP 32K ; MASK POPULATED XOR %00000000 ; TO BE IN FIRST CHIP ; DURING INITIALIZATION OUT (MPCL_RAM),A ; SET RAM PAGE SELECTOR @@ -1320,6 +1320,10 @@ HB_IM1INT: CALL HB_BADINT \ RET NZ CALL HB_BADINT \ RET NZ ; +HB_IM1CNT .DB 0 ; NUMBER OF ENTRIES IN CALL LIST +HB_IM1MAX .DB 8 ; MAX ENTRIES IN CALL LIST +HB_IM1PTR .DW HB_IM1INT ; POINTER FOR NEXT IM1 ENTRY +; HB_INTVEC_END .EQU $ ; ;================================================================================================== @@ -1594,6 +1598,13 @@ Z280_INITZ: OUT (EIPC_SCDP),A ; SET SYSTEM CONTROL DATA PORT (SCDP) #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; PLATFORM MEMORY MANAGEMENT INITIALIZATION +;-------------------------------------------------------------------------------------------------- +; +; INITIALIZE MEMORY MANAGERS AS NEEDED TO ADDRESS BOOT ROM IN LOW 32K +; AND COMMON RAM IN HIGH 32K. SETUP MMU FOR BANKING IN LOWER 32K. +; ; Z180 MINI-ITX MADNESS TO INITIALIZE THE PPIO. WE HAVE THE MAIN RAM AT ; $8000 AND ROM AT $0 AT THIS POINT AND THE Z180 MMU SET UP. NOW ; GET THE 82C55 PROGRAMMED. @@ -1629,8 +1640,7 @@ ROMRESUME: ; #ENDIF ; -; INITIALIZE MEMORY MANAGERS AS NEEDED TO ADDRESS BOOT ROM IN LOW 32K -; AND COMMON RAM IN HIGH 32K. +; SBC AND MBC MMU INITIALIZATION ; #IF ((MEMMGR == MM_SBC) | (MEMMGR == MM_MBC)) ; SET PAGING REGISTERS @@ -1641,29 +1651,53 @@ ROMRESUME: #ENDIF #ENDIF ; +; ZETA 2 AND DUO MMU INITIALIZATION +; +; ZETA 2 MMU USES 4 16K PAGES TO MAP PHYSICAL MEMORY TO CPU MEMORY. +; HBIOS USES THE LOWER 2 16K PAGES FOR BANKING AND UPPER 2 16K PAGES +; FOR COMMON. NORMALLY, A ZETA 2 BASED SYSTEM WILL CONTAIN 512K OF +; PHYSICAL ROM FOLLOWED BY 512K OF PHYSICAL RAM. DUO USES A PHYSICAL +; ADDRESS SPACE OF 4096K WITH THE FIRST 2048K AS ROM AND THE FOLLOWING +; 2048K AS RAM. THE SIZE OF ROM AND RAM CAN VARY FOR DUO, BUT THE +; RAM BOUNDARY IS ALWAYS AT 2048K. +; #IF (MEMMGR == MM_Z2) - ; SET PAGING REGISTERS +; #IFDEF ROMBOOT + ; IF THIS IS A ROM BOOT, SETUP THE FIRST 2 16K MMU REGISTERS + ; TO MAP THE LOWEST 32K OF PHYSICAL ROM TO THE LOW 32K OF + ; CPU ADDRESS SPACE (BANKING AREA). THE FIRST 16K MAPPING IS + ; REDUNDANT BECAUSE WE ARE ALREADY RUNNING IN THIS AREA. THE + ; MAPPING OF THE SECOND 16K IS CRITICAL BECAUSE ALL ZETA 2 + ; MMU REGISTERS WILL BE 0 AT RESET! XOR A - OUT (MPGSEL_0),A + OUT (MPGSEL_0),A ; PROG FIRST 16K MMU REGISTER INC A - OUT (MPGSEL_1),A + OUT (MPGSEL_1),A ; PROG SECOND 16K MMU REGISTER #ENDIF ; #IF (PLATFORM == PLT_DUO) + ; DUO HAS VARIABLE RAM SIZE. RAM ALWAYS STARTS AT 2048K. + ; SETUP COMMON RAM FOR HIGHEST 32K OF RAM BASED ON TOTAL RAM. LD A,128 + (RAMSIZE / 16) - 2 #ELSE + ; NORMAL ZETA 2 SYSTEM HAS FIXED 512K OF RAM. SETUP COMMON + ; FOR TOP 32K OF THIS. LD A,64 - 2 #ENDIF ; - OUT (MPGSEL_2),A + OUT (MPGSEL_2),A ; PROG THIRD 16K MMU REGISTER INC A - OUT (MPGSEL_3),A + OUT (MPGSEL_3),A ; PROG FOURTH 16K MMU REGISTER ; ENABLE PAGING LD A,1 - OUT (MPGENA),A + OUT (MPGENA),A ; ENABLE MMU NOW #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; PROXY INSTALLATION +;-------------------------------------------------------------------------------------------------- +; ; AT THIS POINT, RAM SHOULD BE AVAILABLE IN THE COMMON BANK ; (TOP 32K). ; @@ -1678,7 +1712,7 @@ ROMRESUME: ; CHECK BATTERY BACKUP STATUS BEFORE WE TOUCH RAM (UPPER MEMORY) ; ; IF A DS1210 POWER CONTROLLER IS INSTALLED AND BATTERY BACKUP IS NOT INSTALLED -; OR IS LESS THAN 2V THEN THE DS1210 WILL BLOCK THE SECOND RAM ACCESS. +; OR IS LESS THAN 2V THEN THE DS1210 WILL BLOCK THE *SECOND* RAM ACCESS. ; FAILURE TO COMPLETE TWO RAM ACCESSES BEFORE INSTALLING PROXY WILL RESULT ; IN THE ROM ID BYTES NOT BEING COPIED CORRECTLY AND CP/M APPLICATIONS ; WILL NOT START CORRECTLY WHEN THEY CHECK THE ROM ID VERSION BYTES. @@ -1689,27 +1723,31 @@ ROMRESUME: ; LD HL,HBX_LOC - 1 ; POINT TO BYTE XOR A ; ZERO MEANS LOW BAT - LD (HL),A + LD (HL),A ; FIRST RAM ACCESS INC A ; 1 MEANS BAT OK - LD (HL),A + LD (HL),A ; SECOND RAM ACCESS (BLOLCKED IF BATTERY ISSUE) ; ; INSTALL PROXY IN UPPER MEMORY ; - LD DE,HBX_LOC ; AS PER ABOVE - LD HL,HBX_IMG - LD BC,HBX_SIZ - LDIR + LD DE,HBX_LOC ; RUNNING LOCATION OF PROXY + LD HL,HBX_IMG ; LOCATION OF PROXY IMAGE + LD BC,HBX_SIZ ; SIZE OF PROXY + LDIR ; COPY IT ; ; NOTIFICATION THAT WE HAVE COMPLETED HARDWARE INIT. ; FPLEDS(DIAG_02) ; +;-------------------------------------------------------------------------------------------------- +; S100 MONITOR LAUNCH +;-------------------------------------------------------------------------------------------------- +; ; S100 ROM CONTAINS A HARDWARE LEVEL MONITOR IN BANK ID 3 OF ROM. ; IF PORT $75 BIT 1 IS SET (SET IS ZERO), THEN WE IMMEDIATELY ; TRANSITION TO THIS MONITOR. PRIOR TO THE TRANSITION, WE ALSO ; CHECK THE VALUE IN THE Z180 RELOAD REGISTER LOW. IF IT IS ASCII 'W', ; THEN IT MEANS THE S100 MONITOR IS ATTEMPTING TO REBOOT INTO ROMWBW -; HBIOS. +; HBIOS AND WE ABORT THE TRANSITION TO THE S100 MONITOR. ; #IF ((PLATFORM == PLT_S100) & TRUE) ; CHECK S100 BOARD DIP SWITCH, BIT 1 @@ -1734,6 +1772,10 @@ S100MON_SKIP: OUT0 (Z180_RLDR1L),A #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; RTC LATCH INITIALIZATION +;-------------------------------------------------------------------------------------------------- +; ; WE CAN NOW DO THE REAL INITIALIZATION OF THE RTC LATCH BASED ON ; (RTCDEFVAL). AT THIS POINT WE SHOULD HAVE ACCESS TO THE ROM LOCATION ; WHERE RTCDEFVAL IS STORED AND THE PROXY IS INSTALLED IN UPPER RAM @@ -1746,199 +1788,131 @@ S100MON_SKIP: OUT (RTCIO),A ; SET IT DIAG(1) ; REAPPLY CURRENT DIAG LED SETUP ; -#IFDEF TESTING +;-------------------------------------------------------------------------------------------------- +; DYNAMIC RAM SIZER (IN DEVELOPMENT) +;-------------------------------------------------------------------------------------------------- +; +#IFDEF SIZERAM ; ; THIS IS WHERE WE PROBE FOR THE ACTUAL NUMBER OF RAM ; BANKS AVAILABLE IN THE SYSTEM. THE PROBE CODE NEEDS ; TO BE COPIED TO AND RUN FROM THE COMMON RAM BANK. +; + + #IF (MEMMGR == MM_MBC) + ; MBC REQUIRES A BANK SELECT MASK TO BE SETUP IN THE MBC + ; BANK SELECT ROUTINE. HOWEVER, THE MASK IS DERIVED FROM THE + ; TOTAL SIZE OF THE RAM IN THE SYSTEM (SEE MBC BANK SELECT + ; MASK SETUP BELOW). SO, WE HAVE A CATCH-22 + ; HERE FOR MBC. THE DYNAMIC RAM SIZING REQUIRES THE THE MASK + ; AND THE MASK SETUP REQUIRES THE TOTAL RAM SIZE. SO, FOR MBC, + ; WE CAN'T DO DYNAMIC RAM SIZING. +; + .ECHO "*** ERROR: DYNAMIC RAM SIZING NOT POSSIBLE FOR MBC!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR + #ENDIF ; LD DE,$F000 LD HL,RS_IMAGE LD BC,RS_LEN LDIR CALL RS_START - JP RS_IMAGE + RS_LEN -; -; CODE THAT IS COPIED TO $F000 TO PERFORM RAM SIZE DETECTION -; -RS_IMAGE: - .ORG $F000 -RS_START: - LD A,(HB_CURBNK) ; GET CURRENT BANK - PUSH AF ; SAVE IT - - LD C,0 ; RUNNING BANK COUNT - LD HL,$7FFF ; BYTE TEST ADDRESS - LD IX,RS_ARY ; ORIG BYTE STORAGE ARRAY PTR -RS_LOOP1: - LD A,C - ADD A,$80 ; OFFSET BY START OF RAM BANKS - CALL HBX_BNKSEL ; SELECT THE BANK - - LD A,(HL) ; GET ORIGINAL VALUE - LD (IX),A ; SAVE IT TO RESTORE LATER - INC IX ; BUMP IX - - LD A,$AA ; TEST LOC WITH $AA - LD (HL),A ; AVOID PROBLEMS WITH - LD (HL),A ; ... DS1210 - LD (HL),A - LD A,(HL) - CP $AA - JR NZ,RS_DONE - - LD A,$55 ; TEST LOC WITH $55 - LD (HL),A - LD A,(HL) - CP $55 - JR NZ,RS_DONE - - ; STORE A UNIQUE VALUE - LD A,C - LD (HL),A - OR A ; ZERO? - JR Z,RS_NEXT ; SKIP STORED VALUE CHECK - - ; VERIFY ALL STORED VALUES - LD B,C ; INIT LOOP COUNTER - LD E,0 ; INIT BANK ID -RS_LOOP3: - LD A,E - ADD A,$80 - CALL HBX_BNKSEL - LD A,(HL) - CP E ; VERIFY - JR NZ,RS_DONE ; ABORT IF MISCOMPARE - INC E ; NEXT BANK - DJNZ RS_LOOP3 -; -RS_NEXT: - INC C ; ADD 1 TO RAM BANK COUNT - JR RS_LOOP1 ; AND LOOP TILL DONE -; -RS_DONE: - LD E,C ; FINAL BANK COUNT TO E - LD A,C - OR A - JR Z,RS_LOOPZ - ; RESTORE SAVED VALUES - LD IX,RS_ARY - LD B,C ; LOOP COUNT - LD C,$80 ; BANK ID -RS_LOOP2: - LD A,C - CALL HBX_BNKSEL - INC C - LD A,(IX) ; GET VALUE - LD (HL),A ; RESTORE IT - INC IX - DJNZ RS_LOOP2 ; ALL BANKS -RS_LOOPZ: -; -; MBC RUNTIME MEMORY SIZE ADJUSTMENT -; -; THE MBC RAM BOARD CAN CONTAIN 1 OR 2 RAM CHIPS. THEY CAN BE -; EITHER 128K OR 512K EACH. SO THE MBC RAM BOARD CAN HAVE A -; TOTAL OF 128K, 256K, 512K, OR 1024K. THE COMMON (HIMEM) RAM -; IS ALWAYS MAPPED TO THE LAST 32K OF THE FIRST CHIP ON THE BOARD. -; IF THERE ARE TWO CHIPS ON THE BOARD, THIS MEANS THE COMMON -; BANK WILL APPEAR IN THE "MIDDLE" OF THE PHYSICAL RAM BANKS. -; ROMWBW NEEDS THE COMMON BANK TO BE AT THE LAST BANK OF PHYSICAL -; RAM IN ORDER TO HAVE SEQUENTIAL RAM BANKS AVAILABLE FOR THE -; RAM DISK. TO WORK AROUND THIS, WE FLIP THE HIGH BIT OF THE -; BANK ID FOR AN MBC SYSTEM IFF IT HAS 2 CHIPS (256K OR 1024K). -; THE CODE BELOW GENERATES THE CORRECT MASK TO ACCOMPLISH THIS -; AND THEN POKES THE MASK INTO AN XOR INSTRUCTION IN THE MBC -; MEMORY MANAGER. -; - #IF (MEMMGR == MM_MBC) -; - ;LD HL,CB_RAMBANKS ; IN NUMBER OF RAMBANKS DETECTED FOR MBC - LD A,%11101011 ; IS 4 (128KB) OR 16 (512KB) THEN - ;AND (HL) ; ZERO THE LAST BANK MASK OTHERWISE - AND E ; ZERO THE LAST BANK MASK OTHERWISE - JR Z,MBC_SINGLE ; CALCULATE THE LAST BANK MASK (BANKS/2) - RRA ; 256K = %00000100, 1024K = %00010000 -MBC_SINGLE: - LD (HBX_MBCMSK),A -; - #ENDIF -; - ; RETURN TO ORIGINAL BANK - POP AF - CALL HBX_BNKSEL - LD A,E ; RETURN BANK COUNT - LD ($FFEA),A ; STASH HERE FOR A BIT - RET -; -RS_ARY .EQU $ -; -RS_LEN .EQU $ - RS_START - .ORG RS_IMAGE + RS_LEN -; -#ELSE + LD ($FFEA),A ; STASH HERE TO PRINT LATER +; +#ENDIF +; +;-------------------------------------------------------------------------------------------------- +; MBC BANK SELECT MASK SETUP +;-------------------------------------------------------------------------------------------------- +; +; THE MBC RAM BOARD CAN CONTAIN 1 OR 2 RAM CHIPS. THE COMMON RAM BANK IS +; FIXED BY HARDWARE TO BE THE TOP 32K OF THE *FIRST* RAM CHIP. WHEN THERE +; ARE 2 RAM CHIPS INSTALLED, THE HARDWARE WILL THUS PLACE THE COMMON RAM IN +; THE MIDDLE OF PHYSICAL RAM. HBIOS REQUIRES THAT THE COMMON RAM BANK BE +; MAPPED TO THE VERY LAST 32K OF PHYSICAL RAM. THIS IS REQUIRED SO THAT +; THE RAM DISK BANKS CAN BE SEQUENTIAL. TO WORK AROUND THIS, WE USE AN +; XOR MASK THAT IS APPLIED DURING BANK SELECT. THIS MASK WILL FLIP THE +; HIGH ORDER BANK SELECT BIT (WHEN 2 RAM CHIPS ARE USED) SO THAT THE TWO +; RAM CHIPS WIND UP "REVERSED" AND THE FIXED COMMON BANK WINDS UP AT THE +; END OF THE RAM BANKS. THE MASK IS SETUP HERE BASED ON THE NUMBER OF RAM +; CHIPS AND THEIR SIZE. NOTE THAT THE NUMBER OF RAM CHIPS IS INFERRED BY +; THE TOTAL RAM SIZE. A SINGLE CHIP WILL BE EITHER 128K OR 512K. IF THE +; TOTAL RAM SIZE OF THE SYSTEM IS 256K OR 1M, THEN THERE MUST BE TWO CH +; IPS. THE RESULTING BANK SELECT MASK IS INSERTED INTO THE MBC BANK +; SELECT ROUTINE. +; +#IF (MEMMGR == MM_MBC) ; -; MBC RUNTIME MEMORY SIZE ADJUSTMENT -; -; THE MBC RAM BOARD CAN CONTAIN 1 OR 2 RAM CHIPS. THEY CAN BE -; EITHER 128K OR 512K EACH. SO THE MBC RAM BOARD CAN HAVE A -; TOTAL OF 128K, 256K, 512K, OR 1024K. THE COMMON (HIMEM) RAM -; IS ALWAYS MAPPED TO THE LAST 32K OF THE FIRST CHIP ON THE BOARD. -; IF THERE ARE TWO CHIPS ON THE BOARD, THIS MEANS THE COMMON -; BANK WILL APPEAR IN THE "MIDDLE" OF THE PHYSICAL RAM BANKS. -; ROMWBW NEEDS THE COMMON BANK TO BE AT THE LAST BANK OF PHYSICAL -; RAM IN ORDER TO HAVE SEQUENTIAL RAM BANKS AVAILABLE FOR THE -; RAM DISK. TO WORK AROUND THIS, WE FLIP THE HIGH BIT OF THE -; BANK ID FOR AN MBC SYSTEM IFF IT HAS 2 CHIPS (256K OR 1024K). -; THE CODE BELOW GENERATES THE CORRECT MASK TO ACCOMPLISH THIS -; AND THEN POKES THE MASK INTO AN XOR INSTRUCTION IN THE MBC -; MEMORY MANAGER. + ; ALTHOUGH DYNAMIC SYSTEM RAM SIZING IS NOT POSSIBLE FOR MBC + ; (SEE COMMENTS ABOVE), WE ARE STILL DOING THE MASK SETUP + ; DYNAMICALLY. THIS IS SIMPLY IN CASE WE EVER FIND A WAY TO + ; DYNAMICALLY SIZE THE RAM IN AN MBC SYSTEM. + ; + ; 128K: %00000000 ; 1 CHIP, FLIP NO BITS + ; 256K: %00000100 ; 2 CHIPS, 8 BANKS, FLIP BIT 2 + ; 512K: %00000000 ; 1 CHIP, FLIP NO BITS + ; 1024K: %00010000 ; 2 CHIPS, 32 BANKS, FLIP BIT 4 + ; + ; IF NUMBER OF RAMBANKS DETECTED FOR MBC IS 4 (128KB) OR + ; 16 (512KB) THEN ZERO THE BANK MASK, OTHERWISE CALCULATE + ; THE BANK MASK AS BANKS/2. ; - #IF (MEMMGR == MM_MBC) - LD HL,CB_RAMBANKS ; IF NUMBER OF RAMBANKS DETECTED FOR MBC - LD A,%11101011 ; IS 4 (128KB) OR 16 (512KB) THEN - AND (HL) ; ZERO THE LAST BANK MASK OTHERWISE - JR Z,MBC_SINGLE ; CALCULATE THE LAST BANK MASK (BANKS/2) - RRA ; 256K = %00000100, 1024K = %00010000 + LD A,(CB_RAMBANKS) + LD E,A + LD A,%11101011 + AND E + JR Z,MBC_SINGLE + RRA MBC_SINGLE: - LD (HBX_MBCMSK),A - #ENDIF + LD (HBX_MBCMSK),A ; #ENDIF ; -; INSTALL HBIOS IN RAM BANK +;-------------------------------------------------------------------------------------------------- +; HBIOS TRANSITION TO RAM +;-------------------------------------------------------------------------------------------------- ; - LD A,(HB_CURBNK) +; COPY OURSELVES TO HBIOS BANK IN RAM +; + LD A,(HB_CURBNK) ; GET CURRENT BANK ID ; - ; CHECK TO SEE IF WE ARE ALREADY RUNNING IN THE HBIOS + ; CHECK TO SEE IF WE ARE ALREADY RUNNING IN THE HBIOS RAM ; BANK AND SKIP THE COPY IF SO (DON'T COPY OVER OURSELVES). ; THIS SITUATION OCCURS ON A ROMLESS STARTUP OR WHEN DOING A ; FULL RESTART OF A SYSTEM USING THE EXISTING HBIOS COPY. ; NOTE THAT THIS TEST WORKS BECAUSE BID_BIOS == BID_BOOT ; IN THESE SCENARIOS. - CP BID_BIOS - JR Z,HB_START1 -; - LD (HB_SRCBNK),A - LD A,BID_BIOS - LD (HB_DSTBNK),A - LD HL,0 - LD DE,0 - LD BC,$8000 + CP BID_BIOS ; SAVE AS BIOS BANK? + JR Z,HB_START1 ; IF SO, SKIP +; + LD (HB_SRCBNK),A ; CURRENT BANK IS SOURCE + LD A,BID_BIOS ; GET BIOS BANK ID + LD (HB_DSTBNK),A ; ... AND MAKE IT THE DESTINATION + LD HL,0 ; START FROM ADDRESS ZERO + LD DE,0 ; SAME FOR DESTINATION + LD BC,$8000 ; COPY ENTIRE 32KB BANK #IF (MEMMGR == MM_Z280) - CALL Z280_BNKCPY + ; WE CANNOT USE HBX_BNKCPY FOR Z280 BECAUSE HBX_BNKCPY WILL + ; SYSCALL Z280_BNKCPY. SYSCALL IS NOT SAFE YET BECAUSE THE + ; Z280 IVT ADDRESS HAS NOT BEEN SETUP. + CALL Z280_BNKCPY ; HANDLE Z280 SPECIAL #ELSE - CALL HBX_BNKCPY + CALL HBX_BNKCPY ; ELSE NORMAL BANK COPY #ENDIF ; ; TRANSITION TO HBIOS IN RAM BANK ; #IF (MEMMGR == MM_Z280) + ; Z280 NEEDS TO BE HANDLED SPECIAL BECAUSE WE ARE SWITCHING + ; THE SYSTEM MODE BANK, NOT THE NORMAL USER MODE BANK. LD A,BID_BIOS LD B,$10 ; FIRST SYSTEM PDR CALL Z280_BNKSEL JR HB_START1 #ELSE + ; JUST DOING A BANK CALL TO THE RAM BANK BANK. IF THIS IS A + ; ROMLESS BOOT OR AN IN-PLACE HBIOS RESTART, WE ARE ALREADY + ; RUNNING IN BID_BIOS BANK. HOWEVER, THIS WILL DO NO HARM. LD A,BID_BIOS ; BIOS BANK ID LD IX,HB_START1 ; EXECUTION RESUMES HERE CALL HBX_BNKCALL ; CONTINUE IN RAM BANK, DO NOT RETURN @@ -1965,16 +1939,8 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK LD A,H ; GET FIRST BYTE PUSHED LD (HB_BATCOND),A ; ... AND SAVE AS BAT COND ; -#IF (MEMMGR == MM_Z280) - ; NOW POINT TO RAM COPY OF Z280 INT/TRAP TABLE - ; HL IS TOP 16 BITS OF PHYSICAL ADDRESS OF IVT - ; IVT *MUST* BE ON A 4K BOUNDARY - LD C,Z280_VPR - LD HL,0 + (((PBANK(BID_BIOS) << 15) + Z280_IVT) >> 8) - LDCTL (C),HL -#ENDIF -; ; IF APPBOOT, WE NEED TO FIX UP A FEW THINGS IN PAGE ZERO +; ;;; SHOULD THIS BE DONE FOR AN HBIOS RESTART IN PLACE??? ; #IFDEF APPBOOT ; @@ -2036,67 +2002,32 @@ CB_IDS: LD (HL),A ; POPULATE CB_BIDCOM ; #ENDIF ; -;================================================================================================== -; RECOVERY MODE -;================================================================================================== -; -; PLATFORM SPECIFIC CODE FOR DETECTING RECOVERY MODE SWITCH -; -#IF (BT_REC_TYPE != BT_REC_NONE) - #IF (BT_REC_TYPE == BT_REC_FORCE) - LD A,1 ; SET FOR RECOVERY MODE - LD (HB_BOOT_REC),A ; SAVE FOR LATER - #ENDIF - #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) - #IF (BT_REC_TYPE == BT_REC_SBC01) - LD A,%00100000 ; DISABLE RTC AND - OUT (RTCIO),A ; DRQ DRIVER READ - IN A,(RTCIO) ; BIT 0 (DRQ). - CPL ; PULLED HIGH - AND 1 ; IS RECOVERY MODE - LD (HB_BOOT_REC),A ; SAVE FOR LATER - #ENDIF - #IF (BT_REC_TYPE == BT_REC_SBC1B) - IN A,(RTCIO) ; RTC PORT, BIT 6 HAS THE - BIT 6,A ; STATE OF CONFIG JUMPER - LD A,1 ; JUMPER INSTALLED - JR Z,SAVE_REC_M ; IS RECOVERY MODE - LD A,0 -SAVE_REC_M: - LD (HB_BOOT_REC),A ; SAVE FOR LATER - #ENDIF - #IF (BT_REC_TYPE == BT_REC_SBCRI) - IN A,($68 + 6) ; UART_MSR MODEM - BIT 6,A ; STATUS REGISTER - LD A,0 ; BIT 6 - JR Z,SAVE_REC_M ; IS RECOVERY MODE - LD A,1 -SAVE_REC_M: - LD (HB_BOOT_REC),A ; SAVE FOR LATER - #ENDIF - #ENDIF -#ENDIF -; - FPLEDS(DIAG_04) -; -#IF (WBWDEBUG == USEMIO) ; BUFFER OUTPUT UNTIL - CALL MIO_INIT ; WE GET TO BOOT MESSAGE -#ENDIF -; -#IF FALSE +; CLEAR DISPATCH TABLE ENTRIES ; -; TEST DEBUG *************************************************************************************** + XOR A ; ZERO + LD (CIO_CNT),A ; CIO DEVICES + LD (DIO_CNT),A ; DIO DEVICES + LD (VDA_CNT),A ; VDA DEVICES + LD (SND_CNT),A ; SND DEVICES + LD (RTC_DISPACT),A ; RTC DEVICE + LD (DSKY_DISPACT),A ; DSKY DEVICE ; - PRTS("DEBUG-IM1INT$") - LD DE,HB_IM1INT - CALL DUMP_BUFFER - CALL NEWLINE +; INITIALIZE HEAP STORAGE ; -; TEST DEBUG *************************************************************************************** + ; INITIALIZE POINTERS + LD HL,HB_END ; HEAP FOLLOWS HBIOS CODE + LD (CB_HEAP),HL ; INIT HEAP BASE ADDRESS + LD (CB_HEAPTOP),HL ; INIT HEAP TOP ADDRESS + ; CLEAR HEAP + LD BC,BNKTOP - HB_END ; MAX SIZE OF HEAP + LD A,$FF ; FILL WITH $FF + CALL FILL ; DO IT ; -#ENDIF + FPLEDS(DIAG_04) ; -; DISCOVER CPU TYPE +;-------------------------------------------------------------------------------------------------- +; CPU TYPE DISCOVERY +;-------------------------------------------------------------------------------------------------- ; ; SOME OF THIS CODE IS DERIVED FROM UNA BY JOHN COFFMAN ; @@ -2151,22 +2082,28 @@ HB_CPU1: LD A,L LD (HB_CPUTYPE),A ; -; CLEAR DISPATCH TABLE ENTRIES +;-------------------------------------------------------------------------------------------------- +; EARLY DRIVER INITIALIZATION +;-------------------------------------------------------------------------------------------------- ; - XOR A ; ZERO - LD (CIO_CNT),A ; CIO DEVICES - LD (DIO_CNT),A ; DIO DEVICES - LD (VDA_CNT),A ; VDA DEVICES - LD (SND_CNT),A ; SND DEVICES - LD (RTC_DISPACT),A ; RTC DEVICE - LD (DSKY_DISPACT),A ; DSKY DEVICE +; SOME DRIVERS NEED TO BE CALLED AS EARLY AS WE CAN ONE AN OPERATING +; ENVIRONMENT IS ESTABLISHED. ; #IF (SN76489ENABLE) + ; SN76489 CHIP GENERATES UGLY NOISE AFTER HARDWARE RESET. + ; WE CALL THIS DRIVER'S PREINIT ASAP TO SHUT OFF THE NOISE. CALL SN76489_PREINIT #ENDIF #IF (DSRTCENABLE) + ; THE DSRTC NEEDS TO BE INITIALIZED IN ORDER TO PERFROM THE + ; CPU SPEED DETECTION BELOW. CALL DSRTC_PREINIT #ENDIF +; +;-------------------------------------------------------------------------------------------------- +; DSKY INITIALIZATION AND ANNOUNCEMENT +;-------------------------------------------------------------------------------------------------- +; #IF (DSKYENABLE) #IF (ICMENABLE) CALL ICM_PREINIT @@ -2177,9 +2114,8 @@ HB_CPU1: #IF (H8PENABLE) CALL H8P_PREINIT #ENDIF -#ENDIF ; -#IF (DSKYENABLE) + ; ANNOUNCE OURSELVES ON DSKY LD HL,MSG_HBVER + 5 LD A,(DSKY_HEXMAP + RMJ) OR $80 @@ -2195,21 +2131,6 @@ HB_CPU1: LD B,BF_DSKYSHOWSEG CALL DSKY_DISPATCH #ENDIF -; -#IF (PLATFORM == PLT_NABU) - CALL NABU_PREINIT -#ENDIF -; -#IF (SKZENABLE) -; - ; SET THE SK Z80-512K UART CLK2 DIVIDER AS - ; CONFIGURED. NOTE THAT THIS IMPLICITLY - ; CLEARS THE WATCHDOG BIT. THE WATCHDOG - ; WILL BE ENABLED LATER IF CONFIGURED. - LD A,SKZDIV ; GET DIVIDER CODE - OUT ($6D),A ; IMPLEMENT IT -; -#ENDIF ; FPLEDS(DIAG_05) ; @@ -2218,16 +2139,16 @@ HB_CPU1: LD HL,CPUOSC / 1000 ; OSC SPD IN KHZ LD (HB_CPUOSC),HL ; INIT HB_CPUOSC DEFAULT ; -; ATTEMPT DYNAMIC CPU SPEED DERIVATION -; NOTE THAT FOR PLATFORMS WITH SOFTWARE SELECTABLE CPU SPEED, -; THIS IS BEING DONE WITH THE CPU SPEED SET TO THE LOWEST -; POSSIBLE SETTING. THE FINAL CPU SPEED WILL BE ADJUSTED -; LATER. + ; ATTEMPT DYNAMIC CPU SPEED DERIVATION + ; NOTE THAT FOR PLATFORMS WITH SOFTWARE SELECTABLE CPU SPEED, + ; THIS IS BEING DONE WITH THE CPU SPEED SET TO THE LOWEST + ; POSSIBLE SETTING. THE FINAL CPU SPEED WILL BE ADJUSTED + ; LATER. ; CALL HB_CPUSPD ; DYNAMIC CPU SPEED DETECTION JR NZ,HB_CPU2 ; SKIP AHEAD IF FAILED ; -; RECORD THE UPDATED CPU OSCILLATOR SPEED + ; RECORD THE UPDATED CPU OSCILLATOR SPEED ; #IF ((CPUFAM == CPU_Z180) | (CPUSPDCAP == SPD_HILO)) ; SPEED MEASURED WILL BE HALF OSCILLATOR SPEED @@ -2240,14 +2161,15 @@ HB_CPU1: ; HB_CPU2: ; -; INIT CPUKHZ BASED ON OSCILLATOR SPEED -; - LD HL,(HB_CPUOSC) +;-------------------------------------------------------------------------------------------------- +; FINALIZE OPERATING CPU SPEED +;-------------------------------------------------------------------------------------------------- ; ; TRANSITION TO FINAL DESIRED CPU SPEED FOR THOSE PLATFORMS ; THAT SUPPORT SOFTWARE SELECTABLE CPU SPEED. UPDATE CB_CPUKHZ ; IN HCB AS WE DO THIS. ; + LD HL,(HB_CPUOSC) #IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_MBC)) #IF (CPUSPDDEF==SPD_HIGH) ; SET HIGH SPEED VIA RTC LATCH @@ -2338,9 +2260,15 @@ HB_CPU3: ADC A,C ; C -> A; ADD CF FOR ROUNDING LD (CB_CPUMHZ),A ; SAVE IT ; +;-------------------------------------------------------------------------------------------------- +; FINALIZE OPERATING WAIT STATES +;-------------------------------------------------------------------------------------------------- +; +; SET OPERATING WAIT STATE CONFIGURATION ON SYSTEMS THAT SUPPORT IT +; #IF (CPUFAM == CPU_Z180) ; - ; SET FINAL DESIRED WAIT STATES + ; SET FINAL DESIRED WAIT STATES PER CONFIG LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4) OUT0 (Z180_DCNTL),A ; @@ -2348,6 +2276,8 @@ HB_CPU3: ; #IF (CPUFAM == CPU_Z280) ; + ; SET FINAL DESIRED WAIT STATES PER CONFIG + ; BUS TIMING AND CONFIGURATION REGISTER LD C,Z280_BTCR ; BUS TIMING AND CONTROL REG LDCTL HL,(C) LD A,L ; PUT IN A @@ -2356,29 +2286,61 @@ HB_CPU3: OR Z280_MEMHIWAIT << 2 ; SET HIGH 8MB WAIT STATE BITS (HM) OR Z280_IOWAIT ; SET I/O WAIT STATE BITS LD L,A ; BACK TO L - LDCTL (C),HL + LDCTL (C),HL ; DO IT ; + ; BUS TIMING AND INITIALIZATION REGISTER LD C,Z280_BTIR ; BUS TIMING AND INIT REG LDCTL HL,(C) LD A,L ; PUT IN A AND %11110011 ; CLEAR LM FIELD OR Z280_MEMLOWAIT << 2 ; SET LOW 8MB WAIT STATE BITS LD L,A ; BACK TO L - LDCTL (C),HL + LDCTL (C),HL ; DO IT ; #ENDIF ; - LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT - CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY +;-------------------------------------------------------------------------------------------------- +; SK Z80-512K CLOCK INITIALIZATION +;-------------------------------------------------------------------------------------------------- ; -#IF ((INTMODE == 2) | ((INTMODE == 1) & (CPUFAM == CPU_Z180))) - ; SETUP Z80 IVT AND INT MODE 2 - LD A,HBX_IVT >> 8 ; SETUP HI BYTE OF IVT ADDRESS - LD I,A ; ... AND PLACE IT IN I REGISTER - - #IF (CPUFAM == CPU_Z180) - ; SETUP Z180 IVT - XOR A ; SETUP LO BYTE OF IVT ADDRESS +#IF (SKZENABLE) +; +;;; LOCATION OF THIS CODE??? +; + ; SET THE SK Z80-512K UART CLK2 DIVIDER AS + ; CONFIGURED. NOTE THAT THIS IMPLICITLY + ; CLEARS THE WATCHDOG BIT. THE WATCHDOG + ; WILL BE ENABLED LATER IF CONFIGURED. + LD A,SKZDIV ; GET DIVIDER CODE + OUT ($6D),A ; IMPLEMENT IT +; +#ENDIF +; +;-------------------------------------------------------------------------------------------------- +; INITIALIZE SPEED-COMPENSATED DELAY FUNCTIONS +;-------------------------------------------------------------------------------------------------- +; +;;; LOCATION OF THIS CODE??? +; + LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT + CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY +; +;-------------------------------------------------------------------------------------------------- +; INTERRUPT MANAGEMENT SETUP +;-------------------------------------------------------------------------------------------------- +; +; SETUP INTERRUPT VECTOR TABLE ADDRESS(ES) AND TRANSITION TO +; OPERATING INTERRUPT MODE. NOTE THAT INTERRUPTS REMAIN +; DISABLED AT THIS POINT. +; +#IF ((INTMODE == 2) | ((INTMODE == 1) & (CPUFAM == CPU_Z180))) + ; SETUP Z80 IVT AND INT MODE 2 + LD A,HBX_IVT >> 8 ; SETUP HI BYTE OF IVT ADDRESS + LD I,A ; ... AND PLACE IT IN I REGISTER + + #IF (CPUFAM == CPU_Z180) + ; SETUP Z180 IVT + XOR A ; SETUP LO BYTE OF IVT ADDRESS OUT0 (Z180_IL),A ; ... AND PLACE IN Z180 IL REGISTER #ENDIF @@ -2387,6 +2349,15 @@ HB_CPU3: #ENDIF #ENDIF ; +#IF (MEMMGR == MM_Z280) + ; NOW POINT TO RAM COPY OF Z280 INT/TRAP TABLE + ; HL IS TOP 16 BITS OF PHYSICAL ADDRESS OF IVT + ; IVT *MUST* BE ON A 4K BOUNDARY + LD C,Z280_VPR + LD HL,0 + (((PBANK(BID_BIOS) << 15) + Z280_IVT) >> 8) + LDCTL (C),HL +#ENDIF +; #IF (INTMODE == 3) ; ; SETUP Z280 INT A FOR VECTORED INTERRUPTS @@ -2394,10 +2365,15 @@ HB_CPU3: LD C,Z280_ISR LDCTL (C),HL ; + ; TRANSITION TO INTERRUPT MODE 3 IM 3 ; #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; SYSTEM TIME INITIALIZATION +;-------------------------------------------------------------------------------------------------- +; #IF (PLATFORM == PLT_SBC) ; #IF (HTIMENABLE) ; SIMH TIMER @@ -2411,35 +2387,6 @@ HB_CPU3: ; #ENDIF ; -; TEMPLATE FOR SETTING UP INTERRUPTS USING THE MBC/DUODYNE IM2 INTERRUPT -; PIN HEADERS. UPDATE HB_DUMMYx TO POINT TO THE INTERRUPT ROUTINE. -; IN STD.ASM ALLOCATE THE EQUIVALENT INT_IM2PHx INTERRUPT TABLE ENTRY NUMBER. -; -; -; LD HL,HB_DUMMY0 -; LD (IVT(INT_IM2PH0)),HL -; -; LD HL,HB_DUMMY1 -; LD (IVT(INT_IM2PH1)),HL -; -; LD HL,HB_DUMMY2 -; LD (IVT(INT_IM2PH2)),HL -; -; LD HL,HB_DUMMY3 -; LD (IVT(INT_IM2PH3)),HL -; -; LD HL,HB_DUMMY4 -; LD (IVT(INT_IM2PH4)),HL -; -; LD HL,HB_DUMMY5 -; LD (IVT(INT_IM2PH5)),HL -; -; LD HL,HB_DUMMY6 -; LD (IVT(INT_IM2PH6)),HL -; -; LD HL,HB_DUMMY7 -; LD (IVT(INT_IM2PH7)),HL -; #IF (KIOENABLE) CALL KIO_PREINIT #ENDIF @@ -2448,11 +2395,16 @@ HB_CPU3: CALL CTC_PREINIT #ENDIF ; +#IF (PLATFORM == PLT_NABU) + CALL NABU_PREINIT +#ENDIF +; #IF (CPUFAM == CPU_Z180) ; #IF (INTMODE > 0) ; - ; MASK ALL EXTERNAL INTERRUPTS FOR NOW + ; FOR NOW, JUST ENABLE THE INT0 PIN WHICH IS GENERALLY + ; EQUIVALENT TO Z80 INTERRUPTS. LD A,$01 ; INT0 ENABLED, INT1-2 DISABLED OUT0 (Z180_ITC),A ; WRITE TO INT/TRAP CONTROL REGISTER ; @@ -2472,9 +2424,9 @@ HB_CPU3: ; ; Z180 PRESCALES THE COUNTER BY 20 SO, ; RLDR = CPU CLK / 20 / TICKFREQ - ; IF WE ASSUME TICKFREQ = 50, WE CAN SIMPIFY TO + ; IF WE ASSUME TICKFREQ = 50, WE CAN SIMPLIFY TO ; RLDR = CPU CLK / 1000 - ; NOW IF DIVIDE BOTH SIDES BY 1000, WE CAN USE + ; IF WE DIVIDE BOTH SIDES BY 1000, WE CAN USE ; CPUKHZ VALUE AND SIMPLIFY TO ; RLDR = CPUKHZ XOR A ; ALL BITS ZERO @@ -2533,18 +2485,15 @@ Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT ; #ENDIF ; -; INITIALIZE HEAP STORAGE + FPLEDS(DIAG_06) ; - ; INITIALIZE POINTERS - LD HL,HB_END ; HEAP FOLLOWS HBIOS CODE - LD (CB_HEAP),HL ; INIT HEAP BASE ADDRESS - LD (CB_HEAPTOP),HL ; INIT HEAP TOP ADDRESS - ; CLEAR HEAP - LD BC,BNKTOP - HB_END ; MAX SIZE OF HEAP - LD A,$FF ; FILL WITH $FF - CALL FILL ; DO IT +;-------------------------------------------------------------------------------------------------- +; PRE-CONSOLE INITIALIZATION +;-------------------------------------------------------------------------------------------------- ; - FPLEDS(DIAG_06) +#IF (WBWDEBUG == USEMIO) ; BUFFER OUTPUT UNTIL + CALL MIO_INIT ; WE GET TO BOOT MESSAGE +#ENDIF ; #IF FALSE ; @@ -2557,7 +2506,42 @@ Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT ; #ENDIF ; -; PRE-CONSOLE INITIALIZATION +; PLATFORM SPECIFIC CODE FOR DETECTING RECOVERY MODE SWITCH +; +#IF (BT_REC_TYPE != BT_REC_NONE) + #IF (BT_REC_TYPE == BT_REC_FORCE) + LD A,1 ; SET FOR RECOVERY MODE + LD (HB_BOOT_REC),A ; SAVE FOR LATER + #ENDIF + #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) + #IF (BT_REC_TYPE == BT_REC_SBC01) + LD A,%00100000 ; DISABLE RTC AND + OUT (RTCIO),A ; DRQ DRIVER READ + IN A,(RTCIO) ; BIT 0 (DRQ). + CPL ; PULLED HIGH + AND 1 ; IS RECOVERY MODE + LD (HB_BOOT_REC),A ; SAVE FOR LATER + #ENDIF + #IF (BT_REC_TYPE == BT_REC_SBC1B) + IN A,(RTCIO) ; RTC PORT, BIT 6 HAS THE + BIT 6,A ; STATE OF CONFIG JUMPER + LD A,1 ; JUMPER INSTALLED + JR Z,SAVE_REC_M ; IS RECOVERY MODE + LD A,0 +SAVE_REC_M: + LD (HB_BOOT_REC),A ; SAVE FOR LATER + #ENDIF + #IF (BT_REC_TYPE == BT_REC_SBCRI) + IN A,($68 + 6) ; UART_MSR MODEM + BIT 6,A ; STATUS REGISTER + LD A,0 ; BIT 6 + JR Z,SAVE_REC_M ; IS RECOVERY MODE + LD A,1 +SAVE_REC_M: + LD (HB_BOOT_REC),A ; SAVE FOR LATER + #ENDIF + #ENDIF +#ENDIF ; LD DE,HB_PCINITTBL ; POINT TO PRECONSOLE INIT TABLE LD B,HB_PCINITTBLLEN ; NUMBER OF ENTRIES @@ -2571,7 +2555,10 @@ Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT NOT_REC_M0: ; #ENDIF - CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE +; + ; CYCLE THROUGH THE INITIALIZATION TABLE CALLING THE PRE-INIT + ; ENTRY POINT OF ALL DRIVERS. + CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE ; #IF FALSE ; @@ -2587,7 +2574,12 @@ NOT_REC_M0: FPLEDS(DIAG_07) DIAG(3) ; +;-------------------------------------------------------------------------------------------------- +; BOOT DELAY +;-------------------------------------------------------------------------------------------------- ; +; IF CONFIGURED, AN ARBITRARY BOOT DELAY IS IMPLEMENTED HERE. THIS IS +; TYPICALLY USED TO DELAY ACCESSING DEVICES THAT WILL NOT BE READY. ; #IF (BOOT_DELAY > 100) .ECHO "*** ERROR: INVALID BOOT_DELAY (BOOT_DELAY > 100)!!!\n" @@ -2601,6 +2593,10 @@ HB_BOOTDLY: DJNZ HB_BOOTDLY ; LOOP TILL DONE #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; ACTIVATE BOOT CONSOLE +;-------------------------------------------------------------------------------------------------- +; ; PRIOR TO THIS POINT, CONSOLE I/O WAS NOT AVAILABLE UNLESS DIRECTED TO DEBUG OUTPUT I.E. XIO ; NOW THAT HBIOS IS READY, SET THE CONSOLE UNIT TO ACTIVATE CONSOLE I/O ; VIA HBIOS. @@ -2616,6 +2612,10 @@ HB_BOOTDLY: ; HB_CONRDY: ; +; SUPPRESS HARDWARE FLOW CONTROL TEMPORARILY, IF NEEDED. THIS IS +; GENERALLY NOT USED ANYMORE BECAUSE THE UART DRIVER NOW CHECKS FOR +; A VALID CTS SIGNAL AND ADJUSTS AS NEEDED. +; #IF (SUPCTS) ; ; MOST SERIAL PORTS ARE CONFIGURED WITH HARDWARE FLOW CONTROL ENABLED. @@ -2674,7 +2674,15 @@ NXTMIO: LD A,(HL) ; #ENDIF ; +;-------------------------------------------------------------------------------------------------- ; ANNOUNCE HBIOS +;-------------------------------------------------------------------------------------------------- +; +; DISPLAY A BANNER ON THE BOOT CONSOLE NOW. NOTE THAT WE INTENTIONALLY +; LEAVE INTERRUPTS DISABLED UNTIL A BIT LATER. SINCE INTERRUPTS CAN +; DESTABILIZE A SYSTEM, IT IS DIAGNOSTICALLY USEFUL TO GET SOMETHING +; DISPLAYED BEFORE INTRODUCING INTERRUPTS. IF THE SYSTEM CRASHES +; AFTER DISPLAYING THE BANNER, INTERRUPT INTEGRITY SHOULD BE SUSPECTED. ; PRTX(STR_BANNER) ; @@ -2700,9 +2708,12 @@ NOT_REC_M2: ; FPLEDS(DIAG_08) ; +;-------------------------------------------------------------------------------------------------- ; IO PORT SCAN +;-------------------------------------------------------------------------------------------------- ; #IF FALSE +; PSCN: LD C,0 ; IO PORT NUMBER LD B,0 ; LOOP COUNTER @@ -2727,20 +2738,36 @@ PSCNX .EQU $ + 1 CALL PRTHEXBYTE INC C DJNZ PSCN1 +; #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; CPU SPEED DETECTION ALIGNMENT TEST +;-------------------------------------------------------------------------------------------------- +; #IF FALSE +; +; IF ENABLED, THE CPU SPEED TEST WILL BE REPEATED INDEFINITELY. THIS +; IS USED TO ADJUST THE SPEED DETECTION LOOP. +; HB_SPDTST: CALL HB_CPUSPD ; CPU SPEED DETECTION CALL NEWLINE LD HL,(CB_CPUKHZ) CALL PRTD3M ; PRINT AS DECIMAL WITH 3 DIGIT MANTISSA JR HB_SPDTST +; #ENDIF +; +;-------------------------------------------------------------------------------------------------- +; ENABLE INTERRUPTS +;-------------------------------------------------------------------------------------------------- ; HB_EI ; INTERRUPTS SHOULD BE OK NOW ; +;-------------------------------------------------------------------------------------------------- ; DISPLAY PLATFORM INFORMATION +;-------------------------------------------------------------------------------------------------- ; CALL NEWLINE2 PRTX(STR_PLATFORM) @@ -2786,7 +2813,9 @@ HB_Z280BUS1: PRTS("MHz$") ; SUFFIX #ENDIF ; -; DISPLAY CPU CONFIG +;-------------------------------------------------------------------------------------------------- +; DISPLAY CPU CONFIGURATION +;-------------------------------------------------------------------------------------------------- ; CALL NEWLINE @@ -2866,7 +2895,9 @@ HB_Z280BUS1: CALL PRTSTRD .TEXT " MMU$" ; -; DISPLAY MEMORY CONFIG +;-------------------------------------------------------------------------------------------------- +; DISPLAY MEMORY CONFIGURATION +;-------------------------------------------------------------------------------------------------- ; CALL NEWLINE LD HL,ROMSIZE @@ -2891,12 +2922,15 @@ HB_Z280BUS1: LD HL,BNKTOP - HB_END CALL PRTHEXWORDHL ; -#IFDEF TESTING +#IFDEF SIZERAM ; CALL PRTSTRD .TEXT ", RAMBANKS=0x$" LD A,($FFEA) CALL PRTHEXBYTE +#ENDIF +; +#IFDEF TESTING ; CALL PRTSTRD .TEXT ", RTCDEF=0x$" @@ -2950,6 +2984,10 @@ HB_Z280BUS1: CALL PRTHEXBYTE #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; ROM CHECKSUM VERIFICATION +;-------------------------------------------------------------------------------------------------- +; #IFDEF ROMBOOT #IF (ROMSIZE > 0) ; @@ -3025,7 +3063,9 @@ HB_ROMCKZ: #ENDIF #ENDIF ; -; LOW BATTERY DIAGNOSTIC MESSAGE +;-------------------------------------------------------------------------------------------------- +; LOW RAM BATTERY MESSAGE +;-------------------------------------------------------------------------------------------------- ; #IF (BATCOND) LD A,(HB_BATCOND) @@ -3034,7 +3074,9 @@ HB_ROMCKZ: CALL Z,WRITESTR #ENDIF ; -; PERFORM DEVICE INITIALIZATION +;-------------------------------------------------------------------------------------------------- +; FINAL DEVICE INITIALIZATION +;-------------------------------------------------------------------------------------------------- ; CALL NEWLINE @@ -3053,6 +3095,10 @@ NOT_REC_M1: IS_REC_M1: CALL CALLLIST ; +;-------------------------------------------------------------------------------------------------- +; WATCHDOG ACTIVATION +;-------------------------------------------------------------------------------------------------- +; ; IF WATCHDOG FUNCTIONALITY IS REQUESTED, CHECK TO MAKE SURE ; WE ARE GETTING INTERRUPTS. IF SO, ENABLE THE WATCHDOG. ; @@ -3094,6 +3140,10 @@ HB_WDZ: ; #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; HEAP CURB INITIALIZATION +;-------------------------------------------------------------------------------------------------- +; ; RECORD HEAP CURB AT THE CURRENT VALUE OF HEAP TOP. HEAP CURB ; MARKS THE POINT IN THE HEAP AFTER WHICH MEMORY IS RELEASED ; WHEN AN HBIOS RESET IS PEFORMED. @@ -3101,7 +3151,15 @@ HB_WDZ: LD HL,(CB_HEAPTOP) LD (HEAPCURB),HL ; -; NOW SWITCH CONSOLES IF CONFIGURED +;-------------------------------------------------------------------------------------------------- +; FINAL CONSOLE ACTIVATION +;-------------------------------------------------------------------------------------------------- +; +; ON SOME SYSTEMS, THE OPERATING CONSOLE IS DIFFERENT THAT THE BOOT +; CONSOLE. FOR EXAMPLE, IF A VIDEO CONSOLE IS DESIRED. A VIDEO +; CONSOLE CANNOT BE USED AS A BOOT CONSOLE BECAUSE IT WILL NOT BE +; INITIALIZED EARLY ENOUGH. SO, IF DESIRED, WE SWITCH TO THE FINAL +; RUNNING CONSOLE HERE. ; LD A,(CB_CONDEV) ; GET CURRENT CONSOLE LD (HB_NEWCON),A ; AND INIT NEW CONSOLE VAR @@ -3241,10 +3299,21 @@ INITSYS3: LD DE,STR_BANNER ; POINT TO BANNER CALL NZ,WRITESTR ; OUTPUT IF CONSOLE MOVED ; +;-------------------------------------------------------------------------------------------------- +; PRINT DEVICE SUMMARY +;-------------------------------------------------------------------------------------------------- +; INITSYS3A: CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE ; -#IF 0 +;-------------------------------------------------------------------------------------------------- +; DIAGNOSTIC ROUTINES +;-------------------------------------------------------------------------------------------------- +; +; DIGANOSTIC ROUTINE TO EXERCISE THE Z280 BNKCPY CODE +; +#IF FALSE +; CALL NEWLINE CALL NEWLINE CALL NEWLINE @@ -3309,7 +3378,9 @@ INITSYS3A: ; #ENDIF ; -#IF 0 +; DIAGNOSTIC ROUTINE TO PLAY SERIES OF NOTES +; +#IF FALSE ; LD HL,0 CALL DBG_NOTE @@ -3346,12 +3417,20 @@ DBG_NOTE: ; #ENDIF ; +; DIAGNOSTIC ROUTINE TO PLAY A BEEP +; #IFDEF TESTING CALL SND_BEEP #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; TRANSITION TO USER LAND +;-------------------------------------------------------------------------------------------------- +; INITSYS4: ; +; IF Z280, WE NEED TO SWITCH TO USER MODE NOW. +; #IF (MEMMGR == MM_Z280) ; LEAVE SYSTEM MODE STACK POINTING TO THE RIGHT PLACE LD SP,HB_STACK ; DEDICATED HBIOS STACK LOC @@ -3384,55 +3463,41 @@ INITSYS4: CALL HBX_BNKCALL ; GO THERE HALT ; WE SHOULD NEVER COME BACK! ; -; CALL A LIST OF ROUTINES POINTED TO BY DE OF LENGTH B. -; -CALLLIST: - LD A,(DE) - LD L,A - INC DE - LD A,(DE) - LD H,A - INC DE - PUSH DE - PUSH BC - CALL JPHL - POP BC - POP DE - DJNZ CALLLIST -CALLDUMMY: - RET - -; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; TABLE OF RECOVERY MODE INITIALIZATION ENTRY POINTS -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; USE "CALLDUMMY" IF NO ENTRY REQUIRED ; #IF (BT_REC_TYPE != BT_REC_NONE) ; HB_PCINIT_REC: +; #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) .DW UART_PREINIT ; .DW CALLDUMMY #ENDIF +; HB_PCINITRLEN .EQU (($ - HB_PCINIT_REC) / 2) ; HB_INIT_REC: +; #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) .DW UART_INIT .DW MD_INIT .DW PPIDE_INIT #ENDIF +; HB_INITRLEN .EQU (($ - HB_INIT_REC) / 2) ; #ENDIF ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; TABLE OF PRE-CONSOLE INITIALIZATION ENTRY POINTS -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; HB_PCINITTBL: +; #IF (ASCIENABLE) .DW ASCI_PREINIT #ENDIF @@ -3469,12 +3534,13 @@ HB_PCINITTBL: .DW TERM_PREINIT ; ALWAYS DO THIS ONE ; HB_PCINITTBLLEN .EQU (($ - HB_PCINITTBL) / 2) - +; ;================================================================================================== ; TABLE OF INITIALIZATION ENTRY POINTS ;================================================================================================== ; HB_INITTBL: +; #IF (KIOENABLE) .DW KIO_INIT #ENDIF @@ -3636,25 +3702,31 @@ HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2) HB_SYSINIT_END .EQU $ ; ;================================================================================================== -; BIOS FUNCTION DISPATCHER +; BIOS FUNCTION DISPATCHER ;================================================================================================== ; -; MAIN BIOS FUNCTION -; B: FUNCTION -;__________________________________________________________________________________________________ -; HB_DISP_BEG .EQU $ ; +;-------------------------------------------------------------------------------------------------- +; HIGH LEVEL FUNCTION DISPATCHER +;-------------------------------------------------------------------------------------------------- +; +; JUMP TO FUNCTION GROUP SPECIFIC DISPATCHER. THE FUNCTION GROUP +; IS BASED ON THE TOP NIBBLE OF THE FUNCTION NUMBER. +; +; ENTRY: B=FUNCTION +; HB_DISPATCH: ; #IF (MEMMGR == MM_Z280) ; FOR Z280 MEMMGR, WE DISPATCH VIA THE Z280 SYSCALL. - ; THE SYSCALL MECHANISM WILL CLEAR INTERRUPTS. IN + ; THE SYSCALL MECHANISM WILL DISABLE INTERRUPTS. IN ; GENERAL, INTERRUPTS ARE OK DURING API PROCESSING, ; SO ENABLE THEM HERE. HB_EI #ENDIF ; +; STACK INTEGRITY DIAGNOSTIC CHECK ; #IF FALSE ; *DEBUG* START ; @@ -3669,6 +3741,7 @@ HB_DISPATCH: LD (HB_STACK - HB_STKSIZ + $08),A POP AF RET +; HB_DISPATCH1: ; #ENDIF ; *DEBUG* END @@ -3695,9 +3768,9 @@ HB_DISPERR: SYSCHKERR(ERR_NOFUNC) RET ; -;================================================================================================== -; CHARACTER I/O DEVICE FUNCTION DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; CHARACTER I/O DEVICE FUNCTION DISPATCHER +;-------------------------------------------------------------------------------------------------- ; ; ROUTE CALL TO SPECIFIED CHARACTER I/O DRIVER ; B: FUNCTION @@ -3750,9 +3823,9 @@ CIO_SIZ .EQU CIO_MAX * 4 ; EACH ENTRY IS 4 BYTES CIO_CNT .DB 0 ; ENTRY COUNT PREFIX CIO_TBL .FILL CIO_SIZ,0 ; SPACE FOR ENTRIES ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; DISK I/O DEVICE FUNCTION DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; ROUTE CALL TO SPECIFIED DISK I/O DRIVER ; B: FUNCTION @@ -3813,9 +3886,11 @@ DIO_SIZ .EQU DIO_MAX * 4 ; EACH ENTRY IS 4 BYTES DIO_CNT .DB 0 ; ENTRY COUNT PREFIX DIO_TBL .FILL DIO_SIZ,0 ; SPACE FOR ENTRIES ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; DISK READ HELPER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; +;;; RELOCATE THIS CODE??? ; ; IMPLEMENTS MULTI SECTOR READS AND I/O TO/FROM ; BANKED RAM VIA BOUNCE BUFFER @@ -3848,7 +3923,7 @@ HB_DSKREAD0: LD (HB_DSKBIT),A ; SAVE IT FOR DIAGNOSTICS #ENDIF ; -#IF 1 +#IF TRUE ; CHECK TO SEE IF INTER-BANK I/O NEEDED. BIT 7,H ; TGT BUF IN UPPER 32K? JP NZ,HB_DSKIO ; IF SO, NON-BANKED @@ -3857,7 +3932,7 @@ HB_DSKREAD0: JP Z,HB_DSKIO ; IF SO, NON-BANKED #ENDIF ; -#IF 1 +#IF TRUE ; RAM BANK RANGE CHECK LD A,D ; GET TGT BANK CP BID_RAMN ; BANK IN RANGE 0-N? @@ -3904,9 +3979,9 @@ HB_DSKREADX: LD HL,(HB_IOBUF) ; NEXT BUF ADR JR HB_DSKIOX ; DONE ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; DISK WRITE HELPER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; IMPLEMENTS MULTI SECTOR WRITES AND I/O TO/FROM ; BANKED RAM VIA BOUNCE BUFFER @@ -3938,7 +4013,7 @@ HB_DSKWRITE0: LD (HB_DSKBIT),A ; SAVE IT FOR DIAGNOSTICS #ENDIF ; -#IF 1 +#IF TRUE ; CHECK TO SEE IF INTER-BANK I/O NEEDED. BIT 7,H ; TGT BUF IN UPPER 32K? JP NZ,HB_DSKIO ; IF SO, NON-BANKED @@ -3947,7 +4022,7 @@ HB_DSKWRITE0: JP Z,HB_DSKIO ; IF SO, NON-BANKED #ENDIF ; -#IF 1 +#IF TRUE ; RAM BANK RANGE CHECK LD A,D ; GET TGT BANK CP BID_RAMN ; BANK IN RANGE 0-N? @@ -3993,9 +4068,9 @@ HB_DSKWRITEX: LD HL,(HB_IOBUF) ; NEXT BUF ADR JR HB_DSKIOX ; DONE ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; NON-BANKED DISK READ/WRITE -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; HB_DSKIO: ; @@ -4020,6 +4095,10 @@ HB_DSKIOX: OR A ; SET RESULT FLAGS RET ; DONE ; +;-------------------------------------------------------------------------------------------------- +; INVOKE DRIVER DISK I/O FUNCTION +;-------------------------------------------------------------------------------------------------- +; HB_DSKFN: PUSH BC ; SAVE COUNTERS #IF (FPLED_ENABLE & FPLED_DSKACT) @@ -4048,12 +4127,9 @@ HB_DSKCMD: HB_DSKUNIT .DB 0 ; CURRENT DISK UNIT HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) -; -;================================================================================================== -; DSKY DISK ACTIVITY MONITOR -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; DSKY DISK ACTIVITY MONITOR +;-------------------------------------------------------------------------------------------------- ; ; THIS FUNCTION IS CALLED BY DISK DRIVERS JUST PRIOR TO ; THE START OF A DISK I/O OPERATION. @@ -4069,6 +4145,9 @@ HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION ; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN) ; ALL REGISTERS PERSERVED ; +#IF (DSKYENABLE) + #IF (DSKYDSKACT) +; HB_DSKACT: ; SAVE EVERYTHING PUSH AF @@ -4139,9 +4218,9 @@ HB_DSKACTCHS: #ENDIF #ENDIF ; -;================================================================================================== -; REAL TIME CLOCK DEVICE DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; REAL TIME CLOCK DEVICE DISPATCHER +;-------------------------------------------------------------------------------------------------- ; ; ROUTE CALL TO REAL TIME CLOCK DRIVER ; B: FUNCTION @@ -4166,14 +4245,12 @@ RTC_SETDISP: LD (RTC_DISPACT),A ; SAVE IT RET ; AND DONE ; -; -; RTC_DISPADR .DW RTC_DISPERR ; RTC DISPATCH ADDRESS RTC_DISPACT .DB 0 ; SET WHEN DISPADR SET ; -;================================================================================================== -; DSKY DEVICE DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; DSKY DEVICE DISPATCHER +;-------------------------------------------------------------------------------------------------- ; ; ROUTE CALL TO DSKY DRIVER ; B: FUNCTION @@ -4198,8 +4275,6 @@ DSKY_SETDISP: LD (DSKY_DISPACT),A ; SAVE IT RET ; AND DONE ; -; -; DSKY_DISPADR .DW DSKY_DISPERR ; DSKY DISPATCH ADDRESS DSKY_DISPACT .DB 0 ; SET WHEN DISPADR SET ; @@ -4245,12 +4320,10 @@ VDA_SIZ .EQU VDA_MAX * 4 ; EACH ENTRY IS 4 BYTES .DB VDA_MAX ; MAX ENTRY COUNT TABLE PREFIX VDA_CNT .DB 0 ; ENTRY COUNT PREFIX VDA_TBL .FILL VDA_SIZ,0 ; SPACE FOR ENTRIES - -; ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; SOUND ADAPTER DEVICE DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; ROUTE CALL TO SPECIFIED SOUND DEVICE DRIVER ; B: FUNCTION @@ -4258,10 +4331,10 @@ VDA_TBL .FILL VDA_SIZ,0 ; SPACE FOR ENTRIES ; SND_DISPATCH: PUSH IY ; SAVE INCOMING IY - +; LD IY, SND_TBL ; POINT IY TO START OF DIO TABLE CALL HB_DISPCALL ; GO TO GENERIC API CALL CODE - +; POP IY ; RESTORE IY RET ; AND DONE ; @@ -4291,9 +4364,11 @@ SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES SND_CNT .DB 0 ; ENTRY COUNT PREFIX SND_TBL .FILL SND_SIZ,0 ; SPACE FOR ENTRIES ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; SPEAKER BEEP ROUTINE -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; +;;; RELOCATE ; ; ROUTINE TO BEEP THE DEFAULT SOUND UNIT ; NEED TO CHECK FOR EXISTENCE OF SOUND UNIT @@ -4334,9 +4409,9 @@ SND_BEEP: CALL SND_DISPATCH ; DO IT RET ; DONE ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; SYSTEM FUNCTION DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; B: FUNCTION ; @@ -4378,6 +4453,10 @@ HB_DISP_END .EQU $ ; HB_SYSAPI_BEG .EQU $ ; +;-------------------------------------------------------------------------------------------------- +; SYSTEM RESET +;-------------------------------------------------------------------------------------------------- +; ; RESTART SYSTEM ; SUBFUNCTION IN C ; @@ -4506,6 +4585,10 @@ SYS_RESUSER2: ; RET ; ELSE RETURN WITH USER RESET VECTOR IN HL ; +;-------------------------------------------------------------------------------------------------- +; SYSTEM VERSION +;-------------------------------------------------------------------------------------------------- +; ; GET THE CURRENT HBIOS VERSION ; ON INPUT, C=0 ; RETURNS VERSION IN DE AS BCD @@ -4519,6 +4602,10 @@ SYS_VER: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; SET BANK +;-------------------------------------------------------------------------------------------------- +; ; 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 @@ -4528,7 +4615,7 @@ SYS_SETBNK: #IF (MEMMGR == MM_Z280) ; FOR Z280 MEMMGR, WE ARE IN SYSTEM MODE HERE, SO WE CAN UPDATE ; THE USER MODE BANK WITHOUT IMPACTING THE RUNNING CODE. IT - ; TAKE EFFECT UPON RETURN TO USER MODE. + ; WILL TAKE EFFECT UPON RETURN TO USER MODE. LD A,(HB_INVBNK) ; GET PREVIOUS BANK PUSH AF ; SAVE IT LD A,C ; NEW BANK TO A @@ -4550,7 +4637,9 @@ SYS_SETBNK: RET ; DONE #ENDIF ; -; GET ACTIVE MEMORY BANK +;-------------------------------------------------------------------------------------------------- +; GET BANK +;-------------------------------------------------------------------------------------------------- ; SYS_GETBNK: LD A,(HB_INVBNK) ; GET THE ACTIVE MEMORY BANK @@ -4558,6 +4647,10 @@ SYS_GETBNK: XOR A ; SIGNAL SUCCESS RET ; +;-------------------------------------------------------------------------------------------------- +; SETUP INTERBANK COPY +;-------------------------------------------------------------------------------------------------- +; ; SET BANKS AND LENGTH FOR INTERBANK MEMORY COPY (BNKCPY) ; ENTRY: E=SOURCE BANK ID ; D=DEST BANK ID @@ -4572,6 +4665,10 @@ SYS_SETCPY: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; PERFORM INTERBANK COPY +;-------------------------------------------------------------------------------------------------- +; ; PERFORM MEMORY COPY POTENTIALLY ACROSS BANKS ; ENTRY: HL=SOURCE ADDRESS ; DE=DESTINATION ADDRESS @@ -4586,6 +4683,10 @@ SYS_BNKCPY: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; ALLOCATE HEAP SPACE +;-------------------------------------------------------------------------------------------------- +; ; ALLOCATE HL BYTES OF MEMORY FROM HBIOS HEAP ; RETURNS POINTER TO ALLOCATED MEMORY IN HL ; ON SUCCESS RETURN A == 0, AND Z SET @@ -4595,6 +4696,10 @@ SYS_BNKCPY: SYS_ALLOC: JP HB_ALLOC ; +;-------------------------------------------------------------------------------------------------- +; FREE HEAP SPACE +;-------------------------------------------------------------------------------------------------- +; ; FREE HEAP MEMORY BY SIMPLY RELEASING ALL ; MEMORY BEYOND POINTER IN HL. ; ON SUCCESS RETURN A == 0, AND Z SET @@ -4605,6 +4710,10 @@ SYS_FREE: SYSCHKERR(ERR_NOTIMPL) ; NOT YET IMPLEMENTED RET ; +;-------------------------------------------------------------------------------------------------- +; GET SYSTEM INFORMATION +;-------------------------------------------------------------------------------------------------- +; ; GET SYSTEM INFORMATION ; ITEM TO RETURN INDICATED IN C ; @@ -4979,6 +5088,10 @@ SYS_GETAPPBNKS: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; SET SYSTEM PARAMETERS +;-------------------------------------------------------------------------------------------------- +; ; SET SYSTEM PARAMETERS ; PARAMETER(S) TO SET INDICATED IN C ; @@ -5074,8 +5187,8 @@ SYS_SETCPUSPD1: CP 1 ; CHECK FOR 1 (FULL SPEED) JR Z,SYS_SETCPUSPD2 ; IF SO, ALL DONE ; ADJUST HL TO REFLECT HALF SPEED OPERATION - SRL H ; ADJUST HL ASSUMING - RR L ; HALF SPEED OPERATION + SRL H ; ADJUST HL ASSUMING + RR L ; HALF SPEED OPERATION ; SYS_SETCPUSPD2: ; @@ -5286,6 +5399,10 @@ SYS_SETPANEL: RET #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; INTERBANK MEMORY PEEK +;-------------------------------------------------------------------------------------------------- +; ; RETURN A BYTE OF MEMORY FROM SPECIFIED BANK ; ENTRY: D=BANK ID, HL=ADDRESS ; RETURN: E=BYTE VALUE @@ -5324,6 +5441,10 @@ SYS_PEEK: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; INTERBANK MEMORY POKE +;-------------------------------------------------------------------------------------------------- +; ; WRITE A BYTE OF MEMORY TO SPECIFIED BANK ; ENTRY: D=BANK ID, HL=ADDRESS IN HBIOS BANK, E=BYTE VALUE ; @@ -5361,6 +5482,10 @@ SYS_POKE: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; INTERRUPT MANAGEMENT FUNCTIONS +;-------------------------------------------------------------------------------------------------- +; ; INTERRUPT MANAGEMENT FUNCTIONS ; SUBFUNCTION IN C ; @@ -5562,6 +5687,7 @@ Z280_IVT: .DW HBX_IV0D .DW HBX_IV0E .DW HBX_IV0F +; ; THE REMAINDER OF THE Z280 IVT IS TRUNCATED HERE BECAUSE IT ; TAKES A BUNCH OF SPACE AND IS NOT USED. WE SUPPORT ONLY ; 16 VECTORED INTERRUPTS AND THEY MUST BE CONNECTED TO INTA. @@ -5571,24 +5697,91 @@ Z280_IVT: HB_Z280IVT_END .EQU $ ; ;================================================================================================== -; GLOBAL HBIOS FUNCTIONS +; GLOBAL INTERNAL HBIOS FUNCTIONS ;================================================================================================== ; HB_INTFUNC_BEG .EQU $ ; -; GLOBAL HBIOS IDLE PROCESSING IS DONE HERE. THIS ROUTINE SHOULD -; BE CALLED WHENEVER WAITING FOR USER INPUT. +;-------------------------------------------------------------------------------------------------- +; PRINT DECIMAL VALUE WITH 3 DIGIT MANTISSA +;-------------------------------------------------------------------------------------------------- ; -IDLE: - PUSH AF +; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000 +; +PRTD3M: PUSH BC PUSH DE PUSH HL - PUSH IY -#IF (FDENABLE) - CALL FD_IDLE -#ENDIF - POP IY + 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 +; +;-------------------------------------------------------------------------------------------------- +; INITIALIZATION VECTOR PROCESSING SUPPORT +;-------------------------------------------------------------------------------------------------- +; +; CALL A LIST OF ROUTINES POINTED TO BY DE OF LENGTH B. +; +CALLLIST: + LD A,(DE) + LD L,A + INC DE + LD A,(DE) + LD H,A + INC DE + PUSH DE + PUSH BC + CALL JPHL + POP BC + POP DE + DJNZ CALLLIST +CALLDUMMY: + RET +; +;-------------------------------------------------------------------------------------------------- +; GLOBAL IDLE PROCESSING +;-------------------------------------------------------------------------------------------------- +; +; GLOBAL HBIOS IDLE PROCESSING IS DONE HERE. THIS ROUTINE SHOULD +; BE CALLED WHENEVER WAITING FOR USER INPUT. +; +IDLE: + PUSH AF + PUSH BC + PUSH DE + PUSH HL + PUSH IY +#IF (FDENABLE) + CALL FD_IDLE +#ENDIF + POP IY POP HL POP DE POP BC @@ -5607,6 +5800,124 @@ CIO_IDLE: POP AF ; RECOVER AF RET ; +; SET HL TO IY+A, A IS TRASHED +; +LDHLIYA: + PUSH IY ; COPY INSTANCE DATA PTR + POP HL ; ... TO HL + ;JP ADDHLA ; APPLY OFFSET TO HL AND RETURN + ADD A,L ; ADD OFFSET TO LSB + LD L,A ; ... PUT BACK IN L + RET NC ; DONE IF CF NOT SET + INC H ; IF CF SET, BUMP MSB + RET ; ... AND RETURN +; +;-------------------------------------------------------------------------------------------------- +; CHS TO LBA CONVERSION +;-------------------------------------------------------------------------------------------------- +; +; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO +; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED +; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER. +; +; INPUT: HL=TRACK, D=HEAD, E=SECTOR +; OUTPUT: DE:HL=32 BIT LBA ADDRESS (D:7 IS NOT SET IN THE RESULT) +; +HB_CHS2LBA: +; + LD A,D ; HEAD TO A + RLCA ; LEFT SHIFT TO HIGH NIBBLE + RLCA ; ... DEPENDS ON HIGH + RLCA ; ... NIBBLE BEING 0 SINCE + RLCA ; ... IT ROTATES INTO LOW NIBBLE + OR E ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO) + LD D,0 + LD E,H + LD H,L + LD L,A + XOR A + RET +; +;-------------------------------------------------------------------------------------------------- +; SYSTEM CHECK / PANIC +;-------------------------------------------------------------------------------------------------- +; +; 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 +; +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 +; +; 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 +; +; ISSUE MESSAGE AND HALT SYSTEM +; +SYSHALT: + LD DE,STR_HALT + CALL WRITESTR + DI + HALT +; +;-------------------------------------------------------------------------------------------------- +; INTERRUPT MANAGEMENT SUPPORT +;-------------------------------------------------------------------------------------------------- +; #IF (INTMODE == 1) ; ; ROUTINE BELOW IS USED TO ADD A NEW VECTOR TO THE IM1 @@ -5626,20 +5937,18 @@ HB_ADDIM1: INC (HL) ; INCREMENT RET ; DONE ; -HB_IM1CNT .DB 0 ; NUMBER OF ENTRIES IN CALL LIST -HB_IM1MAX .DB 8 ; MAX ENTRIES IN CALL LIST -HB_IM1PTR .DW HB_IM1INT ; POINTER FOR NEXT IM1 ENTRY -; #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; DSKY SUPPORT +;-------------------------------------------------------------------------------------------------- +; #IF (DSKYENABLE) ; -;================================================================================================== ; CONVERT 32 BIT BINARY TO 8 BYTE HEX SEGMENT DISPLAY -;================================================================================================== ; -; HL: ADR OF 32 BIT BINARY -; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) +; HL: ADR OF 32 BIT BINARY +; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) ; DSKY_BIN2SEG: LD B,4 ; 4 BYTES OF INPUT @@ -5668,59 +5977,12 @@ DSKY_BIN2SEG_NIB: ; #ENDIF ; -; -; -#IF (MEMMGR == MM_Z280) -; -Z280_TIMINT: - ; DISCARD REASON CODE - INC SP - INC SP -; - ; SAVE INCOMING REGISTERS - PUSH AF - PUSH BC - PUSH DE - PUSH HL -; - ; CALL PRIMARY TIMER LOGIC ON EVERY OTHER INT - LD A,(Z280_TIMCTR) - XOR $FF - LD (Z280_TIMCTR),A - CALL Z,HB_TIMINT -; - ; SELECT I/O PAGE $FE (SAVING PREVIOUS VALUE) - LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER - LDCTL HL,(C) ; GET CURRENT I/O PAGE - PUSH HL ; SAVE IT - LD L,$FE ; NEW COUNTER/TIMER I/O PAGE - LDCTL (C),HL -; - ; CLEAR END OF COUNT CONDITION TO RESET INTERRUPT - IN A,(Z280_CT0_CMDST) ; GET STATUS - RES 1,A ; CLEAR CC - OUT (Z280_CT0_CMDST),A ; SET C/T 0 -; - ; RESTORE I/O PAGE - LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER - POP HL ; RECOVER ORIGINAL I/O PAGE - LDCTL (C),HL -; - ; RESTORE REGISTERS - POP HL - POP DE - POP BC - POP AF -; - RETIL -; -Z280_TIMCTR .DB 0 ; USED TO DIVIDE TIMER INTS -; -#ENDIF -; -; +;-------------------------------------------------------------------------------------------------- +; SYSTEM TIMER INTERRUPT HANDLER +;-------------------------------------------------------------------------------------------------- ; HB_TIMINT: +; #IF FALSE ; *DEBUG* LD HL,HB_TIMDBGCNT INC (HL) @@ -5754,57 +6016,291 @@ HB_TICK: ; HB_TICK1: ; -#IF (CPUFAM == CPU_Z180) - ; ACK/RESET Z180 TIMER INTERRUPT - IN0 A,(Z180_TCR) - IN0 A,(Z180_TMDR0L) -#ENDIF +#IF (CPUFAM == CPU_Z180) + ; ACK/RESET Z180 TIMER INTERRUPT + IN0 A,(Z180_TCR) + IN0 A,(Z180_TMDR0L) +#ENDIF +; +#IF (WDOGMODE != WDOG_NONE) + ; PULSE WATCHDOG + OUT (WDOGIO),A ; VALUE IS IRRELEVANT +#ENDIF +; +#IF MKYENABLE + CALL MKY_INT +#ENDIF +; + OR $FF ; NZ SET TO INDICATE INT HANDLED + RET +; +HB_SECOND: + ; INCREMENT SECONDS COUNTER + LD HL,HB_SECS ; POINT TO SECONDS COUNTER + JP INC32HL ; INCREMENT AND RETURN +; +; BAD INTERRUPT HANDLER +; +HB_BADINT: + +#IF FALSE ; *DEBUG* + LD HL,HB_BADINTCNT + INC (HL) + LD A,(HL) + OUT (DIAGPORT),A + OR $FF + RET +HB_BADINTCNT .DB 0 +#ENDIF ; *DEBUG* + + CALL NEWLINE2 + PRTS("+++ BAD INT $") + LD A,L + RRCA + RRCA + ;CALL PRTHEXBYTE + ;PRTS("H: $") + CALL XREGDMP + CALL NEWLINE + ;CALL CONTINUE + OR $FF ; SIGNAL INTERRUPT HANDLED + RET +; +;-------------------------------------------------------------------------------------------------- +; API FUNCTION DISPATCH SUPPORT +;-------------------------------------------------------------------------------------------------- +; +; ON ENTRY B IS API FUNCTION NUMBER AND C IS UNIT # +; (INDEX INTO XXX_TBL OF UNITS) AND IY POINTS TO START OF UNIT TABLE. +; USE UNIT # IN C TO LOOKUP XXX_TBL ENTRY. THE XXX_TBL +; ENTRY CONTAINS THE START OF THE DRIVER FUNCTION TABLE AND +; THE DEVICE SPECIFIC INSTANCE DATA (BLOB). SET IY TO BLOB ADDRESS +; AND CALL THE SPECIFIC FUNCTION REQUESTED IN THE DRIVER. +; +HB_DISPCALL: + PUSH HL ; SAVE INCOMING HL VALUE + CALL HB_DISPCALC ; IY = BLOB ADR, HL = FN ADR + JR NZ,HB_DISPCALL1 ; ABORT ON ERROR + EX (SP),HL ; RESTORE HL & FN ADR TO TOS + RET ; JUMP TO FN ADR +HB_DISPCALL1: + POP HL ; RECOVER HL + RET ; AND DONE +; +; ENTRY: BC=FUNC/UNIT, IY=DISPATCH TABLE +; EXIT: HL=FUNC ADR, IY=DATA BLOB ADR +; +HB_DISPCALC: + ; CHECK INCOMING UNIT INDEX IN C FOR VALIDITY + LD A,C ; A := INCOMING DISK UNIT INDEX + CP (IY-1) ; COMPARE TO COUNT + JR NC,HB_UNITERR ; HANDLE INVALID UNIT INDEX + + ; CHECK FUNCTION INDEX FOR VALIDITY + LD A,B ; A := INCOMING FUNCTION NUMBER + AND $0F ; LOW NIBBLE ONLY FOR FUNC INDEX + CP (IY-3) ; CHECK FN NUM AGAINST MAX + JR NC,HB_FUNCERR ; HANDLE FN NUM OUT OF RANGE ERROR + + ; BUMP IY TO ACTUAL XXX_TBL ENTRY FOR INCOMING UNIT INDEX + PUSH BC ; SAVE BC + LD B,0 ; MSB IS ALWAYS ZERO + RLC C ; MULTIPLY UNIT INDEX + RLC C ; ... BY 4 FOR TABLE ENTRY OFFSET + ADD IY,BC ; SET IY TO ENTRY ADDRESS + POP BC ; RESTORE BC + + ; DERIVE DRIVER FUNC ADR TO CALL + ;PUSH HL ; SAVE INCOMING HL + LD L,(IY+0) ; COPY DRIVER FUNC TABLE + LD H,(IY+1) ; ... START TO HL + RLCA ; CONV UNIT (STILL IN A) TO FN ADR OFFSET + CALL ADDHLA ; HL NOW HAS DRIVER FUNC TBL START ADR + LD A,(HL) ; DEREFERENCE HL + INC HL ; ... TO GET + LD H,(HL) ; ... ACTUAL + LD L,A ; ... TARGET FUNCTION ADDRESS + ;EX (SP),HL ; RESTORE HL, FUNC ADR ON STACK + + ; GET UNIT INSTANCE DATA BLOB ADDRESS TO IY + ;PUSH HL ; SAVE INCOMING HL + PUSH HL ; SAVE FUNC ADR + LD L,(IY+2) ; HL := DATA BLOB ADDRESS + LD H,(IY+3) ; ... + EX (SP),HL ; RESTORE HL, BLOB ADR ON TOS + POP IY ; IY := BLOB ADR + + XOR A ; SIGNAL SUCCESS + RET ; JUMP TO DRIVER FUNC ADR ON TOS +; +HB_FUNCERR: + SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR + RET +; +HB_UNITERR: + SYSCHKERR(ERR_NOUNIT) ; SIGNAL ERROR + RET +; +; ADD AN ENTRY TO THE UNIT TABLE AT ADDRESS IN HL +; BC: DRIVER FUNCTION TABLE +; DE: ADDRESS OF UNIT INSTANCE DATA +; RETURN +; A: UNIT NUMBER ASSIGNED +; +HB_ADDENT: + DEC HL ; POINT TO ENTRY COUNT + LD A,(HL) ; GET ENTRY COUNT + PUSH AF ; SAVE VALUE TO RETURN AS ENTRY NUM AT END + INC A ; INCREMENT TO ACCOUNT FOR NEW ENTRY + DEC HL ; POINT TO ENTRY MAX + CP (HL) ; COMPARE MAX TO CURRENT COUNT (COUNT - MAX) + CALL NC,PANIC ; OVERFLOW + INC HL ; POINT TO COUNT + LD (HL),A ; SAVE NEW COUNT + INC HL ; POINT TO START OF TABLE + DEC A ; CONVERT A FROM ENTRY COUNT TO ENTRY INDEX + RLCA ; MULTIPLY BY 4 + RLCA ; ... TO GET BYTE OFFSET OF ENTRY + CALL ADDHLA ; MAKE HL POINT TO ACTUAL ENTRY ADDRESS + PUSH BC ; GET TABLE ENTRY ADDRESS TO BC + EX (SP),HL ; ... AND DISPATCH ADDRESS TO HL + POP BC ; ... SO THAT DE:HL HAS 32 BIT ENTRY + CALL ST32 ; LD (BC),DE:HL STORES THE ENTRY + POP AF ; RETURN ENTRY INDEX (UNIT NUMBER ASSIGNED) + RET +; +;-------------------------------------------------------------------------------------------------- +; HEAP MEMORY ALLOCATION +;-------------------------------------------------------------------------------------------------- +; +; ALLOCATE HL BYTES OF MEMORY ON THE HEAP +; RETURNS POINTER TO ALLOCATED SPACE IN HL +; ON SUCCESS RETURN A == 0, AND Z SET +; ON FAILURE A <> 0 AND NZ SET AND HL TRASHED +; ALL OTHER REGISTERS PRESERVED +; +; A 4 BYTE HEADER IS PLACED IN FRONT OF THE ALLOCATED MEMORY +; - DWORD: SIZE OF MEMORY ALLOCATED (DOES NOT INCLUDE 4 BYTE HEADER) +; - DWORD: ADDRESS WHERE ALLOC WAS CALLED (VALUE ON TOP OF STACK AT CALL) +; +HB_ALLOC: +; +#IFDEF MEMDBG + CALL PRTSTRD + .TEXT "\r\n>>> ALLOC SIZE=0x$") + CALL PRTHEXWORDHL +#ENDIF +; + ; SAVE ALLOC SIZE AND REFERENCE ADR FOR SUBSEQUENT HEADER CONSTRUCTION + LD (HB_TMPSZ),HL ; SAVE INCOMING SIZE REQUESTED + ; USE EX (SP),HL INSTEAD???? + POP HL ; GET RETURN ADDRESS + LD (HB_TMPREF),HL ; SAVE AS REFERENCE + ; USE EX (SP),HL INSTEAD???? + PUSH HL ; PUT IT BACK ON STACK + LD HL,(HB_TMPSZ) ; RECOVER INCOMING MEM SIZE PARM +; + ; CALC NEW HEAP TOP AND HANDLE OUT-OF-SPACE ERROR + PUSH DE ; SAVE INCOMING DE + LD DE,4 ; SIZE OF HEADER + ADD HL,DE ; ADD IT IN + JR C,HB_ALLOC1 ; ERROR ON OVERFLOW + LD DE,(CB_HEAPTOP) ; CURRENT HEAP TOP + ADD HL,DE ; ADD IT IN, HL := NEW HEAP TOP + JR C,HB_ALLOC1 ; ERROR ON OVERFLOW + BIT 7,H ; TEST PAST END OF BANK (>= 32K) + JR NZ,HB_ALLOC1 ; ERROR IF PAST END +; + ; SAVE NEW HEAP TOP + LD DE,(CB_HEAPTOP) ; GET ORIGINAL HEAP TOP + LD (CB_HEAPTOP),HL ; SAVE NEW HEAP TOP +; +#IFDEF MEMDBG + CALL PRTSTRD + .TEXT " TOP=0x$") + CALL PRTHEXWORDHL +#ENDIF +; + ; SET HEADER VALUES + EX DE,HL ; HEADER ADR TO HL + LD DE,(HB_TMPSZ) ; GET THE ORIG SIZE REQUESTED + LD (HL),E ; SAVE SIZE (LSB) + INC HL ; BUMP HEADER POINTER + LD (HL),D ; SAVE SIZE (MSB) + INC HL ; BUMP HEADER POINTER + LD DE,(HB_TMPREF) ; GET THE REFERENCE ADR + LD (HL),E ; SAVE REF ADR (LSB) + INC HL ; BUMP HEADER POINTER + LD (HL),D ; SAVE REF ADR (MSB) + INC HL ; BUMP HEADER POINTER +; + ; RETURN SUCCESS, HL POINTS TO START OF ALLOCATED MEMORY (PAST HEADER) + POP DE ; RESTORE INCOMING DE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +HB_ALLOC1: + ; ERROR RETURN + POP DE ; RESTORE INCOMING DE + SYSCHKERR(ERR_NOMEM) ; SIGNAL ERROR + RET +; +HB_TMPSZ .DW 0 +HB_TMPREF .DW 0 +; +;-------------------------------------------------------------------------------------------------- +; Z280 SUPPORT ROUTINES +;-------------------------------------------------------------------------------------------------- +; +; Z280 SYSTEM TIMER INTERRUPT HANDLER +; +#IF (MEMMGR == MM_Z280) +; +Z280_TIMINT: + ; DISCARD REASON CODE + INC SP + INC SP +; + ; SAVE INCOMING REGISTERS + PUSH AF + PUSH BC + PUSH DE + PUSH HL +; + ; CALL PRIMARY TIMER LOGIC ON EVERY OTHER INT + LD A,(Z280_TIMCTR) + XOR $FF + LD (Z280_TIMCTR),A + CALL Z,HB_TIMINT ; -#IF (WDOGMODE != WDOG_NONE) - ; PULSE WATCHDOG - OUT (WDOGIO),A ; VALUE IS IRRELEVANT -#ENDIF + ; SELECT I/O PAGE $FE (SAVING PREVIOUS VALUE) + LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER + LDCTL HL,(C) ; GET CURRENT I/O PAGE + PUSH HL ; SAVE IT + LD L,$FE ; NEW COUNTER/TIMER I/O PAGE + LDCTL (C),HL ; -#IF MKYENABLE - CALL MKY_INT -#ENDIF + ; CLEAR END OF COUNT CONDITION TO RESET INTERRUPT + IN A,(Z280_CT0_CMDST) ; GET STATUS + RES 1,A ; CLEAR CC + OUT (Z280_CT0_CMDST),A ; SET C/T 0 ; - OR $FF ; NZ SET TO INDICATE INT HANDLED - RET + ; RESTORE I/O PAGE + LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER + POP HL ; RECOVER ORIGINAL I/O PAGE + LDCTL (C),HL ; -HB_SECOND: - ; INCREMENT SECONDS COUNTER - LD HL,HB_SECS ; POINT TO SECONDS COUNTER - JP INC32HL ; INCREMENT AND RETURN + ; RESTORE REGISTERS + POP HL + POP DE + POP BC + POP AF ; -; BAD INTERRUPT HANDLER + RETIL ; -HB_BADINT: - -#IF FALSE ; *DEBUG* - LD HL,HB_BADINTCNT - INC (HL) - LD A,(HL) - OUT (DIAGPORT),A - OR $FF - RET -HB_BADINTCNT .DB 0 -#ENDIF ; *DEBUG* - - CALL NEWLINE2 - PRTS("+++ BAD INT $") - LD A,L - RRCA - RRCA - ;CALL PRTHEXBYTE - ;PRTS("H: $") - CALL XREGDMP - CALL NEWLINE - ;CALL CONTINUE - OR $FF ; SIGNAL INTERRUPT HANDLED - RET +Z280_TIMCTR .DB 0 ; USED TO DIVIDE TIMER INTS ; -; Z280 BAD INT HANDLER +#ENDIF ; #IF (MEMMGR == MM_Z280) ; @@ -5976,201 +6472,25 @@ Z280_PRIVINST4: DI HALT ; -Z280_PRIVINSTX: - ; RESTORE REGISTERS - POP DE ; NEEDED? - POP BC ; NEEDED? - 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 - EX (SP),HL ; MSR TO STK, RECOVER HL - RETIL ; RETURN FROM INT -; -HB_MSRSAV .DW 0 ; SAVED MSR -HB_RCSAV .DW 0 ; SAVED REASON CODE -; -Z280_PRIVSTR .TEXT "\r\n\r\n*** Privileged Instruction @$" -; -#ENDIF -; -; COMMON API FUNCTION DISPATCH CODE -; -; ON ENTRY B IS API FUNCTION NUMBER AND C IS UNIT # -; (INDEX INTO XXX_TBL OF UNITS) AND IY POINTS TO START OF UNIT TABLE. -; USE UNIT # IN C TO LOOKUP XXX_TBL ENTRY. THE XXX_TBL -; ENTRY CONTAINS THE START OF THE DRIVER FUNCTION TABLE AND -; THE DEVICE SPECIFIC INSTANCE DATA (BLOB). SET IY TO BLOB ADDRESS -; AND CALL THE SPECIFIC FUNCTION REQUESTED IN THE DRIVER. -; -HB_DISPCALL: - PUSH HL ; SAVE INCOMING HL VALUE - CALL HB_DISPCALC ; IY = BLOB ADR, HL = FN ADR - JR NZ,HB_DISPCALL1 ; ABORT ON ERROR - EX (SP),HL ; RESTORE HL & FN ADR TO TOS - RET ; JUMP TO FN ADR -HB_DISPCALL1: - POP HL ; RECOVER HL - RET ; AND DONE -; -; ENTRY: BC=FUNC/UNIT, IY=DISPATCH TABLE -; EXIT: HL=FUNC ADR, IY=DATA BLOB ADR -; -HB_DISPCALC: - ; CHECK INCOMING UNIT INDEX IN C FOR VALIDITY - LD A,C ; A := INCOMING DISK UNIT INDEX - CP (IY-1) ; COMPARE TO COUNT - JR NC,HB_UNITERR ; HANDLE INVALID UNIT INDEX - - ; CHECK FUNCTION INDEX FOR VALIDITY - LD A,B ; A := INCOMING FUNCTION NUMBER - AND $0F ; LOW NIBBLE ONLY FOR FUNC INDEX - CP (IY-3) ; CHECK FN NUM AGAINST MAX - JR NC,HB_FUNCERR ; HANDLE FN NUM OUT OF RANGE ERROR - - ; BUMP IY TO ACTUAL XXX_TBL ENTRY FOR INCOMING UNIT INDEX - PUSH BC ; SAVE BC - LD B,0 ; MSB IS ALWAYS ZERO - RLC C ; MULTIPLY UNIT INDEX - RLC C ; ... BY 4 FOR TABLE ENTRY OFFSET - ADD IY,BC ; SET IY TO ENTRY ADDRESS - POP BC ; RESTORE BC - - ; DERIVE DRIVER FUNC ADR TO CALL - ;PUSH HL ; SAVE INCOMING HL - LD L,(IY+0) ; COPY DRIVER FUNC TABLE - LD H,(IY+1) ; ... START TO HL - RLCA ; CONV UNIT (STILL IN A) TO FN ADR OFFSET - CALL ADDHLA ; HL NOW HAS DRIVER FUNC TBL START ADR - LD A,(HL) ; DEREFERENCE HL - INC HL ; ... TO GET - LD H,(HL) ; ... ACTUAL - LD L,A ; ... TARGET FUNCTION ADDRESS - ;EX (SP),HL ; RESTORE HL, FUNC ADR ON STACK - - ; GET UNIT INSTANCE DATA BLOB ADDRESS TO IY - ;PUSH HL ; SAVE INCOMING HL - PUSH HL ; SAVE FUNC ADR - LD L,(IY+2) ; HL := DATA BLOB ADDRESS - LD H,(IY+3) ; ... - EX (SP),HL ; RESTORE HL, BLOB ADR ON TOS - POP IY ; IY := BLOB ADR - - XOR A ; SIGNAL SUCCESS - RET ; JUMP TO DRIVER FUNC ADR ON TOS -; -HB_FUNCERR: - SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR - RET -; -HB_UNITERR: - SYSCHKERR(ERR_NOUNIT) ; SIGNAL ERROR - RET -; -; ADD AN ENTRY TO THE UNIT TABLE AT ADDRESS IN HL -; BC: DRIVER FUNCTION TABLE -; DE: ADDRESS OF UNIT INSTANCE DATA -; RETURN -; A: UNIT NUMBER ASSIGNED -; -HB_ADDENT: - DEC HL ; POINT TO ENTRY COUNT - LD A,(HL) ; GET ENTRY COUNT - PUSH AF ; SAVE VALUE TO RETURN AS ENTRY NUM AT END - INC A ; INCREMENT TO ACCOUNT FOR NEW ENTRY - DEC HL ; POINT TO ENTRY MAX - CP (HL) ; COMPARE MAX TO CURRENT COUNT (COUNT - MAX) - CALL NC,PANIC ; OVERFLOW - INC HL ; POINT TO COUNT - LD (HL),A ; SAVE NEW COUNT - INC HL ; POINT TO START OF TABLE - DEC A ; CONVERT A FROM ENTRY COUNT TO ENTRY INDEX - RLCA ; MULTIPLY BY 4 - RLCA ; ... TO GET BYTE OFFSET OF ENTRY - CALL ADDHLA ; MAKE HL POINT TO ACTUAL ENTRY ADDRESS - PUSH BC ; GET TABLE ENTRY ADDRESS TO BC - EX (SP),HL ; ... AND DISPATCH ADDRESS TO HL - POP BC ; ... SO THAT DE:HL HAS 32 BIT ENTRY - CALL ST32 ; LD (BC),DE:HL STORES THE ENTRY - POP AF ; RETURN ENTRY INDEX (UNIT NUMBER ASSIGNED) - RET -; -; ALLOCATE HL BYTES OF MEMORY ON THE HEAP -; RETURNS POINTER TO ALLOCATED SPACE IN HL -; ON SUCCESS RETURN A == 0, AND Z SET -; ON FAILURE A <> 0 AND NZ SET AND HL TRASHED -; ALL OTHER REGISTERS PRESERVED -; -; A 4 BYTE HEADER IS PLACED IN FRONT OF THE ALLOCATED MEMORY -; - DWORD: SIZE OF MEMORY ALLOCATED (DOES NOT INCLUDE 4 BYTE HEADER) -; - DWORD: ADDRESS WHERE ALLOC WAS CALLED (VALUE ON TOP OF STACK AT CALL) -; -HB_ALLOC: -; -#IFDEF MEMDBG - CALL PRTSTRD - .TEXT "\r\n>>> ALLOC SIZE=0x$") - CALL PRTHEXWORDHL -#ENDIF -; - ; SAVE ALLOC SIZE AND REFERENCE ADR FOR SUBSEQUENT HEADER CONSTRUCTION - LD (HB_TMPSZ),HL ; SAVE INCOMING SIZE REQUESTED - ; USE EX (SP),HL INSTEAD???? - POP HL ; GET RETURN ADDRESS - LD (HB_TMPREF),HL ; SAVE AS REFERENCE - ; USE EX (SP),HL INSTEAD???? - PUSH HL ; PUT IT BACK ON STACK - LD HL,(HB_TMPSZ) ; RECOVER INCOMING MEM SIZE PARM -; - ; CALC NEW HEAP TOP AND HANDLE OUT-OF-SPACE ERROR - PUSH DE ; SAVE INCOMING DE - LD DE,4 ; SIZE OF HEADER - ADD HL,DE ; ADD IT IN - JR C,HB_ALLOC1 ; ERROR ON OVERFLOW - LD DE,(CB_HEAPTOP) ; CURRENT HEAP TOP - ADD HL,DE ; ADD IT IN, HL := NEW HEAP TOP - JR C,HB_ALLOC1 ; ERROR ON OVERFLOW - BIT 7,H ; TEST PAST END OF BANK (>= 32K) - JR NZ,HB_ALLOC1 ; ERROR IF PAST END -; - ; SAVE NEW HEAP TOP - LD DE,(CB_HEAPTOP) ; GET ORIGINAL HEAP TOP - LD (CB_HEAPTOP),HL ; SAVE NEW HEAP TOP -; -#IFDEF MEMDBG - CALL PRTSTRD - .TEXT " TOP=0x$") - CALL PRTHEXWORDHL -#ENDIF -; - ; SET HEADER VALUES - EX DE,HL ; HEADER ADR TO HL - LD DE,(HB_TMPSZ) ; GET THE ORIG SIZE REQUESTED - LD (HL),E ; SAVE SIZE (LSB) - INC HL ; BUMP HEADER POINTER - LD (HL),D ; SAVE SIZE (MSB) - INC HL ; BUMP HEADER POINTER - LD DE,(HB_TMPREF) ; GET THE REFERENCE ADR - LD (HL),E ; SAVE REF ADR (LSB) - INC HL ; BUMP HEADER POINTER - LD (HL),D ; SAVE REF ADR (MSB) - INC HL ; BUMP HEADER POINTER -; - ; RETURN SUCCESS, HL POINTS TO START OF ALLOCATED MEMORY (PAST HEADER) - POP DE ; RESTORE INCOMING DE - XOR A ; SIGNAL SUCCESS - RET ; AND RETURN +Z280_PRIVINSTX: + ; RESTORE REGISTERS + POP DE ; NEEDED? + POP BC ; NEEDED? + POP AF ; -HB_ALLOC1: - ; ERROR RETURN - POP DE ; RESTORE INCOMING DE - SYSCHKERR(ERR_NOMEM) ; SIGNAL ERROR - RET + ; 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 + EX (SP),HL ; MSR TO STK, RECOVER HL + RETIL ; RETURN FROM INT ; -HB_TMPSZ .DW 0 -HB_TMPREF .DW 0 +HB_MSRSAV .DW 0 ; SAVED MSR +HB_RCSAV .DW 0 ; SAVED REASON CODE +; +Z280_PRIVSTR .TEXT "\r\n\r\n*** Privileged Instruction @$" +; +#ENDIF ; ; Z280 BANK COPY (CALLED FROM PROXY) ; @@ -6429,9 +6749,9 @@ HB_UTIL_BEG .EQU $ #INCLUDE "unlzsa2s.asm" #ENDIF ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED) -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; OUTPUT CHARACTER FROM A ; @@ -6521,7 +6841,7 @@ CST: ; LD A,(CB_CONDEV) ; GET CONSOLE UNIT BYTE CP $FF ; TEST FOR $FF (HBIOS NOT READY) - JR Z,CST1 ; IIF NOT READY, TRY DEBUG DEBUG STATUS + JR Z,CST1 ; IF NOT READY, TRY DEBUG DEBUG STATUS ; ; USE HBIOS LD C,A ; CONSOLE UNIT TO C @@ -6547,153 +6867,117 @@ CST2: RET ; ;================================================================================================== -; INTERNAL UTILITY FUNCTIONS +; DYNAMIC RAM SIZE DETECTION ROUTINE ;================================================================================================== ; -; SET HL TO IY+A, A IS TRASHED -; -LDHLIYA: - PUSH IY ; COPY INSTANCE DATA PTR - POP HL ; ... TO HL - ;JP ADDHLA ; APPLY OFFSET TO HL AND RETURN - ADD A,L ; ADD OFFSET TO LSB - LD L,A ; ... PUT BACK IN L - RET NC ; DONE IF CF NOT SET - INC H ; IF CF SET, BUMP MSB - RET ; ... AND RETURN -; -; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO -; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED -; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER. -; -; INPUT: HL=TRACK, D=HEAD, E=SECTOR -; OUTPUT: DE:HL=32 BIT LBA ADDRESS (D:7 IS NOT SET IN THE RESULT) -; -HB_CHS2LBA: -; - LD A,D ; HEAD TO A - RLCA ; LEFT SHIFT TO HIGH NIBBLE - RLCA ; ... DEPENDS ON HIGH - RLCA ; ... NIBBLE BEING 0 SINCE - RLCA ; ... IT ROTATES INTO LOW NIBBLE - OR E ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO) - LD D,0 - LD E,H - LD H,L - LD L,A - XOR A - RET -; -; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE? +; THIS CODE IS COPIED TO $F000 TO PERFORM RAM SIZE DETECTION. ; -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 +#IFDEF SIZERAM ; - ; 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 +RS_IMAGE: + .ORG $F000 +RS_START: + LD A,(HB_CURBNK) ; GET CURRENT BANK + PUSH AF ; SAVE IT + + LD C,0 ; RUNNING BANK COUNT + LD HL,$7FFF ; BYTE TEST ADDRESS + LD IX,RS_ARY ; ORIG BYTE STORAGE ARRAY PTR +RS_LOOP1: + LD A,C + ADD A,$80 ; OFFSET BY START OF RAM BANKS + CALL RS_BNKSEL ; SELECT THE BANK - ; 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 -; + LD A,(HL) ; GET ORIGINAL VALUE + LD (IX),A ; SAVE IT TO RESTORE LATER + INC IX ; BUMP IX + + LD A,$AA ; TEST LOC WITH $AA + LD (HL),A ; AVOID PROBLEMS WITH + LD (HL),A ; ... DS1210 + LD (HL),A + LD A,(HL) + CP $AA + JR NZ,RS_DONE + + LD A,$55 ; TEST LOC WITH $55 + LD (HL),A + LD A,(HL) + CP $55 + JR NZ,RS_DONE + + ; STORE A UNIQUE VALUE + LD A,C + LD (HL),A + OR A ; ZERO? + JR Z,RS_NEXT ; SKIP STORED VALUE CHECK + + ; VERIFY ALL STORED VALUES + LD B,C ; INIT LOOP COUNTER + LD E,0 ; INIT BANK ID +RS_LOOP3: + LD A,E + ADD A,$80 + CALL RS_BNKSEL + LD A,(HL) + CP E ; VERIFY + JR NZ,RS_DONE ; ABORT IF MISCOMPARE + INC E ; NEXT BANK + DJNZ RS_LOOP3 ; +RS_NEXT: + INC C ; ADD 1 TO RAM BANK COUNT + JR RS_LOOP1 ; AND LOOP TILL DONE +; +RS_DONE: + LD E,C ; FINAL BANK COUNT TO E + LD A,C + OR A + JR Z,RS_LOOPZ + ; RESTORE SAVED VALUES + LD IX,RS_ARY + LD B,C ; LOOP COUNT + LD C,$80 ; BANK ID +RS_LOOP2: + LD A,C + CALL RS_BNKSEL + INC C + LD A,(IX) ; GET VALUE + LD (HL),A ; RESTORE IT + INC IX + DJNZ RS_LOOP2 ; ALL BANKS +RS_LOOPZ: ; -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 + ; RETURN TO ORIGINAL BANK POP AF + CALL RS_BNKSEL + LD A,E ; RETURN BANK COUNT RET ; +; SPECIAL BANK SELECT FOR MEMORY SIZING ; +RS_BNKSEL: + #IF (MEMMGR == MM_Z280) + ; IF Z280 MEMMGR, THEN WE ARE IN SYSTEM MODE, SO WE NEED TO + ; BANK SELECT THE SYSTEM PDRS INSTEAD OF THE NORMAL USER PDRS. + PUSH BC ; SAVE BC + PUSH HL ; SAVE HL + LD B,$10 ; FIRST SYSTEM PDR + CALL Z280_BNKSEL ; DO IT + POP HL ; RESTORE HL + POP BC ; RESTORE BC + RET ; DONE + #ELSE + ; NORMAL BANK SELECT + JP HBX_BNKSEL + #ENDIF ; -SYSHALT: - LD DE,STR_HALT - CALL WRITESTR - DI - HALT +RS_ARY .EQU $ ; -; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000 +RS_LEN .EQU $ - RS_START + .ORG RS_IMAGE + RS_LEN ; -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 +#ENDIF ; ;================================================================================================== ; FRONT PANEL SUPPORT @@ -8241,8 +8525,6 @@ Z280_GOSYS_LEN .EQU $ - Z280_GOSYS ; .FILL (512 - ($ - HB_WRKBUF)) ; PAD REMAINDER OF WORK BUF ; -; -; #IFDEF MG014_MAP ; ; ALIGN TO 32 BYTE BOUNDARY @@ -8288,16 +8570,12 @@ MG014_STATMAPHI: ; #ENDIF ; -#IF (DSKYENABLE) -; -;================================================================================================== -; STORAGE -;================================================================================================== -; ; CODES FOR NUMERICS ; HIGH BIT ALWAYS CLEAR TO SUPPRESS DECIMAL POINT ; SET HIGH BIT TO SHOW DECIMAL POINT ; +#IF (DSKYENABLE) +; DSKY_HEXMAP: .DB $3F ; 0 .DB $06 ; 1 @@ -8332,117 +8610,25 @@ SLACK .EQU BNKTOP - $ ; ; #IFDEF MEMINFO - .ECHO "PAGE ZERO @ " - .ECHO HB_PGZERO_BEG - .ECHO ", LENGTH=" - .ECHO HB_PGZERO_END - HB_PGZERO_BEG - .ECHO "\n" -; - .ECHO "HCB @ " - .ECHO HB_HCB_BEG - .ECHO ", LENGTH=" - .ECHO HB_HCB_END - HB_HCB_BEG - .ECHO "\n" -; - .ECHO "PROXY @ " - .ECHO HB_PROXY_BEG - .ECHO ", LENGTH=" - .ECHO HB_PROXY_END - HB_PROXY_BEG - .ECHO "\n" -; - .ECHO "ENTRY @ " - .ECHO HB_ENTRY_BEG - .ECHO ", LENGTH=" - .ECHO HB_ENTRY_END - HB_ENTRY_BEG - .ECHO "\n" -; - .ECHO "INTVEC @ " - .ECHO HB_INTVEC_BEG - .ECHO ", LENGTH=" - .ECHO HB_INTVEC_END - HB_INTVEC_BEG - .ECHO "\n" -; - .ECHO "SYSINIT @ " - .ECHO HB_SYSINIT_BEG - .ECHO ", LENGTH=" - .ECHO HB_SYSINIT_END - HB_SYSINIT_BEG - .ECHO "\n" -; - .ECHO "DISP @ " - .ECHO HB_DISP_BEG - .ECHO ", LENGTH=" - .ECHO HB_DISP_END - HB_DISP_BEG - .ECHO "\n" -; - .ECHO "SYSAPI @ " - .ECHO HB_SYSAPI_BEG - .ECHO ", LENGTH=" - .ECHO HB_SYSAPI_END - HB_SYSAPI_BEG - .ECHO "\n" -; - .ECHO "Z280IVT @ " - .ECHO HB_Z280IVT_BEG - .ECHO ", LENGTH=" - .ECHO HB_Z280IVT_END - HB_Z280IVT_BEG - .ECHO "\n" -; - .ECHO "INTFUNC @ " - .ECHO HB_INTFUNC_BEG - .ECHO ", LENGTH=" - .ECHO HB_INTFUNC_END - HB_INTFUNC_BEG - .ECHO "\n" -; - .ECHO "UTIL @ " - .ECHO HB_UTIL_BEG - .ECHO ", LENGTH=" - .ECHO HB_UTIL_END - HB_UTIL_BEG - .ECHO "\n" -; - .ECHO "PRTSUM @ " - .ECHO HB_PRTSUM_BEG - .ECHO ", LENGTH=" - .ECHO HB_PRTSUM_END - HB_PRTSUM_BEG - .ECHO "\n" -; - .ECHO "DRIVERS @ " - .ECHO HB_DRIVERS_BEG - .ECHO ", LENGTH=" - .ECHO HB_DRIVERS_END - HB_DRIVERS_BEG - .ECHO "\n" -; - .ECHO "FONTS @ " - .ECHO HB_FONTS_BEG - .ECHO ", LENGTH=" - .ECHO HB_FONTS_END - HB_FONTS_BEG - .ECHO "\n" -; - .ECHO "DATA @ " - .ECHO HB_DATA_BEG - .ECHO ", LENGTH=" - .ECHO HB_DATA_END - HB_DATA_BEG - .ECHO "\n" -; -TOTAL .EQU 0 -TOTAL .SET TOTAL + (HB_PGZERO_END - HB_PGZERO_BEG) -TOTAL .SET TOTAL + (HB_HCB_END - HB_HCB_BEG) -TOTAL .SET TOTAL + (HB_PROXY_END - HB_PROXY_BEG) -TOTAL .SET TOTAL + (HB_ENTRY_END - HB_ENTRY_BEG) -TOTAL .SET TOTAL + (HB_INTVEC_END - HB_INTVEC_BEG) -TOTAL .SET TOTAL + (HB_SYSINIT_END - HB_SYSINIT_BEG) -TOTAL .SET TOTAL + (HB_DISP_END - HB_DISP_BEG) -TOTAL .SET TOTAL + (HB_SYSAPI_END - HB_SYSAPI_BEG) -TOTAL .SET TOTAL + (HB_Z280IVT_END - HB_Z280IVT_BEG) -TOTAL .SET TOTAL + (HB_INTFUNC_END - HB_INTFUNC_BEG) -TOTAL .SET TOTAL + (HB_UTIL_END - HB_UTIL_BEG) -TOTAL .SET TOTAL + (HB_PRTSUM_END - HB_PRTSUM_BEG) -TOTAL .SET TOTAL + (HB_DRIVERS_END - HB_DRIVERS_BEG) -TOTAL .SET TOTAL + (HB_FONTS_END - HB_FONTS_BEG) -TOTAL .SET TOTAL + (HB_DATA_END - HB_DATA_BEG) -TOTAL .SET TOTAL + SLACK -; - .ECHO "TOTAL MEMORY USAGE = " - .ECHO TOTAL - .ECHO "\n" + .ECHO "SECTION \tSTART\tLENGTH\n" + .ECHO "-------------- \t-------\t-------\n" + + .ECHO "PAGE ZERO \t" \ .ECHO HB_PGZERO_BEG \ .ECHO "\t" \ .ECHO HB_PGZERO_END - HB_PGZERO_BEG \ .ECHO "\n" + .ECHO "HCB \t" \ .ECHO HB_HCB_BEG \ .ECHO "\t" \ .ECHO HB_HCB_END - HB_HCB_BEG \ .ECHO "\n" + .ECHO "PROXY \t" \ .ECHO HB_PROXY_BEG \ .ECHO "\t" \ .ECHO HB_PROXY_END - HB_PROXY_BEG \ .ECHO "\n" + .ECHO "ENTRY \t" \ .ECHO HB_ENTRY_BEG \ .ECHO "\t" \ .ECHO HB_ENTRY_END - HB_ENTRY_BEG \ .ECHO "\n" + .ECHO "INTVEC \t" \ .ECHO HB_INTVEC_BEG \ .ECHO "\t" \ .ECHO HB_INTVEC_END - HB_INTVEC_BEG \ .ECHO "\n" + .ECHO "SYSINIT \t" \ .ECHO HB_SYSINIT_BEG \ .ECHO "\t" \ .ECHO HB_SYSINIT_END - HB_SYSINIT_BEG \ .ECHO "\n" + .ECHO "DISP \t" \ .ECHO HB_DISP_BEG \ .ECHO "\t" \ .ECHO HB_DISP_END - HB_DISP_BEG \ .ECHO "\n" + .ECHO "SYSAPI \t" \ .ECHO HB_SYSAPI_BEG \ .ECHO "\t" \ .ECHO HB_SYSAPI_END - HB_SYSAPI_BEG \ .ECHO "\n" + .ECHO "Z280IVT \t" \ .ECHO HB_Z280IVT_BEG \ .ECHO "\t" \ .ECHO HB_Z280IVT_END - HB_Z280IVT_BEG \ .ECHO "\n" + .ECHO "INTFUNC \t" \ .ECHO HB_INTFUNC_BEG \ .ECHO "\t" \ .ECHO HB_INTFUNC_END - HB_INTFUNC_BEG \ .ECHO "\n" + .ECHO "UTIL \t" \ .ECHO HB_UTIL_BEG \ .ECHO "\t" \ .ECHO HB_UTIL_END - HB_UTIL_BEG \ .ECHO "\n" + .ECHO "PRTSUM \t" \ .ECHO HB_PRTSUM_BEG \ .ECHO "\t" \ .ECHO HB_PRTSUM_END - HB_PRTSUM_BEG \ .ECHO "\n" + .ECHO "DRIVERS \t" \ .ECHO HB_DRIVERS_BEG \ .ECHO "\t" \ .ECHO HB_DRIVERS_END - HB_DRIVERS_BEG \ .ECHO "\n" + .ECHO "FONTS \t" \ .ECHO HB_FONTS_BEG \ .ECHO "\t" \ .ECHO HB_FONTS_END - HB_FONTS_BEG \ .ECHO "\n" + .ECHO "DATA \t" \ .ECHO HB_DATA_BEG \ .ECHO "\t" \ .ECHO HB_DATA_END - HB_DATA_BEG \ .ECHO "\n" + .ECHO "SLACK \t" \ .ECHO HB_END \ .ECHO "\t" \ .ECHO SLACK \ .ECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 74de2d49..2697541d 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -24,10 +24,8 @@ ; 20. MON Jacques Pelletier's Monsputer ; 21. STDZ180 Genesis Z180 System ; 22. NABU NABU w/ Les Bird's RomWBW Option Board - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; -; INCLUDE VERSION +; INCLUDE BUILD VERSION ; #INCLUDE "../ver.inc" ; ADD BIOSVER ; @@ -1009,17 +1007,6 @@ INT_SIO1 .EQU 14 ; ZILOG SIO 1, CHANNEL A & B #IF (PLATFORM == PLT_MBC) ; -; MBC IM2 PINHEADER INTERRUPTS -; -;INT_IM2PH0 .EQU 0 -;INT_IM2PH1 .EQU 1 -;INT_IM2PH2 .EQU 2 -;INT_IM2PH3 .EQU 3 -;INT_IM2PH4 .EQU 4 -;INT_IM2PH5 .EQU 5 -;INT_IM2PH6 .EQU 6 -;INT_IM2PH7 .EQU 7 -; ; MBC Z80 INTERRUPTS ; ;INT_CTC0A .EQU 0 ; ZILOG CTC 0, CHANNEL A @@ -1044,17 +1031,6 @@ INT_CTC0D .EQU 15 ; ZILOG CTC 0, CHANNEL D #ENDIF #IF (PLATFORM == PLT_DUO) - -; DUO IM2 PINHEADER INTERRUPTS - -;INT_IM2PH0 .EQU 0 -;INT_IM2PH1 .EQU 1 -;INT_IM2PH2 .EQU 2 -;INT_IM2PH3 .EQU 3 -;INT_IM2PH4 .EQU 4 -;INT_IM2PH5 .EQU 5 -;INT_IM2PH6 .EQU 6 -;INT_IM2PH7 .EQU 7 ; ; DUO Z80 IM2 INTERRUPTS ; diff --git a/Source/Images/Common/All/FLASH.COM b/Source/Images/Common/All/FLASH.COM index ab46a910..b14d74e3 100644 Binary files a/Source/Images/Common/All/FLASH.COM and b/Source/Images/Common/All/FLASH.COM differ diff --git a/Source/RomDsk/ROM_256KB/FLASH.COM b/Source/RomDsk/ROM_256KB/FLASH.COM index ab46a910..b14d74e3 100644 Binary files a/Source/RomDsk/ROM_256KB/FLASH.COM and b/Source/RomDsk/ROM_256KB/FLASH.COM differ diff --git a/Source/RomDsk/ROM_384KB/FAT.COM b/Source/RomDsk/ROM_384KB/FAT.COM index 004760fb..9c6d2f2c 100644 Binary files a/Source/RomDsk/ROM_384KB/FAT.COM and b/Source/RomDsk/ROM_384KB/FAT.COM differ diff --git a/Source/RomDsk/ROM_384KB/FLASH.COM b/Source/RomDsk/ROM_384KB/FLASH.COM index ab46a910..b14d74e3 100644 Binary files a/Source/RomDsk/ROM_384KB/FLASH.COM and b/Source/RomDsk/ROM_384KB/FLASH.COM differ diff --git a/Source/RomDsk/ROM_896KB/FAT.COM b/Source/RomDsk/ROM_896KB/FAT.COM index 004760fb..9c6d2f2c 100644 Binary files a/Source/RomDsk/ROM_896KB/FAT.COM and b/Source/RomDsk/ROM_896KB/FAT.COM differ diff --git a/Source/RomDsk/ROM_896KB/FLASH.COM b/Source/RomDsk/ROM_896KB/FLASH.COM index ab46a910..b14d74e3 100644 Binary files a/Source/RomDsk/ROM_896KB/FLASH.COM and b/Source/RomDsk/ROM_896KB/FLASH.COM differ diff --git a/Source/ver.inc b/Source/ver.inc index cd0508b2..d18d8523 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.35" +#DEFINE BIOSVER "3.5.0-dev.36" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 7958f07b..358b95ae 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.35" + db "3.5.0-dev.36" endm