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 / CPM / MODEMS / MODEM / PLINK67A.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  37KB  |  1,282 lines

  1. ;                    PLINK.ASM  VER 6.7
  2. ;                     (REVISED 5/6/82)
  3. ;
  4. ;PLINK IS A CP/M TRANSIENT COMMAND WHICH ALLOWS THE USER TO
  5. ;ESTABLISH A COMMUNICATIONS LINK WITH A REMOTE COMPUTER.
  6. ;
  7. ;THIS PROGRAM CURRENTLY SUPPORTS THE FOLLOWING MODEMS OR COMPUTERS
  8. ;VIA CONDITIONAL ASSEMBLY:
  9. ;
  10. ; 1. PMMI MODEM
  11. ; 2. ANY SERIAL I/O BOARD (TUART INCLUDED)
  12. ; 3. TRS-80 MODEL 1
  13. ; 4. TRS-80 MODEL 2
  14. ; 5. HEATH H8/H89 WITH 8250 UART AT PORT 330Q
  15. ; 6. D.C.HAYES 80-103A OR MICROMODEM 100
  16. ; 7. MITS 2SI/O BOARD, PORTS 10H &11H = CONSOLE, 12H & 13H = MODEM
  17. ; 8. INTEL SBC OR NATIONAL BLC MULTI-BUS BOARDS USING 8251 USART
  18. ; 9. APPLE II WITH Z-80 CARD AND SUPER SERIAL IN SLOT 2
  19. ;
  20. ;ORIGINALLY WRITTEN BY L.E. HUGHES (EDCAM) IN JULY, 1977.  MANY
  21. ;MODIFICATIONS HAVE BEEN MADE SINCE THIS TIME, AS SHOWN IN THE
  22. ;FOLLOWING SUMMARY.
  23. ;
  24. ;FIXES/UPDATES (IN REVERSE ORDER TO MINIMIZE READING TIME):
  25. ;
  26. ; NOV 8, 1982. APPLE EQUATES CHANGED FOR SUPER SERIAL CARD (MIKE COHEN)
  27. ;
  28. ; JUNE 15, 1982.  ADDED FEATURE TO AUTOMATICALLY SEND
  29. ; X-OFF TO REMOTE WHEN BUFFER FILLS AND DISK SAVE BEGINS (CHRIS HAYS)
  30. ; JUNE 15, 1982.  FIXED DELETE/BACKSPACE PROBLEM
  31. ; WHEN USED WITH APPLE CP/M (CHRIS HAYS)
  32. ; MAY 6, 1982.  ADDED APPLE II EQUATES (CHRIS HAYS)
  33. ; MAY 6, 1982.  ADDED ERROR TRAP AND RECOVERY ROUTINE
  34. ; IN CASE THE DISK GETS FULL WHEN SAVING BUFFER.  CHRIS HAYS
  35. ; MAY 6, 1982.  ADDED CONDITIONAL ASSEMBLY SWITCH TO ALLOW
  36. ; MICRONET UPLOAD TO WORK CORRECTLY.  OPTION IS ACTIVATED
  37. ; WHEN THE 'U' (UPLOAD) TRIGGER OPTION IS SELECTED. CHRIS HAYS.
  38. ; JUNE 26, 1981. ADDED MESSAGE WHEN EXITING IF LAST BUFFER WAS
  39. ; NOT SAVED.  TED SHAPIN.
  40. ;
  41. ;JUNE 14, 1981, BY KEITH PETERSEN, W8SDZ.  CHANGED PORT
  42. ;EQUATE TO 'EQU' INSTEAD OF 'SET'.  ASM DOESN'T LIKE 'SET'
  43. ;WHEN LATER CONDITIONALS ARE BASED ON A LABEL DEFINED THAT
  44. ;WAY.
  45. ;
  46. ;JUNE 7, 1981, BY TOM JORGENSON (CP-MIG).  CHANGED CP/M 
  47. ;ORIGIN FROM BEING VIA SETS TO REFERENCED TO BASE, ADDED
  48. ;TRUE/FALSE RATHER THAN NUMERIC VALUES (FOR READABILITY),
  49. ;CHANGED ^Q FUNCTION TO ^W (WRITE) BECAUSE SOME SYSTEMS
  50. ;(NOTABLY MICRONET) USE ^S/^Q TO SUSPEND/RESUME OUTPUT,
  51. ;CHANGED PAGE 0 REFERENCES IN TRS ROUTINES TO USE
  52. ;BASE EQUATE PROPERLY, CHANGED PORT EQUATES TO DEFAULT
  53. ;TO TRUE, REINSERTED HEATH EQUATES, AND CLEANED UP CODE
  54. ;IN SEVERAL PLACES.
  55. ;
  56. ;JUNE 7, 1981, BY KEITH PETERSEN, W8SDZ.  FIXED PROBLEM WITH
  57. ;EQUATES WHICH PREVENTED ASSEMBLY BY 'ASM' WHEN TUART OPTION
  58. ;WAS SELECTED.
  59. ;
  60. ;JUNE 6, 1981, BY KEITH PETERSEN, W8SDZ.  ADDED VERSION NUMBER,
  61. ;CLEANED UP FILE.
  62. ;
  63. ;MAY 12, 1981, BY T. SHAPIN.  ADDED CODE FOR 8251 USART ON INTEL 
  64. ;SBC OR NATIONAL BLC MULTIBUS BOARD WITH MODIFIED CP/M ORIGIN.  
  65. ;ADDED PROMPT TO SIGNON. ADDED TOGGLE TO ^Y TO SAVE OR IGNORE 
  66. ;INCOMING TEXT. ADDED ^C ABORT ON FILE NAME RESPONSE.
  67. ;
  68. ;NOVEMBER 10, 1980, BY KELLY SMITH.  ADDED CONDITIONAL ASSEMBLY 
  69. ;SWITCH FOR MITS 2SI/O BOARD, USING "STANDARD" MITS PORTS 10 AND
  70. ;11 HEX FOR THE CONSOLE, AND 12 AND 13 HEX FOR THE MODEM.
  71. ;
  72. ;OCTOBER 18, 1980, BY KEITH PETERSEN, W8SDZ.
  73. ;
  74. ;HEATH EQUATES ADDED BY TOM JORGENSON.
  75. ;
  76. ;TRS-80 MODEL 1 MODS BY STEVE VINOKUROFF, VANCOUVER CBBS.
  77. ;
  78. ;OPTIONAL TRIGGER CHARACTERS BY STEVE VINOKUROFF.
  79. ;
  80. ;TRS-80 MODS BY DENNIS BRECKENRIDGE, BURNABY CBBS.
  81. ;
  82. ;D.C.HAYES MODS BY BRUCE RATOFF, ISELIN NEW JERSEY REMOTE CP/M.
  83. ;
  84. ;NOTE: IF YOU ADD IMPROVEMENTS OR OTHERWISE UPDATE
  85. ;THIS PROGRAM, PLEASE MODEM A COPY OF THE NEW FILE
  86. ;TO "TECHNICAL CBBS" IN DEARBORN, MICHIGAN - PHONE
  87. ;313-759-6569>>RINGBACK.
  88. ;(110, 300, 450 OR 600 BAUD).
  89. ;FILENAME PLINKXX.NEW.
  90. ;
  91. ;PLINK CURRENTLY SUPPORTS TWO WAY TRANSFER OF TEXT FILES BETWEEN
  92. ;THE CP/M DISK AND THE REMOTE COMPUTER. THE FOLLOWING CONTROL
  93. ;CODES MAY BE INITIATED FROM THE CONSOLE KEYBOARD:
  94. ;
  95. ;CONTROL-E      EXIT PLINK TO CP/M "WARM-BOOT".
  96. ;
  97. ;CONTROL-T      TRANSMIT ASCII FILE TO REMOTE SYSTEM, ASKS FOR
  98. ;               DRIVE (A, B, ETC.) AND FILENAME.TYP.
  99. ;
  100. ;CONTROL-C      ABORTS TRANSMISSION OF FILE TO REMOTE SYSTEM.
  101. ;
  102. ;CONTROL-Y      SWITCHES BETWEEN SAVING AND IGNORING
  103. ;               INCOMING ASCII DATA IN RAM BUFFER,
  104. ;               FOR LATER TRANSFER TO DISK.
  105. ;
  106. ;CONTROL-W      WRITES RAM BUFFER TO DISK, AND ASKS FOR DRIVE
  107. ;               AND FILENAME.TYP.
  108. ;
  109. ;DEL (DELETE)   BACKSPACE WHEN IN COMMAND MODE (E.G. ^T OR ^W).
  110. ;
  111. ;CONTROL-U      ABORTS CURRENT LINE WHEN IN COMMAND MODE.
  112. ;
  113. ;(NOTE: ALL OTHER CONTROL CODES ARE PASSED TO MODEM OUTPUT, AND
  114. ;MAY BE INTERPRETED BY THE REMOTE SYSTEM AS VARIOUS CONTROL
  115. ;FUNCTIONS.)
  116. ;
  117. ;TRUE/FALSE DEFINITIONS
  118. ;
  119. FALSE   EQU     0
  120. TRUE    EQU     NOT FALSE
  121. ;
  122. ;CONDITIONAL ASSEMBLY SWITCHES <<-- SET FOR YOUR SYSTEM
  123. ;(SELECT ONLY ONE AS TRUE) - (NOTE: USE TUART FOR OTHER
  124. ;SERIAL PORTS NOT DEFINED).
  125. ;
  126. MITSIO  EQU     FALSE   ;TRUE, IF MITS 2SI/O BOARD
  127. H84     EQU     FALSE   ;TRUE, IF YOU HAVE H8/H8-4 OR H89
  128. TUART   EQU     FALSE   ;TRUE, IF CROMENCO TUART OR OTHER SERIAL
  129. PMMI    EQU     FALSE   ;TRUE, IF PMMI (SET INITREQ TRUE ONLY
  130.                         ;IF ORIG MODE AND PARITY IS REQUIRED)
  131. DCH     EQU     FALSE   ;TRUE, IF D.C.HAYES
  132. TRS1    EQU     FALSE   ;TRUE, IF TRS-80 MODEL 1
  133. TRSPT   EQU     FALSE   ;TRUE, IF TRS-80 MODEL 2
  134.                         ;USING PICKLES & TROUT CP/M 2.X
  135. MULTI   EQU     FALSE   ;TRUE, IF SBC OR BLC 8251 USART
  136. APPLE   EQU     TRUE    ;TRUE, IF APPLE CP/M
  137. ;
  138. MNET    EQU     TRUE    ;TRUE, IF MICRONET UPLOAD FEATURE WANTED
  139. ;
  140. INITREQ EQU     FALSE   ;TRUE, IF PORT INITIALIZATION REQUIRED
  141. ;
  142.         IF      NOT (TRSPT OR APPLE)
  143. PORT    EQU     TRUE    ;TRUE, ON MOST SYSTEMS
  144.         ENDIF
  145. ;
  146.         IF      TRSPT OR APPLE
  147. PORT    EQU     FALSE   ;THIS IS THE ODDBALL
  148.         ENDIF
  149. ;
  150. ;BDOS ENTRY POINT AND FUNCTION CODES
  151. ;
  152. BASE    EQU     0       ;<<-- SET TO OFFSET OF CP/M FOR YOUR
  153.                         ;SYSTEM, STANDARD SYSTEMS ARE 0, SOME
  154.                         ;'ALTERNATE' SYSTEMS ARE 4200H
  155. ;
  156. BDOS    EQU     BASE+5
  157. RESDSK  EQU     13      ;RESET DISK SYSTEM
  158. OFFC    EQU     15      ;OPEN FILE
  159. CFFC    EQU     16      ;CLOSE FILE
  160. DFFC    EQU     19      ;DELETE FILE
  161. RRFC    EQU     20      ;READ RECORD
  162. WRFC    EQU     21      ;WRITE RECORD
  163. MFFC    EQU     22      ;MAKE FILE
  164. ;
  165. ;TRS80 PICKLES AND TROUT SIO CALLS
  166. ;OFFSET BY -3 THAT IS ADD 3 TO ALL CALLS
  167. ;
  168. SETSIO  EQU     30H     ;SET UP Z80 SIO
  169. SIOTST  EQU     33H     ;READ SIO STATUS
  170. SIOINP  EQU     36H     ;INPUT A CHAR
  171. SIOOUT  EQU     39H     ;OUTPUT A CHAR
  172. ;
  173.         IF      MULTI
  174. MODS    EQU     0DDH    ;MODEM CONTROL
  175. MTBE    EQU     1       ;BIT TO TEST FOR SEND
  176. MRDA    EQU     2       ;BIT TO TEST FOR RECEIVE
  177. MXOR    EQU     3       ;MASK TO MAKE MTBE AND MRDA 'LOW TRUE'
  178. MODD    EQU     0DCH    ;MODEM DATA PORT
  179.         ENDIF
  180. ;
  181. ;DEFAULT FCB AND FIELD DEFINITIONS
  182. ;
  183. FCB     EQU     BASE+5CH
  184. FN      EQU     1       ;FILE NAME FIELD (REL)
  185. FT      EQU     9       ;FILE TYPE FIELD (REL)
  186. EX      EQU     12      ;FILE EXTENT FIELD (REL)
  187. NR      EQU     32      ;NEXT RECORD FIELD (REL)
  188. DBUF    EQU     BASE+80H ;DEFAULT DISK BUFFER ADDRESS
  189. ;
  190. ;ASCII CONTROL CHARACTERS
  191. ;
  192. CR      EQU     0DH     ;CARRIAGE RETURN
  193. LF      EQU     0AH     ;LINE FEED
  194.         IF      NOT APPLE
  195. DEL     EQU     7FH     ;DELETE (RUBOUT)
  196.         ENDIF
  197. ;
  198.         IF APPLE
  199. DEL     EQU     08H     ;APPLE USES BS INSTEAD
  200.         ENDIF
  201. ;
  202. BELL    EQU     07H     ;BELL SIGNAL
  203. TAB     EQU     09H     ;HORIZONTAL TAB
  204. XOFF    EQU     13H     ;X-OFF CHARACTER
  205. XON     EQU     11H     ;X-ON CHARACTER
  206. NULL    EQU     00H     ;NULL CHAR
  207. ;
  208. ;THE FOLLOWING "TRIGGER" EQUATE IS SET TO "LF" (LINEFEED)
  209. ;BY DEFAULT. AN OPTIONAL TRIGGER CHAR MAY BE PASSED VIA FCB1
  210. ;
  211. ; IE:  PLINK B          WILL SET TRIGGER TO "BELL"
  212. ;
  213. ;THE FOLLOWING OPTIONS ARE ALLOWED
  214. ;
  215. ;       1. B = BELL  07H
  216. ;       2. X = XON   11H
  217. ;       3. U = UPLOAD NO TRIGGER CHECK AT ALL
  218. ;
  219. ;ANY OTHER ASCII CHARACTER MAY BE PASSED THROUGH FCB1
  220. ;
  221. ;
  222. TRIGGER EQU     LF      ;DEFAULT VALUE
  223. ;
  224. ;
  225. ;WARNING CHARACTER FOR LOW MEMORY
  226. ;
  227.         IF      NOT APPLE
  228. WRNSIG  EQU     BELL    ;IF YOU HAVE ONE, PUT 'BELL' HERE
  229.                         ;...ELSE PUT '*' HERE.
  230.          ENDIF
  231. ;
  232.          IF      APPLE
  233. WRNSIG   EQU     '*'    ;APPLE BELL LOSES 100MS
  234.          ENDIF          ;SO USE '*' INSTEAD
  235. ;
  236. ;MODEM I/O PORT ADDRESSES
  237. ;
  238.         IF      MITSIO
  239. MODD    EQU     13H     ;MODEM DATA PORT
  240. MODS    EQU     12H     ;MODEM STATUS PORT
  241. MODRSET EQU     03H     ;6850 ACIA RESET
  242. MODINIT EQU     11H     ;8 DATA, NO PARITY, 2 STOP
  243.         ENDIF
  244. ;
  245.         IF      H84
  246. MODD    EQU     330Q    ;MODEM DATA PORT
  247. MODS    EQU     335Q    ;MODEM STATUS PORT
  248.         ENDIF
  249. ;
  250.         IF      PMMI
  251. MODD    EQU     0C1H    ;MODEM DATA PORT
  252. MODS    EQU     0C0H    ;MODEM STATUS PORT
  253. MODINIT EQU     29H     ;INITIALIZE BYTE ORIGINATE,
  254.                         ;7 DATA, EVEN PARITY, 1 STOP
  255.         ENDIF
  256. ;
  257.         IF      DCH
  258. MODD    EQU     90H     ;MODEM DATA PORT
  259. MODS    EQU     91H     ;MODEM STATUS PORT
  260. MODINIT EQU     05H     ;7 DATA, EVEN PARITY, 1 STOP
  261.         ENDIF
  262. ;
  263.         IF      TRS1
  264. MODD    EQU     0EBH    ;TRS80 MOD 1 RS232 DATA PORT
  265. MODS    EQU     0EAH    ; AND THE RS232 STATUS PORT
  266.         ENDIF
  267. ;
  268.         IF      TUART
  269. MODD    EQU     0D6H    ;<<--MODIFY FOR YOURS
  270. MODS    EQU     0D7H    ;<<--MODIFY FOR YOURS
  271.         ENDIF
  272. ;
  273.         IF      APPLE   ;THESE ARE FOR SUPER SERIAL CARD
  274. MODD    EQU     0E0A8H  ;INSTALLED IN SLOT 2
  275. MODS    EQU     0E0A9H  ;CHANGE IF NECESSARY
  276.         ENDIF
  277. ;
  278. ;MODEM STATUS PORT BIT DEFINITIONS
  279. ;
  280.         IF      H84
  281. MTBE    EQU     40Q     ;MODEM THRE TRANSMIT READY BIT
  282. MRDA    EQU     01Q     ;MODEM RDA REC'D DATA BIT
  283. MXOR    EQU     41Q     ;MASK TO MAKE MTBE AND MRDA 'NEGATIVE LOGIC'
  284.         ENDIF
  285. ;
  286.         IF      PMMI
  287. MTBE    EQU     01H     ;MODEM TRANS. BUFFER READY FLAG
  288. MRDA    EQU     02H     ;MODEM RECEIVE DATA AVAIL. FLAG
  289. MXOR    EQU     03H     ;MASK TO MAKE MTBE AND MRDA "LOW TRUE"
  290.         ENDIF
  291. ;
  292.         IF      DCH OR MITSIO
  293. MTBE    EQU     02H     ;MODEM TRANS. BUFFER READY FLAG
  294. MRDA    EQU     01H     ;MODEM RECEIVE DATA AVAIL. FLAG
  295. MXOR    EQU     03H
  296.         ENDIF
  297. ;
  298.         IF      TRS1
  299. MTBE    EQU     40H     ;TRS80 MOD1 RS232 BUFFER READY
  300. MRDA    EQU     80H     ;MODEM RECEIVE DATA AVAIL.
  301. MXOR    EQU     0C0H
  302.         ENDIF
  303. ;
  304.         IF      TUART   ;<<--OR ANY OTHER SERIAL I/O
  305. MTBE    EQU     1       ;<<--MODIFY FOR YOURS
  306. MRDA    EQU     2       ;<<--MODIFY FOR YOURS
  307. MXOR    EQU     3       ;<<--MODIFY FOR YOURS
  308.         ENDIF
  309. ;
  310.         IF      APPLE
  311. MTBE    EQU     10H     ;TRANSMIT BUFFER READY FLAG
  312. MRDA    EQU     08H     ;RECEIVE DATA AVAIL FLAG
  313.         ENDIF
  314. ;
  315. ;       **MAIN PROGRAM**
  316. ;
  317.         ORG     BASE+100H
  318. ;
  319. LINK:   LXI     SP,STACK+64 ;CREATE LOCAL STACK
  320.         LHLD    BASE+1  ;POINT TO CP/M JMP TABLE
  321.         LXI     D,3     ;GET READY TO ADD 3
  322.         DAD     D       ;POINT TO CON STATUS JMP
  323.         SHLD    CITCAL+1 ;MODIFY CALL ADRS
  324.         DAD     D       ;POINT TO CON IN JMP
  325.         SHLD    RCCAL+1 ;MODIFY CALL ADRS
  326.         DAD     D       ;POINT TO CON OUT JMP
  327.         SHLD    WCCAL+1 ;MODIFY CALL ADRS
  328.         LDA     FCB+1   ;SEE IF OPTIONAL TRIGGER CHAR
  329.         CPI     20H     ;BLANK.. ?
  330.         JZ      SKP     ;..BLANK SO USE DEFAULT "LF"
  331.         CPI     'B'     ;BELL WANTED
  332.         JZ      TRGBEL
  333.         CPI     'X'     ;XON WANTED
  334.         JZ      TRGXON
  335.         CPI     'U'     ;UPLOADING NO CHECKING FOR TRIGGER
  336.         JZ      TRGUPL
  337. ;
  338. SETTRG  STA     OVERLY+1 ;STORE THE CHARACTER AS IS THEN
  339.         JMP     SKP
  340. ;
  341. TRGBEL  MVI     A,BELL
  342.         JMP     SETTRG
  343. ;
  344. TRGXON  MVI     A,XON
  345.         JMP     SETTRG
  346. ;
  347. TRGUPL  XRA     A        ;ZERO OUT JUMP
  348.         STA     OVERL1+1 ;CHANGE CHECK FOR C/R TO NULL
  349.         STA     OVERL2+1 ;AND SEND LINEFEEDS AS WELL
  350.         JMP     SKP
  351. ;
  352. SKP:    EQU     $
  353. ;
  354.         IF      MITSIO
  355.         MVI     A,MODRSET
  356.         OUT     MODS
  357.         MVI     A,MODINIT
  358.         OUT     MODS
  359.         ENDIF
  360. ;
  361.         IF      H84
  362.         MVI     A,80H   ;SET DLAB BIT IN 8250 UART
  363.         OUT     0DBH    ;8250 AT PORT D8H (330Q)
  364.         NOP ! NOP ! NOP
  365.         NOP ! NOP
  366.         MVI     A,01H   ;MSB OF BAUD RATE DIVISOR
  367.         OUT     0D9H    ;...TO UART
  368.         NOP ! NOP ! NOP
  369.         NOP ! NOP
  370.         MVI     A,80H   ;LSB OF BAUD RATE DIVISOR
  371.         OUT     0D8H    ;...TO UART
  372.         NOP ! NOP ! NOP
  373.         NOP ! NOP
  374.         MVI     A,03H   ;8 BITS, 1 STOP BIT, NO PARITY, DLAB RESET
  375.         OUT     0DBH    ;...TO UART
  376.         NOP ! NOP ! NOP
  377.         NOP ! NOP
  378.         MVI     A,0     ;RESET CONTROL REGISTER
  379.         OUT     0DCH    ;...TO UART
  380.         JMP     CONT
  381.         ENDIF
  382. ;
  383.         IF      INITREQ AND (NOT H84) AND (NOT MITSIO)
  384.         MVI     A,MODINIT
  385.         OUT     MODS    ;INITIALIZE MODEM PORT
  386.         ENDIF
  387. ;
  388.         IF      INITREQ AND TUART
  389.         MVI     A,80H   ;DSR ON BIT 7 PARL PORT B
  390.         OUT     54H
  391.         ENDIF
  392. ;
  393.         IF      TRSPT   ;MUST SET UP SERIAL CHANNEL
  394. RESET:  LXI     H,INITR ;STORE RETURN ADDRESS
  395.         PUSH    H
  396.         LHLD    1
  397.         LXI     D,SETSIO ;SIO SETUP ROUTINE
  398.         DAD     D
  399.         PUSH    H       ;STORE ON STACK
  400.         MVI     C,00H   ;NO PARITY CHAN-A
  401.         MVI     D,0E6H  ;8 BITS ,1 STOP
  402.         MVI     E,3     ;300 BAUD
  403.         MVI     L,00H   ;DISABLE EXT/ACK SIO FUNCTIONS
  404.         MVI     H,'S'-40H ;CONTROL S (X-ON)
  405.         RET             ;TROUGH SETUP PROG
  406. ;
  407. INITR   NOP             ;DO IT TO IT
  408.         ENDIF
  409. ;
  410.         IF      TRS1    ;INIT FOR TRS80 MOD1 RS232
  411.         OUT     0E8H    ;RESET RS232
  412.         IN      0E9H    ;READ THE SWITCHES
  413.         ANI     0F8H
  414.         ORI     5
  415.         OUT     0EAH    ;SET DSR AND CTS
  416.         MVI     A,55H   ;300 BAUD
  417.         OUT     0E9H
  418.         ENDIF
  419. ;
  420.         IF      PORT
  421.         IN      MODD    ;CLEAR MODEM UART READ BUFFERS
  422.         IN      MODD
  423.         ENDIF
  424. ;
  425.         IF      MULTI   ;INITIALIZE 8251
  426.         XRA     A
  427.         OUT     MODS
  428.         OUT     MODS
  429.         OUT     MODS
  430.         MVI     A,40H
  431.         OUT     MODS
  432.         MVI     A,0CFH  ;300 BAUD (THIS DEPENDS ON STRAPPING)
  433.         OUT     MODS
  434.         MVI     A,37H
  435.         OUT     MODS
  436.         ENDIF
  437. ;
  438. ;
  439. CONT:   XRA     A       ;CLEAR CHAR BUFFERS
  440.         STA     INCH
  441.         STA     OUTCH
  442.         STA     FLAG    ;CLEAR TEXT SAVE FLAG
  443.         LXI     H,TBUF  ;SET PTR TO TBUF
  444.         SHLD    PTR
  445.         LXI     H,0     ;SIZE = 0
  446.         SHLD    SIZE
  447.         LXI     H,LINKMS  ;PRINT SIGN-ON MESSAGE
  448.         CALL    WCS
  449. ;
  450. ;MAIN LOOP
  451. ;
  452. LINK3:  CALL    CITEST  ;JUMP IF NO DATA FROM CONSOLE
  453.         JZ      LINK4
  454.         CALL    RCC     ;ELSE READ CONSOLE DATA
  455.         CPI     20H
  456.         CC      PCC     ;CALL PCC IF CONTROL CHAR
  457.         JC      LINK4   ;JUMP IF PCC HANDLED CHAR
  458.         ORI     80H     ;ELSE SET VALID DATA BIT
  459.         STA     INCH    ;AND STORE IN INPUT CHAR BUFFER
  460. ;
  461. LINK4:  LDA     OUTCH   ;JUMP IF NO DATA FOR CONSOLE
  462.         ORA     A
  463.         JP      LINK5
  464.         ANI     7FH     ;ELSE DISCARD VALID DATA BIT
  465.         CALL    WCC     ;SEND CHAR TO CONSOLE
  466.         XRA     A       ;THEN CLEAR OUTPUT CHAR BUFFER
  467.         STA     OUTCH
  468. ;
  469. LINK5:  CALL    MITEST  ;JUMP IF NO DATA FROM MODEM
  470.         JZ      LINK6
  471.         CALL    RMC2    ;ELSE READ MODEM DATA
  472.         CALL    SAVE    ;SAVE CHAR IN TEXT BUFFER IF FLAG ON
  473.         ORI     80H     ;SET DATA VALID BIT
  474.         STA     OUTCH   ;STORE IN OUTPUT CHAR BUFFER
  475. ;
  476. LINK6:  CALL    MOTEST  ;JUMP IF MODEM XMIT BUFFER BUSY
  477.         JZ      LINK7
  478.         LDA     INCH    ;JUMP IF NO DATA FOR MODEM
  479.         ORA     A
  480.         JP      LINK7
  481.         ANI     7FH     ;DISCARD VALID DATA BIT
  482. ;
  483.         IF      PORT
  484.         OUT     MODD    ;OUTPUT CHAR TO MODEM
  485.         ENDIF
  486. ;
  487.         IF      APPLE
  488.         STA     MODD    ;OUTPUT CHAR TO MODEM
  489.         ENDIF
  490. ;
  491.         IF      TRSPT
  492.         PUSH    B       ;STORE REGISTERS
  493.         PUSH    H
  494.         PUSH    D
  495.         CALL    WMC     ;SEND CHAR
  496.         POP     D
  497.         POP     H
  498.         POP     B
  499.         ENDIF
  500. ;
  501.         XRA     A       ;...THEN CLEAR INPUT CHAR BUFFER
  502.         STA     INCH
  503. ;
  504. LINK7:  JMP     LINK3   ;END OF MAIN LOOP
  505. ;
  506. LINKMS: DB      CR,LF,'PLINK VER 6.7'
  507.         DB      CR,LF,CR,LF
  508.         DB      '[^T]RANSMIT, [^Y]ANK, [^W]RITE, [^E]XIT, [^C]ANCEL'
  509.         DB      CR,LF,'READY',CR,LF,LF,0
  510. ;
  511. ;PCC - PROCESS CONTROL CHARACTER
  512. ;
  513. PCC:    CPI     'E'-40H ;JUMP OUT IF CTRL E
  514.         JNZ     PCC1
  515.         PUSH    H
  516.         LHLD    SIZE    ; CHECK FOR SOMETHING IN TEXT BUFFER
  517.         MOV     A,L     ; AND GIVE WARNING
  518.         ORA     H
  519.         JZ      PCCEX   ; BEFORE EXIT
  520.         LXI     H,AYS   ;PRINT 'DO YOU WANT TO SAVE...
  521.         CALL    WCS
  522.         POP     H
  523.         CALL    RCC     ;GET ANSWER
  524.         CALL    WCC     ;ECHO IT
  525.         ANI     5FH     ;MAKE UPPER CASE
  526.         CPI     'Y'     ;YES?
  527.         CZ      WTB     ; WRITE OUT BUFFER
  528.         JMP     PCCEX   ;EXIT
  529. ;       CALL    WCCR    ;CRLF
  530. ;       STC             ;TELL PLINK TO IGNORE THIS CHARACTER
  531. ;
  532.         IF      TRSPT
  533.         POP     PSW     ;GOBBLE UP CALL ADDRESS
  534.         JMP     RESET   ;RE-INITIALIZE SIO
  535.         ENDIF
  536. ;
  537.         IF      PORT
  538.         RET
  539.         ENDIF
  540. ;
  541. PCC1:   CPI     'T'-40H ;JUMP IF NOT CONTROL-T
  542.         JNZ     PCC2
  543.         CALL    STF     ;TRANSMIT TEXT FILE TO MODEM
  544.         STC             ;TELL PLINK TO IGNORE THIS CHARACTER
  545.         RET
  546. ;
  547. PCC2:   CPI     'Y'-40H ;JUMP IF NOT CONTROL-Y
  548.         JNZ     PCC3
  549.         LDA     FLAG
  550.         DCR     A       ;WAS IT ZERO?
  551.         JNZ     PCC2A   ;YES
  552.         STA     FLAG    ;NO, WAS 1, NOW 0
  553.         LXI     H,PCMNIX ;PRINT IGNORE INCOMING STUFF
  554.         JMP     PCC2B
  555. ;
  556. PCC2A:  MVI     A,1     ;TURN ON TEXT SAVE FLAG
  557.         STA     FLAG
  558.         LXI     H,PCCMR ;PRINT 'SAVING INCOMING TEXT IN MEMORY'
  559. ;
  560. PCC2B:  CALL    WCS
  561.         STC             ;TELL PLINK TO IGNORE THIS CHARACTER
  562.         RET
  563. ;
  564. PCC3:   CPI     'W'-40H ;JUMP IF NOT CONTROL-W
  565.         JNZ     PCC4
  566.         XRA     A       ;TURN OFF TEXT SAVE FLAG
  567.         STA     FLAG
  568.         CALL    WTB     ;WRITE TEXT BUFFER TO DISK
  569.         STC
  570.         RET
  571. ;
  572. PCC4:   STC             ;LET PLINK HANDLE ALL OTHER CONT. CODES
  573.         CMC
  574.         RET
  575. ;
  576. PCCEX:  LXI     H,DISMS ;PRINT 'MODEM NOT DISCONNECTED'
  577.         CALL    WCS
  578.         JMP     BASE    ;EXIT TO WARM BOOT
  579. ;
  580. AYS:    DB      CR,LF,'DO YOU WANT TO SAVE THE STUFF IN'
  581.         DB      CR,LF,'THE BUFFER BEFORE EXIT TO CP/M (Y OR N)? ',0
  582. ;
  583.         IF      PMMI OR DCH
  584. DISMS:  DB      CR,LF,'DON''T FORGET - THE MODEM '
  585.         DB      'IS NOT DISCONNECTED',CR,LF
  586.         DB      'USE "MODEM D" TO DISCONNECT',0
  587.         ENDIF
  588. ;
  589.         IF      (NOT PMMI) AND (NOT DCH)
  590. DISMS:  DB      CR,LF,'+++ EXIT TO CP/M +++',CR,LF,0
  591.         ENDIF
  592. ;
  593. PCCMR:  DB      CR,LF,'SAVING INCOMING TEXT IN MEMORY',CR,LF,0
  594. PCMNIX: DB      CR,LF,'IGNORING INCOMING TEXT',CR,LF,0
  595. ;
  596. ;STF - SEND TEXT FILE (TO MODEM)
  597. ;
  598. STF:    CALL    GFN     ;GET NAME OF DISK FILE TO SEND
  599.         JC      STF6    ;JUMP IF FILE NAME ERROR
  600.         CALL    OPEN    ;TRY TO OPEN SPECIFIED FILE
  601.         CPI     255     ;JUMP IF FILE NOT FOUND
  602.         JZ      STF7
  603. ;
  604. STF1:   CALL    READ    ;READ NEXT RECORD INTO DBUF
  605.         CPI     1       ;JUMP IF END-OF-FILE
  606.         JZ      STF5
  607.         LXI     H,DBUF  ;POINT TO DISK BUFFER
  608.         MVI     C,128
  609. ;
  610. STF2:   MOV     A,M     ;FETCH NEXT CHAR FROM DBUF
  611.         INX     H
  612.         CPI     'Z'-40H ;JUMP IF END-OF-FILE CHARACTER
  613.         JZ      STF5
  614. ;
  615. OVERL2  CPI     LF      ;IGNORE LINE FEEDS
  616.         JZ      STF4
  617.         CALL    WMC     ;WRITE CHARACTER TO MODEM
  618.         CALL    WCC     ;WRITE CHARACTER TO CONSOLE
  619. ;
  620. OVERL1  CPI     CR      ;JUMP IF NOT CARRIAGE RETURN
  621.         JNZ     STF4
  622. ;
  623. STF3:   CALL    CITEST  ;CHECK CONSOLE DATA READY
  624.         JZ      STF3A   ;NO DATA THERE
  625.         CALL    RCC     ;GET CONSOLE CHARACTER
  626.         CPI     'C'-40H ;CONTROL C ABORTS IT
  627.         JZ      STF8
  628. ;
  629. STF3A:  CALL    MITEST  ;WAIT FOR NEXT MODEM CHARACTER
  630.         JZ      STF3
  631.         CALL    RMC2    ;CHECK MODEM FOR TRIGGER CHAR.
  632. ;
  633. OVERLY  CPI     TRIGGER
  634.         JNZ     STF3
  635.         CALL    WCCR    ;SEND CRLF TO CONSOLE
  636. ;
  637. STF4:   DCR     C       ;LOOP THRU REST OF DBUF
  638.         JNZ     STF2
  639.         JMP     STF1    ;GO GET NEXT RECORD FROM DISK
  640. ;
  641. STF5:   LXI     H,STFSM ;PRINT 'FILE SEND COMPLETE'
  642.         CALL    WCS
  643.         RET
  644. ;
  645. STF6:   LXI     H,STFS1 ;PRINT 'FILE NAME ERROR'
  646.         CALL    WCS
  647.         RET
  648. ;
  649. STF7:   LXI     H,STFS2 ;PRINT 'FILE NOT FOUND'
  650.         CALL    WCS
  651.         RET
  652. ;
  653. STF8:   LXI     H,STFSA ;PRINT 'FILE SEND ABORTED'
  654.         CALL    WCS
  655.         RET
  656. ;
  657. STFSM:  DB      'FILE SEND COMPLETE',CR,LF,0
  658. STFS1:  DB      'FILE NAME ERROR OR ABORT',CR,LF,0
  659. STFS2:  DB      'FILE NOT FOUND',CR,LF,0
  660. STFSA:  DB      CR,LF,'FILE SEND ABORTED',CR,LF,0
  661. ;
  662. ;SAVE - SAVE CHAR IN TEXT BUFFER IF FLAG ON
  663. ;
  664. ;  ENTRY CONDITIONS
  665. ;     A - CHARACTER TO SAVE
  666. ;
  667. SAVE:   PUSH    PSW
  668.         LDA     FLAG
  669.         ORA     A
  670.         JNZ     SAVE1
  671.         POP     PSW
  672.         RET
  673. ;
  674. SAVE1:  POP     PSW
  675.         CPI     DEL     ;RUBOUT (DEL) ?
  676.         RZ              ;YES, IGNORE IT
  677.         CPI     20H     ;TEST FOR CONTROL CHARACTERS
  678.         JNC     SAVE2   ;JUMP IF NOT CONTROL CHAR.
  679.         CPI     CR      ;ALLOW CR TO BE SAVED
  680.         JZ      SAVE2
  681.         CPI     LF      ;ALLOW LF TO BE SAVED
  682.         JZ      SAVE2
  683.         CPI     TAB     ;ALLOW TAB TO BE SAVED
  684.         JZ      SAVE2
  685.         RET             ;IGNORE ALL OTHER CONTROL CHARS.
  686. ;
  687. SAVE2:  PUSH    H
  688.         LHLD    SIZE    ;SIZE = SIZE + 1
  689.         INX     H
  690.         SHLD    SIZE
  691.         LHLD    PTR
  692.         MOV     M,A
  693.         INX     H
  694.         SHLD    PTR
  695.         PUSH    PSW
  696.         LDA     BASE+7  ;GET SYSTEM SIZE
  697.         SUI     1       ;SO WE DONT CRASH CP/M
  698.         CMP     H       ;ARE WE OUT OF ROOM?
  699.         JZ      SAVEAB  ;YES, ABORT
  700.         SUI     4       ;LEAVE SOME ROOM (1K)
  701.         CMP     H
  702.         MVI     A,WRNSIG  ;SIGNAL CONSOLE RUNNING OUT OF SPACE
  703.         CC      WCC
  704.         POP     PSW
  705.         POP     H
  706.         RET
  707. ;
  708. ;SAVEAB - RAN OUT OF ROOM, ISSUE MESSAGE AND FLOW
  709. ;         THROUGH TO DISK SAVE ROUTINE
  710. ;
  711. SAVEND: DB      BELL,CR,LF,'ABORTING - NO ROOM LEFT',0
  712. ;
  713. SAVEAB: MVI     A,XOFF       ;TELL REMOTE
  714.         CALL    WMC          ;TO STOP SENDING
  715.         LXI     SP,STACK+64  ;REINITIALIZE STACK
  716.         LXI     H,SAVEND  ;PRINT 'ABORTING - NO ROOM LEFT'
  717.         CALL    WCS
  718.         LXI     H,LINK  ;SET UP RETURN ADDRESS
  719.         PUSH    H       ;LEAVE IT ON THE STACK
  720. ;
  721. ;WTB - WRITE TEXT BUFFER TO DISK
  722. ;
  723. WTB:    LHLD    SIZE    ;JUMP IF TEXT BUFFER EMPTY
  724.         MOV     A,L
  725.         ORA     H
  726.         JZ      WTB5
  727.         CALL    GFN     ;GET FILE NAME
  728.         JC      WTB6    ;JUMP IF FILE NAME ERROR
  729.         MVI     C,RESDSK ;RESET IN CASE READ-ONLY
  730.         CALL    BDOS    ;OR ERROR RECOVERY
  731.         CALL    DELT    ;DELETE OLD FILE, IF ANY
  732.         CALL    MAKE    ;MAKE NEW FILE
  733.         LHLD    SIZE    ;DE = TBUF SIZE
  734.         XCHG
  735.         LXI     H,DBUF  ;TOP OF STACK POINTS TO DBUF
  736.         PUSH    H
  737.         LXI     H,TBUF  ;HL POINTS TO TBUF
  738. ;
  739. WTB1:   MVI     C,128   ;DISK BUFFER SIZE
  740. ;
  741. WTB2:   MOV     A,M     ;FETCH NEXT BYTE OF TBUF
  742.         INX     H
  743.         XTHL
  744.         MOV     M,A     ;STORE IN DBUF
  745.         INX     H
  746.         XTHL
  747.         DCX     D       ;SIZE = SIZE - 1
  748.         MOV     A,D     ;EXIT LOOP IF SIZE = 0
  749.         ORA     E
  750.         JZ      WTB3
  751.         DCR     C       ;LOOP UNTIL DBUF FULL
  752.         JNZ     WTB2
  753.         CALL    WRITE   ;WRITE FULL DBUF TO DISK
  754.         CPI     00H     ;DID WE HAVE AN ERROR?
  755.         JNZ     WRER    ;IF SO, BAIL OUT
  756.         XTHL            ;TOP OF STACK POINTS TO DBUF
  757.         LXI     H,DBUF
  758.         XTHL
  759.         JMP     WTB1    ;LOOP UNTIL END OF TBUF
  760. ;
  761. WTB3:   POP     H       ;HL POINTS TO CURRENT PLACE IN DBUF
  762. ;
  763. WTB4:   MVI     M,'Z'-40H ;STORE EOF CODE
  764.         INX     H
  765.         DCR     C       ;LOOP THRU REST OF DBUF
  766.         JNZ     WTB4
  767.         CALL    WRITE   ;WRITE LAST SECTOR TO DISK
  768.         CPI     00H     ;ERROR?
  769.         JNZ     WRER    ;IF SO HANDLE IT, ELSE
  770.         CALL    CLOSE   ;CLEAN UP ACT AND GO HOME
  771.         LXI     H,TBUF  ;CLEAR TEXT BUFFER
  772.         SHLD    PTR
  773.         LXI     H,0
  774.         SHLD    SIZE
  775.         LXI     H,WTBSM ;PRINT 'BUFFER SAVED ON DISK'
  776.         CALL    WCS
  777.         RET
  778. ;
  779. WRER:   LXI     H,WRERMS
  780.         CALL    WCS     ;PRINT ERROR MESSAGE
  781.         JMP     WTB     ;AND START OVER
  782. ;
  783. WTB5:   LXI     H,WTBS1 ;PRINT 'TEXT BUFFER EMPTY'
  784.         CALL    WCS
  785.         RET
  786. ;
  787. WTB6:   LXI     H,WTBS2 ;PRINT 'FILE NAME ERROR'
  788.         CALL    WCS
  789.         RET
  790. ;
  791. WTBSM:  DB      CR,LF,'BUFFER SAVED ON DISK',CR,LF
  792.         DB      'MEMORY SAVE CANCELLED',CR,LF,0
  793. WTBS1:  DB      'TEXT BUFFER EMPTY',CR,LF,0
  794. WTBS2:  DB      'FILE NAME ERROR OR ABORT',CR,LF,0
  795. WRERMS: DB      'ERROR WRITING DATA',CR,LF,'(DISK FULL)',CR,LF
  796.         DB      'PLEASE CHANGE DISK OR USE ANOTHER DRIVE',CR,LF
  797.         DB      'AND REENTER:',CR,LF,0
  798. ;
  799. ;WCS - WRITE CONSOLE STRING
  800. ;
  801. ;  ENTRY CONDITIONS
  802. ;     HL - POINTS TO STRING (TERM BY ZERO BYTE)
  803. ;
  804. WCS:    MOV     A,M
  805.         INX     H
  806.         ORA     A
  807.         RZ
  808.         CALL    WCC
  809.         JMP     WCS
  810. ;
  811. ;WCCR - WRITE CONSOLE CARRIAGE RETURN (AND LINE FEED)
  812. ;
  813. WCCR:   MVI     A,CR
  814.         CALL    WCC
  815.         MVI     A,LF
  816. ;
  817. ;WCC - WRITE CONSOLE CHARACTER
  818. ;
  819. ;  ENTRY CONDITIONS:
  820. ;     A - CHARACTER TO WRITE
  821. ;
  822. WCC:    PUSH    PSW
  823.         PUSH    B
  824.         PUSH    D
  825.         PUSH    H
  826.         MOV     C,A     ;GET CHARACTER FOR CBIOS
  827. WCCAL:  CALL    $-$     ;MODIFIED BY INIT.
  828.         POP     H
  829.         POP     D
  830.         POP     B
  831.         POP     PSW
  832.         RET
  833. ;
  834. ;RCS - READ CONSOLE STRING (WITH ECHO)
  835. ;
  836. ;  EXIT CONDITIONS
  837. ;     B - NUMBER OF CHARACTERS READ (<255)
  838. ;    HL - POINTS TO LAST CHAR STORED (CR)
  839. ;
  840. RCS:    LXI     H,IBUF
  841.         MVI     B,0
  842. ;
  843. RCS1:   CALL    RCC     ;READ NEXT CHAR FROM CONSOLE
  844.         CPI     DEL     ;JUMP IF NOT DEL
  845.         JNZ     RCS2
  846.         INR     B       ;IGNORE DEL IF IBUF ALREADY EMPTY
  847.         DCR     B
  848.         JZ      RCS1
  849.         DCX     H       ;ELSE DISCARD LAST CHAR
  850. ;
  851.         IF  NOT APPLE   ;FOR APPLE SKIP NEXT AND
  852.                         ;SEND DEL TO CONSOLE
  853.         MOV     A,M     ;ECHO DISCARDED CHAR TO CONSOLE
  854.         ENDIF
  855.         CALL    WCC
  856.         DCR     B       ;DECREMENT COUNT
  857.         JMP     RCS1    ;       AND LOOP
  858. ;
  859. RCS2:   CPI     'U'-40H ;JUMP IF NOT CONTROL U
  860.         JNZ     RCS3
  861.         CALL    WCCR    ;ELSE ABORT CURRENT LINE
  862.         JMP     RCS     ;       AND START OVER
  863. ;
  864. RCS3:   CALL    WCC     ;ECHO CHAR TO CONSOLE
  865.         MOV     M,A     ;STORE CHAR IN IBUF
  866.         INR     B       ;INCREMENT COUNT
  867.         CPI     CR      ;JUMP IF CARRIAGE RETURN
  868.         JZ      RCS4
  869.         INX     H       ;ELSE ADVANCE POINTER
  870.         JMP     RCS1    ;       AND LOOP
  871. ;
  872. RCS4:   MVI     A,LF    ;ISSUE LINE FEED AND RETURN
  873.         CALL    WCC
  874.         RET
  875. ;
  876. ;RCC - READ CONSOLE CHARACTER
  877. ;
  878. ;  EXIT CONDITIONS
  879. ;     A - CHARACTER READ
  880. ;
  881. RCC:    PUSH    B
  882.         PUSH    D
  883.         PUSH    H
  884. RCCAL:  CALL    $-$     ;MODIFIED BY INIT.
  885.         POP     H
  886.         POP     D
  887.         POP     B
  888.         RET
  889. ;
  890. ;WMC - WRITE MODEM CHARACTER
  891. ;
  892. ;  ENTRY CONDITIONS
  893. ;     A - CHARACTER TO WRITE
  894. ;
  895. ;
  896.         IF      PORT
  897. WMC:    PUSH    PSW
  898. ;
  899. WMCL:   IN      MODS
  900.         XRI     MXOR
  901.         ANI     MTBE
  902.         JNZ     WMCL
  903.         POP     PSW
  904.         ANI     7FH     ;STRIP PARITY BIT
  905.         OUT     MODD
  906.         RET
  907.         ENDIF
  908. ;
  909.         IF      TRSPT
  910. WMC:    PUSH    H
  911.         PUSH    D
  912.         PUSH    PSW
  913. ;
  914. WMCL:   CALL    MOTEST  ;TEST STATUS
  915.         JZ      WMCL    ;LOOP TILL TX EMPTY
  916.         POP     PSW     ;RESTORE CHAR
  917.         ANI     7FH     ;STRIP PARITY
  918.         PUSH    B       ;STORE B
  919.         MOV     C,A     ;PUT CHAR INTO C
  920.         MVI     B,00H   ;CHANNEL A
  921.         LXI     H,WMCRE ;STORE RETURN ADDRESS
  922.         PUSH    H
  923.         LHLD    BASE+1  ;GET BASE ADDRESS
  924.         LXI     D,SIOOUT
  925.         DAD     D
  926.         PCHL            ;JUMP TO IT
  927. ;
  928. WMCRE:  POP     B       ;RESTORE IT
  929.         POP     D
  930.         POP     H
  931.         RET
  932.         ENDIF
  933. ;
  934.         IF      APPLE
  935. WMC     PUSH    PSW
  936. WMCL    LDA     MODS
  937.         ANI     MTBE
  938.         JZ      WMCL
  939.         POP     PSW
  940.         ANI     07FH
  941.         STA     MODD
  942.         RET
  943.         ENDIF
  944. ;
  945. ;RMC - READ MODEM CHARACTER
  946. ;
  947. ;  EXIT CONDITIONS:
  948. ;     A - CHARACTER READ
  949. ;
  950. ;
  951.         IF      PORT
  952. RMC:    IN      MODS
  953.         XRI     MXOR
  954.         ANI     MRDA
  955.         JNZ     RMC
  956. ;
  957. RMC2:   IN      MODD
  958.         ANI     7FH
  959.         RET
  960.         ENDIF
  961. ;
  962.         IF      TRSPT
  963. RMC:    CALL    MITEST  ;CHAR AVAILABLE
  964.         JZ      RMC     ;LOOP IF NOT READY
  965. ;
  966. RMC2:   PUSH    B       ;STORE B
  967.         PUSH    D
  968.         PUSH    H
  969.         MVI     B,00H   ;CHANNEL A
  970.         LXI     H,RMCRE ;RETURN ADDRESS
  971.         PUSH    H
  972.         LHLD    1
  973.         LXI     D,SIOINP
  974.         DAD     D
  975.         PCHL
  976. ;
  977. RMCRE:  POP     H
  978.         POP     D
  979.         POP     B
  980.         ANI     7FH     ;STRIP PARITY
  981.         RET
  982.         ENDIF
  983. ;
  984.         IF      APPLE
  985. RMC:    LDA     MODS
  986.         ANI     MRDA
  987.         JZ      RMC
  988. RMC2:   LDA     MODD
  989.         ANI     07FH
  990.         RET
  991.         ENDIF
  992. ;
  993. ;GFN - GET FILE NAME
  994. ;
  995. GFN:    LXI     H,GFNSD ;PRINT 'WHICH DRIVE?'
  996.         CALL    WCS
  997.         CALL    RCC     ;GET ANSWER FROM CONSOLE
  998.         CALL    WCC     ;ECHO IT TO CONSOLE
  999.         ANI     5FH     ;MAKE UPPER CASE
  1000.         CPI     'C'-40H ;^C MEANS ABORT
  1001.         JZ      GFN6
  1002.         SUI     'A'-1
  1003.         JC      GFN     ;REQUIRE ALPHABETIC
  1004.         JZ      GFN
  1005.         CPI     17      ;ALLOW 16 DRIVES (AS IN CP/M 2.X)
  1006.         JNC     GFN
  1007.         STA     FCB
  1008. ;
  1009. GFNB:   LXI     H,GFNS1 ;PRINT 'FILENAME? '
  1010.         CALL    WCS
  1011.         CALL    RCS     ;READ RESPONSE INTO IBUF
  1012.         LXI     H,FCB+FN  ;BLANK FILL FN AND FT FIELDS
  1013.         MVI     C,11
  1014. ;
  1015. GFN1:   MVI     M,' '
  1016.         INX     H
  1017.         DCR     C
  1018.         JNZ     GFN1
  1019.         LXI     H,IBUF  ;POINT TO INPUT BUFFER
  1020.         LXI     D,FCB+FN  ;SCAN OFF FN FIELD
  1021.         MVI     C,9
  1022. ;
  1023. GFN2:   MOV     A,M     ;FETCH NEXT CHAR FROM IBUF
  1024.         INX     H
  1025.         CPI     61H     ;IF LC, CONVERT TO UC
  1026.         JC      GFN2A
  1027.         SUI     20H
  1028. ;
  1029. GFN2A:  CPI     CR      ;JUMP IF END OF LINE
  1030.         JZ      GFN5
  1031.         CPI     '.'     ;JUMP IF END OF NAME
  1032.         JZ      GFN3
  1033.         STAX    D       ;ELSE STORE CHAR IN FN FIELD
  1034.         INX     D
  1035.         DCR     C       ;LOOP IF 8 OR LESS CHARS SO FAR
  1036.         JNZ     GFN2
  1037.         JMP     GFN6    ;ELSE TAKE ERROR EXIT
  1038. ;
  1039. GFN3:   LXI     D,FCB+FT  ;SCAN OFF FT FIELD
  1040.         MVI     C,4
  1041. ;
  1042. GFN4:   MOV     A,M     ;FETCH NEXT CHAR FROM IBUF
  1043.         INX     H
  1044.         CPI     61H     ;IF LC, CONVERT TO UC
  1045.         JC      GFN4A
  1046.         SUI     20H
  1047. ;
  1048. GFN4A:  CPI     CR      ;JUMP IF END OF LINE
  1049.         JZ      GFN5
  1050.         STAX    D       ;ELSE STORE CHAR IN FT FIELD
  1051.         INX     D
  1052.         DCR     C       ;LOOP IF 3 OR LESS CHARS SO FAR
  1053.         JNZ     GFN4
  1054.         JMP     GFN6    ;ELSE TAKE ERROR EXIT
  1055. ;
  1056. GFN5:   XRA     A
  1057.         STA     FCB+EX  ;SET EXTENT NUMBER TO ZERO
  1058.         STA     FCB+NR  ;SET RECORD NUMBER TO ZERO
  1059.         STC             ;CLEAR ERROR FLAG AND RETURN
  1060.         CMC
  1061.         RET
  1062. ;
  1063. GFN6:   STC             ;SET ERROR FLAG AND RETURN
  1064.         RET
  1065. ;
  1066. GFNSD:  DB      CR,LF,'WHICH DRIVE? ',0
  1067. GFNS1:  DB      CR,LF,'FILENAME? ',0
  1068. ;
  1069. ;OPEN - OPEN DISK FILE
  1070. ;
  1071. OPEN:   PUSH    H
  1072.         PUSH    D
  1073.         PUSH    B
  1074.         LXI     D,FCB
  1075.         MVI     C,OFFC
  1076.         CALL    BDOS
  1077.         POP     B
  1078.         POP     D
  1079.         POP     H
  1080.         RET
  1081. ;
  1082. ;READ - READ RECORD FROM DISK FILE
  1083. ;
  1084. READ:   PUSH    H
  1085.         PUSH    D
  1086.         PUSH    B
  1087.         LXI     D,FCB
  1088.         MVI     C,RRFC
  1089.         CALL    BDOS
  1090.         POP     B
  1091.         POP     D
  1092.         POP     H
  1093.         RET
  1094. ;
  1095. ;CLOSE - CLOSE DISK FILE
  1096. ;
  1097. CLOSE:  PUSH    H
  1098.         PUSH    D
  1099.         PUSH    B
  1100.         LXI     D,FCB
  1101.         MVI     C,CFFC
  1102.         CALL    BDOS
  1103.         POP     B
  1104.         POP     D
  1105.         POP     H
  1106.         RET
  1107. ;
  1108. ;DELT - DELETE DISK FILE
  1109. ;
  1110. DELT:   PUSH    H
  1111.         PUSH    D
  1112.         PUSH    B
  1113.         LXI     D,FCB
  1114.         MVI     C,DFFC
  1115.         CALL    BDOS
  1116.         POP     B
  1117.         POP     D
  1118.         POP     H
  1119.         RET
  1120. ;
  1121. ;WRITE - WRITE RECORD TO DISK
  1122. ;
  1123. WRITE:  PUSH    H
  1124.         PUSH    D
  1125.         PUSH    B
  1126.         LXI     D,FCB
  1127.         MVI     C,WRFC
  1128.         CALL    BDOS
  1129.         POP     B
  1130.         POP     D
  1131.         POP     H
  1132.         RET
  1133. ;
  1134. ;MAKE - MAKE NEW DISK FILE
  1135. ;
  1136. MAKE:   PUSH    H
  1137.         PUSH    D
  1138.         PUSH    B
  1139.         LXI     D,FCB
  1140.         MVI     C,MFFC
  1141.         CALL    BDOS
  1142.         POP     B
  1143.         POP     D
  1144.         POP     H
  1145.         RET
  1146. ;
  1147. ;CITEST - CHECK CONSOLE INPUT STATUS
  1148. ;
  1149. CITEST: PUSH    B
  1150.         PUSH    D
  1151.         PUSH    H
  1152. CITCAL: CALL    $-$     ;MODIFIED BY INIT.
  1153.         ORA     A       ;SET ZERO FLAG
  1154.         POP     H
  1155.         POP     D
  1156.         POP     B
  1157.         RET             ;ZERO FLAG CARRIES ANSWER
  1158. ;
  1159. ;MITEST - CHECK MODEM INPUT STATUS
  1160. ;
  1161.         IF      PORT
  1162. MITEST: IN      MODS    ;GET MODEM UART STATUS
  1163.         XRI     MXOR    ;INVERT HIGH-TRUE BITS
  1164.         ANI     MRDA    ;ANY DATA AVAILABLE?
  1165.         MVI     A,0
  1166.         JNZ     MITST1
  1167.         CMA
  1168. ;
  1169. MITST1: ORA     A
  1170.         RET             ;ZERO FLAG CARRIES ANSWER
  1171.         ENDIF
  1172. ;
  1173.         IF      TRSPT
  1174. ;
  1175. MITEST: PUSH    B
  1176.         PUSH    H
  1177.         PUSH    D
  1178.         MVI     B,00    ;CHANNEL A
  1179.         LXI     H,MITSTR
  1180.         PUSH    H
  1181.         LHLD    BASE+1
  1182.         LXI     D,SIOTST
  1183.         DAD     D
  1184.         PCHL
  1185. ;
  1186. MITSTR: POP     D
  1187.         POP     H
  1188.         ANI     01      ;TX EMPTY
  1189.         POP     B
  1190.         RET             ;ZERO FLAG HOLDS THE ANSWER
  1191.         ENDIF
  1192. ;
  1193.         IF      APPLE
  1194. MITEST  LDA     MODS
  1195.         ANI     MRDA
  1196.         RET
  1197.         ENDIF
  1198. ;
  1199. ;MOTEST - CHECK MODEM OUTPUT STATUS
  1200. ;
  1201.         IF      PORT
  1202. MOTEST: IN      MODS    ;GET MODEM UART STATUS
  1203.         XRI     MXOR    ;INVERT HIGH-TRUE BITS
  1204.         ANI     MTBE    ;UART READY FOR CHARACTER?
  1205.         MVI     A,0
  1206.         JNZ     MOTST1  ;ZERO FLAG CARRIES ANSWER
  1207.         CMA
  1208. ;
  1209. MOTST1: ORA     A       ;SET ZERO FLAG IF READY
  1210.         RET
  1211.         ENDIF
  1212. ;
  1213.         IF      TRSPT
  1214. MOTEST: PUSH    B
  1215.         PUSH    H
  1216.         PUSH    D
  1217.         MVI     B,00    ;CHANNEL A
  1218.         LXI     H,MOTSTR
  1219.         PUSH    H
  1220.         LHLD    1
  1221.         LXI     D,SIOTST
  1222.         DAD     D
  1223.         PCHL
  1224. ;
  1225. MOTSTR: ANI     02      ;BUFFER EMPTY
  1226.         POP     D
  1227.         POP     H
  1228.         POP     B
  1229.         RET
  1230.         ENDIF
  1231. ;
  1232.         IF      APPLE
  1233. MOTEST  LDA     MODS
  1234.         ANI     MTBE
  1235.         RET
  1236.         ENDIF
  1237. ;
  1238.         IF      MNET
  1239.         LDA     OVERL1+1
  1240.         CPI     00H     ;IF NOT UPLOAD THEN SKIP IT
  1241.         RNZ
  1242.                         ;THIS ROUTINE ALLOWS
  1243. CKXOFF: PUSH    H       ;MICRONET X-OFF/XON
  1244.         LXI     H,2751  ;TO WORK CORRECTLY
  1245. MS8:    DCX     H       ;33 MSEC DELAY
  1246.         MOV     A,L
  1247.         ORA     H
  1248.         JNZ     MS8
  1249.         POP     H
  1250.         CALL    MITEST
  1251.         RZ
  1252.         CALL    RMC2
  1253.         CPI     XOFF    ;IF NOT X-OFF
  1254.         RNZ             ;THEN CONTINUE
  1255. WAITON: CALL    MITEST  ;ELSE WAIT FOR X-ON
  1256.         JZ      WAITON
  1257.         CALL    RMC2    ;GOT SOMETHING
  1258.         CPI     XON     ;IS IT X-ON?
  1259.         RZ              ;IF SO, WE'RE THROUGH WAITING
  1260.         CPI     01H     ;CTL-A SAME AS X-ON
  1261.         RZ
  1262.         CALL    WCC     ;IF IT WAS NOT AN X-ON
  1263.         JP      WAITON  ;THEN WRITE TO CONSOLE
  1264.         ENDIF           ;AND WAIT SOME MORE
  1265. ;
  1266. ;
  1267. ;DATA AREA
  1268. ;
  1269. INCH:   DS      1       ;INPUT CHAR BUFFER (TO CYBER)
  1270. OUTCH:  DS      1       ;OUTPUT CHAR BUFFER (FROM CIBER)
  1271. STACK:  DS      80      ;LOCAL STACK
  1272. IBUF:   DS      256     ;INPUT BUFFER
  1273. ;
  1274. ;TEXT BUFFER
  1275. ;
  1276. FLAG:   DS      1       ;TEXT SAVE FLAG
  1277. PTR:    DS      2       ;TEXT BUFFER POINTER
  1278. SIZE:   DS      2       ;TEXT BUFFER SIZE
  1279. TBUF:   EQU     $       ;START OF TEXT BUFFER
  1280. ;
  1281.         END
  1282.