From 5adbef5f68c4fd8359dc559f62c4aefab5ef774c Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sat, 19 Mar 2016 21:21:17 -0700 Subject: [PATCH] Revised Emulation Services --- Source/CBIOS/cbios.asm | 158 ++++--- Source/CBIOS/util.asm | 18 +- Source/HBIOS/API.txt | 274 +++++++++++++ Source/HBIOS/Layout.txt | 114 +++++ Source/HBIOS/ansi.asm | 117 +++--- Source/HBIOS/asci.asm | 113 +++-- Source/HBIOS/cvdu.asm | 104 ++--- Source/HBIOS/cvdu_font.asm | 2 + Source/HBIOS/dbgmon.asm | 74 +++- Source/HBIOS/dsky.asm | 252 ++++++++++++ Source/HBIOS/fd.asm | 5 - Source/HBIOS/hbios.asm | 822 +++++++++++++++++-------------------- Source/HBIOS/hbios.inc | 70 ++-- Source/HBIOS/hdsk.asm | 5 - Source/HBIOS/ide.asm | 5 - Source/HBIOS/loader.asm | 157 +------ Source/HBIOS/md.asm | 6 - Source/HBIOS/n8v.asm | 106 ++--- Source/HBIOS/ppide.asm | 5 - Source/HBIOS/ppp.asm | 33 +- Source/HBIOS/prp.asm | 33 +- Source/HBIOS/rf.asm | 5 - Source/HBIOS/romldr.asm | 118 ++++-- Source/HBIOS/sd.asm | 7 +- Source/HBIOS/std.asm | 6 - Source/HBIOS/tty.asm | 54 ++- Source/HBIOS/uart.asm | 76 +++- Source/HBIOS/ubios.inc | 4 +- Source/HBIOS/util.asm | 427 +------------------ Source/HBIOS/vdu.asm | 87 ++-- 30 files changed, 1784 insertions(+), 1473 deletions(-) create mode 100644 Source/HBIOS/API.txt create mode 100644 Source/HBIOS/Layout.txt create mode 100644 Source/HBIOS/dsky.asm diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 6e0509d5..e9828812 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -137,7 +137,7 @@ CBXSIZ .EQU $ - CBX ; ============== ; ; Device LST: PUN: RDR: CON: -; Bit position 7 6 5 4 3 2 1 0 +; Bit positions 7 6 5 4 3 2 1 0 ; ; Dec Binary ; @@ -343,25 +343,12 @@ GOCPM: LD HL,SECBUF ; ADDRESS OF PHYSICAL SECTOR BUFFER LD (DSKBUF),HL ; SAVE IT IN DSKBUF FOR LATER #ELSE - ;; CALL BF_DIOSETBUF WITH A PARM OF ZERO TO CAUSE IT TO RESET - ;; THE PHYSICAL DISK BUFFER TO THE DEFAULT LOCATION PRE-ALLOCATED - ;; INSIDE OF THE HBIOS BANK. THE ADDRESS IS RETURNED IN HL AND SAVED. - ;LD B,BF_DIOSETBUF ; GET DISK BUFFER ADR IN HBIOS DRIVER BANK - ;LD HL,0 - ;RST 08 ; MAKE HBIOS CALL - ;LD (DSKBUF),HL ; RECORD THE BUFFER ADDRESS - ; ALLOCATE A SINGLE SECTOR DISK BUFFER ON THE HBIOS HEAP LD B,BF_SYSALLOC ; BIOS FUNC: ALLOCATE HEAP MEMORY LD HL,512 ; 1 SECTOR, 512 BYTES RST 08 ; DO IT CALL NZ,PANIC ; HANDLE ERROR LD (DSKBUF),HL ; RECORD THE BUFFER ADDRESS - - ; TEMPORARY!!! LET HBIOS KNOW THE DISK BUFFER - LD B,BF_DIOSETBUF - RST 08 - #ENDIF ; LD A,$C3 ; LOAD A WITH 'JP' INSTRUCTION (USED BELOW) @@ -470,7 +457,7 @@ CONIO: ; LD A,(IOBYTE) ; GET IOBYTE AND $03 ; ISOLATE RELEVANT IOBYTE BITS FOR CONSOLE -; OR $00 ; PUT LOGICAL DEVICE IN BITS 2-3 (CON:=$00, RDR:=$04, PUN:=$08, LST:=$0C + ;OR $00 ; PUT LOGICAL DEVICE IN BITS 2-3 (CON:=$00, RDR:=$04, PUN:=$08, LST:=$0C JR CIO_DISP ; ;__________________________________________________________________________________________________ @@ -488,7 +475,7 @@ LISTST: ; LD B,BF_CIOOST ; B = FUNCTION LD HL,CIOST ; HL = ADDRESS OF COMPLETION ROUTINE -; JR LISTIO ; COMMENTED OUT, FALL THROUGH OK + ;JR LISTIO ; COMMENTED OUT, FALL THROUGH OK ; ;__________________________________________________________________________________________________ LISTIO: @@ -507,7 +494,7 @@ PUNCH: LD B,BF_CIOOUT ; B = FUNCTION POP HL ; NO COMPLETION ROUTINE, SETUP DIRECT RETURN TO CALLER LD E,C ; E = CHARACTER TO SEND -; JR PUNCHIO ; COMMENTED OUT, FALL THROUGH OK + ;JR PUNCHIO ; COMMENTED OUT, FALL THROUGH OK ; ;__________________________________________________________________________________________________ PUNCHIO: @@ -771,7 +758,6 @@ BLKRW: ; FIX!!! WE ABORT ON FIRST ERROR, DRI SEEMS TO PASS ERROR STATUS TO THE END!!! - ;CALL TSTPT ; *DEBUG* ; IF WRITE OPERATION, GO TO SPECIAL WRITE PROCESSING LD A,(DSKOP) ; GET REQUESTED OPERATION CP DOP_WRITE ; WRITE @@ -857,7 +843,6 @@ BLKRW4: RET ; ERROR RETURN BLKRW6: - ;CALL TSTPT ; *DEBUG* ; CHECK TYPE OF OPERATIONS, IF WRITE, THEN GO TO WRITE PROCESSING LD A,(DSKOP) ; GET PENDING OPERATION CP DOP_WRITE ; IS IT A WRITE? @@ -865,7 +850,6 @@ BLKRW6: ; THIS IS A READ OPERATION, WE ALREADY DID THE I/O, NOW JUST DEBLOCK AND RETURN CALL BLK_DEBLOCK ; EXTRACT DATA FROM BLOCK - ;CALL TSTPT ; *DEBUG* XOR A ; NO ERROR RET ; ALL DONE @@ -1206,8 +1190,10 @@ DSK_SELECT: ; DETERMINE MEDIA IN DRIVE LD A,(SEKUNIT) ; GET UNIT LD C,A ; STORE IN C - LD B,BF_DIOMED ; DRIVER FUNCTION = DISK MEDIA - RST 08 + LD B,BF_DIOMEDIA ; DRIVER FUNCTION = DISK MEDIA + LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY + RST 08 ; DO IT + LD A,E ; RESULTANT MEDIA ID TO ACCUM OR A ; SET FLAGS LD HL,0 ; ASSUME FAILURE RET Z ; BAIL OUT IF NO MEDIA @@ -1249,7 +1235,7 @@ DSK_STATUS: ; VALID DRIVE, DISPATCH TO DRIVER LD C,D ; C := UNIT - LD B,BF_DIOST ; B := FUNCTION: STATUS + LD B,BF_DIOSTATUS ; B := FUNCTION: STATUS RST 08 RET #ENDIF @@ -1258,14 +1244,14 @@ DSK_STATUS: ; DSK_READ: ; SET B = FUNCTION: READ - LD B,BF_DIORD + LD B,BF_DIOREAD JR DSK_IO ; ; ; DSK_WRITE: ; SET B = FUNCTION: WRITE - LD B,BF_DIOWR + LD B,BF_DIOWRITE JR DSK_IO ; ; @@ -1325,10 +1311,8 @@ CHS: LD A,(HSTUNIT) ; GET UNIT LD C,A ; UNIT -> C PUSH BC ; SAVE FUNC/UNIT - LD B,BF_DIOGETINF ; HBIOS FUNC: UNIT INFO - ;CALL TSTPT ; *DEBUG* + LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO RST 08 ; GET UNIT INFO, DEVICE TYPE IN D - ;CALL TSTPT ; *DEBUG* POP BC ; GET FUNC/UNIT BACK TO BC LD A,D ; DEVICE TYPE -> A AND $F0 ; ISOLATE HIGH BITS @@ -1371,15 +1355,19 @@ CHS2: LD DE,(HSTOFF) ; NOW GET SLICE OFFSET | TO CHSHD, ADD HL,DE ; ADD IT TO TRACK VALUE | NO SLICES POP DE ; RECOVER HEAD/SECTOR + FOR FLOPPY - EX DE,HL ; HL <-> DE FOR HBIOS CALL ; ; MAKE HBIOS CALL ; HBIOS FUNC SHOULD STILL BE IN B ; UNIT SHOULD STILL BE IN C ; - ;CALL TSTPT ; *DEBUG* + PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT + LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL + RST 08 ; DO IT + POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT + RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A + LD HL,(DSKBUF) ; GET BUFFER ADDRESS + LD DE,1 ; TRANSFER ONE SECTOR RST 08 ; DO IT - ;CALL TSTPT ; *DEBUG* OR A ; SET FLAGS RET ; DONE @@ -1829,14 +1817,14 @@ INIT: ; CREATE A TEMP COPY OF THE HBIOS CONFIG BLOCK (HCB) ; FOR USE DURING INIT - LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY - LD DE,(BNKBIOS) ; D = DEST (USER BANK), E = SOURCE (BIOS BANK) - RST 08 ; SET BANKS FOR INTERBANK COPY - LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY - LD HL,HCB_LOC ; COPY FROM FIXED LOCATION IN HB BANK - LD DE,HCB ; TO TEMP LOCATION IN USR BANK - LD IX,HCB_SIZ ; COPY CONTENTS OF HCB - RST 08 ; DO IT + LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY + LD DE,(BNKBIOS) ; D = DEST (USER BANK), E = SOURCE (BIOS BANK) + RST 08 ; SET BANKS FOR INTERBANK COPY + LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY + LD HL,HCB_LOC ; COPY FROM FIXED LOCATION IN HB BANK + LD DE,HCB ; TO TEMP LOCATION IN USR BANK + LD IX,HCB_SIZ ; COPY CONTENTS OF HCB + RST 08 ; DO IT ; CAPTURE RAM DRIVE STARTING BANK LD A,(HCB + HCB_BIDRAMD0) @@ -1966,62 +1954,81 @@ DEV_INIT: ; ; PATCH IN CRT: DEVICE LD A,(HCB + HCB_CRTDEV) ; GET CONSOLE DEVICE - CP CIODEV_NUL ; NUL MEANS NO CRT DEVICE - JR Z,DEV_INIT1 ; IF SO, LEAVE IT ALONE + CP $FF ; NUL MEANS NO CRT DEVICE + JR Z,DEV_INIT00 ; IF SO, LEAVE IT ALONE LD (DEVMAP + 1),A ; CONSOLE CRT LD (DEVMAP + 13),A ; LIST CRT ; -#IFDEF PLTWBW ; UPDATE IOBYTE IF CRT DEVICE IS ACTIVE LD A,(HCB + HCB_CRTDEV) ; GET CRT DEVICE LD B,A ; SAVE IN B LD A,(HCB + HCB_CONDEV) ; GET CONSOLE DEVICE CP B ; COMPARE - JR NZ,DEV_INIT1 ; IF DIFFERENT (CRT NOT ACTIVE), LEAVE IOBYTE ALONE + JR NZ,DEV_INIT00 ; IF DIFFERENT (CRT NOT ACTIVE), LEAVE IOBYTE ALONE LD A,1 ; IF SAME (CRT ACTIVE), SET IOBYTE FOR CON: = CRT: LD (IOBYTE),A ; STORE IN IOBYTE -#ENDIF +; +DEV_INIT00: + ; LOOP THRU DEVICES ADDING NON-CRT DEVICES TO DEVMAP + LD B,BF_SYSGET ; HBIOS FUNC: GET SYS INFO + LD C,BF_SYSGET_CIOCNT ; SUBFUNC: GET CIO UNIT COUNT + RST 08 ; E := SERIAL UNIT COUNT + LD B,E ; COUNT TO B + LD C,0 ; UNIT INDEX + LD HL,DEV_INIT1 ; POINTER FOR FIRST ENTRY FOUND +DEV_INIT0: + PUSH BC ; SAVE LOOP CONTROL + PUSH HL ; SAVE TARGET + LD B,BF_CIODEVICE ; HBIOS FUNC: GET DEVICE INFO + RST 08 ; D := DEVICE TYPE, E := PHYSICAL UNIT NUMBER + POP HL ; RESTORE TARGET + LD A,D ; DEVICE TYPE TO A + CP CIODEV_VDU ; COMPARE TO FIRST VIDEO DEVICE + POP BC ; RESTORE LOOP CONTROL + LD A,C ; UNIT INDEX TO ACCUM + ;CALL C,JPHL ; DO IT IF DEVICE TYPE < VDU + CALL JPHL ; DO FOR ANY CHARACTER DEVICE TYPE + INC C ; NEXT UNIT + DJNZ DEV_INIT0 ; LOOP TILL DONE + RET ; ALL DONE ; DEV_INIT1: ; PATCH IN COM0: DEVICE ENTRIES - LD A,(HCB + HCB_CDL + 0) ; COM0: - CP $FF ; $FF MEANS NO ENTRY - JR Z,DEV_INIT2 ; IF SO, LEAVE IT ALONE LD (DEVMAP + 0),A ; CONSOLE TTY LD (DEVMAP + 4),A ; READER TTY LD (DEVMAP + 8),A ; PUNCH TTY LD (DEVMAP + 12),A ; LIST TTY + LD HL,DEV_INIT2 ; HL := CODE FOR NEXT DEVICE + RET ; DEV_INIT2: ; PATCH IN COM1: DEVICE ENTRIES - LD A,(HCB + HCB_CDL + 1) ; COM1: - CP $FF ; $FF MEANS NO ENTRY - JR Z,DEV_INIT3 ; IF SO, LEAVE IT ALONE LD (DEVMAP + 3),A ; CONSOLE UC1 LD (DEVMAP + 5),A ; READER PTR LD (DEVMAP + 9),A ; PUNCH PTP + LD HL,DEV_INIT3 ; HL := CODE FOR NEXT DEVICE + RET ; DEV_INIT3: ; PATCH IN COM2: DEVICE ENTRIES - LD A,(HCB + HCB_CDL + 2) ; COM2: - CP $FF ; $FF MEANS NO ENTRY - JR Z,DEV_INIT4 ; IF SO, LEAVE IT ALONE LD (DEVMAP + 6),A ; READER UR1 LD (DEVMAP + 10),A ; PUNCH PT1 + LD HL,DEV_INIT4 ; HL := CODE FOR NEXT DEVICE + RET ; DEV_INIT4: ; PATCH IN COM3: DEVICE ENTRIES - LD A,(HCB + HCB_CDL + 3) ; COM3: - CP $FF ; $FF MEANS NO ENTRY - JR Z,DEV_INIT5 ; IF SO, LEAVE IT ALONE LD (DEVMAP + 7),A ; READER UR2 LD (DEVMAP + 11),A ; PUNCH PT2 + LD HL,DEV_INIT5 ; HL := CODE FOR NEXT DEVICE + RET ; DEV_INIT5: + RET ; FAILSAFE IN CASE MORE THAN 4 COM DEVICES ; +#ENDIF RET ; -#ENDIF ; ; ;__________________________________________________________________________________________________ @@ -2317,8 +2324,10 @@ DRV_INIT: LD (HEAPTOP),HL ; AND AS NEW HEAP TOP ; ; SETUP TO LOOP THROUGH AVAILABLE DEVICES - LD B,BF_DIOGETCNT ; HBIOS FUNC: DEVICE COUNT - RST 08 ; CALL HBIOS, DEVICE COUNT TO B + LD B,BF_SYSGET + LD C,BF_SYSGET_DIOCNT + RST 08 ; E := DISK UNIT COUNT + LD B,E ; COUNT TO B LD A,B ; COUNT TO A OR A ; SET FLAGS RET Z ; HANDLE ZERO DEVICES (ALBEIT POORLY) @@ -2339,7 +2348,7 @@ DRV_INIT2: ; DRV_INIT3: PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER) - LD B,BF_DIOGETINF ; HBIOS FUNC: UNIT INFO + LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO RST 08 ; CALL HBIOS, UNIT TO C LD A,D ; DEVICE TYPE TO A POP DE ; RESTORE DE @@ -2363,13 +2372,15 @@ DRV_INIT5: LD (HDSPV),A ; SAVE IT ; ; SETUP TO ENUMERATE DEVICES TO BUILD DRVMAP - LD B,BF_DIOGETCNT ; HBIOS FUNC: DEVICE COUNT - RST 08 ; CALL HBIOS, DEVICE COUNT TO B + LD B,BF_SYSGET + LD C,BF_SYSGET_DIOCNT + RST 08 ; E := DISK UNIT COUNT + LD B,E ; COUNT TO B LD C,0 ; USE C AS DEVICE LIST INDEX ; DRV_INIT6: ; LOOP THRU ALL UNITS AVAILABLE PUSH BC ; PRESERVE LOOP CONTROL - LD B,BF_DIOGETINF ; HBIOS FUNC: DEVICE INFO + LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO RST 08 ; CALL HBIOS, D := DEVICE TYPE POP BC ; GET UNIT INDEX BACK IN C PUSH BC ; RESAVE LOOP CONTROL @@ -2547,27 +2558,10 @@ MAKDPH0: ; HANDLE RAM/ROM ; #ELSE ; - ;; DETERMINE APPROPRIATE DPB - ;LD DE,DPB_ROM ; ASSUME ROM - ;CP DIODEV_MD+0 ; ROM? - ;JR Z,MAKDPH1 ; YES, JUMP AHEAD - ;LD DE,DPB_RAM ; ASSUME ROM - ;CP DIODEV_MD+1 ; ROM? - ;JR Z,MAKDPH1 ; YES, JUMP AHEAD - ;AND $F0 ; IGNORE UNIT NIBBLE NOW - ;LD DE,DPB_FD144 ; ASSUME FLOPPY - ;CP DIODEV_FD ; FLOPPY? - ;JR Z,MAKDPH1 ; YES, JUMP AHEAD - ;LD DE,DPB_RF ; ASSUME RAM FLOPPY - ;CP DIODEV_RF ; RAM FLOPPY? - ;JR Z,MAKDPH1 ; YES, JUMP AHEAD - ;LD DE,DPB_HD ; EVERYTHING ELSE IS ASSUMED TO BE HARD DISK - ;JR MAKDPH1 ; JUMP AHEAD - ; DETERMINE APPROPRIATE DPB (UNIT NUMBER IN A) ; GET DEVICE INFO LD C,A ; UNIT NUMBER TO C - LD B,BF_DIOGETINF ; HBIOS FUNC: UNIT INFO + LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO RST 08 ; CALL HBIOS, RET W/ DEVICE TYPE IN D, PHYSICAL UNIT IN E LD A,D ; DEVICE TYPE TO A CP DIODEV_MD ; RAM/ROM DISK? @@ -2753,7 +2747,7 @@ DEVUNK .DB "UNK$" PUSH BC ; PRESERVE BC PUSH DE ; PRESERVE DE PUSH HL ; PRESERVE HL - LD B,BF_DIOGETINF ; GET DISK INFO + LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO LD C,D ; UNIT TO C RST 08 ; CALL HBIOS LD A,D ; RESULTANT DEVICE TYPE diff --git a/Source/CBIOS/util.asm b/Source/CBIOS/util.asm index 6d09502f..9b928827 100644 --- a/Source/CBIOS/util.asm +++ b/Source/CBIOS/util.asm @@ -121,13 +121,23 @@ PANIC: LD DE,STR_PANIC CALL WRITESTR POP DE - JR REGDMP ; DUMP REGISTERS AND RETURN + CALL _REGDMP ; DUMP REGISTERS + CALL CONTINUE ; CHECK W/ USER + RET ; ; ; REGDMP: + CALL _REGDMP + RET +; +_REGDMP: EX (SP),HL ; RET ADR TO HL, SAVE HL ON TOS - LD (REGDMP_PC),HL ; SAVE RET IS PC REG VALUE, SAVE IT + LD (REGDMP_RET),HL ; SAVE RETURN ADDRESS + POP HL ; RESTORE HL AND BURN STACK ENTRY + + EX (SP),HL ; PC TO HL, SAVE HL ON TOS + LD (REGDMP_PC),HL ; SAVE PC VALUE EX (SP),HL ; BACK THE WAY IT WAS LD (UTSTKSAV),SP ; SAVE ORIGINAL STACK POINTER @@ -178,7 +188,9 @@ REGDMP: POP AF LD SP,(UTSTKSAV) ; BACK TO ORIGINAL STACK FRAME - RET + + JP $FFFF ; RETURN, $FFFF IS DYNAMICALLY UPDATED +REGDMP_RET .EQU $-2 ; RETURN ADDRESS GOES HERE ; REGDMP_PC .DW 0 ; diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt new file mode 100644 index 00000000..1687f0f2 --- /dev/null +++ b/Source/HBIOS/API.txt @@ -0,0 +1,274 @@ +========================== +HBIOS Management Functions +========================== + +GET ($05): + BC=Function/Subfunction A=Result + + Subfunctions: + + CIOCNT ($00): + BC=Function/Subfunction A=Result + E=Serial Unit Count + + DIOCNT ($10): + BC=Function/Subfunction A=Result + E=Disk Unit Count + + BIOSVER ($F0): + BC=Function/Subfunction A=Result + DE=BIOS Version + L=Platform + +SET ($06): + BC=Function/Subfunction A=Result + + + + + +================ +Serial Functions +================ + +IN ($00): + BC=Function/Unit A=Result + E=Byte Input + + Wait for a single character to be available at the specified device and return the character in E. Function + will wait indefinitely for a character to be available. + +OUT ($01): + BC=Function/Unit A=Result + E=Character to Output + + Wait for device/unit to be ready to send a character, then send the character specified in E. + +IST ($02): + BC=Function/Unit A=Result + *E=# Bytes Pending + +OST ($03): + BC=Function/Unit A=Result + *E=# Buffer Bytes Available + +INIT ($04): + BC=Function/Unit A=Result + DE=Line Characteristics + +QUERY ($05) + BC=Function/Unit A=Result + DE=Line Characteristics + +DEVICE ($06): + BC=Function/Unit A=Result + D=Device Type + E=Physical Unit + +============== +Disk Functions +============== + +STATUS ($10): + BC=Function/Unit A=Result + + Return current status result code of specified unit. Does not clear + the status. + +RESET ($11): + BC=Function/Unit A=Result + + Reset the physical interface associated with the specified unit. Flag all units + associated with the interface for unit initialization at next I/O call. Clear + media identified unless locked. Reset result code of all associated units. + +SEEK ($12): + BC=Function/Unit A=Result + D:7=Address Type (0=CHS, 1=LBA) + CHS: D:0-6=Head,E=Sector,HL=Track + LBA: DE:HL + + Update target CHS or LBA for next I/O request on designated unit. + Physical seek is typically deferred until subsequent I/O operation. + +READ ($13) / WRITE ($14) / VERIFY ($15): + BC=Function/Unit A=Result + HL=Buffer Address + E=Block Count + + Read, write, or verify sectors starting at current target sector. Current + target sector is incremented on each successful operation. On error, + target sector is sector where error occurred. + +FORMAT ($16): + BC=Function/Unit A=Result + CHS: D=Head, HL=Cylinder + E=Fill Byte + + Format the designated track using the current media_id. Many devices + do not support a true format operation. If so, format should write + sectors with designated fill byte. + + *** Need to specify interleave/sector id's somehow. + +DEVICE ($17) + BC=Function/Unit A=Result + D=Device Type + E=Physical Unit + + Report the device type (Floppy, IDE, SD, etc.) and physical unit number. Call + does not perform any I/O and succeeds even if the device is in an error state. + It does not reset the unit status. + +MEDIA ($18): + BC=Function/Unit A=Result + E0:=Enable Media Discovery E=Media ID (legacy) + + Report the media definition for media in specified unit. If bit 0 of E is + set, then perform media discovery or verification. If no media in device, + return no media error. + +DEFMED ($19): + BC=Function/Unit A=Result + E=Media ID (legacy) + + Define media in unit. + +CAPACITY ($1A): + BC=Function/Unit DE:HL=Blocks on Device + BC=Block Size + A=Result + + Return device capacity information. + If media is unknown, return error (no media) + +GEOMETRY ($1B): + BC=Function/Unit HL=Cylinders + D:0-6=Heads + D:7=LBA Capable + E=Sectors + BC=Block Size + A=Result + + Return device geometry information. + If media is unknown, return error (no media) + +INFO ($1F): + BC=Function/Sub-function A=Result + + C=0: Report total unit count in system: + BC=Function/Sub-function A=Result + B=Count + + + +A: RAM0 B: ROM0 C: + + + +Unit Device Board Part Slice Cap +------- ------- ------- ------- ------- ------- +#0 RAM MK4 384K +#1 ROM MK4 384K +#2 FD0 DIO3 3.5" DS/HD +#3 IDE0 DIO3 0 8M + + + +Unit 0: RAMDISK on MK4 (384K) +Unit 1: ROMDISK on MK4 (384K) +Unit 2: FD0 on DISKIO3 (3.5") +Unit 3: FD1 on DISKIO3 (5.25") +Unit 4: IDE0 on DISKIO3 (4096M) + +A: RAM0 MK4 RAM Disk, 384K +B: ROM0 MK4 ROM Disk, 384K +C: FD0 DiskIO3 Floppy Disk 0, 3.5" DS/HD +D: FD1 DiskIO3 Floppy Disk 1, 5.25" DS/DD +E: IDE0:0 MK4 IDE Hard Disk 0, Slice 0, 8M +F: IDE0:1 MK4 IDE Hard Disk 0, Slice 1, 8M +G: PRPSD0:0 PropIO SD Card, Slice 0 + + + + + + +0: RAM- RAMdrive on the Z180 SBC Mark IV board +LBASupported UserAddressableSectors 832 + +1: ROM- ROMdrive on the Z180 SBC Mark IV board +LBASupported UserAddressableSectors 768 + +2: IDE- SanDisk SDCFHSNJC-004G +s/n: DMZ031215013440 fmw: HDX 7.08 +CHS: 7751:16:63 nSectors 7813008 MaxBlkTransfer 1 +LBASupported UserAddressableSectors 7813120 + +3: IDE- SanDisk SDCFHSNJC-004G +s/n: BKZ031215015432 fmw: HDX 7.08 +CHS: 7751:16:63 nSectors 7813008 MaxBlkTransfer 1 +LBASupported UserAddressableSectors 7813120 + +4: SD- SD SU02G +s/n: 139401536 fmw: 8.0 d/c: 2013-07 +LBASupported UserAddressableSectors 1931264 + +Boot UNA unit number or ROM? [R,X,0..4] (R): + +N8VEM UNA CP/M (Will Sowerbutts, 2014-08-01 git cbed09) + +Unit Disk Driver Capacity Slices Start LBA Flags +0 RAM0 Memory 416.0KB 1 0x00000000 (formatted) +1 ROM0 Memory 384.0KB 1 0x00000000 +2 IDE0 Dual-IDE 3.7GB 469 0x00000000 MBR FGN +3 IDE1 Dual-IDE 3.7GB 469 0x00000000 MBR FGN +4 SD0 CSIO-SD 943.0MB 0 0x00000000 MBR FGN + +Drive A: assigned to RAM0 slice 0 +Drive B: assigned to ROM0 slice 0 +Drive C: assigned to IDE0 slice 0 +Drive D: assigned to IDE1 slice 0 + +Loading Residual CP/M at 0xE100 ... done. +CP/M 2.2 Copyright 1979 (c) by Digital Research + +--- + +_INIT: + - ADD OURSELVES TO VDA_TBL + - ADD OURSELVES TO CIO_TBL & RECORD _CIOUNIT + - INIT HARDWARE + - GOTO _INI + +_INI: + - CALL _RES + - INITIALIZE EMULATION BY CALLING EMU_INIT (PASS IN C=EMU_TYPE & DE=VDA_DISPATCH ADDRESS) + - EMU_INIT RETURNS ADDRESS OF CIO DISPATCHER ADDRESS FOR SUBSEQUENT FORWARDING + - RECORD EMULATORS CIO DISPATCHER ADDRESS IN _CIODISPATCH + +_RES: + - RESET HARDWARE + +EMU_INIT: + - CALL _INIT BASED ON VALUE IN C + +_INIT: + - RECORD DE IN VDA_DISPADR + - INITIALIZE/RESET EMULATION ENGINE + - RETURN EMULATOR CIO DISPATCH ADDRESS IN DE + + + + + +-------------------------- +md +hdsk +rf +ide +sd +ppide +fd +prp +ppp diff --git a/Source/HBIOS/Layout.txt b/Source/HBIOS/Layout.txt new file mode 100644 index 00000000..d32e63c7 --- /dev/null +++ b/Source/HBIOS/Layout.txt @@ -0,0 +1,114 @@ +------------------ +Final Output Files +------------------ + +ROM Output File [512K] -> .rom + setup [32K] romboot? + hbios+hbfill [32K] + OSIMG [32K] + OSIMG [32K] (used as filler) + romdisk - [384K] + +COM Output File -> .com + comldr [varies] appboot? + hbios [varies] + OSIMG [32K] + +IMG Output File -> .img + imgldr [varies] imgboot? + hbios [varies] + OSIMG [32K] + +------------------------- +Intermediate Output Files +------------------------- + +OSIMG [32K] -> osimg.bin + romldr [4K] osldr? + dbgmon [4K] tbasic? + CPM (ccp/bdos/cbios) [12K] + ZSYS (zcpr/zsdos/cbios) [12K] + +CPM [12K] -> cpm.bin + ccp [2K] + bdos [3.5K] + cbios [6.5K] + +ZSYS [12K] -> zsys.bin + zcpr [2K] + zsdos [3.5K] + cbios [6.5K] + +----------------- +Compilation Units +----------------- + +setup.asm -> setup.bin: romboot? + std.asm + ver.inc + hbios.inc + build.inc + .asm + plt_.inc + hbios.exp + loader boot? + xio + memmgr + +comldr.asm -> comldr.bin: appboot? + std.asm + ver.inc + hbios.inc + build.inc + .asm + plt_.inc + hbios.exp + loader boot? + xio + memmgr + +imgldr.asm -> imgldr.bin: imgboot? + std.asm + ver.inc + hbios.inc + build.inc + .asm + plt_.inc + hbios.exp + loader boot? + xio + memmgr + +hbios.bin: + std.asm + ver.inc + hbios.inc + build.inc + .asm + plt_.inc + + util.asm + time.asm + bcd.asm + dsky.asm + +romldr.asm -> romldr.bin: loader? + std.asm + ver.inc + hbios.inc + build.inc + .asm + plt_.inc + util.asm + dsky.asm + +dbgmon.asm -> dbgmon.bin: + std.asm + ver.inc + hbios.inc + build.inc + .asm + plt_.inc + util.asm + memmgr.asm + dsky.asm diff --git a/Source/HBIOS/ansi.asm b/Source/HBIOS/ansi.asm index 6716f3db..9c214d2b 100644 --- a/Source/HBIOS/ansi.asm +++ b/Source/HBIOS/ansi.asm @@ -19,13 +19,55 @@ ANSI_DEFCOLOR .EQU 7 ; WHITE ON BLACK ;================================================================================================== ; ANSI_INIT: - PRTS("ANSI: RESET$") + ; SAVE INCOMING VDA DISPATCH ADDRESS + CALL TSTPT ; *DEBUG* + LD (EMU_VDADISPADR),DE ; RECORD NEW VDA DISPATCH ADDRESS ; - JP ANSI_INI ; REUSE THE INI FUNCTION BELOW + ; QUERY THE VIDEO DRIVER FOR SCREEN DIMENSIONS + LD B,BF_VDAQRY ; FUNCTION IS QUERY + LD HL,0 ; WE DO NOT WANT A COPY OF THE CHARACTER BITMAP DATA + CALL TSTPT ; *DEBUG* + CALL EMU_VDADISP ; PERFORM THE QUERY FUNCTION + CALL TSTPT ; *DEBUG* + LD (ANSI_DIM),DE ; SAVE THE SCREEN DIMENSIONS RETURNED +; + ; INITIALIZE ALL WORKING VARIABLES + LD DE,0 ; DE := 0, CURSOR TO HOME POSITION 0,0 + LD (ANSI_POS),DE ; SAVE CURSOR POSITION + LD HL,ANSI_STBASE ; SET STATE TO BASE + LD (ANSI_STATE),HL ; DO IT + LD A,ANSI_DEFATTR ; DEFAULT ATTRIBUTE + LD (ANSI_ATTR),A ; CLEAR ATTRIBUTES + LD A,ANSI_DEFCOLOR ; DEFAULT COLOR + LD (ANSI_COLOR),A ; RESET COLOR + XOR A ; ZERO ACCUM + LD (ANSI_WRAP),A ; CLEAR WRAP FLAG + LD (ANSI_LNM),A ; SET LINE FEED NEW LINE MODE + LD (ANSI_CKM),A ; CLEAR DEC CURSOR KEY MODE + LD (ANSI_COLM),A ; CLEAR 132 COLUMN MODE + LD (ANSI_QLEN),A ; ZERO THE QUEUE LENGTH + LD A,$FF ; SET ALL BITS OF ACCUM + LD (ANSI_AWM),A ; SET DEC AUTOWRAP MODE +; + ; RESET TAB STOPS TO DEFAULT (EVERY 8 CHARACTERS) + LD A,%10000000 ; STOP AT FIRST OF EVERY 8 CHARACTERS + LD HL,ANSI_TABS ; POINT TO TAB STOP BITMAP + LD B,32 ; INIT 32 BYTES +; +ANSI_INIT2: ; LOOP TO RESET TAB STOPS + LD (HL),A ; SET A BYTE + INC HL ; POINT TO NEXT BYTE + DJNZ ANSI_INIT2 ; LOOP TILL ALL BYTES DONE +; + LD DE,ANSI_DISPATCH ; RETURN OUR DISPATCH ADDRESS + CALL TSTPT ; *DEBUG* + XOR A + RET ; ; ; ANSI_DISPATCH: + LD (ANSI_CIODEV),A ; *DEBUG* LD A,B ; GET REQUESTED FUNCTION AND $0F ; ISOLATE SUB-FUNCTION JR Z,ANSI_IN ; $30 @@ -36,11 +78,11 @@ ANSI_DISPATCH: DEC A JR Z,ANSI_OST ; $33 DEC A - JR Z,ANSI_CFG ; $34 - CP 8 - JP Z,ANSI_INI ; $38 - CP 9 - JP Z,ANSI_QRY ; $39 + JR Z,ANSI_INITDEV ; $34 + DEC A + JP Z,ANSI_QUERY ; $35 + DEC A + JP Z,ANSI_DEVICE ; $36 CALL PANIC ; ;================================================================================================== @@ -141,56 +183,25 @@ ANSI_OST: ; VIDEO OUTPUT IS *ALWAYS* READY INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY RET ; -; SET CONFIGURATION -; -ANSI_CFG: - XOR A ; SIGNAL SUCCESS - RET -; ; INITIALIZE ; -ANSI_INI: - ; QUERY THE VIDEO DRIVER FOR SCREEN DIMENSIONS - LD B,BF_VDAQRY ; FUNCTION IS QUERY - LD HL,0 ; WE DO NOT WANT A COPY OF THE CHARACTER BITMAP DATA - CALL EMU_VDADISP ; PERFORM THE QUERY FUNCTION - LD (ANSI_DIM),DE ; SAVE THE SCREEN DIMENSIONS RETURNED -; - ; INITIALIZE ALL WORKING VARIABLES - LD DE,0 ; DE := 0, CURSOR TO HOME POSITION 0,0 - LD (ANSI_POS),DE ; SAVE CURSOR POSITION - LD HL,ANSI_STBASE ; SET STATE TO BASE - LD (ANSI_STATE),HL ; DO IT - LD A,ANSI_DEFATTR ; DEFAULT ATTRIBUTE - LD (ANSI_ATTR),A ; CLEAR ATTRIBUTES - LD A,ANSI_DEFCOLOR ; DEFAULT COLOR - LD (ANSI_COLOR),A ; RESET COLOR - XOR A ; ZERO ACCUM - LD (ANSI_WRAP),A ; CLEAR WRAP FLAG - LD (ANSI_LNM),A ; SET LINE FEED NEW LINE MODE - LD (ANSI_CKM),A ; CLEAR DEC CURSOR KEY MODE - LD (ANSI_COLM),A ; CLEAR 132 COLUMN MODE - LD (ANSI_QLEN),A ; ZERO THE QUEUE LENGTH - LD A,$FF ; SET ALL BITS OF ACCUM - LD (ANSI_AWM),A ; SET DEC AUTOWRAP MODE -; - ; RESET TAB STOPS TO DEFAULT (EVERY 8 CHARACTERS) - LD A,%10000000 ; STOP AT FIRST OF EVERY 8 CHARACTERS - LD HL,ANSI_TABS ; POINT TO TAB STOP BITMAP - LD B,32 ; INIT 32 BYTES +ANSI_INITDEV: + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN ; -ANSI_INI1: ; LOOP TO RESET TAB STOPS - LD (HL),A ; SET A BYTE - INC HL ; POINT TO NEXT BYTE - DJNZ ANSI_INI1 ; LOOP TILL ALL BYTES DONE +; QUERY STATUS ; - ; RESET THE CURRENT VIDEO DRIVER - LD B,BF_VDARES ; SET FUNCTION TO RESET - JP EMU_VDADISP ; RESET VDA AND RETURN +ANSI_QUERY: + CALL PANIC ; NOT IMPLEMENTED + RET ; -; QUERY STATUS +; REPORT DEVICE ; -ANSI_QRY: +ANSI_DEVICE: + ;LD D,CIODEV_VDA ; D := DEVICE TYPE + LD A,(ANSI_CIODEV) ; GET THE CURRENT CIO DEVICE *DEBUG* + LD D,A ; AND PASS BACK IN D *DEBUG* + LD E,C ; E := PHYSICAL UNIT XOR A ; SIGNAL SUCCESS RET ; @@ -318,7 +329,7 @@ ANSI_ESCDISP1: ; NORMAL ESCAPE DISPATCHING, NO INT CHARACTER ; ANSI_ESCDISP1A: ; CONTINUE NORMAL ESCAPE SEQ DISPATCHING CP 'c' ; RIS: RESET TO INITIAL STATE - JP Z,ANSI_INI ; DO A FULL RESET + JP Z,ANSI_INITDEV ; DO A FULL RESET JP ANSI_UNK ; UNKNOWN, ABORT ; ANSI_ESCDISP2: ; ESC DISPATCHING FOR '#' INT CHAR @@ -1355,3 +1366,5 @@ ANSI_FINAL .DB 0 ; FINAL CHARACTER RECORDED HERE ANSI_PARIDX .DB 0 ; NUMBER OF PARAMETERS RECORDED ANSI_PARLST .FILL 16,0 ; PARAMETER VALUE LIST (UP TO 16 BYTE VALUES) ANSI_VARLEN .EQU $ - ANSI_VARS +; +ANSI_CIODEV .DB 0 ; *DEBUG* diff --git a/Source/HBIOS/asci.asm b/Source/HBIOS/asci.asm index 64a26d05..37b8b1d4 100644 --- a/Source/HBIOS/asci.asm +++ b/Source/HBIOS/asci.asm @@ -81,35 +81,24 @@ ASCI_LKUPCNT .EQU ($ - ASCI_LKUP) / 3 ; ; ; -; CHARACTER DEVICE DRIVER ENTRY -; A: RESULT (OUT), CF=ERR -; B: FUNCTION (IN) -; C: CHARACTER (IN/OUT) -; E: DEVICE/UNIT (IN) ; -ASCI_DISPATCH: - LD A,C ; GET DEVICE/UNIT - AND $0F ; ISOLATE UNIT - JP Z,ASCI0 - DEC A - JP Z,ASCI1 - CALL PANIC ; -ASCI0: - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JP Z,ASCI0_IN - DEC A - JP Z,ASCI0_OUT - DEC A - JP Z,ASCI0_IST - DEC A - JP Z,ASCI0_OST - CALL PANIC +ASCI_INIT: ; +; SETUP THE DISPATCH TABLE ENTRIES ; + LD B,2 ; ALWAYS 2 ASCI UNITS ON Z180 + LD C,0 ; PHYSICAL UNIT INDEX +ASCI_INIT0: + PUSH BC ; SAVE LOOP CONTROL + LD B,C ; PHYSICAL UNIT + LD C,CIODEV_ASCI ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL CIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED + POP BC ; RESTORE LOOP CONTROL + INC C ; NEXT PHYSICAL UNIT + DJNZ ASCI_INIT0 ; LOOP UNTIL DONE ; -ASCI_INIT: ; ASCI0 PRTS("ASCI0: IO=0x$") LD A,Z180_TDR0 @@ -131,7 +120,7 @@ ASCI_INIT: LD A,Z180_ASCIB0 OUT0 (Z180_CNTLB0),A #ENDIF - +; ; ASCI1 CALL NEWLINE PRTS("ASCI1: IO=0x$") @@ -156,6 +145,38 @@ ASCI_INIT: RET ; +; CHARACTER DEVICE DRIVER ENTRY +; A: RESULT (OUT), CF=ERR +; B: FUNCTION (IN) +; C: CHARACTER (IN/OUT) +; E: DEVICE/UNIT (IN) +; +ASCI_DISPATCH: + LD A,C ; GET DEVICE/UNIT + AND $0F ; ISOLATE UNIT + JP Z,ASCI0 + DEC A + JP Z,ASCI1 + CALL PANIC +; +ASCI0: + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,ASCI0_IN + DEC A + JP Z,ASCI0_OUT + DEC A + JP Z,ASCI0_IST + DEC A + JP Z,ASCI0_OST + DEC A + JP Z,ASCI0_INITDEV + DEC A + JP Z,ASCI0_QUERY + DEC A + JP Z,ASCI0_DEVICE + CALL PANIC +; ; ; ASCI0_IN: @@ -207,16 +228,36 @@ ASCI0_OST: ; ; ; +ASCI0_INITDEV: +ASCI0_QUERY: + CALL PANIC +; +; +; +ASCI0_DEVICE: + LD D,CIODEV_ASCI ; D := DEVICE TYPE + LD E,C ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET +; +; +; ASCI1: LD A,B ; GET REQUESTED FUNCTION AND $0F ; ISOLATE SUB-FUNCTION - JR Z,ASCI0_IN + JR Z,ASCI1_IN DEC A - JR Z,ASCI0_OUT + JR Z,ASCI1_OUT + DEC A + JR Z,ASCI1_IST + DEC A + JR Z,ASCI1_OST + DEC A + JP Z,ASCI1_INITDEV DEC A - JR Z,ASCI0_IST + JP Z,ASCI1_QUERY DEC A - JR Z,ASCI0_OST + JP Z,ASCI1_DEVICE CALL PANIC ; ; @@ -268,3 +309,17 @@ ASCI1_OST: XOR A INC A ; SIGNAL BUFFER EMPTY, A = 1 RET +; +; +; +ASCI1_INITDEV: +ASCI1_QUERY: + CALL PANIC +; +; +; +ASCI1_DEVICE: + LD D,CIODEV_ASCI ; D := DEVICE TYPE + LD E,C ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index fc1e56df..ae6ded25 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -37,80 +37,55 @@ CVDU_INIT: PRTS("KB$") CALL CVDU_LOADFONT ; LOAD FONT DATA FROM ROM TO CVDU STRORAGE -CVDU_RESET: - LD A,$0E ; ATTRIBUTE IS STANDARD WHITE ON BLACK - LD (CVDU_ATTR),A ; SAVE IT - - LD DE,0 ; ROW = 0, COL = 0 - CALL CVDU_XY ; SEND CURSOR TO TOP LEFT - LD A,' ' ; BLANK THE SCREEN - LD DE,$800 ; FILL ENTIRE BUFFER - CALL CVDU_FILL ; DO IT - LD DE,0 ; ROW = 0, COL = 0 - CALL CVDU_XY ; SEND CURSOR TO TOP LEFT + ; ADD OURSELVES TO CIO DISPATCH TABLE + LD B,0 ; PHYSICAL UNIT IS ZERO + LD C,CIODEV_CVDU ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE - XOR A ; SIGNAL SUCCESS - RET + CALL TSTPT ; *DEBUG* + LD D,VDAEMU ; DEFAULT EMULATION + LD E,0 ; VIDEO MODE = 0 + JP CVDU_VDAINI ; ;====================================================================== ; CVDU DRIVER - CHARACTER I/O (CIO) DISPATCHER AND FUNCTIONS ;====================================================================== ; CVDU_DISPCIO: - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JR Z,CVDU_CIOIN ; $00 - DEC A - JR Z,CVDU_CIOOUT ; $01 - DEC A - JR Z,CVDU_CIOIST ; $02 - DEC A - JR Z,CVDU_CIOOST ; $03 - CALL PANIC -; -CVDU_CIOIN: - JP KBD_READ ; CHAIN TO KEYBOARD DRIVER -; -CVDU_CIOIST: - JP KBD_STAT ; CHAIN TO KEYBOARD DRIVER -; -CVDU_CIOOUT: - JP CVDU_VDAWRC ; WRITE CHARACTER + JP PANIC +CVDU_CIODISPADR .EQU $ - 2 ; -CVDU_CIOOST: - XOR A ; A = 0 - INC A ; A = 1, SIGNAL OUTPUT BUFFER READY - RET -; ;====================================================================== ; CVDU DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS ;====================================================================== ; -CVDU_DISPVDA: +CVDU_DISPATCH: LD A,B ; GET REQUESTED FUNCTION AND $0F ; ISOLATE SUB-FUNCTION - JR Z,CVDU_VDAINI ; $40 + JP Z,CVDU_VDAINI ; $40 DEC A - JR Z,CVDU_VDAQRY ; $41 + JP Z,CVDU_VDAQRY ; $41 DEC A - JR Z,CVDU_VDARES ; $42 + JP Z,CVDU_VDARES ; $42 DEC A - JR Z,CVDU_VDASCS ; $43 + JP Z,CVDU_VDASCS ; $43 DEC A - JR Z,CVDU_VDASCP ; $44 + JP Z,CVDU_VDASCP ; $44 DEC A - JR Z,CVDU_VDASAT ; $45 + JP Z,CVDU_VDASAT ; $45 DEC A - JR Z,CVDU_VDASCO ; $46 + JP Z,CVDU_VDASCO ; $46 DEC A - JR Z,CVDU_VDAWRC ; $47 + JP Z,CVDU_VDAWRC ; $47 DEC A - JR Z,CVDU_VDAFIL ; $48 + JP Z,CVDU_VDAFIL ; $48 DEC A - JR Z,CVDU_VDACPY ; $49 + JP Z,CVDU_VDACPY ; $49 DEC A - JR Z,CVDU_VDASCR ; $4A + JP Z,CVDU_VDASCR ; $4A DEC A JP Z,KBD_STAT ; $4B DEC A @@ -120,7 +95,21 @@ CVDU_DISPVDA: CALL PANIC CVDU_VDAINI: - JP CVDU_INIT ; INITIALIZE + ; RESET VDA + PUSH DE ; SAVE EMULATION TYPE (IN D) + CALL CVDU_VDARES ; RESET VDA + POP DE ; RECOVER EMULATION TYPE + + ; INITIALIZE EMULATION + LD C,D ; EMULATION MODE TO C + LD DE,CVDU_DISPATCH ; DISPATCH ADDRESS TO DE + CALL TSTPT ; *DEBUG* + CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER + LD (CVDU_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS + CALL TSTPT ; *DEBUG* + + XOR A ; SIGNAL SUCCESS + RET CVDU_VDAQRY: LD C,$00 ; MODE ZERO IS ALL WE KNOW @@ -131,7 +120,20 @@ CVDU_VDAQRY: RET CVDU_VDARES: - JR CVDU_RESET ; DO THE RESET + LD A,$0E ; ATTRIBUTE IS STANDARD WHITE ON BLACK + LD (CVDU_ATTR),A ; SAVE IT + + LD DE,0 ; ROW = 0, COL = 0 + CALL CVDU_XY ; SEND CURSOR TO TOP LEFT + LD A,' ' ; BLANK THE SCREEN + LD DE,$800 ; FILL ENTIRE BUFFER + CALL CVDU_FILL ; DO IT + LD DE,0 ; ROW = 0, COL = 0 + CALL CVDU_XY ; SEND CURSOR TO TOP LEFT + + XOR A + RET + CVDU_VDASCS: CALL PANIC ; NOT IMPLEMENTED (YET) diff --git a/Source/HBIOS/cvdu_font.asm b/Source/HBIOS/cvdu_font.asm index 567baef0..07d8e7c6 100644 --- a/Source/HBIOS/cvdu_font.asm +++ b/Source/HBIOS/cvdu_font.asm @@ -511,6 +511,7 @@ CVDU_FONTDATA: .DB $00,$00,$00,$00,$00,$00,$00,$00 .DB $0F,$0F,$0F,$0F,$FF,$FF,$FF,$FF .DB $00,$00,$00,$00,$00,$00,$00,$00 +#IF 0 ; *DEBUG* .DB $0F,$0F,$0F,$0F,$F0,$F0,$F0,$F0 .DB $00,$00,$00,$00,$00,$00,$00,$00 .DB $3C,$66,$6E,$6E,$60,$62,$3C,$00 @@ -1023,3 +1024,4 @@ CVDU_FONTDATA: .DB $00,$00,$00,$00,$00,$00,$00,$00 .DB $0F,$0F,$0F,$0F,$FF,$FF,$FF,$FF .DB $00,$00,$00,$00,$00,$00,$00,$00 +#ENDIF \ No newline at end of file diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 16a7f7d0..60e2ea1b 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -37,13 +37,15 @@ BS: .EQU 08H ; ASCII BACKSPACE CHARACTER JP DSKY_ENTRY JP UART_ENTRY ; -#DEFINE CIOMODE_HBIOS #INCLUDE "util.asm" ; #INCLUDE "memmgr.asm" ; #IF DSKYENABLE ; +#INCLUDE "dsky.asm" +; +; ;__DSKY_ENTRY_________________________________________________________________ ; DSKY_ENTRY: @@ -686,6 +688,76 @@ GETLNDONE: POP DE ; RESTORE DE RET ; ; +;__COUT_______________________________________________________________________ +; +; OUTPUT CHARACTER FROM A +;_____________________________________________________________________________ +; +COUT: + ; SAVE ALL INCOMING REGISTERS + PUSH AF + PUSH BC + PUSH DE + PUSH HL +; + ; OUTPUT CHARACTER TO CONSOLE VIA HBIOS + LD E,A ; OUTPUT CHAR TO E + LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR + RST 08 ; HBIOS OUTPUTS CHARACTDR +; + ; RESTORE ALL REGISTERS + POP HL + POP DE + POP BC + POP AF + RET +; +;__CIN________________________________________________________________________ +; +; INPUT CHARACTER TO A +;_____________________________________________________________________________ +; +CIN: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + ; INPUT CHARACTER FROM CONSOLE VIA HBIOS + LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR + RST 08 ; HBIOS READS CHARACTDR + LD A,E ; MOVE CHARACTER TO A FOR RETURN +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; +;__CST________________________________________________________________________ +; +; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) +;_____________________________________________________________________________ +; +CST: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + ; GET CONSOLE INPUT STATUS VIA HBIOS + LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS + RST 08 ; HBIOS RETURNS STATUS IN A +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; ;__KIN________________________________________________________________________ ; ; READ FROM THE SERIAL PORT AND ECHO & CONVERT INPUT TO UCASE diff --git a/Source/HBIOS/dsky.asm b/Source/HBIOS/dsky.asm new file mode 100644 index 00000000..ca89d642 --- /dev/null +++ b/Source/HBIOS/dsky.asm @@ -0,0 +1,252 @@ +; +;================================================================================================== +; DSKY KEYBOARD ROUTINES +;================================================================================================== +; +PPIA .EQU PPIBASE + 0 ; PORT A +PPIB .EQU PPIBASE + 1 ; PORT B +PPIC .EQU PPIBASE + 2 ; PORT C +PPIX .EQU PPIBASE + 3 ; PPI CONTROL PORT + +; +; _____C0______C1______C2______C3__ +;B5 | $20 D $60 E $A0 F $E0 BO +;B4 | $10 A $50 B $90 C $D0 GO +;B3 | $08 7 $48 8 $88 9 $C8 EX +;B2 | $04 4 $44 5 $84 6 $C4 DE +;B1 | $02 1 $42 2 $82 3 $C2 EN +;B0 | $01 FW $41 0 $81 BK $C1 CL +; +KY_0 .EQU 000H +KY_1 .EQU 001H +KY_2 .EQU 002H +KY_3 .EQU 003H +KY_4 .EQU 004H +KY_5 .EQU 005H +KY_6 .EQU 006H +KY_7 .EQU 007H +KY_8 .EQU 008H +KY_9 .EQU 009H +KY_A .EQU 00AH +KY_B .EQU 00BH +KY_C .EQU 00CH +KY_D .EQU 00DH +KY_E .EQU 00EH +KY_F .EQU 00FH +KY_FW .EQU 010H ; FORWARD +KY_BK .EQU 011H ; BACKWARD +KY_CL .EQU 012H ; CLEAR +KY_EN .EQU 013H ; ENTER +KY_DE .EQU 014H ; DEPOSIT +KY_EX .EQU 015H ; EXAMINE +KY_GO .EQU 016H ; GO +KY_BO .EQU 017H ; BOOT +; +;__DSKY_INIT_________________________________________________________________________________________ +; +; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS +;____________________________________________________________________________________________________ +; +DSKY_INIT: + LD A,82H + OUT (PPIX),A + LD A,30H ;disable /CS on PPISD card(s) + OUT (PPIC),A + XOR A + LD (KY_BUF),A + RET + +#IFDEF DSKY_KBD +; +;__KY_STAT___________________________________________________________________________________________ +; +; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS +;____________________________________________________________________________________________________ +; +KY_STAT: + ; IF WE ALREADY HAVE A KEY, RETURN WITH NZ + LD A,(KY_BUF) + OR A + RET NZ + ; SCAN FOR A KEYPRESS, A=0 NO DATA OR A=RAW BYTE + CALL KY_SCAN ; SCAN KB ONCE + OR A ; SET FLAGS + RET Z ; NOTHING FOUND, GET OUT + LD (KY_BUF),A ; SAVE RAW KEYCODE + RET ; RETURN +; +;__KY_GET____________________________________________________________________________________________ +; +; GET A SINGLE KEY (WAIT FOR ONE IF NECESSARY) +;____________________________________________________________________________________________________ +; +KY_GET: + ; SEE IF WE ALREADY HAVE A KEY SAVED, GO TO DECODE IF SO + LD A,(KY_BUF) + OR A + JR NZ,KY_DECODE + ; NO KEY SAVED, WAIT FOR ONE +KY_STATLOOP: + CALL KY_STAT + OR A + JR Z,KY_STATLOOP + ; DECODE THE RAW VALUE +KY_DECODE: + LD D,00H + LD HL,KY_KEYMAP ; POINT TO BEGINNING OF TABLE +KY_GET_LOOP: + CP (HL) ; MATCH? + JR Z,KY_GET_DONE ; FOUND, DONE + INC HL + INC D ; D + 1 + JR NZ,KY_GET_LOOP ; NOT FOUND, LOOP UNTIL EOT +KY_GET_DONE: + ; CLEAR OUT KEY_BUF + XOR A + LD (KY_BUF),A + ; RETURN THE INDEX POSITION WHERE THE RAW VALUE WAS FOUND + LD A,D + RET +; +;__KY_SCAN____________________________________________________________________________________________ +; +; SCAN KEYBOARD MATRIX FOR AN INPUT +;____________________________________________________________________________________________________ +; +KY_SCAN: + LD C,0000H + LD A,41H | 30H ; SCAN COL ONE + OUT (PPIC),A ; SEND TO COLUMN LINES + CALL DLY2 ; DEBOUNCE + IN A,(PPIB) ; GET ROWS + AND 7FH ;ignore PB7 for PPISD + CP 00H ; ANYTHING PRESSED? + JR NZ,KY_SCAN_FOUND ; YES, EXIT + + LD C,0040H + LD A,42H | 30H ; SCAN COL TWO + OUT (PPIC),A ; SEND TO COLUMN LINES + CALL DLY2 ; DEBOUNCE + IN A,(PPIB) ; GET ROWS + AND 7FH ;ignore PB7 for PPISD + CP 00H ; ANYTHING PRESSED? + JR NZ,KY_SCAN_FOUND ; YES, EXIT + + LD C,0080H + LD A,44H | 30H ; SCAN COL THREE + OUT (PPIC),A ; SEND TO COLUMN LINES + CALL DLY2 ; DEBOUNCE + IN A,(PPIB) ; GET ROWS + AND 7FH ;ignore PB7 for PPISD + CP 00H ; ANYTHING PRESSED? + JR NZ,KY_SCAN_FOUND ; YES, EXIT + + LD C,00C0H ; + LD A,48H | 30H ; SCAN COL FOUR + OUT (PPIC),A ; SEND TO COLUMN LINES + CALL DLY2 ; DEBOUNCE + IN A,(PPIB) ; GET ROWS + AND 7FH ;ignore PB7 for PPISD + CP 00H ; ANYTHING PRESSED? + JR NZ,KY_SCAN_FOUND ; YES, EXIT + + LD A,040H | 30H ; TURN OFF ALL COLUMNS + OUT (PPIC),A ; SEND TO COLUMN LINES + LD A,00H ; RETURN NULL + RET ; EXIT + +KY_SCAN_FOUND: + AND 3FH ; CLEAR TOP TWO BITS + OR C ; ADD IN ROW BITS + LD C,A ; STORE VALUE + + ; WAIT FOR KEY TO BE RELEASED + LD A,4FH | 30H ; SCAN ALL COL LINES + OUT (PPIC),A ; SEND TO COLUMN LINES + CALL DLY2 ; DEBOUNCE +KY_CLEAR_LOOP: ; WAIT FOR KEY TO CLEAR + IN A,(PPIB) ; GET ROWS + AND 7FH ;ignore PB7 for PPISD + CP 00H ; ANYTHING PRESSED? + JR NZ,KY_CLEAR_LOOP ; YES, LOOP UNTIL KEY RELEASED + + LD A,040H | 30H ; TURN OFF ALL COLUMNS + OUT (PPIC),A ; SEND TO COLUMN LINES + + LD A,C ; RESTORE VALUE + RET +; +;_KEYMAP_TABLE_____________________________________________________________________________________________________________ +; +KY_KEYMAP: +; 0 1 2 3 4 5 6 7 + .DB 041H,002H,042H,082H,004H,044H,084H,008H +; 8 9 A B C D E F + .DB 048H,088H,010H,050H,090H,020H,060H,0A0H +; FW BK CL EN DE EX GO BO + .DB 001H,081H,0C1H,0C2H,0C4H,0C8H,0D0H,0E0H +; +#ENDIF ; DSKY_KBD +; +;================================================================================================== +; DSKY HEX DISPLAY +;================================================================================================== +; +DSKY_HEXOUT: + LD B,DSKY_HEXBUFLEN + LD HL,DSKY_BUF + LD DE,DSKY_HEXBUF +DSKY_HEXOUT1: + LD A,(DE) ; FIRST NIBBLE + SRL A + SRL A + SRL A + SRL A + LD (HL),A + INC HL + LD A,(DE) ; SECOND NIBBLE + AND 0FH + LD (HL),A + INC HL + INC DE ; NEXT BYTE + DJNZ DSKY_HEXOUT1 + + LD A,82H ; SETUP PPI + OUT (PPIX),A + CALL DSKY_COFF + LD A,0D0H ; 7218 -> (DATA COMING, HEXA DECODE) + OUT (PPIA),A + CALL DSKY_STROBEC + + LD HL,DSKY_BUF ; POINT TO START OF BUF + LD B,DSKY_BUFLEN ; NUMBER OF DIGITS + LD C,PPIA +DSKY_HEXOUT2: + OUTI + JP Z,DSKY_STROBE ; DO FINAL STROBE AND RETURN + CALL DSKY_STROBE + JR DSKY_HEXOUT2 + +DSKY_STROBEC: + LD A,80H | 30H + JP DSKY_STROBE0 + +DSKY_STROBE: + LD A,00H | 30H ; SET WRITE STROBE + +DSKY_STROBE0: + OUT (PPIC),A ; OUT TO PORTC + CALL DLY2 ; DELAY +DSKY_COFF + LD A,40H | 30H ; SET CONTROL PORT OFF + OUT (PPIC),A ; OUT TO PORTC +; CALL DSKY_DELAY ; WAIT + RET +; +; +; +KY_BUF .DB 0 +DSKY_BUF: .FILL 8,0 +DSKY_BUFLEN .EQU $ - DSKY_BUF +DSKY_HEXBUF .FILL 4,0 +DSKY_HEXBUFLEN .EQU $ - DSKY_HEXBUF diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index d8c02f80..7ae53245 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -399,11 +399,6 @@ FD_DISPATCH: JP Z,FD_CAP ; SUB-FUNC 10: REPORT CAPACITY DEC A JP Z,FD_GEOM ; SUB-FUNC 11: REPORT GEOMETRY - DEC A - DEC A - DEC A - DEC A - JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO ; FD_VERIFY: FD_FORMAT: diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 14bfdb94..f4dec2f4 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -53,7 +53,7 @@ DESC .DB "ROMWBW v", BIOSVER, ", Copyright 2015, Wayne Warthen, GNU GPL v3", 0 HCB .FILL $100,$FF ; RESERVED FOR HBIOS CONTROL BLOCK ; ;================================================================================================== -; HBIOS UPPER MEMORY PROXY +; HBIOS UPPER MEMORY PROXY (RELOCATED TO RUN IN TOP 2 PAGES OF CPU RAM) ;================================================================================================== ; ; THE FOLLOWING CODE IS RELOCATED TO THE TOP OF MEMORY TO HANDLE INVOCATION DISPATCHING @@ -531,16 +531,6 @@ HB_START: LD BC,BNKTOP - HB_END ; MAX SIZE OF HEAP LD A,$FF ; FILL WITH $FF CALL FILL ; DO IT -;; -;; -;; ALLOCATE THE DEFAULT DISK BUFFER ADDRESS -;; -; LD HL,512 ; 512 BYTES -; CALL HB_ALLOC ; ALLOCATE SPACE ON HEAP -; CALL NZ,PANIC ; PANIC ON ERROR -;; -; LD (DIOBUFDEF),HL ; SET DEFAULT -; LD (DIOBUF),HL ; INIT CURRENT BUF ADDRESS ; ; PERFORM DEVICE INITIALIZATION ; @@ -561,6 +551,13 @@ INITSYS1: POP DE DJNZ INITSYS1 ; +; PRIOR TO THIS POINT, CONSOLE I/O WAS DIRECTED TO HARDWARE (XIO.ASM). +; NOW THAT HBIOS IS READY, SET THE CONSOLE UNIT TO ACTIVATE CONSOLE I/O +; VIA HBIOS. +; + XOR A ; CONSOLE DEVICE IS UNIT #0 BY FIAT + LD (HCB + HCB_CONDEV),A ; SAVE IT, ACTIVATES CONSOLE ON HBIOS +; ; NOW SWITCH TO CRT CONSOLE IF CONFIGURED ; #IF CRTACT @@ -581,8 +578,8 @@ INITSYS1: CALL NEWLINE ; ; SWITCH TO CRT CONSOLE - LD A,CRTDEV ; GET CRT DISPLAY DEVICE - LD (HCB + HCB_CONDEV),A ; SAVE IT + LD A,(HCB + HCB_CRTDEV) ; GET CRT DISPLAY DEVICE + LD (HCB + HCB_CONDEV),A ; SAVE IT AS ACTIVE CONSOLE DEVICE ; ; DISPLAY HBIOS BANNER ON NEW CONSOLE CALL NEWLINE @@ -623,12 +620,6 @@ HB_INITTBL: #IF (N8VENABLE) .DW N8V_INIT #ENDIF -#IF (PRPENABLE) - .DW PRP_INIT -#ENDIF -#IF (PPPENABLE) - .DW PPP_INIT -#ENDIF #IF (DSKYENABLE) .DW DSKY_INIT #ENDIF @@ -653,18 +644,18 @@ HB_INITTBL: #IF (HDSKENABLE) .DW HDSK_INIT #ENDIF +#IF (PRPENABLE) + .DW PRP_INIT +#ENDIF +#IF (PPPENABLE) + .DW PPP_INIT +#ENDIF #IF (PPKENABLE) .DW PPK_INIT #ENDIF #IF (KBDENABLE) .DW KBD_INIT #ENDIF -#IF (TTYENABLE) - .DW TTY_INIT -#ENDIF -#IF (ANSIENABLE) - .DW ANSI_INIT -#ENDIF ; HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2) ; @@ -697,47 +688,33 @@ IDLE: ;__________________________________________________________________________________________________ ; HB_DISPATCH: - - ; *DEBUG* START -#IF 1 - ; ADD RETURN HOOK ON TOP OF STACK - PUSH HL - LD HL,HB_DISPATCH_DBG1 - EX (SP),HL - - ; JUMP OVER DBG1 TO CONTINUE NORMAL EXECUTION - JR HB_DISPATCH_DBG3 ; -HB_DISPATCH_DBG1: - ; EXECUTION COMES HERE ON RETURN +#IF 1 ; *DEBUG* START +; + CALL HB_DISPCALL ; DO THE WORK +; ; CHECK STACK INTEGRITY PUSH AF - LD A,(HBX_STACK - HBX_STKSIZ) + LD A,(HBX_STACK - HBX_STKSIZ + $08) CP $FF - JR Z,HB_DISPATCH_DBG2 - CALL PANIC - CALL CONTINUE -HB_DISPATCH_DBG2: + CALL NZ,PANIC POP AF RET +HB_DISPCALL: ; -HB_DISPATCH_DBG3: -#ENDIF - ; *DEBUG* END +#ENDIF ; *DEBUG* END ; LD A,B ; REQUESTED FUNCTION IS IN B CP BF_CIO + $10 ; $00-$0F: CHARACTER I/O JP C,CIO_DISPATCH - CP BF_DIO + $10 ; $10-$1F: OLD DISK I/O + CP BF_DIO + $10 ; $10-$1F: DISK I/O JP C,DIO_DISPATCH CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC) JP C,RTC_DISPATCH CP BF_EMU + $10 ; $30-$3F: EMULATION - JP C,EMU_DISPATCH + CALL C,PANIC ; OBSOLETE! CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER JP C,VDA_DISPATCH - CP BF_NDIO + $10 ; $50-$5F: NEW DISK I/O - JP C,NDIO_NEWDISP CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0 CALL C,PANIC ; PANIC IF LESS THAN BF_SYS @@ -750,18 +727,55 @@ HB_DISPATCH_DBG3: ; ; ROUTE CALL TO SPECIFIED CHARACTER I/O DRIVER ; B: FUNCTION -; C: DEVICE/UNIT +; C: UNIT NUMBER ; CIO_DISPATCH: ; - ; CIO FUNCTIONS STARTING AT CIOGETBUF ARE COMMON FUNCTIONS - LD A,B ; GET THE REQUESTED FUNCTION - CP BF_CIOGETCNT ; TEST FOR FIRST OF THE COMMON FUNCTIONS - JR NC,CIO_COMMON ; IF >= CIOGETCNT HANDLE AS COMMON DIO FUNCTION +; ON ENTRY C IS HBIOS UNIT # (INDEX INTO CIO_TBL OF CHARACTER DEVICES) +; USE UNIT # IN C TO LOOKUP CIO_TBL ENTRY, THEN +; CONVERT C TO THE DEVICE/DRIVER SPECIFIC UNIT ID +; AND GET THE DEVICE TYPE TO A FOR DRIVER DISPATCHING +; + LD A,C ; INCOMING UNIT INDEX TO A + PUSH HL ; SAVE INCOMING HL + LD HL,CIO_CNT ; HL := ADDRESS OF TABLE ENTRY COUNT PREFIX + CP (HL) ; COMPARE TO INCOMING ENTRY INDEX + JR C,CIO_DISPATCH1 ; UNIT OK, PROCEED + CP CIODEV_CONSOLE ; CHECK FOR SPECIAL VALUE - CONSOLE OUTPUT + JR Z,CIO_DISPATCH_CON ; DO IT + ;CP CIODEV_VDA ; CHECK FOR SPECIAL VALUE - VDA OUTPUT + ;JR Z,CIO_DISPATCH_VDA ; DO IT +; + ; NOT GOOD, INCOMING UNIT IS OUT OF RANGE + POP HL ; RESTORE HL/STACK + CALL PANIC ; PANIC + OR $FF ; SIGNAL ERROR + RET ; AND RETURN +; +CIO_DISPATCH_CON: + LD A,(HCB + HCB_CONDEV) ; PUT CONSOLE UNIT NUMBER IN A + JR CIO_DISPATCH1 ; AND CONTINUE +;; +;CIO_DISPATCH_VDA: +; LD A,B ; FUNCTION NUMBER TO A +; ADD A,BF_EMU - BF_CIO ; TRANSLATE FUNCTION CIOXXX -> EMUXXX +; LD B,A ; PUT NEW FUNCTION NUMBER IN B +; POP HL ; RESTORE HL/STACK +; JP EMU_DISPATCH ; CHAIN TO EMULATOR DISPATCH +; +CIO_DISPATCH1: +; + INC HL ; BUMP PAST COUNT PREFIX TO START OF TABLE + RLCA ; MULTIPLY UNIT # BY 4 TO + RLCA ; ... TO CALC ENTRY OFFSET + CALL ADDHLA ; HL := ENTRY ADDRESS + LD A,(HL) ; GET DEVICE TYPE BYTE + INC HL ; BUMP TO DEVICE UNIT INDEX BYTE + LD C,(HL) ; DEVICE UNIT INDEX TO C + POP HL ; RECOVER INCOMING HL VALUE +; +; DISPATCH TO DRIVER BASED ON DEVICE TYPE IN A ; - ; STANDARD FUNCTIONS ARE DISPATCHED TO DRIVER - LD A,C ; REQUESTED DEVICE/UNIT IS IN C - AND $F0 ; ISOLATE THE DEVICE PORTION #IF (UARTENABLE) CP CIODEV_UART JP Z,UART_DISPATCH @@ -794,212 +808,122 @@ CIO_DISPATCH: CP CIODEV_N8V JP Z,N8V_DISPCIO #ENDIF - CP CIODEV_VDA - JR Z,CIOVDA - CP CIODEV_CONSOLE - JR Z,CIOCON CALL PANIC + RET ; -CIOVDA: - LD A,B - ADD A,BF_EMU - BF_CIO ; TRANSLATE FUNCTION CIOXXX -> EMUXXX - LD B,A - JP EMU_DISPATCH +; HBIOS CHARACTER DEVICE UNIT TABLE ; -CIOCON: - LD A,(HCB + HCB_CONDEV) - LD C,A - JR CIO_DISPATCH +; TABLE IS BUILT DYNAMICALLY BY EACH DRIVER DURING INITIALIZATION. +; THE TABLE IS PREFIXED BY TWO BYTES. TABLE - 1 CONTAINS THE CURRENT +; NUMBER OF ENTRIES. TABLE - 2 CONTAINS THE MAXIMUM NUMBER OF ENTRIES. +; EACH ENTRY IS DEFINED AS: ; -; HANDLE COMMON CHARACTER FUNCTIONS (NOT DEVICE DRIVER SPECIFIC) +; BYTE DEVICE TYPE ID +; BYTE DEVICE/DRIVER UNIT NUMBER +; WORD UNIT DATA ADDRESS ; -CIO_COMMON: - SUB BF_CIOGETCNT ; FUNCTION = CIOGETCNT? - JR Z,CIO_GETCNT ; YES, HANDLE IT - DEC A ; FUNCTION = CIOGETINF? - JR Z,CIO_GETINF ; YES, HANDLE IT - CALL PANIC ; INVALID FUNCTION SPECFIED +CIO_MAX .EQU 16 ; UP TO 16 UNITS +CIO_SIZ .EQU CIO_MAX * 4 ; EACH ENTRY IS 4 BYTES ; -; CHARACTER DEVICE: GET DEVICE COUNT + .DB CIO_MAX ; MAX ENTRY COUNT TABLE PREFIX +CIO_CNT .DB 0 ; ENTRY COUNT PREFIX +CIO_TBL .FILL CIO_SIZ,0 ; SPACE FOR ENTRIES ; -CIO_GETCNT: - LD A,(HCB + HCB_CDL - 1) ; GET DEVICE COUNT (FIRST BYTE OF LIST) - LD B,A ; PUT IT IN B - XOR A ; SIGNALS SUCCESS - RET +; ADD AN ENTRY TO THE CIO UNIT TABLE (SEE HB_ADDENT FOR DETAILS) ; -; CHARACTER DEVICE: GET DEVICE INFO -; -CIO_GETINF: - LD HL,HCB + HCB_CDL - 1 ; POINT TO DEVICE MAP ENTRY COUNT (FIRST BYTE OF LIST) - LD B,(HL) ; ENTRY COUNT TO B - LD A,C ; INDEX TO A - CP B ; CHECK INDEX AGAINST MAX VALUE (INDEX - COUNT) - JR NC,CIO_GETINF1 ; IF INDEX TOO HIGH, ERR - INC HL ; BUMP TO START OF CHR MAP ENTRIES - CALL ADDHLA ; AND POINT TO REQUESTED INDEX - LD C,(HL) ; DEVICE/UNIT TO C - XOR A ; SIGNAL SUCCESS - RET ; DONE - -CIO_GETINF1: - OR $FF ; SIGNAL ERROR - RET ; RETURN +CIO_ADDENT: + LD HL,CIO_TBL ; POINT TO CIO TABLE + JP HB_ADDENT ; ... AND GO TO COMMON CODE ; ;================================================================================================== -; OLD STYLE DISK I/O DEVICE DISPATCHER +; DISK I/O DEVICE DISPATCHER ;================================================================================================== ; ; ROUTE CALL TO SPECIFIED DISK I/O DRIVER ; B: FUNCTION -; C: DEVICE/UNIT +; C: UNIT NUMBER ; + +;NDIO_NEWDISP: +; ; START OF THE ACTUAL DRIVER DISPATCHING LOGIC +; PUSH IY ; SAVE ORIGINAL IY +; PUSH HL ; SAVE HL +; LD HL,NDIO_RET ; GET RETURN VECTOR +; EX (SP),HL ; RECOVER HL & PUT RETURN VECTOR ON TOS +; PUSH HL ; SAVE HL +; LD HL,DIO_TBL ; POINT TO DISPATCH TABLE +; LD A,C ; GET REQUESTED UNIT FROM C +; RLCA ; MULTIPLY UNIT BY 4 +; RLCA ; ... TO GET BYTE OFFSET OF ENTRY +; CALL ADDHLA ; HL -> ENTRY ADDRESS +; LD A,(HL) ; DRIVER ID TO A +; PUSH AF ; SAVE IT FOR NOW +; INC HL ; POINT TO UNIT +; LD C,(HL) ; PUT IT IN C FOR DRIVER +; INC HL ; POINT TO LSB OF UNIT DATA ADDRESS +; LD A,(HL) ; HL := UNIT DATA ADDRESS +; INC HL ; ... +; LD H,(HL) ; ... +; LD L,A ; ... +; POP AF ; RECOVER DRIVER ID +; EX (SP),HL ; RECOVER ORIG HL & PUT UNIT DATA ADDRESS TO TOS +; POP IY ; IY := UNIT DATA ADDRESS +; JP NDIO_DISPATCH2 ; USE LEGACY DISPATCHER +;; +;NDIO_RET: +; POP IY ; RECOVER IY +; OR A ; MAKE SURE FLAGS ARE SET +; RET ; AND RETURN + DIO_DISPATCH: - ; GET THE REQUESTED FUNCTION TO SEE IF SPECIAL HANDLING - ; IS NEEDED - LD A,B - CP BF_DIORD ; READ - JR Z,DIO_READ ; GO TO READ SHIM - CP BF_DIOWR ; WRITE - JR Z,DIO_WRITE ; GO TO WRITE SHIM - CP BF_DIOST ; STATUS - JR Z,DIO_STAT ; GO TO STATUS SHIM - CP BF_DIOMED ; MEDIA - JR Z,DIO_MEDIA ; GO TO MEDIA SHIM - ;CP BF_DIOID ; IDENTIFY - ;CALL Z,DIOID ; WAS NEVER REALLY SUPPORTED - CP BF_DIOGETBUF ; GET BUF - JR Z,DIO_GETBUF ; GO TO GET BUF SHIM - CP BF_DIOSETBUF ; SET BUF - JR Z,DIO_SETBUF ; GO TO SET BUF SHIM - CP BF_DIOGETCNT ; FUNCTION = DIOGETCNT? - JR Z,DIO_GETCNT ; YES, HANDLE IT - CP BF_DIOGETINF ; FUNCTION = DIOGETINF? - JR Z,DIO_GETINF ; YES, HANDLE IT - CALL PANIC ; UNSUPPORTED FUNCTION REQUEST -; -; DISK: SHIM FOR OLD STYLE READ CALL -; -DIO_READ: - LD B,BF_NDIOREAD ; OVERLAY OLD FUNCTION ID WITH NEW ONE - JR DIO_RW ; ... AND GO TO COMMON R/W ROUTINE -; -; DISK: SHIM FOR OLD STYLE WRITE CALL -; -DIO_WRITE: - LD B,BF_NDIOWRITE ; OVERLAY OLD FUNCTION ID WITH NEW ONE - JR DIO_RW ; ... AND GO TO COMMON R/W ROUTINE -; -; DISK: COMMON ROUTINE USED BY READ/WRITE SHIMS ABOVE -; NEW FUNCTION ID IS EXPECTED TO BE IN B (NDIO_READ OR NDIO_WRITE) -; THIS ROUTINE WILL TAKE THE OLD STYLE CALL AND PERFORM TWO CALLS TO -; THE NEW INTERFACE (SEEK, THEN READ OR WRITE) WHICH EFFECTIVELY -; REPLICATES THE FUNCTIONALITY OF THE OLD CALL. -; -DIO_RW: - PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT - EX DE,HL ; SWAP DE/HL TO XLAT FROM OLD TO NEW CALL - LD B,BF_NDIOSEEK ; SETUP FOR NEW SEEK CALL - ;CALL NDIO_DISPATCH ; DO IT - CALL NDIO_NEWDISP ; DO IT - POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT - RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A - LD HL,(DIOBUF) ; GET BUFFER ADDRESS - LD A,H ; TEST DIOBUF - OR L ; FOR VALUE OF ZERO - CALL Z,PANIC ; ERROR IF DIOBUF NOT SET - LD DE,1 ; TRANSFER ONE SECTOR - ;JP NDIO_DISPATCH ; RETURN VIA DISPATCHER - JP NDIO_NEWDISP ; RETURN VIA DISPATCHER -; -; DISK: SHIM FOR OLD STYLE STATUS CALL -; -DIO_STAT: - LD B,BF_NDIOSTATUS - ;JP NDIO_DISPATCH ; RETURN VIA DISPATCHER - JP NDIO_NEWDISP ; RETURN VIA DISPATCHER -; -; DISK: SHIM FOR OLD STYLE MEDIA CALL -; -DIO_MEDIA: -; - LD B,BF_NDIOMEDIA ; FORWARD TO MEDIA REPORT - LD E,%00000011 ; ENABLE MEDIA CHECK AND MEDIA DISCOVERY - ;CALL NDIO_DISPATCH ; CALL NEW VERSION - CALL NDIO_NEWDISP ; CALL NEW VERSION - LD A,E ; MOVE RESULTANT MEDIA ID TO A - OR A ; SET FLAGS - RET ; DONE -; -; DISK: GET BUFFER ADDRESS +; +#IF 0 ; *DEBUG* START ; -DIO_GETBUF: - LD HL,(DIOBUF) ; HL = DISK BUFFER ADDRESS - XOR A ; SIGNALS SUCCESS - RET + ; DUMP INCOMING CALL + CALL NEWLINE + PRTS("DIO>$") + CALL REGDMP ; DUMP REGS, NONE DESTROYED ; -; DISK: SET BUFFER ADDRESS + ; DO THE ACTUAL DISPATCH PROCESSING + CALL DIO_DISPCALL ; -DIO_SETBUF: - LD A,H ; TEST HL - OR L ; ... FOR ZERO - CALL Z,PANIC ; NO LONGER SUPPORT DEFAULT BUFFER! - ;JR NZ,DIO_SETBUF1 ; IF NOT, PROCEED TO SET BUF ADR - ;LD HL,(DIOBUFDEF) ; IF ZERO, SET TO DEFAULT PREALLOCATED ADR -;DIO_SETBUF1: - LD (DIOBUF),HL ; RECORD NEW DISK BUFFER ADDRESS - XOR A ; SIGNALS SUCCESS + ; DUMP CALL RESULTS AND RETURN + CALL NEWLINE + PRTS("DIO<$") + CALL REGDMP ; DUMP REGS, NONE DESTROYED RET +DIO_DISPCALL: ; -; DISK: GET DEVICE COUNT -; -DIO_GETCNT: - LD C,0 ; INFO SUB-FN=0, REPORT UNIT COUNT - JP NDIO_INFO ; FORWARD TO NEW DIO INFO FUNCTION +#ENDIF ; *DEBUG* END ; -; DISK: GET DEVICE INFO +; ON ENTRY C IS HBIOS UNIT # (INDEX INTO DIO_TBL OF DISK DEVICES) +; USE UNIT # IN C TO LOOKUP DIO_TBL ENTRY, THEN +; CONVERT C TO THE DEVICE/DRIVER SPECIFIC UNIT ID +; AND GET THE DEVICE TYPE TO A FOR DRIVER DISPATCHING ; -DIO_GETINF: - LD B,BF_NDIODEVICE ; FN: REPORT DEVICE INFO - JP NDIO_NEWDISP ; RETURN VIA DISPATCHER -; -;================================================================================================== -; DISK I/O DEVICE DISPATCHER -;================================================================================================== -; -NDIO_DISPATCH: - ; START OF THE ACTUAL DRIVER DISPATCHING LOGIC - LD A,C ; GET REQUESTED DEVICE/UNIT FROM C - ;LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK - AND $F0 ; ISOLATE THE DEVICE PORTION -; -NDIO_DISPATCH2: - - ; *DEBUG* START -#IF 0 - ; DUMP INCOMING CALL - CALL NEWLINE - PRTS("NDIO>$") - CALL REGDMP - - ; ADD RETURN HOOK ON TOP OF STACK - PUSH HL - LD HL,NDIO_DISPATCH_DBG1 - EX (SP),HL - - ; JUMP OVER DBG1 TO CONTINUE NORMAL EXECUTION - JR NDIO_DISPATCH_DBG2 + LD A,C ; INCOMING UNIT INDEX TO A + PUSH HL ; SAVE INCOMING HL + LD HL,DIO_CNT ; HL := ADDRESS OF TABLE ENTRY COUNT + CP (HL) ; COMPARE TO INCOMING ENTRY INDEX + JR C,DIO_DISPATCH1 ; UNIT OK, PROCEED +; + ; NOT GOOD, INCOMING UNIT IS OUT OF RANGE + POP HL ; RESTORE HL/STACK + CALL PANIC ; PANIC + OR $FF ; SIGNAL ERROR + RET ; AND RETURN ; -NDIO_DISPATCH_DBG1: - ; EXECTION COMES HERE ON RETURN - ; DUMP CALL RESULTS AND RETURN - PRTS("NDIO<$") - CALL REGDMP - RET +DIO_DISPATCH1: + INC HL ; BUMP PAST COUNT PREFIX TO START OF TABLE + RLCA ; MULTIPLY BY 4 TO + RLCA ; ... TO CALC ENTRY OFFSET + CALL ADDHLA ; HL := ENTRY OFFSET + LD A,(HL) ; GET DEVICE TYPE BYTE + INC HL ; BUMP TO DEVICE UNIT INDEX BYTE + LD C,(HL) ; DEVICE UNIT INDEX TO C + POP HL ; RECOVER INCOMING HL VALUE ; -NDIO_DISPATCH_DBG2: -#ENDIF - ; *DEBUG* END +; DISPATCH TO DRIVER BASED ON DEVICE TYPE IN A ; #IF (MDENABLE) CP DIODEV_MD @@ -1038,6 +962,7 @@ NDIO_DISPATCH_DBG2: JP Z,HDSK_DISPATCH #ENDIF CALL PANIC + RET ; ; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO @@ -1096,7 +1021,7 @@ HB_CHS2LBA: XOR A RET ; -; DISK DEVICE TABLE +; HBIOS DISK DEVICE UNIT TABLE ; ; TABLE IS BUILT DYNAMICALLY BY EACH DRIVER DURING INITIALIZATION. ; THE TABLE IS PREFIXED BY TWO BYTES. TABLE - 1 CONTAINS THE CURRENT @@ -1104,7 +1029,7 @@ HB_CHS2LBA: ; EACH ENTRY IS DEFINED AS: ; ; BYTE DEVICE TYPE ID -; BYTE UNIT INDEX +; BYTE DEVICE/DRIVER UNIT NUMBER ; WORD UNIT DATA ADDRESS ; DIO_MAX .EQU 16 ; UP TO 16 UNITS @@ -1114,100 +1039,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 DRIVER DISPATCHING -; C=LOGICAL UNIT NUMBER (INDEX INTO DIO_TBL) -; -;NDIO_NEWDISP: -; ;HALT -; ; START OF THE ACTUAL DRIVER DISPATCHING LOGIC -; PUSH IY ; SAVE ORIGINAL IY -; PUSH HL ; SAVE HL -; LD HL,NDIO_RET ; GET RETURN VECTOR -; EX (SP),HL ; RECOVER HL & PUT RETURN VECTOR ON TOS -; PUSH HL ; SAVE HL -; LD HL,DIO_TBL ; POINT TO DISPATCH TABLE -; LD A,C ; GET REQUESTED UNIT FROM C -; RLCA ; MULTIPLY UNIT BY 4 -; RLCA ; ... TO GET BYTE OFFSET OF ENTRY -; CALL ADDHLA ; HL -> ENTRY ADDRESS -; LD A,(HL) ; DRIVER ID TO A -; PUSH AF ; SAVE IT FOR NOW -; INC HL ; POINT TO UNIT -; LD C,(HL) ; PUT IT IN C FOR DRIVER -; INC HL ; POINT TO LSB OF UNIT DATA ADDRESS -; LD A,(HL) ; HL := UNIT DATA ADDRESS -; INC HL ; ... -; LD H,(HL) ; ... -; LD L,A ; ... -; POP AF ; RECOVER DRIVER ID -; EX (SP),HL ; RECOVER ORIG HL & PUT UNIT DATA ADDRESS TO TOS -; POP IY ; IY := UNIT DATA ADDRESS -; JP NDIO_DISPATCH2 ; USE LEGACY DISPATCHER -;; -;NDIO_RET: -; POP IY ; RECOVER IY -; OR A ; MAKE SURE FLAGS ARE SET -; RET ; AND RETURN - -NDIO_NEWDISP: - PUSH HL - LD HL,DIO_TBL - LD A,C - RLCA - RLCA - CALL ADDHLA - LD A,(HL) - PUSH AF ; SAVE DEVICE TYPE - INC HL - LD C,(HL) ; DEVICE UNIT INDEX TO C - POP AF ; RECOVER DEVICE TYPE - POP HL - CALL NDIO_DISPATCH2 - RET -; -; DISK SYSTEM INFORMATION FUNCTIONS -; ALL DISK DRIVERS SHOULD FORWARD FUNCTION $1F HERE -; SUB-FUNCTION IS IN C -; -NDIO_INFO: - LD A,C ; LOAD SUB-FUNCTION - CP 0 ; FN=0, REPORT UNIT COUNT - JR Z,NDIO_INFO0 ; DO IT - ; ADD NEW FUNCS ADDED HERE - OR $FF ; SIGNAL ERROR - RET ; AND DONE -; -NDIO_INFO0: ; REPORT UNIT COUNT - LD A,(DIO_CNT) ; LOAD THE COUNT - LD B,A ; PUT IT IN B - XOR A ; SIGNAL SUCCESS - RET -; -; ADD AN ENTRY TO THE DIO DISPATCH TABLE -; C: DEVICE TYPE ID -; B: UNIT INDEX -; DE: ADDRESS OF UNIT DATA +; ADD AN ENTRY TO THE DIO UNIT TABLE ; DIO_ADDENT: - LD HL,DIO_TBL ; POINT TO TABLE - DEC HL ; POINT TO ENTRY COUNT - LD A,(HL) ; GET ENTRY COUNT - 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 - RET + LD HL,DIO_TBL ; POINT TO DIO TABLE + JP HB_ADDENT ; ... AND GO TO COMMON CODE ; ;================================================================================================== ; REAL TIME CLOCK DEVICE DISPATCHER @@ -1226,124 +1062,39 @@ RTC_DISPATCH: CALL PANIC ; ;================================================================================================== -; EMULATION HANDLER DISPATCHER +; EMULATION INITIALIZATION DISPATCHER ;================================================================================================== ; -; ROUTE CALL TO EMULATION HANDLER CURRENTLY ACTIVE -; B: FUNCTION +; EMULATOR MODULES ARE INITIALIZED BY THE VDA DRIVER THAT USES THEM. +; THE VDA DRIVER CALLS EMU_INIT TO DISPATCH THE INITIALIZATION REQUEST +; TO THE CORRRECT EMULATION MODULE. ; -EMU_DISPATCH: - ; EMU FUNCTIONS STARTING AT EMUINI ARE COMMON - ; AND DO NOT DISPATCH TO DRIVERS - LD A,B ; GET REQUESTED FUNCTION - CP BF_EMUINI - JR NC,EMU_COMMON +; C: EMULATION TYPE ; - LD A,(HCB + HCB_CUREMU) ; GET ACTIVE EMULATION +EMU_INIT: + LD A,C ; GET REQUESTED EMULATION ; - DEC A ; 1 = TTY + DEC A ; 1 = TTY #IF (TTYENABLE) - JP Z,TTY_DISPATCH + LD HL,TTY_INIT + JR Z,EMU_INIT1 #ENDIF - DEC A ; 2 = ANSI + DEC A ; 2 = ANSI #IF (ANSIENABLE) - JP Z,ANSI_DISPATCH + LD HL,ANSI_INIT + JR Z,EMU_INIT1 #ENDIF - CALL PANIC ; INVALID -; -; HANDLE COMMON EMULATION FUNCTIONS (NOT HANDLER SPECIFIC) -; -EMU_COMMON: - ; REG A CONTAINS FUNCTION ON ENTRY - CP BF_EMUINI - JR Z,EMU_INI - CP BF_EMUQRY - JR Z,EMU_QRY - CALL PANIC -; -; INITIALIZE EMULATION -; C: VDA DEVICE/UNIT TO USE GOING FORWARD -; E: EMULATION TYPE TO USE GOING FORWARD -; -EMU_INI: - LD A,E ; LOAD REQUESTED EMULATION TYPE - LD (HCB + HCB_CUREMU),A ; SAVE IT - LD A,C ; LOAD REQUESTED VDA DEVICE/UNIT - LD (HCB + HCB_CURVDA),A ; SAVE IT -; - ; UPDATE EMULATION VDA DISPATCHING ADDRESS -#IF (VDUENABLE) - LD HL,VDU_DISPVDA - CP VDADEV_VDU - JR Z,EMU_INI1 -#ENDIF -#IF (CVDUENABLE) - LD HL,CVDU_DISPVDA - CP VDADEV_CVDU - JR Z,EMU_INI1 -#ENDIF -#IF (UPD7220ENABLE) - LD HL,UPD7220_DISPVDA - CP VDADEV_UPD7220 - JR Z,EMU_INI1 -#ENDIF -#IF (N8VENABLE) - LD HL,N8V_DISPVDA - CP VDADEV_N8V - JR Z,EMU_INI1 -#ENDIF - CALL PANIC -; -EMU_INI1: - LD (EMU_VDADISPADR),HL ; RECORD NEW VDA DISPATCH ADDRESS - JP EMU_VDADISP ; NOW LET EMULATOR INITIALIZE -; -; QUERY CURRENT EMULATION CONFIGURATION -; RETURN CURRENT EMULATION TARGET VDA DEVICE/UNIT IN C -; RETURN CURRENT EMULATION TYPE IN E + CALL PANIC ; INVALID + RET ; -EMU_QRY: - LD A,(HCB + HCB_CURVDA) - LD C,A - LD A,(HCB + HCB_CUREMU) - LD E,A - JP EMU_VDADISP ; NOW LET EMULATOR COMPLETE THE FUNCTION +EMU_INIT1: + CALL TSTPT ; *DEBUG* + JP (HL) ; DO THE EMULATOR INIT, DE := CIO DISPATCH ADR ; ;================================================================================================== ; VDA DISPATCHING FOR EMULATION HANDLERS ;================================================================================================== ; -; SINCE THE EMULATION HANDLERS WILL ONLY HAVE A SINGLE ACTIVE -; VDA TARGET AT ANY TIME, THE FOLLOWING IMPLEMENTS A FAST DISPATCHING -; MECHANISM THAT THE EMULATION HANDLERS CAN USE TO BYPASS SOME OF THE -; VDA DISPATCHING LOGIC. EMU_VDADISP CAN BE CALLED TO DISPATCH DIRECTLY -; TO THE CURRENT VDA EMULATION TARGET. IT IS A JUMP INSTRUCTION THAT -; IS DYNAMICALLY MODIFIED TO POINT TO THE VDA DISPATCHER FOR THE -; CURRENT EMULATION VDA TARGET. -; -; VDA_DISPERR IS FAILSAFE EMULATION DISPATCH ADDRESS WHICH JUST -; CHAINS TO SYSTEM PANIC -; -VDA_DISPERR: - JP PANIC -; -; BELOW IS USED TO INITIALIZE THE EMULATION VDA DISPATCH TARGET -; BASED ON THE DEFAULT VDA. -; -VDA_DISPADR .EQU VDA_DISPERR -#IF (VDUENABLE & (VDADEV == VDADEV_VDU)) -VDA_DISPADR .SET VDU_DISPVDA -#ENDIF -#IF (CVDUENABLE & (VDADEV == VDADEV_CVDU)) -VDA_DISPADR .SET CVDU_DISPVDA -#ENDIF -#IF (VDUENABLE & (VDADEV == VDADEV_UPD7220)) -VDA_DISPADR .SET UPD7220_DISPVDA -#ENDIF -#IF (N8VENABLE & (VDADEV == VDADEV_N8V)) -VDA_DISPADR .SET N8V_DISPVDA -#ENDIF -; ; BELOW IS THE DYNAMICALLY MANAGED EMULATION VDA DISPATCH. ; EMULATION HANDLERS CAN CALL EMU_VDADISP TO INVOKE A VDA ; FUNCTION. EMU_VDADISPADR IS USED TO MARK THE LOCATION @@ -1352,7 +1103,7 @@ VDA_DISPADR .SET N8V_DISPVDA ; A NEW VDA TARGET IS SPECIFIED. ; EMU_VDADISP: - JP VDA_DISPADR + JP PANIC ; JP TGT IS UPDATED DYNAMICALLY ; EMU_VDADISPADR .EQU $ - 2 ; ADDRESS PORTION OF JP INSTRUCTION ABOVE ; @@ -1362,26 +1113,26 @@ EMU_VDADISPADR .EQU $ - 2 ; ADDRESS PORTION OF JP INSTRUCTION ABOVE ; ; ROUTE CALL TO SPECIFIED VDA DEVICE DRIVER ; B: FUNCTION -; C: DEVICE/UNIT +; C: UNIT NUMBER ; VDA_DISPATCH: LD A,C ; REQUESTED DEVICE/UNIT IS IN C AND $F0 ; ISOLATE THE DEVICE PORTION #IF (VDUENABLE) CP VDADEV_VDU - JP Z,VDU_DISPVDA + JP Z,VDU_DISPATCH #ENDIF #IF (CVDUENABLE) CP VDADEV_CVDU - JP Z,CVDU_DISPVDA + JP Z,CVDU_DISPATCH #ENDIF #IF (UPD7220ENABLE) CP VDADEV_7220 - JP Z,UPD7220_DISPVDA + JP Z,UPD7220_DISPATCH #ENDIF #IF (N8VENABLE) CP VDADEV_N8V - JP Z,N8V_DISPVDA + JP Z,N8V_DISPATCH #ENDIF CALL PANIC ; @@ -1402,13 +1153,13 @@ SYS_DISPATCH: DEC A JP Z,SYS_XCOPY ; $F3 DEC A - ;JR Z,SYS_ATTR ; $F4 JR Z,SYS_ALLOC ; $F4 DEC A - ;JR Z,SYS_XXXX ; $F5 + JR Z,SYS_GET ; $F5 DEC A - JR Z,SYS_GETVER ; $F6 + JR Z,SYS_SET ; $F6 DEC A + ;JR Z,SYS_??? ; $F7 DEC A JR Z,SYS_HCBGETB ; $F8 DEC A @@ -1505,6 +1256,21 @@ SYS_XCOPY: SYS_ALLOC: JP HB_ALLOC ; +; GET SYSTEM INFORMATION +; ITEM TO RETURN INDICATED IN C +; +SYS_GET: + LD A,C ; GET REQUESTED SUB-FUNCTION + CP BF_SYSGET_VER + JR Z,SYS_GETVER + CP BF_SYSGET_CIOCNT + JR Z,SYS_GETCIOCNT + CP BF_SYSGET_DIOCNT + JR Z,SYS_GETDIOCNT + OR $FF ; SIGNAL ERROR + RET + +; ; GET THE CURRENT HBIOS VERSION ; RETURNS VERSION IN DE AS BCD ; D: MAJOR VERION IN TOP 4 BITS, MINOR VERSION IN LOW 4 BITS @@ -1517,6 +1283,32 @@ SYS_GETVER: XOR A RET ; +; GET SERIAL UNIT COUNT +; +SYS_GETCIOCNT: + LD A,(CIO_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) + LD E,A ; PUT IT IN E + XOR A ; SIGNALS SUCCESS + RET +; +; GET DISK UNIT COUNT +; +SYS_GETDIOCNT: + LD A,(DIO_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) + LD E,A ; PUT IT IN E + XOR A ; SIGNALS SUCCESS + RET + + +; +; SET SYSTEM PARAMETERS +; PARAMETER(S) TO SET INDICATED IN C +; +SYS_SET: + OR $FF ; SIGNAL ERROR + RET + +; ; GET HCB VALUE BYTE ; C: HCB INDEX (OFFSET INTO HCB) ; RETURN BYTE VALUE IN E @@ -1594,6 +1386,35 @@ HB_BADINT: ; BNKCPY .EQU HB_BNKCPY ; +; ADD AN ENTRY TO THE UNIT TABLE AT ADDRESS IN HL +; C: DEVICE TYPE ID +; B: UNIT INDEX +; DE: ADDRESS OF UNIT 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 + RET +; ; ALLOCATE HL BYTES OF MEMORY ON THE HEAP ; RETURNS POINTER TO ALLOCATED SPACE IN HL ; ON SUCCESS RETURN A == 0, AND Z SET @@ -1607,8 +1428,10 @@ BNKCPY .EQU HB_BNKCPY HB_ALLOC: ; 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 ; @@ -1847,12 +1670,16 @@ SIZ_ANSI .EQU $ - ORG_ANSI .ECHO " bytes.\n" #ENDIF ; -#DEFINE CIOMODE_CONSOLE -#DEFINE DSKY_KBD #DEFINE USEDELAY #INCLUDE "util.asm" #INCLUDE "time.asm" #INCLUDE "bcd.asm" +#INCLUDE "xio.asm" +; +#IF (DSKYENABLE) +#DEFINE DSKY_KBD +#INCLUDE "dsky.asm" +#ENDIF ; #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_ZETA2)) ; @@ -2073,14 +1900,109 @@ PRTD3M3: RET ; ;================================================================================================== +; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED) +;================================================================================================== +; +; OUTPUT CHARACTER FROM A +; +COUT: + ; SAVE ALL INCOMING REGISTERS + PUSH AF + PUSH BC + PUSH DE + PUSH HL +; + ; GET CURRENT CONSOLE UNIT + LD E,A ; OUTPUT CHAR TO E + LD A,(HCB + HCB_CONDEV) ; GET CONSOLE UNIT BYTE + CP $FF ; TEST FOR $FF (HBIOS NOT READY) + JR Z,COUT1 ; IF NOT READY, USE XIO +; + ; USE HBIOS + LD C,A ; CONSOLE UNIT TO C + LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR + CALL CIO_DISPATCH ; CALL CIO DISPATCHER DIRECTLY + JR COUT2 ; CONTINUE +; +COUT1: + ; USE XIO + LD A,E ; GET OUTPUT CHAR BACK TO ACCUM + CALL XIO_OUTC ; OUTPUT VIA XIO +; +COUT2: + ; RESTORE ALL REGISTERS + POP HL + POP DE + POP BC + POP AF + RET +; +; INPUT CHARACTER TO A +; +CIN: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + LD A,(HCB + HCB_CONDEV) ; GET CONSOLE UNIT BYTE + CP $FF ; TEST FOR $FF (HBIOS NOT READY) + JR Z,CIN1 ; IF NOT READY, USE XIO +; + ; USE HBIOS + LD C,A ; CONSOLE UNIT TO C + LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR + CALL CIO_DISPATCH ; CALL CIO DISPATCHER DIRECTLY + LD A,E ; RESULTANT CHAR TO A + JR CIN2 ; CONTINUE +; +CIN1: + ; USE XIO + CALL PANIC ; NOT YET SUPPORTED +; +CIN2: +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; +; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) +; +CST: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + LD A,(HCB + HCB_CONDEV) ; GET CONSOLE UNIT BYTE + CP $FF ; TEST FOR $FF (HBIOS NOT READY) + JR Z,CST1 ; IF NOT READY, USE XIO +; + ; USE HBIOS + LD C,A ; CONSOLE UNIT TO C + LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS + CALL CIO_DISPATCH ; CALL CIO DISPATCHER DIRECTLY + JR CST2 ; CONTINUE +; +CST1: + ; USE XIO + CALL PANIC ; NOT YET SUPPORTED +; +CST2: + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; +;================================================================================================== ; HBIOS GLOBAL DATA ;================================================================================================== ; IDLECOUNT .DB 0 ; -;HSTTRK .DW 0 ; TRACK IN BUFFER -;HSTSEC .DW 0 ; SECTOR IN BUFFER -; ; THE HOST (HST) VALUES BELOW INDICATE THE DISK AND BLOCK CURRENTLY ; ADDRESSED FOR READ/WRITE OPERATIONS. ; THE 32-BIT BLOCK ADDRESS CAN BE TREADED AS EITHER CHS OR LBA, HIGH ORDER BIT ON SIGNIFIES LBA @@ -2111,7 +2033,6 @@ DIOBUF .DW 0 ; PTR TO CURRENT DISK XFR BUFFER HB_INTSTKSAV .DW 0 ; SAVED STACK POINTER DURING INT PROCESSING .FILL $40,$FF ; 32 ENTRY STACK FOR INTERRUPT PROCESSING HB_INTSTK .EQU $ ; TOP OF INTERRUPT PROCESSING STACK - ; STR_BANNER .DB "SBC HBIOS v", BIOSVER, ", ", TIMESTAMP, "$" STR_PLATFORM .DB PLATFORM_NAME, "$" @@ -2119,7 +2040,6 @@ STR_SWITCH .DB "*** Activating CRT Console ***$" ; HB_TMPBUF .FILL 512,0 ; INTERNAL DISK BUFFER ; -;HB_BUF .EQU $ ; PHYSICAL DISK BUFFER HB_END .EXPORT HB_END ; EXPORT ENDING ADDRESS ; SLACK .EQU BNKTOP - $ diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 92587690..9cd488fd 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -7,35 +7,23 @@ BF_CIOIN .EQU BF_CIO + 0 ; CHARACTER INPUT BF_CIOOUT .EQU BF_CIO + 1 ; CHARACTER OUTPUT BF_CIOIST .EQU BF_CIO + 2 ; CHARACTER INPUT STATUS BF_CIOOST .EQU BF_CIO + 3 ; CHARACTER OUTPUT STATUS -BF_CIOCFG .EQU BF_CIO + 4 ; CHARACTER I/O CONFIG -BF_CIOGETCNT .EQU BF_CIO + 8 ; CHARACTER DEVICE COUNT -BF_CIOGETINF .EQU BF_CIO + 9 ; CHARACTER DEVICE INFO +BF_CIOINIT .EQU BF_CIO + 4 ; INIT/RESET DEVICE/LINE CONFIG +BF_CIOQUERY .EQU BF_CIO + 5 ; REPORT DEVICE/LINE CONFIG +BF_CIODEVICE .EQU BF_CIO + 6 ; REPORT DEVICE INFO ; BF_DIO .EQU $10 -BF_DIORD .EQU BF_DIO + 0 ; DISK READ -BF_DIOWR .EQU BF_DIO + 1 ; DISK WRITE -BF_DIOST .EQU BF_DIO + 2 ; DISK STATUS -BF_DIOMED .EQU BF_DIO + 3 ; DISK MEDIA -BF_DIOID .EQU BF_DIO + 4 ; DISK IDENTIFY -BF_DIOGETBUF .EQU BF_DIO + 8 ; DISK GET BUFFER ADR -BF_DIOSETBUF .EQU BF_DIO + 9 ; DISK SET BUFFER ADR -BF_DIOGETCNT .EQU BF_DIO + 10 ; DISK DEVICE COUNT -BF_DIOGETINF .EQU BF_DIO + 11 ; DISK DEVICE INFO -; -BF_NDIO .EQU $50 -BF_NDIOSTATUS .EQU BF_NDIO + 0 ; DISK STATUS -BF_NDIORESET .EQU BF_NDIO + 1 ; DISK RESET -BF_NDIOSEEK .EQU BF_NDIO + 2 ; DISK SEEK -BF_NDIOREAD .EQU BF_NDIO + 3 ; DISK READ SECTORS -BF_NDIOWRITE .EQU BF_NDIO + 4 ; DISK WRITE SECTORS -BF_NDIOVERIFY .EQU BF_NDIO + 5 ; DISK VERIFY SECTORS -BF_NDIOFORMAT .EQU BF_NDIO + 6 ; DISK FORMAT TRACK -BF_NDIODEVICE .EQU BF_NDIO + 7 ; DISK DEVICE REPORT -BF_NDIOMEDIA .EQU BF_NDIO + 8 ; DISK MEDIA REPORT -BF_NDIODEFMED .EQU BF_NDIO + 9 ; DEFINE DISK MEDIA -BF_NDIOCAP .EQU BF_NDIO + 10 ; DISK CAPACITY REPORT -BF_NDIOGEOM .EQU BF_NDIO + 11 ; DISK GEOMETRY REPORT -BF_NDIOINFO .EQU BF_NDIO + 15 ; DISK SYSTEM INFO QUERY +BF_DIOSTATUS .EQU BF_DIO + 0 ; DISK STATUS +BF_DIORESET .EQU BF_DIO + 1 ; DISK RESET +BF_DIOSEEK .EQU BF_DIO + 2 ; DISK SEEK +BF_DIOREAD .EQU BF_DIO + 3 ; DISK READ SECTORS +BF_DIOWRITE .EQU BF_DIO + 4 ; DISK WRITE SECTORS +BF_DIOVERIFY .EQU BF_DIO + 5 ; DISK VERIFY SECTORS +BF_DIOFORMAT .EQU BF_DIO + 6 ; DISK FORMAT TRACK +BF_DIODEVICE .EQU BF_DIO + 7 ; DISK DEVICE INFO REPORT +BF_DIOMEDIA .EQU BF_DIO + 8 ; DISK MEDIA REPORT +BF_DIODEFMED .EQU BF_DIO + 9 ; DEFINE DISK MEDIA +BF_DIOCAP .EQU BF_DIO + 10 ; DISK CAPACITY REPORT +BF_DIOGEOM .EQU BF_DIO + 11 ; DISK GEOMETRY REPORT ; BF_RTC .EQU $20 BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME @@ -44,15 +32,8 @@ BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK -; -BF_EMU .EQU $30 -BF_EMUIN .EQU BF_EMU + 0 ; EMULATOR CHARACTER INPUT -BF_EMUOUT .EQU BF_EMU + 1 ; EMULATOR CHARACTER OUTPUT -BF_EMUIST .EQU BF_EMU + 2 ; EMULATOR CHARACTER INPUT STATUS -BF_EMUOST .EQU BF_EMU + 3 ; EMULATOR CHARACTER OUTPUT STATUS -BF_EMUCFG .EQU BF_EMU + 4 ; EMULATOR CHARACTER I/O CONFIG -BF_EMUINI .EQU BF_EMU + 8 ; INITIALIZE EMULATION -BF_EMUQRY .EQU BF_EMU + 9 ; QUERY EMULATION STATUS +;; +BF_EMU .EQU $30 ; DEPRECATED ; BF_VDA .EQU $40 BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU @@ -76,12 +57,17 @@ BF_SYSGETBNK .EQU BF_SYS + 1 ; GET CURRENT BANK BF_SYSCPY .EQU BF_SYS + 2 ; COPY TO/FROM RAM/ROM MEMORY BANK BF_SYSXCPY .EQU BF_SYS + 3 ; EXTENDED COPY SETUP BF_SYSALLOC .EQU BF_SYS + 4 ; ALLOC HBIOS HEAP MEMORY -BF_SYSGETVER .EQU BF_SYS + 6 ; GET VERSION OF HBIOS +BF_SYSGET .EQU BF_SYS + 5 ; GET HBIOS INFO +BF_SYSSET .EQU BF_SYS + 6 ; SET HBIOS PARMS BF_SYSHCBGETB .EQU BF_SYS + 8 ; GET HCB BYTE VALUE BF_SYSHCBPUTB .EQU BF_SYS + 9 ; PUT HCB BYTE VALUE BF_SYSHCBGETW .EQU BF_SYS + 10 ; GET HCB WORD VALUE BF_SYSHCBPUTW .EQU BF_SYS + 11 ; PUT HCB BYTE VALUE ; +BF_SYSGET_CIOCNT .EQU $00 ; GET SERIAL UNIT COUNT +BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT +BF_SYSGET_VER .EQU $F0 ; GET HBIOS VERSION INFO +; ; CHARACTER DEVICES ; CIODEV_UART .EQU $00 @@ -116,6 +102,12 @@ VDADEV_VDU .EQU $10 ; ECB VDU - 6545 CHIP VDADEV_CVDU .EQU $20 ; ECB COLOR VDU - 8563 CHIP (NOT IMP) VDADEV_UPD7220 .EQU $30 ; ECB uP7220 (NOT IMPLEMENTED) VDADEV_N8V .EQU $40 ; N8 ONBOARD VDA SUBSYSTEM +; +; EMULATION TYPES +; +EMUTYP_NONE .EQU 0 ; NONE +EMUTYP_TTY .EQU 1 ; TTY +EMUTYP_ANSI .EQU 2 ; ANSI ; ; HBIOS CONTROL BLOCK OFFSETS ; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES @@ -133,8 +125,8 @@ HCB_BOOTBID .EQU $0C ; BANK ID OF ROM PAGE BOOTED (BYTE) HCB_SERDEV .EQU $0D ; PRIMARY SERIAL DEVICE/UNIT (BYTE) HCB_CRTDEV .EQU $0E ; CRT DISPLAY DEVICE/UNIT (BYTE) HCB_CONDEV .EQU $0F ; ACTIVE CONSOLE DEVICE/UNIT (BYTE) -HCB_CUREMU .EQU $10 ; CURRENT VDA TERMINAL EMULATION -HCB_CURVDA .EQU $11 ; CURRENT VDA TARGET FOR EMULATION +;HCB_CUREMU .EQU $10 ; CURRENT VDA TERMINAL EMULATION (DEPRECATED) +;HCB_CURVDA .EQU $11 ; CURRENT VDA TARGET FOR EMULATION (DEPRECATED) ; HCB_HEAP .EQU $20 ; DWORD ADDRESS OF START OF HEAP HCB_HEAPTOP .EQU $22 ; DWORD ADDRESS OF TOP OF HEAP diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 74c734b1..234afa29 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -80,11 +80,6 @@ HDSK_DISPATCH: JP Z,HDSK_CAP ; SUB-FUNC 10: REPORT CAPACITY DEC A JP Z,HDSK_GEOM ; SUB-FUNC 11: REPORT GEOMETRY - DEC A - DEC A - DEC A - DEC A - JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO ; HDSK_VERIFY: HDSK_FORMAT: diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 56015893..ae064b17 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -355,11 +355,6 @@ IDE_DISPATCH: JP Z,IDE_CAP ; SUB-FUNC 10: REPORT CAPACITY DEC A JP Z,IDE_GEOM ; SUB-FUNC 11: REPORT GEOMETRY - DEC A - DEC A - DEC A - DEC A - JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO ; IDE_VERIFY: IDE_FORMAT: diff --git a/Source/HBIOS/loader.asm b/Source/HBIOS/loader.asm index cdc85fe2..868547fa 100644 --- a/Source/HBIOS/loader.asm +++ b/Source/HBIOS/loader.asm @@ -3,16 +3,16 @@ ; LOADER ;================================================================================================== ; -P2LOC .EQU $F000 ; PHASE 2 RUN LOCATION +P2LOC .EQU $F000 ; PHASE 2 RUN LOCATION ; #IFDEF ROMLOAD -CURBNK .EQU BID_BOOT +CURBNK .EQU BID_BOOT #ELSE -CURBNK .EQU BID_USR +CURBNK .EQU BID_USR #ENDIF ; ;================================================================================================== -; HBIOS CONFIGURATION BLOCK +; HBIOS CONFIGURATION BLOCK (HCB) ;================================================================================================== ; .ORG $ + P2LOC @@ -27,14 +27,14 @@ CB_CPUKHZ .DW CPUKHZ CB_RAMBANKS .DB RAMSIZE / 32 CB_ROMBANKS .DB ROMSIZE / 32 ; -CB_BOOTVOL .DW 0 -CB_BOOTBID .DB 0 -CB_SERDEV .DB SERDEV -CB_CRTDEV .DB CRTDEV -CB_CONDEV .DB SERDEV +CB_BOOTVOL .DW 0 ; BOOT VOLUME IS UNIT/SLICE, SET BY LOADER +CB_BOOTBID .DB 0 ; BOOT BANK ID, SET BY LOADER +CB_SERDEV .DB 0 ; PRIMARY SERIAL UNIT IS UNIT #0 BY FIAT +CB_CRTDEV .DB $FF ; PRIMARY CRT UNIT, $FF UNTIL AFTER HBIOS INIT +CB_CONDEV .DB $FF ; CONSOLE UNIT, $FF UNTIL AFTER HBIOS INIT ; -CB_CUREMU .DB VDAEMU ; CURRENT VDA TERMINAL EMULATION -CB_CURVDA .DB VDADEV ; CURRENT VDA TARGET FOR EMULATION +;CB_CUREMU .DB VDAEMU ; CURRENT VDA TERMINAL EMULATION (DEPRECATED) +;CB_CURVDA .DB VDADEV ; CURRENT VDA TARGET FOR EMULATION (DEPRECATED) ; ; MEMORY MANAGEMENT VARIABLES START AT $20 ; @@ -55,139 +55,6 @@ CB_BIDRAMD0 .DB BID_RAMD0 CB_BIDRAMDN .DB BID_RAMDN CB_BIDROMD0 .DB BID_ROMD0 CB_BIDROMDN .DB BID_ROMDN -; -; DEVICE LISTS START AT $E0 -; - .FILL (CB + $E0 - $),0 -; -; CHARACTER DEVICE LIST AT $E0 (7 ENTRY MAX) -; - .DB CB_CDLEND - CB_CDL ; ENTRY COUNT -; -CB_CDL: ; START OF LIST -; -#IF ASCIENABLE - .DB CIODEV_ASCI + 0 ; ASCI0: - .DB CIODEV_ASCI + 1 ; ASCI1: -#ENDIF -; -#IF UARTENABLE -#IF (UARTCNT >= 1) - .DB CIODEV_UART + 0 ; UART0: -#ENDIF -#IF (UARTCNT >= 2) - .DB CIODEV_UART + 1 ; UART1: -#ENDIF -#IF (UARTCNT >= 3) - .DB CIODEV_UART + 2 ; UART2: -#ENDIF -#IF (UARTCNT >= 4) - .DB CIODEV_UART + 3 ; UART3: -#ENDIF -#ENDIF -; -CB_CDLEND: - .FILL (CB_CDL + 7 - $),$FF ; PAD REMAINDER OF CDL -; -; PRINT DEVICE LIST AT $E8 (3 ENTRY MAX) -; - .DB CB_PDLEND - CB_PDL ; ENTRY COUNT -; -CB_PDL: ; START OF LIST -; -CB_PDLEND: - .FILL (CB_PDL + 3 - $),$FF ; PAD REMAINDER OF PDL -; -; VIDEO DISPLAY DEVICE LIST AT $EC (3 ENTRY MAX) -; - .DB CB_VDLEND - CB_VDL ; ENTRY COUNT -; -CB_VDL: ; START OF LIST -; -CB_VDLEND: - .FILL (CB_VDL + 3 - $),$FF ; PAD REMAINDER OF VDL -; -; DISK DEVICE LIST AT $F0 (7 ENTRY MAX) -; - .DB CB_DDLEND - CB_DDL ; ENTRY COUNT -; -CB_DDL: ; START OF LIST -; -#IF MDENABLE - .DB DIODEV_MD + 1 ; MD1: (RAM DISK) - .DB DIODEV_MD + 0 ; MD0: (ROM DISK) -#ENDIF -; -#IF FDENABLE - .DB DIODEV_FD + 0 ; FD0: (PRIMARY FLOPPY DRIVE) - .DB DIODEV_FD + 1 ; FD1: (SECONDARY FLOPPY DRIVE) -#ENDIF -; -#IF RFENABLE -#IF (RFCNT >= 1) - .DB DIODEV_RF + 0 ; RF0: (RAMFLOPPY DISK UNIT 0) -#ENDIF -#IF (RFCNT >= 2) - .DB DIODEV_RF + 1 ; RF1: (RAMFLOPPY DISK UNIT 1) -#ENDIF -#ENDIF -; -#IF IDEENABLE -#IF (IDECNT >= 1) - .DB DIODEV_IDE + 0 ; IDE0: (IDE PRIMARY MASTER DISK) -#ENDIF -#IF (IDECNT >= 2) - .DB DIODEV_IDE + 1 ; IDE1: (IDE PRIMARY SLAVE DISK) -#ENDIF -#IF (IDECNT >= 3) - .DB DIODEV_IDE + 2 ; IDE2: (IDE SECONDARY MASTER DISK) -#ENDIF -#IF (IDECNT >= 4) - .DB DIODEV_IDE + 3 ; IDE3: (IDE SECONDARY SLAVE DISK) -#ENDIF -#ENDIF -; -#IF PPIDEENABLE -#IF (PPIDECNT >= 1) - .DB DIODEV_PPIDE + 0 ; PPIDE0: (PAR PORT IDE PRIMARY MASTER DISK) -#ENDIF -#IF (PPIDECNT >= 2) - .DB DIODEV_PPIDE + 1 ; PPIDE1: (PAR PORT IDE PRIMARY SLAVE DISK) -#ENDIF -#ENDIF -; -#IF SDENABLE - .DB DIODEV_SD + 0 ; SD0: (SD CARD DISK) -#IF (SDMODE == SDMODE_DSD) - .DB DIODEV_SD + 1 ; SD1: (SD CARD DISK) -#ENDIF -#ENDIF -; -#IF (PRPENABLE & PRPSDENABLE) - .DB DIODEV_PRPSD + 0 ; PRPSD0: (PROPIO SD DISK) -#ENDIF -; -#IF (PPPENABLE & PPPSDENABLE) - .DB DIODEV_PPPSD + 0 ; PPPSD0: (PARPORTPROP SD DISK) -#ENDIF -; -#IF HDSKENABLE -#IF (HDSKCNT >= 1) - .DB DIODEV_HDSK + 0 ; HDSK0: (SIMH DISK DRIVE 0) -#ENDIF -#IF (HDSKCNT >= 2) - .DB DIODEV_HDSK + 1 ; HDSK1: (SIMH DISK DRIVE 1) -#ENDIF -#IF (HDSKCNT >= 3) - .DB DIODEV_HDSK + 2 ; HDSK2: (SIMH DISK DRIVE 2) -#ENDIF -#IF (HDSKCNT >= 4) - .DB DIODEV_HDSK + 3 ; HDSK3: (SIMH DISK DRIVE 3) -#ENDIF -#ENDIF -; -CB_DDLEND: - .FILL (CB_DDL + 15 - $),$FF ; PAD REMAINDER OF DDL ; .FILL (CB + HCB_SIZ - $),0 ; PAD REMAINDER OF HCB ; @@ -269,7 +136,6 @@ START: LD A,1 OUT (MPGENA),A #ENDIF - ; ; EMIT FIRST SIGN OF LIFE TO SERIAL PORT ; @@ -341,6 +207,7 @@ PHASE2: #ENDIF LD DE,0 ; TARGET ADDRESS IS ZERO LD BC,HB_END ; COPY ALL OF HBIOS IMAGE + CALL XIO_DOT ; MARK PROGRESS CALL HB_BNKCPY ; DO IT CALL XIO_DOT ; MARK PROGRESS diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 0b1be3cd..4ae495e5 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -75,12 +75,6 @@ MD_DISPATCH: JP Z,MD_CAP ; SUB-FUNC 10: REPORT CAPACITY DEC A JP Z,MD_GEOM ; SUB-FUNC 11: REPORT GEOMETRY - DEC A - DEC A - DEC A - DEC A - JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO - ; MD_VERIFY: MD_FORMAT: diff --git a/Source/HBIOS/n8v.asm b/Source/HBIOS/n8v.asm index 25ec9314..d2f12cfa 100644 --- a/Source/HBIOS/n8v.asm +++ b/Source/HBIOS/n8v.asm @@ -38,81 +38,55 @@ N8V_INIT: CALL N8V_CRTINIT ; SETUP THE N8V CHIP REGISTERS CALL N8V_LOADFONT ; LOAD FONT DATA FROM ROM TO N8V STRORAGE ; -N8V_RESET: - LD DE,0 ; ROW = 0, COL = 0 - CALL N8V_XY ; SEND CURSOR TO TOP LEFT - LD A,' ' ; BLANK THE SCREEN - LD DE,N8V_ROWS * N8V_COLS ; FILL ENTIRE BUFFER - CALL N8V_FILL ; DO IT - LD DE,0 ; ROW = 0, COL = 0 - CALL N8V_XY ; SEND CURSOR TO TOP LEFT - XOR A - DEC A - LD (N8V_CURSAV),A - CALL N8V_SETCUR ; SET CURSOR + ; ADD OURSELVES TO CIO DISPATCH TABLE + LD B,0 ; PHYSICAL UNIT IS ZERO + LD C,CIODEV_N8V ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE - XOR A ; SIGNAL SUCCESS - RET + CALL TSTPT ; *DEBUG* + LD D,VDAEMU ; DEFAULT EMULATION + LD E,0 ; VIDEO MODE = 0 + JP N8V_VDAINI ; ;====================================================================== ; N8V DRIVER - CHARACTER I/O (CIO) DISPATCHER AND FUNCTIONS ;====================================================================== ; N8V_DISPCIO: - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JR Z,N8V_CIOIN ; $00 - DEC A - JR Z,N8V_CIOOUT ; $01 - DEC A - JR Z,N8V_CIOIST ; $02 - DEC A - JR Z,N8V_CIOOST ; $03 - CALL PANIC -; -N8V_CIOIN: - JP PPK_READ ; CHAIN TO KEYBOARD DRIVER -; -N8V_CIOIST: - JP PPK_STAT ; CHAIN TO KEYBOARD DRIVER -; -N8V_CIOOUT: - JP N8V_VDAWRC ; WRITE CHARACTER -; -N8V_CIOOST: - XOR A ; A = 0 - INC A ; A = 1, SIGNAL OUTPUT BUFFER READY - RET + JP PANIC +N8V_CIODISPADR .EQU $ - 2 ; ;====================================================================== ; N8V DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS ;====================================================================== ; -N8V_DISPVDA: +N8V_DISPATCH: LD A,B ; GET REQUESTED FUNCTION AND $0F ; ISOLATE SUB-FUNCTION - JR Z,N8V_VDAINI ; $40 + JP Z,N8V_VDAINI ; $40 DEC A - JR Z,N8V_VDAQRY ; $41 + JP Z,N8V_VDAQRY ; $41 DEC A - JR Z,N8V_VDARES ; $42 + JP Z,N8V_VDARES ; $42 DEC A - JR Z,N8V_VDASCS ; $43 + JP Z,N8V_VDASCS ; $43 DEC A - JR Z,N8V_VDASCP ; $44 + JP Z,N8V_VDASCP ; $44 DEC A - JR Z,N8V_VDASAT ; $45 + JP Z,N8V_VDASAT ; $45 DEC A - JR Z,N8V_VDASCO ; $46 + JP Z,N8V_VDASCO ; $46 DEC A - JR Z,N8V_VDAWRC ; $47 + JP Z,N8V_VDAWRC ; $47 DEC A - JR Z,N8V_VDAFIL ; $48 + JP Z,N8V_VDAFIL ; $48 DEC A - JR Z,N8V_VDACPY ; $49 + JP Z,N8V_VDACPY ; $49 DEC A - JR Z,N8V_VDASCR ; $4A + JP Z,N8V_VDASCR ; $4A DEC A JP Z,PPK_STAT ; $4B DEC A @@ -122,7 +96,22 @@ N8V_DISPVDA: CALL PANIC N8V_VDAINI: - JP N8V_INIT ; INITIALIZE + ; RESET VDA + PUSH DE ; SAVE EMULATION TYPE (IN D) + CALL N8V_VDARES ; RESET VDA + POP DE ; RECOVER EMULATION TYPE + + ; INITIALIZE EMULATION + LD C,D ; EMULATION MODE TO C + LD DE,N8V_DISPATCH ; DISPATCH ADDRESS TO DE + CALL TSTPT ; *DEBUG* + CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER + LD (N8V_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS + CALL TSTPT ; *DEBUG* + + XOR A ; SIGNAL SUCCESS + RET + N8V_VDAQRY: LD C,$00 ; MODE ZERO IS ALL WE KNOW @@ -133,7 +122,20 @@ N8V_VDAQRY: RET N8V_VDARES: - JR N8V_RESET ; DO THE RESET + LD DE,0 ; ROW = 0, COL = 0 + CALL N8V_XY ; SEND CURSOR TO TOP LEFT + LD A,' ' ; BLANK THE SCREEN + LD DE,N8V_ROWS * N8V_COLS ; FILL ENTIRE BUFFER + CALL N8V_FILL ; DO IT + LD DE,0 ; ROW = 0, COL = 0 + CALL N8V_XY ; SEND CURSOR TO TOP LEFT + XOR A + DEC A + LD (N8V_CURSAV),A + CALL N8V_SETCUR ; SET CURSOR + + XOR A ; SIGNAL SUCCESS + RET N8V_VDASCS: CALL PANIC ; NOT IMPLEMENTED (YET) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 64d9633c..04780218 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -350,11 +350,6 @@ PPIDE_DISPATCH: JP Z,PPIDE_CAP ; SUB-FUNC 10: REPORT CAPACITY DEC A JP Z,PPIDE_GEOM ; SUB-FUNC 11: REPORT GEOMETRY - DEC A - DEC A - DEC A - DEC A - JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO ; PPIDE_VERIFY: PPIDE_FORMAT: diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index d5b79b52..6d8442c7 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -243,6 +243,14 @@ PPP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD) PPPCON_INIT: CALL NEWLINE PRTS("PPPCON:$") +; +; ADD OURSELVES TO CIO DISPATCH TABLE +; + LD B,0 ; PHYSICAL UNIT IS ZERO + LD C,CIODEV_PPPCON ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE ; XOR A RET @@ -259,6 +267,12 @@ PPPCON_DISPATCH: JR Z,PPPCON_IST ; JUMP IF INPUT STATUS DEC A ; NEXT SUBFUNCTION JR Z,PPPCON_OST ; JUMP IF OUTPUT STATUS + DEC A ; NEXT SUBFUNCTION + JR Z,PPPCON_INITDEV ; JUMP IF INIT DEVICE + DEC A ; NEXT SUBFUNCTION + JR Z,PPPCON_QUERY ; JUMP IF QUERY + DEC A ; NEXT SUBFUNCTION + JR Z,PPPCON_DEVICE ; JUMP IF DEVICE REPORT CALL PANIC ; OTHERWISE SOMETHING IS BADLY BROKEN ; ; CHARACTER INPUT @@ -306,6 +320,20 @@ PPPCON_OST: INC A RET ; +; +; +PPPCON_INITDEV: +PPPCON_QUERY: + CALL PANIC +; +; +; +PPPCON_DEVICE: + LD D,CIODEV_PPPCON ; D := DEVICE TYPE + LD E,C ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET +; ;================================================================================================== ; PARPORTPROP SD CARD DRIVER ;================================================================================================== @@ -410,11 +438,6 @@ PPPSD_DISPATCH: JP Z,PPPSD_CAP ; SUB-FUNC 10: REPORT CAPACITY DEC A JP Z,PPPSD_GEOM ; SUB-FUNC 11: REPORT GEOMETRY - DEC A - DEC A - DEC A - DEC A - JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO ; PPPSD_VERIFY: PPPSD_FORMAT: diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index 0e6aa01c..53e658e5 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -119,6 +119,14 @@ PRPCON_INIT: ; CALL NEWLINE PRTS("PRPCON:$") +; +; ADD OURSELVES TO CIO DISPATCH TABLE +; + LD B,0 ; PHYSICAL UNIT IS ZERO + LD C,CIODEV_PRPCON ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE ; XOR A ; SIGNAL SUCCESS RET @@ -135,6 +143,12 @@ PRPCON_DISPATCH: JR Z,PRPCON_IST DEC A JR Z,PRPCON_OST + DEC A + JR Z,PRPCON_INITDEV + DEC A + JR Z,PRPCON_QUERY + DEC A + JR Z,PRPCON_DEVICE CALL PANIC ; ; @@ -181,6 +195,20 @@ PRPCON_OST1: DEC A ; SET A=$FF TO SIGNAL READY RET ; RETURN ; +; +; +PRPCON_INITDEV: +PRPCON_QUERY: + CALL PANIC +; +; +; +PRPCON_DEVICE: + LD D,CIODEV_PRPCON ; D := DEVICE TYPE + LD E,C ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET +; ;================================================================================================== ; PROPIO SD CARD DRIVER ;================================================================================================== @@ -308,11 +336,6 @@ PRPSD_DISPATCH: JP Z,PRPSD_CAP ; SUB-FUNC 10: REPORT CAPACITY DEC A JP Z,PRPSD_GEOM ; SUB-FUNC 11: REPORT GEOMETRY - DEC A - DEC A - DEC A - DEC A - JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO ; PRPSD_VERIFY: PRPSD_FORMAT: diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index e8793aea..8f9ac91f 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -78,11 +78,6 @@ RF_DISPATCH: JP Z,RF_CAP ; SUB-FUNC 10: REPORT CAPACITY DEC A JP Z,RF_GEOM ; SUB-FUNC 11: REPORT GEOMETRY - DEC A - DEC A - DEC A - DEC A - JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO ; RF_VERIFY: RF_FORMAT: diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 15a48e90..2b38b6f2 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -436,10 +436,11 @@ UDEVUNK .DB "UNK$" ; CHECK FOR VALID DRIVE LETTER LD A,(BL_BOOTID) ; BOOT DEVICE TO A PUSH AF ; SAVE BOOT DEVICE - LD B,BF_DIOGETCNT ; HBIOS FUNC: DEVICE COUNT - RST 08 ; CALL HBIOS, DEVICE COUNT TO B + LD B,BF_SYSGET + LD C,BF_SYSGET_DIOCNT + RST 08 ; E := DISK UNIT COUNT POP AF ; RESTORE BOOT DEVICE - CP B ; CHECK MAX (INDEX - COUNT) + CP E ; CHECK MAX (INDEX - COUNT) JP NC,DB_NODISK ; HANDLE INVALID SELECTION ; SET THE BOOT UNIT AND SLICE @@ -451,8 +452,10 @@ UDEVUNK .DB "UNK$" ; SENSE MEDIA LD A,(BL_DEVICE) ; GET DEVICE/UNIT LD C,A ; STORE IN C - LD B,BF_DIOMED ; DRIVER FUNCTION = DISK MEDIA + LD B,BF_DIOMEDIA ; DRIVER FUNCTION = DISK MEDIA + LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY RST 08 ; CALL HBIOS + LD A,E ; MOVE RESULTANT MEDIA ID TO A OR A ; SET FLAGS JP Z,DB_ERR ; HANDLE ERROR @@ -600,17 +603,6 @@ DB_NXTSEC: ; READ CURRENT SECTOR TO LOAD LOCATION ; DB_READSEC: - LD HL,(BL_CURDMA) ; GET THE SECTOR DMA ADDRESS - -#IF 0 - CALL NEWLINE - PUSH HL - POP BC - CALL PRTHEXWORD -#ENDIF - LD B,BF_DIOSETBUF ; HBIOS FUNC: SET BUF - RST 08 ; CALL HBIOS - LD A,(BL_DEVICE) ; GET ACTIVE DEVICE/UNIT BYTE AND $F0 ; ISOLATE DEVICE PORTION CP DIODEV_FD ; FLOPPY? @@ -624,7 +616,7 @@ DB_READSEC: LD E,A ; MOVE IT TO LSB LD D,0 ; MSB IS ALWAYS ZERO ; SET C = DEVICE/UNIT - LD B,BF_DIORD ; FUNCTION IN B + LD B,BF_DIOREAD ; FUNCTION IN B LD A,(BL_DEVICE) ; LOAD DEVICE/UNIT VALUE LD C,A ; SAVE IN C JR DB_READSEC3 ; DISPATCH TO DRIVER @@ -652,7 +644,7 @@ DB_READSEC2: CALL ADDHLA ; ADD LU OFFSET ; FINAL LBA IN HL:DE SET 7,H ; SET HI BIT TO INDICATE LBA - LD B,BF_DIORD ; FUNCTION IN B + LD B,BF_DIOREAD ; FUNCTION IN B LD A,(BL_DEVICE) ; GET THE DEVICE/UNIT VALUE LD C,A ; PUT IT IN C ; @@ -685,16 +677,26 @@ DB_READSEC3: POP BC POP AF #ENDIF + PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT + EX DE,HL ; SWAP DE/HL TO XLAT FROM OLD TO NEW CALL + LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL + RST 08 ; DO IT + POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT + RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A + LD HL,(BL_CURDMA) ; GET BUFFER ADDRESS + LD DE,1 ; TRANSFER ONE SECTOR RST 08 - OR A ; SET FLAGS BASED ON RESULT + OR A ; SET FLAGS BASED ON RESULT RET ; ; PRINT LIST OF ALL DRIVES ; PRTALL: ; - LD B,BF_DIOGETCNT ; HBIOS FUNC: DEVICE COUNT - RST 08 ; CALL HBIOS + LD B,BF_SYSGET + LD C,BF_SYSGET_DIOCNT + RST 08 ; E := DISK UNIT COUNT + LD B,E ; COUNT TO B LD A,B ; COUNT TO A OR A ; SET FLAGS RET Z ; BAIL OUT IF ZERO @@ -710,10 +712,8 @@ PRTALL1: CALL COUT ; PRINT IT CALL PC_SPACE ; SPACING PUSH BC ; SAVE LOOP CONTROL - LD B,BF_DIOGETINF ; HBIOS FUNC: DEVICE INFO + LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO RST 08 ; CALL HBIOS - ;LD D,C ; DEVICE/UNIT TO D - ;LD E,0 ; LU IS ZERO CALL PRTDRV ; PRINT IT POP BC ; RESTORE LOOP CONTROL INC C ; BUMP INDEX @@ -875,11 +875,79 @@ BOOT: .DB 00H, 00H, 80H, 80H, 094H, 09DH, 09DH, 09FH .ENDIF ; -#DEFINE CIOMODE_HBIOS -#DEFINE DSKY_KBD #DEFINE USEDELAY #INCLUDE "util.asm" ; +#IF (DSKYENABLE) +#DEFINE DSKY_KBD +#INCLUDE "dsky.asm" +#ENDIF +; +;================================================================================================== +; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED) +;================================================================================================== +; +; OUTPUT CHARACTER FROM A +; +COUT: + ; SAVE ALL INCOMING REGISTERS + PUSH AF + PUSH BC + PUSH DE + PUSH HL +; + ; OUTPUT CHARACTER TO CONSOLE VIA HBIOS + LD E,A ; OUTPUT CHAR TO E + LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR + RST 08 ; HBIOS OUTPUTS CHARACTDR +; + ; RESTORE ALL REGISTERS + POP HL + POP DE + POP BC + POP AF + RET +; +; INPUT CHARACTER TO A +; +CIN: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + ; INPUT CHARACTER FROM CONSOLE VIA HBIOS + LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR + RST 08 ; HBIOS READS CHARACTDR + LD A,E ; MOVE CHARACTER TO A FOR RETURN +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; +; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) +; +CST: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + ; GET CONSOLE INPUT STATUS VIA HBIOS + LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS + RST 08 ; HBIOS RETURNS STATUS IN A +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; ; READ A CONSOLE CHARACTER AND CONVERT TO UPPER CASE ; CINUC: diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index efb87769..e0637040 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -453,11 +453,6 @@ SD_DISPATCH: JP Z,SD_CAP ; SUB-FUNC 10: REPORT CAPACITY DEC A JP Z,SD_GEOM ; SUB-FUNC 11: REPORT GEOMETRY - DEC A - DEC A - DEC A - DEC A - JP Z,NDIO_INFO ; SUB-FUNC 15: QUERY DISK SYSTEM INFO ; SD_VERIFY: SD_FORMAT: @@ -526,7 +521,7 @@ SD_MEDIA: OR A ; SET FLAGS JR Z,SD_MEDIA2 ; JUST REPORT CURRENT STATUS AND MEDIA ; - IDE_DPTR(SD_STAT) ; POINT TO UNIT STATUS + SD_DPTR(SD_STAT) ; POINT TO UNIT STATUS LD A,(HL) ; GET STATUS OR A ; SET FLAGS JR NZ,SD_MEDIA1 ; ERROR ACTIVE, TO RIGHT TO RESET diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index b8c279c5..3bc4f887 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -104,12 +104,6 @@ SDMODE_UART .EQU 5 ; SD INTERFACE VIA UART SDMODE_DSD .EQU 6 ; DUAL SD SDMODE_MK4 .EQU 7 ; MARK IV ; -; EMULATION TYPES -; -EMUTYP_NONE .EQU 0 -EMUTYP_TTY .EQU 1 -EMUTYP_ANSI .EQU 2 -; #INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE ; #IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4)) diff --git a/Source/HBIOS/tty.asm b/Source/HBIOS/tty.asm index a4f348e1..21ccd28a 100644 --- a/Source/HBIOS/tty.asm +++ b/Source/HBIOS/tty.asm @@ -1,5 +1,4 @@ ; -; tty_dochar - added setup in HL of position data before call to write ;================================================================================================== ; TTY EMULATION MODULE ;================================================================================================== @@ -8,13 +7,26 @@ ; - SOME FUNCTIONS ARE NOT IMPLEMENTED!!! ; TTY_INIT: - PRTS("TTY: RESET$") + ; SAVE INCOMING VDA DISPATCH ADDRESS + LD (EMU_VDADISPADR),DE ; RECORD NEW VDA DISPATCH ADDRESS ; - JR TTY_INI ; REUSE THE INI FUNCTION BELOW + ; QUERY THE VIDEO DRIVER FOR SCREEN DIMENSIONS + LD B,BF_VDAQRY ; FUNCTION IS QUERY + LD HL,0 ; WE DO NOT WANT A COPY OF THE CHARACTER BITMAP DATA + CALL EMU_VDADISP ; PERFORM THE QUERY FUNCTION + LD (TTY_DIM),DE ; SAVE THE SCREEN DIMENSIONS RETURNED +; + LD DE,0 ; DE := 0, CURSOR TO HOME POSITION 0,0 + LD (TTY_POS),DE ; SAVE CURSOR POSITION +; + LD DE,TTY_DISPATCH ; RETURN OUR DISPATCH ADDRESS + XOR A + RET ; ; ; TTY_DISPATCH: + LD (TTY_CIODEV),A ; *DEBUG* LD A,B ; GET REQUESTED FUNCTION AND $0F ; ISOLATE SUB-FUNCTION JR Z,TTY_IN ; $30 @@ -25,11 +37,11 @@ TTY_DISPATCH: DEC A JR Z,TTY_OST ; $33 DEC A - JR Z,TTY_CFG ; $34 - CP 8 - JR Z,TTY_INI ; $38 - CP 9 - JR Z,TTY_QRY ; $39 + JR Z,TTY_INITDEV ; $34 + DEC A + JR Z,TTY_QUERY ; $35 + DEC A + JR Z,TTY_DEVICE ; $36 CALL PANIC ; ; @@ -60,25 +72,23 @@ TTY_OST: ; ; ; -TTY_CFG: +TTY_INITDEV: XOR A ; SIGNAL SUCCESS - RET + RET ; AND RETURN ; ; ; -TTY_INI: - LD B,BF_VDAQRY ; FUNCTION IS QUERY - LD HL,0 ; WE DO NOT WANT A COPY OF THE CHARACTER BITMAP DATA - CALL EMU_VDADISP ; PERFORM THE QUERY FUNCTION - LD (TTY_DIM),DE ; SAVE THE SCREEN DIMENSIONS RETURNED - LD DE,0 ; DE := 0, CURSOR TO HOME POSITION 0,0 - LD (TTY_POS),DE ; SAVE CURSOR POSITION - LD B,BF_VDARES ; SET FUNCTION TO RESET - JP EMU_VDADISP ; RESET VDA AND RETURN +TTY_QUERY: + CALL PANIC ; NOT IMPLEMENTED + RET ; ; ; -TTY_QRY: +TTY_DEVICE: + ;LD D,CIODEV_VDA ; D := DEVICE TYPE + LD A,(TTY_CIODEV) ; GET THE CURRENT CIO DEVICE *DEBUG* + LD D,A ; AND PASS BACK IN D *DEBUG* + LD E,C ; E := PHYSICAL UNIT XOR A ; SIGNAL SUCCESS RET ; @@ -159,4 +169,6 @@ TTY_ROW .DB 0 ; CURRENT ROW - 0 BASED ; TTY_DIM: TTY_COLS .DB 80 ; NUMBER OF COLUMNS ON SCREEN -TTY_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN \ No newline at end of file +TTY_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN +; +TTY_CIODEV .DB 0 ; *DEBUG* diff --git a/Source/HBIOS/uart.asm b/Source/HBIOS/uart.asm index 128e0621..7453b6b6 100644 --- a/Source/HBIOS/uart.asm +++ b/Source/HBIOS/uart.asm @@ -106,8 +106,22 @@ UART3_EFR .EQU UART3IOB + 2 ; ENHANCED FEATURE (WHEN LCR = $BF) ; C: CHARACTER (IN/OUT) ; E: DEVICE/UNIT (IN) ; -; UART_INIT: +; +; SETUP THE DISPATCH TABLE ENTRIES +; + LD B,UARTCNT ; LOOP CONTROL + LD C,0 ; PHYSICAL UNIT INDEX +UART_INIT0: + PUSH BC ; SAVE LOOP CONTROL + LD B,C ; PHYSICAL UNIT + LD C,CIODEV_UART ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL CIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED + POP BC ; RESTORE LOOP CONTROL + INC C ; NEXT PHYSICAL UNIT + DJNZ UART_INIT0 ; LOOP UNTIL DONE +; #IF (UARTCNT >= 1) CALL UART0_INIT #ENDIF @@ -180,15 +194,21 @@ UART0_INIT: ; ; UART0_DISPATCH: - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JP Z,UART0_IN + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,UART0_IN ; BF_CIOIN + DEC A + JP Z,UART0_OUT ; BF_CIOOUT + DEC A + JP Z,UART0_IST ; BF_CIOIST DEC A - JP Z,UART0_OUT + JP Z,UART0_OST ; BF_CIOOST DEC A - JP Z,UART0_IST + JP Z,UART0_INITDEV ; BF_CIOINIT DEC A - JP Z,UART0_OST + JP Z,UART0_QUERY ; BF_CIOQUERY + DEC A + JP Z,UART0_DEVICE ; BF_CIODEVICE CALL PANIC ; ; @@ -229,6 +249,18 @@ UART0_OST: INC A ; SIGNAL BUFFER EMPTY, A = 1 RET ; +UART0_INITDEV: +UART0_QUERY: + CALL PANIC +; +; +; +UART0_DEVICE: + LD D,CIODEV_UART ; D := DEVICE TYPE + LD E,C ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET +; #ENDIF ; ; @@ -267,15 +299,21 @@ UART1_INIT: ; ; UART1_DISPATCH: - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JP Z,UART1_IN + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,UART1_IN ; BF_CIOIN + DEC A + JP Z,UART1_OUT ; BF_CIOOUT DEC A - JP Z,UART1_OUT + JP Z,UART1_IST ; BF_CIOIST DEC A - JP Z,UART1_IST + JP Z,UART1_OST ; BF_CIOOST DEC A - JP Z,UART1_OST + JP Z,UART1_INITDEV ; BF_CIOINIT + DEC A + JP Z,UART1_QUERY ; BF_CIOQUERY + DEC A + JP Z,UART1_DEVICE ; BF_CIODEVICE CALL PANIC ; ; @@ -316,6 +354,18 @@ UART1_OST: INC A ; SIGNAL BUFFER EMPTY, A = 1 RET ; +UART1_INITDEV: +UART1_QUERY: + CALL PANIC +; +; +; +UART1_DEVICE: + LD D,CIODEV_UART ; D := DEVICE TYPE + LD E,C ; E := PHYSICAL UNIT + XOR A ; SIGNAL SUCCESS + RET +; #ENDIF ; ; UART INITIALIZATION ROUTINE diff --git a/Source/HBIOS/ubios.inc b/Source/HBIOS/ubios.inc index 16c78170..fd6bec43 100644 --- a/Source/HBIOS/ubios.inc +++ b/Source/HBIOS/ubios.inc @@ -9,8 +9,8 @@ BF_CIOIST .EQU BF_CIO + 3 ; CHARACTER INPUT STATUS BF_CIOOST .EQU BF_CIO + 4 ; CHARACTER OUTPUT STATUS ; BF_DIO .EQU $40 -BF_DIORD .EQU BF_DIO + 2 ; DISK READ -BF_DIOWR .EQU BF_DIO + 3 ; DISK WRITE +BF_DIOREAD .EQU BF_DIO + 2 ; DISK READ +BF_DIOWRITE .EQU BF_DIO + 3 ; DISK WRITE ; ; MEMORY BANK CONFIGURATION ; diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index f109aeea..f084743d 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -326,13 +326,23 @@ PANIC: LD DE,STR_PANIC CALL WRITESTR POP DE - JR REGDMP ; DUMP REGISTERS AND RETURN + CALL _REGDMP ; DUMP REGISTERS + CALL CONTINUE ; CHECK W/ USER + RET ; ; ; REGDMP: + CALL _REGDMP + RET +; +_REGDMP: EX (SP),HL ; RET ADR TO HL, SAVE HL ON TOS - LD (REGDMP_PC),HL ; SAVE RET IS PC REG VALUE, SAVE IT + LD (REGDMP_RET),HL ; SAVE RETURN ADDRESS + POP HL ; RESTORE HL AND BURN STACK ENTRY + + EX (SP),HL ; PC TO HL, SAVE HL ON TOS + LD (REGDMP_PC),HL ; SAVE PC VALUE EX (SP),HL ; BACK THE WAY IT WAS LD (UTSTKSAV),SP ; SAVE ORIGINAL STACK POINTER @@ -383,7 +393,9 @@ REGDMP: POP AF LD SP,(UTSTKSAV) ; BACK TO ORIGINAL STACK FRAME - RET + + JP $FFFF ; RETURN, $FFFF IS DYNAMICALLY UPDATED +REGDMP_RET .EQU $-2 ; RETURN ADDRESS GOES HERE ; REGDMP_PC .DW 0 ; @@ -412,160 +424,7 @@ CONTINUE3: POP AF RET ; -;================================================================================================== -; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED) -;================================================================================================== ; -; OUTPUT CHARACTER FROM A -COUT: - PUSH AF - PUSH BC - PUSH DE - PUSH HL -#IF (PLATFORM == PLT_UNA) -#IFDEF CIOMODE_CONSOLE - #DEFINE CIOMODE_NONDOS - LD E,A - LD BC,$12 - RST 08 -#ENDIF -#IFDEF CIOMODE_HBIOS - #DEFINE CIOMODE_NONDOS - LD E,A - LD BC,$12 - RST 08 -#ENDIF -#ELSE -#IFDEF CIOMODE_CONSOLE - #DEFINE CIOMODE_NONDOS - LD E,A - LD A,(HCB + HCB_CONDEV) - LD C,A - LD B,BF_CIOOUT - ;CALL HB_DISPATCH - CALL CIO_DISPATCH -#ENDIF -#IFDEF CIOMODE_HBIOS - #DEFINE CIOMODE_NONDOS - LD E,A - LD C,CIODEV_CONSOLE - LD B,BF_CIOOUT - RST 08 -#ENDIF -#ENDIF -#IFDEF CIOMODE_CBIOS - #DEFINE CIOMODE_NONDOS - LD C,A - CALL CBIOS_CONOUT -#ENDIF -#IFNDEF CIOMODE_NONDOS - LD E,A - LD C,03H - CALL 0005H -#ENDIF - POP HL - POP DE - POP BC - POP AF - RET -; -; INPUT CHARACTER TO A -; -CIN: - PUSH BC - PUSH DE - PUSH HL -#IF (PLATFORM == PLT_UNA) -#IFDEF CIOMODE_CONSOLE - #DEFINE CIOMODE_NONDOS - LD BC,$11 - RST 08 - LD A,E -#ENDIF -#IFDEF CIOMODE_HBIOS - #DEFINE CIOMODE_NONDOS - LD BC,$11 - RST 08 - LD A,E -#ENDIF -#ELSE -#IFDEF CIOMODE_CONSOLE - #DEFINE CIOMODE_NONDOS - LD A,(HCB + HCB_CONDEV) - LD C,A - LD B,BF_CIOIN - ;CALL HB_DISPATCH - CALL CIO_DISPATCH - LD A,E -#ENDIF -#IFDEF CIOMODE_HBIOS - #DEFINE CIOMODE_NONDOS - LD C,CIODEV_CONSOLE - LD B,BF_CIOIN - RST 08 - LD A,E -#ENDIF -#ENDIF -#IFDEF CIOMODE_CBIOS - #DEFINE CIOMODE_NONDOS - CALL CBIOS_CONIN -#ENDIF -#IFNDEF CIOMODE_NONDOS - LD C,01H - CALL 0005H -#ENDIF - POP HL - POP DE - POP BC - RET -; -; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) -; -CST: - PUSH BC - PUSH DE - PUSH HL -#IF (PLATFORM == PLT_UNA) -#IFDEF CIOMODE_CONSOLE - #DEFINE CIOMODE_NONDOS - LD BC,$13 - RST 08 - LD A,E -#ENDIF -#IFDEF CIOMODE_HBIOS - #DEFINE CIOMODE_NONDOS - LD BC,$13 - RST 08 - LD A,E -#ENDIF -#ELSE -#IFDEF CIOMODE_CONSOLE - #DEFINE CIOMODE_NONDOS - LD B,BF_CIOIST - LD A,(HCB + HCB_CONDEV) - LD C,A - ;CALL HB_DISPATCH - CALL CIO_DISPATCH -#ENDIF -#IFDEF CIOMODE_HBIOS - #DEFINE CIOMODE_NONDOS - LD B,BF_CIOIST - LD C,CIODEV_CONSOLE - RST 08 -#ENDIF -#ENDIF -#IFDEF CIOMODE_CBIOS - #DEFINE CIOMODE_NONDOS - CALL CBIOS_CONST -#ENDIF -#IFNDEF CIOMODE_NONDOS - LD C,0BH - CALL 0005H -#ENDIF - POP HL - POP DE - POP BC - RET ; STR_PANIC .DB "\r\n\r\n>>> PANIC: $" STR_TSTPT .TEXT "\r\n+++ TSTPT: $" @@ -1013,259 +872,3 @@ ST32: UTSTKSAV .DW 0 .FILL $FF,64 ; 32 LEVEL PRIVATE STACK SPACE UTPRVSTK .EQU $ -; -;================================================================================================== -; DSKY KEYBOARD ROUTINES -;================================================================================================== -; -#IF (DSKYENABLE) - -PPIA .EQU PPIBASE + 0 ; PORT A -PPIB .EQU PPIBASE + 1 ; PORT B -PPIC .EQU PPIBASE + 2 ; PORT C -PPIX .EQU PPIBASE + 3 ; PPI CONTROL PORT - -; -; _____C0______C1______C2______C3__ -;B5 | $20 D $60 E $A0 F $E0 BO -;B4 | $10 A $50 B $90 C $D0 GO -;B3 | $08 7 $48 8 $88 9 $C8 EX -;B2 | $04 4 $44 5 $84 6 $C4 DE -;B1 | $02 1 $42 2 $82 3 $C2 EN -;B0 | $01 FW $41 0 $81 BK $C1 CL -; -KY_0 .EQU 000H -KY_1 .EQU 001H -KY_2 .EQU 002H -KY_3 .EQU 003H -KY_4 .EQU 004H -KY_5 .EQU 005H -KY_6 .EQU 006H -KY_7 .EQU 007H -KY_8 .EQU 008H -KY_9 .EQU 009H -KY_A .EQU 00AH -KY_B .EQU 00BH -KY_C .EQU 00CH -KY_D .EQU 00DH -KY_E .EQU 00EH -KY_F .EQU 00FH -KY_FW .EQU 010H ; FORWARD -KY_BK .EQU 011H ; BACKWARD -KY_CL .EQU 012H ; CLEAR -KY_EN .EQU 013H ; ENTER -KY_DE .EQU 014H ; DEPOSIT -KY_EX .EQU 015H ; EXAMINE -KY_GO .EQU 016H ; GO -KY_BO .EQU 017H ; BOOT -; -;__DSKY_INIT_________________________________________________________________________________________ -; -; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS -;____________________________________________________________________________________________________ -; -DSKY_INIT: - LD A,82H - OUT (PPIX),A - LD A,30H ;disable /CS on PPISD card(s) - OUT (PPIC),A - XOR A - LD (KY_BUF),A - RET -#IFDEF DSKY_KBD -; -;__KY_STAT___________________________________________________________________________________________ -; -; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS -;____________________________________________________________________________________________________ -; -KY_STAT: - ; IF WE ALREADY HAVE A KEY, RETURN WITH NZ - LD A,(KY_BUF) - OR A - RET NZ - ; SCAN FOR A KEYPRESS, A=0 NO DATA OR A=RAW BYTE - CALL KY_SCAN ; SCAN KB ONCE - OR A ; SET FLAGS - RET Z ; NOTHING FOUND, GET OUT - LD (KY_BUF),A ; SAVE RAW KEYCODE - RET ; RETURN -; -;__KY_GET____________________________________________________________________________________________ -; -; GET A SINGLE KEY (WAIT FOR ONE IF NECESSARY) -;____________________________________________________________________________________________________ -; -KY_GET: - ; SEE IF WE ALREADY HAVE A KEY SAVED, GO TO DECODE IF SO - LD A,(KY_BUF) - OR A - JR NZ,KY_DECODE - ; NO KEY SAVED, WAIT FOR ONE -KY_STATLOOP: - CALL KY_STAT - OR A - JR Z,KY_STATLOOP - ; DECODE THE RAW VALUE -KY_DECODE: - LD D,00H - LD HL,KY_KEYMAP ; POINT TO BEGINNING OF TABLE -KY_GET_LOOP: - CP (HL) ; MATCH? - JR Z,KY_GET_DONE ; FOUND, DONE - INC HL - INC D ; D + 1 - JR NZ,KY_GET_LOOP ; NOT FOUND, LOOP UNTIL EOT -KY_GET_DONE: - ; CLEAR OUT KEY_BUF - XOR A - LD (KY_BUF),A - ; RETURN THE INDEX POSITION WHERE THE RAW VALUE WAS FOUND - LD A,D - RET -; -;__KY_SCAN____________________________________________________________________________________________ -; -; SCAN KEYBOARD MATRIX FOR AN INPUT -;____________________________________________________________________________________________________ -; -KY_SCAN: - LD C,0000H - LD A,41H | 30H ; SCAN COL ONE - OUT (PPIC),A ; SEND TO COLUMN LINES - CALL DLY2 ; DEBOUNCE - IN A,(PPIB) ; GET ROWS - AND 7FH ;ignore PB7 for PPISD - CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT - - LD C,0040H - LD A,42H | 30H ; SCAN COL TWO - OUT (PPIC),A ; SEND TO COLUMN LINES - CALL DLY2 ; DEBOUNCE - IN A,(PPIB) ; GET ROWS - AND 7FH ;ignore PB7 for PPISD - CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT - - LD C,0080H - LD A,44H | 30H ; SCAN COL THREE - OUT (PPIC),A ; SEND TO COLUMN LINES - CALL DLY2 ; DEBOUNCE - IN A,(PPIB) ; GET ROWS - AND 7FH ;ignore PB7 for PPISD - CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT - - LD C,00C0H ; - LD A,48H | 30H ; SCAN COL FOUR - OUT (PPIC),A ; SEND TO COLUMN LINES - CALL DLY2 ; DEBOUNCE - IN A,(PPIB) ; GET ROWS - AND 7FH ;ignore PB7 for PPISD - CP 00H ; ANYTHING PRESSED? - JR NZ,KY_SCAN_FOUND ; YES, EXIT - - LD A,040H | 30H ; TURN OFF ALL COLUMNS - OUT (PPIC),A ; SEND TO COLUMN LINES - LD A,00H ; RETURN NULL - RET ; EXIT - -KY_SCAN_FOUND: - AND 3FH ; CLEAR TOP TWO BITS - OR C ; ADD IN ROW BITS - LD C,A ; STORE VALUE - - ; WAIT FOR KEY TO BE RELEASED - LD A,4FH | 30H ; SCAN ALL COL LINES - OUT (PPIC),A ; SEND TO COLUMN LINES - CALL DLY2 ; DEBOUNCE -KY_CLEAR_LOOP: ; WAIT FOR KEY TO CLEAR - IN A,(PPIB) ; GET ROWS - AND 7FH ;ignore PB7 for PPISD - CP 00H ; ANYTHING PRESSED? - JR NZ,KY_CLEAR_LOOP ; YES, LOOP UNTIL KEY RELEASED - - LD A,040H | 30H ; TURN OFF ALL COLUMNS - OUT (PPIC),A ; SEND TO COLUMN LINES - - LD A,C ; RESTORE VALUE - RET -; -;_KEYMAP_TABLE_____________________________________________________________________________________________________________ -; -KY_KEYMAP: -; 0 1 2 3 4 5 6 7 - .DB 041H,002H,042H,082H,004H,044H,084H,008H -; 8 9 A B C D E F - .DB 048H,088H,010H,050H,090H,020H,060H,0A0H -; FW BK CL EN DE EX GO BO - .DB 001H,081H,0C1H,0C2H,0C4H,0C8H,0D0H,0E0H -; -#ENDIF ; DSKY_KBD -; -;================================================================================================== -; DSKY HEX DISPLAY -;================================================================================================== -; -DSKY_HEXOUT: - LD B,DSKY_HEXBUFLEN - LD HL,DSKY_BUF - LD DE,DSKY_HEXBUF -DSKY_HEXOUT1: - LD A,(DE) ; FIRST NIBBLE - SRL A - SRL A - SRL A - SRL A - LD (HL),A - INC HL - LD A,(DE) ; SECOND NIBBLE - AND 0FH - LD (HL),A - INC HL - INC DE ; NEXT BYTE - DJNZ DSKY_HEXOUT1 - - LD A,82H ; SETUP PPI - OUT (PPIX),A - CALL DSKY_COFF - LD A,0D0H ; 7218 -> (DATA COMING, HEXA DECODE) - OUT (PPIA),A - CALL DSKY_STROBEC - - LD HL,DSKY_BUF ; POINT TO START OF BUF - LD B,DSKY_BUFLEN ; NUMBER OF DIGITS - LD C,PPIA -DSKY_HEXOUT2: - OUTI - JP Z,DSKY_STROBE ; DO FINAL STROBE AND RETURN - CALL DSKY_STROBE - JR DSKY_HEXOUT2 - -DSKY_STROBEC: - LD A,80H | 30H - JP DSKY_STROBE0 - -DSKY_STROBE: - LD A,00H | 30H ; SET WRITE STROBE - -DSKY_STROBE0: - OUT (PPIC),A ; OUT TO PORTC - CALL DLY2 ; DELAY -DSKY_COFF - LD A,40H | 30H ; SET CONTROL PORT OFF - OUT (PPIC),A ; OUT TO PORTC -; CALL DSKY_DELAY ; WAIT - RET -; -; -; -KY_BUF .DB 0 -DSKY_BUF: .FILL 8,0 -DSKY_BUFLEN .EQU $ - DSKY_BUF -DSKY_HEXBUF .FILL 4,0 -DSKY_HEXBUFLEN .EQU $ - DSKY_HEXBUF -; -; -#ENDIF diff --git a/Source/HBIOS/vdu.asm b/Source/HBIOS/vdu.asm index 5fca2267..ad41d8c5 100644 --- a/Source/HBIOS/vdu.asm +++ b/Source/HBIOS/vdu.asm @@ -14,7 +14,7 @@ ; - IMPLEMENT ALTERNATE DISPLAY MODES? ; ;====================================================================== -; CVDU DRIVER - CONSTANTS +; VDU DRIVER - CONSTANTS ;====================================================================== ; VDU_RAMRD .EQU 0F0h ; READ VDU @@ -33,52 +33,32 @@ VDU_INIT: CALL PRTHEXBYTE ; CALL VDU_CRTINIT ; INIT SY6845 VDU CHIP +; + ; ADD OURSELVES TO CIO DISPATCH TABLE + LD B,0 ; PHYSICAL UNIT IS ZERO + LD C,CIODEV_VDU ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE -VDU_RESET: - LD DE,0 - LD (VDU_OFFSET),DE - CALL VDU_XY - LD A,' ' - LD DE,1024*16 - CALL VDU_FILL - XOR A - RET + CALL TSTPT ; *DEBUG* + LD D,VDAEMU ; DEFAULT EMULATION + LD E,0 ; VIDEO MODE = 0 + JP VDU_VDAINI ; ;====================================================================== ; VDU DRIVER - CHARACTER I/O (CIO) DISPATCHER AND FUNCTIONS ;====================================================================== ; VDU_DISPCIO: - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JR Z,VDU_CIOIN ; $00 - DEC A - JR Z,VDU_CIOOUT ; $01 - DEC A - JR Z,VDU_CIOIST ; $02 - DEC A - JR Z,VDU_CIOOST ; $03 - CALL PANIC -; -VDU_CIOIN: - JP PPK_READ ; CHAIN TO KEYBOARD DRIVER -; -VDU_CIOIST: - JP PPK_STAT ; CHAIN TO KEYBOARD DRIVER -; -VDU_CIOOUT: - JP VDU_VDAWRC ; WRITE CHARACTER -; -VDU_CIOOST: - XOR A ; A := 0 - INC A ; A := 1, SIGNAL OUTPUT BUFFER READY - RET + JP PANIC +VDU_CIODISPADR .EQU $ - 2 ; ;====================================================================== ; VDU DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS ;====================================================================== ; -VDU_DISPVDA: +VDU_DISPATCH: LD A,B ; GET REQUESTED FUNCTION AND $0F ; ISOLATE SUB-FUNCTION @@ -112,7 +92,21 @@ VDU_DISPVDA: CALL PANIC VDU_VDAINI: - JR VDU_INIT ; INITIALIZE + ; RESET VDA + PUSH DE ; SAVE EMULATION TYPE (IN D) + CALL VDU_VDARES ; RESET VDA + POP DE ; RECOVER EMULATION TYPE + + ; INITIALIZE EMULATION + LD C,D ; EMULATION MODE TO C + LD DE,VDU_DISPATCH ; DISPATCH ADDRESS TO DE + CALL TSTPT ; *DEBUG* + CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER + LD (VDU_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS + CALL TSTPT ; *DEBUG* + + XOR A ; SIGNAL SUCCESS + RET VDU_VDAQRY: LD C,$00 ; MODE ZERO IS ALL WE KNOW @@ -122,7 +116,16 @@ VDU_VDAQRY: RET VDU_VDARES: - JR VDU_RESET ; DO THE RESET + ;JR VDU_RESET ; DO THE RESET + LD DE,0 + LD (VDU_OFFSET),DE + CALL VDU_XY + LD A,' ' + LD DE,1024*16 + CALL VDU_FILL + + XOR A + RET VDU_VDASCS: CALL PANIC ; NOT IMPLEMENTED (YET) @@ -154,7 +157,7 @@ VDU_VDAFIL: RET VDU_VDACPY: - ; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS CVDU_POS + ; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS VDU_POS PUSH HL ; SAVE LENGTH CALL VDU_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL POP BC ; RECOVER LENGTH IN BC @@ -180,7 +183,7 @@ VDU_VDASCR1: JR VDU_VDASCR ; LOOP ; ;====================================================================== -; CVDU DRIVER - PRIVATE DRIVER FUNCTIONS +; VDU DRIVER - PRIVATE DRIVER FUNCTIONS ;====================================================================== ; ;---------------------------------------------------------------------- @@ -201,7 +204,7 @@ VDU_WAITRDY: ; VDU_WRREG: PUSH AF ; SAVE VALUE TO WRITE - LD A,C ; SET A TO CVDU REGISTER TO SELECT + LD A,C ; SET A TO VDU REGISTER TO SELECT OUT (VDU_REG),A ; WRITE IT TO SELECT THE REGISTER POP AF ; RECOVER VALUE TO WRITE OUT (VDU_DATA),A ; WRITE IT @@ -210,7 +213,7 @@ VDU_WRREG: VDU_WRREGX: LD A,H ; SETUP MSB TO WRITE CALL VDU_WRREG ; DO IT - INC C ; NEXT CVDU REGISTER + INC C ; NEXT VDU REGISTER LD A,L ; SETUP LSB TO WRITE JR VDU_WRREG ; DO IT & RETURN ; @@ -222,7 +225,7 @@ VDU_WRREGX: ;---------------------------------------------------------------------- ; VDU_RDREG: - LD A,C ; SET A TO CVDU REGISTER TO SELECT + LD A,C ; SET A TO VDU REGISTER TO SELECT OUT (VDU_REG),A ; WRITE IT TO SELECT THE REGISTER IN A,(VDU_DATA) ; READ IT RET