Browse Source

Finalize v2.8.6 Prerelease 0

Adds ACIA support
Adds IM1 interrupt chaining
Fixes IDE SETFEAT issue
pull/3/head
Wayne Warthen 8 years ago
parent
commit
9635d5933e
  1. 3
      Source/Apps/Build.cmd
  2. 2
      Source/Apps/Clean.cmd
  3. 723
      Source/Apps/Survey.asm
  4. 2
      Source/Build.cmd
  5. 2
      Source/CBIOS/ver.inc
  6. 2
      Source/HBIOS/Config/RC_std.asm
  7. 531
      Source/HBIOS/acia.asm
  8. 3
      Source/HBIOS/cfg_mk4.asm
  9. 3
      Source/HBIOS/cfg_n8.asm
  10. 1
      Source/HBIOS/cfg_rc.asm
  11. 4
      Source/HBIOS/cfg_sbc.asm
  12. 3
      Source/HBIOS/cfg_zeta.asm
  13. 183
      Source/HBIOS/hbios.asm
  14. 1
      Source/HBIOS/hbios.inc
  15. 6
      Source/HBIOS/ide.asm
  16. 151
      Source/HBIOS/romldr.asm
  17. 116
      Source/HBIOS/sio.asm
  18. 12
      Source/HBIOS/std.asm
  19. 2
      Source/HBIOS/ver.inc
  20. 10
      Source/HBIOS/z180.inc
  21. BIN
      Source/RomDsk/ROM_1024KB/SURVEY.COM
  22. BIN
      Source/RomDsk/ROM_512KB/SURVEY.COM

3
Source/Apps/Build.cmd

@ -20,6 +20,9 @@ call :asm Mode || goto :eof
zx Z80ASM -SYSGEN/F
zx MAC SURVEY.ASM -$PO
zx MLOAD25 -SURVEY.COM=SURVEY.HEX
setlocal & cd XM && call Build || exit /b 1 & endlocal
setlocal & cd FDU && call Build || exit /b 1 & endlocal

2
Source/Apps/Clean.cmd

@ -4,6 +4,8 @@ setlocal
if exist *.bin del *.bin
if exist *.com del *.com
if exist *.lst del *.lst
if exist *.hex del *.hex
if exist *.prn del *.prn
setlocal & cd XM && call Clean || exit /b 1 & endlocal
setlocal & cd FDU && call Clean || exit /b 1 & endlocal

723
Source/Apps/Survey.asm

@ -0,0 +1,723 @@
;***************************************;
; ;
; S U R V E Y ;
; ;
;***************************************;
;By Michael Friese 9/22/79
;* Lists Kbytes used and remaining plus number of files
; on all logged disks (up to 8)
;* Prints Memory map and synopsis of all machine memory
;* Lists all active I/O Ports
;* Uses disk allocation block for all disk calculations
;
;VERSION LIST - Most recent version first.
;
;06/Jul/82 - Added Godbout DISK 1 equate and added SKIP equate
; Bill Bolton - Software Tools, Australia
;
;01/Jun/82 - Tidied up and fixed port display, added display
; of contents of low memory. David Bennett - Alfred
; Hospital, Australia
;
;29/Jun/80 - Added version number test and calculations for CP/M
; version 2 compatibility. This program should now work
; properly on all versions 1.4 and later. BRR
;
;28/Jun/80 - Added IMS400 equate (prevents Industrial Micro Systems
; controller from hanging up during port scan). BRR
;
;24/Jun/80 - Removed MACLIB statement, included required macros
; in source. Bruce R. Ratoff
;
;*******************************;
; SYSTEM MACROS ;
;*******************************;
;Increments 16 bit memory location X
INXI MACRO X
LOCAL JUST8
PUSH H
LXI H,X
INR M
JNZ JUST8
INX H
INR M
JUST8:
POP H
ENDM
;..............................................................
;
; SAVE MACRO SAVE SPECIFIED REGISTERS
;
; SAVE R1,R2,R3,R4
;
; R1-R4 MAY BE B,D,H OR PSW SAVED IN ORDER SPECIFIED
; IF REGS ARE OMITTED SAVE B,D AND H
;
SAVE MACRO R1,R2,R3,R4
IF NOT NUL R1&R2&R3&R4
IRP R,<<R1>,<R2>,<R3>,<R4>>
IF NUL R
EXITM
ENDIF
PUSH R
ENDM
ELSE
IRPC REG,BDH
PUSH REG
ENDM
ENDIF
ENDM
;
; . . . . . . . . . . . . . . . . . . . . . . . . . . . .
;
; RESTORE MACRO RESTORE REGISTERS (INVERSE OF SAVE)
;
; RESTORE R1,R2,R3,R4
;
; R1-R4 MAY BE B,D,H OR PSW RESTORED IN ORDER SPECIFIED
; IF REGS OMITTED RESTORE H,D AND B
;
RESTORE MACRO R1,R2,R3,R4
IF NOT NUL R1&R2&R3&R4
IRP R,<<R1>,<R2>,<R3>,<R4>>
IF NUL R
EXITM
ENDIF
POP R
ENDM
ELSE
IRPC REG,HDB
POP REG
ENDM
ENDIF
ENDM
;
;..............................................................
;
; CHAROUT MACRO CONSOLE OUTPUT FROM A
;
; CHAROUT ADDR
;
CHAROUT MACRO ADDR
IF NOT NUL ADDR
LDA ADDR
ENDIF
MVI C,2 ;;CONOUT
MOV E,A ;;CHAR TO E
CALL 5 ;;CALL BDOS
ENDM
;
;
;.............................................................
;
; DECOUT MACRO CONVERT A POSITIVE INTEGER TO DECIMAL AND OUTPUT
; TO THE CONSOLE.
;
; DECOUT ADDR
;
; IF ADDR OMITTED, NUMBER ASSUMED TO BE IN HL, ELSE LOADED TO HL
; LEADING ZEROS SUPRESSED. MAXIMUM NUMBER 65,767
;
DECOUT MACRO ADDR
LOCAL ENDDEC,DX
JMP ENDDEC
@DECOUT:
SAVE ;;PUSH STACK
LXI B,-10 ;;RADIX FOR CONVERSION
LXI D,-1 ;;THIS BECOMES NO DIVIDED BY RADIX
DX:
DAD B ;;SUBTRACT 10
INX D
JC DX
LXI B,10
DAD B ;;ADD RADIX BACK IN ONCE
XCHG
MOV A,H
ORA L ;;TEST FOR ZERO
CNZ @DECOUT ;;RECURSIVE CALL
MOV A,E
ADI '0' ;;CONVERT FROM BCD TO HEX
MOV E,A ;;TO E FOR OUTPUT
CHAROUT ;;CONSOLE OUTPUT
RESTORE ;;POP STACK
RET
ENDDEC:
DECOUT MACRO ?ADDR
IF NOT NUL ?ADDR
LHLD ?ADDR
ENDIF
CALL @DECOUT ;;CALL THE SUBROUTINE
ENDM
DECOUT ADDR
ENDM
;
;
;..............................................................
;
; HEXOUT MACRO CONVERT BINARY NO AND OUTPUT TO CONSOLE
;
; HEXOUT ADDR
;
; NUMBER ASSUMED IN A IF NO ARGUMENT
;
HEXOUT MACRO ADDR
LOCAL OUTCHR,HEXEND
JMP HEXEND
HEXPRN:
SAVE PSW
RRC
RRC
RRC
RRC ;;SHIFT RIGHT 4
CALL OUTCHR
RESTORE PSW
OUTCHR:
ANI 0FH ;;MASK 4 BITS
ADI 90H ;;ADD OFFSET
DAA ;;DEC ADJUST
ACI 40H ;;ADD OFFSET
DAA ;;DEC ADJUST
MOV E,A ;;TO E FOR OUTPUT
MVI C,2 ;;CONOUT
JMP 5 ;;CALL BDOS
HEXEND:
HEXOUT MACRO ?ADDR
IF NOT NUL ?ADDR
LDA ?ADDR
ENDIF
CALL HEXPRN
ENDM
HEXOUT ADDR
ENDM
;
;
;*******************************;
; SYSTEM EQUATES ;
;*******************************;
TRUE EQU -1
FALSE EQU NOT TRUE
TARBEL EQU FALSE ; Tarbell FDC dmb 31-may-82
IMS400 EQU FALSE ; Industrial Micro Systems FDC
GODBOUT EQU FALSE ; Godbout Disk 1 FDC
GODBAS EQU 0C0H ; Base of Godbout FDC
TARBAS EQU 0F8H ; Base of Tarbell
SKIP EQU TARBEL OR IMS400 OR GODBOUT ; Will be true
; if any skip needed
IF TARBEL
SKIPORT EQU TARBAS+4 ; Port # to skip if Tarbell FDC
ENDIF
IF IMS400
SKIPORT EQU 08FH ; Port # to skip if IMS FDC
ENDIF
IF GODBOUT
SKIPORT EQU GODBAS+1 ; Port # to skip if Disk 1 FDC
ENDIF
BDOS EQU 5 ; jump to BDOS
bios equ 0 ; jump to BIOS dmb 1-jun-82
CRLF EQU 0A0DH ; CR LF sequence
CRLFE EQU 8A0DH ; CR LF with EOL
EOL EQU 80H ; End of line
TAB EQU 'I'-40H ; Tab character
ESC EQU 1BH ; Escape character
TABS EQU 9 ; Tab columns
;***********************;
; MAIN PROGRAM ;
;***********************;
;
ORG 100H
;
START:
LXI H,0 ; Save stack pointer
DAD SP
SHLD OLDSP
LXI SP,FINIS+64
CALL TYPE ; Type initial CRLF
DB TAB,TAB,'*** System Survey (June 82) ***'
DW CRLF,CRLFE
;DISK SURVEY
LXI H,8 ; Init drive counter
MVI C,24 ; Get login vector
PUSH H
CALL BDOS
POP H
ROTBIT:
RAR ; RAR login bit to C
JNC NOTLOG ; Drive not logged
PUSH PSW ; Save login
PUSH H ; and counter
;Print drive letter
CALL TYPE
DB 'Drive'
DB ' '+EOL
MVI A,'A' ; Get ASCII bias
ADD H ; Add to drive #
MOV E,A ; Print drive letter
CALL TCHR
CALL TYPE ; and colon
DB ':',' '+EOL
POP H ; Restore drive #
PUSH H
;Print K already allocated
MOV E,H
MVI C,14 ; Log drive
CALL BDOS
MVI C,27 ; Index allocation vect
CALL BDOS
MOV L,A ; Put in decent regs
MOV H,B
PUSH H ; save for later
MVI C,12 ; get version #
CALL BDOS
MOV A,L ; zero if version 1
ORA A
JNZ V2X ; otherwise, use 2.x style params
LHLD BDOS+1 ; get vers 1 style params
MVI L,3CH
MOV A,M ; get block shift factor
STA BLKSHF
INX H
INX H
MOV L,M ; get max. block number
MVI H,0
SHLD MAXALL
MVI B,32 ; assume 32 bytes in block map
JMP GETALC ; continue
V2X:
MVI A,'?' ; Use wild user #
STA FCB ; in filename search
MVI C,31 ; Get 2.x parameter block
CALL BDOS
INX H
INX H
MOV A,M ; Get and save ablock shift factor
STA BLKSHF
INX H
INX H
INX H
MOV A,M ; Get maximum block number
INX H ; (double precision)
MOV H,M
MOV L,A
SHLD MAXALL
INX H
MVI B,3 ; map size is (MAXALL+1)/8
V2SH:
MOV A,H
ORA A ; do 16 bit right shift
RAR
MOV H,A
MOV A,L
RAR
MOV L,A
DCR B ; 3 times
JNZ V2SH
MOV B,L
LDA MAXALL ; allow for leftover bits if any
ANI 3
JZ GETALC
INR B
GETALC:
POP H
LXI D,0 ; Init group counter
NXBYTE:
MVI C,8 ; Bit counter for byte
MOV A,M ; Get map byte
NXBIT:
RAR ; Rotate to C
JNC NOBIT ; No group allocated
INX D ; Inc group counter
NOBIT:
DCR C ; Dec bit counter
JNZ NXBIT
INX H ; Index next byte
DCR B
JNZ NXBYTE
CALL SHF16
PUSH H
CALL BINDEC
CALL TYPE
DB 'K bytes in',' '+EOL
;Print number of files
LXI D,FCB ; Fake file cont block
MVI C,17 ; Search for 1st file
CALL BDOS
LXI H,0 ; File counter
LOOK:
CPI 255 ; Failure
JZ PFILE
ADD A ; File offset times 2
ADD A ; 4
ADD A ; 8
ADD A ; 16
ADD A ; 32
ADI 80H ; Make sure it's not a deleted file
MOV E,A
MVI D,0
LDAX D
CPI 0E5H
JZ LOOK1
INX H ; Bump file counter
LOOK1:
LXI D,FCB ; Restore FCB
MVI C,18 ; Look for addtl files
PUSH H ; Save file counter
CALL BDOS
POP H
JMP LOOK
PFILE:
CALL BINDEC ; Print # of files
CALL TYPE
DB ' files with',' '+EOL
;Print K remaining
LHLD MAXALL ; Get number of blocks
XCHG
INX D ; Inc for actual value
CALL SHF16
XCHG
POP H
MOV A,H ; Ones comp & move
CMA
MOV H,A
MOV A,L
CMA
MOV L,A
INX H ; Twos complement
DAD D ; and subtract
CALL BINDEC ; K remaining
CALL TYPE
DB 'K bytes remaining'
DW CRLFE
;Set up to print next drive
POP H ; Restore bit counter
POP PSW ; and bitmap byte
NOTLOG:
INR H ; Bump drive counter
DCR L ; Dec bit counter
JNZ ROTBIT
;MEMORY SURVEY
;Create header
MSURV:
CALL TYPE
DW CRLF
DB 'Memory map:'
DW CRLF
DB '0',TAB,'8',TAB,'16',TAB,'24',TAB,'32'
DB TAB,'40',TAB,'48',TAB,'56',TAB,'64'
DW CRLF
REPT 8
DB '|',TAB
ENDM
DB '|'
DW CRLF
db ' ' ; dmb 31-May-82
DB 'T'+EOL
LXI H,RAM
MVI M,LOW 1023 ; Init RAM counter
INX H
MVI M,HIGH 1023
MVI B,4 ; Clear ROM, EMP
CLREG:
INX H
MVI M,0
DCR B
JNZ CLREG
LXI H,1024 ; Init memory pointer
MVI C,63 ; K to be checked
;Start of analysis loop
BEGANA:
LXI D,1024 ; Byte counter
XRA A ; Clear flag bytes
STA RAMF
STA EMPF
ANALP:
MOV A,M ; Get test byte and
MOV B,A ; store for later
CMA
MOV M,A ; Put invertd tst byte
SUB M ; Check for good write
MOV M,B ; Restore orignl data
JNZ NOTMEM ; Wasn't good write
INXI RAM ; Bump memory counter
JMP NEXT ; To next byte
NOTMEM:
STA RAMF ; Not considered RAM
MVI A,0FFH ; Is it empty space?
SUB B
JNZ NOTEMP ; Inc ROM, set flag
LDA EMPF ; Any non empty space
ANA A ; before here?
JZ NEXT
JMP NOTEM ; To next byte
NOTEMP:
STA EMPF ; Set no empty flag
NOTEM:
INXI ROM
NEXT:
INX H ; Index next byte
DCX D ; Decrement K counter
XRA A
ORA D
ORA E
JNZ ANALP ; K counter not 0
PUSH B
PUSH H
LDA RAMF ; Is it RAM?
ANA A
JNZ NOTRAM ; No
dcr h ; drop H to make compares right
LDA BDOS+2 ; Is it under BDOS ?
CMP H
JC NOTTPA ; No
CALL TYPE ; Yes, it's TPA
DB 'T'+EOL
JMP NEXTK
NOTTPA:
lda bios+2 ; is it under bios ?
cmp h
jc nbdos
call type ; yes, it's BDOS
db 'C'+eol
jmp nextk
nbdos:
CALL TYPE ; Assume it's BIOS
DB 'B'+EOL
JMP NEXTK
;
NOTRAM:
LDA EMPF ; Is it empty?
ANA A
JZ NOMEM ; Yes, no memory
CALL TYPE ; No, must be ROM
DB 'R'+EOL
JMP NEXTK
NOMEM:
CALL TYPE
DB ' '+EOL
NEXTK:
POP H
POP B
DCR C ; Decrement K counter
JNZ BEGANA
CALL TYPE
DW CRLF
DB 'T=TPA',TAB,'C=CPM',TAB,'B=BIOS or unassigned'
DB TAB,'R=ROM or bad'
DW CRLFE
;
; contents of first page
call type
db 'BIOS at',' '+eol
hexout bios+2
hexout bios+1
call type
db tab,'iobyte',' '+eol
hexout bios+3
call type
db tab,'drive',' '+eol
hexout bios+4
call type
db tab,'BDOS at',' '+eol
hexout bdos+2
hexout bdos+1
call type
dw crlf,crlfe
;
;MEMORY SYNOPSIS
LHLD RAM
PUSH H ; Save RAM
CALL BINDEC ; Type RAM
CALL TYPE
DB ' Bytes RAM',TAB,TAB+EOL
LHLD ROM
PUSH H
CALL BINDEC ; Type ROM
CALL TYPE
DB ' Bytes ROM',TAB,TAB+EOL
LHLD BDOS+1
CALL BINDEC
CALL TYPE
DB ' Bytes in TPA'
DW CRLFE
POP D ; Get RAM
POP H ; Get RAM
DAD D ; Add 'em
PUSH H ; and save result
LXI D,0 ; Subtract from this
MOV A,H ; Complement 16 bits
CMA
MOV H,A
MOV A,L
CMA
MOV L,A ; 2s comp bias in D
DAD D ; Subtract
CALL BINDEC
CALL TYPE
DB ' Bytes Empty ',TAB+EOL
POP H ; Restore RAM+ROM
CALL BINDEC
CALL TYPE
DB ' Total Active Bytes'
DW CRLF,CRLF
;PORT SURVEY
DB 'Active I/O ports',':'+EOL
LXI H,1000H ; DELAY SO MESSAGE OUTPUT
PDLY:
DCX H ; DOESN'T GIVE A FALSE READING
MOV A,H ; ON CONSOLE STATUS PORT
ORA L
JNZ PDLY
LXI H,0 ; Init active port counter
mvi d,0 ; Init port counter
mvi e,0ffh ; init port group variable
PORTLP:
MOV A,D
IF SKIP ; Single port mask
CPI SKIPORT
JZ ISPORT ; Print mask port
ENDIF
mov b,a ; save port #
STA INPORT+1
INPORT:
IN 0 ; Modifiable code
; by trial and error, inactive port could return FF or echo port #
CPI 0FFH
JZ NEXTPT
cmp b
jz nextpt
ISPORT:
mov a,d ; got a live one, probably
ani 0f0h ; is port in same group as last ?
cmp e
jz nocrlf
call type ; no, start a new line
dw crlfe
mov a,d ; save for next time
ani 0f0h
mov e,a
nocrlf:
MOV A,D ; Get port #
PUSH D
PUSH H
HEXOUT
POP H
POP D
INX H ; count another one found
call type
db ' '+eol
NEXTPT:
INR D ; Bump port counter
JNZ PORTLP ; Not done
CALL TYPE ; Done
DW CRLFE
CALL BINDEC
CALL TYPE ; Type Active Ports
DB ' Ports active'
DW CRLFE
CCP:
LHLD OLDSP
SPHL
RET
;***********************;
; SUBROUTINES ;
;***********************;
;Binary to decimal conversion
BINDEC:
DECOUT ; From LIB
RET
;Types a string of text terminated with bit 7 high
TYPE:
XTHL ; Get string address
PUSH D
TYPELP:
MOV A,M ; Get type data
MOV D,A ; Save for later
ANI 7FH ; Mask ASCII
MOV E,A
PUSH H
PUSH D
CALL TCHR
POP D
POP H
INX H
MVI A,EOL ; End of line bit
ANA D
JP TYPELP ; Not done
POP D
XTHL ; Get return address
RET
;Types a single character on console
TCHR:
MVI C,2
JMP BDOS
;Checks sectors per block and multiplies or divides block size
;Enter with data in D. Result returned in H,L
;
SHF16:
LDA BLKSHF ; Get shift factor (gives block size)
CPI 3 ; Is it 1K (std)?
JNZ NOT3
MOV L,E ; Yes, use present #
ZH:
MVI H,0
RET
;
NOT3:
CPI 2 ; Is it minifloppy?
JNZ NOT2
MOV A,E ; Yes, divide by 2
RRC
ANI 7FH
MOV L,A
JMP ZH
NOT2:
SUI 3 ; Must be something
MOV B,A ; larger like double
XCHG ; sided or double dens
BITSHF:
DAD H ; 16 bit 2^(B-1)
DCR B
JNZ BITSHF
RET
;***********************;
; DATA STORAGE ;
;***********************;
FCB: DB 0,'???????????',0,0,0 ; File control block
DS 17 ; Extra FCB workspace
OLDSP: DS 2 ; Old stack pointer
RAM: DS 2 ; RAM counter
ROM: DS 2 ; ROM counter
RAMF: DS 1 ; RAM good flag
EMPF: DS 1 ; Empty so far flag
BLKSHF: DS 1 ; block shift factor
MAXALL: DS 2 ; maximum block number
FINIS EQU $ ; End of program
END


