home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG041.ARK
/
RTTY.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
26KB
|
929 lines
;
;===========================================
;
; ASCII TO BAUDOT TO ASCII PROGRAM
; WITH BUFFER TO DISK AND DISK TO BUFFER
; ROUTINES TAKEN FROM 'LINK.ASM' BY L.E.HUGHS
;
; RANDY SUESS 12/20/78
;============================================
;
;08/12/79 MODIFICATIONS BY JIM MILLS WB9KFP TO ALLOW
;OPERATION USING PMMI MM-103 DIRECT-CONNECT MODEM
;
;
; CTRL-R SEND TEXT FILE FROM DISK TO CYBER
; CTRL-Y ENABLE TEXT-FILE-LOADER (INTO MEMORY)
; CTRL-Q DISABLE TEXT FILE LOADER, WRITE MEMORY TO DISK
; BDOS ENTRY POINT AND FUNCTION CODES
BDOS EQU 0005H
OFFC EQU 15 ;OPEN FILE
CFFC EQU 16 ;CLOSE FILE
DFFC EQU 19 ;DELETE FILE
RRFC EQU 20 ;READ RECORD
WRFC EQU 21 ;WRITE RECORD
MFFC EQU 22 ;MAKE FILE
; DEFAULT FCB AND FIELD DEFINITIONS
FCB EQU 5CH
FN EQU 1 ;FILE NAME FIELD (REL)
FT EQU 9 ;FILE TYPE FIELD (REL)
NR EQU 32 ;NEXT RECORD FIELD (REL)
DBUF EQU 80H ;DEFAULT DISK BUFFER ADDRESS
; ASCII CONTROL CHARACTERS
BEL EQU 007Q ;BELL
LF EQU 012Q ;LINE FEED
CR EQU 015Q ;CARRIAGE RETURN
DEL EQU 177Q ;DELETE
; I/O PORT ADDRESSES
COND EQU 005Q ;CONSOLE DATA PORT
COND1 EQU 07H ;SECOND CONSOLE
CONS EQU 004Q ;CONSOLE STATUS PORT
CONS1 EQU 06H ;2ND CONSOLE
MODD EQU FF01H ;MODEM DATA PORT
MODS EQU FF00H ;MODEM STATUS PORT
; PMMI PORT ADDRESSES
PMMI EQU FF00H ;PMMI BASE ADDRESS
PMMIUS EQU PMMI ;PMMI UART STATUS
PMMIRD EQU PMMI+1 ;PMMI RCV DATA
PMMIMS EQU PMMI+2 ;PMMI MODEM STATUS
PMMIIM EQU PMMI+3 ;PMMI INPUT MASK
PMMICON EQU PMMI ;PMMI UART/MODEM CONTROL
PMMIXD EQU PMMI+1 ;PMMI XMIT DATA
PMMIT EQU PMMI+2 ;PMMI TIMER
PMMIOM EQU PMMI+3 ;PMMI OUTPUT MASK
PMMIMC EQU PMMI+4 ;PMMI MODEM CONTROL
; I/O SYMBOL DEFINITIONS
CTBE EQU 02H ;CONSOLE TRANSMIT BUFFER EMPTY
CRDA EQU 01H ;CONSOLE READ DATA AVAILABLE
MTBE EQU 080H ;RTTY TRANSMIT BUFFER EMPTY
MRDA EQU 01H ;RTTY READ DATA AVAILABLE
; MAIN PROGRAM
ORG 100H
LINK: LXI H,0 ;SAVE OLD STACK POINTER
DAD SP
SHLD OLDSP
LXI SP,STACK+64 ;CREATE LOCAL STACK
LINK2: XRA A ;CLEAR CHAR BUFFERS
STA INCH
STA OUTCH
STA FLAG ;CLEAR TEXT SAVE FLAG
LXI H,TBUF ;SET PTR TO TBUF
SHLD PTR
LXI H,0 ;SIZE = 0
SHLD SIZE
CALL WCCR ;WRITE CR/LF TO CONSOLE
MVI A,BEL ;RING BELL ON CONSOLE, TO LET
CALL WCC ; CLONE KNOW WE'RE READY
; MAIN LOOP
LINK3:
IN CONS ;JUMP IF NO DATA FROM CONSOLE
ANI CRDA
JZ LINK44
IN COND ;ELSE READ CONSOLE DATA
OUT COND ;ECHO TO TERMINAL
ANI 177Q ;CALL PCC IF CONTROL CHAR
CPI 40Q
CC PCC
JC LINK4 ;JUMP IF PCC HANDLED CHAR
ORI 200Q ;ELSE SET VALID DATA BIT
STA INCH ;AND STORE IN INPUT CHAR BUFFER
LINK44:
IN CONS1
ANI CRDA
JZ LINK4
IN COND1
OUT COND1
ANI 07FH
CPI 40Q
CC PCC
JC LINK4
ORI 200Q
STA INCH
LINK4: IN CONS1 ;JUMP IF CONSOLE XMIT BUFFER BUSY
ANI CTBE
JZ LINK5
LDA OUTCH ;JUMP IF NO DATA FOR CONSOLE
ORA A
JP LINK5
ANI 177Q ;ELSE DISCARD VALID DATA BIT
OUT COND ; AND OUTPUT CHAR TO CONSOLE
OUT COND1
XRA A ; THEN CLEAR OUTPUT CHAR BUFFER
STA OUTCH
LINK5: IN MODS ;JUMP IF NO DATA FROM RTTY
ANI MRDA
JNZ LINK6
TTYREAD:
; **** CALL
; ****RTTY READ ROUTINE
CALL RMC
CALL SAVE ;SAVE CHAR IN TEXT BUFFER IF FLAG ON
ORI 200Q ;SET DATA VALID BIT
STA OUTCH ;STORE IN OUTPUT CHAR BUFFER
LINK6: IN MODS ;JUMP IF RTTY XMIT BUFFER BUSY
ANI MTBE
JNZ LINK7
LDA INCH ;JUMP IF NO DATA FOR RTTY
ORA A
JP LINK7
ANI 177Q ;ELSE DISCARD VALID DATA BIT
; ********* CALL RTTY OUT ROUTINE
;****** ADDED CODE TO SEND 2 CR'S AND 1 LF
; FOR EACH CR
CPI CR
JNZ LNKX
MVI A,CR
CALL WMC
MVI A,LF
OUT 1 ;ECHO LF TO CONSOLE
CALL WMC
LNKX:
CALL WMC
XRA A ; THEN CLEAR INPUT CHAR BUFFER
STA INCH
LINK7: JMP LINK3 ;END OF MAIN LOOP
LINKX:
LHLD OLDSP
SPHL
XRA A
OUT 202Q
RET
; PCC - PROCESS CONTROL CHARACTER
PCC: CPI 'D'-100Q ;JUMP IF NOT CONTROL-D
JNZ PCC1
LHLD OLDSP ;ELSE CLEAN UP ACT AND GO HOME
SPHL
RET
PCC1: CPI 'O'-100Q ;JUMP IF NOT CONTROL-Q
JNZ PCC2
CALL STF ;SEND TEXT FILE TO RTTY
STC ;TELL LINK TO IGNORE THIS CHARACTER
RET
PCC2: CPI 'Y'-100Q ;JUMP IF NOT CONTROL-Y
JNZ PCC3
MVI A,1 ;TURN ON TEXT SAVE FLAG
STA FLAG
STC
RET
PCC3: CPI 'Q'-100Q ;JUMP IF NOT CONTROL-Q
JNZ PCC4
XRA A ;TURN OFF TEXT SAVE FLAG
STA FLAG
CALL WTB ;WRITE TEXT BUFFER TO DISK
LXI H,TBUF ;CLEAR TEXT BUFFER
SHLD PTR
LXI H,0
SHLD SIZE
STC
RET
PCC4: STC ;LET LINK HANDLE ALL OTHER CONTROL CODES
CMC
RET
; STF - SEND TEXT FILE (TO RTTY)
STF: CALL GFN ;GET NAME OF DISK FILE TO SEND
JC STF6 ;JUMP IF FILE NAME ERROR
CALL OPEN ;TRY TO OPEN SPECIFIED FILE
CPI 255 ;JUMP IF FILE NOT FOUND
JZ STF7
XRA A ;ELSE REWIND FILE AND GET ON WITH IT
STA FCB+NR
STF1: CALL READ ;READ NEXT RECORD INTO DBUF
CPI 1 ;JUMP IF END-OF-FILE
JZ STF5
LXI H,DBUF ;POINT TO DISK BUFFER
MVI C,128
STF2: MOV A,M ;FETCH NEXT CHAR FROM DBUF
INX H
CPI 'Z'-100Q ;JUMP IF END-OF-FILE CHARACTER
JZ STF5
CALL WMC ;WRITE CHARACTER TO RTTY
CALL WCC ;WRITE CHARACTER TO CONSOLE
IN 01 ;CHECK FOR CTRL D ABORT
ANI 7FH
CPI 04H
JZ STF5
STF4: DCR C ;LOOP THRU REST OF DBUF
JNZ STF2
JMP STF1 ;GO GET NEXT RECORD FROM DISK
STF5: CALL CLOSE ;CLEAN UP ACT AND GO HOME
MVI A,BEL ;RING BELL TO LET CLONE
CALL WCC ; KNOW WE'RE THROUGH
RET
STF6: LXI H,STFS1 ;PRINT 'FILE NAME ERROR'
CALL WCS
RET
STF7: LXI H,STFS2 ;PRINT 'FILE NOT FOUND'
CALL WCS
RET
STFS1: DB 'FILE NAME ERROR',CR,LF,0
STFS2: DB 'FILE NOT FOUND',CR,LF,0
; SAVE - SAVE CHAR IN TEXT BUFFER IF FLAG ON
;
; ENTRY CONDITIONS
; A - CHARACTER TO SAVE
SAVE: PUSH PSW
LDA FLAG
ORA A
JNZ SAVE1
POP PSW
RET
SAVE1: POP PSW
PUSH H
LHLD PTR
ANI 7FH ;DISCARD PARITY BIT
JZ SAVE2 ;JUMP IF CHAR IS A NULL
MOV M,A
INX H
SAVE2: CMA ;DISPLAY CHAR ON LIGHTS
OUT 0FFH
CMA
SHLD PTR
LHLD SIZE ;SIZE = SIZE + 1
INX H
SHLD SIZE
POP H
RET
; WTB - WRITE TEXT BUFFER TO DISK
WTB: LHLD SIZE ;JUMP IF TEXT BUFFER EMPTY
MOV A,L
ORA H
JZ WTB5
CALL GFN ;GET FILE NAME
JC WTB6 ;JUMP IF FILE NAME ERROR
CALL DELT ;DELETE OLD FILE, IF ANY
CALL MAKE ;MAKE NEW FILE
XRA A ;REWIND FILE
STA FCB+NR
LHLD SIZE ;DE = TBUF SIZE
XCHG
LXI H,DBUF ;TOP OF STACK POINTS TO DBUF
PUSH H
LXI H,TBUF ;HL POINTS TO TBUF
WTB1: MVI C,128 ;DISK BUFFER SIZE
WTB2: MOV A,M ;FETCH NEXT BYTE OF TBUF
INX H
XTHL
MOV M,A ;STORE IN DBUF
INX H
XTHL
DCX D ;SIZE = SIZE - 1
MOV A,D ;EXIT LOOP IF SIZE = 0
ORA E
JZ WTB3
DCR C ;LOOP UNTIL DBUF FULL
JNZ WTB2
CALL WRITE ;WRITE FULL DBUF TO DISK
XTHL ;TOP OF STACK POINTS TO DBUF
LXI H,DBUF
XTHL
JMP WTB1 ;LOOP UNTIL END OF TBUF
WTB3: POP H ;HL POINTS TO CURRENT PLACE IN DBUF
WTB4: MVI M,'Z'-100Q ;STORE EOF CODE
INX H
DCR C ;LOOP THRU REST OF DBUF
JNZ WTB4
CALL WRITE ;WRITE LAST SECTOR TO DISK
CALL CLOSE ;CLEAN UP ACT AND GO HOME
MVI A,BEL ;RING BELL TO LET CLONE
CALL WCC ; KNOW WE'RE THROUGH
RET
WTB5: LXI H,WTBS1 ;PRINT 'TEXT BUFFER EMPTY'
CALL WCS
RET
WTB6: LXI H,WTBS2 ;PRINT 'FILE NAME ERROR'
CALL WCS
RET
WTBS1: DB 'TEXT BUFFER EMPTY',CR,LF,0
WTBS2: DB 'FILE NAME ERROR',CR,LF,0
; WCS - WRITE CONSOLE STRING
;
; ENTRY CONDITIONS
; HL - POINTS TO STRING (TERM BY ZERO BYTE)
WCS: MOV A,M
INX H
ORA A
RZ
CALL WCC
JMP WCS
; WCCR - WRITE CONSOLE CARRIAGE RETURN (AND LINE FEED)
WCCR: MVI A,CR
CALL WCC
MVI A,LF
; WCC - WRITE CONSOLE CHARACTER
;
; ENTRY CONDITIONS:
; A - CHARACTER TO WRITE
WCC: PUSH PSW
IN CONS
ANI CTBE
JZ $-4
POP PSW
OUT COND
PUSH PSW
IN CONS1
ANI CTBE
JZ $-4
POP PSW
OUT COND1
RET
; RCS - READ CONSOLE STRING (WITH ECHO)
;
; EXIT CONDITIONS
; B - NUMBER OF CHARACTERS READ (<255)
; HL - POINTS TO LAST CHAR STORED (CR)
RCS: LXI H,IBUF
MVI B,0
RCS1: CALL RCC ;READ NEXT CHAR FROM CONSOLE
CPI DEL ;JUMP IF NOT DEL
JNZ RCS2
INR B ;IGNORE DEL IF IBUF ALREADY EMPTY
DCR B
JZ RCS1
DCX H ;ELSE DISCARD LAST CHAR
MOV A,M ;ECHO DISCARDED CHAR TO CONSOLE
CALL WCC
DCR B ;DECREMENT COUNT
JMP RCS1 ; AND LOOP
RCS2: CPI 'U'-100Q ;JUMP IF NOT CONTROL-U
JNZ RCS3
CALL WCCR ;ELSE ABORT CURRENT LINE
JMP RCS ; AND START OVER
RCS3: CALL WCC ;ECHO CHAR TO CONSOLE
MOV M,A ;STORE CHAR IN IBUF
INR B ;INCREMENT COUNT
CPI CR ;JUMP IF CARRIAGE RETURN
JZ RCS4
INX H ;ELSE ADVANCE POINTER
JMP RCS1 ; AND LOOP
RCS4: MVI A,LF ;ISSUE LINE FEED AND RETURN
CALL WCC
RET
; RCC - READ CONSOLE CHARACTER
;
; EXIT CONDITIONS
; A - CHARACTER READ
RCC: IN CONS
ANI CRDA
JZ RCCC
IN COND
ANI 177Q
RET
RCCC:
IN CONS1
ANI CRDA
JZ RCC
IN COND1
ANI 177Q
RET
; WMC - WRITE RTTY CHARACTER
;
; ENTRY CONDITIONS
; A - CHARACTER TO WRITE
WMC:
; CALL RTTYOUT ;***************************
CALL RTTYXMIT
PUSH PSW ;GONNA PRINT IT?
IN 0FFH
ANI 80H
JNZ DIABLO
POP PSW
RET
;
; RMC - READ RTTY CHARACTER
;
; EXIT CONDITIONS:
; A - CHARACTER READ
RMC:
; CALL RMC ;********************
CALL RTTYREAD
PUSH PSW
; ********* OUT TO PRINTER ALSO IF 80H UP
IN 0FFH
ANI 80H
JNZ DIABLO
POP PSW
RET
DIABLO:
POP PSW
PUSH PSW
PUSH B
PUSH D
PUSH H
MOV E,A
MVI C,5
CALL BDOS
POP H
POP D
POP B
POP PSW
RET
;
; ASCRCV(4), VER. 2
; BY KEITH PETERSEN, W8SDZ. 10/30/78.
;
; THIS IS A PROGRAM TO CHANGE
; ASCII-CODED-BAUDOT TO ASCII.
; THE ROUTINE RETURNS WITH A 0FFH
; IN THE 'A' REGISTER IF CHARACTER
; IS TO BE IGNORED. OTHERWISE IT
; RETURNS WITH THE ASCII CHARACTER
; IN THE 'A' REGISTER. IT IS ASSUMED
; THAT A STATUS TEST HAS BEEN DONE BEFORE
; CALLING THIS ROUTINE TO DETERMINE THAT
; A BAUDOT CHARACTER IS AVAILABLE.
;
; EQUATES
;
BTTY: EQU 05H ;BAUDOT UART DATA PORT
BELL: EQU 07H ;ASCII BELL
LTRS: EQU 1FH ;BAUDOT 'LTRS'
SPACE: EQU 04H ;BAUDOT 'SPACE'
FIGS: EQU 1BH ;BAUDOT 'FIGS'
APOS: EQU 27H ;APOSTROPHE
CNTC: EQU 03H ;CONTROL C
LARW: EQU 5FH ;LEFT ARROW
ASPC: EQU 20H ;ASCII SPACE
ATSN: EQU 40H ;"AT" SIGN
CNTV: EQU 16H ;CONTROL V
CNTO: EQU 0FH ;CONTROL O
RUBT: EQU 7FH ;RUBOUT
CNTE: EQU 05H ;CONTROL E
PCT: EQU 25H ;PERCENT SIGN
EQL: EQU 3DH ;EQUALS SIGN
GRTH: EQU 3EH ;GREATER-THAN SIGN
CNTH: EQU 08H ;CONTROL H
LETH: EQU 3CH ;LESS-THAN SIGN
CNTB: EQU 02H ;CONTROL B
STAR: EQU 2AH ;ASTERISK
CNTI: EQU 09H ;CONTROL I
CNTZ: EQU 1AH ;CONTROL Z
CNTA: EQU 01H ;CONTROL A
CNTX: EQU 18H ;CONTROL X
UARW: EQU 5EH ;UP-ARROW
PLUS: EQU 2BH ;PLUS SIGN
RESL: EQU 5CH ;REVERSE SLANT
LBKT: EQU 5BH ;LEFT BRACKET
RBKT: EQU 5DH ;RIGHT BRACKET
ESCP: EQU 1BH ;ESCAPE KEY
ALMD: EQU 7DH ;ALTERNATE MODE KEY
;
; PROGRAM STARTS HERE
;
RTTYREAD:
;
ASCRCV: PUSH H ;SAVE HL REGISTERS
LHLD CASAVE ;GET PRESENT CASE
;
START: IN BTTY ;GET BAUDOT CHARACTER
ANI 1FH ;BAUDOT CHARACTERS ONLY
CPI FIGS
JZ UCASE
CPI LTRS
JZ LCASE
ORA A ;BAUDOT 'BLANK' ?
JZ TCASE
CPI SPACE
JNZ START1
LXI H,LTABLE ;SPACE GIVES LOWER CASE
;
START1: SHLD CASAVE ;SAVE PRESENT CASE
ADD L ;ADD CHAR. TO TABLE ADRS.
MOV L,A ;L POINTS TO ASCII CHAR.
MOV A,H ;GET H FOR CORRECTION
ACI 0 ;SEE IF CORRECTION NEEDED
MOV H,A ;H IS CORRECT NOW
XRA A ;PUT ZERO IN A REG.
STA FLAGR ;CLEAR LTRS-FIGS LAST FLAG
MOV A,M ;GET ASCII EQUIVALENT
POP H ;RESTORE HL REGISTERS
ORA A ;IS IT PRINTABLE?
RNZ ;YES, VALID CHAR. RETURN
CMA ;MAKE 0FFH 'IGNORE FLAG'
RET ;RETURN TO CALLING PROGRAM
;
LCASE: LXI H,LTABLE ;LOWER CASE TABLE ADDRESS
JMP SETFLG ;SET LTRS LAST FLAG, EXIT
;
UCASE: LXI H,UTABLE ;UPPER CASE TABLE ADDRESS
JMP SETFLG ;SET FIGS LAST FLAG, EXIT
;
TCASE: LDA FLAGR ;GET SHIFT REMINDER FLAG
CPI FIGS
JNZ FCASE
LXI H,TTABLE ;THIRD CASE TABLE ADDRESS
JMP CLRFLG
;
FCASE: CPI LTRS ;CHECK FOR LTRS LAST
JNZ CLRFLG
LXI H,FTABLE ;FOURTH CASE TABLE ADDRESS
;
CLRFLG: XRA A ;READY TO CLEAR FLAG
;
SETFLG: STA FLAGR ;LTRS-FIGS LAST FLAG
SHLD CASAVE ;SAVE PRESENT CASE
MVI A,0FFH ;'IGNORE FLAG'
POP H ;RESTORE HL REGS.
RET ;RETURN TO CALLING PROGRAM
;
; THIS IS THE LOWER-CASE TABLE.
;
LTABLE: DB 0,'E',LF,'A SIU',CR,'DRJNFCK'
DB 'TZLWHYPQOBG',FIGS,'MXV'
;
; THIS IS THE UPPER-CASE TABLE.
;
UTABLE: DB 0,'3',LF,'- ',BELL,'87',CR,'$4'
DB APOS,',!:(5")2#6019?&',FIGS,'./;'
;
; THIS IS THE THIRD-CASE TABLE.
; IT IS USED FOR SPECIAL CHARACTERS.
; THE FIRST COLUMN IN THE TABLE
; THE ASCII CHARACTER EQUIVALENT.
; THE SECOND COLUMN IS THE SPECIAL
; CASE BAUDOT CHARACTER FROM WHICH
; THE CONVERSION IS MADE.
;
TTABLE: DB 0,CNTC,LF ;BL 3 LF
DB LARW,ASPC,ATSN ;- SP BELL
DB CNTV,CNTO,CR ;8 7 CR
DB ALMD,CNTE,PCT ;$ 4 '
DB RUBT,EQL,ESCP ;, ! :
DB LETH,CNTH,LBKT ;( 5 "
DB GRTH,CNTB,STAR ;) 2 #
DB CNTI,CNTZ,CNTA ;6 0 1
DB CNTX,UARW,PLUS ;9 ? &
DB 0,RBKT,RESL ;FIG . /
DB 0 ;;
;
; THIS IS THE FOURTH CASE TABLE
; FOR LOWER-CASE ALPHA CHARACTERS.
;
FTABLE: DB 0,65H,LF,61H,ASPC,73H
DB 69H,75H,CR,64H,72H,6AH
DB 6EH,66H,63H,6BH,74H,7AH
DB 6CH,77H,68H,79H,70H,71H
DB 6FH,62H,67H,FIGS,6DH,78H
DB 76H
;
; TEMPORARY STORAGE AREA
;
CASAVE: DW LTABLE ;PRESENT CASE REMINDER
FLAGR: DB 0 ;FIGS/LTRS LAST FLAG
;
;
; ASCXMT(4) REV. 2
; BY KEITH PETERSEN, W8SDZ. 10/29/78.
;
; THIS PROGRAM IS FOR TRANSMITTING ASCII
; THROUGH A BAUDOT MEDIUM USE A SPECIAL
; FORMAT OF FIGURES BLANK (X) - WHERE (X)
; IS A SPECIAL BAUDOT CHARACTER USED TO
; CONVEY THE ASCII EQUIVALENT CHARACTER TO THE
; RECEIVING END WHERE IT IS THEN CONVERTED BACK
; TO ASCII AGAIN. LOWER CASE ALPHA CHARACTERS
; ARE TRANSMITTED VIA A 4TH CASE, LTRS BLANK (X).
;
; EQUATES
;
LTRSX: EQU 1FH
FIGSX: EQU 1BH
CRX: EQU 48H
LFX: EQU 42H
STATUS: EQU 04H ;BAUDOT UART STATUS PORT
TBE: EQU 80H ;UART TRANS. BUF. EMPTY FLAG
BTTY: EQU 05H ;BAUDOT UART DATA PORT
ALTMOD: EQU 7DH ;ALTERNATE MODE KEY
;
; PROGRAM STARTS HERE.
; CALL WITH ASCII CHARACTER IN ACCUMULATOR.
;
;
RTTYXMIT:
STARTX: PUSH PSW ;SAVE REGISTERS USED
PUSH B
PUSH H
;
BAUDOT: MVI C,0 ;SET UP COUNTER
ANI 7FH ;STRIP PARITY BIT
CPI ALTMOD ;ALTERNATE MODE KEY?
JNZ BAUD2 ;NO, IGNORE NEXT ROUTINE
MVI A,09H ;BAUDOT '$'
JMP BAUD3
;
BAUD2: CPI 7BH ;ABOVE L.C. 'Z' ?
JNC TTY0 ;IF SO, IGNORE IT
LXI H,BTABLE ;POINT TO TABLE START
ADD L ;ADD CHARACTER VALUE
MOV L,A ;L POINTS TO BAUDOT CHAR.
MOV A,H ;GET H FOR CORRECTION
ACI 0 ;CORRECT IF NECESSARY
MOV H,A ;H IS NOW CORRECT
MOV A,M ;GET BAUDOT CHARACTER
ORA A ;IS IT A NON-PRINTING CHAR?
JZ TTY0 ;IF SO IGNORE IT
CPI CRX ;IS IT A CARRIAGE RETURN?
JZ TTYOUT-1 ;YES, HANDLE WITHOUT CASE TEST
CPI LFX ;IS IT A LINE FEED?
JNZ BAUD3 ;NO, IGNORE NEXT ROUTINE
MVI A,LTRSX
PUSH PSW ;SAVE IT ON STACK
MVI A,LFX
LXI H,SCASE ;POINT TO PRESENT CASE REG.
MVI M,40H ;SET IT TO LOWER CASE
JMP TTYOUT-2 ;SEND LF AND LTRS
;
BAUD3: PUSH PSW ;SAVE CHARACTER
ANI 0C0H ;STRIP ALL BUT CASE BITS
LXI H,SCASE ;POINT TO PRESENT CASE REG.
CMP M ;SAME CASE AS PREVIOUS CHARACTER?
JZ TTYOUT ;YES NO CHANGE NECESSARY
MOV M,A ;UPDATE CASE REGISTER
ORA A
JZ TCASEX
CPI 80H
JZ UCASEX
CPI 0C0H
JNZ LCASSEX
;
FCASEX: XRA A ;GET A BAUDOT 'BLANK'
PUSH PSW ;SAVE IT ON THE STACK
INR C ;INCREMENT CHARACTER COUNT
;
LCASSEX: MVI A,LTRSX
JMP TTYOUT-2
;
TCASEX: XRA A ;GET A BAUDOT 'BLANK'
PUSH PSW ;SAVE IT ON THE STACK
INR C ;INCREMENT CHARACTER COUNT
;
UCASEX: MVI A,FIGSX
INR C ;INCREMENT CHARACTER COUNT
PUSH PSW ;SAVE IT ON THE STACK
;
TTYOUT: IN STATUS ;BAUDOT UART STATUS
ANI TBE ;TRANS. BUFFER EMPTY?
JNZ TTYOUT ;IF NOT, LOOP AND WAIT
POP PSW ;GET CHARACTER
;
; OMIT NSEXT THREE LINES IF NO LIGHTS.
;
CMA ;INVERT FOR LIGHTS
OUT 0FFH ;PUT ON FRONT PANEL LIGHTS
CMA ;INVERT BACK TO NORMAL
;
; OMIT ABOVE THREE LINES IF NO LIGHTS.
;
ORI 0E0H ;MAKE UPPER 3 BITS MARKING
OUT BTTY ;SEND TO BAUDOT UART PORT
DCR C ;MORE TO SEND?
JP TTYOUT ;YES, CONTINUE SENDING
;
TTY0: POP H ;RESTORE REGISTERS
POP B
POP PSW
RET ;RETURN TO CALLING PROGRAM
;
BTABLE: DB 5FH,17H,13H ;NUL SOH STX
DB 1,0,0AH ;ETX EOT ENQ
DB 0,85H,10H ;ACK BEL BS
DB 15H,42H,0C2H ;HT LF VT
DB 2,48H,0 ;FF CR SO
DB 7,0,0 ;SI DLE DC1
DB 0,0,0 ;DC2 DC3 DC4
DB 0,6,0 ;NAK SYN ETB
DB 18H,0,16H ;CAN EM SUB
DB 0EH,0,0 ;ESC FS GS
DB 0,0,44H ;RS US SPACE
DB 8DH,91H,94H ;! " #
DB 89H,0BH,9AH ;$ PCT &
DB 8BH,8FH,92H ;' ( )
DB 14H,1AH,8CH ;AS PL ,
DB 83H,9CH,9DH ;- . /
DB 96H,97H,93H ;0 1 2
DB 81H,8AH,90H ;3 4 5
DB 95H,87H,86H ;6 7 8
DB 98H,8EH,9EH ;9 : ;
DB 0FH,0DH,12H ;LT EQ GT
DB 99H,5,43H ;? AT A
DB 59H,4EH,49H ;B C D
DB 41H,4DH,5AH ;E F G
DB 54H,46H,4BH ;H I J
DB 4FH,52H,5CH ;K L M
DB 4CH,58H,56H ;N O P
DB 57H,4AH,45H ;Q R S
DB 50H,47H,5EH ;T U V
DB 53H,5DH,55H ;W X Y
DB 51H,11H,1DH ;Z LB LS
DB 1CH,19H,3 ;RB UA LA
;
; THESE ARE THE LOWER CASE ALPHA CHARACTERS
;
DB 0,0C3H,0D9H ;' A B
DB 0CEH,0C9H,0C1H ;C D E
DB 0CDH,0DAH,0D4H ;F G H
DB 0C6H,0CBH,0CFH ;I J K
DB 0D2H,0DCH,0CCH ;L M N
DB 0D8H,0D6H,0D7H ;O P Q
DB 0CAH,0C5H,0D0H ;R S T
DB 0C7H,0DEH,0D3H ;U V W
DB 0DDH,0D5H,0D1H ;X Y Z
;
; TEMPORARY STORAGE AREA
;
SCASE: DB 40H ;PRESENT CASE REGISTER
;
GFN: CALL WCCR
LXI H,GFNS1 ;PRINT 'FILENAME? '
CALL WCS
CALL RCS ;READ RESPONSE INTO IBUF
LXI H,FCB+FN ;BLANK FILL FN AND FT FIELDS
MVI C,11
GFN1: MVI M,' '
INX H
DCR C
JNZ GFN1
LXI H,IBUF ;POINT TO INPUT BUFFER
LXI D,FCB+FN ;SCAN OFF FN FIELD
MVI C,9
GFN2: MOV A,M ;FETCH NSEXT CHAR FROM IBUF
INX H
CPI 141Q ;IF LC, CONVERT TO UC
JC $+5
SUI 40Q
CPI CR ;JUMP IF END OF LINE
JZ GFN5
CPI '.' ;JUMP IF END OF NAME
JZ GFN3
STAX D ;ELSE STORE CHAR IN FN FIELD
INX D
DCR C ;LOOP IF 8 OR LESS CHARS SO FAR
JNZ GFN2
JMP GFN6 ;ELSE TAKE ERROR SEXIT
GFN3: LXI D,FCB+FT ;SCAN OFF FT FIELD
MVI C,4
GFN4: MOV A,M ;FETCH NSEXT CHAR FROM IBUF
INX H
CPI 141Q ;IF LC, CONVERT TO UC
JC $+5
SUI 40Q
CPI CR ;JUMP IF END OF LINE
JZ GFN5
STAX D ;ELSE STORE CHAR IN FT FIELD
INX D
DCR C ;LOOP IF 3 OR LESS CHARS SO FAR
JNZ GFN4
JMP GFN6 ;ELSE TAKE ERROR SEXIT
GFN5: STC ;CLEAR ERROR FLAG AND RETURN
CMC
RET
GFN6: STC ;SET ERROR FLAG AND RETURN
RET
GFNS1: DB 'FILENAME? ',0
; OPEN - OPEN DISK FILE
OPEN: PUSH H
PUSH D
PUSH B
LXI D,FCB
MVI C,OFFC
CALL BDOS
POP B
POP D
POP H
RET
; READ - READ RECORD FROM DISK FILE
READ: PUSH H
PUSH D
PUSH B
LXI D,FCB
MVI C,RRFC
CALL BDOS
POP B
POP D
POP H
RET
; CLOSE - CLOSE DISK FILE
CLOSE: PUSH H
PUSH D
PUSH B
LXI D,FCB
MVI C,CFFC
CALL BDOS
POP B
POP D
POP H
RET
; DELT - DELETE DISK FILE
DELT: PUSH H
PUSH D
PUSH B
LXI D,FCB
MVI C,DFFC
CALL BDOS
POP B
POP D
POP H
RET
; WRITE - WRITE RECORD TO DISK
WRITE: PUSH H
PUSH D
PUSH B
LXI D,FCB
MVI C,WRFC
CALL BDOS
POP B
POP D
POP H
RET
; MAKE - MAKE NEW DISK FILE
MAKE: PUSH H
PUSH D
PUSH B
LXI D,FCB
MVI C,MFFC
CALL BDOS
POP B
POP D
POP H
RET
; DATA AREA
MCB: DS 1 ;RTTY CONTROL BYTE
INCH: DS 1 ;INPUT CHAR BUFFER (TO CYBER)
OUTCH: DS 1 ;OUTPUT CHAR BUFFER (FROM CYBER)
OLDSP: DS 2 ;OLD STACK POINTER
STACK: DS 128 ;LOCAL STACK
IBUF: DS 256
; TSEXT BUFFER
FLAG: DS 1 ;TSEXT SAVE FLAG
PTR: DS 2 ;TSEXT BUFFER POINTER
SIZE: DS 2 ;TSEXT BUFFER SIZE
TBUF EQU $ ;START OF TSEXT BUFFER
NUM EQU TBUF ;TEMPORARY BUFFER FOR PHONE NUMBER
END LINK