Browse Source

Finalize v2.9.0 Prerelease 0

- New function dispatching logic
- Refactored interrupt management
pull/6/head
Wayne Warthen 8 years ago
parent
commit
231239f43f
  1. 4
      Doc/ChangeLog.txt
  2. 2
      ReadMe.txt
  3. 2
      Source/Apps/Assign.asm
  4. 1
      Source/Apps/Build.cmd
  5. 2
      Source/Apps/Format.asm
  6. 2
      Source/Apps/Mode.asm
  7. 4
      Source/Apps/OSLdr.asm
  8. 2
      Source/Apps/Startup.asm
  9. 411
      Source/Apps/Timer.asm
  10. 2
      Source/Build.cmd
  11. 8
      Source/HBIOS/API.txt
  12. 3
      Source/HBIOS/Config/SBC_simh.asm
  13. 32
      Source/HBIOS/acia.asm
  14. 87
      Source/HBIOS/ansi.asm
  15. 88
      Source/HBIOS/asci.asm
  16. 3
      Source/HBIOS/cfg_mk4.asm
  17. 3
      Source/HBIOS/cfg_n8.asm
  18. 3
      Source/HBIOS/cfg_rc.asm
  19. 3
      Source/HBIOS/cfg_sbc.asm
  20. 3
      Source/HBIOS/cfg_zeta.asm
  21. 2
      Source/HBIOS/cfg_zeta2.asm
  22. 59
      Source/HBIOS/cvdu.asm
  23. 731
      Source/HBIOS/hbios.asm
  24. 2
      Source/HBIOS/hbios.inc
  25. 51
      Source/HBIOS/ppp.asm
  26. 53
      Source/HBIOS/prp.asm
  27. 10
      Source/HBIOS/romldr.asm
  28. 40
      Source/HBIOS/sio.asm
  29. 13
      Source/HBIOS/std.asm
  30. 10
      Source/HBIOS/term.asm
  31. 75
      Source/HBIOS/tms.asm
  32. 57
      Source/HBIOS/tty.asm
  33. 24
      Source/HBIOS/uart.asm
  34. 59
      Source/HBIOS/vdu.asm
  35. 59
      Source/HBIOS/vga.asm
  36. BIN
      Source/Images/hd0/s1/u0/pmarc.com
  37. BIN
      Source/Images/hd0/s1/u0/pmext.com

4
Doc/ChangeLog.txt

@ -2,8 +2,10 @@ Version 2.9.0
------------- -------------
- WBW: Implemented multi-sector I/O in all disk drivers - WBW: Implemented multi-sector I/O in all disk drivers
- WBW: Added support for RC2014 SMB Floppy controller modules (SMC and WDC) - WBW: Added support for RC2014 SMB Floppy controller modules (SMC and WDC)
- WBW: New function dispatching for disk drivers
- WBW: New function dispatching for character/disk/video drivers
- WBW: Updated FDU app to support RC2014 floppy controllers - WBW: Updated FDU app to support RC2014 floppy controllers
- WBW: Added TIMER app to display system timer value
- WBW: Refactored interrupt management code
Version 2.8.6 Version 2.8.6
------------- -------------

2
ReadMe.txt

@ -7,7 +7,7 @@
*********************************************************************** ***********************************************************************
Wayne Warthen (wwarthen@gmail.com) Wayne Warthen (wwarthen@gmail.com)
Version 2.9.0, 2018-01-08
Version 2.9.0 (prerelease), 2018-01-16
https://www.retrobrewcomputers.org/ https://www.retrobrewcomputers.org/
RomWBW is a ROM-based implementation of CP/M-80 2.2 and Z-System for RomWBW is a ROM-based implementation of CP/M-80 2.2 and Z-System for

2
Source/Apps/Assign.asm

@ -39,7 +39,7 @@ bdos .equ $0005 ; BDOS invocation vector
stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp
; ;
rmj .equ 2 ; CBIOS version - major rmj .equ 2 ; CBIOS version - major
rmn .equ 8 ; CBIOS version - minor
rmn .equ 9 ; CBIOS version - minor
; ;
;=============================================================================== ;===============================================================================
; Code Section ; Code Section

1
Source/Apps/Build.cmd

@ -18,6 +18,7 @@ call :asm Talk || goto :eof
call :asm OSLdr || goto :eof call :asm OSLdr || goto :eof
call :asm Mode || goto :eof call :asm Mode || goto :eof
call :asm RTC || goto :eof call :asm RTC || goto :eof
call :asm Timer || goto :eof
zx Z80ASM -SYSGEN/F zx Z80ASM -SYSGEN/F

2
Source/Apps/Format.asm

@ -31,7 +31,7 @@ bdos .equ $0005 ; BDOS invocation vector
;stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp ;stamp .equ $40 ; loc of RomWBW CBIOS zero page stamp
; ;
rmj .equ 2 ; CBIOS version - major rmj .equ 2 ; CBIOS version - major
rmn .equ 8 ; CBIOS version - minor
rmn .equ 9 ; CBIOS version - minor
; ;
;=============================================================================== ;===============================================================================
; Code Section ; Code Section

2
Source/Apps/Mode.asm

@ -48,7 +48,7 @@ bdos .equ $0005 ; BDOS invocation vector
ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr
; ;
rmj .equ 2 ; intended CBIOS version - major rmj .equ 2 ; intended CBIOS version - major
rmn .equ 8 ; intended CBIOS version - minor
rmn .equ 9 ; intended CBIOS version - minor
; ;
bf_cioinit .equ $04 ; HBIOS: CIOINIT function bf_cioinit .equ $04 ; HBIOS: CIOINIT function
bf_cioquery .equ $05 ; HBIOS: CIOQUERY function bf_cioquery .equ $05 ; HBIOS: CIOQUERY function

4
Source/Apps/OSLdr.asm

@ -115,7 +115,7 @@ hbxcpy .equ $FFF6 ; Bank copy function entry address
; relocate ourselves to upper memory ; relocate ourselves to upper memory
ld hl,$0000 ; from startup location ld hl,$0000 ; from startup location
ld de,runloc ; to running location ld de,runloc ; to running location
ld bc,$1000 ; assume we are no more that $3000 bytes
ld bc,$0800 ; assume we are no more that 2048 bytes
ldir ; copy ourselves ldir ; copy ourselves
jp phase2 ; jump to new location jp phase2 ; jump to new location
@ -991,7 +991,7 @@ bufptr .dw 0 ; active pointer into buffer
; ;
; Messages ; Messages
; ;
msgban .db "OSLDR v1.0 for RomWBW, 08-Oct-2014",0
msgban .db "OSLDR v1.1 for RomWBW, 16-Jan-2018",0
msghb .db " (HBIOS Mode)",0 msghb .db " (HBIOS Mode)",0
msgub .db " (UBIOS Mode)",0 msgub .db " (UBIOS Mode)",0
msguse .db "Usage: OSLDR [/F] <osimg> [<hbiosimg>]\r\n" msguse .db "Usage: OSLDR [/F] <osimg> [<hbiosimg>]\r\n"

2
Source/Apps/Startup.asm

@ -34,7 +34,7 @@ bdos .equ $0005 ; BDOS invocation vector
ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr
; ;
rmj .equ 2 ; intended CBIOS version - major rmj .equ 2 ; intended CBIOS version - major
rmn .equ 8 ; intended CBIOS version - minor
rmn .equ 9 ; intended CBIOS version - minor
; ;
bf_cioinit .equ $04 ; HBIOS: CIOINIT function bf_cioinit .equ $04 ; HBIOS: CIOINIT function
bf_cioquery .equ $05 ; HBIOS: CIOQUERY function bf_cioquery .equ $05 ; HBIOS: CIOQUERY function

411
Source/Apps/Timer.asm

