home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / hamradio / rtty3.lbr / RTTY3.AZM / RTTY3.ASM
Assembly Source File  |  1987-02-21  |  32KB  |  1,365 lines

  1. ; RTTY.ASM    Version 2.0    By G.F.Reding        02/13/86
  2. ;
  3. ; --------------------------------------------------------------
  4. ;
  5. ; Ascii to Baudot to Ascii program with buffer to disk and disk
  6. ; to buffer routines (taken frop 'PLINK.ASM' by L.E.Hughs
  7. ;                Randy Suess 12/20/78
  8. ;
  9. ; --------------------------------------------------------------
  10. ;
  11. ; 02/13/86    Program and version upgrade
  12. ; v 3.1        by G.F.Reding  [72436,45]
  13. ;
  14. ; Capture to memory may be toggled on or off as desired.
  15. ;
  16. ; Transmit text file and write to disk options prompt for the
  17. ; drive in addition to the filename.
  18. ;
  19. ; Baudot or ascii receive/transmit modes may be selected, with
  20. ; the program initially starting in baudot mode. Upon change of
  21. ; mode, the bits/parity are changed, speed is set to the lowest
  22. ; rate for the appropriate mode, and a flag is appropriately set
  23. ; which determines if ascii/baudot or ascii/baudot conversion is
  24. ; to be performed and it's also used in the speed display/change
  25. ; routines.
  26. ;
  27. ; The speed may be viewed and/or changed.  If change is desired,
  28. ; the speed is stepped up to the next higher rate available for
  29. ; the (ascii or baudot) mode.  Once the highest rate is reached,
  30. ; the next rate will be the lowest rate for the current mode.
  31. ;
  32. ; The program has been cleaned up and improved. It is comparable
  33. ; to version 6.7 of PLINK from which a lot of the routines came.
  34. ; Messages are given at most times, making the program fairly
  35. ; user-friendly.
  36. ;
  37. ; Note:  Console and serial port i/o is shown for a Zilog SIO.
  38. ;
  39. ;                    G.F.Reding  [72436,45]
  40. ;                    02/13/86
  41. ;
  42. ; Future upgrades could include a buffered send routine, possibly
  43. ; split screen mode of operation for send/receive,  25th line for
  44. ; status of the program and/or command options,  AMTOR mode, etc.
  45. ; Any helpers out there?
  46. ;
  47. ; --------------------------------------------------------------
  48. ;
  49. ; System and program equates
  50. ;
  51. BASE    EQU    0        ; Standard = 0, Alternate 4200H
  52. BDOS    EQU    BASE+5
  53. DBUF    EQU    BASE+80H    ; Default disk buffer address
  54. FCB    EQU    BASE+5CH    ; File control block
  55. FN    EQU    1        ; File name field (rel)
  56. FT    EQU    9        ; File type field (rel)
  57. NR    EQU    32        ; Next record field (rel)
  58. ;
  59. RESDSK    EQU    13        ; Reset disk
  60. OFFC    EQU    15        ; Open file
  61. CFFC    EQU    16        ; Close file
  62. DFFC    EQU    19        ; Delete file
  63. RRFC    EQU    20        ; Read record
  64. WRFC    EQU    21        ; Write record
  65. MFFC    EQU    22        ; Make file
  66. ;
  67. BEL    EQU    07H        ; Bell
  68. LF    EQU    0AH        ; Line feed
  69. CR    EQU    0DH        ; Carriage return
  70. DEL    EQU    7FH        ; Delete
  71. ;
  72. ; I/O Port addresses and masks
  73. ;
  74. COND    EQU    60H        ; Console data port
  75. CONS    EQU    61H        ; Console status port
  76. CRBF    EQU    01H        ; Receive buffer full (ready)
  77. CTBE    EQU    04H        ; Transmit buffer empty (ready)
  78. ;
  79. MODD    EQU    62H        ; Modem data port
  80. MODS    EQU    63H        ; Modem status port
  81. MRBF    EQU    01H        ; Receive buffer full (ready)
  82. MTBE    EQU    04H        ; Transmit buffer empty (ready)
  83. ;
  84. BRPORT    EQU    053H
  85. BAUDS    EQU    051H
  86. MODEW    EQU    07EH        ; Value for BRPORT
  87. ;
  88. EV1:    EQU    046H        ; Reg 4 - even parity, 1 stop
  89. NO1:    EQU    044H        ; Reg 4 - no parity, 1 stop
  90. NO5:    EQU    048H        ; Reg 4 - no parity, 1.5 stop
  91. RX5:    EQU    001H        ; Reg 3 - 5 bit, rx enable
  92. RX7:    EQU    041H        ; Reg 3 - 7 bit, rx enable
  93. RX8:    EQU    0C1H        ; Reg 3 - 8 bit, rx enable
  94. TX5:    EQU    08AH        ; Reg 5 - dtr, rts, tx on, 5 bit
  95. TX7:    EQU    0AAH        ; Reg 5 - dtr, rts, tx on, 7 bit
  96. TX8:    EQU    0EAH        ; Reg 5 - dtr, rts, tx on, 8 bit
  97. ;
  98. ;
  99. ; Command control characters
  100. ;
  101. KYEXIT    EQU    'E'-40H        ; Exit program to CPM
  102. KYMODE    EQU    'A'-40H        ; Mode (baudot/ascii) toggle
  103. KYABRT    EQU    'C'-40H        ; Abort file transmit
  104. KYSPED    EQU    'R'-40H        ; Speed display/change (steps)
  105. KYTRAN    EQU    'T'-40H        ; Transmit text file from disk
  106. KYCAPT    EQU    'Y'-40H        ; Ascii capture (yank) toggle
  107. KYWRIT    EQU    'W'-40H        ; Write to disk (disables capture)
  108. ;
  109. ;
  110. ; EQUATES FOR THE BAUDOT SEND/RECEIVE ROUTINES
  111. ;
  112. ALTM:    EQU    7DH        ; Alternate mode key
  113. ;
  114. FIGS:    EQU    1BH        ; Baudot 'figs'
  115. LTRS:    EQU    1FH        ; Baudot 'ltrs'
  116. SPACE:    EQU    04H        ; Baudot 'space'
  117. ;
  118. CNTA:    EQU    01H        ; Control a
  119. CNTB:    EQU    02H        ; Control b
  120. CNTC:    EQU    03H        ; Control c
  121. CNTE:    EQU    05H        ; Control e
  122. CNTH:    EQU    08H        ; Control h
  123. CNTI:    EQU    09H        ; Control i
  124. CNTO:    EQU    0FH        ; Control o
  125. CNTV:    EQU    16H        ; Control v
  126. CNTX:    EQU    18H        ; Control x
  127. CNTZ:    EQU    1AH        ; Control z
  128. ;
  129. ASPC:    EQU    20H        ; Ascii space
  130. APOS:    EQU    27H        ; Apostrophe
  131. ATSN:    EQU    40H        ; "at" SIGN
  132. EQL:    EQU    3DH        ; Equals sign
  133. ESCP:    EQU    1BH        ; Escape key
  134. GRTH:    EQU    3EH        ; Greater-than sign
  135. LARW:    EQU    5FH        ; Left arrow
  136. LBKT:    EQU    5BH        ; Left bracket
  137. LETH:    EQU    3CH        ; Less-than sign
  138. PCT:    EQU    25H        ; Percent sign
  139. PLUS:    EQU    2BH        ; Plus sign
  140. RBKT:    EQU    5DH        ; Right bracket
  141. RESL:    EQU    5CH        ; Reverse slant
  142. STAR:    EQU    2AH        ; Asterisk
  143. UARW:    EQU    5EH        ; Up-arrow
  144. ;
  145. CRX:    EQU    48H
  146. LFX:    EQU    42H
  147. ;
  148. ;
  149. ; MAIN PROGRAM
  150. ;
  151.     ORG    BASE+100H
  152. ;
  153. LINK:    LXI    H,0        ; Save old stack ptr
  154.     DAD    SP
  155.     SHLD    OLDSP
  156.     LXI    SP,STACK+64    ; Create local stack
  157. ;
  158. LINK2:    LXI    H,TBUF        ; Set ptr to tbuf
  159.     SHLD    PTR
  160.     LXI    H,0        ; Size = 0
  161.     SHLD    SIZE
  162.  
  163.     LXI    H,LINK1M    ; Signon and help message
  164.     CALL    WCS        ; Print it
  165.     CALL    MDIN5N        ; 5 bit no parity 1.5 stop
  166.     CALL    MDSTB1        ; Set low baudot rate
  167.     LXI    H,MODEBM    ; Baudot mode message
  168.     CALL    WCS        ; Print it
  169. ;
  170. ;
  171. ; MAIN LOOP
  172. ;
  173. LINK3:    IN    CONS        ; Get console status
  174.     ANI    CRBF
  175.     JZ    LINK4        ; Jump if no data
  176.     IN    COND        ; Else read console data
  177.     OUT    COND        ; Echo to terminal
  178.     ANI    7FH        ; Call pcc if control char
  179.     CPI    20H
  180.     CC    PCC1
  181.     JC    LINK4        ; Jump if pcc handled char
  182.     ORI    80H        ; Else set valid data bit
  183.     STA    INCH        ; Store in input char buffer
  184. ;
  185. LINK4:    LDA    OUTCH        ; Get data for console
  186.     ORA    A
  187.     JP    LINK5        ; Jump if no data for console
  188.     ANI    7FH        ; Else discard valid data bit
  189.     OUT    COND        ; And output char to console
  190.     XRA    A        ; Then clear output char buffer
  191.     STA    OUTCH
  192. ;
  193. LINK5:    IN    MODS        ; Get status
  194.     ANI    MRBF
  195.     JZ    LINK6        ; Jump if no data from rtty
  196.     CALL    RMC        ; Call rtty read routine
  197.     CALL    SAVE        ; Save char in text buffer if flag on
  198.     ORI    80H        ; Set data valid bit
  199.     STA    OUTCH        ; Store in output char buffer
  200. ;
  201. LINK6:    IN    MODS        ; Get status
  202.     ANI    MTBE
  203.     JZ    LINK3        ; Jump if rtty xmit buffer busy
  204.     LDA    INCH        ; Jump if no data for rtty
  205.     ORA    A
  206.     JP    LINK3
  207.     ANI    7FH        ; Else discard valid data bit
  208. ;
  209.     CPI    CR        ; For each cr to send
  210.     JNZ    LINK7
  211.     MVI    A,CR        ; Added code
  212.     CALL    WMC        ; To send two cr
  213.     CALL    WMC
  214.     MVI    A,LF        ; And one lf
  215.     OUT    COND        ; Echo lf to console
  216. ;
  217. LINK7:    CALL    WMC
  218.     XRA    A        ; Then clear input char buffer
  219.     STA    INCH
  220.     JMP    LINK3        ; End of main loop
  221. ;
  222. ;
  223. ; PCC - PROCESS CONTROL CHARACTER
  224. ;
  225. PCC1:    CPI    KYEXIT        ; Exit program?
  226.     JNZ    PCC2        ; No, check more
  227.     PUSH    H
  228.     LXI    H,EXIT1M    ; Exit confirm message
  229.     CALL    WCS        ; Print it
  230.     POP    H
  231.     CALL    RCC        ; Get answer
  232.     CALL    WCC        ; Echo it
  233.     ANI    5FH        ; Make upper case
  234.     CPI    'Y'        ; If yes
  235.     JZ    PCC1A        ; Then continue exit
  236.     CALL    WCCR        ; Else cr/lf
  237.     LXI    H,EXITNM    ; No exit message
  238.     CALL    WCS        ; Print it
  239.     STC            ; Ignore the char
  240.     RET
  241. ;
  242. PCC1A:    PUSH    H
  243.     LHLD    SIZE        ; Get capture buffer size
  244.     MOV    A,L        ; Check
  245.     ORA    H        ; If anything there
  246.     JZ    PCC1B        ; No, exit simply
  247.     LXI    H,EXIT2M    ; Save buffer message
  248.     CALL    WCS        ; Print it
  249.     POP    H
  250.     CALL    RCC        ; Get save answer
  251.     CALL    WCC        ; Echo it
  252.     ANI    5FH        ; Make upper case
  253.     CPI    'Y'        ; If yes
  254.     CZ    WTB        ; Then save the buffer
  255.     JMP    PCC1C        ; And exit
  256. ;
  257. PCC1B:    POP    H
  258. PCC1C:    LXI    H,EXITYM    ; Exit to cp/m message
  259.     CALL    WCS        ; Print it
  260.     CALL    MDIN8N        ; Reset to 8 bit no parity 1 stop
  261.     CALL    MDSTA6        ; 1200 baud
  262.     LHLD    OLDSP        ; Clean up act, exit to cp/m
  263.     SPHL
  264.     RET
  265. ;
  266. PCC2:    CPI    KYTRAN        ; Transmit a file?
  267.     JNZ    PCC3
  268.     CALL    STF        ; Send ascii file to rtty
  269.     STC            ; Ignore the char
  270.     RET
  271. ;
  272. PCC3:    CPI    KYMODE        ; Change mode?
  273.     JNZ    PCC4        ; No, check more
  274.     LDA    FLAGM
  275.     DCR    A        ; Was the flag zero
  276.     JNZ    PCC3A        ; Yes, so go set to 1
  277.     STA    FLAGM        ; No, was 1, now zero
  278.     CALL    MDIN5N        ; 5 bit no parity 1.5 stop
  279.     CALL    MDSTB1        ; Set low baudot rate
  280.     LXI    H,MODEBM    ; Baudot mode message
  281.     JMP    PCC3B
  282. ;
  283. PCC3A:    MVI    A,1        ; Turn on capture flag
  284.     STA    FLAGM
  285.     CALL    MDIN7E        ; 7 bit even parity 1 stop
  286.     CALL    MDSTA1        ; Set low ascii rate
  287.     LXI    H,MODEAM    ; Ascii mode message
  288.  
  289. PCC3B:    CALL    WCS        ; Print it
  290.     STC            ; Ignore the char
  291.     RET
  292. ;
  293. PCC4:    CPI    KYCAPT        ; Yank (capture)?
  294.     JNZ    PCC5        ; No, check more
  295.     LDA    FLAGC
  296.     DCR    A        ; Was the flag zero
  297.     JNZ    PCC4A        ; Yes, so go set to 1
  298.     STA    FLAGC        ; No, was 1, now zero
  299.     LXI    H,CAPTNM    ; Capture off message
  300.     JMP    PCC4B
  301. ;
  302. PCC4A:    MVI    A,1        ; Turn on capture flag
  303.     STA    FLAGC
  304.     LXI    H,CAPTYM    ; Capture on message
  305.  
  306. PCC4B:    CALL    WCS        ; Print it
  307.     STC            ; Ignore the char
  308.     RET
  309. ;
  310. PCC5:    CPI    KYWRIT        ; Write buffer?
  311.     JNZ    PCC6        ; No, check more
  312.     XRA    A        ; Turn off capture flag
  313.     STA    FLAGC
  314.     CALL    WTB        ; Write text buffer to disk
  315.     STC            ; Ignore the char
  316.     RET
  317. ;
  318. PCC6:    CPI    KYSPED        ; Speed change?
  319.     JNZ    PCC7        ; No, invalid command
  320.     CALL    MDTELL        ; Display and/or change speed
  321.     STC            ; Ignore the char
  322.     RET
  323. ;
  324. PCC7:    STC            ; Link handle all other ctrl chars
  325.     CMC
  326.     RET
  327. ;
  328. ; STF - SEND TEXT FILE (TO RTTY)
  329. ;
  330. STF:    CALL    GFN        ; Get file name to send
  331.     JC    STF6        ; Jump if file name error
  332.     CALL    OPEN        ; Try to open specified file
  333.     CPI    255        ; Jump if file not found
  334.     JZ    STF7
  335.     XRA    A        ; Else rewind file and continue
  336.     STA    FCB+NR
  337. ;
  338. STF1:    CALL    READ        ; Read next record into dbuf
  339.     CPI    1        ; Jump if end-of-file
  340.     JZ    STF5
  341.     LXI    H,DBUF        ; Point to disk buffer
  342.     MVI    C,128
  343. ;
  344. STF2:    MOV    A,M        ; Fetch next char from dbuf
  345.     INX    H
  346.     CPI    'Z'-40H        ; Jump if end-of-file char
  347.     JZ    STF5
  348.  
  349.     CALL    WMC        ; Write char to rtty
  350.     CALL    WCC        ; Write char to console
  351.     IN    CONS        ; Get console status
  352.     ANI    CRBF        ; Anything there
  353.     JZ    STF4        ; No, skip over
  354.     IN    COND        ; Else get the char
  355.     ANI    7FH        ; Strip parity
  356.     CPI    KYABRT        ; Check for ctrl c abort
  357.     JZ    STF8
  358. ;
  359. STF4:    DCR    C        ; Loop thru rest of dbuf
  360.     JNZ    STF2
  361.     JMP    STF1        ; Go get next record from disk
  362. ;
  363. STF5:    CALL    CLOSE        ; Clean up act
  364.     LXI    H,STFS1M    ; Transfer complete message
  365.     CALL    WCS        ; Print it
  366.     RET
  367. ;
  368. STF6:    LXI    H,STFS2M    ; File name error message
  369.     CALL    WCS        ; Print it
  370.     RET
  371. ;
  372. STF7:    LXI    H,STFS3M    ; File not found message
  373.     CALL    WCS        ; Print it
  374.     RET
  375. ;
  376. STF8:    CALL    CLOSE        ; Clean up act
  377.     LXI    H,STFS4M    ; Transfer aborted message
  378.     CALL    WCS        ; Print it
  379.     RET
  380. ;
  381. ;
  382. ; SAVE - SAVE CHAR IN TEXT BUFFER IF FLAG ON
  383. ;
  384. ;    ENTRY:    A - CHARACTER TO SAVE
  385. ;
  386. SAVE:    PUSH    PSW
  387.     LDA    FLAGC
  388.     ORA    A
  389.     JNZ    SAVE1
  390.     POP    PSW
  391.     RET
  392. ;
  393. SAVE1:    POP    PSW
  394.     ANI    7FH        ; Discard parity bit
  395.     RZ            ; Return if char is a null
  396. ;
  397. SAVE2:    PUSH    H
  398.     LHLD    SIZE        ; Get the size
  399.     INX    H        ; Increment it
  400.     SHLD    SIZE        ; Size = size + 1
  401.     LHLD    PTR        ; Get capture buffer ptr
  402.     MOV    M,A        ; Put char into buffer
  403.     INX    H        ; Point to next addr
  404.     SHLD    PTR        ; Store it
  405.     PUSH    PSW
  406.     LDA    BASE+7        ; Get system size
  407.     SUI    1        ; So we don't crash cp/m
  408.     CMP    H        ; Are we out of room?
  409.     JZ    SAVE3        ; Yes, abort
  410.     SUI    4        ; Leave some room (1k)
  411.     CMP    H        ; Are we low on memory
  412.     LXI    H,SAVE1M    ; Memory low message
  413.     CC    WCS        ; Print it
  414.     POP    PSW
  415.     POP    H
  416.     RET
  417. ;
  418. SAVE3:    LXI    SP,STACK+64    ; Reinitialize the stack
  419.     LXI    H,SAVE2M    ; Aborted - no memory message
  420.     CALL    WCS        ; Print it
  421.     LXI    H,LINK        ; Set up return address
  422.     PUSH    H        ; Leave it on stack
  423. ;
  424. ;
  425. ; WTB - WRITE TEXT BUFFER TO DISK
  426. ;
  427. WTB:    LHLD    SIZE        ; Jump if text buffer empty
  428.     MOV    A,L
  429.     ORA    H
  430.     JZ    WTB5
  431.     CALL    GFN        ; Get file name
  432.     JC    WTB6        ; Jump if file name error
  433.     MVI    C,RESDSK    ; Reset disk in case r/o
  434.     CALL    BDOS        ; Or error recovery
  435.     CALL    DELT        ; Delete old file, if any
  436.     CALL    MAKE        ; Make new file
  437.     XRA    A        ; Rewind file
  438.     STA    FCB+NR
  439.     LHLD    SIZE        ; De = tbuf size
  440.     XCHG
  441.     LXI    H,DBUF        ; Top of stack points to dbuf
  442.     PUSH    H
  443.     LXI    H,TBUF        ; Hl points to tbuf
  444. ;
  445. WTB1:    MVI    C,128        ; Disk buffer size
  446. ;
  447. WTB2:    MOV    A,M        ; Fetch next byte of tbuf
  448.     INX    H
  449.     XTHL
  450.     MOV    M,A        ; Store in dbuf
  451.     INX    H
  452.     XTHL
  453.     DCX    D        ; Size = size - 1
  454.     MOV    A,D        ; Exit loop if size = 0
  455.     ORA    E
  456.     JZ    WTB3
  457.     DCR    C        ; Loop until dbuf full
  458.     JNZ    WTB2
  459.     CALL    WRITE        ; Write full dbuf to disk
  460.     CPI    0        ; Did we have an error?
  461.     JNZ    WTB4B        ; If so, bail out
  462.     XTHL            ; Top of stack points to dbuf
  463.     LXI    H,DBUF
  464.     XTHL
  465.     JMP    WTB1        ; Loop until end of tbuf
  466. ;
  467. WTB3:    POP    H        ; Hl points to current place in dbuf
  468. ;
  469. WTB4:    MVI    M,'Z'-40H    ; Store eof code
  470.     INX    H
  471.     DCR    C        ; Loop thru rest of dbuf
  472.     JNZ    WTB4
  473.     CALL    WRITE        ; Write last sector to disk
  474.     CPI    0        ; Error?
  475.     JNZ    WTB4B        ; If so handle it
  476.     CALL    CLOSE        ; Else clean up act
  477.     LXI    H,TBUF        ; Clear text buffer
  478.     SHLD    PTR
  479.     LXI    H,0        ; Set the size to zero
  480.     SHLD    SIZE
  481.     LXI    H,WTBS1M    ; Saved, capture off message
  482.     CALL    WCS        ; Print it
  483.     RET
  484. ;
  485. WTB4B:    LXI    H,WTBS2M    ; Error writing - disk full msg
  486.     CALL    WCS        ; Print it
  487.     JMP    WTB        ; And try again
  488. ;
  489. WTB5:    LXI    H,WTBS3M    ; Buffer empty message
  490.     CALL    WCS        ; Print it
  491.     RET
  492. ;
  493. WTB6:    LXI    H,WTBS4M    ; File name error message
  494.     CALL    WCS        ; Print it
  495.     RET
  496. ;
  497. ;
  498. ; WCS - WRITE CONSOLE STRING
  499. ;
  500. ;    ENTRY:    HL - POINTS TO NUL TERMINATED STRING
  501. ;
  502. WCS:    MOV    A,M
  503.     INX    H
  504.     ORA    A
  505.     RZ
  506.     CALL    WCC
  507.     JMP    WCS
  508. ;
  509. ; WCCR - WRITE CONSOLE CARRIAGE RETURN (AND LINE FEED)
  510. ;
  511. WCCR:    MVI    A,CR
  512.     CALL    WCC
  513.     MVI    A,LF
  514. ;
  515. ;
  516. ; WCC - WRITE CONSOLE CHARACTER
  517. ;
  518. ;    ENTRY:    A - CHARACTER TO WRITE
  519. ;
  520. WCC:    PUSH    PSW
  521. WCC1:    IN    CONS
  522.     ANI    CTBE
  523.     JZ    WCC1
  524.     POP    PSW
  525.     OUT    COND
  526.     RET
  527. ;
  528. ;
  529. ; RCS - READ CONSOLE STRING (WITH ECHO)
  530. ;
  531. ;    EXIT:    B  - NUMBER OF CHARS READ (<255)
  532. ;        HL - POINTS TO LAST CHAR STORED (CR)
  533. ;
  534. RCS:    LXI    H,IBUF
  535.     MVI    B,0
  536. ;
  537. RCS1:    CALL    RCC        ; Read next char from console
  538.     CPI    DEL        ; Jump if not del
  539.     JNZ    RCS2
  540.     INR    B        ; Ignore del if ibuf already empty
  541.     DCR    B
  542.     JZ    RCS1
  543.     DCX    H        ; Else discard last char
  544.     MOV    A,M
  545.     CALL    WCC        ; Echo it
  546.     DCR    B        ; Decrement count
  547.     JMP    RCS1        ; And loop
  548. ;
  549. RCS2:    CPI    'U'-40H        ; Jump if not control-u
  550.     JNZ    RCS3
  551.     CALL    WCCR        ; Else abort current line
  552.     JMP    RCS        ; And start over
  553. ;
  554. RCS3:    CALL    WCC        ; Echo it
  555.     MOV    M,A        ; Store char in ibuf
  556.     INR    B        ; Increment count
  557.     CPI    CR        ; Jump if carriage return
  558.     JZ    RCS4
  559.     INX    H        ; Else advance ptr
  560.     JMP    RCS1        ; And loop
  561. ;
  562. RCS4:    MVI    A,LF        ; Issue line feed
  563.     CALL    WCC        ; Echo it
  564.     RET
  565. ;
  566. ;
  567. ; RCC - READ CONSOLE CHARACTER
  568. ;
  569. ;    EXIT:    A - CHARACTER READ
  570. ;
  571. RCC:    IN    CONS
  572.     ANI    CRBF
  573.     JZ    RCC
  574.     IN    COND
  575.     ANI    7FH
  576.     RET
  577. ;
  578. ;
  579. ; WMC - WRITE RTTY CHARACTER
  580. ;
  581. ;    ENTRY:    A - CHARACTER TO WRITE
  582. ;
  583. WMC:    PUSH    B        ; Save registers
  584.     PUSH    H
  585.     PUSH    PSW
  586.     LDA    FLAGM        ; Get mode flag
  587.     CPI    1        ; Is it 1
  588.     JZ    WMC1        ; Yes, ascii mode
  589.     JMP    STTY1        ; No, baudot mode
  590. ;
  591. WMC1:    IN    MODS        ; Get status
  592.     ANI    MTBE        ; Transmit buffer empty?
  593.     JZ    WMC1        ; If not, loop and wait
  594.     POP    PSW        ; Get char
  595.     PUSH    PSW        ; Resave
  596.     ANI    7FH
  597.     OUT    MODD        ; Send the char
  598.     POP    PSW        ; Restore registers
  599.     POP    H
  600.     POP    B
  601.     RET
  602. ;
  603. ; ASCXMT(4) REV. 2  BY KEITH PETERSEN, W8SDZ.  10/29/78.
  604. ;
  605. ; This program is for transmitting ascii through a baudot medium
  606. ; use a special format of figures blank (X) - where (X) is a
  607. ; special baudot character used to convey the ascii equivalent
  608. ; character to the receiving end where it is then converted back
  609. ; to ascii again.  Lower case alpha characters are transmitted
  610. ; via a 4th case, ltrs blank (X).
  611. ;
  612. ; Call with ascii character in accumulator.
  613. ;
  614. STTY1:    POP    PSW        ; Get char
  615.     PUSH    PSW        ; Resave
  616. ;
  617.     MVI    C,0        ; Set up counter
  618.     ANI    7FH        ; Strip parity bit
  619.     CPI    ALTM        ; Alternate mode key?
  620.     JNZ    STTY2        ; No, ignore next routine
  621.     MVI    A,09H        ; Baudot '$'
  622.     JMP    STTY3
  623. ;
  624. STTY2:    CPI    7BH        ; Above l.c. 'z' ?
  625.     JNC    STTY7        ; If so, ignore it
  626.     LXI    H,BTABLE    ; Point to table start
  627.     ADD    L        ; Add char value
  628.     MOV    L,A        ; L points to baudot char.
  629.     MOV    A,H        ; Get h for correction
  630.     ACI    0        ; Correct if necessary
  631.     MOV    H,A        ; H is now correct
  632.     MOV    A,M        ; Get baudot char
  633.     ORA    A        ; Is it a non-printing char?
  634.     JZ    STTY7        ; If so ignore it
  635.     CPI    CRX        ; Is it a carriage return?
  636.     JZ    STTY5        ; Yes, handle without case test
  637.     CPI    LFX        ; Is it a line feed?
  638.     JNZ    STTY3        ; No, ignore next routine
  639.     MVI    A,LTRS
  640.     PUSH    PSW        ; Save it on stack
  641.     MVI    A,LFX
  642.     LXI    H,SCASE        ; Point to present case reg.
  643.     MVI    M,40H        ; Set it to lower case
  644.     JMP    STTY4        ; Send lf and ltrs
  645. ;
  646. STTY3:    PUSH    PSW        ; Save char
  647.     ANI    0C0H        ; Strip all but case bits
  648.     LXI    H,SCASE        ; Point to present case reg.
  649.     CMP    M        ; Same case as previous char?
  650.     JZ    STTY6        ; Yes no change necessary
  651.     MOV    M,A        ; Update case register
  652.     ORA    A
  653.     JZ    STTYTC
  654.     CPI    80H
  655.     JZ    STTYUC
  656.     CPI    0C0H
  657.     JNZ    STTYLC
  658. ;
  659. STTYFC:    XRA    A        ; Get a baudot 'blank'
  660.     PUSH    PSW        ; Save it on the stack
  661.     INR    C        ; Increment char count
  662. ;
  663. STTYLC:    MVI    A,LTRS
  664.     JMP    STTY4
  665. ;
  666. STTYTC:    XRA    A        ; Get a baudot 'blank'
  667.     PUSH    PSW        ; Save it on the stack
  668.     INR    C        ; Increment char count
  669. ;
  670. STTYUC:    MVI    A,FIGS
  671. STTY4:    INR    C        ; Increment char count
  672. STTY5:    PUSH    PSW        ; Save it on the stack
  673. ;
  674. STTY6:    IN    MODS        ; Baudot uart status
  675.     ANI    MTBE        ; Trans. buffer empty?
  676.     JZ    STTY6        ; If not, loop and wait
  677.     POP    PSW        ; Get char
  678. ;
  679.     ORI    0E0H        ; Make upper 3 bits marking
  680.     OUT    MODD        ; Send to baudot port
  681.     DCR    C        ; More to send?
  682.     JP    STTY6        ; Yes, continue sending
  683. ;
  684. STTY7:    POP    PSW        ; Restore registers
  685.     POP    H
  686.     POP    B
  687.     RET
  688. ;
  689. ;
  690. ; RMC - READ RTTY CHARACTER
  691. ;
  692. ;    EXIT:    A - CHARACTER READ
  693. ;
  694. RMC:    PUSH    H        ; Save hl
  695.     LDA    FLAGM        ; Get mode flag
  696.     CPI    1        ; Is it 1
  697.     JZ    RMC1        ; Yes, ascii mode
  698.     JMP    RTTY1        ; No, baudot mode
  699. ;
  700. RMC1:    IN    MODD        ; Get char
  701.     ANI    7FH
  702.     POP    H        ; Restore hl
  703.     RET
  704. ;
  705. ; ASCRCV(4), VER. 2  BY KEITH PETERSEN, W8SDZ.  10/30/78.
  706. ;
  707. ; This is a program to change ascii-coded-baudot to ascii.
  708. ; The routine returns with a 0FFH in the 'A' register if
  709. ; character it to be ignored.  Otherwise it returns with
  710. ; the ascii character in the 'A' register.  It is assumed
  711. ; that a status test has been done before calling this
  712. ; routine to determine that a baudot character is available.
  713. ;
  714. RTTY1:    LHLD    CASAVE        ; Get present case
  715. ;
  716.     IN    MODD        ; Get baudot char
  717.     ANI    1FH        ; Baudot chars only
  718.     CPI    FIGS
  719.     JZ    RTTYUC
  720.     CPI    LTRS
  721.     JZ    RTTYLC
  722.     ORA    A        ; Baudot 'blank' ?
  723.     JZ    RTTYTC
  724.     CPI    SPACE
  725.     JNZ    RTTY2
  726.     LXI    H,LTABLE    ; Space gives lower case
  727. ;
  728. RTTY2:    SHLD    CASAVE        ; Save present case
  729.     ADD    L        ; Add char. to table adrs.
  730.     MOV    L,A        ; L points to ascii char.
  731.     MOV    A,H        ; Get h for correction
  732.     ACI    0        ; See if correction needed
  733.     MOV    H,A        ; H is correct now
  734.     XRA    A        ; Put zero in a reg.
  735.     STA    FLAGR        ; Clear ltrs-figs last flag
  736.     MOV    A,M        ; Get ascii equivalent
  737.     POP    H        ; Restore hl registers
  738.     ORA    A        ; Is it printable?
  739.     RNZ            ; Yes, valid char. return
  740.     CMA            ; Make 0ffh 'ignore flag'
  741.     RET            ; Return to calling program
  742. ;
  743. RTTYLC:    LXI    H,LTABLE    ; Lower case table address
  744.     JMP    SETFLG        ; Set ltrs last flag, exit
  745. ;
  746. RTTYUC:    LXI    H,UTABLE    ; Upper case table address
  747.     JMP    SETFLG        ; Set figs last flag, exit
  748. ;
  749. RTTYTC:    LDA    FLAGR        ; Get shift reminder flag
  750.     CPI    FIGS
  751.     JNZ    RTTYFC
  752.     LXI    H,TTABLE    ; Third case table address
  753.     JMP    CLRFLG
  754. ;
  755. RTTYFC:    CPI    LTRS        ; Check for ltrs last
  756.     JNZ    CLRFLG
  757.     LXI    H,FTABLE    ; Fourth case table address
  758. ;
  759. CLRFLG:    XRA    A        ; Ready to clear flag
  760. ;
  761. SETFLG:    STA    FLAGR        ; Ltrs-figs last flag
  762.     SHLD    CASAVE        ; Save present case
  763.     MVI    A,0FFH        ; 'ignore flag'
  764.     POP    H        ; Restore hl regs.
  765.     RET            ; Return to program
  766. ;
  767. ;
  768. ; Get drive and filename
  769. ;
  770. GFN:    XRA    A        ; Initialize the fcb
  771.     STA    FCB
  772.     LXI    H,FCB+12    ; Zero the fcb to its end
  773.     MVI    C,21
  774.     CALL    ZEROM
  775. ;
  776.     LXI    H,GFNS1M    ; Which drive message
  777.     CALL    WCS        ; Print it
  778.     CALL    RCC        ; Get answer from console
  779.     CALL    WCC        ; Echo it
  780.     ANI    5FH        ; Make upper case
  781.     CPI    'C'-40H        ; Control c abort
  782.     JZ    GFN6
  783.     SUI    'A'-1
  784.     JC    GFN        ; Require alphabetic
  785.     JZ    GFN
  786.     CPI    6        ; Allow 5 drives (cp/m 2.x max 16)
  787.     JNC    GFN
  788.     STA    FCB        ; Store it
  789. ;
  790.     LXI    H,GFNS2M    ; Filename message
  791.     CALL    WCS        ; Print it
  792.     CALL    RCS        ; Read response into ibuf
  793.     LXI    H,FCB+FN    ; Blank fill fn and ft fields
  794.     MVI    C,11
  795. ;
  796. GFN1:    MVI    M,' '
  797.     INX    H
  798.     DCR    C
  799.     JNZ    GFN1
  800.     LXI    H,IBUF        ; Point to input buffer
  801.     LXI    D,FCB+FN    ; Scan off fn field
  802.     MVI    C,9
  803. ;
  804. GFN2:    MOV    A,M        ; Fetch next char from ibuf
  805.     INX    H
  806.     CPI    61H        ; If lc, convert to uc
  807.     JC    GFN2A
  808.     SUI    20H
  809. ;
  810. GFN2A:    CPI    CR        ; Jump if end of line
  811.     JZ    GFN5
  812.     CPI    '.'        ; Jump if end of name
  813.     JZ    GFN3
  814.     STAX    D        ; Else store char in fn field
  815.     INX    D
  816.     DCR    C        ; Loop if 8 or less chars so far
  817.     JNZ    GFN2
  818.     JMP    GFN6        ; Else take error exit
  819. ;
  820. GFN3:    LXI    D,FCB+FT    ; Scan off ft field
  821.     MVI    C,4
  822. ;
  823. GFN4:    MOV    A,M        ; Fetch next char from ibuf
  824.     INX    H
  825.     CPI    61H        ; If lc, convert to uc
  826.     JC    GFN4A
  827.     SUI    20H
  828. ;
  829. GFN4A:    CPI    CR        ; Jump if end of line
  830.     JZ    GFN5
  831.     STAX    D        ; Else store char in ft field
  832.     INX    D
  833.     DCR    C        ; Loop if 3 or less chars so far
  834.     JNZ    GFN4
  835.     JMP    GFN6        ; Else take error exit
  836. ;
  837. GFN5:    STC            ; Clear error flag and return
  838.     CMC
  839.     RET
  840. ;
  841. GFN6:    STC            ; Set error flag and return
  842.     RET
  843. ;
  844. ;
  845. ZEROM:    MVI    M,0        ; Zero memory, length in c
  846.     INX    H
  847.     DCR    C
  848.     JNZ    ZEROM
  849.     RET
  850. ;
  851. ; OPEN - OPEN DISK FILE
  852. ;
  853. OPEN:    PUSH    H
  854.     PUSH    D
  855.     PUSH    B
  856.     LXI    D,FCB
  857.     MVI    C,OFFC
  858.     CALL    BDOS
  859.     POP    B
  860.     POP    D
  861.     POP    H
  862.     RET
  863. ;
  864. ; READ - READ RECORD FROM DISK FILE
  865. ;
  866. READ:    PUSH    H
  867.     PUSH    D
  868.     PUSH    B
  869.     LXI    D,FCB
  870.     MVI    C,RRFC
  871.     CALL    BDOS
  872.     POP    B
  873.     POP    D
  874.     POP    H
  875.     RET
  876. ;
  877. ; CLOSE - CLOSE DISK FILE
  878. ;
  879. CLOSE:    PUSH    H
  880.     PUSH    D
  881.     PUSH    B
  882.     LXI    D,FCB
  883.     MVI    C,CFFC
  884.     CALL    BDOS
  885.     POP    B
  886.     POP    D
  887.     POP    H
  888.     RET
  889. ;
  890. ; DELT - DELETE DISK FILE
  891. ;
  892. DELT:    PUSH    H
  893.     PUSH    D
  894.     PUSH    B
  895.     LXI    D,FCB
  896.     MVI    C,DFFC
  897.     CALL    BDOS
  898.     POP    B
  899.     POP    D
  900.     POP    H
  901.     RET
  902. ;
  903. ; WRITE - WRITE RECORD TO DISK
  904. ;
  905. WRITE:    PUSH    H
  906.     PUSH    D
  907.     PUSH    B
  908.     LXI    D,FCB
  909.     MVI    C,WRFC
  910.     CALL    BDOS
  911.     POP    B
  912.     POP    D
  913.     POP    H
  914.     RET
  915. ;
  916. ; MAKE - MAKE NEW DISK FILE
  917. ;
  918. MAKE:    PUSH    H
  919.     PUSH    D
  920.     PUSH    B
  921.     LXI    D,FCB
  922.     MVI    C,MFFC
  923.     CALL    BDOS
  924.     POP    B
  925.     POP    D
  926.     POP    H
  927.     RET
  928. ;
  929. ;
  930. ; Show the modem speed, prompt for change
  931. ;
  932. MDTELL:    LDA    FLAGM        ; Get mode flag
  933.     CPI    1        ; Is it 1
  934.     JZ    MDTLA1        ; Yes, ascii mode
  935.     JMP    MDTLB1        ; No, baudot mode
  936. ;
  937. ; Check and tell the ascii rate
  938. ;
  939. MDTLA1:    LDA    MDRATE        ; Get the rate flag
  940.     CPI    1        ; Is it 1
  941.     JNZ    MDTLA2        ; No, check others
  942.     LXI    H,MDTA1M    ; 1st speed message
  943.     JMP    MDTELC
  944. ;
  945. MDTLA2:    CPI    2        ; Is it 2
  946.     JNZ    MDTLA3        ; No, check others
  947.     LXI    H,MDTA2M    ; 2nd speed message
  948.     JMP    MDTELC
  949. ;
  950. MDTLA3:    CPI    3        ; Is it 3
  951.     JNZ    MDTLA4        ; No, check others
  952.     LXI    H,MDTA3M    ; 3rd speed message
  953.     JMP    MDTELC
  954. ;
  955. MDTLA4:    CPI    4        ; Is it 4
  956.     JNZ    MDTLA5        ; No, check others
  957.     LXI    H,MDTA4M    ; 4th speed message
  958.     JMP    MDTELC
  959. ;
  960. MDTLA5:    CPI    5        ; Is it 5
  961.     JNZ    MDTLA6        ; No, must be 6
  962.     LXI    H,MDTA5M    ; 5th speed message
  963.     JMP    MDTELC
  964. ;
  965. MDTLA6:    LXI    H,MDTA6M    ; 6th speed message
  966.     JMP    MDTELC
  967. ;
  968. ; Check and tell the baudot rate
  969. ;
  970. MDTLB1:    LDA    MDRATE        ; Get the rate flag
  971.     CPI    1        ; Is it 1
  972.     JNZ    MDTLB2        ; No, check others
  973.     LXI    H,MDTB1M    ; 1st speed message
  974.     JMP    MDTELC
  975. ;
  976. MDTLB2:    CPI    2        ; Is it 2
  977.     JNZ    MDTLB3        ; No, check others
  978.     LXI    H,MDTB2M    ; 2nd speed message
  979.     JMP    MDTELC
  980. ;
  981. MDTLB3:    CPI    3        ; Is it 3
  982.     JNZ    MDTLB4        ; No, check others
  983.     LXI    H,MDTB3M    ; 3rd speed message
  984.     JMP    MDTELC
  985. ;
  986. MDTLB4:    CPI    4        ; Is it 4
  987.     JNZ    MDTLB5        ; No, must be 5
  988.     LXI    H,MDTB4M    ; 4th speed message
  989.     JMP    MDTELC
  990. ;
  991. MDTLB5:    LXI    H,MDTB5M    ; 5th speed message
  992.     JMP    MDTELC
  993. ;
  994. ;
  995. MDTELC:    CALL    WCS        ; Print it
  996.     LXI    H,MDCH1M    ; Change it (Y) message
  997.     CALL    WCS        ; Print it
  998.     CALL    RCC        ; Get answer
  999.     CALL    WCC        ; Echo it
  1000.     ANI    5FH        ; Make upper case
  1001.     CPI    'Y'
  1002.     JNZ    MDTELD
  1003.     CALL    MDSET0
  1004.     JMP    MDTELL        ; Loop, another change?
  1005. ;
  1006. MDTELD:    CALL    WCCR        ; Print cr/lf
  1007.     RET
  1008. ;
  1009. ;
  1010. ;
  1011. MDSET0:    LDA    FLAGM        ; Get mode flag
  1012.     CPI    1        ; Is it 1
  1013.     JZ    MDSETA        ; Yes, ascii mode
  1014.     JMP    MDSETB        ; No, baudot mode
  1015. ;
  1016. ; For ascii, check existing rate and step to next
  1017. ;
  1018. MDSETA:    LDA    MDRATE        ; Get the rate flag
  1019.     CPI    1        ; Is it 1
  1020.     JZ    MDSTA2        ; If yes, set to next rate
  1021.     CPI    2        ; Else is it 2
  1022.     JZ    MDSTA3        ; If yes, set to next rate
  1023.     CPI    3        ; Else is it 3
  1024.     JZ    MDSTA4        ; Yes, set to next rate
  1025.     CPI    4        ; Else is it 4
  1026.     JZ    MDSTA5        ; Yes, set to next rate
  1027.     CPI    5        ; Else is it 5
  1028.     JZ    MDSTA6        ; Yes, set to next rate
  1029.     JMP    MDSTA1        ; No, must be 6, so set low rate
  1030. ;
  1031. ; For baudot, check existing rate and step to next
  1032. ;
  1033. MDSETB:    LDA    MDRATE        ; Get the rate flag
  1034.     CPI    1        ; Is it 1
  1035.     JZ    MDSTB2        ; If yes, set to next rate
  1036.     CPI    2        ; Else is it 2
  1037.     JZ    MDSTB3        ; If yes, set to next rate
  1038.     CPI    3        ; Else is it 3
  1039.     JZ    MDSTB4        ; If yes, set to next rate
  1040.     CPI    4        ; Else is it 4
  1041.     JZ    MDSTB5        ; If yes, set to next rate
  1042.     JMP    MDSTB1        ; No, must be 5, so set low rate
  1043. ;
  1044. ; Baud rate for ascii mode
  1045. ;
  1046. MDSTA1:    XRA    A        ; Set flag to zero
  1047.     STA    MDRATE        ; As set bumps it
  1048.     LXI    H,BD110        ; 110 baud
  1049.     JMP    MDSETX
  1050. ;
  1051. MDSTA2:    LXI    H,BD300        ; 300 baud
  1052.     JMP    MDSETX
  1053. ;
  1054. MDSTA3:    LXI    H,BD450        ; 450 baud
  1055.     JMP    MDSETX
  1056. ;
  1057. MDSTA4:    LXI    H,BD600        ; 600 baud
  1058.     JMP    MDSETX
  1059. ;
  1060. MDSTA5:    LXI    H,BD710        ; 710 baud
  1061.     JMP    MDSETX
  1062. ;
  1063. MDSTA6:    LXI    H,BD1200    ; 1200 baud
  1064.     JMP    MDSETX
  1065. ;
  1066. ; Baud rates for baudot mode
  1067. ;
  1068. MDSTB1:    XRA    A        ; Set flag to zero
  1069.     STA    MDRATE        ; As set bumps it
  1070.     LXI    H,BD045        ; 60 wpm  = 45.45 baud
  1071.     JMP    MDSETX
  1072. ;
  1073. MDSTB2:    LXI    H,BD050        ; 66 wpm  = 50 baud
  1074.     JMP    MDSETX
  1075. ;
  1076. MDSTB3:    LXI    H,BD057        ; 75 wpm  = 57 baud
  1077.     JMP    MDSETX
  1078. ;
  1079. MDSTB4:    LXI    H,BD074        ; 100 wpm = 74 baud
  1080.     JMP    MDSETX
  1081. ;
  1082. MDSTB5:    LXI    H,BD100        ; 132 wpm = 100 baud
  1083.     JMP    MDSETX
  1084. ;
  1085. ; Modem speed setup
  1086. ;
  1087. MDSETX:    MVI    A,MODEW
  1088.     OUT    BRPORT
  1089.     MOV    A,M
  1090.     OUT    BAUDS
  1091.     INX    H
  1092.     MOV    A,M
  1093.     OUT    BAUDS
  1094. ;
  1095.     LDA    MDRATE        ; Get rate
  1096.     INR    A        ; And bump it to next higher
  1097.     STA    MDRATE        ; Store the new value
  1098.     RET
  1099. ;
  1100. ;
  1101. MDIN5N:    MVI    A,NO5        ; No parity 1.5 stop
  1102.     STA    MDINI1        ; Store for reg 4
  1103.     MVI    A,RX5        ; 5 bits, rx enable
  1104.     STA    MDINI3        ; Store for reg 3
  1105.     MVI    A,TX5        ; Dtr, rts, tx on, 5 bits
  1106.     STA    MDINI4        ; Store for reg 5
  1107.     JMP    MDINI0        ; Do the setup
  1108. ;
  1109. MDIN7E:    MVI    A,EV1        ; Even parity 1 stop
  1110.     STA    MDINI1        ; Store for reg 4
  1111.     MVI    A,RX7        ; 7 bits, rx enable
  1112.     STA    MDINI3        ; Store for reg 3
  1113.     MVI    A,TX7        ; Dtr, rts, tx on, 7 bits
  1114.     STA    MDINI4        ; Store for reg 5
  1115.     JMP    MDINI0        ; Do the setup
  1116. ;
  1117. MDIN8N:    MVI    A,NO1        ; No parity 1 stop
  1118.     STA    MDINI1        ; Store for reg 4
  1119.     MVI    A,RX8        ; 8 bits, rx enable
  1120.     STA    MDINI3        ; Store for reg 3
  1121.     MVI    A,TX8        ; Dtr, rts, tx on, 8 bits
  1122.     STA    MDINI4        ; Store for reg 5
  1123. ;
  1124. ; Main initialization routine used by those above
  1125. ;
  1126. MDINI0:    MVI    A,4        ; Write reg 4
  1127.     OUT    MODS
  1128.     MVI    A,NO5        ; No parity, 1.5 stop, 16x
  1129. MDINI1:    EQU    $-1
  1130.     OUT    MODS
  1131.     MVI    A,1        ; Write reg 1
  1132.     OUT    MODS
  1133.     MVI    A,0
  1134.     OUT    MODS
  1135.     MVI    A,5        ; Write reg 5
  1136.     OUT    MODS
  1137.     MVI    A,0        ; DTR, RTS both off
  1138.     OUT    MODS
  1139.     PUSH    B        ; Save in case used elsewhere
  1140.     MVI    B,5        ; 1/2 second delay  (10 = 1 sec)
  1141. MDINI2:    CALL    DELAY        ; 1/10 second delay
  1142.     DCR    B
  1143.     JNZ    MDINI2        ; Keep looping until finished
  1144.     POP    B        ; Restore bc
  1145.     MVI    A,3        ; Write reg 3
  1146.     OUT    MODS
  1147.     MVI    A,RX5        ; 5 bits, enable receive
  1148. MDINI3:    EQU    $-1
  1149.     OUT    MODS
  1150.     MVI    A,5        ; Write reg 5
  1151.     OUT    MODS
  1152.     MVI    A,TX5        ; DTR, RTS, TX on, 5 bits
  1153. MDINI4:    EQU    $-1
  1154.     OUT    MODS
  1155.     RET            ; Return
  1156. ;
  1157. ; 1/10 second delay routine
  1158. ;
  1159. DELAY:    PUSH    B
  1160.     LXI    B,4167*4    ; 4167 * system clock mhz
  1161. DELAY1:    DCX    B
  1162.     MOV    A,B
  1163.     ORA    C
  1164.     JNZ    DELAY1
  1165.     POP    B
  1166.     RET
  1167. ;
  1168. ;
  1169. ; MESSAGES
  1170. ;
  1171. CAPTNM:    DB    CR,LF,'[Capture OFF]',CR,LF,0
  1172. CAPTYM:    DB    CR,LF,'[Capture  ON]',CR,LF,0
  1173. ;
  1174. EXIT1M:    DB    CR,LF,'Exit to CP/M -- Confirm (Y/N)? ',0
  1175. EXIT2M:    DB    CR,LF,'Save buffer before exit? ',BEL,0
  1176. EXITNM:    DB    CR,LF,'[Exit aborted]',CR,LF,0
  1177. EXITYM:    DB    CR,LF,LF,'[Exit to CP/M]',CR,LF,0
  1178. ;
  1179. LINK1M:    DB    CR,LF,'RTTY v 3.1'
  1180. LINK2M:    DB    CR,LF
  1181.     DB    '^',KYTRAN+40H
  1182.     DB    ' Transmit  '
  1183.     DB    '^',KYWRIT+40H
  1184.     DB    ' Write     '
  1185.     DB    '^',KYCAPT+40H
  1186.     DB    ' Capture   '
  1187.     DB    '^',KYSPED+40H
  1188.     DB    ' Speed'
  1189.     DB    CR,LF
  1190.     DB    '^',KYMODE+40H
  1191.     DB    ' Mode      '
  1192.     DB    '^',KYABRT+40H
  1193.     DB    ' Cancel    '
  1194.     DB    '^',KYEXIT+40H
  1195.     DB    ' Exit'
  1196.     DB    CR,LF,LF,0
  1197. ;
  1198. GFNS1M:    DB    CR,LF,'Which drive? ',0
  1199. GFNS2M:    DB    CR,LF,'Filename? ',0
  1200. ;
  1201. STFS1M:    DB    CR,LF,'[Transfer complete]',BEL,CR,LF,0
  1202. STFS2M:    DB    CR,LF,'[File name error]',CR,LF,0
  1203. STFS3M:    DB    CR,LF,'[File not found]',CR,LF,0
  1204. STFS4M:    DB    CR,LF,'[Transfer aborted]',CR,LF,0
  1205. ;
  1206. WTBS1M:    DB    CR,LF,'[Buffer saved - Capture OFF]',CR,LF,0
  1207. WTBS2M:    DB    CR,LF,'[Write error - Disk may be full]'
  1208.     DB    CR,LF,'[Change disks - Use other drive]',BEL,CR,LF,0
  1209. WTBS3M:    DB    CR,LF,'[Buffer empty]',CR,LF,0
  1210. WTBS4M:    DB    CR,LF,'[File name error]',CR,LF,0
  1211. ;
  1212. SAVE1M:    DB    CR,LF,'[Memory LOW]',BEL,CR,LF,0
  1213. SAVE2M:    DB    CR,LF,'[Aborted - NO memory]',BEL,CR,LF,0
  1214. ;
  1215. MODEAM:    DB    CR,LF,'[Ascii  Mode]',CR,LF,0
  1216. MODEBM:    DB    CR,LF,'[Baudot Mode]',CR,LF,0
  1217. ;
  1218. MDTA1M:    DB    CR,LF,'[ 110 baud]',0
  1219. MDTA2M:    DB    CR,LF,'[ 300 baud]',0
  1220. MDTA3M:    DB    CR,LF,'[ 450 baud]',0
  1221. MDTA4M:    DB    CR,LF,'[ 600 baud]',0
  1222. MDTA5M:    DB    CR,LF,'[ 710 baud]',0
  1223. MDTA6M:    DB    CR,LF,'[1200 baud]',0
  1224. ;
  1225. MDTB1M:    DB    CR,LF,'[ 60 wpm]',0
  1226. MDTB2M:    DB    CR,LF,'[ 66 wpm]',0
  1227. MDTB3M:    DB    CR,LF,'[ 75 wpm]',0
  1228. MDTB4M:    DB    CR,LF,'[100 wpm]',0
  1229. MDTB5M:    DB    CR,LF,'[132 wpm]',0
  1230. MDCH1M:    DB    '  Change it? ',0
  1231. ;
  1232. ;
  1233. ; LOWER-CASE TABLE FOR RECEIVE
  1234. ;
  1235. LTABLE:    DB    0,'E',LF,'A SIU',CR,'DRJNFCK'
  1236.     DB    'TZLWHYPQOBG',FIGS,'MXV'
  1237. ;
  1238. ; UPPER-CASE TABLE FOR RECEIVE
  1239. ;
  1240. UTABLE:    DB    0,'3',LF,'- ',BEL,'87',CR,'$4'
  1241.     DB    APOS,',!:(5")2#6019?&',FIGS,'./;'
  1242. ;
  1243. ; THIRD-CASE TABLE FOR RECEIVE. USED FOR SPECIAL CHARACTERS.
  1244. ; THE FIRST COLUMN IN THE TABLE THE ASCII CHARACTER EQUIVALENT.
  1245. ; THE SECOND COLUMN IS THE SPECIAL CASE BAUDOT CHARACTER
  1246. ; FROM WHICH THE CONVERSION IS MADE.
  1247. ;
  1248. TTABLE:    DB    0,CNTC,LF    ; BL  3   LF
  1249.     DB    LARW,ASPC,ATSN    ; -   SP  BEL
  1250.     DB    CNTV,CNTO,CR    ; 8   7   CR
  1251.     DB    ALTM,CNTE,PCT    ; $   4   '
  1252.     DB    DEL,EQL,ESCP    ; ,   !   :
  1253.     DB    LETH,CNTH,LBKT    ; (   5   "
  1254.     DB    GRTH,CNTB,STAR    ; )   2   #
  1255.     DB    CNTI,CNTZ,CNTA    ; 6   0   1
  1256.     DB    CNTX,UARW,PLUS    ; 9   ?   &
  1257.     DB    0,RBKT,RESL    ; FIG .   /
  1258.     DB    0        ; ;
  1259. ;
  1260. ; FOURTH-CASE TABLE FOR RECEIVE. FOR LOWER-CASE ALPHA CHARS.
  1261. ;
  1262. FTABLE:    DB    0,65H,LF,61H,ASPC,73H
  1263.     DB    69H,75H,CR,64H,72H,6AH
  1264.     DB    6EH,66H,63H,6BH,74H,7AH
  1265.     DB    6CH,77H,68H,79H,70H,71H
  1266.     DB    6FH,62H,67H,FIGS,6DH,78H
  1267.     DB    76H
  1268. ;
  1269. ;
  1270. ; TABLE FOR SENDING
  1271. ;
  1272. BTABLE:    DB    5FH,17H,13H    ; NUL SOH STX
  1273.     DB    1,0,0AH        ; ETX EOT ENQ
  1274.     DB    0,85H,10H    ; ACK BEL BS
  1275.     DB    15H,42H,0C2H    ; HT  LF  VT
  1276.     DB    2,48H,0        ; FF  CR  SO
  1277.     DB    7,0,0        ; SI  DLE DC1
  1278.     DB    0,0,0        ; DC2 DC3 DC4
  1279.     DB    0,6,0        ; NAK SYN ETB
  1280.     DB    18H,0,16H    ; CAN EM  SUB
  1281.     DB    0EH,0,0        ; ESC FS  GS
  1282.     DB    0,0,44H        ; RS  US  SPACE
  1283.     DB    8DH,91H,94H    ; !   "   #
  1284.     DB    89H,0BH,9AH    ; $   PCT &
  1285.     DB    8BH,8FH,92H    ; '   (   )
  1286.     DB    14H,1AH,8CH    ; AS  PL  ,
  1287.     DB    83H,9CH,9DH    ; -   .   /
  1288.     DB    96H,97H,93H    ; 0   1   2
  1289.     DB    81H,8AH,90H    ; 3   4   5
  1290.     DB    95H,87H,86H    ; 6   7   8
  1291.     DB    98H,8EH,9EH    ; 9   :   ;
  1292.     DB    0FH,0DH,12H    ; LT  EQ  GT
  1293.     DB    99H,5,43H    ; ?   AT  A
  1294.     DB    59H,4EH,49H    ; B   C   D
  1295.     DB    41H,4DH,5AH    ; E   F   G
  1296.     DB    54H,46H,4BH    ; H   I   J
  1297.     DB    4FH,52H,5CH    ; K   L   M
  1298.     DB    4CH,58H,56H    ; N   O   P
  1299.     DB    57H,4AH,45H    ; Q   R   S
  1300.     DB    50H,47H,5EH    ; T   U   V
  1301.     DB    53H,5DH,55H    ; W   X   Y
  1302.     DB    51H,11H,1DH    ; Z   LB  LS
  1303.     DB    1CH,19H,3    ; RB  UA  LA
  1304. ;
  1305. ; THESE ARE THE LOWER CASE ALPHA CHARACTERS
  1306. ;
  1307.     DB    0,0C3H,0D9H    ; '   a   b
  1308.     DB    0CEH,0C9H,0C1H    ; c   d   e
  1309.     DB    0CDH,0DAH,0D4H    ; f   g   h
  1310.     DB    0C6H,0CBH,0CFH    ; i   j   k
  1311.     DB    0D2H,0DCH,0CCH    ; l   m   n
  1312.     DB    0D8H,0D6H,0D7H    ; o   p   q
  1313.     DB    0CAH,0C5H,0D0H    ; r   s   t
  1314.     DB    0C7H,0DEH,0D3H    ; u   v   w
  1315.     DB    0DDH,0D5H,0D1H    ; x   y   z
  1316. ;
  1317. ;
  1318. ; Following are baud rates values -- (19200 x 13)/ baud = divisor
  1319. ;
  1320. BD045:    DW    5492        ; 60 wpm  =  45.45 baud
  1321. BD050:    DW    4992        ; 66 wpm  =  50.00 baud
  1322. BD057:    DW    4385        ; 75 wpm  =  56.92 baud
  1323. BD074:    DW    3364        ; 100 wpm =  74.20 baud
  1324. BD100:    DW    2496        ; 132 wpm = 100.00 baud
  1325. ;
  1326. BD110:    DW    2272        ; 08E0H
  1327. BD300:    DW    832        ; 0342H
  1328. BD450:    DW    554        ; 022AH
  1329. BD600:    DW    416        ; 01A0H
  1330. BD710:    DW    351        ; 015FH
  1331. BD1200:    DW    208        ; 00D0H
  1332. BD2400:    DW    104        ; 0068H
  1333. BD4800:    DW    52        ; 0034H
  1334. BD9600:    DW    26        ; 001AH
  1335. BD1920:    DW    0        ; 19200 baud
  1336. ;
  1337. ;
  1338. ; TEMPORARY STORAGE AREAS
  1339. ;
  1340. CASAVE:    DW    LTABLE        ; Recv present case reminder
  1341. FLAGR:    DB    0        ; Recv figs/ltrs last flag
  1342. SCASE:    DB    40H        ; Send present case reg
  1343. FLAGM:    DB    0        ; Mode flag, initial 0=baudot (1=ascii)
  1344. MDRATE:    DS    1        ; Modem baud rate flag
  1345. ;
  1346. ; DATA AREA
  1347. ;
  1348. MCB:    DS    1        ; Rtty control byte
  1349. INCH:    DB    0        ; Input char buffer, initial 0
  1350. OUTCH:    DB    0        ; Output char buffer, initial 0
  1351. ;
  1352. OLDSP:    DS    2        ; Old stack pointer
  1353. STACK:    DS    128        ; Local stack
  1354. ;
  1355. IBUF:    DS    256
  1356. ;
  1357. ; TEXT BUFFER
  1358. ;
  1359. FLAGC:    DB    0        ; Text capture flag, initial 0=off
  1360. PTR:    DS    2        ; Text buffer pointer
  1361. SIZE:    DS    2        ; Text buffer size
  1362. TBUF    EQU    $        ; Start of text buffer
  1363. ;
  1364.     END
  1365.