home *** CD-ROM | disk | FTP | other *** search
- ;ASCII TO BCD SUBROUTINE
- ;
- ;
- ;THIS SUBROUTINE PERFORMS THE FOLLOWING FUNCTIONS:
- ;
- ; 1) CONVERTS ASCII INPUT TO BCD SUITABLE
- ; FOR IBM 2740 TYPE TERMINALS
- ; 2) MAINTAINS PROPER LINE CONTROL
- ; 3) REMEMBERS AND MAINTAINS PRINTER SHIFT CONTROL
- ; 4) COMPUTES PROPER <CR> PAD CHARACTER AMOUNT BASED
- ; ON ACTUAL PRINT LINE CHARACTER COUNT
- ;
- ;
- ;THE ASCII DATA IS PASSED IN REGISTER "C"
- ;
- ;NOTE: THE CODING CONTAINS SEVERAL SEEMINGLY UNNECESSARY
- ; STEPS WHICH WILL BE USED IN LATER REVISIONS TO
- ; SUPPORT KEYBOARD INPUT AND EMULATE A DUPLEX TERMINAL
- ; WITH CHARACTER ECHO.
- ;
- ;;EQUATES
- DATA EQU 2
- STAT EQU 3
- RDA EQU 2
- TBE EQU 1
- ;
- ;
- ORG 0D2A0H
- ;ENTRY POINT TO ASCII CONVERTER I/O CONTROLLER
- LSTO1: LDA SW01 ;GET XMIT. SW.
- CPI 1 ; 1=XMIT
- CNZ NOXMT ;NOT IN XMIT
- MOV A,C ;GET CHAR.
- CPI 20H ;SPACE ?
- JZ SPSD
- CPI 0DH ;<CR>?
- JZ PCR
- CPI 9 ;<TAB>?
- JZ TABSD
- CPI 0AH ;<LF>?
- JZ LFSD
- CPI 8 ;<BS>?
- JZ BSPSD
- CPI 7FH ;<DEL>? TREAT AS <BS>
- JZ BSPSD
- CPI 4 ;<EOT>?
- JZ EOTSD
- LDA CTR01 ;GET CHAR. COUNT
- ADI 1 ;ADD 1
- STA CTR01 ;STORE NEW COUNT
- MOV A,C ;GET CHAR.
- PUSH H
- LXI H,TBLHI ;SET HL TO TOP OF TABLE
- TBLS1: CMP M
- DCX H
- JZ TBLEX ;FOUND CHAR., EXIT
- DCX H
- PUSH D
- LXI D,TBLLO ;TEST FOR TABLE END
- MOV A,D
- CMP L
- JZ NCFND ;NO CHAR. FOUND
- POP D
- MOV A,C ;GET CHAR.
- JMP TBLS1 ;TRY AGAIN
- ;OUTPUT CHAR. SUBROUTINE
- CHSND: MOV C,M ;GET CHAR. FROM TABLE
- SHSND: IN STAT ;CHECK STATUS
- ANI RDA ;RCV DATA
- JNZ RCVCD
- IN STAT ;CHECK STATUS
- ANI TBE ;XMIT READY
- JZ SHSND ;LOOP UNTIL READY
- MOV A,C ;GET CHAR.
- ANI 7FH ;MASK 8TH BIT
- OUT DATA ;SEND CHAR.
- RET
- RCVCD: IN DATA ;GET RCV CHAR.
- CPI 7FH ;IS IT CD ?
- JNZ SHSND ;NO, GO ON
- MVI A,1 ;SET CD SW.
- STA SW03
- JMP SHSND
- ;PAD SUBROUTINES. CR PAD IS THE LINE COUNT (CTR01)
- ;DIVIDE BY 8 WITH 2 PAD CHARS. ADDED.
- PCR: MVI C,6DH ;LOAD CHAR.
- CALL SHSND ;SEND CHAR.
- LDA CTR01 ;GET CHAR. COUNT
- RRC
- RRC
- RRC ;DIVIDED BY 8
- ANI 1FH ;MASK 3 SHIFTED IN BITS
- STA CTR01 ;STORE PAD COUNT
- MVI C,3DH ;SEND 1 PAD
- CALL SHSND
- PCR1: MVI C,3DH
- CALL SHSND
- LDA CTR01 ;GET PAD AMOUNT
- ANA A ;SET FLAG
- RZ ;RETURN IF 0
- DCR A ;DECR. PAD AMOUNT
- STA CTR01 ;STORE PAD AMOUNT
- JMP PCR1 ;GO AROUND AGAIN
- SPSD: LDA CTR01 ;GET CHAR. COUNT
- ADI 1
- STA CTR01 ;STORE, AFTER ADDING 1
- MVI C,40H ;LOAD SPACE
- CALL SHSND ;SEND CHAR.
- RET
- TABSD: MVI C,2FH ;LOAD <TAB>
- CALL SHSND
- MVI C,3DH ;LOAD PAD
- CALL SHSND
- CALL SHSND
- CALL SHSND
- CALL SHSND
- CALL SHSND
- RET
- LFSD: RET ;SUPRESS <LF> SINCE FDOS ADDS IT
- BSPSD: LDA CTR01 ;GET CHAR. COUNT
- SUI 1 ;DECR. COUNT AND -
- STA CTR01 ;STORE NEW VALUE
- MVI C,5DH ;LOAD <BS>
- CALL SHSND ;SEND CHAR.
- RET
- EOTSD: MVI A,2 ;LOAD RCV. MODE CHAR.
- STA SW01 ;INTO SW. 1
- MVI A,0 ;LOAD <LOW SHIFT> CHAR.
- STA SW02 ;INTO SW02
- STA SW03 ;AND CLEAR CD. SW.
- MVI C,7CH ;LOAD <EOT>
- CALL SHSND
- RET
- NCFND: POP D
- ANI 0
- POP H
- RET
- ;EOA XMIT. SUBROUTINE
- SNEOA: PUSH B
- MVI A,1 ;SET XMIT. SW.
- STA SW01
- MVI C,34H ;LOAD EOA
- CALL SHSND
- POP B
- MVI A,0 ;SET LOW SHIFT
- STA SW02
- MVI A,40H ;1ST. CR PAD
- STA CTR01
- MVI A,0 ;CLEAR CD SW
- STA SW03
- RET
- ;NOT IN XMIT. SEQUENCE
- NOXMT: LDA SW01 ;RCV. MODE ?
- CPI 2
- JNZ XXX1 ;NOT IN RCV. OR XMIT.
- LDA LSTCH ;GET LAST CHAR. COUNT
- CMP C
- RZ ;CHAR. SAME, GET NEXT
- CPI 7FH ;LAST CHAR. <DEL> ?
- RZ
- CPI 9 ;LAST CHAR. <TAB> ?
- RZ
- MOV A,C
- CPI 0AH ;IS IT <LF>
- RZ
- CPI '$'
- RZ
- XXX1: IN STAT
- ANI RDA
- JZ XXX1
- IN DATA
- CPI 7CH ;<EOT> ?
- JZ SNEOA
- CPI 7FH ;<CD> ?
- JNZ XXX1
- MVI A,1 ;SET <CD> SW.
- STA SW03
- JMP XXX1
- LSTCH: DS 1 ;LAST CHAR. SET STORAGE
- ;SHIFT XMIT SUBROUTINES
- LSSND: MVI C,1FH ;LOAD L. SHIFT
- CALL SHSND
- MVI A,0 ;SET L. SHIFT
- STA SW02
- RET
- USSND: MVI C,1CH ;LOAD U. SHIFT
- CALL SHSND
- MVI A,1 ;SET U. SHIFT
- STA SW02
- RET
- UPSHT: LDA SW02 ;GET SHIFT SW.
- CPI 1 ;U. SHIFT=1
- CNZ USSND
- FINAL: CALL CHSND ;SEND CHAR.
- POP H
- RET
- TBLEX: MOV A,M ;GET CHAR.
- ANI 80H ;IS IT U. SHIFT CHAR.
- JZ UPSHT
- LDA SW02 ;CHECK SHIFT SW.
- CPI 1
- CZ LSSND
- JMP FINAL
- ;BCD TO ASCII TABLE
- ;LOWER SHIFT CHARS.
- TBLLO DB 0A3H,061H,093H,062H,0F3H,063H ;a b c
- DB 08BH,064H,0EBH,065H,0DBH,066H ;d e f
- DB 0BBH,067H,087H,068H,0E7H,069H ;g h i
- DB 0E1H,06AH,0D1H,06BH,0B1H,06CH ;j k l
- DB 0C9H,060H,0A9H,06EH,099H,06FH ;m n o
- DB 0F9H,070H,0C5H,071H,0A5H,072H ;p q r
- DB 0D2H,073H,0B2H,074H,0CAH,075H ;s t u
- DB 0AAH,076H,09AH,077H,0FAH,078H ;v w x
- DB 0C6H,079H,0A6H,07AH,0A0H,031H ;y z 1
- DB 090H,032H,0F0H,033H,088H,034H ;2 3 4
- DB 0E8H,035H,0D8H,036H,0B8H,037H ;5 6 7
- DB 084H,038H,0E4H,039H,0D4H,030H ;8 9 0
- DB 0F6H,02CH,0B7H,02EH,0E2H,02FH ;, . /
- DB 0F5H,024H,0B4H,023H,082H,040H ;$ # @
- DB 081H,02DH,0C3H,026H ;- &
- ;UPPER SHIFT CHARS.
- DB 023H,041H,013H,042H,073H,043H ;A B C
- DB 00BH,044H,06BH,045H,05BH,046H ;D E F
- DB 03BH,047H,007H,048H,067H,049H ;G H I
- DB 061H,04AH,051H,04BH,031H,04CH ;J K L
- DB 049H,04DH,029H,04EH,019H,04FH ;M N O
- DB 079H,050H,045H,051H,025H,052H ;P Q R
- DB 052H,053H,032H,054H,04AH,055H ;S T U
- DB 02AH,056H,01AH,057H,07AH,058H ;V W X
- DB 046H,059H,026H,05AH,020H,03DH ;Y Z =
- DB 010H,03CH,070H,03BH,008H,03AH ;< ; :
- DB 068H,025H,058H,027H,038H,03EH ;% ' >
- DB 004H,02AH,064H,028H,054H,029H ;* ( )
- DB 076H,07CH,037H,003H,062H,03FH ;1 <ETX> ?
- DB 075H,021H,034H,022H,002H,060H ;! " <CENTS>
- DB 001H,05FH,043H ;_ +
- TBLHI: DB 02BH
- ;END OF TABLE
- SW01 DS 1 ;0=OFF/1=XMIT/2=RCV
- SW02 DS 1 ;0=LOWER SHIFT
- SW03 DS 1 ;1=<CD> RECEIVED
- CTR01: DS 1 ;CHAR. COUNTER
- END
-