2
Source/Build.cmd

@ -1,7 +1,7 @@
@echo off
setlocal
setlocal & call BuildDoc || exit /b 1 & endlocal
REM setlocal & call BuildDoc || exit /b 1 & endlocal
setlocal & call BuildHardware || exit /b 1 & endlocal
setlocal & call BuildImages || exit /b 1 & endlocal
setlocal & call BuildShared || exit /b 1 & endlocal

2
Source/CBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 8
#DEFINE RUP 6
#DEFINE RTP 0
#DEFINE BIOSVER "2.8.6"
#DEFINE BIOSVER "2.8.6-pre.0"

2
Source/HBIOS/Config/RC_std.asm

@ -9,5 +9,7 @@ CPUOSC .SET 7372800 ; CPU OSC FREQ
DEFSERCFG .SET SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SHOULD MATCH ABOVE)
;
SIOENABLE .SET TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT
ACIAENABLE .SET TRUE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT
;
IDEENABLE .SET TRUE ; TRUE FOR IDE DEVICE SUPPORT

531
Source/HBIOS/acia.asm

@ -0,0 +1,531 @@
;
;==================================================================================================
; ACIA DRIVER (SERIAL PORT)
;==================================================================================================
;
; SETUP PARAMETER WORD:
; +-------+---+-------------------+ +---+---+-----------+---+-------+
; | |RTS| ENCODED BAUD RATE | |DTR|XON| PARITY |STP| 8/7/6 |
; +-------+---+---+---------------+ ----+---+-----------+---+-------+
; F E D C B A 9 8 7 6 5 4 3 2 1 0
; -- MSB (D REGISTER) -- -- LSB (E REGISTER) --
;
; CURRENTLY ONLY SUPPORTS A SINGLE CHIP IN SYSTEM
;
ACIA_DEBUG .EQU FALSE
;
ACIA_NONE .EQU 0
ACIA_ACIA .EQU 1
;
; POSSIBLE BASE I/O ADDRESSES
; NOTE THAT THE ACIA ONLY QUALIFIES ADDRESS BITS 7 & 6, SO
; THE ACIA'S TWO PORTS APPEAR REPEATEDLY OVER AN ADDRESS RANGE
; OF $40 STARTING FROM THE REAL BASE PORT.
; WE TAKE ADVANTAGE OF THIS TO AVOID CONFLICTING WITH SIO
; AND COMPACT FLASH MODULES DURING DETECTION PROBES.
;
ACIAA_BASE .EQU $80 + $20 ; MODULE A
ACIAB_BASE .EQU $40 + $20 ; MODULE B
;
ACIA_RTSON .EQU %10010110 ; RCV INT, RTS ASSERTED, 8N1, CLK/64 BAUD
ACIA_RTSOFF .EQU %11010110 ; RCV INT, RTS DEASSERTED, 8N1, CLK/64 BAUD
;
;
;
ACIA_PREINIT:
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,ACIA_CNT ; LOOP CONTROL
LD C,0 ; PHYSICAL UNIT INDEX
XOR A ; ZERO TO ACCUM
LD (ACIA_DEV),A ; CURRENT DEVICE NUMBER
ACIA_PREINIT0:
PUSH BC ; SAVE LOOP CONTROL
LD A,C ; PHYSICAL UNIT TO A
RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES)
RLCA ; ...
RLCA ; ... TO GET OFFSET INTO CFG TABLE
LD HL,ACIA_CFG ; POINT TO START OF CFG TABLE
CALL ADDHLA ; HL := ENTRY ADDRESS
PUSH HL ; SAVE IT
PUSH HL ; COPY CFG DATA PTR
POP IY ; ... TO IY
CALL ACIA_INITUNIT ; HAND OFF TO GENERIC INIT CODE
POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE
POP BC ; RESTORE LOOP CONTROL
;
LD A,(IY + 1) ; GET THE ACIA TYPE DETECTED
OR A ; SET FLAGS
JR Z,ACIA_PREINIT2 ; SKIP IT IF NOTHING FOUND
;
PUSH BC ; SAVE LOOP CONTROL
LD BC,ACIA_DISPATCH ; BC := DISPATCH ADDRESS
CALL NZ,CIO_ADDENT ; ADD ENTRY IF ACIA FOUND, BC:DE
POP BC ; RESTORE LOOP CONTROL
;
ACIA_PREINIT2:
INC C ; NEXT PHYSICAL UNIT
DJNZ ACIA_PREINIT0 ; LOOP UNTIL DONE
;
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
; ACIA INITIALIZATION ROUTINE
;
ACIA_INITUNIT:
CALL ACIA_DETECT ; DETERMINE ACIA TYPE
LD (IY + 1),A ; SAVE IN CONFIG TABLE
OR A ; SET FLAGS
RET Z ; ABORT IF NOTHING THERE
; UPDATE WORKING ACIA DEVICE NUM
LD HL,ACIA_DEV ; POINT TO CURRENT UART DEVICE NUM
LD A,(HL) ; PUT IN ACCUM
INC (HL) ; INCREMENT IT (FOR NEXT LOOP)
LD (IY),A ; UDPATE UNIT NUM
; ADD IM1 INT CALL LIST ENTRY
LD L,(IY+6) ; GET RCVBUF PTR
LD H,(IY+7) ; ... INTO HL
LD A,5 ; OFFSET OF INT HANDLER PTR
CALL ADDHLA ; ADD TO HL
LD A,(HL) ; DEREFERENCE
INC HL ; ...
LD H,(HL) ; ...
LD L,A ; ...
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST
; SET DEFAULT CONFIG
LD DE,-1 ; LEAVE CONFIG ALONE
JP ACIA_INITDEV ; IMPLEMENT IT AND RETURN
;
;
;
ACIA_INIT:
LD B,ACIA_CNT ; COUNT OF POSSIBLE ACIA UNITS
LD C,0 ; INDEX INTO ACIA CONFIG TABLE
ACIA_INIT1:
PUSH BC ; SAVE LOOP CONTROL
LD A,C ; PHYSICAL UNIT TO A
RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES)
RLCA ; ...
RLCA ; ... TO GET OFFSET INTO CFG TABLE
LD HL,ACIA_CFG ; POINT TO START OF CFG TABLE
CALL ADDHLA ; HL := ENTRY ADDRESS
PUSH HL ; COPY CFG DATA PTR
POP IY ; ... TO IY
LD A,(IY + 1) ; GET ACIA TYPE
OR A ; SET FLAGS
CALL NZ,ACIA_PRTCFG ; PRINT IF NOT ZERO
POP BC ; RESTORE LOOP CONTROL
INC C ; NEXT UNIT
DJNZ ACIA_INIT1 ; LOOP TILL DONE
;
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
; INTERRUPT HANDLERS
;
ACIAA_INT:
LD IY,ACIAA_CFG ; POINT TO CONFIG
;
; CHECK FOR RECEIVE PENDING
LD C,(IY+3) ; STATUS PORT
IN A,(C) ; GET STATUS
AND $01 ; ISOLATE RECEIVE READY BIT
RET Z ; IF NOT, RETURN WITH Z SET
;
ACIAA_INT00:
; HANDLE PENDING RECEIVE
INC C ; DATA PORT
IN A,(C) ; READ PORT
DEC C ; BACK TO CONTROL PORT
LD E,A ; SAVE BYTE READ
LD A,(ACIAA_BUFCNT) ; GET CURRENT BUFFER USED COUNT
CP ACIAA_BUFSZ ; COMPARE TO BUFFER SIZE
RET Z ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED
INC A ; INCREMENT THE COUNT
LD (ACIAA_BUFCNT),A ; AND SAVE IT
CP ACIAA_BUFSZ - 5 ; BUFFER GETTING FULL?
JR NZ,ACIAA_INT0 ; IF NOT, BYPASS DEASSERTING RTS
LD A,ACIA_RTSOFF ; VALUE TO DEASSERT RTS
OUT (C),A ; DO IT
ACIAA_INT0:
LD HL,(ACIAA_HD) ; GET HEAD POINTER
LD A,L ; GET LOW BYTE
CP ACIAA_BUFEND & $FF ; PAST END?
JR NZ,ACIAA_INT1 ; IF NOT, BYPASS POINTER RESET
LD HL,ACIAA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER
ACIAA_INT1:
LD A,E ; RECOVER BYTE READ
LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION
INC HL ; INCREMENT HEAD POINTER
LD (ACIAA_HD),HL ; SAVE IT
;
; CHECK FOR MORE PENDING...
IN A,(C) ; GET STATUS
RRA ; READY BIT TO CF
JR C,ACIAA_INT00 ; IF SET, DO SOME MORE
OR $FF ; NZ SET TO INDICATE INT HANDLED
RET ; AND RETURN
;
ACIAB_INT:
LD IY,ACIAB_CFG ; POINT TO CONFIG
;
; CHECK FOR RECEIVE PENDING
LD C,(IY+3) ; STATUS PORT
IN A,(C) ; GET STATUS
AND $01 ; ISOLATE RECEIVE READY BIT
RET Z ; IF NOT, RETURN WITH Z SET
;
ACIAB_INT00:
; HANDLE PENDING RECEIVE
INC C ; DATA PORT
IN A,(C) ; READ PORT
DEC C ; BACK TO CONTROL PORT
LD E,A ; SAVE BYTE READ
LD A,(ACIAB_BUFCNT) ; GET CURRENT BUFFER USED COUNT
CP ACIAB_BUFSZ ; COMPARE TO BUFFER SIZE
RET Z ; BAIL OUT IF BUFFER FULL, RCV BYTE DISCARDED
INC A ; INCREMENT THE COUNT
LD (ACIAB_BUFCNT),A ; AND SAVE IT
CP ACIAB_BUFSZ - 5 ; BUFFER GETTING FULL?
JR NZ,ACIAB_INT0 ; IF NOT, BYPASS DEASSERTING RTS
LD A,ACIA_RTSOFF ; VALUE TO DEASSERT RTS
OUT (C),A ; DO IT
ACIAB_INT0:
LD HL,(ACIAB_HD) ; GET HEAD POINTER
LD A,L ; GET LOW BYTE
CP ACIAB_BUFEND & $FF ; PAST END?
JR NZ,ACIAB_INT1 ; IF NOT, BYPASS POINTER RESET
LD HL,ACIAB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER
ACIAB_INT1:
LD A,E ; RECOVER BYTE READ
LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION
INC HL ; INCREMENT HEAD POINTER
LD (ACIAB_HD),HL ; SAVE IT
;
; CHECK FOR MORE PENDING...
IN A,(C) ; GET STATUS
RRA ; READY BIT TO CF
JR C,ACIAB_INT00 ; IF SET, DO SOME MORE
OR $FF ; NZ SET TO INDICATE INT HANDLED
RET ; AND RETURN
;
;
;
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:
.DW ACIA_IN
.DW ACIA_OUT
.DW ACIA_IST
.DW ACIA_OST
.DW ACIA_INITDEV
.DW ACIA_QUERY
.DW ACIA_DEVICE
;
;
;
ACIA_IN:
LD A,(IY+2) ; GET MODULE ID
OR A ; SET FLAGS
JR Z,ACIAA_IN ; HANDLE MODULE 0
DEC A ; TEST FOR NEXT
JR Z,ACIAB_IN ; HANDLE MODULE 1
CALL PANIC ; ELSE FATAL ERROR
RET
;
ACIAA_IN:
CALL ACIAA_IST ; RECEIVED CHAR READY?
JR Z,ACIAA_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER
DI ; AVOID COLLIACIAN WITH INT HANDLER
LD A,(ACIAA_BUFCNT) ; GET COUNT
DEC A ; DECREMENT COUNT
LD (ACIAA_BUFCNT),A ; SAVE SAVE IT
CP 5 ; BUFFER LOW THRESHOLD
JR NZ,ACIAA_IN0 ; IF NOT, BYPASS SETTING RTS
LD C,(IY + 3) ; C := ACIA CMD PORT
LD A,ACIA_RTSON ; ASSERT RTS
OUT (C),A ; DO IT
ACIAA_IN0:
LD HL,(ACIAA_TL) ; GET BUFFER TAIL POINTER
LD E,(HL) ; GET BYTE
INC HL ; BUMP TAIL POINTER
LD A,L ; GET LOW BYTE
CP ACIAA_BUFEND & $FF ; PAST END?
JR NZ,ACIAA_IN1 ; IF NOT, BYPASS POINTER RESET
LD HL,ACIAA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER
ACIAA_IN1:
LD (ACIAA_TL),HL ; SAVE UPDATED TAIL POINTER
EI ; INTERRUPTS OK AGAIN
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
;
ACIAB_IN:
CALL ACIAB_IST ; RECEIVED CHAR READY?
JR Z,ACIAB_IN ; LOOP TILL WE HAVE SOMETHING IN BUFFER
DI ; AVOID COLLIACIAN WITH INT HANDLER
LD A,(ACIAB_BUFCNT) ; GET COUNT
DEC A ; DECREMENT COUNT
LD (ACIAB_BUFCNT),A ; SAVE SAVE IT
CP 5 ; BUFFER LOW THRESHOLD
JR NZ,ACIAB_IN0 ; IF NOT, BYPASS SETTING RTS
LD C,(IY + 3) ; C := ACIA CMD PORT
LD A,ACIA_RTSON ; ASSERT RTS
OUT (C),A ; DO IT
ACIAB_IN0:
LD HL,(ACIAB_TL) ; GET BUFFER TAIL POINTER
LD E,(HL) ; GET BYTE
INC HL ; BUMP TAIL POINTER
LD A,L ; GET LOW BYTE
CP ACIAB_BUFEND & $FF ; PAST END?
JR NZ,ACIAB_IN1 ; IF NOT, BYPASS POINTER RESET
LD HL,ACIAB_BUF ; ... OTHERWISE, RESET TO START OF BUFFER
ACIAB_IN1:
LD (ACIAB_TL),HL ; SAVE UPDATED TAIL POINTER
EI ; INTERRUPTS OK AGAIN
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
;
;
;
ACIA_OUT:
CALL ACIA_OST ; READY FOR CHAR?
JR Z,ACIA_OUT ; LOOP IF NOT
LD C,(IY + 3) ; C := ACIA CMD PORT
INC C ; BUMP TO DATA PORT
OUT (C),E ; SEND CHAR FROM E
XOR A ; SIGNAL SUCCESS
RET
;
;
;
ACIA_IST:
LD A,(IY+2) ; GET MODULE ID
OR A ; SET FLAGS
JR Z,ACIAA_IST ; HANDLE MODULE 0
DEC A ; TEST FOR NEXT
JR Z,ACIAB_IST ; HANDLE MODULE 1
CALL PANIC ; ELSE FATAL ERROR
RET
;
ACIAA_IST:
LD A,(ACIAA_BUFCNT) ; GET BUFFER UTILIZATION COUNT
OR A ; SET FLAGS
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING
RET ; AND DONE
;
ACIAB_IST:
LD A,(ACIAB_BUFCNT) ; GET BUFFER UTILIZATION COUNT
OR A ; SET FLAGS
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING
RET ; AND DONE
;
;
;
ACIA_OST:
LD C,(IY + 3) ; CMD PORT
IN A,(C) ; GET STATUS
AND $02 ; ISOLATE BIT 2 (TX EMPTY)
JP Z,CIO_IDLE ; NOT READY, RETURN VIA IDLE PROCESSING
XOR A ; ZERO ACCUM
INC A ; ACCUM := 1 TO SIGNAL 1 BUFFER POSITION
RET ; DONE
;
;
;
ACIA_INITDEV:
HB_DI ; AVOID CONFLICTS
;
; PROGRAM THE ACIA CHIP
LD C,(IY + 3) ; COMMAND PORT
LD A,$FF ; MASTER RESET
OUT (C),A ; DO IT
LD A,ACIA_RTSON ; NORMAL OPERATION
OUT (C),A ; DO IT
;
; RESET THE RECEIVE BUFFER
LD E,(IY + 6)
LD D,(IY + 7) ; DE := _CNT
XOR A ; A := 0
LD (DE),A ; _CNT = 0
INC DE ; DE := ADR OF _HD
PUSH DE ; SAVE IT
INC DE
INC DE
INC DE
INC DE ; DE := ADR OF _BUF
POP HL ; HL := ADR OF _HD
LD (HL),E
INC HL
LD (HL),D ; _HD := _BUF
INC HL
LD (HL),E
INC HL
LD (HL),D ; _TL := _BUF
;
HB_EI ; READY FOR INTS AGAIN
XOR A ; SIGNAL SUCCESS
RET ; RETURN
;
;
;
ACIA_QUERY:
LD E,(IY + 4) ; FIRST CONFIG BYTE TO E
LD D,(IY + 5) ; SECOND CONFIG BYTE TO D
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
;
;
ACIA_DEVICE:
LD D,CIODEV_ACIA ; D := DEVICE TYPE
LD E,(IY) ; E := PHYSICAL UNIT
XOR A ; SIGNAL SUCCESS
RET
;
; ACIA DETECTION ROUTINE
;
ACIA_DETECT:
;LD C,ACIA_BASE ; BASE PORT ADDRESS
LD C,(IY+3) ; BASE PORT ADDRESS
CALL ACIA_DETECT2 ; CHECK IT
JR Z,ACIA_DETECT1 ; FOUND IT, RECORD IT
;LD C,ACIA_ALTBASE ; ALT BASE PORT ADDRESS
;CALL ACIA_DETECT2 ; CHECK IT
;JR Z,ACIA_DETECT1 ; FOUND IT, RECORD IT
LD A,ACIA_NONE ; NOTHING FOUND
RET ; DONE
;
ACIA_DETECT1:
; ACIA FOUND, RECORD IT
;LD A,C ; BASE PORT ADDRESS TO A
;LD (IY + 3),A ; SAVE ACTIVE BASE PORT
LD A,ACIA_ACIA ; RETURN CHIP TYPE
RET ; DONE
;
ACIA_DETECT2:
; LOOK FOR ACIA AT PORT ADDRESS IN C
LD A,$03 ; MASTER RESET
OUT (C),A ; DO IT
IN A,(C) ; GET STATUS
OR A ; CHECK FOR ZERO
RET NZ ; RETURN IF NOT ZERO
LD A,$02 ; CLEAR MASTER RESET
OUT (C),A ; DO IT
; CHECK FOR EXPECTED BITS:
; TDRE=1, DCD & CTS = 0
AND %00001110 ; BIT MASK FOR "STABLE" BITS
CP %00000010 ; EXPECTED VALUE
RET ; RETURN RESULT, Z = CHIP FOUND
;
;
;
ACIA_PRTCFG:
; ANNOUNCE PORT
CALL NEWLINE ; FORMATTING
PRTS("ACIA$") ; FORMATTING
LD A,(IY) ; DEVICE NUM
CALL PRTDECB ; PRINT DEVICE NUM
PRTS(": IO=0x$") ; FORMATTING
LD A,(IY + 3) ; GET BASE PORT
CALL PRTHEXBYTE ; PRINT BASE PORT
; PRINT THE ACIA TYPE
CALL PC_SPACE ; FORMATTING
LD A,(IY + 1) ; GET ACIA TYPE BYTE
RLCA ; MAKE IT A WORD OFFSET
LD HL,ACIA_TYPE_MAP ; POINT HL TO TYPE MAP TABLE
CALL ADDHLA ; HL := ENTRY
LD E,(HL) ; DEREFERENCE
INC HL ; ...
LD D,(HL) ; ... TO GET STRING POINTER
CALL WRITESTR ; PRINT IT
;
; ALL DONE IF NO ACIA WAS DETECTED
LD A,(IY + 1) ; GET ACIA TYPE BYTE
OR A ; SET FLAGS
RET Z ; IF ZERO, NOT PRESENT
;
PRTS(" MODE=$") ; FORMATTING
LD E,(IY + 4) ; LOAD CONFIG
LD D,(IY + 5) ; ... WORD TO DE
CALL PS_PRTSC0 ; PRINT CONFIG
;
XOR A
RET
;
;
;
ACIA_TYPE_MAP:
.DW ACIA_STR_NONE
.DW ACIA_STR_ACIA
ACIA_STR_NONE .DB "<NOT PRESENT>$"
ACIA_STR_ACIA .DB "ACIA$"
;
; WORKING VARIABLES
;
ACIA_DEV .DB 0 ; DEVICE NUM USED DURING INIT
;
; RECEIVE BUFFERS
;
ACIAA_RCVBUF:
ACIAA_BUFCNT .DB 0 ; CHARACTERS IN RING BUFFER
ACIAA_HD .DW ACIAA_BUF ; BUFFER HEAD POINTER
ACIAA_TL .DW ACIAA_BUF ; BUFFER TAIL POINTER
ACIAA_INTP .DW ACIAA_INT ; INT HANDLER POINTER
ACIAA_BUF .FILL 32,0 ; RECEIVE RING BUFFER
ACIAA_BUFEND .EQU $ ; END OF BUFFER
ACIAA_BUFSZ .EQU $ - ACIAA_BUF ; SIZE OF RING BUFFER
;
ACIAB_RCVBUF:
ACIAB_BUFCNT .DB 0 ; CHARACTERS IN RING BUFFER
ACIAB_HD .DW ACIAB_BUF ; BUFFER HEAD POINTER
ACIAB_TL .DW ACIAB_BUF ; BUFFER TAIL POINTER
ACIAB_INTP .DW ACIAB_INT ; INT HANDLER POINTER
ACIAB_BUF .FILL 32,0 ; RECEIVE RING BUFFER
ACIAB_BUFEND .EQU $ ; END OF BUFFER
ACIAB_BUFSZ .EQU $ - ACIAB_BUF ; SIZE OF RING BUFFER
;
; ACIA PORT TABLE
;
ACIA_CFG:
ACIAA_CFG:
; ACIA MODULE A CONFIG
.DB 0 ; DEVICE NUMBER (SET DURING INIT)
.DB 0 ; ACIA TYPE (SET DURING INIT)
.DB 0 ; MODULE ID
.DB ACIAA_BASE ; BASE PORT (SET DURING DETECT)
.DW DEFSERCFG ; LINE CONFIGURATION
.DW ACIAA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
ACIAB_CFG:
; ACIA MODULE B CONFIG
.DB 0 ; DEVICE NUMBER (SET DURING INIT)
.DB 0 ; ACIA TYPE (SET DURING INIT)
.DB 1 ; MODULE ID
.DB ACIAB_BASE ; BASE PORT (SET DURING DETECT)
.DW DEFSERCFG ; LINE CONFIGURATION
.DW ACIAB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
ACIA_CNT .EQU ($ - ACIA_CFG) / 8