@ -0,0 +1,411 @@
;===============================================================================
; SIMER - Display system timer value
;
;===============================================================================
;
; Author: Wayne Warthen (wwarthen@gmail.com)
;_______________________________________________________________________________
;
; Usage:
; TIMER [/C] [/?]
; ex: TIMER (display current timer value)
; TIMER /? (display version and usage)
; TIMER /C (display timer value continuously)
;
; Operation:
; Reads and displays system timer value.
;_______________________________________________________________________________
;
; Change Log:
; 2018-01-14 [WBW] Initial release
;_______________________________________________________________________________
;
; ToDo:
;_______________________________________________________________________________
;
;===============================================================================
; Definitions
;===============================================================================
;
stksiz .equ $40 ; Working stack size
;
restart .equ $0000 ; CP/M restart vector
bdos .equ $0005 ; BDOS invocation vector
;
ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr
;
rmj .equ 2 ; intended CBIOS version - major
rmn .equ 9 ; intended CBIOS version - minor
;
bf_sysget .equ $F8 ; HBIOS: SYSGET function
bf_sysgettimer .equ $D0 ; TIMER subfunction
;
;===============================================================================
; Code Section
;===============================================================================
;
.org $100
;
; setup stack (save old value)
ld (stksav),sp ; save stack
ld sp,stack ; set new stack
;
; initialization
call init ; initialize
jr nz,exit ; abort if init fails
;
; process
call process ; do main processing
jr nz,exit ; abort on error
;
exit: ; clean up and return to command processor
call crlf ; formatting
ld sp,(stksav) ; restore stack
;jp restart ; return to CP/M via restart
ret ; return to CP/M w/o restart
;
; Initialization
;
init:
call crlf ; formatting
ld de,msgban ; point to version message part 1
call prtstr ; print it
;
initx
; initialization complete
xor a ; signal success
ret ; return
;
; Process
;
process:
; look for start of parms
ld hl,$81 ; point to start of parm area (past len byte)
call nonblank ; skip to next non-blank char
jp z,process0 ; no parms, go to display
;
; check for special option, introduced by a "/"
cp '/' ; start of options?
jp nz,usage ; yes, handle option
call option ; do option processing
ret nz ; done if non-zero reture
;
process0:
call crlf2 ; formatting
;
process1:
ld b,bf_sysget ; HBIOS SYSGET function
ld c,bf_sysgettimer ; TIMER subfunction
rst 08 ; call HBIOS, DE:HL := timer value
ld a,(first)
or a
ld a,0
ld (first),a
jr nz,process1a
; test for new value
ld a,(last) ; last LSB value to A
cp l ; compare to current LSB
jr z,process2 ; if equal, bypass display
process1a:
; save and print new value
ld a,l ; new LSB value to A
ld (last),a ; save as last value
call prtcr ; back to start of line
call nz,prthex32 ; display it
;
process2:
ld a,(cont) ; continuous display?
or a ; test for true/false
jr z,process3 ; if false, get out
;
ld c,6 ; BDOS: direct console I/O
ld e,$FF ; input char
call bdos ; call BDOS, A := char
or a ; test for zero
jr z,process1 ; loop until char pressed
;
process3:
xor a ; signal success
ret
;
; Handle special options
;
option:
;
inc hl ; next char
ld a,(hl) ; get it
cp '?' ; is it a '?'?
jp z,usage ; yes, display usage
cp 'C' ; is it a 'C', continuous?
jp z,setcont ; yes, set continuous display
jp errprm ; anything else is an error
;
usage:
;
call crlf2 ; blank line
ld de,msguse ; point to usage message
call prtstr ; print it
or $FF ; signal no action performed
ret ; and return
;
setcont:
;
or $FF ; set A to true
ld (cont),a ; and save it
xor a ; signal success
ret ; and done
;
; Print character in A without destroying any registers
;
prtchr:
push bc ; save registers
push de
push hl
ld e,a ; character to print in E
ld c,$02 ; BDOS function to output a character
call bdos ; do it
pop hl ; restore registers
pop de
pop bc
ret
;
prtdot:
;
; shortcut to print a dot preserving all regs
push af ; save af
ld a,'.' ; load dot char
call prtchr ; print it
pop af ; restore af
ret ; done
;
prtcr:
;
; shortcut to print a dot preserving all regs
push af ; save af
ld a,13 ; load CR value
call prtchr ; print it
pop af ; restore af
ret ; done
;
; Print a zero terminated string at (DE) without destroying any registers
;
prtstr:
push de
;
prtstr1:
ld a,(de) ; get next char
or a
jr z,prtstr2
call prtchr
inc de
jr prtstr1
;
prtstr2:
pop de ; restore registers
ret
;
; Print the value in A in hex without destroying any registers
;
prthex:
push af ; save AF
push de ; save DE
call hexascii ; convert value in A to hex chars in DE
ld a,d ; get the high order hex char
call prtchr ; print it
ld a,e ; get the low order hex char
call prtchr ; print it
pop de ; restore DE
pop af ; restore AF
ret ; done
;
; print the hex word value in bc
;
prthexword:
push af
ld a,b
call prthex
ld a,c
call prthex
pop af
ret
;
; print the hex dword value in de:hl
;
prthex32:
push bc
push de
pop bc
call prthexword
push hl
pop bc
call prthexword
pop bc
ret
;
; Convert binary value in A to ascii hex characters in DE
;
hexascii:
ld d,a ; save A in D
call hexconv ; convert low nibble of A to hex
ld e,a ; save it in E
ld a,d ; get original value back
rlca ; rotate high order nibble to low bits
rlca
rlca
rlca
call hexconv ; convert nibble
ld d,a ; save it in D
ret ; done
;
; Convert low nibble of A to ascii hex
;
hexconv:
and $0F ; low nibble only
add a,$90
daa
adc a,$40
daa
ret
;
; Print value of A or HL in decimal with leading zero suppression
; Use prtdecb for A or prtdecw for HL
;
prtdecb:
push hl
ld h,0
ld l,a
call prtdecw ; print it
pop hl
ret
;
prtdecw:
push af
push bc
push de
push hl
call prtdec0
pop hl
pop de
pop bc
pop af
ret
;
prtdec0:
ld e,'0'
ld bc,-10000
call prtdec1
ld bc,-1000
call prtdec1
ld bc,-100
call prtdec1
ld c,-10
call prtdec1
ld e,0
ld c,-1
prtdec1:
ld a,'0' - 1
prtdec2:
inc a
add hl,bc
jr c,prtdec2
sbc hl,bc
cp e
ret z
ld e,0
call prtchr
ret
;
; Start a new line
;
crlf2:
call crlf ; two of them
crlf:
push af ; preserve AF
ld a,13 ; <CR>
call prtchr ; print it
ld a,10 ; <LF>
call prtchr ; print it
pop af ; restore AF
ret
;
; Get the next non-blank character from (HL).
;
nonblank:
ld a,(hl) ; load next character
or a ; string ends with a null
ret z ; if null, return pointing to null
cp ' ' ; check for blank
ret nz ; return if not blank
inc hl ; if blank, increment character pointer
jr nonblank ; and loop
;
; Convert character in A to uppercase
;
ucase:
cp 'a' ; if below 'a'
ret c ; ... do nothing and return
cp 'z' + 1 ; if above 'z'
ret nc ; ... do nothing and return
res 5,a ; clear bit 5 to make lower case -> upper case
ret ; and return
;
; Add the value in A to HL (HL := HL + A)
;
addhl:
add a,l ; A := A + L
ld l,a ; Put result back in L
ret nc ; if no carry, we are done
inc h ; if carry, increment H
ret ; and return
;
; Jump indirect to address in HL
;
jphl:
jp (hl)
;
; Errors
;
erruse: ; command usage error (syntax)
ld de,msguse
jr err
;
errprm: ; command parameter error (syntax)
ld de,msgprm
jr err
err: ; print error string and return error signal
call crlf ; print newline
;
err1: ; without the leading crlf
call prtstr ; print error string
;
err2: ; without the string
; call crlf ; print newline
or $FF ; signal error
ret ; done
;
;===============================================================================
; Storage Section
;===============================================================================
;
last .db 0 ; last LSB of timer value
cont .db 0 ; non-zero indicates continuous display
first .db $FF ; first pass flag (true at start)
;
stksav .dw 0 ; stack pointer saved at start
.fill stksiz,0 ; stack
stack .equ $ ; stack top
;
; Messages
;
msgban .db "TIMER v1.0, 14-Jan-2018",13,10
.db "Copyright (C) 2018, Wayne Warthen, GNU GPL v3",0
msguse .db "Usage: TIMER [/C] [/?]",13,10
.db " ex. TIMER (display current timer value)",13,10
.db " TIMER /? (display version and usage)",13,10
.db " TIMER /C (display timer value continuously)",0
msgprm .db "Parameter error (TIMER /? for usage)",0
;
.end

2
Source/Build.cmd

@ -5,5 +5,5 @@ REM setlocal & call BuildDoc || exit /b 1 & endlocal
setlocal & call BuildHardware || exit /b 1 & endlocal setlocal & call BuildHardware || exit /b 1 & endlocal
setlocal & call BuildImages || exit /b 1 & endlocal setlocal & call BuildImages || exit /b 1 & endlocal
setlocal & call BuildShared || exit /b 1 & endlocal setlocal & call BuildShared || exit /b 1 & endlocal
setlocal & call BuildBP || exit /b 1 & endlocal
REM setlocal & call BuildBP || exit /b 1 & endlocal
setlocal & call BuildROM %* || exit /b 1 & endlocal setlocal & call BuildROM %* || exit /b 1 & endlocal

8
Source/HBIOS/API.txt

@ -53,6 +53,10 @@ GET ($F8):
BC=Function/Subfunction A=Result BC=Function/Subfunction A=Result
E=Video Unit Count E=Video Unit Count
TIMER ($D0):
BC=Function/Subfunction A=Result
DE:HL=Timer Value (32 bit)
BOOTINFO ($E0): BOOTINFO ($E0):
BC=Function/Subfunction A=Result BC=Function/Subfunction A=Result
DE=Boot Volume (Disk Unit/Slice) DE=Boot Volume (Disk Unit/Slice)
@ -77,6 +81,10 @@ GET ($F8):
SET ($F9): SET ($F9):
BC=Function/Subfunction A=Result BC=Function/Subfunction A=Result
TIMER ($D0):
BC=Function/Subfunction A=Result
DE:HL=Timer Value (32 bit)
BOOTINFO ($E0): BOOTINFO ($E0):
BC=Function/Subfunction A=Result BC=Function/Subfunction A=Result
DE=Boot Volume (Disk Unit/Slice) DE=Boot Volume (Disk Unit/Slice)

3
Source/HBIOS/Config/SBC_simh.asm

@ -5,6 +5,9 @@
; ;
#include "cfg_sbc.asm" #include "cfg_sbc.asm"
; ;
INTMODE .SET 1 ; INT MODE 1
HTIMENABLE .SET TRUE ; SIMH TIMER
;
DSRTCENABLE .SET FALSE ; DS-1302 CLOCK DRIVER DSRTCENABLE .SET FALSE ; DS-1302 CLOCK DRIVER
SIMRTCENABLE .SET TRUE ; SIMH CLOCK DRIVER SIMRTCENABLE .SET TRUE ; SIMH CLOCK DRIVER
; ;

32
Source/HBIOS/acia.asm

