home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug014.ark / BCD-DRVR.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.4 KB  |  244 lines

  1. ;ASCII TO BCD SUBROUTINE
  2. ;
  3. ;
  4. ;THIS SUBROUTINE PERFORMS THE FOLLOWING FUNCTIONS:
  5. ;
  6. ;    1) CONVERTS ASCII INPUT TO BCD SUITABLE
  7. ;       FOR IBM 2740 TYPE TERMINALS
  8. ;    2) MAINTAINS PROPER LINE CONTROL
  9. ;    3) REMEMBERS AND MAINTAINS PRINTER SHIFT CONTROL
  10. ;    4) COMPUTES PROPER <CR> PAD CHARACTER AMOUNT BASED
  11. ;       ON ACTUAL PRINT LINE CHARACTER COUNT
  12. ;
  13. ;
  14. ;THE ASCII DATA IS PASSED IN REGISTER "C"
  15. ;
  16. ;NOTE:    THE CODING CONTAINS SEVERAL SEEMINGLY UNNECESSARY
  17. ;    STEPS WHICH WILL BE USED IN LATER REVISIONS TO
  18. ;    SUPPORT KEYBOARD INPUT AND EMULATE A DUPLEX TERMINAL
  19. ;    WITH CHARACTER ECHO.
  20. ;
  21. ;;EQUATES
  22. DATA    EQU    2
  23. STAT    EQU    3
  24. RDA    EQU    2
  25. TBE    EQU    1
  26. ;
  27. ;
  28.     ORG    0D2A0H
  29. ;ENTRY POINT TO ASCII CONVERTER I/O CONTROLLER
  30. LSTO1:    LDA    SW01    ;GET XMIT. SW.
  31.     CPI    1    ; 1=XMIT
  32.     CNZ    NOXMT    ;NOT IN XMIT
  33.     MOV    A,C    ;GET CHAR.
  34.     CPI    20H    ;SPACE ?
  35.     JZ    SPSD
  36.     CPI    0DH    ;<CR>?
  37.     JZ    PCR
  38.     CPI    9    ;<TAB>?
  39.     JZ    TABSD
  40.     CPI    0AH    ;<LF>?
  41.     JZ    LFSD
  42.     CPI    8    ;<BS>?
  43.     JZ    BSPSD
  44.     CPI    7FH    ;<DEL>? TREAT AS <BS>
  45.     JZ    BSPSD
  46.     CPI    4    ;<EOT>?
  47.     JZ    EOTSD
  48.     LDA    CTR01    ;GET CHAR. COUNT
  49.     ADI    1    ;ADD 1
  50.     STA    CTR01    ;STORE NEW COUNT
  51.     MOV    A,C    ;GET CHAR.
  52.     PUSH    H
  53.     LXI    H,TBLHI    ;SET HL TO TOP OF TABLE
  54. TBLS1:    CMP    M
  55.     DCX    H
  56.     JZ    TBLEX    ;FOUND CHAR., EXIT
  57.     DCX    H
  58.     PUSH    D
  59.     LXI    D,TBLLO    ;TEST FOR TABLE END
  60.     MOV    A,D
  61.     CMP    L
  62.     JZ    NCFND    ;NO CHAR. FOUND
  63.     POP    D
  64.     MOV    A,C    ;GET CHAR.
  65.     JMP    TBLS1    ;TRY AGAIN
  66. ;OUTPUT CHAR. SUBROUTINE
  67. CHSND:    MOV    C,M    ;GET CHAR. FROM TABLE
  68. SHSND:    IN    STAT    ;CHECK STATUS
  69.     ANI    RDA    ;RCV DATA
  70.     JNZ    RCVCD
  71.     IN    STAT    ;CHECK STATUS
  72.     ANI    TBE    ;XMIT READY
  73.     JZ    SHSND    ;LOOP UNTIL READY
  74.     MOV    A,C    ;GET CHAR.
  75.     ANI    7FH    ;MASK 8TH BIT
  76.     OUT    DATA    ;SEND CHAR.
  77.     RET
  78. RCVCD:    IN    DATA    ;GET RCV CHAR.
  79.     CPI    7FH    ;IS IT CD ?
  80.     JNZ    SHSND    ;NO, GO ON
  81.     MVI    A,1    ;SET CD SW.
  82.     STA    SW03
  83.     JMP    SHSND
  84. ;PAD SUBROUTINES. CR PAD IS THE LINE COUNT (CTR01)
  85. ;DIVIDE BY 8 WITH 2 PAD CHARS. ADDED.
  86. PCR:    MVI    C,6DH    ;LOAD CHAR.
  87.     CALL    SHSND    ;SEND CHAR.
  88.     LDA    CTR01    ;GET CHAR. COUNT
  89.     RRC
  90.     RRC
  91.     RRC        ;DIVIDED BY 8
  92.     ANI    1FH    ;MASK 3 SHIFTED IN BITS
  93.     STA    CTR01    ;STORE PAD COUNT
  94.     MVI    C,3DH    ;SEND 1 PAD
  95.     CALL    SHSND
  96. PCR1:    MVI    C,3DH
  97.     CALL    SHSND
  98.     LDA    CTR01    ;GET PAD AMOUNT
  99.     ANA    A    ;SET FLAG
  100.     RZ        ;RETURN IF 0
  101.     DCR    A    ;DECR. PAD AMOUNT
  102.     STA    CTR01    ;STORE PAD AMOUNT
  103.     JMP    PCR1    ;GO AROUND AGAIN
  104. SPSD:    LDA    CTR01    ;GET CHAR. COUNT
  105.     ADI    1
  106.     STA    CTR01    ;STORE, AFTER ADDING 1
  107.     MVI    C,40H    ;LOAD SPACE
  108.     CALL    SHSND    ;SEND CHAR.
  109.     RET
  110. TABSD:    MVI    C,2FH    ;LOAD <TAB>
  111.     CALL    SHSND
  112.     MVI    C,3DH    ;LOAD PAD
  113.     CALL    SHSND
  114.     CALL    SHSND
  115.     CALL    SHSND
  116.     CALL    SHSND
  117.     CALL    SHSND
  118.     RET
  119. LFSD:    RET        ;SUPRESS <LF> SINCE FDOS ADDS IT
  120. BSPSD:    LDA    CTR01    ;GET CHAR. COUNT
  121.     SUI    1    ;DECR. COUNT AND -
  122.     STA    CTR01    ;STORE NEW VALUE
  123.     MVI    C,5DH    ;LOAD <BS>
  124.     CALL    SHSND    ;SEND CHAR.
  125.     RET
  126. EOTSD:    MVI    A,2    ;LOAD RCV. MODE CHAR.
  127.     STA    SW01    ;INTO SW. 1
  128.     MVI    A,0    ;LOAD <LOW SHIFT> CHAR.
  129.     STA    SW02    ;INTO SW02
  130.     STA    SW03    ;AND CLEAR CD. SW.
  131.     MVI    C,7CH    ;LOAD <EOT>
  132.     CALL    SHSND
  133.     RET
  134. NCFND:    POP    D
  135.     ANI    0
  136.     POP    H
  137.     RET
  138. ;EOA XMIT. SUBROUTINE
  139. SNEOA:    PUSH    B
  140.     MVI    A,1    ;SET XMIT. SW.
  141.     STA    SW01
  142.     MVI    C,34H    ;LOAD EOA
  143.     CALL    SHSND
  144.     POP    B
  145.     MVI    A,0    ;SET LOW SHIFT
  146.     STA    SW02
  147.     MVI    A,40H    ;1ST. CR PAD
  148.     STA    CTR01
  149.     MVI    A,0    ;CLEAR CD SW
  150.     STA    SW03
  151.     RET
  152. ;NOT IN XMIT. SEQUENCE
  153. NOXMT:    LDA    SW01    ;RCV. MODE ?
  154.     CPI    2
  155.     JNZ    XXX1    ;NOT IN RCV. OR XMIT.
  156.     LDA    LSTCH    ;GET LAST CHAR. COUNT
  157.     CMP    C
  158.     RZ        ;CHAR. SAME, GET NEXT
  159.     CPI    7FH    ;LAST CHAR. <DEL> ?
  160.     RZ
  161.     CPI    9    ;LAST CHAR. <TAB> ?
  162.     RZ
  163.     MOV    A,C
  164.     CPI    0AH    ;IS IT <LF>
  165.     RZ
  166.     CPI    '$'
  167.     RZ
  168. XXX1:    IN    STAT
  169.     ANI    RDA
  170.     JZ    XXX1
  171.     IN    DATA
  172.     CPI    7CH    ;<EOT> ?
  173.     JZ    SNEOA
  174.     CPI    7FH    ;<CD> ?
  175.     JNZ    XXX1
  176.     MVI    A,1    ;SET <CD> SW.
  177.     STA    SW03
  178.     JMP    XXX1
  179. LSTCH:    DS    1    ;LAST CHAR. SET STORAGE
  180. ;SHIFT XMIT SUBROUTINES
  181. LSSND:    MVI    C,1FH    ;LOAD L. SHIFT
  182.     CALL    SHSND
  183.     MVI    A,0    ;SET L. SHIFT
  184.     STA    SW02
  185.     RET
  186. USSND:    MVI    C,1CH    ;LOAD U. SHIFT
  187.     CALL    SHSND
  188.     MVI    A,1    ;SET U. SHIFT
  189.     STA    SW02
  190.     RET
  191. UPSHT:    LDA    SW02    ;GET SHIFT SW.
  192.     CPI    1    ;U. SHIFT=1
  193.     CNZ    USSND
  194. FINAL:    CALL    CHSND    ;SEND CHAR.
  195.     POP    H
  196.     RET
  197. TBLEX:    MOV    A,M    ;GET CHAR.
  198. ANI    80H        ;IS IT U. SHIFT CHAR.
  199.     JZ    UPSHT
  200.     LDA    SW02    ;CHECK SHIFT SW.
  201.     CPI    1
  202.     CZ    LSSND
  203.     JMP    FINAL
  204. ;BCD TO ASCII TABLE
  205. ;LOWER SHIFT CHARS.
  206. TBLLO    DB    0A3H,061H,093H,062H,0F3H,063H    ;a b c
  207.     DB    08BH,064H,0EBH,065H,0DBH,066H    ;d e f
  208.     DB    0BBH,067H,087H,068H,0E7H,069H    ;g h i
  209.     DB    0E1H,06AH,0D1H,06BH,0B1H,06CH    ;j k l
  210.     DB    0C9H,060H,0A9H,06EH,099H,06FH    ;m n o
  211.     DB    0F9H,070H,0C5H,071H,0A5H,072H    ;p q r
  212.     DB    0D2H,073H,0B2H,074H,0CAH,075H    ;s t u
  213.     DB    0AAH,076H,09AH,077H,0FAH,078H    ;v w x
  214.     DB    0C6H,079H,0A6H,07AH,0A0H,031H    ;y z 1
  215.     DB    090H,032H,0F0H,033H,088H,034H    ;2 3 4
  216.     DB    0E8H,035H,0D8H,036H,0B8H,037H    ;5 6 7
  217.     DB    084H,038H,0E4H,039H,0D4H,030H    ;8 9 0
  218.     DB    0F6H,02CH,0B7H,02EH,0E2H,02FH    ;, . /
  219.     DB    0F5H,024H,0B4H,023H,082H,040H    ;$ # @
  220.     DB    081H,02DH,0C3H,026H        ;- &
  221. ;UPPER SHIFT CHARS.
  222.     DB    023H,041H,013H,042H,073H,043H    ;A B C
  223.     DB    00BH,044H,06BH,045H,05BH,046H    ;D E F
  224.     DB    03BH,047H,007H,048H,067H,049H    ;G H I
  225.     DB    061H,04AH,051H,04BH,031H,04CH    ;J K L
  226.     DB    049H,04DH,029H,04EH,019H,04FH    ;M N O
  227.     DB    079H,050H,045H,051H,025H,052H    ;P Q R
  228.     DB    052H,053H,032H,054H,04AH,055H    ;S T U
  229.     DB    02AH,056H,01AH,057H,07AH,058H    ;V W X
  230.     DB    046H,059H,026H,05AH,020H,03DH    ;Y Z =
  231.     DB    010H,03CH,070H,03BH,008H,03AH    ;< ; :
  232.     DB    068H,025H,058H,027H,038H,03EH    ;% ' >
  233.     DB    004H,02AH,064H,028H,054H,029H    ;* ( )
  234.     DB    076H,07CH,037H,003H,062H,03FH    ;1 <ETX> ?
  235.     DB    075H,021H,034H,022H,002H,060H    ;! " <CENTS>
  236.     DB    001H,05FH,043H            ;_ +
  237. TBLHI:    DB    02BH
  238. ;END OF TABLE
  239. SW01    DS    1    ;0=OFF/1=XMIT/2=RCV
  240. SW02    DS    1    ;0=LOWER SHIFT
  241. SW03    DS    1    ;1=<CD> RECEIVED
  242. CTR01:    DS    1    ;CHAR. COUNTER
  243.     END
  244.