3
Source/HBIOS/cfg_mk4.asm

@ -22,7 +22,8 @@ DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC
ASCIENABLE .EQU TRUE ; TRUE FOR Z180 ASCI SUPPORT
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTOSC .EQU 1843200 ; UART OSC FREQUENCY
SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT
SIOENABLE .EQU FALSE ; TRUE FOR ZILOG SIO/2 SUPPORT
ACIAENABLE .EQU FALSE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT

3
Source/HBIOS/cfg_n8.asm

@ -22,7 +22,8 @@ DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC
ASCIENABLE .EQU TRUE ; TRUE FOR Z180 ASCI SUPPORT
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTOSC .EQU 1843200 ; UART OSC FREQUENCY
SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT
SIOENABLE .EQU FALSE ; TRUE FOR ZILOG SIO/2 SUPPORT
ACIAENABLE .EQU FALSE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT

1
Source/HBIOS/cfg_rc.asm

@ -23,6 +23,7 @@ ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT
UARTENABLE .EQU FALSE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTOSC .EQU 1843200 ; UART OSC FREQUENCY
SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT
ACIAENABLE .EQU TRUE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT

4
Source/HBIOS/cfg_sbc.asm

@ -23,6 +23,7 @@ ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTOSC .EQU 1843200 ; UART OSC FREQUENCY
SIOENABLE .EQU FALSE ; TRUE FOR ZILOG SIO/2 SUPPORT
ACIAENABLE .EQU FALSE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
@ -64,6 +65,9 @@ PRPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PRPSDENA
PRPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
PPPENABLE .EQU FALSE ; TRUE FOR PARPORTPROP SUPPORT
PPPSDENABLE .EQU TRUE ; TRUE FOR PARPORTPROP SD SUPPORT
PPPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPPENABLE = TRUE)
PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
;
HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)

