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 / CPMUG019.ARK / LINK.ASM < prev    next >
Assembly Source File  |  1985-02-10  |  21KB  |  649 lines

  1. ;         LINK - SUPPORT COMMUNICATIONS LINK WITH CYBER
  2. ;
  3. ;         L.E. HUGHES     EDCAM     JULY, 1977
  4. ;
  5. ;         *LINK* IS A CP/M TRANSIENT COMMAND WHICH ALLOWS THE USER TO
  6. ;         ESTABLISH A COMMUNICATIONS LINK WITH A REMOTE COMPUTER
  7. ;         *LINK* CURRENTLY SUPPORTS TWO WAY TRANSFER OF TEXT FILES BETWEEN
  8. ;         THE CP/M DISK AND THE REMOTE COMPUTER. THE FOLLOWING CONTROL
  9. ;         CODES MAY BE INITIATED FROM THE CONSOLE KEYBOARD:
  10. ;
  11. ;            CTRL-S    SEND TEXT FILE FROM DISK TO CYBER
  12. ;            CTRL-R    ENABLE TEXT-FILE-LOADER (INTO MEMORY)
  13. ;            CTRL-Q    DISABLE TEXT FILE LOADER, WRITE MEMORY TO DISK
  14.  
  15. ;         BDOS ENTRY POINT AND FUNCTION CODES
  16.  
  17.  BDOS     EQU    0005H
  18.  OFFC     EQU    15             ;OPEN FILE
  19.  CFFC     EQU    16             ;CLOSE FILE
  20.  DFFC     EQU    19             ;DELETE FILE
  21.  RRFC     EQU    20             ;READ RECORD
  22.  WRFC     EQU    21             ;WRITE RECORD
  23.  MFFC     EQU    22             ;MAKE FILE
  24.  
  25. ;         DEFAULT FCB AND FIELD DEFINITIONS
  26.  
  27.  FCB      EQU    5CH
  28.  FN       EQU    1              ;FILE NAME FIELD (REL)
  29.  FT       EQU    9              ;FILE TYPE FIELD (REL)
  30.  NR       EQU    32             ;NEXT RECORD FIELD (REL)
  31.  DBUF     EQU    80H            ;DEFAULT DISK BUFFER ADDRESS
  32.  
  33. ;         ASCII CONTROL CHARACTERS
  34.  
  35.  BEL      EQU    007Q           ;BELL
  36.  LF       EQU    012Q           ;LINE FEED
  37.  CR       EQU    015Q           ;CARRIAGE RETURN
  38.  DEL      EQU    177Q           ;DELETE
  39.  
  40. ;         I/O PORT ADDRESSES
  41.  
  42.  COND     EQU    001Q           ;CONSOLE DATA PORT
  43.  CONS     EQU    000Q           ;CONSOLE STATUS PORT
  44.  MODD     EQU    200Q           ;MODEM DATA PORT
  45.  MODS     EQU    201Q           ;MODEM STATUS PORT
  46.  MODC     EQU    202Q           ;MODEM CONTROL PORT
  47.  
  48. ;         I/O SYMBOL DEFINITIONS
  49.  
  50.  CTBE     EQU    200Q           ;CONSOLE TRANSMIT BUFFER EMPTY
  51.  CRDA     EQU    100Q           ;CONSOLE READ DATA AVAILABLE
  52.  
  53.  MTBE     EQU    002Q           ;MODEM TRANSMIT BUFFER EMPTY
  54.  MRDA     EQU    001Q           ;MODEM READ DATA AVAILABLE
  55.  O300     EQU    005Q           ;ORIGINATE MODE / 300 BAUD
  56.  HOOK     EQU    200Q           ;OFF-HOOK (RAISED)
  57.  TXE      EQU    002Q           ;TRANSMIT ENABLE
  58.  WORD     EQU    026Q           ;8 BITS, NO PARITY, 1 STOP BIT
  59.  
  60. ;         MAIN PROGRAM
  61.  
  62.           ORG    100H
  63.  LINK:    LXI    H,0            ;SAVE OLD STACK POINTER
  64.           DAD    SP
  65.           SHLD   OLDSP
  66.           LXI    SP,STACK+64    ;CREATE LOCAL STACK
  67.           IN     MODS           ;JUMP IF CARRIER DETECT ALREADY ON
  68.           ANI    40H
  69.           JNZ    LINK2
  70.           LXI    H,80H          ;GET PHONE NUMBER FROM COMMAND LINE
  71.           MOV    B,M
  72.           INX    H
  73.           LXI    D,NUM
  74.           INR    B
  75.  GPN1:    DCR    B
  76.           JZ     GPN2
  77.           MOV    A,M
  78.           INX    H
  79.           CPI    ' '
  80.           JZ     GPN1
  81.           STAX   D
  82.           INX    D
  83.           JMP    GPN1
  84.  GPN2:    MVI    A,0
  85.           STAX   D
  86.           MVI    B,0FFH         ;CLEAR MODEM CONTROL REGISTER
  87.           CALL   MCOFF
  88.           MVI    B,O300         ;SET MODE TO ORIGINATE / 300 BAUD
  89.           CALL   MCON
  90.           MVI    A,WORD         ;DEFINE UART WORD FORMAT
  91.           OUT    MODS
  92.           MVI    B,HOOK         ;RAISE HOOK
  93.           CALL   MCON
  94.           MVI    B,40           ;PAUSE 2 SECONDS
  95.  DIAL0:   CALL   DELAY
  96.           DCR    B
  97.           JNZ    DIAL0
  98.           LXI    H,NUM          ;POINT TO PHONE NUMBER
  99.  DIAL1:   MOV    A,M            ;FETCH NEXT DIGIT OF PHONE NUMBER
  100.           INX    H
  101.           ORA    A              ;EXIT WHEN DONE
  102.           JZ     DIAL2
  103.           CALL   WCC
  104.           CPI    '-'            ;IGNORE DASHES IN NUMBER
  105.           JZ     DIAL1
  106.           SUI    '0'            ;SUBTRACT ASCII BIAS
  107.           JNZ    $+5            ;JUMP IF DIGIT NOT '0'
  108.           MVI    A,10           ;SPECIAL CASE FOR 10 CLICKS
  109.           CALL   PULSE          ;DO THE CLICKS
  110.           JMP    DIAL1          ;LOOP THRU ENTIRE PHONE NUMBER
  111.  DIAL2:   LXI    D,400          ;SETUP FOR 20 SECONDS MAX DELAY
  112.           CALL   DELAY          ;ALLOW CARRIER TO SETTLE
  113.  DIAL3:   IN     MODS           ;JUMP IF CARRIER DETECT HIGH
  114.           ANI    40H
  115.           JNZ    DIAL4
  116.           CALL   DELAY          ;WAIT ANOTHER 50 MS
  117.           DCX    D
  118.           MOV    A,D
  119.           ORA    E
  120.           JNZ    DIAL3
  121.           JMP    LINKX          ;EXIT IF NO RESPONSE
  122.  DIAL4:   MVI    B,TXE          ;ENABLE TRANSMITTER
  123.           CALL   MCON
  124.           MVI    A,CR
  125.           CALL   WCC
  126.           MVI    A,LF
  127.           CALL   WCC
  128.  LINK2:   XRA    A              ;CLEAR CHAR BUFFERS
  129.           STA    INCH
  130.           STA    OUTCH
  131.           STA    FLAG           ;CLEAR TEXT SAVE FLAG
  132.           LXI    H,TBUF         ;SET PTR TO TBUF
  133.           SHLD   PTR
  134.           LXI    H,0            ;SIZE = 0
  135.           SHLD   SIZE
  136.           CALL   WCCR           ;WRITE CR/LF TO CONSOLE
  137.           MVI    A,BEL          ;RING BELL ON CONSOLE, TO LET
  138.           CALL   WCC            ;  CLONE KNOW WE'RE READY
  139.  
  140. ;         MAIN LOOP
  141.  
  142.  LINK3:   IN     MODS           ;EXIT IF CARRIER DETECT GOES BYE BYE
  143.           ANI    40H
  144.           JZ     LINKX
  145.           IN     CONS           ;JUMP IF NO DATA FROM CONSOLE
  146.           ANI    CRDA
  147.           JZ     LINK4
  148.           IN     COND           ;ELSE READ CONSOLE DATA
  149.           ANI    177Q           ;CALL PCC IF CONTROL CHAR
  150.           CPI    40Q
  151.           CC     PCC
  152.           JC     LINK4          ;JUMP IF PCC HANDLED CHAR
  153.           ORI    200Q           ;ELSE SET VALID DATA BIT
  154.           STA    INCH           ;AND STORE IN INPUT CHAR BUFFER
  155.  LINK4:   IN     CONS           ;JUMP IF CONSOLE XMIT BUFFER BUSY
  156.           ANI    CTBE
  157.           JZ     LINK5
  158.           LDA    OUTCH          ;JUMP IF NO DATA FOR CONSOLE
  159.           ORA    A
  160.           JP     LINK5
  161.           ANI    177Q           ;ELSE DISCARD VALID DATA BIT
  162.           OUT    COND           ;  AND OUTPUT CHAR TO CONSOLE
  163.           XRA    A              ;  THEN CLEAR OUTPUT CHAR BUFFER
  164.           STA    OUTCH
  165.  LINK5:   IN     MODS           ;JUMP IF NO DATA FROM MODEM
  166.           ANI    MRDA
  167.           JZ     LINK6
  168.           IN     MODD           ;ELSE READ MODEM DATA
  169.           ANI    177Q           ;DISCARD PARITY BIT
  170.           CALL   SAVE           ;SAVE CHAR IN TEXT BUFFER IF FLAG ON
  171.           ORI    200Q           ;SET DATA VALID BIT
  172.           STA    OUTCH          ;STORE IN OUTPUT CHAR BUFFER
  173.  LINK6:   IN     MODS           ;JUMP IF MODEM XMIT BUFFER BUSY
  174.           ANI    MTBE
  175.           JZ     LINK7
  176.           LDA    INCH           ;JUMP IF NO DATA FOR MODEM
  177.           ORA    A
  178.           JP     LINK7
  179.           ANI    177Q           ;ELSE DISCARD VALID DATA BIT
  180.           OUT    MODD           ;  AND OUTPUT CHAR TO MODEM
  181.           XRA    A              ;  THEN CLEAR INPUT CHAR BUFFER
  182.           STA    INCH
  183.  LINK7:   JMP    LINK3          ;END OF MAIN LOOP
  184.  
  185.  LINKX:   MVI    B,0FFH         ;CLEAR MODEM
  186.           CALL   MCOFF
  187.           LHLD   OLDSP
  188.           SPHL
  189.           RET
  190.  
  191. ;         DELAY - DELAY FOR 50 MILLISECONDS
  192.  
  193.  DELAY:   PUSH   PSW
  194.           PUSH   H
  195.           LXI    H,4164
  196.  DEL1:    DCX    H
  197.           MOV    A,H
  198.           ORA    L
  199.           JNZ    DEL1
  200.           POP    H
  201.           POP    PSW
  202.           RET
  203.  
  204. ;         PULSE - SEND A PULSES BY TAPPING HOOK
  205.  
  206.  PULSE:   PUSH   PSW
  207.           MVI    B,HOOK         ;LOWER HOOK
  208.           CALL   MCOFF
  209.           CALL   DELAY          ;PAUSE 50 MS
  210.           MVI    B,HOOK         ;RAISE HOOK
  211.           CALL   MCON
  212.           CALL   DELAY          ;PAUSE 50 MS
  213.           POP    PSW
  214.           DCR    A              ;DO IT A TIMES
  215.           JNZ    PULSE
  216.           MVI    A,10           ;PAUSE 500 MS
  217.  PUL1:    CALL   DELAY
  218.           DCR    A
  219.           JNZ    PUL1
  220.           RET
  221.  
  222. ;         MCON - TURN ON BIT(S) ON MODEM CONTROL PORT
  223.  
  224.  MCON:    PUSH   PSW
  225.           LDA    MCB
  226.           ORA    B
  227.           STA    MCB
  228.           OUT    MODC
  229.           POP    PSW
  230.           RET
  231.  
  232. ;         MCOFF - TURN OFF BIT(S) ON MODEM CONTROL PORT
  233.  
  234.  MCOFF:   PUSH   PSW
  235.           MOV    A,B
  236.           CMA
  237.           MOV    B,A
  238.           LDA    MCB
  239.           ANA    B
  240.           STA    MCB
  241.           OUT    MODC
  242.           POP    PSW
  243.           RET
  244.  
  245. ;         PCC - PROCESS CONTROL CHARACTER
  246.  
  247.  PCC:     CPI    'X'-100Q       ;JUMP IF NOT CONTROL-X
  248.           JNZ    PCC1
  249.           LHLD   OLDSP          ;ELSE CLEAN UP ACT AND GO HOME
  250.           SPHL
  251.           RET
  252.  PCC1:    CPI    'S'-100Q       ;JUMP IF NOT CONTROL-S
  253.           JNZ    PCC2
  254.           CALL   STF            ;SEND TEXT FILE TO MODEM
  255.           STC                   ;TELL LINK TO IGNORE THIS CHARACTER
  256.           RET
  257.  PCC2:    CPI    'R'-100Q       ;JUMP IF NOT CONTROL-R
  258.           JNZ    PCC3
  259.           MVI    A,1            ;TURN ON TEXT SAVE FLAG
  260.           STA    FLAG
  261.           STC
  262.           RET
  263.  PCC3:    CPI    'Q'-100Q       ;JUMP IF NOT CONTROL-Q
  264.           JNZ    PCC4
  265.           XRA    A              ;TURN OFF TEXT SAVE FLAG
  266.           STA    FLAG
  267.           CALL   WTB            ;WRITE TEXT BUFFER TO DISK
  268.           LXI    H,TBUF         ;CLEAR TEXT BUFFER
  269.           SHLD   PTR
  270.           LXI    H,0
  271.           SHLD   SIZE
  272.           STC
  273.           RET
  274.  PCC4:    STC                   ;LET LINK HANDLE ALL OTHER CONTROL CODES
  275.           CMC
  276.           RET
  277.         
  278. ;         STF - SEND TEXT FILE (TO MODEM)
  279.  
  280.  STF:     CALL   GFN            ;GET NAME OF DISK FILE TO SEND
  281.           JC     STF6           ;JUMP IF FILE NAME ERROR
  282.           CALL   OPEN           ;TRY TO OPEN SPECIFIED FILE
  283.           CPI    255            ;JUMP IF FILE NOT FOUND
  284.           JZ     STF7
  285.           XRA    A              ;ELSE REWIND FILE AND GET ON WITH IT
  286.           STA    FCB+NR
  287.  STF1:    CALL   READ           ;READ NEXT RECORD INTO DBUF
  288.           CPI    1              ;JUMP IF END-OF-FILE
  289.           JZ     STF5
  290.           LXI    H,DBUF         ;POINT TO DISK BUFFER
  291.           MVI    C,128
  292.  STF2:    MOV    A,M            ;FETCH NEXT CHAR FROM DBUF
  293.           INX    H
  294.           CPI    'Z'-100Q       ;JUMP IF END-OF-FILE CHARACTER
  295.           JZ     STF5
  296.           CPI    LF             ;IGNORE LINE FEEDS
  297.           JZ     STF4
  298.           CALL   WMC            ;WRITE CHARACTER TO MODEM
  299.           CALL   WCC            ;WRITE CHARACTER TO CONSOLE
  300.           CPI    CR             ;JUMP IF NOT CARRIAGE RETURN
  301.           JNZ    STF4
  302.  STF3:    CALL   RMC            ;AWAIT LINE FEED FROM MODEM
  303.           CPI    LF
  304.           JNZ    STF3
  305.           CALL   WCC            ;ECHO LINE FEED TO CONSOLE
  306.           IN     CONS
  307.           ANI    CRDA
  308.           JZ     STF4
  309.           IN     COND
  310.           JMP    STF5
  311.  STF4:    DCR    C              ;LOOP THRU REST OF DBUF
  312.           JNZ    STF2
  313.           JMP    STF1           ;GO GET NEXT RECORD FROM DISK
  314.  STF5:    CALL   CLOSE          ;CLEAN UP ACT AND GO HOME
  315.           MVI    A,BEL          ;RING BELL TO LET CLONE
  316.           CALL   WCC            ;  KNOW WE'RE THROUGH
  317.           RET
  318.  STF6:    LXI    H,STFS1        ;PRINT 'FILE NAME ERROR'
  319.           CALL   WCS
  320.           RET
  321.  STF7:    LXI    H,STFS2        ;PRINT 'FILE NOT FOUND'
  322.           CALL   WCS
  323.           RET
  324.  
  325.  STFS1:   DB     'FILE NAME ERROR',CR,LF,0
  326.  STFS2:   DB     'FILE NOT FOUND',CR,LF,0
  327.  
  328. ;         SAVE - SAVE CHAR IN TEXT BUFFER IF FLAG ON
  329. ;
  330. ;         ENTRY CONDITIONS
  331. ;            A - CHARACTER TO SAVE
  332.  
  333.  SAVE:    PUSH   PSW
  334.           LDA    FLAG
  335.           ORA    A
  336.           JNZ    SAVE1
  337.           POP    PSW
  338.           RET
  339.  SAVE1:   POP    PSW
  340.           PUSH   H
  341.           LHLD   PTR
  342.           ANI    7FH            ;DISCARD PARITY BIT
  343.           JZ     SAVE2          ;JUMP IF CHAR IS A NULL
  344.           MOV    M,A
  345.           INX    H
  346.  SAVE2:   CMA                   ;DISPLAY CHAR ON LIGHTS
  347.           OUT    0FFH
  348.           CMA
  349.           SHLD   PTR
  350.           LHLD   SIZE           ;SIZE = SIZE + 1
  351.           INX    H
  352.           SHLD   SIZE
  353.           POP    H
  354.           RET
  355.  
  356. ;         WTB - WRITE TEXT BUFFER TO DISK
  357.  
  358.  WTB:     LHLD   SIZE           ;JUMP IF TEXT BUFFER EMPTY
  359.           MOV    A,L
  360.           ORA    H
  361.           JZ     WTB5
  362.           CALL   GFN            ;GET FILE NAME
  363.           JC     WTB6           ;JUMP IF FILE NAME ERROR
  364.           CALL   DELT           ;DELETE OLD FILE, IF ANY
  365.           CALL   MAKE           ;MAKE NEW FILE
  366.           XRA    A              ;REWIND FILE
  367.           STA    FCB+NR
  368.           LHLD   SIZE           ;DE = TBUF SIZE
  369.           XCHG
  370.           LXI    H,DBUF         ;TOP OF STACK POINTS TO DBUF
  371.           PUSH   H
  372.           LXI    H,TBUF         ;HL POINTS TO TBUF
  373.  WTB1:    MVI    C,128          ;DISK BUFFER SIZE
  374.  WTB2:    MOV    A,M            ;FETCH NEXT BYTE OF TBUF
  375.           INX    H
  376.           XTHL
  377.           MOV    M,A            ;STORE IN DBUF
  378.           INX    H
  379.           XTHL
  380.           DCX    D              ;SIZE = SIZE - 1
  381.           MOV    A,D            ;EXIT LOOP IF SIZE = 0
  382.           ORA    E
  383.           JZ     WTB3
  384.           DCR    C              ;LOOP UNTIL DBUF FULL
  385.           JNZ    WTB2
  386.           CALL   WRITE          ;WRITE FULL DBUF TO DISK
  387.           XTHL                  ;TOP OF STACK POINTS TO DBUF
  388.           LXI    H,DBUF
  389.           XTHL
  390.           JMP    WTB1           ;LOOP UNTIL END OF TBUF
  391.  WTB3:    POP    H              ;HL POINTS TO CURRENT PLACE IN DBUF
  392.  WTB4:    MVI    M,'Z'-100Q     ;STORE EOF CODE
  393.           INX    H
  394.           DCR    C              ;LOOP THRU REST OF DBUF
  395.           JNZ    WTB4
  396.           CALL   WRITE          ;WRITE LAST SECTOR TO DISK
  397.           CALL   CLOSE          ;CLEAN UP ACT AND GO HOME
  398.           MVI    A,BEL          ;RING BELL TO LET CLONE
  399.           CALL   WCC            ;  KNOW WE'RE THROUGH
  400.           RET
  401.  WTB5:    LXI    H,WTBS1        ;PRINT 'TEXT BUFFER EMPTY'
  402.           CALL   WCS
  403.           RET
  404.  WTB6:    LXI    H,WTBS2        ;PRINT 'FILE NAME ERROR'
  405.           CALL   WCS
  406.           RET
  407.  
  408.  WTBS1:   DB     'TEXT BUFFER EMPTY',CR,LF,0
  409.  WTBS2:   DB     'FILE NAME ERROR',CR,LF,0
  410.  
  411. ;         WCS - WRITE CONSOLE STRING
  412.  
  413. ;
  414. ;         ENTRY CONDITIONS
  415. ;           ?'#ƒÇƒ $!ƒ ƒ    $!0ƒç0     ƒ9ƒ0     ƒ90äα߃α߃8üƒƒƒƒƒ  ƒƒƒƒ<â α߃ƒƒƒƒƒƒƒƒƒ$!ƒƒƒƒ'α߃ƒƒƒƒƒƒƒƒƒ     <ƒƒƒƒ<α߃ƒƒƒƒƒƒƒƒƒ    α߃ƒƒƒƒƒƒƒƒƒ8<##ƒƒƒ88α߃ƒƒƒƒƒƒƒƒƒ! ƒƒƒƒ8α߃αßǃƒƒƒƒƒƒƒƒ88    ƒÇƒ    $0ƒ8 ! #0ƒ8<        $<00ƒ    0    !ƒç<!3ƒ#$!0ƒ1003äα߃α߃88    üƒƒƒƒ $ƒƒƒƒ<â8    α߃ƒƒƒƒƒƒƒƒƒ8<##ƒƒƒ88α߃ƒƒƒƒƒƒƒƒƒ $ƒƒƒƒ<â#1α߃αßǃƒƒƒƒƒƒƒƒ88ƒÇƒ    $0ƒ8 ! #0ƒ8'<    <80    αßÇαßǃƒƒƒƒƒƒƒƒ0!    ƒ8 !3$$ !üαßǃƒƒƒƒƒƒƒƒƒƒƒ<ƒÇƒ8'<    <80    ƒ ƒ    $0α߃α߃88üƒƒƒƒƒ'ƒƒƒSW
  416.           IN     CONS
  417.           ANI    CTBE
  418.           JZ     $-4
  419.           POP    PSW
  420.           OUT    COND
  421.           RET
  422.  
  423. ;         RCS - READ CONSOLE STRING (WITH ECHO)
  424. ;
  425. ;         EXIT CONDITIONS
  426. ;            B - NUMBER OF CHARACTERS READ (<255)
  427. ;            HL - POINTS TO LAST CHAR STORED (CR)
  428.  
  429.  RCS:     LXI    H,IBUF
  430.           MVI    B,0
  431.  RCS1:    CALL   RCC            ;READ NEXT CHAR FROM CONSOLE
  432.           CPI    DEL            ;JUMP IF NOT DEL
  433.           JNZ    RCS2
  434.           INR    B              ;IGNORE DEL IF IBUF ALREADY EMPTY
  435.           DCR    B
  436.           JZ     RCS1
  437.           DCX    H              ;ELSE DISCARD LAST CHAR
  438.           MOV    A,M            ;ECHO DISCARDED CHAR TO CONSOLE
  439.           CALL   WCC
  440.           DCR    B              ;DECREMENT COUNT
  441.           JMP    RCS1           ;  AND LOOP
  442.  RCS2:    CPI    'U'-100Q       ;JUMP IF NOT CONTROL-U
  443.           JNZ    RCS3
  444.           CALL   WCCR           ;ELSE ABORT CURRENT LINE
  445.           JMP    RCS            ;  AND START OVER
  446.  RCS3:    CALL   WCC            ;ECHO CHAR TO CONSOLE
  447.           MOV    M,A            ;STORE CHAR IN IBUF
  448.           INR    B              ;INCREMENT COUNT
  449.           CPI    CR             ;JUMP IF CARRIAGE RETURN
  450.           JZ     RCS4
  451.           INX    H              ;ELSE ADVANCE POINTER
  452.           JMP    RCS1           ;  AND LOOP
  453.  RCS4:    MVI    A,LF           ;ISSUE LINE FEED AND RETURN
  454.           CALL   WCC
  455.           RET
  456.  
  457. ;         RCC - READ CONSOLE CHARACTER
  458. ;
  459. ;         EXIT CONDITIONS
  460. ;            A - CHARACTER READ
  461.  
  462.  RCC:     IN     CONS
  463.           ANI    CRDA
  464.           JZ     $-4
  465.           IN     COND
  466.           ANI    177Q
  467.           RET
  468.  
  469. ;         WMC - WRITE MODEM CHARACTER
  470. ;
  471. ;         ENTRY CONDITIONS
  472. ;            A - CHARACTER TO WRITE
  473.  
  474.  WMC:     PUSH   PSW
  475.           IN     MODS
  476.           ANI    MTBE
  477.           JZ     $-4
  478.           POP    PSW
  479.           OUT    MODD
  480.           RET
  481.  
  482. ;         RMC - READ MODEM CHARACTER
  483. ;
  484. ;         EXIT CONDITIONS:
  485. ;            A - CHARACTER READ
  486.  
  487.  RMC:     IN     MODS
  488.           ANI    MRDA
  489.           JZ     $-4
  490.           IN     MODD
  491.           ANI    177Q
  492.           RET
  493.  
  494. ;         GFN - GET FILE NAME
  495.  
  496.  GFN:     CALL   WCCR
  497.           LXI    H,GFNS1        ;PRINT 'FILENAME? '
  498.           CALL   WCS
  499.           CALL   RCS            ;READ RESPONSE INTO IBUF
  500.           LXI    H,FCB+FN       ;BLANK FILL FN AND FT FIELDS
  501.           MVI    C,11
  502.  GFN1:    MVI    M,' '
  503.           INX    H
  504.           DCR    C
  505.           JNZ    GFN1
  506.           LXI    H,IBUF         ;POINT TO INPUT BUFFER
  507.           LXI    D,FCB+FN       ;SCAN OFF FN FIELD
  508.           MVI    C,9
  509.  GFN2:    MOV    A,M            ;FETCH NEXT CHAR FROM IBUF
  510.           INX    H
  511.           CPI    141Q           ;IF LC, CONVERT TO UC
  512.           JC     $+5
  513.           SUI    40Q
  514.           CPI    CR             ;JUMP IF END OF LINE
  515.           JZ     GFN5
  516.           CPI    '.'            ;JUMP IF END OF NAME
  517.           JZ     GFN3
  518.           STAX   D              ;ELSE STORE CHAR IN FN FIELD
  519.           INX    D
  520.           DCR    C              ;LOOP IF 8 OR LESS CHARS SO FAR
  521.           JNZ    GFN2
  522.           JMP    GFN6           ;ELSE TAKE ERROR EXIT
  523.  GFN3:    LXI    D,FCB+FT       ;SCAN OFF FT FIELD
  524.           MVI    C,4
  525.  GFN4:    MOV    A,M            ;FETCH NEXT CHAR FROM IBUF
  526.           INX    H
  527.           CPI    141Q           ;IF LC, CONVERT TO UC
  528.           JC     $+5
  529.           SUI    40Q
  530.           CPI    CR             ;JUMP IF END OF LINE
  531.           JZ     GFN5
  532.           STAX   D              ;ELSE STORE CHAR IN FT FIELD
  533.           INX    D
  534.           DCR    C              ;LOOP IF 3 OR LESS CHARS SO FAR
  535.           JNZ    GFN4
  536.           JMP    GFN6           ;ELSE TAKE ERROR EXIT
  537.  GFN5:    STC                   ;CLEAR ERROR FLAG AND RETURN
  538.           CMC
  539.           RET
  540.  GFN6:    STC                   ;SET ERROR FLAG AND RETURN
  541.           RET
  542.  
  543.  GFNS1:   DB     'FILENAME? ',0
  544.  
  545. ;         OPEN - OPEN DISK FILE
  546.  
  547.  OPEN:    PUSH   H
  548.           PUSH   D
  549.           PUSH   B
  550.           LXI    D,FCB
  551.           MVI    C,OFFC
  552.           CALL   BDOS
  553.           POP    B
  554.           POP    D
  555.           POP    H
  556.           RET
  557.  
  558. ;         READ - READ RECORD FROM DISK FILE
  559.  
  560.  READ:    PUSH   H
  561.           PUSH   D
  562.           PUSH   B
  563.           LXI    D,FCB
  564.           MVI    C,RRFC
  565.           CALL   BDOS
  566.           POP    B
  567.           POP    D
  568.           POP    H
  569.           RET
  570.  
  571. ;         CLOSE - CLOSE DISK FILE
  572.  
  573.  CLOSE:   PUSH   H
  574.           PUSH   D
  575.           PUSH   B
  576.           LXI    D,FCB
  577.           MVI    C,CFFC
  578.           CALL   BDOS
  579.           POP    B
  580.           POP    D
  581.           POP    H
  582.           RET
  583.  
  584. ;         DELT - DELETE DISK FILE
  585.  
  586.  DELT:    PUSH   H
  587.           PUSH   D
  588.           PUSH   B
  589.           LXI    D,FCB
  590.           MVI    C,DFFC
  591.           CALL   BDOS
  592.           POP    B
  593.           POP    D
  594.           POP    H
  595.           RET
  596.  
  597. ;         WRITE - WRITE RECORD TO DISK
  598.  
  599.  WRITE:   PUSH   H
  600.           PUSH   D
  601.           PUSH   B
  602.           LXI    D,FCB
  603.           MVI    C,WRFC
  604.           CALL   BDOS
  605.           POP    B
  606.           POP    D
  607.           POP    H
  608.           RET
  609.  
  610. ;         MAKE - MAKE NEW DISK FILE
  611.  
  612.  MAKE:    PUSH   H
  613.           PUSH   D
  614.           PUSH   B
  615.           LXI    D,FCB
  616.           MVI    C,MFFC
  617.           CALL   BDOS
  618.           POP    B
  619.           POP    D
  620.           POP    H
  621.           RET
  622.  
  623. ;         DATA AREA
  624.  
  625.  MCB:     DS     1              ;MODEM CONTROL BYTE
  626.  
  627.  INCH:    DS     1              ;INPUT CHAR BUFFER (TO CYBER)
  628.  OUTCH:   DS     1              ;OUTPUT CHAR BUFFER (FROM CYBER)
  629.  
  630.  OLDSP:   DS     2              ;OLD STACK POINTER
  631.  STACK:   DS     64             ;LOCAL STACK
  632.  
  633.  IBUF:    DS     256            ;INPUT BUFFER
  634.  
  635. ;         TEXT BUFFER
  636.  
  637.  FLAG:    DS     1              ;TEXT SAVE FLAG
  638.  PTR:     DS     2              ;TEXT BUFFER POINTER
  639.  SIZE:    DS     2              ;TEXT BUFFER SIZE
  640.  TBUF     EQU    $              ;START OF TEXT BUFFER
  641.  
  642.  NUM      EQU    TBUF           ;TEMPORARY BUFFER FOR PHONE NUMBER
  643.  
  644.           END    LINK
  645. 
  646.           STA    INCH
  647.           STA    OUTCH
  648.           STA    FLAG           ;CLEAR TEXT SAVE FLAG
  649.           LXI    H,TBUF