mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
1221 lines
32 KiB
NASM
1221 lines
32 KiB
NASM
* SYSTEM SEGMENT: SYSTEM.IOP
|
||
* SYSTEM: ARIES-1
|
||
* CUSTOMIZED BY: RICHARD CONN
|
||
|
||
* PROGRAM: SYSIOP.ASM
|
||
* AUTHOR: RICHARD CONN
|
||
* VERSION: 1.0
|
||
* DATE: 22 FEB 84
|
||
* PREVIOUS VERSIONS: NONE
|
||
|
||
*---- Customize Section ----*
|
||
* Customization Performed Throughout Code
|
||
*---- End of Customize Section ----*
|
||
|
||
*****************************************************************
|
||
* *
|
||
* SYSIO -- Standard Set of Redirectable I/O Drivers *
|
||
* for ZCPR2 configured for Richard Conn's ARIES-1 System *
|
||
* *
|
||
* Feb 2, 1984 *
|
||
* *
|
||
* Note on Assembly: *
|
||
* This device driver package is to be assembled by MAC *
|
||
* (because of the macros) and configured into a file of type *
|
||
* IO by loading it at 100H via DDT or SID/ZSID and saving the *
|
||
* result as a COM file. Care should be taken to ensure that *
|
||
* the package is not larger than the device driver area which *
|
||
* is reserved for it in memory. *
|
||
* *
|
||
*****************************************************************
|
||
|
||
MACLIB Z3BASE ; Get Addresses
|
||
|
||
IOBYTE equ 3 ;I/O BYTE
|
||
INTIOBY equ 100$1$1$000B ;Initial I/O Byte Value
|
||
; LST:=TTY
|
||
; RDR:, PUN:=Clock
|
||
; CON:=CRT
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Disk Serial, MPU Serial, Quad I/O, and Modem Equates *
|
||
* *
|
||
*****************************************************************
|
||
|
||
; Disk Serial -- Serial Channel on Disk Controller Board (DCE)
|
||
; Baud Rate is set at 19,200 Baud in Hardware (DIP Switches)
|
||
ustat equ djeprom+3F9H ;USART Status Address
|
||
ostat equ 8 ;Output Status Bit (TBE)
|
||
istat equ 4 ;Input Status Bit (RDA)
|
||
|
||
; MPU Serial -- Serial Channel on CCS Z80 MPU Board (DCE)
|
||
mpubase equ 20H ;Base address of 8250 on CCS Z80 MPU Board
|
||
mpudata equ mpubase ;Data I/O Registers
|
||
mpudll equ mpubase ;Divisor Latch Low
|
||
mpudlh equ mpubase+1 ;Divisor Latch High
|
||
mpuier equ mpubase+1 ;Interrupt Enable Register
|
||
mpulcr equ mpubase+3 ;Line Control Register
|
||
mpupcr equ mpubase+4 ;Peripheral Control Register
|
||
mpustat equ mpubase+5 ;Line Status Register
|
||
mpupsr equ mpubase+6 ;Peripheral Status Register
|
||
|
||
; MPU Serial RDA and TBE
|
||
mpurda equ 1 ; Data Available Bit (RDA)
|
||
mputbe equ 20h ; Transmit Buffer Empty Bit (TBE)
|
||
|
||
; MPU Serial Baud Rate Values
|
||
bm00050 equ 2304 ; 50 Baud
|
||
bm00075 equ 1536 ; 75 Baud
|
||
bm00110 equ 1047 ; 110 Baud
|
||
bm00134 equ 857 ; 134.5 Baud
|
||
bm00150 equ 768 ; 150 Baud
|
||
bm00300 equ 384 ; 300 Baud
|
||
bm00600 equ 192 ; 600 Baud
|
||
bm01200 equ 96 ; 1200 Baud
|
||
bm01800 equ 64 ; 1800 Baud
|
||
bm02000 equ 58 ; 2000 Baud
|
||
bm02400 equ 48 ; 2400 Baud
|
||
bm03600 equ 32 ; 3600 Baud
|
||
bm04800 equ 24 ; 4800 Baud
|
||
bm07200 equ 16 ; 7200 Baud
|
||
bm09600 equ 12 ; 9600 Baud
|
||
bm19200 equ 6 ; 19200 Baud
|
||
bm38400 equ 3 ; 38400 Baud
|
||
bm56000 equ 2 ; 56000 Baud
|
||
|
||
; MPU Serial Channel Baud Rate
|
||
mpbrate equ bm09600 ; 9600 Baud for TTY
|
||
|
||
; Quad I/O Ports
|
||
qbase equ 80h ; Base address of Quad RS-232 I/O Board
|
||
q0data equ qbase ; USART 0 Data Port (DTE)
|
||
q0stat equ qbase+1 ; USART 0 Status Port
|
||
q1data equ qbase+2 ; USART 1 Data Port (DTE)
|
||
q1stat equ qbase+3 ; USART 1 Status Port
|
||
q2data equ qbase+4 ; USART 2 Data Port (DTE)
|
||
q2stat equ qbase+5 ; USART 2 Status Port
|
||
q3data equ qbase+6 ; USART 3 Data Port (DCE)
|
||
q3stat equ qbase+7 ; USART 3 Status Port
|
||
q0baud equ qbase+8 ; USART 0 Baud Rate Port
|
||
q1baud equ qbase+9 ; USART 1 Baud Rate Port
|
||
q2baud equ qbase+10 ; USART 2 Baud Rate Port
|
||
q3baud equ qbase+11 ; USART 3 Baud Rate Port
|
||
|
||
; Quad I/O RDA and TBE
|
||
qrda equ 2 ; Read Data Available Bit (RDA)
|
||
qtbe equ 1 ; Transmit Buffer Empty Bit (TBE)
|
||
|
||
*************************************
|
||
* Equate Values for PMMI as Modem *
|
||
*************************************
|
||
* Modem Ports (Special -- 300 or 600 Baud for PMMI)
|
||
*mods equ 0E0H ; Modem Status Byte
|
||
*modd equ 0E1H ; Modem Data Byte
|
||
*
|
||
* Modem RDA and TBE
|
||
*mrda equ 2 ; Read Data Available Bit (RDA)
|
||
*mtbe equ 1 ; Transmit Buffer Empty Bit (TBE)
|
||
*************************************
|
||
|
||
; Modem Ports set to QUAD I/O Port 2
|
||
mods equ q2stat ; Modem Status Port
|
||
modd equ q2data ; Modem Data Port
|
||
|
||
; Modem RDA and TBE
|
||
mrda equ qrda
|
||
mtbe equ qtbe
|
||
|
||
; Baud Rate Values
|
||
b00050 equ 0 ; 50 Baud
|
||
b00075 equ 1 ; 75 Baud
|
||
b00110 equ 2 ; 110 Baud
|
||
b00134 equ 3 ; 134.5 Baud
|
||
b00150 equ 4 ; 150 Baud
|
||
b00300 equ 5 ; 300 Baud
|
||
b00600 equ 6 ; 600 Baud
|
||
b01200 equ 7 ; 1200 Baud
|
||
b01800 equ 8 ; 1800 Baud
|
||
b02000 equ 9 ; 2000 Baud
|
||
b02400 equ 10 ; 2400 Baud
|
||
b03600 equ 11 ; 3600 Baud
|
||
b04800 equ 12 ; 4800 Baud
|
||
b07200 equ 13 ; 7200 Baud
|
||
b09600 equ 14 ; 9600 Baud
|
||
b19200 equ 15 ; 19200 Baud
|
||
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Baud Rates for Quad I/O Devices *
|
||
* *
|
||
*****************************************************************
|
||
|
||
q0brate equ b09600 ; 9600 Baud for Intersystem
|
||
q1brate equ b01200 ; 1200 Baud for Clock
|
||
q2brate equ b01200 ; 1200 Baud for Transmodem
|
||
q3brate equ b09600 ; 9600 Baud for NEC Printer
|
||
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Miscellaneous Constants *
|
||
* *
|
||
*****************************************************************
|
||
XON equ 11h ;X-ON
|
||
XOFF equ 13h ;X-OFF
|
||
CTRLZ equ 'Z'-'@' ;^Z
|
||
djram equ djeprom+400h ;Base of DJ RAM
|
||
djcin equ djram+3 ;DJ Console Input
|
||
djcout equ djram+6 ;DJ Console Output
|
||
|
||
*****************************************************************
|
||
* *
|
||
* The following are the Z80 Macro Definitions which are used to *
|
||
* define the Z80 Mnemonics used to implement the Z80 instruction*
|
||
* set extensions employed in CBIOSZ. *
|
||
* *
|
||
*****************************************************************
|
||
;
|
||
; MACROS TO PROVIDE Z80 EXTENSIONS
|
||
; MACROS INCLUDE:
|
||
;
|
||
$-MACRO ;FIRST TURN OFF THE EXPANSIONS
|
||
;
|
||
; JR - JUMP RELATIVE
|
||
; JRC - JUMP RELATIVE IF CARRY
|
||
; JRNC - JUMP RELATIVE IF NO CARRY
|
||
; JRZ - JUMP RELATIVE IF ZERO
|
||
; JRNZ - JUMP RELATIVE IF NO ZERO
|
||
; DJNZ - DECREMENT B AND JUMP RELATIVE IF NO ZERO
|
||
; LDIR - MOV @HL TO @DE FOR COUNT IN BC
|
||
; LXXD - LOAD DOUBLE REG DIRECT
|
||
; SXXD - STORE DOUBLE REG DIRECT
|
||
;
|
||
;
|
||
;
|
||
; @GENDD MACRO USED FOR CHECKING AND GENERATING
|
||
; 8-BIT JUMP RELATIVE DISPLACEMENTS
|
||
;
|
||
@GENDD MACRO ?DD ;;USED FOR CHECKING RANGE OF 8-BIT DISPLACEMENTS
|
||
IF (?DD GT 7FH) AND (?DD LT 0FF80H)
|
||
DB 100H ;Displacement Range Error on Jump Relative
|
||
ELSE
|
||
DB ?DD
|
||
ENDIF
|
||
ENDM
|
||
;
|
||
; Z80 MACRO EXTENSIONS
|
||
;
|
||
JR MACRO ?N
|
||
DB 18H
|
||
@GENDD ?N-$-1
|
||
ENDM
|
||
;
|
||
JRC MACRO ?N
|
||
DB 38H
|
||
@GENDD ?N-$-1
|
||
ENDM
|
||
;
|
||
JRNC MACRO ?N
|
||
DB 30H
|
||
@GENDD ?N-$-1
|
||
ENDM
|
||
;
|
||
JRZ MACRO ?N
|
||
DB 28H
|
||
@GENDD ?N-$-1
|
||
ENDM
|
||
;
|
||
JRNZ MACRO ?N
|
||
DB 20H
|
||
@GENDD ?N-$-1
|
||
ENDM
|
||
;
|
||
DJNZ MACRO ?N
|
||
DB 10H
|
||
@GENDD ?N-$-1
|
||
ENDM
|
||
;
|
||
LDIR MACRO
|
||
DB 0EDH,0B0H
|
||
ENDM
|
||
;
|
||
LDED MACRO ?N
|
||
DB 0EDH,05BH
|
||
DW ?N
|
||
ENDM
|
||
;
|
||
LBCD MACRO ?N
|
||
DB 0EDH,4BH
|
||
DW ?N
|
||
ENDM
|
||
;
|
||
SDED MACRO ?N
|
||
DB 0EDH,53H
|
||
DW ?N
|
||
ENDM
|
||
;
|
||
SBCD MACRO ?N
|
||
DB 0EDH,43H
|
||
DW ?N
|
||
ENDM
|
||
;
|
||
; END OF Z80 MACRO EXTENSIONS
|
||
;
|
||
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Terminal driver routines. Iobyte is initialized by the cold *
|
||
* boot routine, to modify, change the "intioby" equate. The *
|
||
* I/O routines that follow all work exactly the same way. Using *
|
||
* iobyte, they obtain the address to jump to in order to execute*
|
||
* the desired function. There is a table with four entries for *
|
||
* each of the possible assignments for each device. To modify *
|
||
* the I/O routines for a different I/O configuration, just *
|
||
* change the entries in the tables. *
|
||
* *
|
||
*****************************************************************
|
||
|
||
org iop ;Base Address of I/O Drivers
|
||
offset equ 100h-iop ;Offset for load via DDT or ZSID
|
||
|
||
jmp status ;Internal Status Routine
|
||
jmp select ;Device Select Routine
|
||
jmp namer ;Device Name Routine
|
||
|
||
jmp tinit ;Initialize Terminal
|
||
|
||
jmp const ;Console Input Status
|
||
jmp conin ;Console Input Char
|
||
jmp conout ;Console Output Char
|
||
|
||
jmp list ;List Output Char
|
||
|
||
jmp punch ;Punch Output Char
|
||
|
||
jmp reader ;Reader Input Char
|
||
|
||
jmp listst ;List Output Status
|
||
|
||
jmp newio ;New I/O Driver Installation Routine
|
||
|
||
jmp copen ;Open CON: Disk File
|
||
jmp cclose ;Close CON: Disk File
|
||
|
||
jmp lopen ;Open LST: Disk File
|
||
jmp lclose ;Close LST: Disk File
|
||
|
||
*
|
||
* I/O Package Identification
|
||
*
|
||
db 'Z3IOP' ;Read by Z3LOADER
|
||
|
||
*****************************************************************
|
||
* *
|
||
* status: return information on devices supported by this *
|
||
* I/O Package. On exit, HL points to a logical device *
|
||
* table which is structured as follows: *
|
||
* Device Count Byte Current Assignment Byte *
|
||
* ------ ---------- ----------------------- *
|
||
* CON: 0 1 *
|
||
* RDR: 2 3 *
|
||
* PUN: 4 5 *
|
||
* LST: 6 7 *
|
||
* *
|
||
* If error or no I/O support, return with Zero Flag Set. *
|
||
* Also, if no error, A=Driver Module Number *
|
||
* *
|
||
*****************************************************************
|
||
status:
|
||
lxi h,cnttbl ;point to table
|
||
mvi a,81H ;Module 1 (SYSIO) with Disk Output
|
||
ora a ;Set Flags
|
||
ret
|
||
|
||
|
||
*****************************************************************
|
||
* *
|
||
* select: select devices indicated by B and C. B is the number *
|
||
* of the logical device, where CON:=0, RDR:=1, PUN:=2, *
|
||
* LST:=3, and C is the desired device (range 0 to dev-1). *
|
||
* Return with Zero Flag Set if Error. *
|
||
* *
|
||
*****************************************************************
|
||
ranger:
|
||
lxi h,cnttbl-2 ;check for error
|
||
inr b ;range of 1 to 4
|
||
mov a,b ;Value in A
|
||
cpi 5 ;B out of range?
|
||
jnc rangerr
|
||
push b ;save params
|
||
rang:
|
||
inx h ;pt to next
|
||
inx h
|
||
djnz rang
|
||
mov b,m ;get count in b
|
||
mov a,c ;get selected device number
|
||
cmp b ;compare (C must be less than B)
|
||
pop b ;get params
|
||
jrnc rangerr ;range error if C >= B
|
||
rangok:
|
||
xra a ;OK
|
||
dcr a ;set flags (0FFH and NZ)
|
||
ret
|
||
rangerr:
|
||
xra a ;not OK (Z)
|
||
ret
|
||
select:
|
||
call ranger ;check for range error
|
||
rz ;abort if error
|
||
inx h ;pt to current entry number
|
||
mov m,c ;save selected number there
|
||
lxi h,cfgtbl-2 ;pt to configuration table
|
||
sel2:
|
||
inx h ;Pt to Entry in Configuration Table
|
||
inx h
|
||
djnz sel2
|
||
mov b,m ;Get Rotate Count
|
||
inx h ;Pt to Select Mask
|
||
mov d,m ;Get Select Mask
|
||
mov a,b ;Any Rotation to do?
|
||
ora a
|
||
jz sel4
|
||
mov a,c ;Get Selected Number
|
||
sel3:
|
||
rlc ;Rotate Left 1 Bit
|
||
djnz sel3
|
||
mov c,a ;Place Bit Pattern Back in C
|
||
sel4:
|
||
lda iobyte ;get I/O byte
|
||
ana d ;mask out old selection
|
||
ora c ;mask in new selection
|
||
sta iobyte ;put I/O byte
|
||
jr rangok ;range OK
|
||
|
||
*****************************************************************
|
||
* *
|
||
* namer: return text string of physical device. Logical device *
|
||
* number is in B and physical selection is in C. *
|
||
* HL is returned pointing to the first character of the *
|
||
* string. The strings are structured to begin with a *
|
||
* device name followed by a space and then a description *
|
||
* string which is terminated by a binary 0. *
|
||
* *
|
||
* Return with Zero Flag Set if error. *
|
||
* *
|
||
*****************************************************************
|
||
namer:
|
||
call ranger ;check for range error
|
||
rz ;return if so
|
||
lxi h,namptbl-2 ;pt to name ptr table
|
||
call namsel ;select ptr table entry
|
||
mov b,c ;physical selection number in B now
|
||
inr b ;Add 1 for Initial Increment
|
||
call namsel ;point to string
|
||
jr rangok ;return with HL pointing and range OK
|
||
;
|
||
; Select entry B in table pted to by HL; this entry is itself a pointer,
|
||
; and return with it in HL
|
||
;
|
||
namsel:
|
||
inx h ;pt to next entry
|
||
inx h
|
||
djnz namsel
|
||
mov a,m ;get low
|
||
inx h
|
||
mov h,m ;get high
|
||
mov l,a ;HL now points to entry
|
||
ret
|
||
|
||
*****************************************************************
|
||
* *
|
||
* const: get the status for the currently assigned console. *
|
||
* The I/O Byte is used to select the device. *
|
||
* *
|
||
*****************************************************************
|
||
const:
|
||
lxi h,cstble ;Beginning of jump table
|
||
conmask:
|
||
lxi d,cfgtbl ;Pt to First Entry in Config Table
|
||
jr seldev ;Select correct jump
|
||
|
||
*****************************************************************
|
||
* *
|
||
* conin: input a character from the currently assigned console. *
|
||
* The I/O Byte is used to select the device. *
|
||
* *
|
||
*****************************************************************
|
||
conin:
|
||
lxi h,citble ;Beginning of character input table
|
||
jr conmask ;Get Console Mask
|
||
|
||
*****************************************************************
|
||
* *
|
||
* conout: output the character in C to the currently assigned *
|
||
* console. The I/O Byte is used to select the device. *
|
||
* *
|
||
*****************************************************************
|
||
conout:
|
||
lxi h,cotble ;Beginning of the character out table
|
||
call crout ;output to console recorder if set
|
||
jr conmask ;Get Console Mask
|
||
|
||
*****************************************************************
|
||
* *
|
||
* csreader: get the status of the currently assigned reader. *
|
||
* The I/O Byte is used to select the device. *
|
||
* *
|
||
*****************************************************************
|
||
csreadr:
|
||
lxi h,csrtble ;Beginning of reader status table
|
||
rdrmask:
|
||
lxi d,cfgtbl+2 ;Pt to 2nd Entry in Config Table
|
||
jr seldev
|
||
|
||
*****************************************************************
|
||
* *
|
||
* reader: input a character from the currently assigned reader. *
|
||
* The I/O Byte is used to select the device. *
|
||
* *
|
||
*****************************************************************
|
||
reader:
|
||
lxi h,rtble ;Beginning of reader input table
|
||
jr rdrmask ;Get the Mask and Go
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Entry at seldev will form an offset into the table pointed *
|
||
* to by H&L and then pick up the address and jump there. *
|
||
* The configuration of the physical device assignments is *
|
||
* pointed to by D&E (cfgtbl entry). *
|
||
* *
|
||
*****************************************************************
|
||
seldev:
|
||
push b ;Save Possible Char in C
|
||
ldax d ;Get Rotate Count
|
||
mov b,a ;... in B
|
||
inx d ;Pt to Mask
|
||
ldax d ;Get Mask
|
||
cma ;Flip Bits
|
||
mov c,a ;... in C
|
||
lda iobyte ;Get I/O Byte
|
||
ana c ;Mask Out Selection
|
||
inr b ;Increment Rotate Count
|
||
seld1:
|
||
dcr b ;Count down
|
||
jrz seld2
|
||
rrc ;Rotate Right one Bit
|
||
jr seld1
|
||
seld2:
|
||
rlc ;Double Number for Table Offset
|
||
mvi d,0 ;Form offset
|
||
mov e,a
|
||
dad d ;Add offset
|
||
mov a,m ;Pick up low byte
|
||
inx h
|
||
mov h,m ;Pick up high byte
|
||
mov l,a ;Form address
|
||
pop b ;Get Possible Char in C
|
||
pchl ;Go there !
|
||
|
||
*****************************************************************
|
||
* *
|
||
* punch: output char in C to the currently assigned punch *
|
||
* device. The I/O Byte is used to select the device. *
|
||
* *
|
||
*****************************************************************
|
||
punch:
|
||
lxi h,ptble ;Beginning of punch table
|
||
lxi d,cfgtbl+4 ;Get Mask
|
||
jr seldev ;Select Device and Go
|
||
|
||
*****************************************************************
|
||
* *
|
||
* list: output char in C to the currently assigned list device. *
|
||
* The I/O Byte is used to select the device. *
|
||
* *
|
||
*****************************************************************
|
||
list:
|
||
lxi h,ltble ;Beginning of the list device routines
|
||
call lrout ;output to list recorder if set
|
||
lstmask:
|
||
lxi d,cfgtbl+6 ;Get Mask
|
||
jr seldev ;Select Device and Go
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Listst: get the output status of the currently assigned list *
|
||
* device. The I/O Byte is used to select the device. *
|
||
* *
|
||
*****************************************************************
|
||
listst:
|
||
lxi h,lstble ;Beginning of the list device status
|
||
jr lstmask ;Mask and Go
|
||
|
||
*****************************************************************
|
||
* *
|
||
* If customizing I/O routines is being performed, the tables *
|
||
* below should be modified to reflect the changes. All I/O *
|
||
* devices are decoded out of iobyte and the jump is taken from *
|
||
* the following tables. *
|
||
* *
|
||
*****************************************************************
|
||
|
||
*****************************************************************
|
||
* *
|
||
* I/O Driver Support Specification Tables *
|
||
* *
|
||
*****************************************************************
|
||
|
||
*
|
||
* Device Counts
|
||
* First Byte is Number of Devices, 2nd Byte is Selected Device
|
||
*
|
||
cnttbl:
|
||
db 6,(intioby AND 7) ;CON:
|
||
db 2,(intioby AND 08h) SHR 3 ;RDR:
|
||
db 2,(intioby AND 10h) SHR 4 ;PUN:
|
||
db 6,(intioby AND 0E0h) SHR 5 ;LST:
|
||
|
||
*
|
||
* Configuration Table
|
||
* First Byte is Rotate Count, 2nd Byte is Mask
|
||
*
|
||
cfgtbl:
|
||
db 0,111$1$1$000b ;No Rotate, Mask Out 3 LSB
|
||
db 3,111$1$0$111b ;3 Rotates, Mask Out Bit 3
|
||
db 4,111$0$1$111b ;4 Rotates, Mask Out Bit 4
|
||
db 5,000$1$1$111b ;5 Rotates, Mask Out 3 MSB
|
||
|
||
*
|
||
* name text tables
|
||
*
|
||
namptbl:
|
||
dw conname-2 ;CON:
|
||
dw rdrname-2 ;RDR:
|
||
dw punname-2 ;PUN:
|
||
dw lstname-2 ;LST:
|
||
|
||
conname:
|
||
dw namcrt ;CRT
|
||
dw namusr ;CRT and Modem in Parallel
|
||
dw namusr1 ;CRT Input and CRT/Remote Computer Output
|
||
dw namusr2 ;CRT Input and CRT/Modem Output
|
||
dw namcrtt ;CRT Input and CRT/TTY Printer Output
|
||
dw namcrtn ;CRT Input and CRT/NEC Printer Output
|
||
|
||
lstname:
|
||
dw namtty ;TTY
|
||
dw namcrt ;CRT
|
||
dw namrem ;Remote Computer
|
||
dw nammod ;Modem
|
||
dw nammpu ;MPU
|
||
dw nammpu8 ;MPU with 8 Bits
|
||
|
||
rdrname:
|
||
dw nammod ;Modem
|
||
dw namclk ;Clock
|
||
|
||
punname:
|
||
dw nammod ;Modem
|
||
dw namclk ;Clock
|
||
|
||
nammpu:
|
||
db 'TTY Toshiba P1350 Printer',0
|
||
nammpu8:
|
||
db 'TTY8 TTY with 8th Sig Bit',0
|
||
namtty:
|
||
db 'NEC NEC 3510 LQ Printer',0
|
||
namcrt:
|
||
db 'CRT TVI 950 CRT',0
|
||
namcrtn:
|
||
db 'CRTNEC CRT Input and CRT/NEC Printer Output',0
|
||
namcrtt:
|
||
db 'CRTTY CRT Input and CRT/TTY Printer Output',0
|
||
namusr:
|
||
db 'CRTMOD CRT and Modem in Parallel',0
|
||
namusr1:
|
||
db 'CRTREM CRT Input and CRT/Remote Output',0
|
||
namusr2:
|
||
db 'CRTMOD2 CRT Input and CRT/Modem Output',0
|
||
namrem:
|
||
db 'REMOTE Remote Computer',0
|
||
nammod:
|
||
db 'MODEM Transmodem 1200',0
|
||
namclk:
|
||
db 'CLOCK DC Hayes Chronograph',0
|
||
|
||
*
|
||
* console input table
|
||
*
|
||
citble:
|
||
dw cicrt ;Input from crt (000)
|
||
dw ciusr ;Input from crt and modem (001)
|
||
dw cicrt ;Input from crt (010)
|
||
dw cicrt ;Input from crt (011)
|
||
dw cicrt ;Input from crt (100)
|
||
dw cicrt ;Input from crt (101)
|
||
|
||
*
|
||
* console output table
|
||
*
|
||
cotble:
|
||
dw cocrt ;Output to crt (000)
|
||
dw cousr ;Output to crt and modem (001)
|
||
dw cousr1 ;Output to crt and remote system (010)
|
||
dw cousr ;Output to crt and modem (011)
|
||
dw cocrtt ;Output to crt and TTY printer (100)
|
||
dw cocrtn ;Output to crt and NEC printer (101)
|
||
|
||
*
|
||
* list device table
|
||
*
|
||
ltble:
|
||
dw cotty ;Output to tty (000)
|
||
dw cocrt ;Output to crt (001)
|
||
dw corem ;Output to remote system (010)
|
||
dw comod ;Output to modem (011)
|
||
dw compu ;Output to mpu (100)
|
||
dw compu8 ;Output to mpu (101)
|
||
|
||
*
|
||
* punch device table
|
||
*
|
||
|
||
ptble:
|
||
dw comod ;Output to modem (0)
|
||
dw coclk ;Output to clock (1)
|
||
|
||
*
|
||
* reader device table
|
||
*
|
||
rtble:
|
||
dw cimod ;Input from modem (0)
|
||
dw ciclk ;Input from clock (1)
|
||
|
||
*
|
||
* console status table
|
||
*
|
||
cstble:
|
||
dw cscrt ;Status from crt (000)
|
||
dw csusr ;Status from crt and modem (001)
|
||
dw cscrt ;Status from crt (010)
|
||
dw cscrt ;Status from crt (011)
|
||
dw cscrt ;Status from crt (100)
|
||
dw cscrt ;Status from crt (101)
|
||
|
||
*
|
||
* status from reader device
|
||
*
|
||
csrtble:
|
||
dw csmod ;Status from modem (0)
|
||
dw csclk ;Status from clock (1)
|
||
|
||
*
|
||
* Status from list device
|
||
*
|
||
lstble:
|
||
dw costty ;Status from tty (000)
|
||
dw coscrt ;Status from crt (001)
|
||
dw cosrem ;Status from remote system (010)
|
||
dw cosmod ;Status from modem (011)
|
||
dw cosmpu ;Status from mpu (100)
|
||
dw cosmpu ;Status from mpu (101)
|
||
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Tinit can be modified for different I/O setups. *
|
||
* *
|
||
*****************************************************************
|
||
tinit: ;Initialize the terminal routine
|
||
|
||
; Initialize I/O Byte
|
||
mvi a,intioby ;Initialize IOBYTE
|
||
sta iobyte
|
||
|
||
; Initialize MPU Serial I/O Channel Characteristics and Baud Rate
|
||
mvi a,10$00$00$11b ;Access Divisor:
|
||
; 10 -- Set divisor latch, clear break
|
||
; 00 -- 0 parity bit, odd parity (N/A)
|
||
; 00 -- disable parity, 1 stop bit
|
||
; 11 -- 8 Data Bits
|
||
out mpulcr ;To Line Control Register
|
||
lxi h,mpbrate ;HL = MPU Channel Baud Rate
|
||
mov a,l ;Set Low-Byte of Baud Rate
|
||
out mpudll ;To Divisor Latch Low
|
||
mov a,h ;Set High-Byte of Baud Rate
|
||
out mpudlh ;To Divisor Latch High
|
||
mvi a,00$00$00$11b ;Reset Divisor Access and Set Characteristics:
|
||
; 00 -- Clear divisor latch, clear break
|
||
; 00 -- 0 parity bit, odd parity (N/A)
|
||
; 00 -- disable parity, 1 stop bit
|
||
; 11 -- 8 Data Bits
|
||
out mpulcr ;To Line Control Register
|
||
xra a ;A=0
|
||
out mpuier ;Disable All Interrupts in Interrupt Register
|
||
out mpustat ;Clear All Error Flags in Line Status Register
|
||
mvi a,0000$1111b ;3 Zeroes, No Loop, 1, Set RLSD, CTS, DSR
|
||
out mpupcr ;To Peripheral Control Register
|
||
|
||
; Initialize Quad I/O Channel Characteristics
|
||
mvi a,10$11$01$11b ;General-Purpose Reset:
|
||
; 10 -- 1 1/2 Stop Bits
|
||
; 11 -- Even Parity, Enable Parity
|
||
; 01 -- 6 Bits/Char
|
||
; 11 -- 64x Baud Rate
|
||
call setquad ;Set All 4 Quad I/O Ports
|
||
mvi a,01$11$01$11b ;General-Purpose Reset:
|
||
; 01 -- Disable Hunt, Internal Reset
|
||
; 11 -- RTS High, Error Reset
|
||
; 01 -- No Break, Enable RxRDY
|
||
; 11 -- NOT DTR High, Enable TxEN
|
||
call setquad ;Set All 4 Quad I/O Ports
|
||
mvi a,11$00$11$10b ;Characteristics Set for All:
|
||
; 11 -- 2 Stop Bits
|
||
; 00 -- No Parity
|
||
; 11 -- 8 Bits/Char
|
||
; 10 -- 16x Baud Rate
|
||
call setquad ;Set All 4 Quad I/O Ports
|
||
mvi a,00$11$01$11b ;Characteristics Set for All:
|
||
; 00 -- Disable Hunt, No Internal Reset
|
||
; 11 -- RTS High, Error Reset
|
||
; 01 -- No Break, Enable RxRDY
|
||
; 11 -- NOT DTR High, Enable TxEN
|
||
call setquad ;Set All 4 Quad I/O Ports
|
||
|
||
; Initialize Quad I/O Baud Rates
|
||
mvi a,q0brate ;Set USART 0 Baud Rate
|
||
out q0baud
|
||
mvi a,q1brate ;Set USART 1 Baud Rate
|
||
out q1baud
|
||
mvi a,q2brate ;Set USART 2 Baud Rate
|
||
out q2baud
|
||
mvi a,q3brate ;Set USART 3 Baud Rate
|
||
out q3baud
|
||
|
||
; Set All Recording OFF
|
||
xra a ;A=0
|
||
sta crecord ;console
|
||
sta lrecord ;list device
|
||
|
||
; Clear Garbage Char from CRT
|
||
call cscrt ;Gobble up unwanted char
|
||
ora a ;A=0 if none
|
||
cnz cicrt ;Grab character
|
||
ret
|
||
|
||
; Set All Quad I/O Control Ports
|
||
setquad:
|
||
out q0stat ;USART 0
|
||
out q1stat ;USART 1
|
||
out q2stat ;USART 2
|
||
out q3stat ;USART 3
|
||
xthl ;Long Delay
|
||
xthl
|
||
ret
|
||
|
||
|
||
*****************************************************************
|
||
* *
|
||
* NEWIO -- Set UC1: Device to the Device Drivers whose Jump *
|
||
* Table is Pointed to by HL *
|
||
* *
|
||
* This Jump Table is structured as follows: *
|
||
* JMP ISTAT <-- Input Status (0=No Char, 0FFH=Char) *
|
||
* JMP INPUT <-- Input Character *
|
||
* JMP OUTPUT <-- Output Character in C *
|
||
* *
|
||
* The Base Address of this Jump Table (JBASE) is passed to *
|
||
* NEWIO in the HL Register Pair. *
|
||
* *
|
||
*****************************************************************
|
||
newio:
|
||
shld cstble+6 ;Set UC1: Input Status
|
||
lxi d,3 ;Prepare for offset to next jump
|
||
dad d ;HL points to next jump
|
||
shld citble+6 ;Set UC1: Input Character
|
||
dad d ;HL points to next jump
|
||
shld cotble+6 ;Set UC1: Output Character
|
||
ret
|
||
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Input Status, Input Character, and Output Character *
|
||
* Subroutines for CP/M *
|
||
* *
|
||
*****************************************************************
|
||
* *
|
||
* Input Status -- *
|
||
* These routines return 0 in the A Register if no input *
|
||
* data is available, 0FFH if input data is available. *
|
||
* *
|
||
* Input Character -- *
|
||
* These routines return the character (byte) in the A *
|
||
* Register. MSB is masked off. *
|
||
* *
|
||
* Output Character -- *
|
||
* These routines output the character (byte) in the C *
|
||
* Register. *
|
||
* *
|
||
*****************************************************************
|
||
|
||
*****************************************************************
|
||
* *
|
||
* CRT Input Status, Input Character, and Output Character *
|
||
* *
|
||
*****************************************************************
|
||
|
||
cscrt equ $ ;CRT Input Status
|
||
lda ustat ;Get Status
|
||
cma ;Inverted Logic
|
||
ani istat ;Mask for input status and fall thru to 'STAT'
|
||
jr stat ;Set Flags
|
||
|
||
coscrt equ $ ;CRT Output Status
|
||
lda ustat ;Get USART status
|
||
cma ;Inverted Logic
|
||
ani ostat ;Mask for output status
|
||
jr stat ;Return
|
||
|
||
cicrt equ $ ;CRT Input
|
||
jmp djcin ;Get char
|
||
|
||
cocrt equ $ ;CRT Output
|
||
jmp djcout ;Put char
|
||
|
||
cocrtt equ $ ;CRT and TTY Printer Output
|
||
push b ;Save char
|
||
call djcout ;CRT Output
|
||
pop b ;Get char
|
||
jmp compu ;Printer Output
|
||
|
||
cocrtn equ $ ;CRT and NEC Printer Output
|
||
push b ;Save char
|
||
call djcout ;CRT Output
|
||
pop b ;Get char
|
||
jmp cotty ;Printer Output
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Modem Input Status, Input Character, and Output Character *
|
||
* *
|
||
*****************************************************************
|
||
|
||
csmod equ $ ;Modem Input Status
|
||
in mods
|
||
ani mrda ;Data available?
|
||
jr stat
|
||
|
||
cosmod equ $ ;Modem Output Status
|
||
in mods ;Get status
|
||
ani mtbe ;TBE?
|
||
jr stat
|
||
|
||
cimod equ $ ;Modem Input Character
|
||
call csmod ;RDA?
|
||
jrz cimod
|
||
in modd ;Get data
|
||
ani 7fh ;Mask
|
||
ret
|
||
|
||
comod equ $ ;Modem Output
|
||
call cosmod ;TBE?
|
||
jrz comod
|
||
mov a,c ;Get char
|
||
out modd ;Put data
|
||
ret
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Clock Input Status, Input Character, and Output Character *
|
||
* *
|
||
*****************************************************************
|
||
|
||
csclk equ $ ;TTY Input Status
|
||
in q1stat ;Get Status
|
||
ani qrda ;Data available?
|
||
jr stat
|
||
|
||
cosclk equ $ ;TTY Output Status
|
||
in q1stat ;Get Status
|
||
ani qtbe ;TBE?
|
||
jr stat
|
||
|
||
ciclk equ $ ;TTY Input Character
|
||
call csclk ;RDA?
|
||
jrz ciclk
|
||
in q1data ;Get data
|
||
ani 7fh ;Mask
|
||
ret
|
||
|
||
coclk equ $ ;TTY Output Character
|
||
call cosclk ;TBE?
|
||
jrz coclk
|
||
mov a,c ;Get data
|
||
out q1data ;Put data
|
||
ret
|
||
|
||
*****************************************************************
|
||
* *
|
||
* This is a common return point to correctly set the return *
|
||
* status flags; it is centrally located for the jump *
|
||
* relative instructions *
|
||
* *
|
||
*****************************************************************
|
||
stat:
|
||
rz ;Nothing found
|
||
ready:
|
||
mvi a,0ffh ;Set A for negative status
|
||
ret
|
||
|
||
*****************************************************************
|
||
* *
|
||
* NEC Input Status, Input Character, and Output Character *
|
||
* X-OFF Processing Added *
|
||
* *
|
||
*****************************************************************
|
||
|
||
cstty equ $ ;TTY Input Status
|
||
in q3stat ;Get Status
|
||
ani qrda ;Data available?
|
||
jr stat
|
||
|
||
costty equ $ ;TTY Output Status
|
||
in q3stat ;Get Status
|
||
ani qtbe ;TBE?
|
||
jr stat
|
||
|
||
citty equ $ ;TTY Input Character
|
||
call cstty ;RDA?
|
||
jrz citty
|
||
in q3data ;Get data
|
||
ani 7fh ;Mask
|
||
ret
|
||
|
||
cotty equ $ ;TTY Output Character
|
||
call cstty ;Any character?
|
||
jrnz cotty2 ;Process if so
|
||
cotty1:
|
||
call costty ;TBE?
|
||
jrz cotty1
|
||
mov a,c ;Get data
|
||
out q3data ;Put data
|
||
ret
|
||
cotty2:
|
||
call citty ;X-OFF?
|
||
cpi XOFF ;Do nothing if not X-OFF
|
||
jrnz cotty1
|
||
call citty ;Wait for next char
|
||
jr cotty1
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Remote System Input Status, Input Character, and Output *
|
||
* Character *
|
||
* *
|
||
*****************************************************************
|
||
|
||
csrem equ $ ;TTY Input Status
|
||
in q0stat ;Get Status
|
||
ani qrda ;Data available?
|
||
jr stat
|
||
|
||
cosrem equ $ ;TTY Output Status
|
||
in q0stat ;Get Status
|
||
ani qtbe ;TBE?
|
||
jr stat
|
||
|
||
cirem equ $ ;TTY Input Character
|
||
call csrem ;RDA?
|
||
jrz cirem
|
||
in q0data ;Get data
|
||
ani 7fh ;Mask
|
||
ret
|
||
|
||
corem equ $ ;TTY Output Character
|
||
call coxoff ;Check for XOFF and process
|
||
call cosrem ;TBE?
|
||
jrz corem
|
||
mov a,c ;Get data
|
||
out q0data ;Put data
|
||
ret
|
||
|
||
coxoff equ $ ;Remote XOFF Check and Processing
|
||
call csrem ;Input Char from LST: Device?
|
||
rz ;Zero if none
|
||
call cirem ;Get Char
|
||
cpi XOFF ;XOFF?
|
||
rnz ;Return if not
|
||
call cirem ;Wait for Any Other Char
|
||
ret
|
||
|
||
*****************************************************************
|
||
* *
|
||
* TTY Input Status, Input Character, and Output Character *
|
||
* X-OFF Processing Added *
|
||
* *
|
||
*****************************************************************
|
||
|
||
csmpu equ $ ;TTY Input Status
|
||
in mpustat ;Get Status
|
||
ani mpurda ;Data available?
|
||
jr stat
|
||
|
||
cosmpu equ $ ;TTY Output Status
|
||
in mpustat ;Get Status
|
||
ani mputbe ;TBE?
|
||
jr stat
|
||
|
||
cimpu equ $ ;TTY Input Character
|
||
call csmpu ;RDA?
|
||
jrz cimpu
|
||
in mpudata ;Get data
|
||
ani 7fh ;Mask
|
||
ret
|
||
|
||
compu8 equ $ ;TTY Output Character (8 Sig Bits)
|
||
mvi a,0ffh ;8th Bit Allowed
|
||
jr compu0
|
||
compu equ $ ;TTY Output Character
|
||
mvi a,07fh ;No 8th Bit
|
||
compu0:
|
||
sta mpumask
|
||
call csmpu ;Any character?
|
||
jrnz compu2 ;Process if so
|
||
compu1:
|
||
call cosmpu ;TBE?
|
||
jrz compu1
|
||
mov a,c ;Get data
|
||
ani 0ffh ;Mask
|
||
mpumask equ $-1 ;Address of Mask
|
||
out mpudata ;Put data
|
||
ret
|
||
compu2:
|
||
call cimpu ;X-OFF?
|
||
cpi XOFF ;Do nothing if not X-OFF
|
||
jrnz compu1
|
||
call cimpu ;Wait for next char
|
||
jr compu1
|
||
|
||
*****************************************************************
|
||
* *
|
||
* User-Defined (CRT and Modem) Input Status, Input Character, *
|
||
* and Output Character *
|
||
* *
|
||
*****************************************************************
|
||
|
||
csusr equ $ ;User (CRT and Modem) Input Status
|
||
call cscrt ;Input from CRT?
|
||
rnz ;Char found
|
||
call csmod ;Input from Modem?
|
||
ret
|
||
|
||
cosusr equ cosmod ;Output status same as modem since modem is slower
|
||
|
||
ciusr equ $ ;Modem/CRT Input Combination
|
||
call cscrt ;Input from CRT?
|
||
jnz cicrt ;Get char from CRT
|
||
call csmod ;Input from Modem?
|
||
jnz cimod ;Get char from Modem
|
||
jr ciusr ;Continue
|
||
|
||
cousr equ $ ;Modem/CRT Output Combination
|
||
call comod ;Output to Modem
|
||
jmp cocrt ;Output to CRT
|
||
|
||
ciusr1 equ $ ;Modem/CRT Input w/CRT Output Combination
|
||
call ciusr ;Get char
|
||
push psw ;Save char in A
|
||
mov c,a ;Char in C
|
||
call cocrt ;Output to CRT
|
||
pop psw ;Restore char in A
|
||
ret
|
||
|
||
cousr1 equ $ ;Remote System/CRT Output Combination
|
||
call corem ;Output to Remote System
|
||
jmp cocrt ;Output to CRT
|
||
|
||
*****************************************************************
|
||
* *
|
||
* Record Output Routines *
|
||
* CROUT - Console Recorder *
|
||
* LROUT - List Recorder *
|
||
* *
|
||
*****************************************************************
|
||
|
||
crout equ $
|
||
lda crecord ;get flag
|
||
ora a ;test flag for 0 (no recording)
|
||
rz
|
||
mov a,c ;check char
|
||
ani 7fh
|
||
cpi ctrlz ;don't allow ^Z
|
||
rz
|
||
jmp corem ;remote output if flag set
|
||
|
||
lrout equ $
|
||
lda lrecord ;get flag
|
||
ora a ;test flag for 0 (no recording)
|
||
rz
|
||
mov a,c ;check char
|
||
ani 7fh
|
||
cpi ctrlz ;don't allow ^Z
|
||
rz
|
||
jmp corem ;remote output if flag set
|
||
|
||
;
|
||
; COPEN -- Open Console File for Output
|
||
; LOPEN -- Open Printer File for Output
|
||
;
|
||
; Turn Appropriate Flag ON
|
||
;
|
||
copen:
|
||
mvi a,0ffh ;set flag
|
||
jr ccrset
|
||
lopen:
|
||
mvi a,0ffh ;set flag
|
||
jr lcrset
|
||
|
||
;
|
||
; Close Disk Files
|
||
; CCLOSE -- CON file (DSK1)
|
||
; LCLOSE -- LST file (DSK2)
|
||
;
|
||
; Send ^Z to Terminate File Recording and Zero Appropriate Flag
|
||
;
|
||
cclose:
|
||
mvi c,ctrlz ;send ctrlz
|
||
call corem
|
||
xra a
|
||
ccrset:
|
||
sta crecord ;set flag off
|
||
ret
|
||
lclose:
|
||
mvi c,ctrlz ;send ctrlz
|
||
call corem
|
||
xra a
|
||
lcrset:
|
||
sta lrecord ;set flag off
|
||
ret
|
||
|
||
;
|
||
; Recording Buffers
|
||
;
|
||
crecord:
|
||
ds 1 ;console device
|
||
lrecord:
|
||
ds 1 ;list device
|
||
|
||
;
|
||
; Test for Size Error
|
||
;
|
||
if ($ GT (IOP + IOPS*128))
|
||
sizerr equ novalue ;IOP is too large for buffer
|
||
endif
|
||
|
||
end
|
||
|