3
Source/HBIOS/cfg_zeta.asm

@ -22,7 +22,8 @@ DSRTCMODE .EQU DSRTCMODE_STD ; DSRTCMODE_STD, DSRTCMODE_MFPIC
ASCIENABLE .EQU FALSE ; TRUE FOR Z180 ASCI SUPPORT
UARTENABLE .EQU TRUE ; TRUE FOR UART SUPPORT (ALMOST ALWAYS WANT THIS TO BE TRUE)
UARTOSC .EQU 1843200 ; UART OSC FREQUENCY
SIOENABLE .EQU TRUE ; TRUE FOR ZILOG SIO/2 SUPPORT
SIOENABLE .EQU FALSE ; TRUE FOR ZILOG SIO/2 SUPPORT
ACIAENABLE .EQU FALSE ; TRUE FOR MOTOROLA 6850 ACIA SUPPORT
;
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT

183
Source/HBIOS/hbios.asm

@ -146,9 +146,6 @@ 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 (DEPRECATED)
;CB_CURVDA .DB VDADEV ; CURRENT VDA TARGET FOR EMULATION (DEPRECATED)
;
; MEMORY MANAGEMENT VARIABLES START AT $20
;
.FILL (HCB + $20 - $),0
@ -190,7 +187,7 @@ CB_BIDROMDN .DB BID_ROMDN
;
; DEFINITIONS
;
HBX_BUFSIZ .EQU $40 ; INTERBANK COPY BUFFER
HBX_BUFSIZ .EQU $40 ; INTERBANK COPY BUFFER SIZE
;
; HBIOS IDENTIFICATION DATA BLOCK
;
@ -310,8 +307,9 @@ HBX_BNKCPY:
#IF (INTTYPE == IT_SIMH)
HB_DI
#ENDIF
LD (HBX_BC_SP),SP
LD SP,HBX_TMPSTK
LD (HBX_BC_SP),SP ; PUT STACK
LD SP,HBX_TMPSTK ; ... IN HI MEM
LD A,(HB_CURBNK) ; GET CURRENT BANK
PUSH AF ; AND SAVE TO RESTORE LATER
@ -333,11 +331,13 @@ HBX_BC_LAST:
ADC HL,BC ; HL := REM LEN (0 - 127)
EX (SP),HL ; HL := CUR SRC, (SP) := REM LEN
POP BC ; BC := REM LEN
CALL NZ,HBX_BC_ITER ; DO FINAL CHUNK, BUT ONLY IF NOT ZERO BYTES
CALL NZ,HBX_BC_ITER ; DO FINAL CHUNK, IFF > 0 BYTES
POP AF ; RECOVER ORIGINAL BANK
CALL HBX_BNKSEL ; SWITCH TO CURRENT BANK AND EXIT
LD SP,$FFFF
HBX_BC_SP .EQU $ - 2
CALL HBX_BNKSEL ; SWITCH
LD SP,$FFFF ; RESTORE STACK
HBX_BC_SP .EQU $ - 2 ; ... TO ORIGINAL VALUE
#IF (INTTYPE == IT_SIMH)
HB_EI
#ENDIF
@ -442,22 +442,22 @@ HBX_STACK .EQU $
; HBIOS INTERRUPT VECTOR TABLE (16 ENTRIES)
;
HBX_IVT:
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD
.DW INT_BAD ; IVT_INT1
.DW INT_BAD ; IVT_INT2
.DW INT_BAD ; IVT_TIM0
.DW INT_BAD ; IVT_TIM1
.DW INT_BAD ; IVT_DMA0
.DW INT_BAD ; IVT_DMA1
.DW INT_BAD ; IVT_CSIO
.DW INT_BAD ; IVT_SER0
.DW INT_BAD ; IVT_SER1
.DW INT_BAD ;
.DW INT_BAD ;
.DW INT_BAD ;
.DW INT_BAD ;
.DW INT_BAD ;
.DW INT_BAD ;
.DW INT_BAD ;
;
; INTERRUPT HANDLER STUBS
;
@ -465,6 +465,12 @@ HBX_IVT:
; INTERRUPT, SETUP A HANDLER VECTOR IN HBIOS AND THEN
; BRANCH TO THE COMMON INTERRUPT DISPATCHER
;
;
INT_IM1:
PUSH HL ; SAVE HL
LD HL,HB_IM1INT ; HL := IM1 INT HANDLER IN BIOS BANK
JR HBX_INT ; TO TO ROUTING CODE
;
INT_TIMER: ; TIMER INTERRUPT HANDLER
PUSH HL ; SAVE HL
LD HL,HB_TIMINT ; HL := INT ADR IN BIOS
@ -476,7 +482,7 @@ INT_BAD: ; BAD INTERRUPT HANDLER
JR HBX_INT ; TO TO ROUTING CODE
;
#IF (SIOENABLE)
INT_SIO: ; SIO DEVICE INTERRUPT HANDLER
INT_SIO: ; SIO INTERRUPT HANDLER
PUSH HL ; SAVE HL
LD HL,SIO_INT ; HL := SIO INT HANDLER IN BIOS BANK
JR HBX_INT ; TO TO ROUTING CODE
@ -726,6 +732,9 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
#IF (SIOENABLE)
CALL SIO_PREINIT
#ENDIF
#IF (ACIAENABLE)
CALL ACIA_PREINIT
#ENDIF
;
; PRIOR TO THIS POINT, CONSOLE I/O WAS DIRECTED TO HARDWARE (XIO.ASM).
; NOW THAT HBIOS IS READY, SET THE CONSOLE UNIT TO ACTIVATE CONSOLE I/O
@ -739,12 +748,39 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
CALL NEWLINE2
PRTX(STR_BANNER)
;
; WE CAN HANDLE INTERRUPTS NOW (HOPEFULLY)
; IO PORT SCAN
;
#IF 0
PSCN:
LD C,0 ; IO PORT NUMBER
LD B,0 ; LOOP COUNTER
CALL NEWLINE
PSCN1:
CALL NEWLINE
LD A,C
CALL PRTHEXBYTE
CALL PC_COLON
CALL PC_SPACE
CALL DELAY
LD A,C
LD (PSCNX),A
PSCNX .EQU $ + 1
IN A,(0)
CALL PRTHEXBYTE
CALL PC_COMMA
PUSH BC
LD B,0
IN A,(C)
POP BC
CALL PRTHEXBYTE
INC C
DJNZ PSCN1
#ENDIF
;
; SETUP INTERRUPT VECTORS, AS APPROPRIATE
;
HB_DI ; START OF CRITICAL SECTION
#IF (INTTYPE != IT_NONE)
;
#IF (INTTYPE == IT_SIMH)
;
; SETUP TIMER INT VECTOR VIA INT MODE 1 IN PAGE ZERO
@ -776,7 +812,7 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
;
; SETUP Z180 TIMER0 INTERRUPT VECTOR IN IVT
LD HL,INT_TIMER
LD (HBX_IVT + Z180_IVTIM0),HL
LD (HBX_IVT + IVT_TIM0),HL
; SETUP PERIODIC TIMER INTERRUPT ON TIMER 0
LD HL,(CB_CPUKHZ) ; 50HZ = 18432000 / 20 / 50 / X, SO X = CPU KHZ
@ -796,37 +832,36 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
;
#IF (INTTYPE == IT_RC)
;
; SETUP Z80 IVT
#IF 0
; SETUP Z80 IVT AND INT MODE 2
LD A,HBX_IVT >> 8 ; SETUP HI BYTE OF IVT ADDRESS
LD I,A ; ... AND PLACE IT IN I REGISTER
;
IM 2 ; SWITCH TO INT MODE 2
;
#IF (SIOENABLE)
#IF (SIOENABLE)
; SETUP SIO INTERRUPT VECTOR IN IVT
LD HL,INT_SIO
LD (HBX_IVT + 4),HL
#ENDIF
LD (HBX_IVT + IVT_SER0),HL
#ENDIF
;
; IM 1
#ENDIF
;
;#IF (SIOENABLE)
;;
; ; SETUP SIO INT VECTOR VIA INT MODE 1 IN PAGE ZERO
; ;LD A,$C3 ; JP OPCODE
; ;LD ($38),A ; ... AT INT VECTOR ADDRESS
; ;LD HL,INT_SIO ; ADDRESS OF SIO INT HANDLER
; ;LD ($39),HL ; ... IS TARGET OF JP
;;
;#ENDIF
#IF 1
; SET INT MODE 1
IM 1
;
#ENDIF
#IF (SIOENABLE | ACIAENABLE)
; SETUP IM1 INT VECTOR VIA INT MODE 1 IN PAGE ZERO
LD A,$C3 ; JP OPCODE
LD ($38),A ; ... AT INT VECTOR ADDRESS
LD HL,INT_IM1 ; ADDRESS OF SIO INT HANDLER
LD ($39),HL ; ... IS TARGET OF JP
#ENDIF
;
#ENDIF
;
#ENDIF
;
HB_EI ; END OF CRITICAL SECTION
;
; DISPLAY PLATFORM INFORMATION
@ -991,6 +1026,9 @@ HB_INITTBL:
#IF (SIOENABLE)
.DW SIO_INIT
#ENDIF
#IF (ACIAENABLE)
.DW ACIA_INIT
#ENDIF
#IF (SIMRTCENABLE)
.DW SIMRTC_INIT
#ENDIF
@ -1876,6 +1914,37 @@ CIO_IDLE:
POP AF ; RECOVER AF
RET
;
; IM1 INTERRUPTS ARRIVE HERE AFTER BANK SWITCH TO HBIOS BANK
; LIST OF IM1 INT CALLS IS BUILT DYNAMICALLY BELOW
; SEE HB_ADDIM1 ROUTINE
; EACH ENTRY WILL LOOK LIKE:
; CALL XXXX ; CALL INT HANDLER
; RET NZ ; RETURN IF HANDLED
;
HB_IM1INT: ; IM1 DEVICE INTERRUPT HANDLER
RET ; START WITH NO ENTRIES
.FILL 4 * 8,$C9 ; ROOM FOR 8 ENTRIES
;
; ROUTINE BELOW IS USED TO ADD A NEW VECTOR TO THE IM1
; CALL LIST ABOVE. ENTER WITH HL=VECTOR ADDRESS IN HBIOS
;
HB_ADDIM1:
EX DE,HL ; VECTOR ADDRESS TO DE
LD HL,(HB_IM1P) ; GET PTR FOR NEXT ENTRY
LD (HL),$CD ; "CALL" OPCODE
INC HL ; BUMP PTR
LD (HL),E ; ADD VECTOR ADDRESS
INC HL ; ...
LD (HL),D ; ...
INC HL ; BUMP PTR
LD (HL),$C0 ; "RET NZ" OPCODE
INC HL ; BUMP PTR
LD (HL),$C9 ; FINAL "RET" OPCODE
LD (HB_IM1P),HL ; SAVE POINTER
RET ; DONE
;
HB_IM1P .DW HB_IM1INT ; POINTER FOR NEXT IM1 ENTRY
;
; TIMER INTERRUPT
;
HB_TIMINT:
@ -2068,6 +2137,15 @@ SIZ_SIO .EQU $ - ORG_SIO
.ECHO " bytes.\n"
#ENDIF
;
#IF (ACIAENABLE)
ORG_ACIA .EQU $
#INCLUDE "acia.asm"
SIZ_ACIA .EQU $ - ORG_ACIA
.ECHO "ACIA occupies "
.ECHO SIZ_ACIA
.ECHO " bytes.\n"
#ENDIF
;
#IF (VGAENABLE)
ORG_VGA .EQU $
#INCLUDE "vga.asm"
@ -2920,7 +2998,7 @@ PS_FLPED .TEXT "ED$"
;
PS_SDSTRREF:
.DW PS_SDUART, PS_SDASCI, PS_SDTERM,
.DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO
.DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO, PS_SDACIA
;
PS_SDUART .TEXT "UART$"
PS_SDASCI .TEXT "ASCI$"
@ -2928,6 +3006,7 @@ PS_SDTERM .TEXT "TERM$"
PS_SDPRPCON .TEXT "PRPCON$"
PS_SDPPPCON .TEXT "PPPCON$"
PS_SDSIO .TEXT "SIO$"
PS_SDACIA .TEXT "ACIA$"
;
; SERIAL TYPE STRINGS
;

