mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Finalize v2.8.6 Prerelease 0
Adds ACIA support Adds IM1 interrupt chaining Fixes IDE SETFEAT issue
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
Normal file
723
Source/Apps/Survey.asm
Normal file
@@ -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
|
||||
|
||||
@@ -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,4 +2,4 @@
|
||||
#DEFINE RMN 8
|
||||
#DEFINE RUP 6
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.8.6"
|
||||
#DEFINE BIOSVER "2.8.6-pre.0"
|
||||
|
||||
@@ -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
Normal file
531
Source/HBIOS/acia.asm
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
;
|
||||
#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
|
||||
;
|
||||
#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
|
||||
;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
;LD HL,CPM_ENT ; CPM ENTRY VECTOR
|
||||
JP CPM_ENT ; CPM ENTRY VECTOR
|
||||
;
|
||||
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
|
||||
;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
|
||||
;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,4 +2,4 @@
|
||||
#DEFINE RMN 8
|
||||
#DEFINE RUP 6
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.8.6"
|
||||
#DEFINE BIOSVER "2.8.6-pre.0"
|
||||
|
||||
@@ -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
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user