@ -60,7 +60,7 @@ ACIA_PREINIT0:
JR Z,ACIA_PREINIT2 ; SKIP IT IF NOTHING FOUND JR Z,ACIA_PREINIT2 ; SKIP IT IF NOTHING FOUND
; ;
PUSH BC ; SAVE LOOP CONTROL PUSH BC ; SAVE LOOP CONTROL
LD BC,ACIA_DISPATCH ; BC := DISPATCH ADDRESS
LD BC,ACIA_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL NZ,CIO_ADDENT ; ADD ENTRY IF ACIA FOUND, BC:DE CALL NZ,CIO_ADDENT ; ADD ENTRY IF ACIA FOUND, BC:DE
POP BC ; RESTORE LOOP CONTROL POP BC ; RESTORE LOOP CONTROL
; ;
@ -216,24 +216,9 @@ ACIAB_INT1:
OR $FF ; NZ SET TO INDICATE INT HANDLED OR $FF ; NZ SET TO INDICATE INT HANDLED
RET ; AND RETURN RET ; AND RETURN
; ;
; DRIVER FUNCTION TABLE
; ;
;
ACIA_DISPATCH:
; DISPATCH TO FUNCTION HANDLER
PUSH HL ; SAVE HL FOR NOW
LD A,B ; GET FUNCTION
AND $0F ; ISOLATE LOW NIBBLE
RLCA ; X 2 FOR WORD OFFSET INTO FUNCTION TABLE
LD HL,ACIA_FTBL ; START OF FUNC TABLE
CALL ADDHLA ; HL := ADDRESS OF ADDRESS OF FUNCTION
LD A,(HL) ; DEREF HL
INC HL ; ...
LD H,(HL) ; ...
LD L,A ; ... TO GET ADDRESS OF FUNCTION
EX (SP),HL ; RESTORE HL & PUT FUNC ADDRESS -> (SP)
RET ; EFFECTIVELY A JP TO TGT ADDRESS
ACIA_FTBL:
ACIA_FNTBL:
.DW ACIA_IN .DW ACIA_IN
.DW ACIA_OUT .DW ACIA_OUT
.DW ACIA_IST .DW ACIA_IST
@ -241,6 +226,9 @@ ACIA_FTBL:
.DW ACIA_INITDEV .DW ACIA_INITDEV
.DW ACIA_QUERY .DW ACIA_QUERY
.DW ACIA_DEVICE .DW ACIA_DEVICE
#IF (($ - ACIA_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID ACIA FUNCTION TABLE ***\n"
#ENDIF
; ;
; ;
; ;
@ -256,7 +244,7 @@ ACIA_IN:
ACIAA_IN: ACIAA_IN:
CALL ACIAA_IST ; RECEIVED CHAR READY? CALL ACIAA_IST ; RECEIVED CHAR READY?
JR Z,ACIAA_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER JR Z,ACIAA_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER
DI ; AVOID COLLIACIAN WITH INT HANDLER
HB_DI ; AVOID COLLISION WITH INT HANDLER
LD A,(ACIAA_BUFCNT) ; GET COUNT LD A,(ACIAA_BUFCNT) ; GET COUNT
DEC A ; DECREMENT COUNT DEC A ; DECREMENT COUNT
LD (ACIAA_BUFCNT),A ; SAVE SAVE IT LD (ACIAA_BUFCNT),A ; SAVE SAVE IT
@ -276,14 +264,14 @@ ACIAA_IN0:
LD HL,ACIAA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER LD HL,ACIAA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER
ACIAA_IN1: ACIAA_IN1:
LD (ACIAA_TL),HL ; SAVE UPDATED TAIL POINTER LD (ACIAA_TL),HL ; SAVE UPDATED TAIL POINTER
EI ; INTERRUPTS OK AGAIN
HB_EI ; INTERRUPTS OK AGAIN
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; AND DONE RET ; AND DONE
; ;
ACIAB_IN: ACIAB_IN:
CALL ACIAB_IST ; RECEIVED CHAR READY? CALL ACIAB_IST ; RECEIVED CHAR READY?
JR Z,ACIAB_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER JR Z,ACIAB_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER
DI ; AVOID COLLIACIAN WITH INT HANDLER
HB_DI ; AVOID COLLISION WITH INT HANDLER
LD A,(ACIAB_BUFCNT) ; GET COUNT LD A,(ACIAB_BUFCNT) ; GET COUNT
DEC A ; DECREMENT COUNT DEC A ; DECREMENT COUNT
LD (ACIAB_BUFCNT),A ; SAVE SAVE IT LD (ACIAB_BUFCNT),A ; SAVE SAVE IT
@ -303,7 +291,7 @@ ACIAB_IN0:
LD HL,ACIAB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER LD HL,ACIAB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER
ACIAB_IN1: ACIAB_IN1:
LD (ACIAB_TL),HL ; SAVE UPDATED TAIL POINTER LD (ACIAB_TL),HL ; SAVE UPDATED TAIL POINTER
EI ; INTERRUPTS OK AGAIN
HB_EI ; INTERRUPTS OK AGAIN
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; AND DONE RET ; AND DONE
; ;

87
Source/HBIOS/ansi.asm

@ -22,7 +22,7 @@ ANSI_DEFCOLOR .EQU 7 ; WHITE ON BLACK
; ON ENTRY: ; ON ENTRY:
; DE: DISPATCH ADDRESS OF CALLING VDA DRIVER ; DE: DISPATCH ADDRESS OF CALLING VDA DRIVER
; RETURNS: ; RETURNS:
; DE: OUR CIO DISPATCH ADDRESS
; DE: OUR CIO FUNC TBL ADDRESS
; ;
ANSI_INIT: ANSI_INIT:
; PREVENT ATTEMPTS TO INIT MULTIPLE INSTANCES FOR NOW ; PREVENT ATTEMPTS TO INIT MULTIPLE INSTANCES FOR NOW
@ -35,13 +35,13 @@ ANSI_INIT:
LD (ANSI_DEVNUM),A ; SAVE IT LD (ANSI_DEVNUM),A ; SAVE IT
LD A,C ; VDA UNIT NUMBER PASSED IN C LD A,C ; VDA UNIT NUMBER PASSED IN C
LD (ANSI_VDAUNIT),A ; SAVE IT LD (ANSI_VDAUNIT),A ; SAVE IT
LD (ANSI_VDADISPADR),DE ; RECORD VDA DISPATCH ADDRESS
;LD (ANSI_VDADISPADR),DE ; RECORD VDA DISPATCH ADDRESS
; ;
; INIT/RESET OUR INTERNAL STATE ; INIT/RESET OUR INTERNAL STATE
CALL ANSI_RESET ; FULL RESET OF EMULATOR INTERNAL STATE CALL ANSI_RESET ; FULL RESET OF EMULATOR INTERNAL STATE
RET NZ ; BAIL OUT ON ERROR RET NZ ; BAIL OUT ON ERROR
; ;
LD DE,ANSI_DISPATCH ; RETURN OUR DISPATCH ADDRESS
LD DE,ANSI_FNTBL ; RETURN OUR FUNC TBL ADDRESS
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; RETURN RET ; RETURN
; ;
@ -86,28 +86,25 @@ ANSI_RESET1: ; LOOP TO RESET TAB STOPS
; ;
; ;
ANSI_VDADISP: ANSI_VDADISP:
JP PANIC
ANSI_VDADISPADR .EQU $ - 2
;
;
;
ANSI_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,ANSI_CIOIN ; $30
DEC A
JR Z,ANSI_CIOOUT ; $31
DEC A
JR Z,ANSI_CIOIST ; $32
DEC A
JR Z,ANSI_CIOOST ; $33
DEC A
JR Z,ANSI_CIOINIT ; $34
DEC A
JP Z,ANSI_CIOQUERY ; $35
DEC A
JP Z,ANSI_CIODEVICE ; $36
CALL PANIC
; JP PANIC
;ANSI_VDADISPADR .EQU $ - 2
LD A,(ANSI_VDAUNIT)
LD C,A
JP VDA_DISPATCH
;
; FUNCTION TABLE
;
ANSI_FNTBL:
.DW ANSI_IN
.DW ANSI_OUT
.DW ANSI_IST
.DW ANSI_OST
.DW ANSI_INITDEV
.DW ANSI_QUERY
.DW ANSI_DEVICE
#IF (($ - ANSI_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID ANSI FUNCTION TABLE ***\n"
#ENDIF
; ;
;================================================================================================== ;==================================================================================================
; ANSI EMULATION MODULE BIOS FUNCTION ENTRY POINTS ; ANSI EMULATION MODULE BIOS FUNCTION ENTRY POINTS
@ -115,12 +112,12 @@ ANSI_DISPATCH:
; ;
; READ A CHARACTER ; READ A CHARACTER
; ;
ANSI_CIOIN: ; HANDLE INPUT REQUEST
ANSI_IN: ; HANDLE INPUT REQUEST
; ;
; RETURN QUEUED DATA IF WE HAVE ANY ; RETURN QUEUED DATA IF WE HAVE ANY
LD A,(ANSI_QLEN) ; GET THE CURRENT QUEUE LENGTH LD A,(ANSI_QLEN) ; GET THE CURRENT QUEUE LENGTH
OR A ; SET FLAGS OR A ; SET FLAGS
JR Z,ANSI_CIOIN1 ; NOTHING THERE, GO TO KEYBOARD READ
JR Z,ANSI_IN1 ; NOTHING THERE, GO TO KEYBOARD READ
DEC A ; DECREMENT THE QUEUE LENGTH DEC A ; DECREMENT THE QUEUE LENGTH
LD (ANSI_QLEN),A ; AND SAVE IT LD (ANSI_QLEN),A ; AND SAVE IT
LD HL,(ANSI_QPTR) ; GET THE QUEUE POINTER LD HL,(ANSI_QPTR) ; GET THE QUEUE POINTER
@ -131,44 +128,44 @@ ANSI_CIOIN: ; HANDLE INPUT REQUEST
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; DONE RET ; DONE
; ;
ANSI_CIOIN1: ; PERFORM ACTUAL KEYBOARD INPUT
ANSI_IN1: ; PERFORM ACTUAL KEYBOARD INPUT
LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ
CALL ANSI_VDADISP ; CALL VDA DISPATCHER CALL ANSI_VDADISP ; CALL VDA DISPATCHER
LD A,E ; CHARACTER READ INTO A LD A,E ; CHARACTER READ INTO A
BIT 7,A ; TEST HIGH BIT BIT 7,A ; TEST HIGH BIT
JR NZ,ANSI_CIOIN2 ; HANDLE $80 OR HIGHER AS SPECIAL CHAR
JR NZ,ANSI_IN2 ; HANDLE $80 OR HIGHER AS SPECIAL CHAR
XOR A ; OTHERWISE, SIGNAL SUCCESS XOR A ; OTHERWISE, SIGNAL SUCCESS
RET ; AND RETURN THE KEY RET ; AND RETURN THE KEY
; ;
ANSI_CIOIN2: ; HANDLE SPECIAL KEY
ANSI_IN2: ; HANDLE SPECIAL KEY
CALL ANSI_KDISP ; IF $80 OR HIGHER, DISPATCH CALL ANSI_KDISP ; IF $80 OR HIGHER, DISPATCH
JR ANSI_CIOIN ; AND LOOP
JR ANSI_IN ; AND LOOP
; ;
; WRITE A CHARACTER W/ EMULATION ; WRITE A CHARACTER W/ EMULATION
; ;
ANSI_CIOOUT:
LD HL,ANSI_CIOOUT2 ; RETURN ADDRESS
ANSI_OUT:
LD HL,ANSI_OUT2 ; RETURN ADDRESS
PUSH HL ; PUT IT ON STACK PUSH HL ; PUT IT ON STACK
LD A,E ; GET THE INCOMING CHARACTER LD A,E ; GET THE INCOMING CHARACTER
CP $20 ; $00-$1F IS C0 CP $20 ; $00-$1F IS C0
JP C,ANSI_C0DISP ; IF C0, DO C0 DISPATCH JP C,ANSI_C0DISP ; IF C0, DO C0 DISPATCH
CP $80 ; $20-$7F CP $80 ; $20-$7F
JR C,ANSI_CIOOUT1 ; HANDLE VIA STATE MACHINE
JR C,ANSI_OUT1 ; HANDLE VIA STATE MACHINE
CP $A0 ; $80-$9F IS C1 CP $A0 ; $80-$9F IS C1
JP C,ANSI_C1DISP ; IF C1, DO C1 DISPATCH JP C,ANSI_C1DISP ; IF C1, DO C1 DISPATCH
; ;
ANSI_CIOOUT1: ; PROCESS OTHER CHARS VIA STATE MACHINE
ANSI_OUT1: ; PROCESS OTHER CHARS VIA STATE MACHINE
LD HL,(ANSI_STATE) ; LOAD THE CURRENT STATE LD HL,(ANSI_STATE) ; LOAD THE CURRENT STATE
JP (HL) ; DO IT JP (HL) ; DO IT
; CALL JPHL ; DO IT ; CALL JPHL ; DO IT
; ;
ANSI_CIOOUT2: ; SET RESULT AND RETURN
ANSI_OUT2: ; SET RESULT AND RETURN
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
; ;
; CHECK INPUT STATUS ; CHECK INPUT STATUS
; ;
ANSI_CIOIST: ; CHECK QUEUE FIRST
ANSI_IST: ; CHECK QUEUE FIRST
LD A,(ANSI_QLEN) ; GET CURRENT QUEUE LENGTH LD A,(ANSI_QLEN) ; GET CURRENT QUEUE LENGTH
OR A ; SET FLAGS OR A ; SET FLAGS
RET NZ ; RETURN IF CHAR(S) WAITING RET NZ ; RETURN IF CHAR(S) WAITING
@ -184,7 +181,7 @@ ANSI_CIOIST: ; CHECK QUEUE FIRST
CALL ANSI_VDADISP ; DO IT CALL ANSI_VDADISP ; DO IT
LD A,E ; CHARACTER READ TO A LD A,E ; CHARACTER READ TO A
BIT 7,A ; TEST HIGH BIT BIT 7,A ; TEST HIGH BIT
JR NZ,ANSI_CIOIST1 ; HANDLE $80 OR HIGHER AS SPECIAL CHAR
JR NZ,ANSI_IST1 ; HANDLE $80 OR HIGHER AS SPECIAL CHAR
; ;
; REGULAR CHARACTER RECEIVED, QUEUE IT AND RETURN CHARS WAITING STATUS ; REGULAR CHARACTER RECEIVED, QUEUE IT AND RETURN CHARS WAITING STATUS
LD HL,ANSI_QUEUE ; SET HL TO START OF QUEUE LD HL,ANSI_QUEUE ; SET HL TO START OF QUEUE
@ -194,22 +191,22 @@ ANSI_CIOIST: ; CHECK QUEUE FIRST
XOR A ; ZERO ACCUM XOR A ; ZERO ACCUM
INC A ; ASSUM := 1 (NUM CHARS IN QUEUE) INC A ; ASSUM := 1 (NUM CHARS IN QUEUE)
LD (ANSI_QLEN),A ; SAVE NEW QUEUE LEN LD (ANSI_QLEN),A ; SAVE NEW QUEUE LEN
JR ANSI_CIOIST ; REPEAT
JR ANSI_IST ; REPEAT
; ;
ANSI_CIOIST1: ; HANDLE SPECIAL KEY
ANSI_IST1: ; HANDLE SPECIAL KEY
CALL ANSI_KDISP ; DO SPECIAL KEY HANDLING CALL ANSI_KDISP ; DO SPECIAL KEY HANDLING
JR ANSI_CIOIST ; REPEAT
JR ANSI_IST ; REPEAT
; ;
; CHECK OUTPUT STATUS ; CHECK OUTPUT STATUS
; ;
ANSI_CIOOST: ; VIDEO OUTPUT IS *ALWAYS* READY
ANSI_OST: ; VIDEO OUTPUT IS *ALWAYS* READY
XOR A ; ZERO ACCUM XOR A ; ZERO ACCUM
INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY
RET RET
; ;
; INITIALIZE ; INITIALIZE
; ;
ANSI_CIOINIT:
ANSI_INITDEV:
; RESET THE ATTACHED VDA DEVICE ; RESET THE ATTACHED VDA DEVICE
LD B,BF_VDAINI ; FUNC: INIT LD B,BF_VDAINI ; FUNC: INIT
LD E,-1 ; DO NOT CHANGE VIDEO MODE LD E,-1 ; DO NOT CHANGE VIDEO MODE
@ -220,7 +217,7 @@ ANSI_CIOINIT:
; ;
; QUERY STATUS ; QUERY STATUS
; ;
ANSI_CIOQUERY:
ANSI_QUERY:
LD DE,$FFFF LD DE,$FFFF
LD HL,$FFFF LD HL,$FFFF
XOR A XOR A
@ -228,7 +225,7 @@ ANSI_CIOQUERY:
; ;
; REPORT DEVICE ; REPORT DEVICE
; ;
ANSI_CIODEVICE:
ANSI_DEVICE:
LD D,CIODEV_TERM ; TYPE IS TERMINAL LD D,CIODEV_TERM ; TYPE IS TERMINAL
LD A,(ANSI_DEVNUM) ; GET DEVICE NUMBER LD A,(ANSI_DEVNUM) ; GET DEVICE NUMBER
LD E,A ; PUT IT IN E LD E,A ; PUT IT IN E