1
Source/HBIOS/hbios.inc

@ -84,6 +84,7 @@ CIODEV_TERM .EQU $20
CIODEV_PRPCON .EQU $30
CIODEV_PPPCON .EQU $40
CIODEV_SIO .EQU $50
CIODEV_ACIA .EQU $60
CIODEV_CONSOLE .EQU $D0
;
; DISK DEVICE IDS

6
Source/HBIOS/ide.asm

@ -959,7 +959,13 @@ IDE_INITDEV:
#ENDIF
CALL IDE_SETFEAT ; SET FEATURE
#IF (IDE8BIT)
; "REAL" IDE DRIVES MAY NOT ACCEPT THE DISABLE8BIT FEATURE COMMAND,
; SO IT IS ONLY AN ERROR IF WE ARE ATTEMPTING TO ENABLE8BIT
; THANKS TO ED ? FOR POINTING THIS OUT.
RET NZ ; BAIL OUT ON ERROR
#ENDIF
;
CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND
RET NZ ; BAIL OUT ON ERROR

151
Source/HBIOS/romldr.asm

@ -47,8 +47,7 @@ ZSYSIMG .EQU $5000
; LOADER
;==================================================================================================
;
;DI ; NO INTERRUPTS
;IM 1 ; INTERRUPT MODE 1
DI ; NO INTERRUPTS
;
LD SP,BL_STACK ; SETUP STACK
;
@ -75,7 +74,36 @@ PHASE2:
CALL DELAY_INIT
#ENDIF
#IF (PLATFORM != PLT_UNA)
#IF (PLATFORM == PLT_UNA)
; COPY UNA BIOS PAGE ZERO TO USER BANK, LEAVE USER BANK ACTIVE
LD BC,BF_SYSSETBNK ; UNA FUNC = SET BANK
LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC)
CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED)
;PUSH DE ; SAVE PREVIOUS BANK
LD HL,0 ; FROM ADDRESS 0 (PAGE ZERO)
LD DE,$9000 ; USE $9000 AS BOUNCE BUFFER
LD BC,256 ; ONE PAGE IS 256 BYTES
LDIR ; DO IT
LD BC,$01FB ; UNA FUNC = SET BANK
;POP DE ; RECOVER OPERATING BANK
LD DE,BID_USR ; TO USER BANK
CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED)
LD HL,$9000 ; USE $9000 AS BOUNCE BUFFER
LD DE,0 ; TO PAGE ZERO OF OPERATING BANK
LD BC,256 ; ONE PAGE IS 256 BYTES
LDIR ; DO IT
; INSTALL UNA INVOCATION VECTOR FOR RST 08
; *** IS THIS REDUNDANT? ***
LD A,$C3 ; JP INSTRUCTION
LD (8),A ; STORE AT 0x0008
LD HL,($FFFE) ; UNA ENTRY VECTOR
LD (9),HL ; STORE AT 0x0009
#ELSE
; PREP THE USER BANK (SETUP DEFAULT PAGE ZERO)
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
LD D,BID_USR ; D = DEST BANK = USER BANK
@ -86,8 +114,15 @@ PHASE2:
LD HL,0 ; COPY FROM BIOS ADDRESS 0
LD DE,0 ; TO USER ADDRESS 0
RST 08 ; DO IT
; NOW SWITCH TO USR BANK
LD B,BF_SYSSETBNK ; HBIOS FUNC: SETBNK
LD C,BID_USR ; USER BANK
RST 08 ; DO IT
#ENDIF
EI
; RUN THE BOOT LOADER MENU
JP DOBOOTMENU
;
@ -204,31 +239,101 @@ DB_INVALID:
;
GOMON:
CALL LDMON
LD HL,MON_SERIAL ; JUMP TO MONITOR, SERIAL ENTRY
JR EXECUSR
;LD HL,MON_SERIAL ; JUMP TO MONITOR, SERIAL ENTRY
;JR EXECUSR
JP MON_SERIAL
;
GOMONDSKY:
CALL LDMON
LD HL,MON_DSKY
JR EXECUSR
;LD HL,MON_DSKY
;JR EXECUSR
JP MON_DSKY
;
LDMON:
LD DE,STR_BOOTMON
CALL WRITESTR
;LD HL,MONIMG
;LD DE,MON_LOC
;LD BC,MON_SIZ
;LDIR
#IF (PLATFORM == PLT_UNA)
DI
;
; SET LOW MEM TO OS IMAGE BANK
LD BC,BF_SYSSETBNK ; UNA FUNC = SET BANK
LD DE,BID_OSIMG ; UBIOS_PAGE (SEE PAGES.INC)
CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED)
; COPY MEMORY
LD HL,MONIMG
LD DE,MON_LOC
LD BC,MON_SIZ
LDIR
; RESET LOW MEM TO USER BANK
LD BC,BF_SYSSETBNK ; UNA FUNC = SET BANK
LD DE,BID_USR ; TO USER BANK
CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED)
;
EI
#ELSE
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
LD D,BID_USR ; D = DEST BANK = USER BANK
LD E,BID_OSIMG ; E = SRC BANK = OSIMG BANK
LD HL,MON_SIZ ; HL = COPY LEN
RST 08 ; DO IT
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
LD HL,MONIMG ; COPY FROM MONITOR IMAGE LOCATION
LD DE,MON_LOC ; TO MONITOR EXECUTION LOCATION
RST 08 ; DO IT
#ENDIF
RET
;
GOZSYS:
LD DE,STR_BOOTZSYS
CALL WRITESTR
LD HL,ZSYSIMG
JR GOCPM2
;
GOCPM:
LD DE,STR_BOOTCPM
CALL WRITESTR
LD HL,CPMIMG
GOCPM2:
;LD DE,CPM_LOC
;LD BC,CPM_SIZ
;LDIR
#IF (PLATFORM == PLT_UNA)
DI
POP HL ; SAVE IMG LOCATION
; SET LOW MEM TO OS IMAGE BANK
LD BC,BF_SYSSETBNK ; UNA FUNC = SET BANK
LD DE,BID_OSIMG ; UBIOS_PAGE (SEE PAGES.INC)
CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED)
; COPY MEMORY
POP HL
LD DE,CPM_LOC
LD BC,CPM_SIZ
LDIR
; RESET LOW MEM TO USER BANK
LD BC,BF_SYSSETBNK ; UNA FUNC = SET BANK
LD DE,BID_USR ; TO USER BANK
CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED)
;
EI
#ELSE
PUSH HL ; SAVE OS IMAGE ADDRESS
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
LD D,BID_USR ; D = DEST BANK = USER BANK
LD E,BID_OSIMG ; E = SRC BANK = OSIMG BANK
LD HL,CPM_SIZ ; HL = COPY LEN
RST 08 ; DO IT
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
POP HL ; FROM OS IMAGE ADDRESS
LD DE,CPM_LOC ; TO OS IMG EXECUTION LOCATION
RST 08 ; DO IT
#ENDIF
;
#IF (PLATFORM == PLT_UNA)
LD DE,-1
LD L,1
@ -242,23 +347,17 @@ GOCPM2:
LD DE,$0100 ; BOOT VOLUME (UNIT, SLICE)
RST 08
#ENDIF
LD HL,CPM_ENT ; CPM ENTRY VECTOR
JR EXECUSR
;
GOZSYS:
LD DE,STR_BOOTZSYS
CALL WRITESTR
LD HL,ZSYSIMG
JR GOCPM2
;
EXECUSR:
#IF (PLATFORM == PLT_UNA)
JP (HL)
#ELSE
LD A,BID_USR ; WITH USER BANK ACTIVE
CALL HB_BNKCALL ; GO THERE
CALL PANIC ; WE ARE NOT SUPPOSED TO RETURN
#ENDIF
;LD HL,CPM_ENT ; CPM ENTRY VECTOR
JP CPM_ENT ; CPM ENTRY VECTOR
;
;EXECUSR:
;#IF (PLATFORM == PLT_UNA)
; JP (HL)
;#ELSE
; LD A,BID_USR ; WITH USER BANK ACTIVE
; CALL HB_BNKCALL ; GO THERE
; CALL PANIC ; WE ARE NOT SUPPOSED TO RETURN
;#ENDIF
;
GOLIST:
LD DE,STR_LIST
@ -375,8 +474,8 @@ BOOTDISK:
; JUMP TO COLD BOOT ENTRY
CALL NEWLINE ; FORMATTING
LD HL,(BB_CPMENT) ; GET THE ENTRY POINT
;JP (HL) ; ... AND GO
JP EXECUSR ; ... AND GO
;JP EXECUSR ; ... AND GO
JP (HL) ; ... AND GO
;
; PRINT LIST OF ALL DRIVES UNDER UNA
;

