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 / TTY.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  8KB  |  350 lines

  1. ;SYSTEM EQUATES
  2. UART1    EQU    02400H    ;ASCII PORT
  3. UART2    EQU    02B00H    ;TTY PORT
  4. ;    BEGINING OF ROUTINE
  5.     ORG    0400H
  6. ;
  7. LOOP:
  8.     LDA    UART1+1
  9.     ANI    02H
  10.     JZ    LOOP1
  11.     LDA    UART1
  12.     ANI    7FH
  13.     CPI    0DH
  14.     CZ    CRLF
  15.     STA    UART1
  16.     CALL    TTYXMIT
  17. LOOP1:
  18.     LDA    UART2+1
  19.     ANI    02H
  20.     JZ    LOOP
  21.     CALL    TTYRCV
  22.     STA    UART1
  23.     JMP    LOOP
  24. CRLF:
  25.     PUSH    PSW
  26.     CALL    TTYXMIT
  27.     MVI    A,0DH
  28.     CALL    TTYXMIT
  29.     MVI    A,0AH
  30.     STA    UART1
  31.     CALL    TTYXMIT
  32.     POP    PSW
  33.     RET
  34. ;    ASCRCV(4), VER. 2
  35. ; BY KEITH PETERSEN, W8SDZ.  10/30/78.
  36. ; THIS IS A PROGRAM TO CHANGE
  37. ; ASCII-CODED-BAUDOT TO ASCII.
  38. ; THE ROUTINE RETURNS WITH A 0FFH
  39. ; IN THE 'A' REGISTER IF CHARACTER
  40. ; IS TO BE IGNORED.  OTHERWISE IT
  41. ; RETURNS WITH THE ASCII CHARACTER
  42. ; IN THE 'A' REGISTER.  IT IS ASSUMED
  43. ; THAT A STATUS TEST HAS BEEN DONE BEFORE
  44. ; CALLING THIS ROUTINE TO DETERMINE THAT
  45. ; A BAUDOT CHARACTER IS AVAILABLE.
  46. ; EQUATES
  47. BTTY:    EQU    02B00H    ;BAUDOT UART DATA PORT
  48. CR:    EQU    0DH    ;ASCII CARRIAGE RETURN
  49. LF:    EQU    0AH    ;ASCII LINE FEED
  50. BELL:    EQU    07H    ;ASCII BELL
  51. LTRS:    EQU    1FH    ;BAUDOT 'LTRS'
  52. SPACE:    EQU    04H    ;BAUDOT 'SPACE'
  53. FIGS:    EQU    1BH    ;BAUDOT 'FIGS'
  54. APOS:    EQU    27H    ;APOSTROPHE
  55. CNTC:    EQU    03H    ;CONTROL C
  56. LARW:    EQU    5FH    ;LEFT ARROW
  57. ASPC:    EQU    20H    ;ASCII SPACE
  58. ATSN:    EQU    40H    ;"AT" SIGN
  59. CNTV:    EQU    16H    ;CONTROL V
  60. CNTO:    EQU    0FH    ;CONTROL O
  61. RUBT:    EQU    7FH    ;RUBOUT
  62. CNTE:    EQU    05H    ;CONTROL E
  63. PCT:    EQU    25H    ;PERCENT SIGN
  64. EQUL:    EQU    3DH    ;EQUALS SIGN
  65. GRTH:    EQU    3EH    ;GREATER-THAN SIGN
  66. CNTH:    EQU    08H    ;CONTROL H
  67. LETH:    EQU    3CH    ;LESS-THAN SIGN
  68. CNTB:    EQU    02H    ;CONTROL B
  69. STAR:    EQU    2AH    ;ASTERISK
  70. CNTI:    EQU    09H    ;CONTROL I
  71. CNTZ:    EQU    1AH    ;CONTROL Z
  72. CNTA:    EQU    01H    ;CONTROL A
  73. CNTX:    EQU    18H    ;CONTROL X
  74. UARW:    EQU    5EH    ;UP-ARROW
  75. PLUS:    EQU    2BH    ;PLUS SIGN
  76. RESL:    EQU    5CH    ;REVERSE SLANT
  77. LBKT:    EQU    5BH    ;LEFT BRACKET
  78. RBKT:    EQU    5DH    ;RIGHT BRACKET
  79. ESCP:    EQU    1BH    ;ESCAPE KEY
  80. ALMD:    EQU    7DH    ;ALTERNATE MODE KEY
  81. BEGIN:    EQU    $    ;MY ADDRESS FOR THIS PROGRAM
  82. ; PROGRAM STARTS HERE
  83. TTYRCV:
  84. ASCRCV:    PUSH    H    ;SAVE HL REGISTERS
  85.     LHLD    CASAVE    ;GET PRESENT CASE
  86. START:    LDA    BTTY    ;GET BAUDOT CHARACTER
  87.     ANI    1FH    ;BAUDOT CHARACTERS ONLY
  88.     CPI    FIGS
  89.     JZ    UCASE
  90.     CPI    LTRS
  91.     JZ    LCASE
  92.     ORA    A    ;BAUDOT 'BLANK' ?
  93.     JZ    TCASE
  94.     CPI    SPACE
  95.     JNZ    START1
  96.     LXI    H,LTABLE ;SPACE GIVES LOWER CASE
  97. START1:    SHLD    CASAVE    ;SAVE PRESENT CASE
  98.     ADD    L    ;ADD CHAR. TO TABLE ADRS.
  99.     MOV    L,A    ;L POINTS TO ASCII CHAR.
  100.     MOV    A,H    ;GET H FOR CORRECTION
  101.     ACI    0    ;SEE IF CORRECTION NEEDED
  102.     MOV    H,A    ;H IS CORRECT NOW
  103.     XRA    A    ;PUT ZERO IN A REG.
  104.     STA    FLAG    ;CLEAR LTRS-FIGS LAST FLAG
  105.     MOV    A,M    ;GET ASCII EQUIVALENT
  106.     POP    H    ;RESTORE HL REGISTERS
  107.     ORA    A    ;IS IT PRINTABLE?
  108.     RNZ        ;YES, VALID CHAR. RETURN
  109.     CMA        ;MAKE 0FFH 'IGNORE FLAG'
  110.     RET        ;RETURN TO CALLING PROGRAM
  111. LCASE:    LXI    H,LTABLE ;LOWER CASE TABLE ADDRESS
  112.     JMP    SETFLG    ;SET LTRS LAST FLAG, EXIT
  113. UCASE:    LXI    H,UTABLE ;UPPER CASE TABLE ADDRESS
  114.     JMP    SETFLG    ;SET FIGS LAST FLAG, EXIT
  115. TCASE:    LDA    FLAG    ;GET SHIFT REMINDER FLAG
  116.     CPI    FIGS
  117.     JNZ    FCASE
  118.     LXI    H,TTABLE ;THIRD CASE TABLE ADDRESS
  119.     JMP    CLRFLG
  120. FCASE:    CPI    LTRS    ;CHECK FOR LTRS LAST
  121.     JNZ    CLRFLG
  122.     LXI    H,FTABLE ;FOURTH CASE TABLE ADDRESS
  123. CLRFLG:    XRA    A    ;READY TO CLEAR FLAG
  124. SETFLG:    STA    FLAG    ;LTRS-FIGS LAST FLAG
  125.     SHLD    CASAVE    ;SAVE PRESENT CASE
  126.     MVI    A,0FFH    ;'IGNORE FLAG'
  127.     POP    H    ;RESTORE HL REGS.
  128.     RET        ;RETURN TO CALLING PROGRAM
  129. ; THIS IS THE LOWER-CASE TABLE.
  130. LTABLE:    DB    0,'E',LF,'A SIU',CR,'DRJNFCK'
  131.     DB    'TZLWHYPQOBG',FIGS,'MXV'
  132. ; THIS IS THE UPPER-CASE TABLE.
  133. UTABLE:    DB    0,'3',LF,'- ',BELL,'87',CR,'$4'
  134.     DB    APOS,',!:(5")2#6019?&',FIGS,'./;'
  135. ; THIS IS THE THIRD-CASE TABLE.
  136. ; IT IS USED FOR SPECIAL CHARACTERS.
  137. ; THE FIRST COLUMN IN THE TABLE
  138. ; THE ASCII CHARACTER EQUIVALENT.
  139. ; THE SECOND COLUMN IS THE SPECIAL
  140. ; CASE BAUDOT CHARACTER FROM WHICH
  141. ; THE CONVERSION IS MADE.
  142. TTABLE:    DB    0,CNTC,LF    ;BL  3   LF
  143.     DB    LARW,ASPC,ATSN    ;-   SP  BELL
  144.     DB    CNTV,CNTO,CR    ;8   7   CR
  145.     DB    ALMD,CNTE,PCT    ;$   4   '
  146.     DB    RUBT,EQUL,ESCP    ;,   !   :
  147.     DB    LETH,CNTH,LBKT    ;(   5   "
  148.     DB    GRTH,CNTB,STAR    ;)   2   #
  149.     DB    CNTI,CNTZ,CNTA    ;6   0   1
  150.     DB    CNTX,UARW,PLUS    ;9   ?   &
  151.     DB    0,RBKT,RESL    ;FIG .   /
  152.     DB    0            ;;
  153. ; THIS IS THE FOURTH CASE TABLE
  154. ; FOR LOWER-CASE ALPHA CHARACTERS.
  155. FTABLE:    DB    0,65H,LF,61H,ASPC,73H
  156.     DB    69H,75H,CR,64H,72H,6AH
  157.     DB    6EH,66H,63H,6BH,74H,7AH
  158.     DB    6CH,77H,68H,79H,70H,71H
  159.     DB    6FH,62H,67H,FIGS,6DH,78H
  160.     DB    76H
  161. ; TEMPORARY STORAGE AREA
  162. ;        ASCXMT(4) REV. 2
  163. ;    BY KEITH PETERSEN, W8SDZ.  10/29/78.
  164. ; THIS PROGRAM IS FOR TRANSMITTING ASCII
  165. ; THROUGH A BAUDOT MEDIUM USE A SPECIAL
  166. ; FORMAT OF FIGURES BLANK (X) - WHERE (X)
  167. ; IS A SPECIAL BAUDOT CHARACTER USED TO
  168. ; CONVEY THE ASCII EQUIVALENT CHARACTER TO THE
  169. ; RECEIVING END WHERE IT IS THEN CONVERTED BACK
  170. ; TO ASCII AGAIN.  LOWER CASE ALPHA CHARACTERS
  171. ; ARE TRANSMITTED VIA A 4TH CASE, LTRSX BLANK (X).
  172. ;
  173. ; EQUATES
  174. LTRSX:    EQU    1FH
  175. FIGSX:    EQU    1BH
  176. CRX:    EQU    48H
  177. LFX:    EQU    42H
  178. ALTMOD:    EQU    7DH    ;ALTERNATE MODE KEY
  179. ;          PROGRAM STARTS HERE.
  180. TTYXMIT:
  181. ; CALL WITH ASCII CHARACTER IN ACCUMULATOR.
  182. STARTX:    PUSH    PSW    ;SAVE REGISTERS USED
  183.     PUSH    B
  184.     PUSH    H
  185. BAUDOT:    MVI    C,0    ;SET UP COUNTER
  186.     ANI    7FH    ;STRIP PARITY BIT
  187.     CPI    ALTMOD    ;ALTERNATE MODE KEY?
  188.     JNZ    BAUD2    ;NO, IGNORE NEXT ROUTINE
  189.     MVI    A,09H    ;BAUDOT '$'
  190.     JMP    BAUD3
  191. BAUD2:    CPI    7BH    ;ABOVE L.C. 'Z' ?
  192.     JNC    TTY0    ;IF SO, IGNORE IT
  193.     LXI    H,BTABLE ;POINT TO TABLE START
  194.     ADD    L    ;ADD CHARACTER VALUE
  195.     MOV    L,A    ;L POINTS TO BAUDOT CHAR.
  196.     MOV    A,H    ;GET H FOR CORRECTION
  197.     ACI    0    ;CORRECT IF NECESSARY
  198.     MOV    H,A    ;H IS NOW CORRECT
  199.     MOV    A,M    ;GET BAUDOT CHARACTER
  200.     ORA    A    ;IS IT A NON-PRINTING CHAR?
  201.     JZ    TTY0    ;IF SO IGNORE IT
  202.     CPI    CRX    ;IS IT A CARRIAGE RETURN?
  203.     JZ    TTYOUT-1 ;YES, HANDLE WITHOUT CASE TEST
  204.     CPI    LFX    ;IS IT A LINE FEED?
  205.     JNZ    BAUD3    ;NO, IGNORE NEXT ROUTINE
  206.     MVI    A,LTRSX    
  207.     PUSH    PSW    ;SAVE IT ON STACK
  208.     MVI    A,LFX
  209.     LXI    H,SCASE    ;POINT TO PRESENT CASE REG.
  210.     MVI    M,40H    ;SET IT TO LOWER CASE
  211.     JMP    TTYOUT-2 ;SEND LF AND LTRSX
  212. BAUD3:    PUSH    PSW    ;SAVE CHARACTER
  213.     ANI    0C0H    ;STRIP ALL BUT CASE BITS
  214.     LXI    H,SCASE    ;POINT TO PRESENT CASE REG.
  215.     CMP    M    ;SAME CASE AS PREVIOUS CHARACTER?
  216.     JZ    TTYOUT    ;YES NO CHANGE NECESSARY
  217.     MOV    M,A    ;UPDATE CASE REGISTER
  218.     ORA    A
  219.     JZ    TCASEX
  220.     CPI    80H
  221.     JZ    UCASEX
  222.     CPI    0C0H
  223.     JNZ    LCASEX
  224. FCASEX:    XRA    A    ;GET A BAUDOT 'BLANK'
  225.     PUSH    PSW    ;SAVE IT ON THE STACK
  226.     INR    C    ;INCRXEMENT CHARACTER COUNT
  227. LCASEX:    MVI    A,LTRSX
  228.     JMP    TTYOUT-2
  229. TCASEX:    XRA    A    ;GET A BAUDOT 'BLANK'
  230.     PUSH    PSW    ;SAVE IT ON THE STACK
  231.     INR    C    ;INCRXEMENT CHARACTER COUNT
  232. UCASEX:    MVI    A,FIGSX
  233.     INR    C    ;INCRXEMENT CHARACTER COUNT
  234.     PUSH    PSW    ;SAVE IT ON THE STACK
  235. TTYOUT:
  236.     LDA    UART2+1
  237.     ANI    1
  238.     JZ    TTYOUT
  239.     POP    PSW    ;GET CHARACTER
  240. ;
  241.     ORI    0E0H    ;MAKE UPPER 3 BITS MARKING
  242.     STA    UART2    ;SEND TO BAUDOT PORT
  243.     DCR    C    ;MORE TO SEND?
  244.     JP    TTYOUT    ;YES, CONTINUE SENDING
  245. TTY0:    POP    H    ;RESTORE REGISTERS
  246.     POP    B
  247.     POP    PSW
  248.     RET        ;RETURN TO CALLING PROGRAM
  249. BTABLE:    DB    5FH,17H,13H    ;NUL SOH STX
  250.     DB    1,0,0AH        ;ETX EOT ENQ
  251.     DB    0,85H,10H    ;ACK BEL BS
  252.     DB    15H,42H,0C2H    ;HT  LF  VT
  253.     DB    2,48H,0        ;FF  CRX  SO
  254.     DB    7,0,0        ;SI  DLE DC1
  255.     DB    0,0,0        ;DC2 DC3 DC4
  256.     DB    0,6,0        ;NAK SYN ETB
  257.     DB    18H,0,16H    ;CAN EM  SUB
  258.     DB    0EH,0,0        ;ESC FS  GS
  259.     DB    0,0,44H        ;RS  US  SPACE
  260.     DB    8DH,91H,94H    ;!   "   #
  261.     DB    89H,0BH,9AH    ;$   PCT &
  262.     DB    8BH,8FH,92H    ;'   (   )
  263.     DB    14H,1AH,8CH    ;AS  PL  ,
  264.     DB    83H,9CH,9DH    ;-   .   /
  265.     DB    96H,97H,93H    ;0   1   2
  266.     DB    81H,8AH,90H    ;3   4   5
  267.     DB    95H,87H,86H    ;6   7   8
  268.     DB    98H,8EH,9EH    ;9   :   ;
  269.     DB    0FH,0DH,12H    ;LT  EQ  GT
  270.     DB    99H,5,43H    ;?   AT  A
  271.     DB    59H,4EH,49H    ;B   C   D
  272.     DB    41H,4DH,5AH    ;E   F   G
  273.     DB    54H,46H,4BH    ;H   I   J
  274.     DB    4FH,52H,5CH    ;K   L   M
  275.     DB    4CH,58H,56H    ;N   O   P
  276.     DB    57H,4AH,45H    ;Q   R   S
  277.     DB    50H,47H,5EH    ;T   U   V
  278.     DB    53H,5DH,55H    ;W   X   Y
  279.     DB    51H,11H,1DH    ;Z   LB  LS
  280.     DB    1CH,19H,3    ;RB  UA  LA
  281. ; THESE ARE THE LOWER CASE ALPHA CHARACTERS
  282.     DB    0,0C3H,0D9H    ;'   A   B
  283.     DB    0CEH,0C9H,0C1H    ;C   D   E
  284.     DB    0CDH,0DAH,0D4H    ;F   G   H
  285.     DB    0C6H,0CBH,0CFH    ;I   J   K
  286.     DB    0D2H,0DCH,0CCH    ;L   M   N
  287.     DB    0D8H,0D6H,0D7H    ;O   P   Q
  288.     DB    0CAH,0C5H,0D0H    ;R   S   T
  289.     DB    0C7H,0DEH,0D3H    ;U   V   W
  290.     DB    0DDH,0D5H,0D1H    ;X   Y   Z
  291. ; TEMPORARY STORAGE AREA
  292. RAM    EQU    1400H
  293.     ORG    RAM
  294. SCASE:    DB    40H    ;PRESENT CASE REGISTER
  295.   
  296. ; TEMPORARY STORAGE AREA
  297. CASAVE:    DW    LTABLE    ;PRESENT CASE REMINDER
  298. FLAG:    DB    0    ;FIGS/LTRS LAST FLAG
  299.