88
Source/HBIOS/asci.asm

@ -68,21 +68,31 @@ ASCI_PREINIT:
; ;
; SETUP THE DISPATCH TABLE ENTRIES ; SETUP THE DISPATCH TABLE ENTRIES
; ;
LD B,2 ; ALWAYS 2 ASCI UNITS ON Z180
LD C,0 ; PHYSICAL UNIT INDEX
ASCI_PREINIT1:
PUSH BC ; SAVE LOOP CONTROL
LD D,C ; PHYSICAL UNIT
; LD B,2 ; ALWAYS 2 ASCI UNITS ON Z180
; LD C,0 ; PHYSICAL UNIT INDEX
;ASCI_PREINIT1:
; PUSH BC ; SAVE LOOP CONTROL
; LD D,C ; PHYSICAL UNIT
; LD E,CIODEV_ASCI ; DEVICE TYPE
; LD BC,ASCI_FNTBL ; BC := FUNCTION TABLE ADDRESS
; CALL CIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED
; POP BC ; RESTORE LOOP CONTROL
; INC C ; NEXT PHYSICAL UNIT
; DJNZ ASCI_PREINIT1 ; LOOP UNTIL DONE
;
; ASCI0 CHANNEL
LD D,0 ; DEVICE ID
LD E,CIODEV_ASCI ; DEVICE TYPE LD E,CIODEV_ASCI ; DEVICE TYPE
LD BC,ASCI_DISPATCH ; BC := DISPATCH ADDRESS
CALL CIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED
POP BC ; RESTORE LOOP CONTROL
INC C ; NEXT PHYSICAL UNIT
DJNZ ASCI_PREINIT1 ; LOOP UNTIL DONE
;
LD BC,ASCI0_FNTBL ; ASCI0 FUNCTION TABLE PTR
CALL CIO_ADDENT
LD DE,-1 ; DE := -1 TO INIT DEFAULT CONFIG LD DE,-1 ; DE := -1 TO INIT DEFAULT CONFIG
CALL ASCI0_INITDEV ; INIT DEVICE CALL ASCI0_INITDEV ; INIT DEVICE
; ;
; ASCI1 CHANNEL
LD D,1 ; DEVICE ID
LD E,CIODEV_ASCI ; DEVICE TYPE
LD BC,ASCI1_FNTBL ; ASCI1 FUNCTION TABLE PTR
CALL CIO_ADDENT
LD DE,-1 ; DE := -1 TO INIT DEFAULT CONFIG LD DE,-1 ; DE := -1 TO INIT DEFAULT CONFIG
CALL ASCI1_INITDEV ; INIT DEVICE CALL ASCI1_INITDEV ; INIT DEVICE
; ;
@ -124,36 +134,19 @@ ASCI_INIT:
XOR A XOR A
RET RET
; ;
; DISPATCH TO SPECIFIC ASCI UNIT
;
ASCI_DISPATCH:
PUSH IY ; PUSH UNIT DATA WORD
POP AF ; POP TO AF, A := DEVICE NUM
OR A ; SET FLAGS
JP Z,ASCI0
DEC A
JP Z,ASCI1
CALL PANIC
;
; ASCI 0 FUNCTIONS
; DRIVER ASCI0 FUNCTION TABLE
; ;
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_FNTBL:
.DW ASCI0_IN
.DW ASCI0_OUT
.DW ASCI0_IST
.DW ASCI0_OST
.DW ASCI0_INITDEV
.DW ASCI0_QUERY
.DW ASCI0_DEVICE
#IF (($ - ASCI0_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID ASCI0 FUNCTION TABLE ***\n"
#ENDIF
; ;
ASCI0_IN: ASCI0_IN:
CALL ASCI0_IST CALL ASCI0_IST
@ -269,8 +262,19 @@ ASCI0_DEVICE:
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
; ;
; ASCI 1 FUNCTIONS
;
; DRIVER ASCI1 FUNCTION TABLE
;
ASCI1_FNTBL:
.DW ASCI1_IN
.DW ASCI1_OUT
.DW ASCI1_IST
.DW ASCI1_OST
.DW ASCI1_INITDEV
.DW ASCI1_QUERY
.DW ASCI1_DEVICE
#IF (($ - ASCI1_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID ASCI1 FUNCTION TABLE ***\n"
#ENDIF
ASCI1: ASCI1:
LD A,B ; GET REQUESTED FUNCTION LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION AND $0F ; ISOLATE SUB-FUNCTION

3
Source/HBIOS/cfg_mk4.asm

@ -8,13 +8,14 @@
CPUOSC .EQU 18432000 ; CPU OSC FREQ CPUOSC .EQU 18432000 ; CPU OSC FREQ
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE)
INTTYPE .EQU IT_Z180 ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
INTMODE .EQU 2 ; 0=NONE, 1=INT MODE 1, 2=INT MODE 2
; ;
CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
; ;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE) DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
; ;
HTIMENABLE .EQU FALSE ; TRUE FOR SIMH TIMER SUPPORT
SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER
DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER
DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC

3
Source/HBIOS/cfg_n8.asm

@ -8,13 +8,14 @@
CPUOSC .EQU 18432000 ; CPU OSC FREQ CPUOSC .EQU 18432000 ; CPU OSC FREQ
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE)
INTTYPE .EQU IT_Z180 ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
INTMODE .EQU 2 ; 0=NONE, 1=INT MODE 1, 2=INT MODE 2
; ;
CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
; ;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE) DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
; ;
HTIMENABLE .EQU FALSE ; TRUE FOR SIMH TIMER SUPPORT
SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER
DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER
DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC

3
Source/HBIOS/cfg_rc.asm

@ -8,13 +8,14 @@
CPUOSC .EQU 7372800 ; CPU OSC FREQ CPUOSC .EQU 7372800 ; CPU OSC FREQ
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE)
INTTYPE .EQU IT_RC ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
INTMODE .EQU 1 ; 0=NONE, 1=INT MODE 1, 2=INT MODE 2
; ;
CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
; ;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE) DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
; ;
HTIMENABLE .EQU FALSE ; TRUE FOR SIMH TIMER SUPPORT
SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER
DSRTCENABLE .EQU FALSE ; DS-1302 CLOCK DRIVER DSRTCENABLE .EQU FALSE ; DS-1302 CLOCK DRIVER
DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC

3
Source/HBIOS/cfg_sbc.asm

@ -8,13 +8,14 @@
CPUOSC .EQU 8000000 ; CPU OSC FREQ CPUOSC .EQU 8000000 ; CPU OSC FREQ
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE)
INTTYPE .EQU IT_NONE ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
INTMODE .EQU 0 ; 0=NONE, 1=INT MODE 1, 2=INT MODE 2
; ;
CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
; ;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE) DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
; ;
HTIMENABLE .EQU FALSE ; TRUE FOR SIMH TIMER SUPPORT
SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER
DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER
DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC

3
Source/HBIOS/cfg_zeta.asm

@ -8,13 +8,14 @@
CPUOSC .EQU 20000000 ; CPU OSC FREQ CPUOSC .EQU 20000000 ; CPU OSC FREQ
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!! RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE)
INTTYPE .EQU IT_NONE ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
INTMODE .EQU 0 ; 0=NONE, 1=INT MODE 1, 2=INT MODE 2
; ;
CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP
VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...) VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
; ;
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE) DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
; ;
HTIMENABLE .EQU FALSE ; TRUE FOR SIMH TIMER SUPPORT
SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER
DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER
DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC

2
Source/HBIOS/cfg_zeta2.asm

@ -7,6 +7,4 @@
; ;
#INCLUDE "cfg_zeta.asm" ; USE ZETA CONFIG TO START #INCLUDE "cfg_zeta.asm" ; USE ZETA CONFIG TO START
; ;
INTTYPE .SET IT_CTC ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
;
FDMODE .SET FDMODE_ZETA2 ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3 FDMODE .SET FDMODE_ZETA2 ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3

59
Source/HBIOS/cvdu.asm

@ -57,13 +57,13 @@ CVDU_INIT1:
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER
; ADD OURSELVES TO VDA DISPATCH TABLE ; ADD OURSELVES TO VDA DISPATCH TABLE
LD BC,CVDU_DISPATCH ; BC := DISPATCH ADDRESS
LD BC,CVDU_FNTBL ; BC := FUNCTION TABLE ADDRESS
LD DE,CVDU_IDAT ; DE := VGA INSTANCE DATA PTR LD DE,CVDU_IDAT ; DE := VGA INSTANCE DATA PTR
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
; INITIALIZE EMULATION ; INITIALIZE EMULATION
LD C,A ; C := ASSIGNED VIDEO DEVICE NUM LD C,A ; C := ASSIGNED VIDEO DEVICE NUM
LD DE,CVDU_DISPATCH ; DE := DISPATCH ADDRESS
LD DE,VGA_FNTBL ; DE := FUNCTION TABLE ADDRESS
LD HL,CVDU_IDAT ; HL := CVDU INSTANCE DATA PTR LD HL,CVDU_IDAT ; HL := CVDU INSTANCE DATA PTR
CALL TERM_ATTACH ; DO IT CALL TERM_ATTACH ; DO IT
@ -71,43 +71,28 @@ CVDU_INIT1:
RET RET
; ;
;====================================================================== ;======================================================================
; CVDU DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS
; CVDU DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS
;====================================================================== ;======================================================================
; ;
CVDU_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,CVDU_VDAINI ; $40
DEC A
JP Z,CVDU_VDAQRY ; $41
DEC A
JP Z,CVDU_VDARES ; $42
DEC A
JP Z,CVDU_VDADEV ; $43
DEC A
JP Z,CVDU_VDASCS ; $44
DEC A
JP Z,CVDU_VDASCP ; $45
DEC A
JP Z,CVDU_VDASAT ; $46
DEC A
JP Z,CVDU_VDASCO ; $47
DEC A
JP Z,CVDU_VDAWRC ; $48
DEC A
JP Z,CVDU_VDAFIL ; $49
DEC A
JP Z,CVDU_VDACPY ; $4A
DEC A
JP Z,CVDU_VDASCR ; $4B
DEC A
JP Z,KBD_STAT ; $4C
DEC A
JP Z,KBD_FLUSH ; $4D
DEC A
JP Z,KBD_READ ; $4E
CALL PANIC
CVDU_FNTBL:
.DW CVDU_VDAINI
.DW CVDU_VDAQRY
.DW CVDU_VDARES
.DW CVDU_VDADEV
.DW CVDU_VDASCS
.DW CVDU_VDASCP
.DW CVDU_VDASAT
.DW CVDU_VDASCO
.DW CVDU_VDAWRC
.DW CVDU_VDAFIL
.DW CVDU_VDACPY
.DW CVDU_VDASCR
.DW KBD_STAT
.DW KBD_FLUSH
.DW KBD_READ
#IF (($ - CVDU_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID CVDU FUNCTION TABLE ***\n"
#ENDIF
CVDU_VDAINI: CVDU_VDAINI:
; RESET VDA ; RESET VDA

731
Source/HBIOS/hbios.asm

File diff suppressed because it is too large

2
Source/HBIOS/hbios.inc

@ -69,11 +69,13 @@ BF_SYSPOKE .EQU BF_SYS + 11 ; SET A BYTE VALUE IN ALT BANK
BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT
BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT
BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT
BF_SYSGET_TIMER .EQU $D0 ; GET CURRENT TIMER VALUE
BF_SYSGET_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION BF_SYSGET_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION
BF_SYSGET_CPUINFO .EQU $F0 ; GET CPU INFORMATION BF_SYSGET_CPUINFO .EQU $F0 ; GET CPU INFORMATION
BF_SYSGET_MEMINFO .EQU $F1 ; GET MEMORY CAPACTITY INFO BF_SYSGET_MEMINFO .EQU $F1 ; GET MEMORY CAPACTITY INFO
BF_SYSGET_BNKINFO .EQU $F2 ; GET BANK ASSIGNMENT INFO BF_SYSGET_BNKINFO .EQU $F2 ; GET BANK ASSIGNMENT INFO
; ;
BF_SYSSET_TIMER .EQU $D0 ; SET TIMER VALUE
BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION
; ;
; SERIAL DEVICE IDS ; SERIAL DEVICE IDS

51
Source/HBIOS/ppp.asm

@ -247,43 +247,48 @@ PPP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD)
; PARPORTPROP CONSOLE DRIVER ; PARPORTPROP CONSOLE DRIVER
;================================================================================================== ;==================================================================================================
; ;
PPPCON_ROWS .EQU 37 ; PROPELLER VGA DISPLAY ROWS (40 - 3 STATUS LINES)
PPPCON_COLS .EQU 80 ; PROPELLER VGA DISPLAY COLS
;
PPPCON_INIT: PPPCON_INIT:
CALL NEWLINE CALL NEWLINE
PRTS("PPPCON:$") PRTS("PPPCON:$")
;
; DISPLAY CONSOLE DIMENSIONS
CALL PC_SPACE
LD A,PPPCON_COLS
CALL PRTDECB
LD A,'X'
CALL COUT
LD A,PPPCON_ROWS
CALL PRTDECB
CALL PRTSTRD
.TEXT " TEXT (ANSI)$"
; ;
; ADD OURSELVES TO CIO DISPATCH TABLE ; 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
LD D,0 ; PHYSICAL UNIT IS ZERO LD D,0 ; PHYSICAL UNIT IS ZERO
LD E,CIODEV_PPPCON ; DEVICE TYPE LD E,CIODEV_PPPCON ; DEVICE TYPE
LD BC,PPPCON_DISPATCH ; BC := DISPATCH ADDRESS
LD BC,PPPCON_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE
; ;
XOR A XOR A
RET RET
; ;
; DISPATCH FOR CONSOLE SUBFUNCTIONS
;
PPPCON_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,PPPCON_IN ; JUMP IF CHARACTER IN
DEC A ; NEXT SUBFUNCTION
JR Z,PPPCON_OUT ; JUMP IF CHARACTER OUT
DEC A ; NEXT SUBFUCNTION
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
; DRIVER FUNCTION TABLE
;
PPPCON_FNTBL:
.DW PPPCON_IN
.DW PPPCON_OUT
.DW PPPCON_IST
.DW PPPCON_OST
.DW PPPCON_INITDEV
.DW PPPCON_QUERY
.DW PPPCON_DEVICE
#IF (($ - PPPCON_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID PPPCON FUNCTION TABLE ***\n"
#ENDIF
; ;
; CHARACTER INPUT ; CHARACTER INPUT
; WAIT FOR A CHARACTER AND RETURN IT IN E ; WAIT FOR A CHARACTER AND RETURN IT IN E

53
Source/HBIOS/prp.asm

@ -118,46 +118,51 @@ PRPCON_ERR .EQU $40 ; BIT SET WHEN PROPIO CONSOLE ERROR HAS OCCURRED
PRPCON_KBDRDY .EQU $20 ; BIT SET WHEN KEYBOARD BUF HAS A BYTE READY (BUF FULL) PRPCON_KBDRDY .EQU $20 ; BIT SET WHEN KEYBOARD BUF HAS A BYTE READY (BUF FULL)
PRPCON_DSPRDY .EQU $10 ; BIT SET WHEN DISPLAY BUF IS READY FOR A BYTE (BUF EMPTY) PRPCON_DSPRDY .EQU $10 ; BIT SET WHEN DISPLAY BUF IS READY FOR A BYTE (BUF EMPTY)
; ;
PRPCON_ROWS .EQU 37 ; PROPELLER VGA DISPLAY ROWS (40 - 3 STATUS LINES)
PRPCON_COLS .EQU 80 ; PROPELLER VGA DISPLAY COLS
;
; ;
; ;
PRPCON_INIT: PRPCON_INIT:
; ;
CALL NEWLINE CALL NEWLINE
PRTS("PRPCON:$")
PRTS("PRPCON: $")
;
; DISPLAY CONSOLE DIMENSIONS
CALL PC_SPACE
LD A,PRPCON_COLS
CALL PRTDECB
LD A,'X'
CALL COUT
LD A,PRPCON_ROWS
CALL PRTDECB
CALL PRTSTRD
.TEXT " TEXT (ANSI)$"
; ;
; ADD OURSELVES TO CIO DISPATCH TABLE ; 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
LD D,0 ; PHYSICAL UNIT IS ZERO LD D,0 ; PHYSICAL UNIT IS ZERO
LD E,CIODEV_PRPCON ; DEVICE TYPE LD E,CIODEV_PRPCON ; DEVICE TYPE
LD BC,PRPCON_DISPATCH ; BC := DISPATCH ADDRESS
LD BC,PRPCON_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE
; ;
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
; ;
;
;
PRPCON_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,PRPCON_IN
DEC A
JR Z,PRPCON_OUT
DEC A
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
; DRIVER FUNCTION TABLE
;
PRPCON_FNTBL:
.DW PRPCON_IN
.DW PRPCON_OUT
.DW PRPCON_IST
.DW PRPCON_OST
.DW PRPCON_INITDEV
.DW PRPCON_QUERY
.DW PRPCON_DEVICE
#IF (($ - PRPCON_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID PRPCON FUNCTION TABLE ***\n"
#ENDIF
; ;
; ;
; ;

10
Source/HBIOS/romldr.asm

@ -11,7 +11,7 @@ MONIMG .EQU $1000
CPMIMG .EQU $2000 CPMIMG .EQU $2000
ZSYSIMG .EQU $5000 ZSYSIMG .EQU $5000
; ;
INT_IM1 .EQU $FF20
INT_IM1 .EQU $FF00
; ;
.ORG 0 .ORG 0
; ;
@ -38,9 +38,13 @@ INT_IM1 .EQU $FF20
RET ; RST 30 RET ; RST 30
.FILL (038H - $),0FFH .FILL (038H - $),0FFH
#IF (PLATFORM == PLT_UNA) #IF (PLATFORM == PLT_UNA)
RETI ; INT
RETI ; RETURN W/ INTS DISABLED
#ELSE #ELSE
JP INT_IM1 ; GO TO HBIOS IM1 INT HANDLER
#IF (INTMODE == 1)
JP INT_IM1 ; JP TO INTERRUPT HANDLER IN HI MEM
#ELSE
RETI ; RETURN W/ INTS DISABLED
#ENDIF
#ENDIF #ENDIF
.FILL (066H - $),0FFH .FILL (066H - $),0FFH
RETN ; NMI RETN ; NMI

40
Source/HBIOS/sio.asm

@ -59,7 +59,7 @@ SIO_PREINIT0:
JR Z,SIO_PREINIT2 ; SKIP IT IF NOTHING FOUND JR Z,SIO_PREINIT2 ; SKIP IT IF NOTHING FOUND
; ;
PUSH BC ; SAVE LOOP CONTROL PUSH BC ; SAVE LOOP CONTROL
LD BC,SIO_DISPATCH ; BC := DISPATCH ADDRESS
LD BC,SIO_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL NZ,CIO_ADDENT ; ADD ENTRY IF SIO FOUND, BC:DE CALL NZ,CIO_ADDENT ; ADD ENTRY IF SIO FOUND, BC:DE
POP BC ; RESTORE LOOP CONTROL POP BC ; RESTORE LOOP CONTROL
; ;
@ -67,12 +67,20 @@ SIO_PREINIT2:
INC C ; NEXT PHYSICAL UNIT INC C ; NEXT PHYSICAL UNIT
DJNZ SIO_PREINIT0 ; LOOP UNTIL DONE DJNZ SIO_PREINIT0 ; LOOP UNTIL DONE
; ;
#IF (INTMODE == 1)
; ADD IM1 INT CALL LIST ENTRY IF APPROPRIATE ; ADD IM1 INT CALL LIST ENTRY IF APPROPRIATE
LD A,(SIO_DEV) ; GET NEXT DEVICE NUM LD A,(SIO_DEV) ; GET NEXT DEVICE NUM
OR A ; SET FLAGS OR A ; SET FLAGS
JR Z,SIO_PREINIT3 ; IF ZERO, NO SIO DEVICES JR Z,SIO_PREINIT3 ; IF ZERO, NO SIO DEVICES
LD HL,SIO_INT ; GET INT VECTOR LD HL,SIO_INT ; GET INT VECTOR
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST
#ENDIF
;
#IF (INTMODE == 2)
; SETUP SIO INTERRUPT VECTOR IN IVT
LD HL,INT_SIO
LD (HBX_IVT + IVT_SER0),HL
#ENDIF
; ;
SIO_PREINIT3: SIO_PREINIT3:
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
@ -215,24 +223,9 @@ SIOB_INT1:
OR $FF ; NZ SET TO INDICATE INT HANDLED OR $FF ; NZ SET TO INDICATE INT HANDLED
RET ; AND RETURN RET ; AND RETURN
; ;
; DRIVER FUNCTION TABLE
; ;
;
SIO_DISPATCH:
; DISPATCH TO FUNCTION HANDLER
PUSH HL ; SAVE HL FOR NOW
LD A,B ; GET FUNCTION
AND $0F ; ISOLATE LOW NIBBLE
RLCA ; X 2 FOR WORD OFFSET INTO FUNCTION TABLE
LD HL,SIO_FTBL ; START OF FUNC TABLE
CALL ADDHLA ; HL := ADDRESS OF ADDRESS OF FUNCTION
LD A,(HL) ; DEREF HL
INC HL ; ...
LD H,(HL) ; ...
LD L,A ; ... TO GET ADDRESS OF FUNCTION
EX (SP),HL ; RESTORE HL & PUT FUNC ADDRESS -> (SP)
RET ; EFFECTIVELY A JP TO TGT ADDRESS
SIO_FTBL:
SIO_FNTBL:
.DW SIO_IN .DW SIO_IN
.DW SIO_OUT .DW SIO_OUT
.DW SIO_IST .DW SIO_IST
@ -240,6 +233,9 @@ SIO_FTBL:
.DW SIO_INITDEV .DW SIO_INITDEV
.DW SIO_QUERY .DW SIO_QUERY
.DW SIO_DEVICE .DW SIO_DEVICE
#IF (($ - SIO_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID SIO FUNCTION TABLE ***\n"
#ENDIF
; ;
; ;
; ;
@ -255,7 +251,7 @@ SIO_IN:
SIOA_IN: SIOA_IN:
CALL SIOA_IST ; RECEIVED CHAR READY? CALL SIOA_IST ; RECEIVED CHAR READY?
JR Z,SIOA_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER JR Z,SIOA_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER
DI ; AVOID COLLISION WITH INT HANDLER
HB_DI ; AVOID COLLISION WITH INT HANDLER
LD A,(SIOA_CNT) ; GET COUNT LD A,(SIOA_CNT) ; GET COUNT
DEC A ; DECREMENT COUNT DEC A ; DECREMENT COUNT
LD (SIOA_CNT),A ; SAVE SAVE IT LD (SIOA_CNT),A ; SAVE SAVE IT
@ -275,14 +271,14 @@ SIOA_IN0:
LD HL,SIOA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER LD HL,SIOA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER
SIOA_IN1: SIOA_IN1:
LD (SIOA_TL),HL ; SAVE UPDATED TAIL POINTER LD (SIOA_TL),HL ; SAVE UPDATED TAIL POINTER
EI ; INTERRUPTS OK AGAIN
HB_EI ; INTERRUPTS OK AGAIN
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; AND DONE RET ; AND DONE
; ;
SIOB_IN: SIOB_IN:
CALL SIOB_IST ; RECEIVED CHAR READY? CALL SIOB_IST ; RECEIVED CHAR READY?
JR Z,SIOB_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER JR Z,SIOB_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER
DI ; AVOID COLLISION WITH INT HANDLER
HB_DI ; AVOID COLLISION WITH INT HANDLER
LD A,(SIOB_CNT) ; GET COUNT LD A,(SIOB_CNT) ; GET COUNT
DEC A ; DECREMENT COUNT DEC A ; DECREMENT COUNT
LD (SIOB_CNT),A ; SAVE SAVE IT LD (SIOB_CNT),A ; SAVE SAVE IT
@ -302,7 +298,7 @@ SIOB_IN0:
LD HL,SIOB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER LD HL,SIOB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER
SIOB_IN1: SIOB_IN1:
LD (SIOB_TL),HL ; SAVE UPDATED TAIL POINTER LD (SIOB_TL),HL ; SAVE UPDATED TAIL POINTER
EI ; INTERRUPTS OK AGAIN
HB_EI ; INTERRUPTS OK AGAIN
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; AND DONE RET ; AND DONE
; ;

13
Source/HBIOS/std.asm

@ -35,11 +35,6 @@ PLT_MK4 .EQU 5 ; MARK IV
PLT_UNA .EQU 6 ; UNA BIOS PLT_UNA .EQU 6 ; UNA BIOS
PLT_RC .EQU 7 ; RC2014 PLT_RC .EQU 7 ; RC2014
; ;
; FOUNCTION GROUP FUNCTION COUNTS
;
CIO_FNCNT .EQU 7
DIO_FNCNT .EQU 12
;
#IF (PLATFORM != PLT_UNA) #IF (PLATFORM != PLT_UNA)
#INCLUDE "hbios.inc" #INCLUDE "hbios.inc"
#ENDIF #ENDIF
@ -173,14 +168,6 @@ SER_115200_8N1 .EQU SER_BAUD115200 | SER_DATA8 | SER_PARNONE | SER_STOP1
SER_230400_8N1 .EQU SER_BAUD230400 | SER_DATA8 | SER_PARNONE | SER_STOP1 SER_230400_8N1 .EQU SER_BAUD230400 | SER_DATA8 | SER_PARNONE | SER_STOP1
SER_460800_8N1 .EQU SER_BAUD460800 | SER_DATA8 | SER_PARNONE | SER_STOP1 SER_460800_8N1 .EQU SER_BAUD460800 | SER_DATA8 | SER_PARNONE | SER_STOP1
; ;
; INTERRUPT TYPE OPTIONS
;
IT_NONE .EQU 0
IT_SIMH .EQU 1
IT_Z180 .EQU 2
IT_CTC .EQU 3
IT_RC .EQU 4
;
; INTERRUPT VECTOR TABLE ENTRY OFFSETS (Z180 COMPATIBLE) ; INTERRUPT VECTOR TABLE ENTRY OFFSETS (Z180 COMPATIBLE)
; ;
IVT_INT1 .EQU 0 IVT_INT1 .EQU 0