116
Source/HBIOS/sio.asm

@ -1,5 +1,4 @@
;
;
;==================================================================================================
; SIO DRIVER (SERIAL PORT)
;==================================================================================================
@ -60,7 +59,15 @@ SIO_PREINIT0:
SIO_PREINIT2:
INC C ; NEXT PHYSICAL UNIT
DJNZ SIO_PREINIT0 ; LOOP UNTIL DONE
;
;
; ADD IM1 INT CALL LIST ENTRY IF APPROPRIATE
LD A,(SIO_DEV) ; GET NEXT DEVICE NUM
OR A ; SET FLAGS
JR Z,SIO_PREINIT3 ; IF ZERO, NO SIO DEVICES
LD HL,SIO_INT ; GET INT VECTOR
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST
;
SIO_PREINIT3:
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
@ -113,13 +120,15 @@ SIO_INIT1:
; INTERRUPT HANDLER
;
SIO_INT:
SIOA_INT:
; CHECK FOR RECEIVE PENDING ON CHANNEL A
XOR A ; A := 0
OUT (SIOA_CMD),A ; ADDRESS RD0
IN A,(SIOA_CMD) ; GET RD0
RRA ; RECEIVE READY BIT TO CF
JR NC,SIOB_INT ; NOTHING HERE, TRY B CHANNEL
AND $01 ; ISOLATE RECEIVE READY BIT
JR Z,SIOB_INT ; CHECK CHANNEL B
;
SIOA_INT00:
; HANDLE CHANNEL A
IN A,(SIOA_DAT) ; READ PORT
LD E,A ; SAVE BYTE READ
@ -138,13 +147,21 @@ SIOA_INT0:
LD HL,(SIOA_HD) ; GET HEAD POINTER
LD A,L ; GET LOW BYTE
CP SIOA_BUFEND & $FF ; PAST END?
JR NZ,SIO_INT1 ; IF NOT, BYPASS POINTER RESET
JR NZ,SIOA_INT1 ; IF NOT, BYPASS POINTER RESET
LD HL,SIOA_BUF ; ... OTHERWISE, RESET TO START OF BUFFER
SIO_INT1:
SIOA_INT1:
LD A,E ; RECOVER BYTE READ
LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION
INC HL ; INCREMENT HEAD POINTER
LD (SIOA_HD),HL ; SAVE IT
;
; CHECK FOR MORE PENDING...
XOR A ; A := 0
OUT (SIOA_CMD),A ; ADDRESS RD0
IN A,(SIOA_CMD) ; GET RD0
RRA ; READY BIT TO CF
JR C,SIOA_INT00 ; IF SET, DO SOME MORE
OR $FF ; NZ SET TO INDICATE INT HANDLED
RET ; AND RETURN
;
SIOB_INT:
@ -152,9 +169,10 @@ SIOB_INT:
XOR A ; A := 0
OUT (SIOB_CMD),A ; ADDRESS RD0
IN A,(SIOB_CMD) ; GET RD0
RRA ; RECEIVE READY BIT TO CF
RET NC ; NOTHING HERE, GIVE UP
AND $01 ; ISOLATE RECEIVE READY BIT
RET Z ; IF NOT, RETURN WITH Z SET
;
SIOB_INT00:
; HANDLE CHANNEL B
IN A,(SIOB_DAT) ; READ PORT
LD E,A ; SAVE BYTE READ
@ -180,6 +198,14 @@ SIOB_INT1:
LD (HL),A ; SAVE RECEIVED BYTE TO HEAD POSITION
INC HL ; INCREMENT HEAD POINTER
LD (SIOB_HD),HL ; SAVE IT
;
; CHECK FOR MORE PENDING...
XOR A ; A := 0
OUT (SIOB_CMD),A ; ADDRESS RD0
IN A,(SIOB_CMD) ; GET RD0
RRA ; READY BIT TO CF
JR C,SIOB_INT00 ; IF SET, DO SOME MORE
OR $FF ; NZ SET TO INDICATE INT HANDLED
RET ; AND RETURN
;
;
@ -211,7 +237,7 @@ SIO_FTBL:
;
;
SIO_IN:
LD A,(IY + 0) ; GET DEVICE NUMBER
LD A,(IY + 2) ; GET CHANNEL
OR A ; SET FLAGS
JR Z,SIOA_IN ; HANDLE CHANNEL A
DEC A ; TEST FOR NEXT DEVICE
@ -256,9 +282,9 @@ SIOB_IN:
CP 5 ; BUFFER LOW THRESHOLD
JR NZ,SIOB_IN0 ; IF NOT, BYPASS SETTING RTS
LD A,5 ; RTS IS IN WR5
OUT (SIOA_CMD),A ; ADDRESS WR5
OUT (SIOB_CMD),A ; ADDRESS WR5
LD A,$EA ; VALUE TO SET RTS
OUT (SIOA_CMD),A ; DO IT
OUT (SIOB_CMD),A ; DO IT
SIOB_IN0:
LD HL,(SIOB_TL) ; GET BUFFER TAIL POINTER
LD E,(HL) ; GET BYTE
@ -278,7 +304,8 @@ SIOB_IN1:
SIO_OUT:
CALL SIO_OST ; READY FOR CHAR?
JR Z,SIO_OUT ; LOOP IF NOT
LD C,(IY + 2) ; C := BASE SIO PORT (WHICH IS ALSO THR REG)
LD C,(IY + 3) ; C := SIO CMD PORT
INC C ; BUMP TO DATA PORT
OUT (C),E ; SEND CHAR FROM E
XOR A ; SIGNAL SUCCESS
RET
@ -286,7 +313,7 @@ SIO_OUT:
;
;
SIO_IST:
LD A,(IY + 0) ; GET DEVICE NUMBER
LD A,(IY + 2) ; GET CHANNEL
OR A ; SET FLAGS
JR Z,SIOA_IST ; HANDLE CHANNEL A
DEC A ; TEST FOR NEXT DEVICE
@ -322,19 +349,44 @@ SIO_OST:
;
;
SIO_INITDEV:
HB_DI ; AVOID CONFLICTS
;
; PROGRAM THE SIO/2 CHIP CHANNEL
LD C,(IY + 3) ; COMMAND PORT
LD HL,SIO_INITVALS ; POINT TO INIT VALUES
LD B,SIO_INITLEN ; COUNT OF BYTES TO WRITE
OTIR ; WRITE ALL VALUES
;
; RESET THE RECEIVE BUFFER
LD E,(IY + 6)
LD D,(IY + 7) ; DE := _CNT
XOR A ; A := 0
LD (DE),A ; _CNT = 0
INC DE ; DE := ADR OF _HD
PUSH DE ; SAVE IT
INC DE
INC DE
INC DE
INC DE ; DE := ADR OF _BUF
POP HL ; HL := ADR OF _HD
LD (HL),E
INC HL
LD (HL),D ; _HD := _BUF
INC HL
LD (HL),E
INC HL
LD (HL),D ; _TL := _BUF
;
HB_EI ; READY FOR INTS AGAIN
XOR A ; SIGNAL SUCCESS
RET ; RETURN
;
;
SIO_INITVALS:
.DB $00, $18 ; WR0: CHANNEL RESET
.DB $04, $C4 ; WR4: CLK/64=115200 BAUD, NO PARITY, 1 STOP BIT
; .DB $01, $00 ; WR1: NO INTERRUPTS
.DB $01, $18 ; WR1: INTERRUPT ON ALL RECEIVE CHARACTERS
.DB $02, $04 ; WR2: INTERRUPT VECTOR OFFSET
.DB $02, IVT_SER0 ; WR2: INTERRUPT VECTOR OFFSET
.DB $03, $C1 ; WR3: 8 BIT RCV, RX ENABLE
.DB $05, $EA ; WR5: DTR, 8 BITS SEND, TX ENABLE, RTS
SIO_INITLEN .EQU $ - SIO_INITVALS
@ -422,38 +474,40 @@ SIO_STR_SIO .DB "SIO$"
SIO_DEV .DB 0 ; DEVICE NUM USED DURING INIT
;
; CHANNEL A RECEIVE BUFFER
SIOA_RCVBUF:
SIOA_CNT .DB 0 ; CHARACTERS IN RING BUFFER
SIOA_BUF .FILL 32,'%' ; RECEIVE RING BUFFER
SIOA_BUFEND .EQU $ ; END OF BUFFER
SIOA_BUFSZ .EQU $ - SIOA_BUF ; SIZE OF RING BUFFER
SIOA_HD .DW SIOA_BUF ; BUFFER HEAD POINTER
SIOA_TL .DW SIOA_BUF ; BUFFER TAIL POINTER
SIOA_BUF .FILL 32,0 ; RECEIVE RING BUFFER
SIOA_BUFEND .EQU $ ; END OF BUFFER
SIOA_BUFSZ .EQU $ - SIOA_BUF ; SIZE OF RING BUFFER
;
; CHANNEL B RECEIVE BUFFER
SIOB_RCVBUF:
SIOB_CNT .DB 0 ; CHARACTERS IN RING BUFFER
SIOB_BUF .FILL 32,'%' ; RECEIVE RING BUFFER
SIOB_BUFEND .EQU $ ; END OF BUFFER
SIOB_BUFSZ .EQU $ - SIOB_BUF ; SIZE OF RING BUFFER
SIOB_HD .DW SIOB_BUF ; BUFFER HEAD POINTER
SIOB_TL .DW SIOB_BUF ; BUFFER TAIL POINTER
SIOB_BUF .FILL 32,0 ; RECEIVE RING BUFFER
SIOB_BUFEND .EQU $ ; END OF BUFFER
SIOB_BUFSZ .EQU $ - SIOB_BUF ; SIZE OF RING BUFFER
;
; SIO PORT TABLE
;
SIO_CFG:
; SIO/2 CHANNEL A
.DB 0 ; DEVICE NUMBER (UPDATED DURING INIT)
.DB 0 ; SIO TYPE
.DB SIOA_DAT ; DATA PORT
.DB SIOA_CMD ; CMD PORT
.DB 0 ; DEVICE NUMBER (SET DURING INIT)
.DB 0 ; SIO TYPE (SET DURING INIT)
.DB 0 ; SIO CHANNEL (A)
.DB SIOA_CMD ; BASE PORT (CMD PORT)
.DW DEFSERCFG ; LINE CONFIGURATION
.FILL 2,$FF ; FILLER
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; SIO/2 CHANNEL B
.DB 0 ; DEVICE NUMBER (UPDATED DURING INIT)
.DB 0 ; SIO TYPE
.DB SIOB_DAT ; DATA PORT
.DB SIOB_CMD ; CMD PORT
.DB 0 ; DEVICE NUMBER (SET DURING INIT)
.DB 0 ; SIO TYPE (SET DURING INIT)
.DB 1 ; SIO CHANNEL (B)
.DB SIOB_CMD ; BASE PORT (CMD PORT)
.DW DEFSERCFG ; LINE CONFIGURATION
.FILL 2,$FF ; FILLER
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
SIO_CNT .EQU ($ - SIO_CFG) / 8

