* 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. *
* *
*****************************************************************
*****************************************************************
* *
* 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)
*****************************************************************
* *
* 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 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. *
* *
*****************************************************************
*
* 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
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
; 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
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
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