10
Source/HBIOS/term.asm

@ -37,20 +37,20 @@ TERM_ATTACH:
LD B,A ; PUT IT IN B LD B,A ; PUT IT IN B
PUSH HL ; SAVE VDA INSTANCE DATA PTR PUSH HL ; SAVE VDA INSTANCE DATA PTR
; ;
; SETUP EMULATOR MODULE DISPATCH ADDRESS BASED ON DESIRED EMULATION
; EMULATOR PASSES BACK IT'S DISPATCH ADDRESS IN DE
; SETUP EMULATOR MODULE FUNC TBL ADDRESS BASED ON DESIRED EMULATION
; EMULATOR PASSES BACK IT'S FUNC TBL ADDRESS IN DE
OR $FF ; PRESET FAILURE OR $FF ; PRESET FAILURE
#IF (VDAEMU == EMUTYP_TTY) #IF (VDAEMU == EMUTYP_TTY)
CALL TTY_INIT ; INIT TTY, DE := TTY_DISPATCH
CALL TTY_INIT ; INIT TTY, DE := TTY_FNTBL
#ENDIF #ENDIF
#IF (VDAEMU == EMUTYP_ANSI) #IF (VDAEMU == EMUTYP_ANSI)
CALL ANSI_INIT ; INIT ANSI, DE := ANSI_DISPATCH
CALL ANSI_INIT ; INIT ANSI, DE := ANSI_FNTBL
#ENDIF #ENDIF
POP HL ; RECOVER VDA INSTANCE DATA PTR POP HL ; RECOVER VDA INSTANCE DATA PTR
RET NZ ; BAIL OUT ON ERROR RET NZ ; BAIL OUT ON ERROR
; ;
; ADD OURSELVES TO CIO DISPATCH TABLE ; ADD OURSELVES TO CIO DISPATCH TABLE
PUSH DE ; COPY EMULATOR DISPATCH ADDRESS
PUSH DE ; COPY EMULATOR FUNC TBL ADDRESS
POP BC ; ... TO BC POP BC ; ... TO BC
PUSH HL ; COPY VDA INSTANCE DATA PTR PUSH HL ; COPY VDA INSTANCE DATA PTR
POP DE ; ... TO DE POP DE ; ... TO DE

75
Source/HBIOS/tms.asm

@ -88,13 +88,13 @@ TMS_INIT1:
#ENDIF #ENDIF
; ;
; ADD OURSELVES TO VDA DISPATCH TABLE ; ADD OURSELVES TO VDA DISPATCH TABLE
LD BC,TMS_DISPATCH ; BC := DISPATCH ADDRESS
LD BC,TMS_FNTBL ; BC := FUNCTION TABLE ADDRESS
LD DE,TMS_IDAT ; DE := TMS INSTANCE DATA PTR LD DE,TMS_IDAT ; DE := TMS INSTANCE DATA PTR
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
; ;
; INITIALIZE EMULATION ; INITIALIZE EMULATION
LD C,A ; C := ASSIGNED VIDEO DEVICE NUM LD C,A ; C := ASSIGNED VIDEO DEVICE NUM
LD DE,TMS_DISPATCH ; DE := DISPATCH ADDRESS
LD DE,TMS_FNTBL ; DE := FUNCTION TABLE ADDRESS
LD HL,TMS_IDAT ; HL := TMS INSTANCE DATA PTR LD HL,TMS_IDAT ; HL := TMS INSTANCE DATA PTR
CALL TERM_ATTACH ; DO IT CALL TERM_ATTACH ; DO IT
; ;
@ -102,59 +102,34 @@ TMS_INIT1:
RET RET
; ;
;====================================================================== ;======================================================================
; TMS DRIVER - CHARACTER I/O (CIO) DISPATCHER AND FUNCTIONS
; TMS DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS
;====================================================================== ;======================================================================
; ;
TMS_DISPCIO:
JP PANIC
TMS_CIODISPADR .EQU $ - 2
;
;======================================================================
; TMS DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS
;======================================================================
;
TMS_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,TMS_VDAINI ; $40
DEC A
JP Z,TMS_VDAQRY ; $41
DEC A
JP Z,TMS_VDARES ; $42
DEC A
JP Z,TMS_VDADEV ; $43
DEC A
JP Z,TMS_VDASCS ; $44
DEC A
JP Z,TMS_VDASCP ; $45
DEC A
JP Z,TMS_VDASAT ; $46
DEC A
JP Z,TMS_VDASCO ; $47
DEC A
JP Z,TMS_VDAWRC ; $48
DEC A
JP Z,TMS_VDAFIL ; $49
DEC A
JP Z,TMS_VDACPY ; $4A
DEC A
JP Z,TMS_VDASCR ; $4B
DEC A
TMS_FNTBL:
.DW TMS_VDAINI
.DW TMS_VDAQRY
.DW TMS_VDARES
.DW TMS_VDADEV
.DW TMS_VDASCS
.DW TMS_VDASCP
.DW TMS_VDASAT
.DW TMS_VDASCO
.DW TMS_VDAWRC
.DW TMS_VDAFIL
.DW TMS_VDACPY
.DW TMS_VDASCR
#IF (PLATFORM == PLT_N8) #IF (PLATFORM == PLT_N8)
JP Z,PPK_STAT ; $4C
DEC A
JP Z,PPK_FLUSH ; $4D
DEC A
JP Z,PPK_READ ; $4E
.DW PPK_STAT
.DW PPK_FLUSH
.DW PPK_READ
#ELSE #ELSE
JP Z,TMS_STAT ; $4C
DEC A
JP Z,TMS_FLUSH ; $4D
DEC A
JP Z,TMS_READ ; $4E
.DW TMS_STAT
.DW TMS_FLUSH
.DW TMS_READ
#ENDIF
#IF (($ - TMS_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID TMS FUNCTION TABLE ***\n"
#ENDIF #ENDIF
CALL PANIC
TMS_VDAINI: TMS_VDAINI:
; RESET VDA ; RESET VDA

57
Source/HBIOS/tty.asm

@ -11,7 +11,7 @@
; C: CIO UNIT NUMBER OF CALLING VDA DRIVER ; C: CIO UNIT NUMBER OF CALLING VDA DRIVER
; DE: DISPATCH ADDRESS OF CALLING VDA DRIVER ; DE: DISPATCH ADDRESS OF CALLING VDA DRIVER
; RETURNS: ; RETURNS:
; DE: OUR CIO DISPATCH ADDRESS
; DE: OUR CIO FUNC TBL ADDRESS
; ;
TTY_INIT: TTY_INIT:
; PREVENT ATTEMPTS TO INIT MULTIPLE INSTANCES FOR NOW ; PREVENT ATTEMPTS TO INIT MULTIPLE INSTANCES FOR NOW
@ -24,13 +24,13 @@ TTY_INIT:
LD (TTY_DEVNUM),A ; SAVE IT LD (TTY_DEVNUM),A ; SAVE IT
LD A,C ; VDA UNIT NUMBER PASSED IN C LD A,C ; VDA UNIT NUMBER PASSED IN C
LD (TTY_VDAUNIT),A ; SAVE IT LD (TTY_VDAUNIT),A ; SAVE IT
LD (TTY_VDADISPADR),DE ; RECORD VDA DISPATCH ADDRESS
;LD (TTY_VDADISPADR),DE ; RECORD VDA DISPATCH ADDRESS
; ;
; INIT/RESET OUR INTERNAL STATE ; INIT/RESET OUR INTERNAL STATE
CALL TTY_RESET ; FULL RESET OF EMULATOR INTERNAL STATE CALL TTY_RESET ; FULL RESET OF EMULATOR INTERNAL STATE
RET NZ ; BAIL OUT ON ERROR RET NZ ; BAIL OUT ON ERROR
; ;
LD DE,TTY_DISPATCH ; RETURN OUR DISPATCH ADDRESS
LD DE,TTY_FNTBL ; RETURN OUR FUNC TBL ADDRESS
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; RETURN RET ; RETURN
; ;
@ -50,58 +50,55 @@ TTY_RESET:
; ;
; ;
TTY_VDADISP: TTY_VDADISP:
JP PANIC
TTY_VDADISPADR .EQU $ - 2
; JP PANIC
;TTY_VDADISPADR .EQU $ - 2
LD A,(TTY_VDAUNIT)
LD C,A
JP VDA_DISPATCH
; ;
; FUNCTION TABLE
; ;
TTY_FNTBL:
.DW TTY_IN
.DW TTY_OUT
.DW TTY_IST
.DW TTY_OST
.DW TTY_INITDEV
.DW TTY_QUERY
.DW TTY_DEVICE
#IF (($ - TTY_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID TTY FUNCTION TABLE ***\n"
#ENDIF
; ;
TTY_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,TTY_CIOIN ; $30
DEC A
JR Z,TTY_CIOOUT ; $31
DEC A
JR Z,TTY_CIOIST ; $32
DEC A
JR Z,TTY_CIOOST ; $33
DEC A
JR Z,TTY_CIOINIT ; $34
DEC A
JR Z,TTY_CIOQUERY ; $35
DEC A
JR Z,TTY_CIODEVICE ; $36
CALL PANIC
; ;
; ;
;
TTY_CIOIN:
TTY_IN:
LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ
JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER
; ;
; ;
; ;
TTY_CIOOUT:
TTY_OUT:
CALL TTY_DOCHAR ; HANDLE THE CHARACTER (EMULATION ENGINE) CALL TTY_DOCHAR ; HANDLE THE CHARACTER (EMULATION ENGINE)
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
; ;
; ;
; ;
TTY_CIOIST:
TTY_IST:
LD B,BF_VDAKST ; SET FUNCTION TO KEYBOARD STATUS LD B,BF_VDAKST ; SET FUNCTION TO KEYBOARD STATUS
JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER JP TTY_VDADISP ; CHAIN TO VDA DISPATCHER
; ;
; ;
; ;
TTY_CIOOST:
TTY_OST:
XOR A ; ZERO ACCUM XOR A ; ZERO ACCUM
INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY INC A ; A := $FF TO SIGNAL OUTPUT BUFFER READY
RET RET
; ;
; ;
; ;
TTY_CIOINIT:
TTY_INITDEV:
; RESET THE ATTACHED VDA DEVICE ; RESET THE ATTACHED VDA DEVICE
LD B,BF_VDAINI ; FUNC: INIT LD B,BF_VDAINI ; FUNC: INIT
LD E,-1 ; DO NOT CHANGE VIDEO MODE LD E,-1 ; DO NOT CHANGE VIDEO MODE
@ -112,7 +109,7 @@ TTY_CIOINIT:
; ;
; ;
; ;
TTY_CIOQUERY:
TTY_QUERY:
LD DE,$FFFF LD DE,$FFFF
LD HL,$FFFF LD HL,$FFFF
XOR A XOR A
@ -120,7 +117,7 @@ TTY_CIOQUERY:
; ;
; ;
; ;
TTY_CIODEVICE:
TTY_DEVICE:
LD D,CIODEV_TERM ; TYPE IS TERMINAL LD D,CIODEV_TERM ; TYPE IS TERMINAL
LD A,(TTY_DEVNUM) ; GET DEVICE NUMBER LD A,(TTY_DEVNUM) ; GET DEVICE NUMBER
LD E,A ; PUT IT IN E LD E,A ; PUT IT IN E