12
Source/HBIOS/std.asm

@ -165,6 +165,18 @@ IT_Z180 .EQU 2
IT_CTC .EQU 3
IT_RC .EQU 4
;
; INTERRUPT VECTOR TABLE ENTRY OFFSETS (Z180 COMPATIBLE)
;
IVT_INT1 .EQU 0
IVT_INT2 .EQU 2
IVT_TIM0 .EQU 4
IVT_TIM1 .EQU 6
IVT_DMA0 .EQU 8
IVT_DMA1 .EQU 10
IVT_CSIO .EQU 12
IVT_SER0 .EQU 14
IVT_SER1 .EQU 16
;
#INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE
;
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))

2
Source/HBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 8
#DEFINE RUP 6
#DEFINE RTP 0
#DEFINE BIOSVER "2.8.6"
#DEFINE BIOSVER "2.8.6-pre.0"

10
Source/HBIOS/z180.inc

@ -65,13 +65,3 @@ Z180_CBAR .EQU Z180_BASE + $3A ; MMU COMMON/BANK AREA REGISTER
;
Z180_OMCR .EQU Z180_BASE + $3E ; OPERATION MODE CONTROL
Z180_ICR .EQU $3F ; I/O CONTROL REGISTER (NOT RELOCATED!!!)
;
Z180_IVINT1 .EQU 0
Z180_IVINT2 .EQU 2
Z180_IVTIM0 .EQU 4
Z180_IVTIM1 .EQU 6
Z180_IVDMA0 .EQU 8
Z180_IVDMA1 .EQU 10
Z180_IVCSIO .EQU 12
Z180_IVSER0 .EQU 14
Z180_IVSER1 .EQU 16

BIN
Source/RomDsk/ROM_1024KB/SURVEY.COM

Binary file not shown.

BIN
Source/RomDsk/ROM_512KB/SURVEY.COM

Binary file not shown.
Loading…
Cancel
Save