mirror of https://github.com/wwarthen/RomWBW.git
22 changed files with 1635 additions and 125 deletions
@ -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 |
||||
|
|
||||
@ -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 |
||||
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue