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 >
Assembly Source File  |  1984-04-29  |  26KB  |  929 lines

  1. ;
  2. ;===========================================
  3. ;
  4. ;    ASCII TO BAUDOT TO ASCII PROGRAM
  5. ;    WITH BUFFER TO DISK AND DISK TO BUFFER
  6. ;    ROUTINES TAKEN FROM 'LINK.ASM' BY L.E.HUGHS
  7. ;
  8. ;    RANDY SUESS 12/20/78
  9. ;============================================
  10. ;
  11. ;08/12/79 MODIFICATIONS BY JIM MILLS WB9KFP TO ALLOW
  12. ;OPERATION USING PMMI MM-103 DIRECT-CONNECT MODEM
  13. ;
  14. ;
  15. ;            CTRL-R    SEND TEXT FILE FROM DISK TO CYBER
  16. ;            CTRL-Y    ENABLE TEXT-FILE-LOADER (INTO MEMORY)
  17. ;            CTRL-Q    DISABLE TEXT FILE LOADER, WRITE MEMORY TO DISK
  18.  
  19. ;         BDOS ENTRY POINT AND FUNCTION CODES
  20.  
  21.  BDOS     EQU    0005H
  22.  OFFC     EQU    15             ;OPEN FILE
  23.  CFFC     EQU    16             ;CLOSE FILE
  24.  DFFC     EQU    19             ;DELETE FILE
  25.  RRFC     EQU    20             ;READ RECORD
  26.  WRFC     EQU    21             ;WRITE RECORD
  27.  MFFC     EQU    22             ;MAKE FILE
  28.  
  29. ;         DEFAULT FCB AND FIELD DEFINITIONS
  30.  
  31.  FCB      EQU    5CH
  32.  FN       EQU    1              ;FILE NAME FIELD (REL)
  33.  FT       EQU    9              ;FILE TYPE FIELD (REL)
  34.  NR       EQU    32             ;NEXT RECORD FIELD (REL)
  35.  DBUF     EQU    80H            ;DEFAULT DISK BUFFER ADDRESS
  36.  
  37. ;         ASCII CONTROL CHARACTERS
  38.  
  39.  BEL      EQU    007Q           ;BELL
  40.  LF       EQU    012Q           ;LINE FEED
  41.  CR       EQU    015Q           ;CARRIAGE RETURN
  42.  DEL      EQU    177Q           ;DELETE
  43.  
  44. ;         I/O PORT ADDRESSES
  45.  
  46.  COND     EQU    005Q           ;CONSOLE DATA PORT
  47. COND1    EQU    07H    ;SECOND CONSOLE
  48.  CONS     EQU    004Q           ;CONSOLE STATUS PORT
  49. CONS1    EQU    06H    ;2ND CONSOLE
  50.  MODD     EQU    FF01H           ;MODEM DATA PORT
  51.  MODS     EQU    FF00H           ;MODEM STATUS PORT
  52.  
  53. ;    PMMI PORT ADDRESSES
  54.  
  55. PMMI    EQU    FF00H        ;PMMI BASE ADDRESS
  56. PMMIUS    EQU    PMMI        ;PMMI UART STATUS
  57. PMMIRD    EQU    PMMI+1        ;PMMI RCV DATA
  58. PMMIMS    EQU    PMMI+2        ;PMMI MODEM STATUS
  59. PMMIIM    EQU    PMMI+3        ;PMMI INPUT MASK
  60. PMMICON    EQU    PMMI        ;PMMI UART/MODEM CONTROL
  61. PMMIXD    EQU    PMMI+1        ;PMMI XMIT DATA
  62. PMMIT    EQU    PMMI+2        ;PMMI TIMER
  63. PMMIOM    EQU    PMMI+3        ;PMMI OUTPUT MASK
  64. PMMIMC    EQU    PMMI+4        ;PMMI MODEM CONTROL
  65.  
  66. ;         I/O SYMBOL DEFINITIONS
  67.  
  68.  CTBE     EQU    02H           ;CONSOLE TRANSMIT BUFFER EMPTY
  69.  CRDA     EQU    01H           ;CONSOLE READ DATA AVAILABLE
  70.  
  71.  MTBE     EQU    080H           ;RTTY TRANSMIT BUFFER EMPTY
  72.  MRDA     EQU    01H           ;RTTY READ DATA AVAILABLE
  73.  
  74. ;         MAIN PROGRAM
  75.  
  76.           ORG    100H
  77.  LINK:    LXI    H,0            ;SAVE OLD STACK POINTER
  78.           DAD    SP
  79.           SHLD   OLDSP
  80.           LXI    SP,STACK+64    ;CREATE LOCAL STACK
  81.  LINK2:   XRA    A              ;CLEAR CHAR BUFFERS
  82.           STA    INCH
  83.           STA    OUTCH
  84.           STA    FLAG           ;CLEAR TEXT SAVE FLAG
  85.           LXI    H,TBUF         ;SET PTR TO TBUF
  86.           SHLD   PTR
  87.           LXI    H,0            ;SIZE = 0
  88.           SHLD   SIZE
  89.           CALL   WCCR           ;WRITE CR/LF TO CONSOLE
  90.           MVI    A,BEL          ;RING BELL ON CONSOLE, TO LET
  91.           CALL   WCC            ;  CLONE KNOW WE'RE READY
  92.  
  93. ;         MAIN LOOP
  94.  
  95. LINK3:
  96.           IN     CONS           ;JUMP IF NO DATA FROM CONSOLE
  97.           ANI    CRDA
  98.           JZ     LINK44
  99.           IN     COND           ;ELSE READ CONSOLE DATA
  100.     OUT    COND        ;ECHO TO TERMINAL
  101.           ANI    177Q           ;CALL PCC IF CONTROL CHAR
  102.           CPI    40Q
  103.           CC     PCC
  104.           JC     LINK4          ;JUMP IF PCC HANDLED CHAR
  105.           ORI    200Q           ;ELSE SET VALID DATA BIT
  106.           STA    INCH           ;AND STORE IN INPUT CHAR BUFFER
  107. LINK44:
  108.     IN    CONS1
  109.     ANI    CRDA
  110.     JZ    LINK4
  111.     IN    COND1
  112.     OUT    COND1
  113.     ANI    07FH
  114.     CPI    40Q
  115.     CC    PCC
  116.     JC    LINK4
  117.     ORI    200Q
  118.     STA    INCH
  119.  LINK4:   IN     CONS1           ;JUMP IF CONSOLE XMIT BUFFER BUSY
  120.           ANI    CTBE
  121.           JZ     LINK5
  122.           LDA    OUTCH          ;JUMP IF NO DATA FOR CONSOLE
  123.           ORA    A
  124.           JP     LINK5
  125.           ANI    177Q           ;ELSE DISCARD VALID DATA BIT
  126.           OUT    COND           ;  AND OUTPUT CHAR TO CONSOLE
  127.     OUT    COND1
  128.           XRA    A              ;  THEN CLEAR OUTPUT CHAR BUFFER
  129.           STA    OUTCH
  130.  LINK5:   IN     MODS           ;JUMP IF NO DATA FROM RTTY
  131.           ANI    MRDA
  132.           JNZ     LINK6
  133. TTYREAD:
  134. ;                **** CALL
  135. ;                ****RTTY READ ROUTINE
  136.     CALL    RMC
  137.           CALL   SAVE           ;SAVE CHAR IN TEXT BUFFER IF FLAG ON
  138.           ORI    200Q           ;SET DATA VALID BIT
  139.           STA    OUTCH          ;STORE IN OUTPUT CHAR BUFFER
  140.  LINK6:   IN     MODS           ;JUMP IF RTTY XMIT BUFFER BUSY
  141.           ANI    MTBE
  142.           JNZ     LINK7
  143.           LDA    INCH           ;JUMP IF NO DATA FOR RTTY
  144.           ORA    A
  145.           JP     LINK7
  146.           ANI    177Q           ;ELSE DISCARD VALID DATA BIT
  147. ;    ********* CALL RTTY OUT ROUTINE
  148. ;******        ADDED CODE TO SEND 2 CR'S AND 1 LF
  149. ;        FOR EACH CR
  150.     CPI    CR
  151.     JNZ    LNKX
  152.     MVI    A,CR
  153.     CALL    WMC
  154.     MVI    A,LF
  155.     OUT    1    ;ECHO LF TO CONSOLE
  156.     CALL    WMC
  157. LNKX:
  158.     CALL    WMC
  159.           XRA    A              ;  THEN CLEAR INPUT CHAR BUFFER
  160.           STA    INCH
  161.  LINK7:   JMP    LINK3          ;END OF MAIN LOOP
  162.  
  163. LINKX:
  164.           LHLD   OLDSP
  165.           SPHL
  166.     XRA    A
  167.     OUT    202Q
  168.           RET
  169.  
  170. ;         PCC - PROCESS CONTROL CHARACTER
  171.  
  172.  PCC:     CPI    'D'-100Q       ;JUMP IF NOT CONTROL-D
  173.           JNZ    PCC1
  174.           LHLD   OLDSP          ;ELSE CLEAN UP ACT AND GO HOME
  175.           SPHL
  176.           RET
  177.  PCC1:    CPI    'O'-100Q       ;JUMP IF NOT CONTROL-Q
  178.           JNZ    PCC2
  179.           CALL   STF            ;SEND TEXT FILE TO RTTY
  180.           STC                   ;TELL LINK TO IGNORE THIS CHARACTER
  181.           RET
  182.  PCC2:    CPI    'Y'-100Q       ;JUMP IF NOT CONTROL-Y
  183.           JNZ    PCC3
  184.           MVI    A,1            ;TURN ON TEXT SAVE FLAG
  185.           STA    FLAG
  186.           STC
  187.           RET
  188.  PCC3:    CPI    'Q'-100Q       ;JUMP IF NOT CONTROL-Q
  189.           JNZ    PCC4
  190.           XRA    A              ;TURN OFF TEXT SAVE FLAG
  191.           STA    FLAG
  192.           CALL   WTB            ;WRITE TEXT BUFFER TO DISK
  193.           LXI    H,TBUF         ;CLEAR TEXT BUFFER
  194.           SHLD   PTR
  195.           LXI    H,0
  196.           SHLD   SIZE
  197.           STC
  198.           RET
  199.  PCC4:    STC                   ;LET LINK HANDLE ALL OTHER CONTROL CODES
  200.           CMC
  201.           RET
  202.         
  203. ;         STF - SEND TEXT FILE (TO RTTY)
  204.  
  205.  STF:     CALL   GFN            ;GET NAME OF DISK FILE TO SEND
  206.           JC     STF6           ;JUMP IF FILE NAME ERROR
  207.           CALL   OPEN           ;TRY TO OPEN SPECIFIED FILE
  208.           CPI    255            ;JUMP IF FILE NOT FOUND
  209.           JZ     STF7
  210.           XRA    A              ;ELSE REWIND FILE AND GET ON WITH IT
  211.           STA    FCB+NR
  212.  STF1:    CALL   READ           ;READ NEXT RECORD INTO DBUF
  213.           CPI    1              ;JUMP IF END-OF-FILE
  214.           JZ     STF5
  215.           LXI    H,DBUF         ;POINT TO DISK BUFFER
  216.           MVI    C,128
  217.  STF2:    MOV    A,M            ;FETCH NEXT CHAR FROM DBUF
  218.           INX    H
  219.           CPI    'Z'-100Q       ;JUMP IF END-OF-FILE CHARACTER
  220.           JZ     STF5
  221.           CALL   WMC            ;WRITE CHARACTER TO RTTY
  222.           CALL   WCC            ;WRITE CHARACTER TO CONSOLE
  223.     IN    01    ;CHECK FOR CTRL D ABORT
  224.     ANI    7FH
  225.     CPI    04H
  226.     JZ    STF5
  227.  STF4:    DCR    C              ;LOOP THRU REST OF DBUF
  228.           JNZ    STF2
  229.           JMP    STF1           ;GO GET NEXT RECORD FROM DISK
  230.  STF5:    CALL   CLOSE          ;CLEAN UP ACT AND GO HOME
  231.           MVI    A,BEL          ;RING BELL TO LET CLONE
  232.           CALL   WCC            ;  KNOW WE'RE THROUGH
  233.           RET
  234.  STF6:    LXI    H,STFS1        ;PRINT 'FILE NAME ERROR'
  235.           CALL   WCS
  236.           RET
  237.  STF7:    LXI    H,STFS2        ;PRINT 'FILE NOT FOUND'
  238.           CALL   WCS
  239.           RET
  240.  
  241.  STFS1:   DB     'FILE NAME ERROR',CR,LF,0
  242.  STFS2:   DB     'FILE NOT FOUND',CR,LF,0
  243.  
  244. ;         SAVE - SAVE CHAR IN TEXT BUFFER IF FLAG ON
  245. ;
  246. ;         ENTRY CONDITIONS
  247. ;            A - CHARACTER TO SAVE
  248.  
  249.  SAVE:    PUSH   PSW
  250.           LDA    FLAG
  251.           ORA    A
  252.           JNZ    SAVE1
  253.           POP    PSW
  254.           RET
  255.  SAVE1:   POP    PSW
  256.           PUSH   H
  257.           LHLD   PTR
  258.           ANI    7FH            ;DISCARD PARITY BIT
  259.           JZ     SAVE2          ;JUMP IF CHAR IS A NULL
  260.           MOV    M,A
  261.           INX    H
  262.  SAVE2:   CMA                   ;DISPLAY CHAR ON LIGHTS
  263.           OUT    0FFH
  264.           CMA
  265.           SHLD   PTR
  266.           LHLD   SIZE           ;SIZE = SIZE + 1
  267.           INX    H
  268.           SHLD   SIZE
  269.           POP    H
  270.           RET
  271.  
  272. ;         WTB - WRITE TEXT BUFFER TO DISK
  273.  
  274.  WTB:     LHLD   SIZE           ;JUMP IF TEXT BUFFER EMPTY
  275.           MOV    A,L
  276.           ORA    H
  277.           JZ     WTB5
  278.           CALL   GFN            ;GET FILE NAME
  279.           JC     WTB6           ;JUMP IF FILE NAME ERROR
  280.           CALL   DELT           ;DELETE OLD FILE, IF ANY
  281.           CALL   MAKE           ;MAKE NEW FILE
  282.           XRA    A              ;REWIND FILE
  283.           STA    FCB+NR
  284.           LHLD   SIZE           ;DE = TBUF SIZE
  285.           XCHG
  286.           LXI    H,DBUF         ;TOP OF STACK POINTS TO DBUF
  287.           PUSH   H
  288.           LXI    H,TBUF         ;HL POINTS TO TBUF
  289.  WTB1:    MVI    C,128          ;DISK BUFFER SIZE
  290.  WTB2:    MOV    A,M            ;FETCH NEXT BYTE OF TBUF
  291.           INX    H
  292.           XTHL
  293.           MOV    M,A            ;STORE IN DBUF
  294.           INX    H
  295.           XTHL
  296.           DCX    D              ;SIZE = SIZE - 1
  297.           MOV    A,D            ;EXIT LOOP IF SIZE = 0
  298.           ORA    E
  299.           JZ     WTB3
  300.           DCR    C              ;LOOP UNTIL DBUF FULL
  301.           JNZ    WTB2
  302.           CALL   WRITE          ;WRITE FULL DBUF TO DISK
  303.           XTHL                  ;TOP OF STACK POINTS TO DBUF
  304.           LXI    H,DBUF
  305.           XTHL
  306.           JMP    WTB1           ;LOOP UNTIL END OF TBUF
  307.  WTB3:    POP    H              ;HL POINTS TO CURRENT PLACE IN DBUF
  308.  WTB4:    MVI    M,'Z'-100Q     ;STORE EOF CODE
  309.           INX    H
  310.           DCR    C              ;LOOP THRU REST OF DBUF
  311.           JNZ    WTB4
  312.           CALL   WRITE          ;WRITE LAST SECTOR TO DISK
  313.           CALL   CLOSE          ;CLEAN UP ACT AND GO HOME
  314.           MVI    A,BEL          ;RING BELL TO LET CLONE
  315.           CALL   WCC            ;  KNOW WE'RE THROUGH
  316.           RET
  317.  WTB5:    LXI    H,WTBS1        ;PRINT 'TEXT BUFFER EMPTY'
  318.           CALL   WCS
  319.           RET
  320.  WTB6:    LXI    H,WTBS2        ;PRINT 'FILE NAME ERROR'
  321.           CALL   WCS
  322.           RET
  323.  
  324.  WTBS1:   DB     'TEXT BUFFER EMPTY',CR,LF,0
  325.  WTBS2:   DB     'FILE NAME ERROR',CR,LF,0
  326.  
  327. ;         WCS - WRITE CONSOLE STRING
  328.  
  329. ;
  330. ;         ENTRY CONDITIONS
  331. ;            HL - POINTS TO STRING (TERM BY ZERO BYTE)
  332.  
  333.  WCS:     MOV    A,M
  334.           INX    H
  335.           ORA    A
  336.           RZ
  337.           CALL   WCC
  338.           JMP    WCS
  339.  
  340. ;         WCCR - WRITE CONSOLE CARRIAGE RETURN (AND LINE FEED)
  341.  
  342.  WCCR:    MVI    A,CR
  343.           CALL   WCC
  344.           MVI    A,LF
  345.  
  346. ;         WCC - WRITE CONSOLE CHARACTER
  347. ;
  348. ;         ENTRY CONDITIONS:
  349. ;            A - CHARACTER TO WRITE
  350.  
  351.  WCC:     PUSH   PSW
  352.           IN     CONS
  353.           ANI    CTBE
  354.           JZ     $-4
  355.           POP    PSW
  356.           OUT    COND
  357.     PUSH    PSW
  358.     IN    CONS1
  359.     ANI    CTBE
  360.     JZ    $-4
  361.     POP    PSW
  362.     OUT    COND1
  363.           RET
  364.  
  365. ;         RCS - READ CONSOLE STRING (WITH ECHO)
  366. ;
  367. ;         EXIT CONDITIONS
  368. ;            B - NUMBER OF CHARACTERS READ (<255)
  369. ;            HL - POINTS TO LAST CHAR STORED (CR)
  370.  
  371.  RCS:     LXI    H,IBUF
  372.           MVI    B,0
  373.  RCS1:    CALL   RCC            ;READ NEXT CHAR FROM CONSOLE
  374.           CPI    DEL            ;JUMP IF NOT DEL
  375.           JNZ    RCS2
  376.           INR    B              ;IGNORE DEL IF IBUF ALREADY EMPTY
  377.           DCR    B
  378.           JZ     RCS1
  379.           DCX    H              ;ELSE DISCARD LAST CHAR
  380.           MOV    A,M            ;ECHO DISCARDED CHAR TO CONSOLE
  381.           CALL   WCC
  382.           DCR    B              ;DECREMENT COUNT
  383.           JMP    RCS1           ;  AND LOOP
  384.  RCS2:    CPI    'U'-100Q       ;JUMP IF NOT CONTROL-U
  385.           JNZ    RCS3
  386.           CALL   WCCR           ;ELSE ABORT CURRENT LINE
  387.           JMP    RCS            ;  AND START OVER
  388.  RCS3:    CALL   WCC            ;ECHO CHAR TO CONSOLE
  389.           MOV    M,A            ;STORE CHAR IN IBUF
  390.           INR    B              ;INCREMENT COUNT
  391.           CPI    CR             ;JUMP IF CARRIAGE RETURN
  392.           JZ     RCS4
  393.           INX    H              ;ELSE ADVANCE POINTER
  394.           JMP    RCS1           ;  AND LOOP
  395.  RCS4:    MVI    A,LF           ;ISSUE LINE FEED AND RETURN
  396.           CALL   WCC
  397.           RET
  398.  
  399. ;         RCC - READ CONSOLE CHARACTER
  400. ;
  401. ;         EXIT CONDITIONS
  402. ;            A - CHARACTER READ
  403.  
  404.  RCC:     IN     CONS
  405.           ANI    CRDA
  406.           JZ     RCCC
  407.           IN     COND
  408.           ANI    177Q
  409.           RET
  410. RCCC:
  411.     IN    CONS1
  412.     ANI    CRDA
  413.     JZ    RCC
  414.     IN    COND1
  415.     ANI    177Q
  416.     RET
  417.  
  418. ;         WMC - WRITE RTTY CHARACTER
  419. ;
  420. ;         ENTRY CONDITIONS
  421. ;            A - CHARACTER TO WRITE
  422. WMC:
  423. ;    CALL    RTTYOUT        ;***************************
  424.     CALL    RTTYXMIT
  425.     PUSH    PSW    ;GONNA PRINT IT?
  426.     IN    0FFH
  427.     ANI    80H
  428.     JNZ    DIABLO
  429.     POP    PSW
  430.     RET
  431. ;
  432.  
  433. ;         RMC - READ RTTY CHARACTER
  434. ;
  435. ;         EXIT CONDITIONS:
  436. ;            A - CHARACTER READ
  437.  
  438. RMC:
  439. ;    CALL    RMC    ;********************
  440.     CALL    RTTYREAD
  441.     PUSH    PSW
  442. ;    ********* OUT TO PRINTER ALSO IF 80H UP
  443.     IN    0FFH
  444.     ANI    80H
  445.     JNZ    DIABLO
  446.     POP    PSW
  447.     RET
  448. DIABLO:
  449.     POP    PSW
  450.     PUSH    PSW
  451.     PUSH    B
  452.     PUSH    D
  453.     PUSH    H
  454.     MOV    E,A
  455.     MVI    C,5
  456.     CALL    BDOS
  457.     POP    H
  458.     POP    D
  459.     POP    B
  460.     POP    PSW
  461.     RET
  462. ;    ASCRCV(4), VER. 2
  463. ; BY KEITH PETERSEN, W8SDZ.  10/30/78.
  464. ; THIS IS A PROGRAM TO CHANGE
  465. ; ASCII-CODED-BAUDOT TO ASCII.
  466. ; THE ROUTINE RETURNS WITH A 0FFH
  467. ; IN THE 'A' REGISTER IF CHARACTER
  468. ; IS TO BE IGNORED.  OTHERWISE IT
  469. ; RETURNS WITH THE ASCII CHARACTER
  470. ; IN THE 'A' REGISTER.  IT IS ASSUMED
  471. ; THAT A STATUS TEST HAS BEEN DONE BEFORE
  472. ; CALLING THIS ROUTINE TO DETERMINE THAT
  473. ; A BAUDOT CHARACTER IS AVAILABLE.
  474. ; EQUATES
  475. BTTY:    EQU    05H    ;BAUDOT UART DATA PORT
  476. BELL:    EQU    07H    ;ASCII BELL
  477. LTRS:    EQU    1FH    ;BAUDOT 'LTRS'
  478. SPACE:    EQU    04H    ;BAUDOT 'SPACE'
  479. FIGS:    EQU    1BH    ;BAUDOT 'FIGS'
  480. APOS:    EQU    27H    ;APOSTROPHE
  481. CNTC:    EQU    03H    ;CONTROL C
  482. LARW:    EQU    5FH    ;LEFT ARROW
  483. ASPC:    EQU    20H    ;ASCII SPACE
  484. ATSN:    EQU    40H    ;"AT" SIGN
  485. CNTV:    EQU    16H    ;CONTROL V
  486. CNTO:    EQU    0FH    ;CONTROL O
  487. RUBT:    EQU    7FH    ;RUBOUT
  488. CNTE:    EQU    05H    ;CONTROL E
  489. PCT:    EQU    25H    ;PERCENT SIGN
  490. EQL:    EQU    3DH    ;EQUALS SIGN
  491. GRTH:    EQU    3EH    ;GREATER-THAN SIGN
  492. CNTH:    EQU    08H    ;CONTROL H
  493. LETH:    EQU    3CH    ;LESS-THAN SIGN
  494. CNTB:    EQU    02H    ;CONTROL B
  495. STAR:    EQU    2AH    ;ASTERISK
  496. CNTI:    EQU    09H    ;CONTROL I
  497. CNTZ:    EQU    1AH    ;CONTROL Z
  498. CNTA:    EQU    01H    ;CONTROL A
  499. CNTX:    EQU    18H    ;CONTROL X
  500. UARW:    EQU    5EH    ;UP-ARROW
  501. PLUS:    EQU    2BH    ;PLUS SIGN
  502. RESL:    EQU    5CH    ;REVERSE SLANT
  503. LBKT:    EQU    5BH    ;LEFT BRACKET
  504. RBKT:    EQU    5DH    ;RIGHT BRACKET
  505. ESCP:    EQU    1BH    ;ESCAPE KEY
  506. ALMD:    EQU    7DH    ;ALTERNATE MODE KEY
  507. ; PROGRAM STARTS HERE
  508. RTTYREAD:
  509. ASCRCV:    PUSH    H    ;SAVE HL REGISTERS
  510.     LHLD    CASAVE    ;GET PRESENT CASE
  511. START:    IN    BTTY    ;GET BAUDOT CHARACTER
  512.     ANI    1FH    ;BAUDOT CHARACTERS ONLY
  513.     CPI    FIGS
  514.     JZ    UCASE
  515.     CPI    LTRS
  516.     JZ    LCASE
  517.     ORA    A    ;BAUDOT 'BLANK' ?
  518.     JZ    TCASE
  519.     CPI    SPACE
  520.     JNZ    START1
  521.     LXI    H,LTABLE ;SPACE GIVES LOWER CASE
  522. START1:    SHLD    CASAVE    ;SAVE PRESENT CASE
  523.     ADD    L    ;ADD CHAR. TO TABLE ADRS.
  524.     MOV    L,A    ;L POINTS TO ASCII CHAR.
  525.     MOV    A,H    ;GET H FOR CORRECTION
  526.     ACI    0    ;SEE IF CORRECTION NEEDED
  527.     MOV    H,A    ;H IS CORRECT NOW
  528.     XRA    A    ;PUT ZERO IN A REG.
  529.     STA    FLAGR    ;CLEAR LTRS-FIGS LAST FLAG
  530.     MOV    A,M    ;GET ASCII EQUIVALENT
  531.     POP    H    ;RESTORE HL REGISTERS
  532.     ORA    A    ;IS IT PRINTABLE?
  533.     RNZ        ;YES, VALID CHAR. RETURN
  534.     CMA        ;MAKE 0FFH 'IGNORE FLAG'
  535.     RET        ;RETURN TO CALLING PROGRAM
  536. LCASE:    LXI    H,LTABLE ;LOWER CASE TABLE ADDRESS
  537.     JMP    SETFLG    ;SET LTRS LAST FLAG, EXIT
  538. UCASE:    LXI    H,UTABLE ;UPPER CASE TABLE ADDRESS
  539.     JMP    SETFLG    ;SET FIGS LAST FLAG, EXIT
  540. TCASE:    LDA    FLAGR    ;GET SHIFT REMINDER FLAG
  541.     CPI    FIGS
  542.     JNZ    FCASE
  543.     LXI    H,TTABLE ;THIRD CASE TABLE ADDRESS
  544.     JMP    CLRFLG
  545. FCASE:    CPI    LTRS    ;CHECK FOR LTRS LAST
  546.     JNZ    CLRFLG
  547.     LXI    H,FTABLE ;FOURTH CASE TABLE ADDRESS
  548. CLRFLG:    XRA    A    ;READY TO CLEAR FLAG
  549. SETFLG:    STA    FLAGR    ;LTRS-FIGS LAST FLAG
  550.     SHLD    CASAVE    ;SAVE PRESENT CASE
  551.     MVI    A,0FFH    ;'IGNORE FLAG'
  552.     POP    H    ;RESTORE HL REGS.
  553.     RET        ;RETURN TO CALLING PROGRAM
  554. ; THIS IS THE LOWER-CASE TABLE.
  555. LTABLE:    DB    0,'E',LF,'A SIU',CR,'DRJNFCK'
  556.     DB    'TZLWHYPQOBG',FIGS,'MXV'
  557. ; THIS IS THE UPPER-CASE TABLE.
  558. UTABLE:    DB    0,'3',LF,'- ',BELL,'87',CR,'$4'
  559.     DB    APOS,',!:(5")2#6019?&',FIGS,'./;'
  560. ; THIS IS THE THIRD-CASE TABLE.
  561. ; IT IS USED FOR SPECIAL CHARACTERS.
  562. ; THE FIRST COLUMN IN THE TABLE
  563. ; THE ASCII CHARACTER EQUIVALENT.
  564. ; THE SECOND COLUMN IS THE SPECIAL
  565. ; CASE BAUDOT CHARACTER FROM WHICH
  566. ; THE CONVERSION IS MADE.
  567. TTABLE:    DB    0,CNTC,LF    ;BL  3   LF
  568.     DB    LARW,ASPC,ATSN    ;-   SP  BELL
  569.     DB    CNTV,CNTO,CR    ;8   7   CR
  570.     DB    ALMD,CNTE,PCT    ;$   4   '
  571.     DB    RUBT,EQL,ESCP    ;,   !   :
  572.     DB    LETH,CNTH,LBKT    ;(   5   "
  573.     DB    GRTH,CNTB,STAR    ;)   2   #
  574.     DB    CNTI,CNTZ,CNTA    ;6   0   1
  575.     DB    CNTX,UARW,PLUS    ;9   ?   &
  576.     DB    0,RBKT,RESL    ;FIG .   /
  577.     DB    0            ;;
  578. ; THIS IS THE FOURTH CASE TABLE
  579. ; FOR LOWER-CASE ALPHA CHARACTERS.
  580. FTABLE:    DB    0,65H,LF,61H,ASPC,73H
  581.     DB    69H,75H,CR,64H,72H,6AH
  582.     DB    6EH,66H,63H,6BH,74H,7AH
  583.     DB    6CH,77H,68H,79H,70H,71H
  584.     DB    6FH,62H,67H,FIGS,6DH,78H
  585.     DB    76H
  586. ; TEMPORARY STORAGE AREA
  587. CASAVE:    DW    LTABLE    ;PRESENT CASE REMINDER
  588. FLAGR:    DB    0    ;FIGS/LTRS LAST FLAG
  589.  
  590. ;        ASCXMT(4) REV. 2
  591. ;    BY KEITH PETERSEN, W8SDZ.  10/29/78.
  592. ; THIS PROGRAM IS FOR TRANSMITTING ASCII
  593. ; THROUGH A BAUDOT MEDIUM USE A SPECIAL
  594. ; FORMAT OF FIGURES BLANK (X) - WHERE (X)
  595. ; IS A SPECIAL BAUDOT CHARACTER USED TO
  596. ; CONVEY THE ASCII EQUIVALENT CHARACTER TO THE
  597. ; RECEIVING END WHERE IT IS THEN CONVERTED BACK
  598. ; TO ASCII AGAIN.  LOWER CASE ALPHA CHARACTERS
  599. ; ARE TRANSMITTED VIA A 4TH CASE, LTRS BLANK (X).
  600. ;
  601. ; EQUATES
  602. LTRSX:    EQU    1FH
  603. FIGSX:    EQU    1BH
  604. CRX:    EQU    48H
  605. LFX:    EQU    42H
  606. STATUS:    EQU    04H    ;BAUDOT UART STATUS PORT
  607. TBE:    EQU    80H    ;UART TRANS. BUF. EMPTY FLAG
  608. BTTY:    EQU    05H    ;BAUDOT UART DATA PORT
  609. ALTMOD:    EQU    7DH    ;ALTERNATE MODE KEY
  610. ;          PROGRAM STARTS HERE.
  611. ; CALL WITH ASCII CHARACTER IN ACCUMULATOR.
  612. RTTYXMIT:
  613. STARTX:    PUSH    PSW    ;SAVE REGISTERS USED
  614.     PUSH    B
  615.     PUSH    H
  616. BAUDOT:    MVI    C,0    ;SET UP COUNTER
  617.     ANI    7FH    ;STRIP PARITY BIT
  618.     CPI    ALTMOD    ;ALTERNATE MODE KEY?
  619.     JNZ    BAUD2    ;NO, IGNORE NEXT ROUTINE
  620.     MVI    A,09H    ;BAUDOT '$'
  621.     JMP    BAUD3
  622. BAUD2:    CPI    7BH    ;ABOVE L.C. 'Z' ?
  623.     JNC    TTY0    ;IF SO, IGNORE IT
  624.     LXI    H,BTABLE ;POINT TO TABLE START
  625.     ADD    L    ;ADD CHARACTER VALUE
  626.     MOV    L,A    ;L POINTS TO BAUDOT CHAR.
  627.     MOV    A,H    ;GET H FOR CORRECTION
  628.     ACI    0    ;CORRECT IF NECESSARY
  629.     MOV    H,A    ;H IS NOW CORRECT
  630.     MOV    A,M    ;GET BAUDOT CHARACTER
  631.     ORA    A    ;IS IT A NON-PRINTING CHAR?
  632.     JZ    TTY0    ;IF SO IGNORE IT
  633.     CPI    CRX    ;IS IT A CARRIAGE RETURN?
  634.     JZ    TTYOUT-1 ;YES, HANDLE WITHOUT CASE TEST
  635.     CPI    LFX    ;IS IT A LINE FEED?
  636.     JNZ    BAUD3    ;NO, IGNORE NEXT ROUTINE
  637.     MVI    A,LTRSX    
  638.     PUSH    PSW    ;SAVE IT ON STACK
  639.     MVI    A,LFX
  640.     LXI    H,SCASE    ;POINT TO PRESENT CASE REG.
  641.     MVI    M,40H    ;SET IT TO LOWER CASE
  642.     JMP    TTYOUT-2 ;SEND LF AND LTRS
  643. BAUD3:    PUSH    PSW    ;SAVE CHARACTER
  644.     ANI    0C0H    ;STRIP ALL BUT CASE BITS
  645.     LXI    H,SCASE    ;POINT TO PRESENT CASE REG.
  646.     CMP    M    ;SAME CASE AS PREVIOUS CHARACTER?
  647.     JZ    TTYOUT    ;YES NO CHANGE NECESSARY
  648.     MOV    M,A    ;UPDATE CASE REGISTER
  649.     ORA    A
  650.     JZ    TCASEX
  651.     CPI    80H
  652.     JZ    UCASEX
  653.     CPI    0C0H
  654.     JNZ    LCASSEX
  655. FCASEX:    XRA    A    ;GET A BAUDOT 'BLANK'
  656.     PUSH    PSW    ;SAVE IT ON THE STACK
  657.     INR    C    ;INCREMENT CHARACTER COUNT
  658. LCASSEX:    MVI    A,LTRSX
  659.     JMP    TTYOUT-2
  660. TCASEX:    XRA    A    ;GET A BAUDOT 'BLANK'
  661.     PUSH    PSW    ;SAVE IT ON THE STACK
  662.     INR    C    ;INCREMENT CHARACTER COUNT
  663. UCASEX:    MVI    A,FIGSX
  664.     INR    C    ;INCREMENT CHARACTER COUNT
  665.     PUSH    PSW    ;SAVE IT ON THE STACK
  666. TTYOUT:    IN    STATUS    ;BAUDOT UART STATUS
  667.     ANI    TBE    ;TRANS. BUFFER EMPTY?
  668.     JNZ    TTYOUT    ;IF NOT, LOOP AND WAIT
  669.     POP    PSW    ;GET CHARACTER
  670. ; OMIT NSEXT THREE LINES IF NO LIGHTS.
  671.     CMA        ;INVERT FOR LIGHTS
  672.     OUT    0FFH    ;PUT ON FRONT PANEL LIGHTS
  673.     CMA        ;INVERT BACK TO NORMAL
  674. ;
  675. ; OMIT ABOVE THREE LINES IF NO LIGHTS.
  676.     ORI    0E0H    ;MAKE UPPER 3 BITS MARKING
  677.     OUT    BTTY    ;SEND TO BAUDOT UART PORT
  678.     DCR    C    ;MORE TO SEND?
  679.     JP    TTYOUT    ;YES, CONTINUE SENDING
  680. TTY0:    POP    H    ;RESTORE REGISTERS
  681.     POP    B
  682.     POP    PSW
  683.     RET        ;RETURN TO CALLING PROGRAM
  684. BTABLE:    DB    5FH,17H,13H    ;NUL SOH STX
  685.     DB    1,0,0AH        ;ETX EOT ENQ
  686.     DB    0,85H,10H    ;ACK BEL BS
  687.     DB    15H,42H,0C2H    ;HT  LF  VT
  688.     DB    2,48H,0        ;FF  CR  SO
  689.     DB    7,0,0        ;SI  DLE DC1
  690.     DB    0,0,0        ;DC2 DC3 DC4
  691.     DB    0,6,0        ;NAK SYN ETB
  692.     DB    18H,0,16H    ;CAN EM  SUB
  693.     DB    0EH,0,0        ;ESC FS  GS
  694.     DB    0,0,44H        ;RS  US  SPACE
  695.     DB    8DH,91H,94H    ;!   "   #
  696.     DB    89H,0BH,9AH    ;$   PCT &
  697.     DB    8BH,8FH,92H    ;'   (   )
  698.     DB    14H,1AH,8CH    ;AS  PL  ,
  699.     DB    83H,9CH,9DH    ;-   .   /
  700.     DB    96H,97H,93H    ;0   1   2
  701.     DB    81H,8AH,90H    ;3   4   5
  702.     DB    95H,87H,86H    ;6   7   8
  703.     DB    98H,8EH,9EH    ;9   :   ;
  704.     DB    0FH,0DH,12H    ;LT  EQ  GT
  705.     DB    99H,5,43H    ;?   AT  A
  706.     DB    59H,4EH,49H    ;B   C   D
  707.     DB    41H,4DH,5AH    ;E   F   G
  708.     DB    54H,46H,4BH    ;H   I   J
  709.     DB    4FH,52H,5CH    ;K   L   M
  710.     DB    4CH,58H,56H    ;N   O   P
  711.     DB    57H,4AH,45H    ;Q   R   S
  712.     DB    50H,47H,5EH    ;T   U   V
  713.     DB    53H,5DH,55H    ;W   X   Y
  714.     DB    51H,11H,1DH    ;Z   LB  LS
  715.     DB    1CH,19H,3    ;RB  UA  LA
  716. ; THESE ARE THE LOWER CASE ALPHA CHARACTERS
  717.     DB    0,0C3H,0D9H    ;'   A   B
  718.     DB    0CEH,0C9H,0C1H    ;C   D   E
  719.     DB    0CDH,0DAH,0D4H    ;F   G   H
  720.     DB    0C6H,0CBH,0CFH    ;I   J   K
  721.     DB    0D2H,0DCH,0CCH    ;L   M   N
  722.     DB    0D8H,0D6H,0D7H    ;O   P   Q
  723.     DB    0CAH,0C5H,0D0H    ;R   S   T
  724.     DB    0C7H,0DEH,0D3H    ;U   V   W
  725.     DB    0DDH,0D5H,0D1H    ;X   Y   Z
  726. ; TEMPORARY STORAGE AREA
  727. SCASE:    DB    40H    ;PRESENT CASE REGISTER
  728.   
  729.  
  730.  GFN:     CALL   WCCR
  731.           LXI    H,GFNS1        ;PRINT 'FILENAME? '
  732.           CALL   WCS
  733.           CALL   RCS            ;READ RESPONSE INTO IBUF
  734.           LXI    H,FCB+FN       ;BLANK FILL FN AND FT FIELDS
  735.           MVI    C,11
  736.  GFN1:    MVI    M,' '
  737.           INX    H
  738.           DCR    C
  739.           JNZ    GFN1
  740.           LXI    H,IBUF         ;POINT TO INPUT BUFFER
  741.           LXI    D,FCB+FN       ;SCAN OFF FN FIELD
  742.           MVI    C,9
  743.  GFN2:    MOV    A,M            ;FETCH NSEXT CHAR FROM IBUF
  744.           INX    H
  745.           CPI    141Q           ;IF LC, CONVERT TO UC
  746.           JC     $+5
  747.           SUI    40Q
  748.           CPI    CR             ;JUMP IF END OF LINE
  749.           JZ     GFN5
  750.           CPI    '.'            ;JUMP IF END OF NAME
  751.           JZ     GFN3
  752.           STAX   D              ;ELSE STORE CHAR IN FN FIELD
  753.           INX    D
  754.           DCR    C              ;LOOP IF 8 OR LESS CHARS SO FAR
  755.           JNZ    GFN2
  756.           JMP    GFN6           ;ELSE TAKE ERROR SEXIT
  757.  GFN3:    LXI    D,FCB+FT       ;SCAN OFF FT FIELD
  758.           MVI    C,4
  759.  GFN4:    MOV    A,M            ;FETCH NSEXT CHAR FROM IBUF
  760.           INX    H
  761.           CPI    141Q           ;IF LC, CONVERT TO UC
  762.           JC     $+5
  763.           SUI    40Q
  764.           CPI    CR             ;JUMP IF END OF LINE
  765.           JZ     GFN5
  766.           STAX   D              ;ELSE STORE CHAR IN FT FIELD
  767.           INX    D
  768.           DCR    C              ;LOOP IF 3 OR LESS CHARS SO FAR
  769.           JNZ    GFN4
  770.           JMP    GFN6           ;ELSE TAKE ERROR SEXIT
  771.  GFN5:    STC                   ;CLEAR ERROR FLAG AND RETURN
  772.           CMC
  773.           RET
  774.  GFN6:    STC                   ;SET ERROR FLAG AND RETURN
  775.           RET
  776.  
  777.  GFNS1:   DB     'FILENAME? ',0
  778.  
  779. ;         OPEN - OPEN DISK FILE
  780.  
  781.  OPEN:    PUSH   H
  782.           PUSH   D
  783.           PUSH   B
  784.           LXI    D,FCB
  785.           MVI    C,OFFC
  786.           CALL   BDOS
  787.           POP    B
  788.           POP    D
  789.           POP    H
  790.           RET
  791.  
  792. ;         READ - READ RECORD FROM DISK FILE
  793.  
  794.  READ:    PUSH   H
  795.           PUSH   D
  796.           PUSH   B
  797.           LXI    D,FCB
  798.           MVI    C,RRFC
  799.           CALL   BDOS
  800.           POP    B
  801.           POP    D
  802.           POP    H
  803.           RET
  804.  
  805. ;         CLOSE - CLOSE DISK FILE
  806.  
  807.  CLOSE:   PUSH   H
  808.           PUSH   D
  809.           PUSH   B
  810.           LXI    D,FCB
  811.           MVI    C,CFFC
  812.           CALL   BDOS
  813.           POP    B
  814.           POP    D
  815.           POP    H
  816.           RET
  817.  
  818. ;         DELT - DELETE DISK FILE
  819.  
  820.  DELT:    PUSH   H
  821.           PUSH   D
  822.           PUSH   B
  823.           LXI    D,FCB
  824.           MVI    C,DFFC
  825.           CALL   BDOS
  826.           POP    B
  827.           POP    D
  828.           POP    H
  829.           RET
  830.  
  831. ;         WRITE - WRITE RECORD TO DISK
  832.  
  833.  WRITE:   PUSH   H
  834.           PUSH   D
  835.           PUSH   B
  836.           LXI    D,FCB
  837.           MVI    C,WRFC
  838.           CALL   BDOS
  839.           POP    B
  840.           POP    D
  841.           POP    H
  842.           RET
  843.  
  844. ;         MAKE - MAKE NEW DISK FILE
  845.  
  846.  MAKE:    PUSH   H
  847.           PUSH   D
  848.           PUSH   B
  849.           LXI    D,FCB
  850.           MVI    C,MFFC
  851.           CALL   BDOS
  852.           POP    B
  853.           POP    D
  854.           POP    H
  855.           RET
  856.  
  857. ;         DATA AREA
  858.  
  859.  MCB:     DS     1              ;RTTY CONTROL BYTE
  860.  
  861.  INCH:    DS     1              ;INPUT CHAR BUFFER (TO CYBER)
  862.  OUTCH:   DS     1              ;OUTPUT CHAR BUFFER (FROM CYBER)
  863.  
  864.  OLDSP:   DS     2              ;OLD STACK POINTER
  865.  STACK:   DS     128             ;LOCAL STACK
  866.  
  867. IBUF:    DS    256
  868.  
  869. ;         TSEXT BUFFER
  870.  
  871.  FLAG:    DS     1              ;TSEXT SAVE FLAG
  872.  PTR:     DS     2              ;TSEXT BUFFER POINTER
  873.  SIZE:    DS     2              ;TSEXT BUFFER SIZE
  874.  TBUF     EQU    $              ;START OF TSEXT BUFFER
  875.  
  876.  NUM      EQU    TBUF           ;TEMPORARY BUFFER FOR PHONE NUMBER
  877.  
  878.           END    LINK
  879.