home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol007 / plink925.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  20.1 KB  |  1,001 lines

  1. ;            PLINK.ASM
  2. ;         (latest version SEPT 25 1980)
  3. ;
  4. ;     PLINK - SUPPORT COMMUNICATIONS LINK WITH CYBER
  5. ;
  6. ;PLINK IS A CP/M TRANSIENT COMMAND WHICH ALLOWS THE USER TO
  7. ;ESTABLISH A COMMUNICATIONS LINK WITH A REMOTE COMPUTER
  8. ;
  9. ;    ORIGINAL BY L.E. HUGHES    EDCAM    JULY, 1977
  10. ;
  11. ;       This version by Keith Petersen, W8SDZ.
  12. ;       WITH HEATH EQUATES ADDED BY TOM JORGENSON
  13. ;
  14. ; TRS-80 MODEL 1 mods by Steve Vinokuroff, Vanc CBBS
  15. ; Optional Triger characters by Steve Vinokuroff
  16. ; TRS-80 mods by Dennis Breckenridge, Burnaby CBBS
  17. ; D.C.Hayes mods by Bruce Ratoff, Iselin NJ Remote CP/M
  18. ;
  19. ;This program currently supports the following modems
  20. ; or computers via conditional assembly.
  21. ;
  22. ;    1. PMMI   modem
  23. ;    2. ANY serial i/o board (TUART INCLUDED)
  24. ;    3. TRS-80 model 1
  25. ;    4. TRS-80 model 2
  26. ;    5. HEATH H8 WITH 8251 UART AT PORT 330Q
  27. ;    6. D.C.Hayes 80-103A or Micromodem 100
  28. ;
  29. ;
  30. ;-->NOTE: IF ASSEMBLED AS WRITTEN WILL WORK WITH D.C.Hayes 80-103A
  31. ;      OR MICROMODEM 100 AT PORT 90H
  32. ;
  33. ;PLINK CURRENTLY SUPPORTS TWO WAY TRANSFER OF TEXT FILES
  34. ;BETWEEN THE CP/M DISK AND THE REMOTE COMPUTER. THE FOLLOWING
  35. ;CONTROL CODES MAY BE INITIATED FROM THE CONSOLE KEYBOARD:
  36. ;
  37. ;    ****************************************************
  38. ;    *              COMMANDS:                  *
  39. ;    *                           *
  40. ;    *  CONTROL E    EXIT PLINK TO CP/M WARM BOOT       *
  41. ;    *  CONTROL T    TRANSMIT ASCII FILE TO MODEM.      *
  42. ;    *        ASKS FOR DRIVE AND FILENAME.TYP    *
  43. ;    *  CONTROL C    ABORT FILE SEND TO MODEM       *
  44. ;    *  CONTROL Y    SAVE INCOMING ASCII IN RAM BUFFER  *
  45. ;    *        FOR LATER TRANSFER TO DISK       *
  46. ;    *  CONTROL Q    WRITE RAM BUFFER TO DISK - ASKS    *
  47. ;    *        FOR DRIVE AND FILENAME.TYP       *
  48. ;    *  DELETE    BACKSPACE WHEN IN COMMAND MODE       *
  49. ;    *        ASKING FOR FILENAME           *
  50. ;    *  CONTROL U    ABORT CURRENT LINE WHEN IN COMMAND *
  51. ;    *        MODE ASKING FOR FILENAME       *
  52. ;    *                           *
  53. ;    *  (NOTE: ALL OTHER CONTROL CODES ARE PASSED TO    *
  54. ;    *      MODEM OUTPUT)                   *
  55. ;    ****************************************************
  56. ;
  57. ;
  58. ;CONDITIONAL ASSEMBLY SWITCHES <<-- SET FOR YOUR SYSTEM
  59. ;
  60. TUART    SET    0    ;CROMEMCO TUART I/O BOARD
  61. PMMI    EQU    0    ;PUT A 1 HERE IF YOU HAVE A PMMI
  62. DCH    EQU    1    ;PUT A 1 HERE IF YOU HAVE A D.C.HAYES
  63. TRS1    EQU    0    ;PUT A 1 HERE IF YOU HAVE TRS80-MOD1
  64. TRSPT    EQU    0    ;PUT 1 HERE IF YOU HAVE TRS80-MOD2
  65.             ;USING PICKLES & TROUT CP/M 2.X
  66. H84    EQU    0    ;PUT 1 HERE IF YOU HAVE H8/H8-4
  67.     IF    H84
  68. TUART    SET    1
  69.     ENDIF
  70. ;
  71. INIT$REQUIRED    EQU    1 ;PUT 1 HERE IF INITIALIZATION NEEDED
  72. ;
  73.     IF    TRS1 OR PMMI OR TUART OR DCH
  74. PORT    EQU    1
  75.     ENDIF
  76. ;
  77.     IF    TRSPT
  78. PORT    EQU    0    ;STILL NEED THE SWITCH
  79.     ENDIF
  80. ;
  81. ;
  82. ;
  83. ;BDOS ENTRY POINT AND FUNCTION CODES
  84. ;
  85.     IF    NOT    TRS1
  86. BASE    SET    0    ;STANDARD CPM
  87.     ENDIF
  88. ;
  89.     IF    TRS1 OR H84
  90. BASE    SET    4200H    ;TRS-80 MODEL 1 CP/M BASE ADDRESS
  91.     ENDIF
  92. ;
  93. BDOS    EQU    BASE+5
  94. RESDSK    EQU    13    ;RESET DISK SYSTEM
  95. OFFC    EQU    15    ;OPEN FILE
  96. CFFC    EQU    16    ;CLOSE FILE 
  97. DFFC    EQU    19    ;DELETE FILE
  98. RRFC    EQU    20    ;READ RECORD
  99. WRFC    EQU    21    ;WRITE RECORD 
  100. MFFC    EQU    22    ;MAKE FILE
  101. ;
  102. ;    TRS80 PICKLES AND TROUT SIO CALLS
  103. ;    OFFSET BY -3 THAT IS ADD 3 TO ALL CALLS
  104. ;
  105. SETSIO    EQU    30H    ;SET UP Z80 SIO
  106. SIOTST    EQU    33H    ;READ SIO STATUS
  107. SIOINP    EQU    36H    ;INPUT A CHAR
  108. SIOOUT    EQU    39H    ;OUTPUT A CHAR
  109. ;
  110. ;DEFAULT FCB AND FIELD DEFINITIONS 
  111. ;
  112. FCB    EQU    BASE+5CH
  113. FN    EQU    1    ;FILE NAME FIELD (REL)
  114. FT    EQU    9    ;FILE TYPE FIELD (REL)
  115. EX    EQU    12    ;FILE EXTENT FIELD (REL)
  116. NR    EQU    32    ;NEXT RECORD FIELD (REL)
  117. DBUF    EQU    BASE+80H ;DEFAULT DISK BUFFER ADDRESS
  118. ;
  119. ;ASCII CONTROL CHARACTERS
  120. ;
  121. CR    EQU    0DH    ;CARRIAGE RETURN
  122. LF    EQU    0AH    ;LINE FEED
  123. DEL    EQU    7FH    ;DELETE (RUBOUT)
  124. BELL    EQU    07H    ;BELL SIGNAL
  125. TAB    EQU    09H    ;HORIZONTAL TAB
  126. XON    EQU    11H    ;X-ON CHARACTER
  127. NULL    EQU    00H    ;NULL CHAR
  128. ;
  129. ;THE FOLLOWING "TRIGER" EQUATE IS SET TO "LF" (LINEFEED)
  130. ;BY DEFAULT. AN OPTIONAL TRIGER CHAR MAY BE PASSED VIA FCB1
  131. ;
  132. ; IE:  PLINK B        WILL SET TRIGER TO "BELL"
  133. ;
  134. ;THE FOLLOWING OPTIONS ARE ALLOWED
  135. ;
  136. ;    1. B = BELL  07H
  137. ;    2. X = XON   11H
  138. ;    3. U = UPLOAD NO TRIGER CHECK AT ALL
  139. ;ANY OTHER ASCII CHARACTER MAY BE PASSED THROUGH FCB1
  140. ;
  141. ;
  142. TRIGER    EQU    LF    ;DEFAULT VALUE
  143. ;
  144. ;
  145. ;WARNING CHARACTER FOR LOW MEMORY
  146. ;
  147. WRNSIG    EQU    BELL    ;IF YOU HAVE ONE, PUT 'BELL' HERE
  148.             ;...ELSE PUT '*' HERE.
  149. ;
  150. ;MODEM I/O PORT ADDRESSES
  151. ;
  152.     IF    PMMI
  153. MODD    EQU    0C1H    ;MODEM DATA PORT
  154. MODS    EQU    0C0H    ;MODEM STATUS PORT
  155. MODINIT    EQU    29H    ;INITIALIZE BYTE ORIGINATE,
  156.             ;7 DATA, EVEN PARITY, 1 STOP
  157.     ENDIF
  158. ;
  159.     IF    DCH
  160. MODD    EQU    90H    ;MODEM DATA PORT
  161. MODS    EQU    91H    ;MODEM STATUS PORT
  162. MODINIT    EQU    05H    ;7 DATA, EVEN PARITY, 1 STOP
  163.     ENDIF
  164. ;
  165.     IF    TRS1
  166. MODD    EQU    0EBH    ;TRS80 MOD 1 RS232 DATA PORT
  167. MODS    EQU    0EAH    ; AND THE RS232 STATUS PORT
  168.     ENDIF
  169. ;
  170.     IF    TUART
  171. MODD    EQU    0D8H    ;<<--MODIFY FOR YOURS
  172. MODS    EQU    0DDH    ;<<--MODIFY FOR YOURS
  173.     ENDIF
  174. ;
  175. ;MODEM STATUS PORT BIT DEFINITIONS
  176. ;
  177.     IF    PMMI
  178. MTBE    EQU    01H    ;MODEM TRANS. BUFFER READY FLAG
  179. MRDA    EQU    02H    ;MODEM RECEIVE DATA AVAIL. FLAG
  180.     ENDIF
  181. ;
  182.     IF    DCH
  183. MTBE    EQU    02H    ;MODEM TRANS. BUFFER READY FLAG
  184. MRDA    EQU    01H    ;MODEM RECEIVE DATA AVAIL. FLAG
  185.     ENDIF
  186. ;
  187.     IF    TRS1
  188. MTBE    EQU    40H    ;TRS80 MOD1 RS232 BUFFER READY
  189. MRDA    EQU    80H    ;MODEM RECEIVE DATA AVAIL.
  190.     ENDIF
  191. ;
  192.     IF    TUART    ;<<--OR ANY OTHER SERIAL I/O
  193. MTBE    EQU    20H    ;<<--MODIFY FOR YOURS
  194. MRDA    EQU    1H    ;<<--MODIFY FOR YOURS
  195.     ENDIF
  196. ;
  197. ;    **MAIN PROGRAM**
  198. ;
  199.     ORG    BASE+100H
  200. ;
  201. LINK:    LXI    SP,STACK+64    ;CREATE LOCAL STACK 
  202.     LHLD    BASE+1    ;POINT TO CP/M JMP TABLE
  203.     LXI    D,3    ;GET READY TO ADD 3
  204.     DAD    D    ;POINT TO CON STATUS JMP
  205.     SHLD    CITCAL+1 ;MODIFY CALL ADRS
  206.     DAD    D    ;POINT TO CON IN JMP
  207.     SHLD    RCCAL+1    ;MODIFY CALL ADRS
  208.     DAD    D    ;POINT TO CON OUT JMP
  209.     SHLD    WCCAL+1    ;MODIFY CALL ADRS
  210.     LDA    FCB+1    ;SEE IF OPTIONAL TRIGER CHAR
  211.     CPI    20H    ;BLANK.. ?
  212.     JZ    SKP    ;..BLANK SO USE DEFAULT "LF"
  213.     CPI    'B'    ;BELL WANTED
  214.     JZ    TRGBEL
  215.     CPI    'X'    ;XON WANTED
  216.     JZ    TRGXON
  217.     CPI    'U'    ;UPLOADING NO CHECKING FOR TRIGER
  218.     JZ    TRGUPL
  219. ;
  220. SETTRG    STA    OVERLY+1 ;STORE THE CHARACTER AS IS THEN
  221.     JMP    SKP
  222. ;
  223. TRGBEL    MVI    A,BELL
  224.     JMP    SETTRG
  225. ;
  226. TRGXON    MVI    A,XON
  227.     JMP    SETTRG
  228. ;
  229. TRGUPL    XRA    A        ;ZERO OUT JUMP
  230.     STA    OVERL1+1    ;CHANGE CHECK FOR C/R TO NULL
  231.     STA    OVERL2+1    ;AND SEND LINEFEEDS AS WELL
  232.     JMP    SKP
  233. ;
  234. SKP    EQU    $
  235.     IF    H84
  236.     MVI A,80H;    SET DLAB BIT IN 8250 UART
  237.     OUT 0DBH;    8250 AT PORT D8H (330Q)
  238.     NOP ! NOP ! NOP
  239.     NOP ! NOP
  240.     MVI A,01H;    MSB OF BAUD RATE DIVISOR
  241.     OUT 0D9H;    ...TO UART
  242.     NOP ! NOP ! NOP
  243.     NOP ! NOP
  244.     MVI A,80H;    LSB OF BAUD RATE DIVISOR
  245.     OUT 0D8H;    ...TO UART
  246.     NOP ! NOP ! NOP
  247.     NOP ! NOP
  248.     MVI A,03H;    8 BITS, 1 STOP BIT, NO PARITY, DLAB RESET
  249.     OUT 0DBH;    ...TO UART
  250.     NOP ! NOP ! NOP
  251.     NOP ! NOP
  252.     MVI A,0;    RESET CONTROL REGISTER
  253.     OUT 0DCH;    ...TO UART
  254.     JMP    CONT
  255.     ENDIF
  256.     IF    INIT$REQUIRED AND NOT H84 OR PMMI AND NOT H84
  257.     MVI    A,MODINIT
  258.     OUT    MODS    ;INITIALIZE MODEM PORT
  259.     ENDIF
  260. ;
  261.     IF    TUART
  262.     MVI    A,80H    ;DSR ON BIT 7 PARL PORT B
  263.     OUT    54H
  264.     ENDIF
  265. ;
  266.     IF    TRSPT        ;MUST SET UP SERIAL CHANNEL
  267. RESET:    LXI    H,INITR        ;STORE RETURN ADDRESS
  268.     PUSH    H
  269.     LHLD    1
  270.     LXI    D,SETSIO    ;SIO SETUP ROUTINE
  271.     DAD    D
  272.     PUSH    H        ;STORE ON STACK
  273.     MVI    C,00H        ;NO PARITY CHAN-A
  274.     MVI    D,0E6H        ;8 bits ,1 STOP
  275.     MVI    E,3        ;300 BAUD
  276.     MVI    L,00H        ;DISABLE EXT/ACK SIO FUNCTIONS
  277.     MVI    H,'S'-40H    ;CONTROL S (X-ON)
  278.     RET            ;TROUGH SETUP PROG
  279. INITR    NOP            ;DO IT TO IT
  280.     ENDIF
  281. ;
  282.     IF    TRS1        ;INIT FOR TRS80 MOD1 RS232
  283.     OUT    0E8H        ;RESET RS232
  284.     IN    0E9H        ;READ THE SWITCHES
  285.     ANI    0F8H
  286.     ORI    5
  287.     OUT    0EAH        ;SET DSR AND CTS
  288.     MVI    A,55H        ;300 BAUD
  289.     OUT    0E9H
  290.     ENDIF
  291. ;
  292. ;
  293.     IF    PORT
  294.     IN    MODD         ;CLEAR MODEM UART READ BUFFERS
  295.     IN    MODD 
  296.     ENDIF
  297. ;
  298. CONT    XRA    A    ;CLEAR CHAR BUFFERS 
  299.     STA    INCH 
  300.     STA    OUTCH
  301.     STA    FLAG    ;CLEAR TEXT SAVE FLAG 
  302.     LXI    H,TBUF    ;SET PTR TO TBUF
  303.     SHLD    PTR
  304.     LXI    H,0    ;SIZE = 0 
  305.     SHLD    SIZE 
  306.     LXI    H,LINKMS  ;PRINT SIGN-ON MESSAGE
  307.     CALL    WCS
  308. ;
  309. ;     MAIN LOOP 
  310. ;
  311. LINK3:    CALL    CITEST    ;JUMP IF NO DATA FROM CONSOLE 
  312.     JZ    LINK4
  313.     CALL    RCC    ;ELSE READ CONSOLE DATA
  314.     CPI    20H
  315.     CC    PCC    ;CALL PCC IF CONTROL CHAR
  316.     JC    LINK4    ;JUMP IF PCC HANDLED CHAR 
  317.     ORI    80H    ;ELSE SET VALID DATA BIT
  318.     STA    INCH    ;AND STORE IN INPUT CHAR BUFFER 
  319. LINK4:    LDA    OUTCH    ;JUMP IF NO DATA FOR CONSOLE
  320.     ORA    A
  321.     JP    LINK5
  322.     ANI    7FH    ;ELSE DISCARD VALID DATA BIT
  323.     CALL    WCC    ;SEND CHAR TO CONSOLE 
  324.     XRA    A    ;THEN CLEAR OUTPUT CHAR BUFFER
  325.     STA    OUTCH
  326. LINK5:    CALL    MITEST    ;JUMP IF NO DATA FROM MODEM 
  327.     JZ    LINK6
  328.     CALL    RMC2    ;ELSE READ MODEM DATA
  329.     CALL    SAVE    ;SAVE CHAR IN TEXT BUFFER IF FLAG ON
  330.     ORI    80H    ;SET DATA VALID BIT 
  331.     STA    OUTCH    ;STORE IN OUTPUT CHAR BUFFER
  332. LINK6:    CALL    MOTEST    ;JUMP IF MODEM XMIT BUFFER BUSY 
  333.     JZ    LINK7
  334.     LDA    INCH    ;JUMP IF NO DATA FOR MODEM
  335.     ORA    A
  336.     JP    LINK7
  337.     ANI    7FH    ;DISCARD VALID DATA BIT
  338. ;
  339.     IF    PORT
  340.     OUT    MODD    ;OUTPUT CHAR TO MODEM 
  341.     ENDIF
  342. ;
  343.     IF    TRSPT
  344.     PUSH    B    ;STORE REGISTERS
  345.     PUSH    H
  346.     PUSH    D
  347.     CALL    WMC    ;SEND CHAR
  348.     POP    D
  349.     POP    H
  350.     POP    B
  351.     ENDIF
  352. ;
  353.     XRA    A    ;...THEN CLEAR INPUT CHAR BUFFER 
  354.     STA    INCH 
  355. LINK7:    JMP    LINK3    ;END OF MAIN LOOP 
  356. ;
  357. LINKMS:    DB    CR,LF,'PLINK as of 25-SEP-80'
  358.     DB    CR,LF,LF,'READY',CR,LF,LF,0
  359. ;
  360. ;     PCC - PROCESS CONTROL CHARACTER 
  361. ;
  362. PCC:    CPI    'E'-40H    ;JUMP OUT IF CTRL E
  363.     JNZ    PCC1 
  364.     PUSH    H
  365.     LXI    H,AYS    ;PRINT 'ARE YOU SURE'
  366.     CALL    WCS
  367.     POP    H
  368.     CALL    RCC    ;GET ANSWER
  369.     CALL    WCC    ;ECHO IT
  370.     ANI    5FH    ;MAKE UPPER CASE
  371.     CPI    'Y'    ;YES?
  372.     JZ    PCCEX    ;EXIT
  373.     CALL    WCCR    ;CRLF
  374.     STC        ;TELL LINK TO IGNORE THIS CHARACTER 
  375. ;
  376.     IF    TRSPT
  377.     POP    PSW    ;GOBBLE UP CALL ADDRESS
  378.     JMP    RESET    ;RE-INITIALIZE SIO
  379.     ENDIF
  380. ;
  381.     IF    PORT
  382.     RET
  383.     ENDIF
  384. ;
  385. PCC1:    CPI    'T'-40H    ;JUMP IF NOT CONTROL-T
  386.     JNZ    PCC2 
  387.     CALL    STF    ;TRANSMIT TEXT FILE TO MODEM
  388.     STC        ;TELL LINK TO IGNORE THIS CHARACTER 
  389.     RET 
  390. ;
  391. PCC2:    CPI    'Y'-40H    ;JUMP IF NOT CONTROL-Y
  392.     JNZ    PCC3 
  393.     MVI    A,1    ;TURN ON TEXT SAVE FLAG 
  394.     STA    FLAG 
  395.     LXI    H,PCCMR    ;PRINT 'SAVING INCOMING TEXT IN MEMORY'
  396.     CALL    WCS
  397.     STC        ;TELL LINK TO IGNORE THIS CHARACTER
  398.     RET 
  399. ;
  400. PCC3:    CPI    'Q'-40H    ;JUMP IF NOT CONTROL-Q
  401.     JNZ    PCC4 
  402.     XRA    A    ;TURN OFF TEXT SAVE FLAG
  403.     STA    FLAG 
  404.     CALL    WTB    ;WRITE TEXT BUFFER TO DISK
  405.     STC 
  406.     RET 
  407. ;
  408. PCC4:    STC        ;LET LINK HANDLE ALL OTHER CONT. CODES
  409.     CMC 
  410.     RET 
  411. ;
  412. PCCEX:    LXI    H,DISMS    ;PRINT 'MODEM NOT DISCONNECTED'
  413.     CALL    WCS
  414.     JMP    BASE    ;EXIT TO WARM BOOT
  415. ;
  416. AYS:    DB    CR,LF,'EXIT TO CP/M - ARE YOU SURE (Y OR N)?',0
  417.     IF    PMMI OR DCH
  418. DISMS:    DB    CR,LF,'++DON''T FORGET - THE MODEM '
  419.     DB    'IS NOT DISCONNECTED++',CR,LF
  420.     DB    'USE "MODEM D" TO DISCONNECT',0
  421.     ENDIF
  422. ;
  423.     IF    NOT PMMI AND NOT DCH
  424. DISMS:    DB    CR,LF,'+++ EXIT TO CP/M +++',CR,LF,0
  425.     ENDIF
  426. ;
  427. PCCMR:    DB    CR,LF,'SAVING INCOMING TEXT IN MEMORY',CR,LF,0
  428. ;
  429. ;     STF - SEND TEXT FILE (TO MODEM) 
  430. ;
  431. STF:    CALL    GFN    ;GET NAME OF DISK FILE TO SEND
  432.     JC    STF6    ;JUMP IF FILE NAME ERROR
  433.     CALL    OPEN    ;TRY TO OPEN SPECIFIED FILE 
  434.     CPI    255    ;JUMP IF FILE NOT FOUND 
  435.     JZ    STF7 
  436. STF1:    CALL    READ    ;READ NEXT RECORD INTO DBUF 
  437.     CPI    1    ;JUMP IF END-OF-FILE
  438.     JZ    STF5 
  439.     LXI    H,DBUF     ;POINT TO DISK BUFFER 
  440.     MVI    C,128
  441. STF2:    MOV    A,M    ;FETCH NEXT CHAR FROM DBUF
  442.     INX    H
  443.     CPI    'Z'-40H    ;JUMP IF END-OF-FILE CHARACTER
  444.     JZ    STF5 
  445. OVERL2    CPI    LF    ;IGNORE LINE FEEDS
  446.     JZ    STF4 
  447.     CALL    WMC    ;WRITE CHARACTER TO MODEM 
  448.     CALL    WCC    ;WRITE CHARACTER TO CONSOLE 
  449. OVERL1    CPI    CR    ;JUMP IF NOT CARRIAGE RETURN
  450.     JNZ    STF4 
  451. STF3:    CALL    CITEST    ;CHECK CONSOLE DATA READY
  452.     JZ    STF3A    ;NO DATA THERE
  453.     CALL    RCC    ;GET CONSOLE CHARACTER
  454.     CPI    'C'-40H    ;CONTROL C ABORTS IT
  455.     JZ    STF8
  456. STF3A:    CALL    MITEST    ;WAIT FOR NEXT MODEM KHARACTER
  457.     JZ    STF3
  458.     CALL    RMC2    ;CHECK MODEM FOR TRIGGER CHAR.
  459. OVERLY    CPI    TRIGER
  460.     JNZ    STF3 
  461.     CALL    WCCR    ;SEND CRLF TO CONSOLE
  462. STF4:    DCR    C    ;LOOP THRU REST OF DBUF 
  463.     JNZ    STF2 
  464.     JMP    STF1    ;GO GET NEXT RECORD FROM DISK 
  465. ;
  466. STF5:    LXI    H,STFSM    ;PRINT 'FILE SEND COMPLETE'
  467.     CALL    WCS
  468.     RET 
  469. ;
  470. STF6:    LXI    H,STFS1    ;PRINT 'FILE NAME ERROR'
  471.     CALL    WCS
  472.     RET 
  473. ;
  474. STF7:    LXI    H,STFS2    ;PRINT 'FILE NOT FOUND' 
  475.     CALL    WCS
  476.     RET 
  477. ;
  478. STF8:    LXI    H,STFSA    ;PRINT 'FILE SEND ABORTED'
  479.     CALL    WCS
  480.     RET
  481. ;
  482. STFSM:    DB    'FILE SEND COMPLETE',CR,LF,0
  483. STFS1:    DB    'FILE NAME ERROR',CR,LF,0
  484. STFS2:    DB    'FILE NOT FOUND',CR,LF,0 
  485. STFSA:    DB    CR,LF,'FILE SEND ABORTED',CR,LF,0
  486. ;
  487. ;     SAVE - SAVE CHAR IN TEXT BUFFER IF FLAG ON
  488. ;     ENTRY CONDITIONS
  489. ;        A - CHARACTER TO SAVE
  490. ;
  491. SAVE:    PUSH    PSW
  492.     LDA    FLAG 
  493.     ORA    A
  494.     JNZ    SAVE1
  495.     POP    PSW
  496.     RET 
  497. ;
  498. SAVE1:    POP    PSW
  499.     CPI    DEL    ;RUBOUT (DEL) ?
  500.     RZ        ;YES, IGNORE IT
  501.     CPI    20H    ;TEST FOR CONTROL CHARACTERS
  502.     JNC    SAVE2    ;JUMP IF NOT CONTROL CHAR.
  503.     CPI    CR    ;ALLOW CR TO BE SAVED
  504.     JZ    SAVE2
  505.     CPI    LF    ;ALLOW LF TO BE SAVED
  506.     JZ    SAVE2
  507.     CPI    TAB    ;ALLOW TAB TO BE SAVED
  508.     JZ    SAVE2
  509.     RET        ;IGNORE ALL OTHER CONTROL CHARS.
  510. ;
  511. SAVE2:    PUSH    H
  512.     LHLD    SIZE    ;SIZE = SIZE + 1
  513.     INX    H
  514.     SHLD    SIZE 
  515.     LHLD    PTR
  516.     MOV    M,A
  517.     INX    H
  518.     SHLD    PTR
  519.     PUSH    PSW
  520.     LDA    BASE+7    ;GET SYSTEM SIZE
  521.     SUI    1    ;SO WE DONT CRASH CP/M
  522.     CMP    H    ;ARE WE OUT OF ROOM?
  523.     JZ    SAVEAB    ;YES, ABORT
  524.     SUI    4    ;LEAVE SOME ROOM (1K)
  525.     CMP    H
  526.     MVI    A,WRNSIG  ;SIGNAL CONSOLE RUNNING OUT OF SPACE
  527.     CC    WCC
  528.     POP    PSW
  529.     POP    H
  530.     RET 
  531. ;
  532. ;    SAVEAB - RAN OUT OF ROOM, ISSUE MESSAGE AND FLOW
  533. ;         THROUGH TO DISK SAVE ROUTINE
  534. ;
  535. SAVEND:    DB    BELL,CR,LF,'ABORTING - NO ROOM LEFT',0
  536. ;
  537. SAVEAB:    LXI    SP,STACK+64  ;REINITIALIZE STACK
  538.     LXI    H,SAVEND  ;PRINT 'ABORTING - NO ROOM LEFT'
  539.     CALL    WCS
  540.     LXI    H,LINK    ;SET UP RETURN ADDRESS
  541.     PUSH    H    ;LEAVE IT ON THE STACK
  542. ;
  543. ;     WTB - WRITE TEXT BUFFER TO DISK 
  544. ;
  545. WTB:    LHLD    SIZE    ;JUMP IF TEXT BUFFER EMPTY
  546.     MOV    A,L
  547.     ORA    H
  548.     JZ    WTB5 
  549.     MVI    C,RESDSK ;RESET IN CASE READ-ONLY
  550.     CALL    BDOS
  551.     CALL    GFN    ;GET FILE NAME
  552.     JC    WTB6    ;JUMP IF FILE NAME ERROR
  553.     CALL    DELT    ;DELETE OLD FILE, IF ANY
  554.     CALL    MAKE    ;MAKE NEW FILE
  555.     LHLD    SIZE    ;DE = TBUF SIZE 
  556.     XCHG
  557.     LXI    H,DBUF    ;TOP OF STACK POINTS TO DBUF
  558.     PUSH    H
  559.     LXI    H,TBUF    ;HL POINTS TO TBUF
  560. WTB1:    MVI    C,128    ;DISK BUFFER SIZE 
  561. WTB2:    MOV    A,M    ;FETCH NEXT BYTE OF TBUF
  562.     INX    H
  563.     XTHL
  564.     MOV    M,A    ;STORE IN DBUF
  565.     INX    H
  566.     XTHL
  567.     DCX    D    ;SIZE = SIZE - 1
  568.     MOV    A,D    ;EXIT LOOP IF SIZE = 0
  569.     ORA    E
  570.     JZ    WTB3 
  571.     DCR    C    ;LOOP UNTIL DBUF FULL 
  572.     JNZ    WTB2 
  573.     CALL    WRITE    ;WRITE FULL DBUF TO DISK
  574.     XTHL        ;TOP OF STACK POINTS TO DBUF
  575.     LXI    H,DBUF 
  576.     XTHL
  577.     JMP    WTB1    ;LOOP UNTIL END OF TBUF 
  578. ;
  579. WTB3:    POP    H    ;HL POINTS TO CURRENT PLACE IN DBUF 
  580. WTB4:    MVI    M,'Z'-40H ;STORE EOF CODE 
  581.     INX    H
  582.     DCR    C    ;LOOP THRU REST OF DBUF 
  583.     JNZ    WTB4 
  584.     CALL    WRITE    ;WRITE LAST SECTOR TO DISK
  585.     CALL    CLOSE    ;CLEAN UP ACT AND GO HOME 
  586.     LXI    H,TBUF    ;CLEAR TEXT BUFFER
  587.     SHLD    PTR
  588.     LXI    H,0
  589.     SHLD    SIZE 
  590.     LXI    H,WTBSM    ;PRINT 'BUFFER SAVED ON DISK'
  591.     CALL    WCS
  592.     RET 
  593. ;
  594. WTB5:    LXI    H,WTBS1    ;PRINT 'TEXT BUFFER EMPTY'
  595.     CALL    WCS
  596.     RET 
  597. ;
  598. WTB6:    LXI    H,WTBS2    ;PRINT 'FILE NAME ERROR'
  599.     CALL    WCS
  600.     RET 
  601. ;
  602. WTBSM:    DB    CR,LF,'BUFFER SAVED ON DISK',CR,LF
  603.     DB    'MEMORY SAVE CANCELLED',CR,LF,0
  604. WTBS1:    DB    'TEXT BUFFER EMPTY',CR,LF,0
  605. WTBS2:    DB    'FILE NAME ERROR',CR,LF,0
  606. ;
  607. ;     WCS - WRITE CONSOLE STRING
  608. ;
  609. ;     ENTRY CONDITIONS
  610. ;        HL - POINTS TO STRING (TERM BY ZERO BYTE)
  611. ;
  612. WCS:    MOV    A,M
  613.     INX    H
  614.     ORA    A
  615.     RZ
  616.     CALL    WCC
  617.     JMP    WCS
  618. ;
  619. ;     WCCR - WRITE CONSOLE CARRIAGE RETURN (AND LINE FEED)
  620. ;
  621. WCCR:    MVI    A,CR 
  622.     CALL    WCC
  623.     MVI    A,LF 
  624. ;
  625. ;     WCC - WRITE CONSOLE CHARACTER 
  626. ;     ENTRY CONDITIONS: 
  627. ;        A - CHARACTER TO WRITE 
  628. ;
  629. WCC:    PUSH    PSW
  630.     PUSH    B
  631.     PUSH    D
  632.     PUSH    H
  633.     MOV    C,A    ;GET CHARACTER FOR CBIOS
  634. WCCAL:    CALL    $-$    ;MODIFIED BY INIT.
  635.     POP    H
  636.     POP    D
  637.     POP    B
  638.     POP    PSW
  639.     RET 
  640. ;
  641. ;     RCS - READ CONSOLE STRING (WITH ECHO) 
  642. ;     EXIT CONDITIONS 
  643. ;        B - NUMBER OF CHARACTERS READ (<255) 
  644. ;        HL - POINTS TO LAST CHAR STORED (CR) 
  645. ;
  646. RCS:    LXI    H,IBUF 
  647.     MVI    B,0
  648. RCS1:    CALL    RCC    ;READ NEXT CHAR FROM CONSOLE
  649.     CPI    DEL    ;JUMP IF NOT DEL
  650.     JNZ    RCS2 
  651.     INR    B    ;IGNORE DEL IF IBUF ALREADY EMPTY 
  652.     DCR    B
  653.     JZ    RCS1 
  654.     DCX    H    ;ELSE DISCARD LAST CHAR 
  655.     MOV    A,M    ;ECHO DISCARDED CHAR TO CONSOLE 
  656.     CALL    WCC
  657.     DCR    B    ;DECREMENT COUNT
  658.     JMP    RCS1    ;    AND LOOP 
  659. ;
  660. RCS2:    CPI    'U'-40H    ;JUMP IF NOT CONTROL U
  661.     JNZ    RCS3 
  662.     CALL    WCCR    ;ELSE ABORT CURRENT LINE
  663.     JMP    RCS    ;    AND START OVER 
  664. ;
  665. RCS3:    CALL    WCC    ;ECHO CHAR TO CONSOLE 
  666.     MOV    M,A    ;STORE CHAR IN IBUF 
  667.     INR    B    ;INCREMENT COUNT
  668.     CPI    CR    ;JUMP IF CARRIAGE RETURN
  669.     JZ    RCS4
  670.     INX    H    ;ELSE ADVANCE POINTER 
  671.     JMP    RCS1    ;    AND LOOP 
  672. ;
  673. RCS4:    MVI    A,LF    ;ISSUE LINE FEED AND RETURN 
  674.     CALL    WCC
  675.     RET 
  676. ;
  677. ;     RCC - READ CONSOLE CHARACTER
  678. ;     EXIT CONDITIONS 
  679. ;        A - CHARACTER READ 
  680. ;
  681. RCC:    PUSH    B
  682.     PUSH    D
  683.     PUSH    H
  684. RCCAL:    CALL    $-$    ;MODIFIED BY INI\.
  685.     POP    H
  686.     POP    D
  687.     POP    B
  688.     RET 
  689. ;
  690. ;     WMC - WRITE MODEM CHARACTER 
  691. ;     ENTRY CONDITIONS
  692. ;        A - CHARACTER TO WRITE 
  693. ;
  694. ;
  695.     IF    PORT
  696. WMC:    PUSH    PSW
  697. WMCL:    IN    MODS 
  698.     ANI    MTBE
  699.     JZ    WMCL
  700.     POP    PSW
  701.     ANI    7FH    ;STRIP PARITY BIT
  702.     OUT    MODD 
  703.     RET 
  704.     ENDIF
  705. ;
  706.     IF    TRSPT
  707. WMC:    PUSH    H
  708.     PUSH    D
  709.     PUSH    PSW
  710. WMCL:    CALL    MOTEST    ;TEST STATUS
  711.     JZ    WMCL    ;LOOP TILL TX EMPTY
  712.     POP    PSW    ;RESTORE CHAR
  713.     ANI    7FH    ;STRIP PARITY
  714.     PUSH    B    ;STORE B
  715.     MOV    C,A    ;PUT CHAR INTO C
  716.     MVI    B,00H    ;CHANNEL A
  717.     LXI    H,WMCRE    ;STORE RETURN ADDRESS
  718.     PUSH    H
  719.     LHLD    1    ;GET BASE ADDRESS
  720.     LXI    D,SIOOUT
  721.     DAD    D
  722.     PCHL        ;JUMP TO IT
  723. WMCRE:    POP    B    ;RESTORE IT
  724.     POP    D
  725.     POP    H
  726.     RET
  727.     ENDIF
  728. ;
  729. ;     RMC - READ MODEM CHARACTER
  730. ;     EXIT CONDITIONS:
  731. ;        A - CHARACTER READ 
  732. ;
  733. ;
  734.     IF    PORT
  735. RMC:    IN    MODS 
  736.     ANI    MRDA
  737.     JZ    RMC
  738. RMC2:    IN    MODD 
  739.     ANI    7FH 
  740.     RET 
  741.     ENDIF
  742. ;
  743.     IF    TRSPT
  744. RMC:    CALL    MITEST    ;CHAR AVAILABLE
  745.     JZ    RMC    ;LOOP IF NOT READY
  746. RMC2:    PUSH    B    ;STORE B
  747.     PUSH    D
  748.     PUSH    H
  749.     MVI    B,00H    ;CHANNEL A
  750.     LXI    H,RMCRE    ;RETURN ADDRESS
  751.     PUSH    H
  752.     LHLD    1
  753.     LXI    D,SIOINP
  754.     DAD    D
  755.     PCHL
  756. RMCRE:    POP    H
  757.     POP    D
  758.     POP    B
  759.     ANI    7FH    ;STRIP PARITY
  760.     RET
  761.     ENDIF
  762. ;
  763. ;
  764. ;     GFN - GET FILE NAME 
  765. ;
  766. GFN:    LXI    H,GFNSD    ;PRINT 'WHICH DRIVE?'
  767.     CALL    WCS
  768.     CALL    RCC    ;GET ANSWER FROM CONSOLE
  769.     CALL    WCC    ;ECHO IT TO CONSOLE
  770.     ANI    5FH    ;MAKE UPPER CASE
  771.     SUI    'A'-1
  772.     JC    GFN    ;REQUIRE ALPHABETIC
  773.     JZ    GFN
  774.     CPI    17    ;ALLOW 16 DRIVES (AS IN CP/M 2.X)
  775.     JNC    GFN
  776.     STA    FCB
  777. GFNB:    LXI    H,GFNS1    ;PRINT 'FILENAME? ' 
  778.     CALL    WCS
  779.     CALL    RCS    ;READ RESPONSE INTO IBUF
  780.     LXI    H,FCB+FN  ;BLANK FILL FN AND FT FIELDS
  781.     MVI    C,11 
  782. GFN1:    MVI    M,' '
  783.     INX    H
  784.     DCR    C
  785.     JNZ    GFN1 
  786.     LXI    H,IBUF    ;POINT TO INPUT BUFFER
  787.     LXI    D,FCB+FN  ;SCAN OFF FN FIELD
  788.     MVI    C,9
  789. GFN2:    MOV    A,M    ;FETCH NEXT CHAR FROM IBUF
  790.     INX    H
  791.     CPI    61H    ;IF LC, CONVERT TO UC 
  792.     JC    GFN2A
  793.     SUI    20H
  794. GFN2A:    CPI    CR    ;JUMP IF END OF LINE
  795.     JZ    GFN5 
  796.     CPI    '.'    ;JUMP IF END OF NAME
  797.     JZ    GFN3 
  798.     STAX    D    ;ELSE STORE CHAR IN FN FIELD
  799.     INX    D
  800.     DCR    C    ;LOOP IF 8 OR LESS CHARS SO FAR
  801.     JNZ    GFN2 
  802.     JMP    GFN6    ;ELSE TAKE ERROR EXIT 
  803. ;
  804. GFN3:    LXI    D,FCB+FT  ;SCAN OFF FT FIELD
  805.     MVI    C,4
  806. GFN4:    MOV    A,M    ;FETCH NEXT CHAR FROM IBUF
  807.     INX    H
  808.     CPI    61H    ;IF LC, CONVERT TO UC 
  809.     JC    GFN4A
  810.     SUI    20H
  811. GFN4A:    CPI    CR    ;JUMP IF END OF LINE
  812.     JZ    GFN5 
  813.     STAX    D    ;ELSE STORE CHAR IN FT FIELD
  814.     INX    D
  815.     DCR    C    ;LOOP IF 3 OR LESS CHARS SO FAR
  816.     JNZ    GFN4 
  817.     JMP    GFN6    ;ELSE TAKE ERROR EXIT 
  818. ;
  819. GFN5:    XRA    A
  820.     STA    FCB+EX    ;SET EXTENT NUMBER TO ZERO
  821.     STA    FCB+NR    ;SET RECORD NUMBER TO ZERO
  822.     STC        ;CLEAR ERROR FLAG AND RETURN
  823.     CMC 
  824.     RET 
  825. ;
  826. GFN6:    STC        ;SET ERROR FLAG AND RETURN
  827.     RET 
  828. ;
  829. GFNSD:    DB    CR,LF,'WHICH DRIVE? ',0
  830. GFNS1:    DB    CR,LF,'FILENAME? ',0 
  831. ;
  832. ;     OPEN - OPEN DISK FILE 
  833. ;
  834. OPEN:    PUSH    H
  835.     PUSH    D
  836.     PUSH    B
  837.     LXI    D,FCB
  838.     MVI    C,OFFC 
  839.     CALL    BDOS 
  840.     POP    B
  841.     POP    D
  842.     POP    H
  843.     RET 
  844. ;
  845. ;     READ - READ RECORD FROM DISK FILE 
  846. ;
  847. READ:    PUSH    H
  848.     PUSH    D
  849.     PUSH    B
  850.     LXI    D,FCB
  851.     MVI    C,RRFC 
  852.     CALL    BDOS 
  853.     POP    B
  854.     POP    D
  855.     POP    H
  856.     RET 
  857. ;
  858. ;     CLOSE - CLOSE DISK FILE 
  859. ;
  860. CLOSE:    PUSH    H
  861.     PUSH    D
  862.     PUSH    B
  863.     LXI    D,FCB
  864.     MVI    C,CFFC 
  865.     CALL    BDOS 
  866.     POP    B
  867.     POP    D
  868.     POP    H
  869.     RET 
  870. ;
  871. ;     DELT - DELETE DISK FILE 
  872. ;
  873. DELT:    PUSH    H
  874.     PUSH    D
  875.     PUSH    B
  876.     LXI    D,FCB
  877.     MVI    C,DFFC 
  878.     CALL    BDOS 
  879.     POP    B
  880.     POP    D
  881.     POP    H
  882.     RET 
  883. ;
  884. ;     WRITE - WRITE RECORD TO DISK
  885. ;
  886. WRITE:    PUSH    H
  887.     PUSH    D
  888.     PUSH    B
  889.     LXI    D,FCB
  890.     MVI    C,WRFC 
  891.     CALL    BDOS 
  892.     POP    B
  893.     POP    D
  894.     POP    H
  895.     RET 
  896. ;
  897. ;     MAKE - MAKE NEW DISK FILE 
  898. ;
  899. MAKE:    PUSH    H
  900.     PUSH    D
  901.     PUSH    B
  902.     LXI    D,FCB
  903.     MVI    C,MFFC
  904.     CALL    BDOS 
  905.     POP    B
  906.     POP    D
  907.     POP    H
  908.     RET 
  909. ;
  910. ;    CITEST - CHECK CONSOLE INPUT STATUS
  911. ;
  912. CITEST:    PUSH    B
  913.     PUSH    D
  914.     PUSH    H
  915. CITCAL:    CALL    $-$    ;MODIFIED BY INIT.
  916.     ORA    A    ;SET ZERO FLAG
  917.     POP    H
  918.     POP    D
  919.     POP    B
  920.     RET        ;ZERO FLAG CARRIES ANSWER
  921. ;
  922. ;    MITEST - CHECK MODEM INPUT STATUS
  923. ;
  924.     IF    PORT
  925. MITEST:    IN    MODS    ;GET MODEM UART STATUS
  926.     ANI    MRDA    ;ANY DATA AVAILABLE?
  927.     RET        ;ZERO FLAG CARRIES ANSWER
  928.     ENDIF
  929. ;
  930. ;
  931.     IF    TRSPT
  932. ;
  933. MITEST:    PUSH    B
  934.     PUSH    H
  935.     PUSH    D
  936.     MVI    B,00    ;CHANNEL A
  937.     LXI    H,MITSTR
  938.     PUSH    H
  939.     LHLD    1
  940.     LXI    D,SIOTST
  941.     DAD    D
  942.     PCHL
  943. MITSTR:    POP    D
  944.     POP    H
  945.     ANI    01    ;TX EMPTY
  946.     POP    B
  947.     RET        ;ZERO FLAG HOLDS THE ANSWER
  948.     ENDIF
  949. ;
  950. ;    MOTEST - CHECK MODEM OUTPUT STATUS
  951. ;
  952. ;
  953.     IF    PORT
  954. MOTEST:    IN    MODS    ;GET MODEM UART STATUS
  955.     ANI    MTBE    ;UART READY FOR CHARACTER?
  956.     RET        ;ZERO FLAG CARRIES ANSWER
  957.     ENDIF
  958. ;
  959.     IF    TRSPT
  960. MOTEST:    PUSH    B
  961.     PUSH    H
  962.     PUSH    D
  963.     MVI    B,00    ;CHANNEL A
  964.     LXI    H,MOTSTR
  965.     PUSH    H
  966.     LHLD    1
  967.     LXI    D,SIOTST
  968.     DAD    D
  969.     PCHL
  970. MOTSTR:    ANI    02    ;BUFFER EMPTY
  971.     POP    D
  972.     POP    H
  973.     POP    B
  974.     RET
  975.     ENDIF
  976. ;
  977. ;     DATA AREA 
  978. ;
  979. INCH:    DS    1    ;INPUT CHAR BUFFER (TO CYBER) 
  980. OUTCH:    DS    1    ;OUTPUT CHAR BUFFER (FROM CIBER)
  981. STACK:    DS    80    ;LOCAL STACK
  982. IBUF:    DS    256    ;INPUT BUFFER 
  983. ;
  984. ;     TEXT BUFFER 
  985. ;
  986. FLAG:    DS    1    ;TEXT SAVE FLAG 
  987. PTR:    DS    2    ;TEXT BUFFER POINTER
  988. SIZE:    DS    2    ;TEXT BUFFER SIZE 
  989. TBUF:    EQU    $    ;START OF TEXT BUFFER 
  990. ;
  991.     END    LINK
  992. ;
  993.  
  994.