home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug046.ark / PLINK823.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  19.7 KB  |  994 lines

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