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