24
Source/HBIOS/uart.asm

@ -85,7 +85,7 @@ UART_PREINIT0:
JR Z,UART_PREINIT2 ; SKIP IT IF NOTHING FOUND JR Z,UART_PREINIT2 ; SKIP IT IF NOTHING FOUND
; ;
PUSH BC ; SAVE LOOP CONTROL PUSH BC ; SAVE LOOP CONTROL
LD BC,UART_DISPATCH ; BC := DISPATCH ADDRESS
LD BC,UART_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL NZ,CIO_ADDENT ; ADD ENTRY IF UART FOUND, BC:DE CALL NZ,CIO_ADDENT ; ADD ENTRY IF UART FOUND, BC:DE
POP BC ; RESTORE LOOP CONTROL POP BC ; RESTORE LOOP CONTROL
; ;
@ -142,24 +142,9 @@ UART_INIT1:
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; DONE RET ; DONE
; ;
; DRIVER FUNCTION TABLE
; ;
;
UART_DISPATCH:
; DISPATCH TO FUNCTION HANDLER
PUSH HL ; SAVE HL FOR NOW
LD A,B ; GET FUNCTION
AND $0F ; ISOLATE LOW NIBBLE
RLCA ; X 2 FOR WORD OFFSET INTO FUNCTION TABLE
LD HL,UART_FTBL ; START OF FUNC TABLE
CALL ADDHLA ; HL := ADDRESS OF ADDRESS OF FUNCTION
LD A,(HL) ; DEREF HL
INC HL ; ...
LD H,(HL) ; ...
LD L,A ; ... TO GET ADDRESS OF FUNCTION
EX (SP),HL ; RESTORE HL & PUT FUNC ADDRESS -> (SP)
RET ; EFFECTIVELY A JP TO TGT ADDRESS
UART_FTBL:
UART_FNTBL:
.DW UART_IN .DW UART_IN
.DW UART_OUT .DW UART_OUT
.DW UART_IST .DW UART_IST
@ -167,6 +152,9 @@ UART_FTBL:
.DW UART_INITDEV .DW UART_INITDEV
.DW UART_QUERY .DW UART_QUERY
.DW UART_DEVICE .DW UART_DEVICE
#IF (($ - UART_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID UART FUNCTION TABLE ***\n"
#ENDIF
; ;
; ;
; ;

59
Source/HBIOS/vdu.asm

@ -56,13 +56,13 @@ VDU_INIT1:
CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER
; ;
; ADD OURSELVES TO VDA DISPATCH TABLE ; ADD OURSELVES TO VDA DISPATCH TABLE
LD BC,VDU_DISPATCH ; BC := DISPATCH ADDRESS
LD BC,VDU_FNTBL ; BC := FUNCTION TABLE ADDRESS
LD DE,VDU_IDAT ; DE := VDU INSTANCE DATA PTR LD DE,VDU_IDAT ; DE := VDU INSTANCE DATA PTR
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
; ;
; INITIALIZE EMULATION ; INITIALIZE EMULATION
LD C,A ; ASSIGNED VIDEO UNIT IN C LD C,A ; ASSIGNED VIDEO UNIT IN C
LD DE,VDU_DISPATCH ; DE := DISPATCH ADDRESS
LD DE,VDU_FNTBL ; DE := FUNCTION TABLE ADDRESS
LD HL,VDU_IDAT ; HL := VDU INSTANCE DATA PTR LD HL,VDU_IDAT ; HL := VDU INSTANCE DATA PTR
CALL TERM_ATTACH ; DO IT CALL TERM_ATTACH ; DO IT
@ -70,43 +70,28 @@ VDU_INIT1:
RET RET
; ;
;====================================================================== ;======================================================================
; VDU DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS
; VDU DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS
;====================================================================== ;======================================================================
; ;
VDU_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,VDU_VDAINI ; $40
DEC A
JR Z,VDU_VDAQRY ; $41
DEC A
JR Z,VDU_VDARES ; $42
DEC A
JR Z,VDU_VDADEV ; $43
DEC A
JR Z,VDU_VDASCS ; $44
DEC A
JR Z,VDU_VDASCP ; $45
DEC A
JR Z,VDU_VDASAT ; $46
DEC A
JR Z,VDU_VDASCO ; $47
DEC A
JR Z,VDU_VDAWRC ; $48
DEC A
JR Z,VDU_VDAFIL ; $49
DEC A
JR Z,VDU_VDACPY ; $4A
DEC A
JR Z,VDU_VDASCR ; $4B
DEC A
JP Z,PPK_STAT ; $4C
DEC A
JP Z,PPK_FLUSH ; $4D
DEC A
JP Z,PPK_READ ; $4E
CALL PANIC
VDU_FNTBL:
.DW VDU_VDAINI
.DW VDU_VDAQRY
.DW VDU_VDARES
.DW VDU_VDADEV
.DW VDU_VDASCS
.DW VDU_VDASCP
.DW VDU_VDASAT
.DW VDU_VDASCO
.DW VDU_VDAWRC
.DW VDU_VDAFIL
.DW VDU_VDACPY
.DW VDU_VDASCR
.DW PPK_STAT
.DW PPK_FLUSH
.DW PPK_READ
#IF (($ - VDU_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID VDU FUNCTION TABLE ***\n"
#ENDIF
VDU_VDAINI: VDU_VDAINI:
; RESET VDA ; RESET VDA

59
Source/HBIOS/vga.asm

@ -73,13 +73,13 @@ VGA_INIT1:
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER
; ADD OURSELVES TO VDA DISPATCH TABLE ; ADD OURSELVES TO VDA DISPATCH TABLE
LD BC,VGA_DISPATCH ; BC := DISPATCH ADDRESS
LD BC,VGA_FNTBL ; BC := FUNCTION TABLE ADDRESS
LD DE,VGA_IDAT ; DE := VGA INSTANCE DATA PTR LD DE,VGA_IDAT ; DE := VGA INSTANCE DATA PTR
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
; INITIALIZE EMULATION ; INITIALIZE EMULATION
LD C,A ; C := ASSIGNED VIDEO DEVICE NUM LD C,A ; C := ASSIGNED VIDEO DEVICE NUM
LD DE,VGA_DISPATCH ; DE := DISPATCH ADDRESS
LD DE,VGA_FNTBL ; DE := FUNCTION TABLE ADDRESS
LD HL,VGA_IDAT ; HL := VGA INSTANCE DATA PTR LD HL,VGA_IDAT ; HL := VGA INSTANCE DATA PTR
CALL TERM_ATTACH ; DO IT CALL TERM_ATTACH ; DO IT
@ -87,43 +87,28 @@ VGA_INIT1:
RET RET
; ;
;====================================================================== ;======================================================================
; VGA DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS
; VGA DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS
;====================================================================== ;======================================================================
; ;
VGA_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,VGA_VDAINI ; $40
DEC A
JP Z,VGA_VDAQRY ; $41
DEC A
JP Z,VGA_VDARES ; $42
DEC A
JP Z,VGA_VDADEV ; $43
DEC A
JP Z,VGA_VDASCS ; $44
DEC A
JP Z,VGA_VDASCP ; $45
DEC A
JP Z,VGA_VDASAT ; $46
DEC A
JP Z,VGA_VDASCO ; $47
DEC A
JP Z,VGA_VDAWRC ; $48
DEC A
JP Z,VGA_VDAFIL ; $49
DEC A
JP Z,VGA_VDACPY ; $4A
DEC A
JP Z,VGA_VDASCR ; $4B
DEC A
JP Z,KBD_STAT ; $4C
DEC A
JP Z,KBD_FLUSH ; $4D
DEC A
JP Z,KBD_READ ; $4E
CALL PANIC
VGA_FNTBL:
.DW VGA_VDAINI
.DW VGA_VDAQRY
.DW VGA_VDARES
.DW VGA_VDADEV
.DW VGA_VDASCS
.DW VGA_VDASCP
.DW VGA_VDASAT
.DW VGA_VDASCO
.DW VGA_VDAWRC
.DW VGA_VDAFIL
.DW VGA_VDACPY
.DW VGA_VDASCR
.DW KBD_STAT
.DW KBD_FLUSH
.DW KBD_READ
#IF (($ - VGA_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID VGA FUNCTION TABLE ***\n"
#ENDIF
VGA_VDAINI: VGA_VDAINI:
; RESET VDA ; RESET VDA

BIN
Source/Images/hd0/s1/u0/pmarc.com

Binary file not shown.

BIN
Source/Images/hd0/s1/u0/pmext.com

Binary file not shown.
Loading…
Cancel
Save