Browse Source

Revised Emulation Services

pull/3/head
Wayne Warthen 10 years ago
parent
commit
5adbef5f68
  1. 158
      Source/CBIOS/cbios.asm
  2. 18
      Source/CBIOS/util.asm
  3. 274
      Source/HBIOS/API.txt
  4. 114
      Source/HBIOS/Layout.txt
  5. 117
      Source/HBIOS/ansi.asm
  6. 113
      Source/HBIOS/asci.asm
  7. 104
      Source/HBIOS/cvdu.asm
  8. 2
      Source/HBIOS/cvdu_font.asm
  9. 74
      Source/HBIOS/dbgmon.asm
  10. 252
      Source/HBIOS/dsky.asm
  11. 5
      Source/HBIOS/fd.asm
  12. 822
      Source/HBIOS/hbios.asm
  13. 70
      Source/HBIOS/hbios.inc
  14. 5
      Source/HBIOS/hdsk.asm
  15. 5
      Source/HBIOS/ide.asm
  16. 157
      Source/HBIOS/loader.asm
  17. 6
      Source/HBIOS/md.asm
  18. 106
      Source/HBIOS/n8v.asm
  19. 5
      Source/HBIOS/ppide.asm
  20. 33
      Source/HBIOS/ppp.asm
  21. 33
      Source/HBIOS/prp.asm
  22. 5
      Source/HBIOS/rf.asm
  23. 118
      Source/HBIOS/romldr.asm
  24. 7
      Source/HBIOS/sd.asm
  25. 6
      Source/HBIOS/std.asm
  26. 54
      Source/HBIOS/tty.asm
  27. 76
      Source/HBIOS/uart.asm
  28. 4
      Source/HBIOS/ubios.inc
  29. 427
      Source/HBIOS/util.asm
  30. 87
      Source/HBIOS/vdu.asm

158
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

18
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
;

274
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
---
<VDA>_INIT:
- ADD OURSELVES TO VDA_TBL
- ADD OURSELVES TO CIO_TBL & RECORD <VDA>_CIOUNIT
- INIT HARDWARE
- GOTO <VDA>_INI
<VDA>_INI:
- CALL <VDA>_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 <VDA>_CIODISPATCH
<VDA>_RES:
- RESET HARDWARE
EMU_INIT:
- CALL <EMU>_INIT BASED ON VALUE IN C
<EMU>_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

114
Source/HBIOS/Layout.txt

@ -0,0 +1,114 @@
------------------
Final Output Files
------------------
ROM Output File [512K] -> <config>.rom
setup [32K] romboot?
hbios+hbfill [32K]
OSIMG [32K]
OSIMG [32K] (used as filler)
romdisk - [384K]
COM Output File -> <config>.com
comldr [varies] appboot?
hbios [varies]
OSIMG [32K]
IMG Output File -> <config>.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
<config>.asm
plt_<platform>.inc
hbios.exp
loader boot?
xio
memmgr
comldr.asm -> comldr.bin: appboot?
std.asm
ver.inc
hbios.inc
build.inc
<config>.asm
plt_<platform>.inc
hbios.exp
loader boot?
xio
memmgr
imgldr.asm -> imgldr.bin: imgboot?
std.asm
ver.inc
hbios.inc
build.inc
<config>.asm
plt_<platform>.inc
hbios.exp
loader boot?
xio
memmgr
hbios.bin:
std.asm
ver.inc
hbios.inc
build.inc
<config>.asm
plt_<platform>.inc
<device drivers>
util.asm
time.asm
bcd.asm
dsky.asm
romldr.asm -> romldr.bin: loader?
std.asm
ver.inc
hbios.inc
build.inc
<config>.asm
plt_<platform>.inc
util.asm
dsky.asm
dbgmon.asm -> dbgmon.bin:
std.asm
ver.inc
hbios.inc
build.inc
<config>.asm
plt_<platform>.inc
util.asm
memmgr.asm
dsky.asm

117
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*

113
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

104
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)

2
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

74
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

252
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

5
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:

822
Source/HBIOS/hbios.asm

File diff suppressed because it is too large

70
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

5
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:

5
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:

157
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

6
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:

106
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)

5
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:

33
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:

33
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:

5
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:

118
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:

7
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

6
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))

54
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
TTY_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN
;
TTY_CIODEV .DB 0 ; *DEBUG*

76
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

4
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
;

427
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

87
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

Loading…
Cancel
Save