home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols100 / vol117 / mdm705p.asm < prev    next >
Encoding:
Assembly Source File  |  1994-07-13  |  135.6 KB  |  6,260 lines

  1.     TITLE    'MDM705 (02/27/83)  --  CP/M MODEM PROGRAM'
  2. ;
  3. ; THIS PROGRAM  ORIGINATED  IN 1977.  WRITTEN  BY WARD CHRISTENSEN, IT
  4. ; HAS SINCE UNDERGONE  EXTENSIVE REVISIONS.  SO MANY PEOPLE HAVE ADDED
  5. ; USEFUL FEATURES IT WOULD  BE DIFFICULT TO LIST THEM ALL.  OTHER VER-
  6. ; SIONS OF THE  ORIGINAL PROGRAM  HAVE BEEN MADE, THIS ONE CATERING TO
  7. ; THOSE USING THE 'PMMI' AUTO-DIALING S-100 MODEM.  THOSE HAVING OTHER
  8. ; MODEMS CAN READILY USE IT, LOSING ONLY THE AUTO-DIALING FEATURE.  BE
  9. ; CAREFUL TO SET THE PORTS AND OTHER OPTIONS CORRECTLY.  OVERLAYS HAVE
  10. ; BEEN MADE ALLOWING RAPID ADAPTATION TO COMPUTERS NOT USING THE S-100
  11. ; BUS.  IT CONFORMS READILY TO NORMAL UARTS AND OTHER I/O DEVICES SUCH
  12. ; AS THE 2661, 8250, 8251, ETC.
  13. ;
  14. ;   NOTE:  If upgrading this program, please add modest comments that
  15. ;       describe the changes and the date they were made.  Then send
  16. ;       to TCBBS in Dearborn (313) 846-6127.
  17. ;
  18. ;   GENERAL INTEREST:  When transferring files modem-to-modem, the batch
  19. ;   mode is extremely useful.  It not only speeds things up, but there
  20. ;   is no timeout at the receiving end while the other person prepares
  21. ;   to send.  With normal single program transfer, the receiving end
  22. ;   switches to checksum in one minute and times out completely in 100
  23. ;   seconds.  This offers ample opportunity to transfer programs between
  24. ;   individuals.  Remember the batch mode can be used for single files
  25. ;   or with wildcards.  Many outstanding optional features have been
  26. ;   added by various people throughout its development.  Our thanks to
  27. ;   all those who have - and will - contribute.
  28. ;                    - Irv Hoff, W6FFC
  29. ;
  30. ;***********************************************************************
  31. ;
  32. ; 830326:0825
  33. ;        Delay between dialled numbers increased from 2 to 8 units
  34. ;  MDM705P  for use with old 416-48x-xxxx exchange that gets lost if
  35. ;           one dials too fast.
  36. ;        Various magic numbers in Break and Dialler routines replaced
  37. ;        with appropriate equates (mods NOT marked).
  38. ;           Option PAR added for the PMMI-only section to toggle the
  39. ;        terminal mode between 8 bits no parity (default) and 7 bits
  40. ;           even parity as required by dear old primitive IBM front end.
  41. ;                    - Greg Louis
  42. ;
  43. ; 02/27/83  'V' mode corrected.  When CTL-B is used to change Baudrate
  44. ;        on-the-fly, the Baudrate remains the same when going to-from
  45. ;  MDM705   the "T" mode now.  (Previously it would often ignore CTL-B
  46. ;        entirely if the "T" mode had been selected with no Baudrate
  47. ;        included, leading to notices regarding "flakey operation".)
  48. ;        Thanks to Frank Gaude'.  Deleted some superfluous coding.
  49. ;        Fixed quiet mode timing for suitable use with "BYE", etc.
  50. ;                    - Irv Hoff
  51. ;
  52. ; 02/13/83  1. 'D' option (if PMMI) auto-disconnects the phone line at
  53. ;          the end of a transfer if included in command.  (Pre-
  54. ;          viously said "Press return to disconnect").
  55. ;  MDM704   2. Added an 'X' option that auto-disconnects at the end of
  56. ;          a transfer and jumps to 'BYEBYE' which reboots back to
  57. ;          CP/M.  Does a cold boot if CLDBOOT has been entered.
  58. ;        3. Fixed the "quiet mode" so that only those messages which
  59. ;          can interfere with the BYE protocol are suppressed.
  60. ;                    - R. L. Plouffe    
  61. ;
  62. ; 02/07/83  Reworked the "quiet" mode (used in conjunction with "BYE" on
  63. ;           some occasions for batch mode, etc.)  Protection added for
  64. ;  MDM703   quiet mode to insure returning to command prompt after file
  65. ;           transfer even if "T" was inadvertently selected.  Added nor-
  66. ;        mal method of changing user area as well as with LOG.  Other
  67. ;        modest changes.  Thanks to Frank Gaude' for suggestions and
  68. ;        testing.            - Irv Hoff
  69. ;
  70. ; 01/27/83  Rstores original drive and user area when returning to CP/M.
  71. ;        Reorganized the PMMI dialing section, fixing several long-
  72. ;  MDM702   standing bugs in the auto-redialing system.  Also can now
  73. ;        (finally) auto-redial off the menu command line, including
  74. ;        ringback numbers.  Number of dialing attempts now displayed.
  75. ;        Added triple protection against inadvertently erasing all
  76. ;        files on a disk with improper use of "*" or "?" wildcards.
  77. ;        Batch mode rejected except when using "S" or "R".  If send-
  78. ;        ing a file in "T" mode (via CTL-T), line feeds are displayed
  79. ;        but not sent.  Line delays are triggered from CR characters.
  80. ;                    - Irv Hoff
  81. ;
  82. ; 01/10/83  Added some of the features in the current COMM 7.13 version.
  83. ;        It is now simple to abort while in send or receive.  Clock
  84. ;  MDM701   speeds up to 25.5 MHz may be used, in 0.1 MHz increments.
  85. ;        Several glitches fixed.  Particular thanks to Frank Gaude'
  86. ;        for permission to adapt some of his routines, plus his help
  87. ;        and continued interest.    - Irv Hoff
  88. ;
  89. ; 01/01/83  First version.  This is similar to MODEM 7.98 but with the
  90. ;        macro library now integral in the program.  It assembles via
  91. ;  MDM700   ASM or MAC as well as with other popular assemblers.   Those
  92. ;        contributing heavily to recent development leading to MODEM
  93. ;        7.98 were Bruce Ratoff, Paul Kelley, Frank Gaude', Mark Pul-
  94. ;        ver, Bob Plouffe and myself.  Many others have made large
  95. ;        contributions in previous years.  MDM700 was selected as a
  96. ;        name to commence a new series of version numbers.  This also
  97. ;        can readily be placed on data bank systems that limit file
  98. ;        names to a total of 6 characters.
  99. ;                    - Irv Hoff
  100. ;
  101. ;***********************************************************************
  102. ;
  103. ;
  104. TRUE        EQU    0FFH
  105. FALSE        EQU    0
  106. ;
  107. ;
  108. DBUFSIZ:    EQU    16    ;buffer size for file transfer in Kbytes
  109. ;
  110. ERRCRC:        EQU    6    ;number of times to try CRC mode..
  111.                 ;..before switching to CHECKSUM
  112. ;
  113. ; PMMI EQUATES  (The first 8 lines are also of particular interest to
  114. ; non-PMMI users.)
  115. ;
  116. PORT:        EQU    0C0H    ;*PMMI base address (0C0H is typical)
  117. ;
  118. MODCTLP:    EQU    PORT    ;modem control port
  119. MODDATP:    EQU    PORT+1    ;*modem data port
  120. BAUDRP:        EQU    PORT+2    ;modem baud rate port
  121. MODCTL2:    EQU    PORT+3    ;modem 2nd control port
  122. MODRCVB:    EQU    02H    ;modem receive bit (DAV)
  123. MODRCVR:    EQU    02H    ;modem receive ready
  124. MODSNDB:    EQU    01H    ;modem send bit (transmit buffer empty)
  125. MODSNDR:    EQU    01H    ;modem send ready bit
  126. ;
  127. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  128. ;
  129. NOPARMSK:    EQU    10H    ;mask to reset to no parity
  130. EVPARMSK:    EQU    20H    ;mask to set even parity
  131. ODPARMSK:    EQU    0CFH    ;mask to set odd parity
  132. BRKMSK:        EQU    0FBH    ;mask to set break
  133. ERRCDMSK:    EQU    38H    ;mask to block all bits but error codes
  134. FRMER:        EQU    20H     ;mask for framing error
  135. ORUNER:        EQU    10H    ;mask for overrun error
  136. PARER:        EQU    08H    ;mask for parity error
  137. ;
  138. ANSWMOD:    EQU    1EH    ;answer mode
  139. ORIGMOD:    EQU    1DH    ;originate mode
  140. ORIG7E        EQU    29H    ;orig mode, 7 bits, even parity
  141. BDNMCH:        EQU    75H    ;bad name match
  142. LIBLEN:        EQU    34    ;length of each phone library entry
  143. RUB:        EQU    7FH    ;rub
  144. WAITCTS:    EQU    100    ;number of seconds (x5) to wait for the
  145.                 ;computer to answer after PMMI auto-dial
  146.                 ;100=20 sec, 150=30 sec, 255=51 sec.
  147.                 ;any number 0-255 acceptable
  148. CRC:        EQU    'C'    ;requests 'CRC' instead of 'CKSUM'
  149. ESC:        EQU    '['-40H    ;^[ = escape
  150. SOH:        EQU    'A'-40H    ;^A = start of header
  151. EOT:        EQU    'D'-40H    ;^D = end of text
  152. ACK:        EQU    'F'-40H    ;^F = acknowledge
  153. OKNMCH:        EQU    'F'-40H    ;^F = ok name match
  154. BELL:        EQU    'G'-40H    ;^G = bell character
  155. BKSP:        EQU    'H'-40H    ;^H = backspace
  156. LF:        EQU    'J'-40H    ;^J = linefeed
  157. CR:        EQU    'M'-40H    ;^M = carriage return
  158. XON:        EQU    'Q'-40H    ;^Q = XON character
  159. XOFF:        EQU    'S'-40H    ;^S = XOFF character
  160. NAK:        EQU    'U'-40H    ;^U = not acknowledge
  161. CAN:        EQU    'X'-40H    ;^X = cancel send or receive
  162. EOFCHAR:    EQU    'Z'-40H    ;^Z = end of file
  163. ;
  164. BOTTRAM        SET    LAST+100H AND 0FF00H
  165. ;
  166. ;
  167.         ORG    0100H
  168. ;
  169. ;
  170.         JMP    START    ;skip the data area below
  171. ;
  172. ; THESE ROUTINES AND EQUATES ARE AT THE BEGINNING OF THE PROGRAM SO
  173. ; THEY CAN BE PATCHED BY A MONITOR OR OVERLAY FILE WITHOUT RE-ASSEMBLING
  174. ; THE PROGRAM.
  175. ;
  176. PMMIBYTE:    DB    TRUE    ;*true=PMMI modem, false=non-PMMI modem
  177. ;
  178. CLOCK:        DB    40    ;*clock speed x10, up to 25.5 mhz.
  179.                 ;2 MHz=20, 3.68 MH=37, 4 MHz=40, etc.
  180. MSPEED:        DB    1    ;*sets display time for sending a file
  181.                 ;0=110  1=300  2=450  3=600  4=710
  182.                 ;5=1200 6=2400 7=4800 8=9600
  183. BYTDLY:        DB    5    ;default time to send character in
  184.                 ;terminal mode file transfer (0-9)
  185.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  186. CRDLY:        DB    5    ;end-of-line delay after CRLF in terminal
  187.                 ;mode file transfer for slow BBS systems
  188.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  189. NOOFCOL:    DB    5    ;number of directory columns
  190. SETUPTST:    DB    FALSE    ;true=non-PMMI setup routine
  191. SCRNTEST:    DB    TRUE    ;*true=if home cursor and clear screen
  192.                 ;routine at CLRSCRN
  193. BAKUPBYTE:    DB    FALSE    ;true=make .BAK file
  194. CKSUMDFLT:    DB    FALSE    ;true=default to Checksum checking
  195.                 ;*false=default to CRC checking
  196. TOGGLECRC:    DB    TRUE    ;true=allow toggling of Checksum to CRC
  197. CONVBKSP:    DB    FALSE    ;true=convert backspace to rub
  198. TOGGLEBK:    DB    TRUE    ;true=allow toggling of bksp to rub
  199. ADDLF:        DB    FALSE    ;true=add LF after CR
  200. TOGGLELF:    DB    TRUE    ;true=allow toggling of LF after CR
  201. TRANLOGON:    DB    FALSE    ;true=allow transmission of logon
  202.                 ;write logon sequence at location LOGON
  203. SAVCCP:        DB    TRUE    ;true=do not overwrite CCP
  204. LOCONEXTCHR:    DB    FALSE    ;true=local cmd if EXTCHR precedes
  205.                 ;false=not local cmd if EXTCHR precedes
  206. TOGGLELOC:    DB    TRUE    ;true=allow toggling of LOCONEXTCHR
  207. LSTTST:        DB    TRUE    ;*true=allow toggling of printer on/off
  208.                 ;in terminal mode. Set to false if your
  209.                 ;printer can't keep up with the modem
  210. XOFFTST:    DB    FALSE    ;true=allow testing of XOFF from remote
  211.                 ;while sending a file in terminal mode
  212. XONWAIT:    DB    FALSE    ;true=wait for XON aftersending CR while
  213.                 ;transmitting a file in terminal mode    
  214. TOGXOFF:    DB    TRUE    ;true=allow toggling of XOFF testing
  215. EXITCHR:    DB    'E'-40H    ;^E = Exit without disconnect
  216. LOGCHR:        DB    'O'-40H    ;^O = Send logon
  217. LSTCHR:        DB    'P'-40H    ;^P = Toggle printer
  218. UNSAVECHR:    DB    'R'-40H    ;^R = Close input text buffer
  219. TRANCHR:    DB    'T'-40H ;^T = Transmit file to remote
  220. SAVECHR:    DB    'Y'-40H    ;^Y = Open input text buffer
  221. EXTCHR:        DB    '^'-40H    ;^^ = Send next character
  222. ;
  223. ;
  224. ; Equates used only by PMMI routines grouped together here.
  225. ;
  226. PULSERATE:    DB    250    ;125 for 20pps, 250 for 10pps on PMMI
  227.                 ;not used if PMMI FALSE
  228. CLDBOOT:    DW    00000H    ;warm reboot address - put your own
  229.                 ;address for a cold reboot if preferred
  230. BRKCHR:        DB    '@'-40H    ;^@ = Transmit "BREAK" with PMMI
  231. CHGBAUD:    DB    'B'-40H    ;^B = Used with PMMI in terminal
  232.                 ; mode to change baud rate on fly
  233. DISCCHR:    DB    'D'-40H    ;^D = PMMI Disconnect
  234. ;
  235. ;
  236. IN$MODCTLP:    IN    MODCTLP ! RET    ;in modem control port
  237.         DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  238. OUT$MODDATP:    OUT    MODDATP ! RET    ;out modem data port
  239.         DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  240. IN$MODDATP:    IN    MODDATP ! RET    ;in modem data port
  241.         DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  242. ANI$MODSNDB:    ANI    MODSNDB ! RET    ;bit to test for send ready
  243. CPI$MODSNDR:    CPI    MODSNDR ! RET    ;value of send bit when ready
  244. ANI$MODRCVB:    ANI    MODRCVB ! RET    ;bit to test for receive ready
  245. CPI$MODRCVR:    CPI    MODRCVR ! RET    ;value of receive bit when ready
  246. ;
  247. ;
  248. ; THE FOLLOWING ARE TYPICALLY USED ONLY BY PMMI
  249. ;
  250. IN$BAUDRP:    IN    BAUDRP   ! RET    ;in baudrate port
  251. OUT$BAUDRP:    OUT    BAUDRP   ! RET    ;out baudrate port
  252. OUT$MODCTL2:    OUT    MODCTL2  ! RET    ;out modem control port #2
  253. OUT$MODCTLP:    OUT    MODCTLP        ;out modem control port
  254.         STA    UARTCTLB ! RET    ;and store control byte
  255. ;
  256. LOGONPTR:    DW    LOGON
  257. JMP$INITMOD:    JMP    INITMOD
  258. JMP$SETUPR:    JMP    SETUPR
  259. ;
  260. ; MOD(BGL) FOR PARITY SWITCH DURING CONVERSATIONAL TRANSMISSION
  261. PARTY:        DB    ORIGMOD
  262. PARTOG:        DB    ORIGMOD+ORIG7E
  263. ;
  264. ; Clear sequences are for Televideo, Lear Siegler, etc.  Change to match
  265. ; your terminal.  (Heath uses ESC 4AH for clear to end of screen, ESC 45H
  266. ; to clear screen.  Lear Siegler and others use ESC 79H for clear to end
  267. ; of screen and ESC 3AH to clear screen.)  Room allowed for four bytes.
  268. ; (Last zero needed for stopping the string display.  Any extra 0's just
  269. ; act as NOP's.)
  270. ;
  271. CLREOS:        CALL    ILPRT
  272.         DB    'O'-40H,0,0,0,0
  273.         RET
  274. ;.....
  275. ;
  276. ;
  277. CLRSCRN:    CALL    ILPRT
  278.         DB    'L'-40H,0,0,0,0
  279.         RET
  280. ;.....
  281. ;
  282. ;
  283. ; NEXT FIVE LINES SHOULD NOT BE CHANGED BY USER OVERLAY
  284. ;
  285. JMP$ILPRT:    JMP    ILPRT
  286. JMP$INLNCOMP:    JMP    INLNCOMP
  287. JMP$INBUF:    JMP    INBUF
  288. JMP$SYSVER:    JMP    SYSVER
  289. JMP$DIAL:    JMP    DIAL
  290. JMP$DISCONNT:    JMP    DISCONNT
  291. ;
  292. ;    
  293. ; Send version number and date
  294. ;
  295. SYSVER:      LDA    PMMIBYTE    ;USING THE PMMI S-100 MODEM?
  296.       ORA    A
  297.       JZ    SYSVER1        ;GO IF NOT
  298.       CALL    ILPRT
  299.       DB    'Version for PMMI S-100 modem starting at port: ',0
  300.       LDA    IN$MODCTLP+1
  301.       CALL    HEXO        ;PUT IN PMMI CONTROL PORT NUMBER
  302.       CALL    ILPRT
  303.       DB    'H',CR,LF,0
  304.       RET
  305. ;.....
  306. ;
  307. ;
  308. SYSVER1:  CALL    ILPRT        ;IF NOT USING THE PMMI S-100 BOARD
  309.       DB    'Version for Non-PMMI modem',CR,LF,0
  310.       RET
  311. ;.....
  312. ;
  313. ;
  314. ; INSERT YOUR LOGON HERE.  CAN BE ANY LENGTH DESIRED.  MUST END WITH 0.
  315. ;
  316. LOGON:      DB    0
  317. ;
  318. ;
  319. ; INSERT YOUR INITIALIZATION ROUTINE HERE IF NEEDED.  CAN REPLACE THE
  320. ; FOLLOWING SECTION WHICH IS PRESENTLY USED FOR THE PMMI BOARD.
  321. ;
  322. INITMOD:
  323. ;
  324. ;
  325. ; SETS THE BAUD RATE FOR THE PMMI BOARD (IF ONE IS SPECIFIED)
  326. ;
  327. SETBAUD:  LDA    PMMIBYTE
  328.       ORA    A
  329.       RZ            ;IF NOT PMMI S-100 BOARD, IGNORE REST
  330. ;
  331.       LDA    ANSWFLG        ;IF 'O' OR 'A' NOT REQUESTED AND
  332.       ORA    A        ;   BAUDRATE NOT SPECIFIED, RETURNS
  333.       JZ    FIXBAUD        ;   WITH CURRENT MODE AND RATE
  334.       LDA    ORIGFLG        ;IF OPTION REQUESTED, A BLANK FORCES 300
  335.       ORA    A        ;   BAUD AS DOES A NULL FROM NEWBAUD
  336.       RNZ            ;NO CHANGE IF NEITHER 'O' OR 'A' SHOWN
  337. ;
  338. FIXBAUD:  CALL    GETBAUD
  339.       MOV    B,A        ;SAVE THE BAUD RATE VALUE
  340.       CALL    OUT$BAUDRP    ;SET THE PMMI BOARD TO THAT BAUDRATE
  341.       CALL    CHGMSPD        ;GET THE 'MSPEED' VALUE
  342.       MOV    A,C        ;IT COMES BACK IN THE 'C' REG.
  343.       STA    MSPEED        ;SET THE CORRECT 'MSPEED'
  344.       MOV    A,B        ;GET THE BAUD RATE VALUE BACK
  345.       CPI    52
  346.       MVI    A,5FH        ;DTR (FILTER FOR OVER 300 BAUD)
  347.       JC    GT300        ;YES, GREATER THAN
  348.       MVI    A,7FH        ;DTR (FILTER FOR 300 AND LESS BAUD)
  349. ;
  350. GT300:      CALL    OUT$MODCTL2
  351.       STA    MODCTLB        ;SAVE MODEM CONTROL BYTE
  352.       LDA    UARTFLG        ;UART CONROL BYTE FOR 'A' OR 'O'
  353.       ORA    A
  354. ; MOD(BGL)***
  355.       LDA    PARTY        ;GET ORIGINATE MODE
  356.       JZ    OFFHOOK        ;EXIT IF 'O' SET
  357.       MVI    A,ANSWMOD
  358. ;
  359. OFFHOOK:  LXI    H,7500
  360. ;
  361. OFFDLY:   DCR    L
  362.       JNZ    OFFDLY
  363.       DCR    H
  364.       JNZ    OFFDLY
  365.       CALL    OUT$MODCTLP
  366.       RET
  367. ;.....
  368. ;
  369. ;
  370. ;-----------------------------------------------------------------------
  371. ;
  372. ; Phone number library table for PMMI auto-dialing.  Each number must be
  373. ; as long as "LIBLEN" (EQU at start of program).  Some areas require ex-
  374. ; tra characters such as:   1-313-846-7127.  Room is left for those.
  375. ;
  376. ;        '----5---10---15---20---25---30--34'
  377. NUMBLIB:  DB    'A=Amrad...............703-734-1387'    ;'A'
  378.       DB    'B=                                '    ;'B'
  379.       DB    'C=CBBS Pasadena.......213-799-1632'    ;'C'
  380.       DB    'D=PMMI................703-379-0303'    ;'D'
  381.       DB    'E=Edward Huang........415-595-0541'    ;'E'
  382.       DB    'F=                                '    ;'F'
  383.       DB    'G=Gasnet NASA.........301-344-9156'    ;'G'
  384.       DB    'H=Dave Hardy..........313-846-6127'    ;'H'
  385.       DB    'I=Wayne Hammerly......301-953-3753'    ;'I'
  386.       DB    'J=RBBS Pasadena.......213-356-1034'    ;'J'
  387.       DB    'K=Bob Kuhman..........408-732-2433'    ;'K'
  388.       DB    'L=Program Store.......202-337-4694'    ;'L'
  389.       DB    'M=Dick Mead...........213-799-1632'    ;'M'
  390.       DB    'N=Mtn/View PICONET....415-965-4097'    ;'N'
  391.       DB    'O=Bob Plouffe.........703-524-2549'    ;'O'
  392.       DB    'P=Keith Petersen.....313-759-6569R'    ;'P'
  393.       DB    'Q=Bruce Ratoff........201-272-1874'    ;'Q'
  394.       DB    'R=Mark Pulver.........312-789-0499'    ;'R'
  395.       DB    'S=Paul Traina.........408-867-1243'    ;'S'
  396.       DB    'T=TCBBS, Dearborn.....313-846-7127'    ;'T'
  397.       DB    'U=                                '    ;'U'
  398.       DB    'V=                                '    ;'V'
  399.       DB    'W=Ward Christensen....312-545-8086'    ;'W'
  400.       DB    'X=                                '    ;'X'
  401.       DB    'Y=                                '    ;'Y'
  402.       DB    'Z=                                '    ;'Z'
  403.       DB    0                    ;end
  404. ;        '----5---10---15---20---25---30--34'
  405. ;.....
  406. ;
  407. ;
  408. ;***********************************************************************
  409. ;
  410. ; P - R - O - G - R - A - M    S - T - A - R - T - S    H - E - R - E
  411. ;
  412. ;***********************************************************************
  413. ;
  414. ;
  415. START:      POP    H        ;GET THE STACK RETURN TO CCP
  416.       SHLD    EXIT1+1        ;ENABLES RETURN TO CCP
  417.       LXI    SP,STACK    ;START LOCAL STACK
  418.       CALL    ILPRT
  419.       DB    CR,LF,'MDM705 - 02/27/83',CR,LF,0
  420.       CALL    INITADR        ;INITIALIZE ADDRESSES
  421.       CALL    JMP$SYSVER    ;GIVE CONFIGURATION MESSAGE
  422.       CALL    GETUSER        ;GET CURRENT USER NUMBER
  423.       STA    OLDUSER
  424.       MVI    A,TRUE        ;0FFH
  425.       STA    NFILFLG        ;RESET THE NO FILE FLAG TO SHOW NO FILE
  426.       CMA            ;0
  427.       STA    ORIGMOD        ;SET INITIALLY FOR ORIGINATE MODE
  428.       STA    SAVEFLG
  429.       LDA    FCB+1        ;IS THERE A COMMAND TAIL?
  430.       STA    OPTION
  431.       CPI    ' '
  432.       JNZ    START0        ;IF YES, DIGEST IT
  433.       SUB    A
  434.       STA    EXITFLG        ;ELSE SAY WE WANT MENU
  435.       JMP    START1
  436. ;
  437. START0:      LXI    H,80H        ;SIMULATE COMMAND LINE INPUT FROM MENU
  438.       MOV    B,M        ;SAVE CHAR COUNT
  439. ;
  440. STARTA:      INX    H
  441.       MOV    A,M        ;SKIP OVER LEADING SPACES IN COMMAND TAIL
  442.       CPI    ' '
  443.       JNZ    STARTB
  444.       DCR    B
  445.       JMP    STARTA
  446. ;
  447. STARTB:      MOV    A,B
  448.       STA    CMDBUF+1    ;STORE COMMAND CHAR COUNT - LGNG SPACES
  449.       INR    B        ;MOVE 1 EXTRA BYTE (SHOULD BE A NULL)
  450.       LXI    D,CMDBUF+2
  451.       CALL    MOVE
  452.       CALL    SETFCB        ;DIGEST COMMAND LINE AND OPTIONS
  453. ;
  454. START1:      LDA    UARTFLG
  455.       ORA    A
  456.       MVI    A,ANSWMOD
  457.       STA    UARTCTLB
  458.       JNZ    RESTART
  459. ;MOD(BGL)***
  460.       LDA    PARTY
  461.       STA    UARTCTLB
  462. ;
  463. RESTART:  LXI    SP,STACK    ;MAKE SURE WE HAVE A CLEAN STACK
  464.       LXI    D,CMDBUF+1    ;MAY BE USEFUL WHERE WE ARE GOING
  465.       LDA    OPTION        ;GET MAIN OPTION
  466.       MOV    B,A        ;SAVE IT
  467.       LDA    PMMIBYTE    ;PMMI?
  468.       ORA    A        ;SET FLAGS
  469.       MOV    A,B        ;GET OPTION BACK
  470.       JZ    S1        ;NOT PMMI
  471.       CPI    'C'        ;CALL (DIAL) FUNCTION?
  472.       JZ    JMP$DIAL    ;YES, GO TO IT
  473.       CPI    'D'        ;DISCONNECT?
  474.       JZ    DISCON1        ;YES, DISCONNECT & GO MENU
  475. ;
  476. S1:      CPI    ' '        ;NO OPTION SPEC'D?
  477.       JZ    MENU        ;TRUE, GO MENU
  478.       CPI    'H'        ;MENU ASKED FOR?
  479.       JZ    MENU2        ;YES, GO MENU2
  480.       CALL    JMP$INITMOD
  481.       CALL    MOVEFCB
  482.       CALL    IN$MODDATP     ;GOBBLE UP GARBAGE..
  483.       CALL    IN$MODDATP     ;..CHARACTERS ON LINE
  484.       XRA    A
  485.       STA    ECHOFLG        ;RESET ECHO FLAG
  486.       STA    LOCFLG        ;RESET LOCAL FLAG
  487.       LDA    OPTION        ;PROCESS MAIN OPTION
  488.       CPI    'E'        ;ECHO MODE?
  489.       JNZ    NOECH        ;JUMP IF NOT
  490.       MVI    A,TRUE        ;SET ECHO TO TRUE
  491.       STA    ECHOFLG
  492.       JMP    DSKSAVE
  493. ;
  494. NOECH:      CPI    'L'        ;LOCAL ECHO MODE
  495.       JNZ    NOLOC
  496.       MVI    A,TRUE
  497.       STA    LOCFLG
  498.       JMP    DSKSAVE
  499. ;
  500. NOLOC:      CPI    'T'        ;TERMINAL MODE?
  501.       JZ    DSKSAVE        ;YES
  502.       CPI    'S'        ;SEND A FILE?
  503.       JZ    SENDFIL        ;YES
  504.       CPI    'R'        ;RECEIVE A FILE?
  505.       JZ    RCVFIL        ;YES
  506.       CALL    NTVLDMSG    ;SAY NOT A VALID OPTION
  507.       JMP    MENU        ;NO VALID OPTION SPEC'D, GO MENU
  508. ;
  509. ;
  510. ; Revised terminal routine allowing memory save.  First checks for bad
  511. ; options, to prevent wiping out the disk with accidental memory save.
  512. ;
  513. DSKSAVE:  LDA    BATCHFLG    ;BATCH FLAG SET?
  514.       ORA    A
  515.       JNZ    DSKSAVE1
  516.       XRA    A
  517.       STA    BATCHFLG
  518.       JMP    NOTVLD        ;IF YES, ERROR FOR "E", "L" OR "T"
  519. ;
  520. DSKSAVE1: LDA    FCB+1        ;FIRST CHARACTER OF FILENAME (IF ANY)
  521.       CPI    ' '        ;FILE SPECIFIED?
  522.       JNZ    GOODNM        ;YES, GOOD NAME
  523.       MVI    A,TRUE        ;0FFH
  524.       STA    NFILFLG
  525.       CMA
  526.       STA    SAVEFLG
  527.       JMP    TERM
  528. ;...
  529. ;
  530. ;
  531. GOODNM:      CALL    ERASFIL
  532.       CALL    MOVE2
  533.       LXI    D,FCB3
  534.       MVI    C,MAKE
  535.       CALL    BDOS
  536.       LXI    D,FCB3
  537.       MVI    C,OPEN
  538.       CALL    BDOS
  539.       LXI    H,BOTTRAM
  540.       SHLD    HLSAVE
  541.       XRA    A
  542.       STA    NFILFLG        ;SHOW NOW SAVING TO MEMORY FOR DISK FILE
  543.       STA    LISTMOR        ;STOP ANY BUFFERED PRINTER OUTPUT
  544. ;
  545. TERM:      LDA    UARTFLG
  546.       STA    ORIGSAV
  547.       ORA    A
  548.       MVI    A,ANSWMOD
  549.       JNZ    TERM1
  550. ;MOD(BGL)***
  551.       LDA    PARTY        ;GET DEFAULT PARITY
  552. ;
  553. TERM1:      STA    UARTCTLB
  554. ;
  555. TERM2:      LDA    LISTMOR        ;ANY BUFFERED PRINTER OUTPUT?
  556.       ORA    A
  557.       CNZ    GOLIST        ;GO IF SO
  558.       CALL    STAT        ;KEYPRESS?
  559.       JZ    TERML        ;NO, CHECK LINE
  560.       CALL    KEYIN        ;GET CHAR FROM KBD
  561.       CPI    ' '
  562.       JNC    NOTOG        ;GO IF NOT CONTROL CHARACTER
  563.       MOV    B,A        ;SAVE
  564.        CPI    BKSP        ;TEST FOR BACKSPACE
  565.       JNZ    NOBKSP
  566.       LDA    CONVBKSP    ;CONVERT BACKSPACE TO RUB?
  567.       ORA    A
  568.       JZ    NOBKSP        ;GO IF NO CONVERSION
  569.       MVI    A,RUB
  570.       JMP    NOTOG
  571. ;...
  572. ;
  573. ;
  574. NOBKSP:      LDA    EXACFLG
  575.       ORA    A        ;EXACT?
  576.       MVI    A,0
  577.       STA    EXACFLG        ;CLR FOR NEXT TIME
  578.       JZ    NTEXAFLG    ;GO OF EXAFLG FALSE
  579.       LDA    LOCONEXTCHR
  580.       ORA    A        ;SHOULD WE SEND ON EXAFLG?
  581.       MOV    A,B
  582.       JZ    NOTOG        ;YES, IF LOCONEXTCHR FALSE
  583.       LDA    EXTCHR        ;WE WANT TO SEND EXTCHR IN ANY CASE
  584.       CMP    B
  585.       MOV    A,B
  586.       JZ    NOTOG        ;SEND IF EXTCHR
  587.       JMP    LOCCHK        ;OTHERWISE DO LOCAL STUFF
  588. ;...
  589. ;
  590. ;
  591. NTEXAFLG: LDA    EXTCHR        ;TREAT NEXT CHARACTER IN SPECIAL WAY?
  592.       CMP    B
  593.       JZ    EXTFLG        ;YES, SET EXAFLG FOR NEXT CHAR
  594.       LDA    LOCONEXTCHR
  595.       ORA    A        ;SHOULD WE SEND IF NOT EXAFLG
  596.       MOV    A,B
  597.       JNZ    NOTOG        ;YES, IF LOCONEXTCHR TRUE
  598. ;
  599. LOCCHK:      LDA    EXITCHR        ;RETURN TO MENU?
  600.       CMP    B
  601.       JZ    EXITMEN        ;YES, RETURN TO MENU
  602.       LDA    TRANCHR        ;OUTPUT TEXT FILE TO REMOTE?
  603.       CMP    B
  604.       CZ    TRANSFER    ;SEND-A-FILE (BLIND SEND)
  605.       JZ    TERM2        ;LOOP
  606.       LDA    TRANLOGON
  607.       ORA    A
  608.       JZ    SKPLOGON
  609.       LDA    LOGCHR        ;SEND LOGON?
  610.       CMP    B
  611.       JZ    SENDLOG
  612. ;
  613. SKPLOGON: LDA    LSTTST        ;GOING TO USE THE EXTERNAL PRINTER?
  614.       ORA    A
  615.       JZ    NOLST        ;IF NOT, SKIP THIS AREA
  616.       LDA    LSTCHR        ;GET THE PRINTER CONTROL-CHARACTER
  617.       CMP    B        ;DID WE JUST ASK FOR PRINTER CONTROL?
  618.       JNZ    NOLST        ;IF NOT, EXIT
  619.       LDA    LISTFLG        ;OTHERWISE RESET THE PRINTER TOGGLE
  620.       CMA
  621.       STA    LISTFLG        ;AND STORE
  622.       CALL    CRLF        
  623.       CALL    CRLF
  624.       CALL    LSTMSG        ;TELL IF PRINTER IS ON OR OFF NOW
  625.       CALL    CRLF
  626.       JMP    TERML        ;BACK TO THE TERMINAL MODE AGAIN
  627. ;.....
  628. ;
  629. ;
  630. NOLST:      LDA    PMMIBYTE    ;USING A PMMI BOARD?
  631.       ORA    A
  632.       JZ    S2        ;IF NOT, SKIP THE NEXT FEW LINES
  633.       LDA    DISCCHR        ;PMMI DISCONNECT?
  634.       CMP    B
  635.       JZ    DISCON1        ;YES, DISCONNECT & RETURN TO MENU
  636.       LDA    BRKCHR        ;PMMI BREAK?
  637.       CMP    B
  638.       JZ    BREAK
  639.       LDA    CHGBAUD        ;PMMI CHANGE BAUD?
  640.       CMP    B
  641.       PUSH    PSW
  642.       PUSH    H
  643.       CZ    NEWBAUD
  644.         POP    H
  645.       POP    PSW
  646.       JZ    TERML
  647. ;...
  648. ;
  649. ;
  650. S2:      LDA    UNSAVECHR    ;CLOSE INPUT BUFFER?
  651.       CMP    B
  652.       JZ    S2A        ;IF YES, DISABLE COPY
  653.       LDA    SAVECHR        ;OPEN INPUT BUFFER?
  654.       CMP    B
  655.       MOV    A,B        ;RESTORE CHARACTER TYPED
  656.       JNZ    NOTOG
  657.       LDA    NFILFLG        ;DO NOT ALLOW SAVE IF..
  658.       CPI    TRUE        ;..THIS FLAG IS SET.
  659.       JZ    TERML
  660.       MVI    A,TRUE        ;0FFH -- ALLOW COPY INTO FILE
  661.       JMP    S2B
  662. ;
  663. S2A:      MVI    A,FALSE        ;0 -- STOP COPY INTO FILE
  664. ;
  665. S2B:      STA    SAVEFLG
  666.       CALL    BUFMSG
  667.       JMP    TERML
  668. ;.....
  669. ;
  670. ;    
  671. ;***********************************************************************
  672. ;
  673. ; SEND A CP/M FILE
  674. ;
  675. ;***********************************************************************
  676. ;
  677. ;
  678. SENDFIL:  MVI    A,TRUE        ;ALWAYS FORCE CHECKSUM MODE..
  679.       STA    CRCFLAG        ;..INITIALLY ON SEND
  680. ;
  681. SENDFIL1: CALL    PARITY        ;SET PARITY IF REQUESTED
  682.       LDA    BATCHFLG    ;CHECK IF MULTIPLE FILE..
  683.       ORA    A        ;..MODE IS SET.
  684.       JNZ    SENDC1
  685.       MVI    A,TRUE        ;INDICATE SEND FOR BATCH MODE
  686.       STA    SENDFLG
  687.       LDA    FSTFLG        ;IF FIRST TIME THRU..
  688.       ORA    A        ;..SCAN THE COMMAND LINE..
  689.       CNZ    TNMBUF        ;..FOR MULTIPLE NAMES.
  690.       CALL    SENDFN        ;SENDS FILE NAME TO RECEIVER
  691.       JNC    SENDC2        ;CARRY SET MEANS NO MORE FILES.
  692.       MVI    A,'B'        ;STOP BATCH..
  693.       STA    BATCHFLG      ;..MODE OPTION.
  694.       MVI    A,EOT        ;FINAL XFER END
  695.       CALL    SEND
  696.       JMP    DONE
  697. ;.....
  698. ;
  699. ;
  700. SENDC1:      LDA    FCB+1
  701.       CPI    ' '
  702.       JZ    BLKFILE
  703. ;
  704. SENDC2:      CALL    CNREC        ;GET NUMBER OF RECORDS
  705.       CALL    OPENFIL
  706.       MVI    E,100
  707.       CALL    WAITNAK
  708. ;
  709. SENDLP:      CALL    CKABORT        ;WANT TO TERMINATE WHLE SENDING FILE?
  710.       CALL    RDRECD
  711.       JC    SENDEOF
  712.       CALL    INCRRNO
  713.       MVI    A,1
  714.       STA    ERRCT
  715. ;
  716. SENDRPT:  CALL    CKABORT        ;WANT TO TERMINATE WHILE SENDING FILE?
  717.       CALL    SENDHDR
  718.       CALL    SENDREC
  719.       LDA    CRCFLAG
  720.       ORA    A
  721.       CZ    SENDCRC
  722.       CNZ    SENDCKS
  723.       CALL    GETACK
  724.       JC    SENDRPT
  725.       JMP    SENDLP
  726. ;.....
  727. ;
  728. ;
  729. SENDEOF:  MVI    A,EOT
  730.       CALL    SEND
  731.       CALL    GETACK
  732.       JC    SENDEOF
  733.       JMP    DONE
  734. ;.....
  735. ;
  736. ;
  737. ;***********************************************************************
  738. ;
  739. ; RECEIVE A FILE
  740. ;
  741. ;***********************************************************************
  742. ;
  743. ;
  744. RCVFIL:      LDA    CKSUMDFLT    ;GET MODE REQUESTED BY OPERATOR
  745.       STA    CRCFLAG        ;STORE IT
  746. ;
  747. RCVFIL1:  CALL    PARITY        ;SET PARITY IF REQUESTED
  748.       LDA    BATCHFLG    ;USING BATCH TRANSFER?
  749.       ORA    A
  750.       JNZ    RCVC1        ;IF NOT, EXIT
  751.       MVI    A,FALSE        ;FLAG WHERE TO RETURN..
  752.       STA    SENDFLG        ;..FOR NEXT FILE TRANS.
  753.       CALL    GETFN        ;GET THE FILE NAME.
  754.       JNC    RCVC2        ;CARRY SET MEANS NO MORE FILES.
  755.       MVI    A,'B'        ;STOP BATCH..
  756.       STA    BATCHFLG    ;..MODE OPTION.
  757.       JMP    DONE
  758. ;...
  759. ;
  760. ;
  761. RCVC1:      LDA    FCB+1        ;MAKE SURE FILE IS NAMED
  762.       CPI    ' '
  763.       JZ    BLKFILE
  764.       JMP    RCVC3
  765. ;...
  766. ;
  767. ;
  768. RCVC2:      CALL    CKCPM2
  769.       CALL    CKBAKUP
  770. ;
  771. RCVC3:      CALL    ERASFIL
  772.       CALL    MAKEFIL
  773.       LDA    BATCHFLG    ;USING BATCH TRANSFER?
  774.       ORA    A
  775.       JZ    RCVC4        ;IF YES, DO NOT PRINT MESSAGE
  776.       CALL    ILPRT
  777.       DB    'File open, ready to receive',0
  778. ;
  779. RCVC4:    LDA    CRCFLAG        ;USING CRC MODE?
  780.       PUSH    PSW        ;SAVE THE FLAG'S VALUE
  781.       ORA    A
  782.       JZ    RCVC5        ;IF YES, EXIT
  783.       CALL    ILPRT        ;OTHERWISE IN CHECKSUM MODE
  784.       DB    CR,LF,'CHECKSUM in effect',CR,LF,0
  785.       JMP    RCVC6
  786. ;...
  787. ;
  788. ;
  789. RCVC5:      CALL    ILPRT
  790.       DB    CR,LF,'CRC in effect',CR,LF,0
  791.       LDA    QFLG        ;IN QUIET MODE NOW?
  792.       ORA    A
  793.       CZ    CRLF        ;AN EXTRA CRLF FOR QUIET MODE
  794.       
  795. ;
  796. RCVC6:      POP    PSW        ;GET THE FLAG'S VALUE BACK
  797.       ORA    A        ;IN CRC MODE?
  798.       MVI    A,CRC
  799.       JZ    RCVC7        ;IF YES, EXIT
  800.       MVI    A,NAK        ;NAK FOR CHECKSUM MODE
  801. ;
  802. RCVC7:      CALL    SEND        ;NOW SEND THE 'CRC' (OR 'NAK')
  803. ;
  804. RCVLP:      CALL    RCVRECD
  805.       JC    RCVEOT
  806.       CALL    WRRECD
  807.       CALL    INCRRNO
  808.       CALL    SENDACK
  809.       JMP    RCVLP
  810. ;.....
  811. ;
  812. ;
  813. RCVEOT:      CALL    WRBLOCK
  814.       CALL    SENDACK
  815.       CALL    CLOSFIL
  816.       JMP    DONE
  817. ;.....
  818. ;
  819. ;
  820. ;***********************************************************************
  821. ;
  822. ; FILE TRANSFER ROUTINE - CALLED WITH CONTROL-T FROM TERMINAL ROUTINE.
  823. ; TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X.
  824. ;
  825. ;***********************************************************************
  826. ;
  827. TRANSFER: PUSH    H
  828.       PUSH    D
  829.       PUSH    B
  830.       PUSH    PSW
  831.       LXI    H,FCB4
  832.       CALL    INITFCB        ;INITIALIZES FCBS POINTED..
  833.       LXI    H,FCB+16    ;..TO BY HL REG.
  834.       CALL    INITFCB
  835. ;
  836. ;
  837. ; GET NAME OF FILE TO SEND IN "T" (TERMINAL) MODE
  838. ;
  839. GET:      CALL    ILPRT
  840.       DB    CR,LF,'File name to send?   (RET to quit): ',0
  841.       LXI    D,CMDBUF
  842.       CALL    INBUF
  843.       LDA    CMDBUF+2    ;WAS FILE ENTERED?
  844.       CPI    ' '
  845.       JZ    TRANSL2
  846.       LXI    D,CMDBUF
  847.       LXI    H,FCB4
  848.       CALL    CMDLINE
  849.       LXI    D,FCB4
  850.       MVI    C,OPEN
  851.       CALL    BDOS
  852.       CPI    0FFH        ;RETURN WITH 0FFH MEANS
  853.       JZ    TRANSL1        ;FILE DOES NOT EXIST
  854. ;
  855. ;
  856. ; CHOICE OF NORMAL SPEED OR DELAYS BETWEEN CHARACTERS / LINES
  857. ;
  858.       CALL    ILPRT
  859.       DB    'Want to include time delays? (Y/N): ',0
  860.       CALL    KBDCHR
  861.       CPI    'N'        ;IF 'N' SEND NORMAL SPEED
  862.       JZ    GET1
  863.       XRA    A        ;OTHERWISE USE CHARACTER / LINE DELAYS
  864. ;
  865. GET1:      STA    DLYFLG        ;STORE THE DECISION
  866.       CALL    CRLF    
  867.       LXI    D,80H
  868.       MVI    C,SETDMA
  869.       CALL    BDOS
  870. ;
  871. ;
  872. ; GET 128-BYTE RECORD
  873. ;
  874. READMR:      LXI    D,FCB4
  875.       MVI    C,READ
  876.       CALL    BDOS
  877.       CPI    1        ;END OF FILE
  878.       JZ    RETURNS
  879.       CPI    2        ;BAD READ
  880.       JZ    RETURNU
  881. ;
  882.       CALL    SEND80C        ;SEND ONE 128-CHAR RECORD
  883. ;
  884.       CPI    EOFCHAR        ;END OF FILE - OMIT IF OBJECT..
  885.       JZ    RETURNS        ;..CODE IS TO BE SENT.
  886.       CPI    CAN        ;CANCELLATION?
  887.       JNZ    READMR
  888. ;
  889. TRANCAN:  CALL    ILPRT
  890.       DB    CR,LF,LF,'++ Transfer cancelled ++',CR,LF,BELL,0
  891. ;
  892. RETURN:      POP    PSW
  893.       POP    B
  894.       POP    D
  895.       POP    H
  896.       RET
  897. ;.....
  898. ;
  899. ;
  900. RETURNS:  CALL    ILPRT
  901.       DB    CR,LF,'[Transfer completed]',CR,LF,BELL,0
  902.       JMP    RETURN
  903. ;.....
  904. ;
  905. ;
  906. RETURNU:  CALL    ILPRT
  907.       DB    CR,LF,'++ File transfer unsuccessful ++',CR,LF,BELL,0
  908.       JMP    RETURN
  909. ;.....
  910. ;
  911. ;
  912. TRANSL1:  CALL    ILPRT
  913.       DB    CR,LF,'++ No file with that name ++',CR,LF,0
  914. ;
  915. TRANSL2:  CALL    ILPRT
  916.       DB    CR,LF,'"R" - return to modem',CR,LF
  917.       DB    '"A" - re-enter a name: ',BELL,0
  918.       CALL    KBDCHR
  919.       CPI    CR
  920.       JZ    TRANSL2
  921.       CALL    CRLF
  922.       CPI    'A'
  923.       JZ    GET        ;GET A FILE NAME AND START OVER
  924.       CPI    'R'
  925.       JNZ    TRANSL2
  926.       JMP    RETURN        ;IF AN 'R', ALL DONE
  927. ;.....
  928. ;
  929. ;
  930. ; SEND ONE 128-BYTE RCORD
  931. ;
  932. SEND80C:  MVI    B,80H
  933.       LXI    H,80H
  934. ;
  935. SENDCH1:  PUSH    D
  936.       CALL    SPEED        ;0-90 MS. DELAY BETWEEN CHARACTERS
  937.       POP    D
  938.       MOV    A,M
  939.       CPI    LF        ;LF CHAR?
  940.       JZ    SKIP22
  941.       CALL    MODOUT        ;SEND THE CHARACTER TO MODEM
  942.       CPI    EOFCHAR
  943.       RZ
  944.       CALL    STAT        ;TEST TO SEE IF
  945.       ORA    A        ;CANCELLATION REQUESTED
  946.       JZ    SKIP12
  947.       CALL    KEYIN
  948.       CPI    CAN
  949.       RZ
  950. ;
  951. SKIP12:      INX    H
  952.       DCR    B
  953.       JNZ    SENDCH1
  954.       RET
  955. ;...
  956. ;
  957. ;
  958. SKIP22:      CALL    TYPE        ;SHOW LF ON CRT, DO NOT SEND TO MODEM
  959.       JMP    SKIP12        ;GET NEXT CHAR
  960. ;...
  961. ;
  962. ;
  963. ; Send the character to the output
  964. ;
  965. MODOUT:      PUSH    PSW
  966. ;
  967. MODOUTL:  LDA    XOFFTST
  968.       ORA    A
  969.       CNZ    TXOFF    
  970.       CALL    SENDRDY
  971.       JNZ    MODOUTL
  972.       POP    PSW
  973.       CALL    OUT$MODDATP    ;SEND CHARACTER TO MODEM
  974.       CALL    TYPE        ;SEND CHARACTER TO CRT
  975.       CPI    CR        ;WAS IT AN END OF LINE?
  976.       RNZ            ;IF YES, GIVE A HEFTY DELAY
  977. ;
  978. ;
  979. ; Delay to allow slow BBS systems (most use BASIC) to enter the line.
  980. ; Choice of 0-9 for about 100 ms. each, maximum of 900 ms.
  981. ;
  982. MODOUTN:  LDA    XONWAIT        ;WAIT FOR XON AFTER CR ?
  983.       ORA    A
  984.       JNZ    WAITXON        ;IF YES, HANDLE SEPARATELY
  985.       MVI    D,10
  986. ;
  987. MODOUTT:  PUSH    D
  988.       CALL    SPEED1        ;10 MS DELAY
  989.       POP    D
  990.       DCR    D
  991.       JNZ    MODOUTT        ;10 LOOPS FOR 100 MS.
  992.       RET
  993. ;.....
  994. ;
  995. ;
  996. ; Add from 0 to 90 ms. delay between characters for slow (most use
  997. ; BASIC) bulletin board systems.  Also used to add 0-900 ms. delay
  998. ; between lines.
  999. ;
  1000. SPEED:      LDA    BYTDLY        ;GET DELAY BETWEEN CHARACTERS (0-9)
  1001.       JMP    SPEED1+3    ;1=10 MS, 5=50 MS, 9=90 MS, ETC.
  1002. ;
  1003. SPEED1:      LDA    CRDLY        ;GET DELAY AFTER CRLF (0-9)
  1004.       ORA    A        ;100 MS, 5=500 MS, 9=900 MS, ETC.
  1005.       RZ            ;IF NO DELAY NEEDED, RETURN
  1006.       MOV    C,A        ;STORE NUMBER REQUESTED IN C-REG.
  1007.       LDA    DLYFLG        ;WANT ANY DELAYS THIS FILE?
  1008.       ORA    A
  1009.       RNZ            ;IF NOT, SKIP THIS SECTION
  1010. ;
  1011. SPEED2:      CALL    SPEED3        ;OUTER LOOP
  1012.       DCR    C
  1013.       JNZ    SPEED2
  1014.       RET            ;DONE WHENEVER THE C-REG. IS ZERO
  1015. ;...
  1016. ;
  1017. ;
  1018. SPEED3:      PUSH    H
  1019.       LXI    H,14        ;10 MILLISECONDS
  1020.       LDA    XOFFTST
  1021.       ORA    A
  1022.       JZ    SPEED4
  1023. ;
  1024.       LXI    H,10        ;7 MILLISECONDS  FOR XOFF TESTING
  1025.       LDA    ECHOFLG
  1026.       ORA    A
  1027.       JZ    SPEED4
  1028. ;
  1029.       LDA    LOCFLG        ;7 MILLISECONDS (SAME AS ECHOFLG)
  1030.       ORA    A
  1031.       JZ    SPEED4
  1032. ;
  1033.       LXI    H,75        ;5 MILLISECONDS FOR REMOTE ECHO
  1034. ;
  1035. SPEED4:      CALL    FIXCNT        ;MULTIPLY DELAY BY CLOCK SPEED
  1036.       PUSH    H
  1037.       POP    D        ;GET THE HL-COUNT INTO DE PAIR
  1038.       POP    H        ;PUT STACK BACK TO NORMAL
  1039. ;    
  1040. SPEED5:      DCX    D        ;INNER LOOP
  1041.       LDA    XOFFTST
  1042.       ORA    A
  1043.       CNZ    TXOFF
  1044.       MOV    A,E
  1045.       ORA    D
  1046.       JNZ    SPEED5
  1047.       RET
  1048. ;...
  1049. ;
  1050. ;
  1051. TXOFF:      CALL    RCVREADY
  1052.       RNZ
  1053.       CALL    IN$MODDATP
  1054.       ANI    7FH
  1055.       CPI    XOFF
  1056.       CZ    WAITXON
  1057.       RET
  1058. ;.....
  1059. ;
  1060. ;
  1061. WAITXON:  CALL    RCVREADY
  1062.       JNZ    WAITXON
  1063.       CALL    IN$MODDATP
  1064.       ANI    7FH
  1065.       CPI    XON
  1066.       RZ
  1067. ;
  1068. WTXON2:      CALL    STAT        ;TEST TO SEE IF REQUESTING CANCELLATION
  1069.       ORA    A
  1070.       JZ    WAITXON
  1071.       CALL    KEYIN        ;CAN ABORT IF THE X-ON NEVER COMES
  1072.       CPI    CAN
  1073.       JNZ    WAITXON
  1074.       RZ
  1075. ;.....
  1076. ;
  1077. ;
  1078. ;***********************************************************************
  1079. ;
  1080. ; SUBROUTINES 
  1081. ;
  1082. ;***********************************************************************
  1083. ;
  1084. SENDFN:      CALL    ILPRT
  1085.       DB    'Awaiting name NAK',CR,LF,0
  1086.       MVI    E,100
  1087.       CALL    WAITNLP
  1088.       MVI    A,ACK        ;GOT NAK, SEND ACK
  1089.       CALL    SEND
  1090.       LXI    H,FILECT
  1091.       DCR    M
  1092.       JM    NOMRNM
  1093.       LHLD    NBSAVE        ;GET FILE NAME..
  1094.       LXI    D,FCB        ;..IN FCB
  1095.       MVI    B,12
  1096.       CALL    MOVE
  1097.       SHLD    NBSAVE
  1098.       CALL    SENDNM        ;SEND IT
  1099.       ORA    A        ;CLEAR CARRY
  1100.       RET
  1101. ;.....
  1102. ;
  1103. ;
  1104. NOMRNM:      MVI    A,EOT
  1105.       CALL    SEND
  1106.       STC
  1107.       RET
  1108. ;.....
  1109. ;
  1110. ;
  1111. SENDNM:      PUSH    H
  1112. ;
  1113. SENDNM1:  MVI    D,11        ;COUNT CHARS IN NAME
  1114.       MVI    C,0        ;INIT CHECKSUM
  1115.       MOV    A,C
  1116.       STA    FTYCNT        ;INITIATE FILE TYPE COUNT
  1117.       LXI    H,FCB+1        ;ADDRESS NAME
  1118. ;
  1119. NAMLPS:      LDA    QFLG        ;IN QUIET MODE NOW?
  1120.       ORA    A
  1121.       JNZ    SKPMON        ;IF NOT, EXIT
  1122.       LDA    NSEEFLG        ;SET FLAG FOR NO SEND TO MODEM
  1123. ;
  1124. SKPMON:   MOV    A,M        ;SEND NAME
  1125.       ANI    7FH        ;STRIP HIGH ORDER BIT SO CP/M 2..
  1126.       CALL    SEND        ;..WON'T SEND R/O FILE DESIGNATION.
  1127.       MVI    A,TRUE
  1128.       STA    NSEEFLG
  1129.       LDA    QFLG
  1130.       ORA    A
  1131.       MOV    A,M
  1132.       CNZ    FTYTST        ;TYPE CHARACTER ETC.
  1133. ;
  1134. ACKLP:      PUSH    B        ;SAVE CKSUM
  1135.       MVI    B,1        ;WAIT FOR RECEIVER..
  1136.       CALL    RECV        ;..TO ACKNOWLEDGE..
  1137.       POP    B        ;..GETTING LETTER.
  1138.       JC    SCKSER
  1139.       CPI    ACK
  1140.       JNZ    ACKLP
  1141.       INX    H        ;NEXT CHAR
  1142.       DCR    D
  1143.       JNZ    NAMLPS
  1144.       MVI    A,EOFCHAR    ;TELL RECEIVER END OF NAME
  1145.       CALL    SEND
  1146.       LDA    QFLG
  1147.       ORA    A
  1148.       CNZ    CRLF
  1149.       MOV    D,C        ;SAVE CHECKSUM
  1150.       MVI    B,1
  1151.       CALL    RECV        ;GET CHECKSUM..
  1152.       CMP    D        ;..FROM RECEIVER.
  1153.       JZ    NAMEOK
  1154. ;
  1155. SCKSER:      MVI    A,BDNMCH    ;BAD NAME-TELL RECEIVER
  1156.       CALL    SEND
  1157.       CALL    ILPRT
  1158.       DB    CR,LF,'++ CHECKSUM error ++',CR,LF,0
  1159.       MVI    E,100    ;DO HANDSHAKING OVER
  1160.       CALL    WAITNLP        ;DON'T PRINT "AWAITING NAK" MSG
  1161.       MVI    A,ACK
  1162.       CALL    SEND
  1163.       JMP    SENDNM1
  1164. ;.....
  1165. ;
  1166. ;
  1167. NAMEOK:      MVI    A,OKNMCH    ;GOOD NAME-TELL RECEIVER
  1168.       CALL    SEND
  1169.       POP    H
  1170.       RET    
  1171. ;.....
  1172. ;
  1173. ;
  1174. GETFN:      LXI    H,FCB
  1175.       CALL    INITFCB+2    ;DOES NOT INITIALIZE DRIVE
  1176.       CALL    ILPRT
  1177.       DB    'Awaiting FILENAME',CR,LF,0
  1178. ;
  1179. GNAMELP:  CALL    HSNAK
  1180.       JC    GNAMELP
  1181.       CALL    GETNM        ;GET THE NAME
  1182.       CPI    EOT        ;IF EOT, THEN NO MORE FILES
  1183.       JZ    NOMRNMG
  1184.       ORA    A        ;CLEAR CARRY
  1185.       RET
  1186. ;.....
  1187. ;
  1188. ;
  1189. NOMRNMG:  STC
  1190.       RET
  1191. ;.....
  1192. ;
  1193. ;
  1194. GETNM:      PUSH    H
  1195. ;
  1196. GETNM1:      MVI    C,0        ;INIT CHECKSUM
  1197.       MOV    A,C
  1198.       STA    FTYCNT        ;INITIATE COUNT FOR FILE TYPE
  1199.       LXI    H,FCB+1
  1200. ;
  1201. NAMELPG:  MVI    B,5        ;WAIT AWHILE FOR FILE NAME
  1202.       CALL    RECV        ;GET CHAR
  1203.       JNC    GETNM2
  1204.       CALL    ILPRT
  1205.       DB    CR,LF,'Time out receiving FILENAME',CR,LF,0
  1206.       JMP    GCKSER
  1207. ;.....
  1208. ;
  1209. ;
  1210. GETNM2:      CPI    EOT        ;IF EOT, THEN NO MORE FILES
  1211.       JZ    GNRET
  1212.       CPI    EOFCHAR        ;GOT END OF NAME
  1213.       JZ    ENDNAME
  1214.       MOV    M,A        ;PUT NAME IN FCB
  1215.       CALL    FTYTST
  1216.       PUSH    B        ;SAVE CKSUM
  1217.       MVI    A,ACK        ;ACK GETTING LETTERS
  1218.       CALL    SEND
  1219.       POP    B
  1220.       INX    H        ;GET NEXT CHAR
  1221.       MOV    A,L        ;DON'T LET NOISE...
  1222.       CPI    7FH        ;..CAUSE OVERFLOW..
  1223.       JZ    GCKSER        ;..INTO PROGRAM AREA.
  1224.       JMP    NAMELPG
  1225. ;.....
  1226. ;
  1227. ;
  1228. FTYTST:      LDA    FTYCNT
  1229.       INR    A
  1230.       STA    FTYCNT
  1231.       CPI    9        ;ARE WE AT THE FILE TYPE?
  1232.       JZ    SPCTST        ;GO IF SO
  1233. ;
  1234. ENDSPT:      MOV    A,M
  1235.       CPI    ' '        ;TEST FOR SPACE
  1236.       CNZ    TYPE        ;TYPE IF NOT
  1237.       RET
  1238. ;.....
  1239. ;
  1240. ;
  1241. SPCTST:      MOV    A,M
  1242.       CPI    ' '        ;TEST FOR SPACE IN FIRST FILE TYPE BYTE
  1243.       RZ            ;DON'T OUTPUT PERIOD IF SPACE
  1244.       MVI    A,'.'    
  1245.       CALL    TYPE
  1246.       JMP    ENDSPT        ;OUTPUT FIRST FILE TYPE BYTE
  1247. ;.....
  1248. ;
  1249. ;
  1250. ENDNAME:  LDA    QFLG
  1251.       ORA    A
  1252.       CNZ    CRLF
  1253.       MOV    A,C        ;SEND CHECKSUM
  1254.       CALL    SEND
  1255.       MVI    B,1
  1256.       CALL    RECV        ;CHECKSUM GOOD?
  1257.       CPI    OKNMCH        ;YES IF OKNMCH SENT..
  1258.       JZ    GNRET        ;..ELSE DO OVER.
  1259. ;
  1260. GCKSER:      LXI    H,FCB        ;CLEAR FCB (EXCEPT DRIVE)..
  1261.       CALL    INITFCB+2    ;..SINCE IT MIGHT BE DAMAGED..
  1262.       CALL    ILPRT
  1263.       DB    CR,LF,'++ CHECKSUM error ++',CR,LF,0
  1264. ;
  1265. GCKSER1:  CALL    HSNAK        ;DO HANDSHAKING OVER
  1266.       JC    GCKSER1
  1267.       JMP    GETNM1
  1268. ;...
  1269. ;
  1270. ;
  1271. GNRET:      POP    H
  1272.       RET
  1273. ;.....
  1274. ;
  1275. ;
  1276. HSNAK:      MVI    A,NAK        ;SEND NAK UNTIL..
  1277.       CALL    SEND        ;..RECEIVING ACK.
  1278.       CALL    CKABORT        ;DON'T GET HUNG UP HERE
  1279.       MVI    B,2        ;WAIT 2 SECONDS..
  1280.       CALL    RECV        ;..IN RECEIVE.
  1281.       CPI    ACK        ;IF ACK,RETURN WITH..
  1282.       RZ            ;..CARRY CLEAR.
  1283.       STC
  1284.       RET
  1285. ;.....
  1286. ;
  1287. ;
  1288. TNMBUF:      MVI    A,FALSE        ;CALL FROM SENDFIL ONLY ONCE.
  1289.       STA    FSTFLG
  1290.       STA    FILECT
  1291.       CALL    SCAN
  1292.       LXI    H,NAMEBUF
  1293.       SHLD    NBSAVE        ;SAVE ADDR OF 1ST NAME
  1294. ;
  1295. TNLP1:      CALL    TRTOBUF
  1296.       LXI    H,FCB
  1297.       LXI    D,FCBBUF
  1298.       CALL    CMDLINE        ;PARSE NAME TO CP/M FORMAT
  1299. ;
  1300. TNLP2:      CALL    MFNAME        ;SEARCH FOR NAMES (* FORMAT)
  1301.       JC    NEXTNM
  1302.       LDA    FCB+10        ;IF CP/M 2 $SYS FILE..
  1303.       ANI    80H        ;..DON'T SEND
  1304.       JNZ    TNLP2
  1305.       LHLD    NBSAVE        ;GET NAME
  1306.       LXI    D,FCB        ;MOVE IT TO FCB
  1307.       XCHG
  1308.       MVI    B,12
  1309.       CALL    MOVE
  1310.       XCHG
  1311.       SHLD    NBSAVE        ;ADDR OF NEXT NAME
  1312.       LXI    H,FILECT    ;COUNT FILES FOUND
  1313.       INR    M
  1314.       JMP    TNLP2
  1315. ;.....
  1316. ;
  1317. ;
  1318. NEXTNM:      LXI    H,NAMECT    ;COUNT NAMES FOUND
  1319.       DCR    M
  1320.       JNZ    TNLP1
  1321.       LXI    H,NAMEBUF    ;SAVE START OF BUFFER
  1322.       SHLD    NBSAVE
  1323.       LDA    FILECT
  1324.       CPI    64+1        ;NO MORE THAN 64 TRANSFERS
  1325.       RC
  1326.       MVI    A,64        ;ONLY X'FER FIRST 64
  1327.       STA    FILECT
  1328.       RET
  1329. ;.....
  1330. ;
  1331. ;
  1332. BUFMSG:      CALL    ILPRT
  1333.       DB    CR,LF,'** Memory buffer ',0
  1334.       LDA    SAVEFLG
  1335.       ORA    A
  1336.       JZ    BUFMSG2
  1337.       CALL    ILPRT
  1338.       DB    'open **',CR,LF,':',BELL,0
  1339.       RET
  1340. ;.....
  1341. ;
  1342. ;
  1343. BUFMSG2:  CALL    ILPRT
  1344.       DB    'closed **',CR,LF,BELL,0
  1345.       RET
  1346. ;.....
  1347. ;
  1348. ;
  1349. EXITMEN:  CALL    CRLF
  1350.       CALL    CLREOS        ;CLEAR LINE TO CLEAN UP ANY MESS
  1351.       JMP    MENU0
  1352. ;.....
  1353. ;
  1354. ;
  1355. SENDRDY:  CALL    IN$MODCTLP
  1356.       CALL    ANI$MODSNDB
  1357.       JMP    CPI$MODSNDR
  1358. ;.....
  1359. ;
  1360. ;
  1361. SENDLF:      CALL    SENDRDY
  1362.       JNZ    NOLFYET        ;GO IF NOT READY FOR OUTPUT YET
  1363.       MVI    A,LF
  1364.       JMP    NOTOG        ;SEND LF
  1365. ;.....
  1366. ;
  1367. ;
  1368. NOLFYET:  CALL    EXITTEST
  1369.       JNC    EXITMEN        ;GO IF SO, SO DON'T GET HUNG UP
  1370.       JMP    SENDLF        ;ELSE KEEP TRYING TO SEND LF
  1371. ;.....
  1372. ;
  1373. ;
  1374. SENDLOG:  PUSH    H
  1375.       LHLD    LOGONPTR    ;HL POINTS TO START OF LOGON MESSAGE
  1376. ;
  1377. LOGLP:      CALL    SENDRDY
  1378.       JNZ    NOSENLOG    ;GO IF NOT READY
  1379.       MOV    A,M        ;GET LOGON BYTE
  1380.       INX    H
  1381.       CPI    0        ;IS IT THE END?
  1382.       JZ    ENDLOG        ;GO IF SO
  1383.       CALL    OUT$MODDATP
  1384.       JMP    LOGLP
  1385. ;...
  1386. ;
  1387. ;
  1388. NOSENLOG: CALL    EXITTEST    ;TEST SO DON'T GET HUNG UP
  1389.       JNC    EXITLOG        ;GO IF OPERATOR WANTS EXIT
  1390.       JMP    LOGLP
  1391. ;...
  1392. ;
  1393. ;
  1394. ENDLOG:      POP    H
  1395.       JMP    TERML
  1396. ;.....
  1397. ;
  1398. ;
  1399. EXITLOG:  POP    H
  1400.       JMP    EXITMEN
  1401. ;.....
  1402. ;
  1403. ;
  1404. EXITTEST: CALL    STAT        ;KEYPRESS?
  1405.       JZ    NOKEY
  1406.       CALL    KEYIN    
  1407.       MOV    B,A
  1408.       LDA    EXITCHR        ;SEE IF OPERATOR WANTS EXIT
  1409.       CMP    B
  1410.       JNZ    NOKEY        ;GO IF WRONG KEY        
  1411.       STC
  1412.       CMC            ;RESET FOR EXIT
  1413.       RET
  1414. ;.....
  1415. ;
  1416. ;
  1417. NOKEY:      STC            ;SET FOR NO KEY OR WRONG KEY
  1418.       RET
  1419. ;.....
  1420. ;
  1421. ;
  1422. EXTFLG:    MVI    A,TRUE
  1423.     STA    EXACFLG
  1424.     JMP    TERML
  1425. ;.....
  1426. ;
  1427. ;
  1428. RCVREADY: CALL    IN$MODCTLP
  1429.       CALL    ANI$MODRCVB
  1430.       JMP    CPI$MODRCVR
  1431. ;.....
  1432. ;
  1433. ;
  1434. LSTMSG:      LDA    LISTFLG        ;SEE IF PRINTER SHOULD BE ON OR OFF
  1435.       ORA    A
  1436.       JZ    LSTMSG2
  1437.       CALL    ILPRT
  1438.       DB    'Printer is on',CR,LF,0
  1439.       RET
  1440. ;.....
  1441. ;
  1442. ;
  1443.  
  1444. LSTMSG2:  CALL    ILPRT
  1445.       DB    'Printer is off',CR,LF,0
  1446.       RET
  1447. ;.....
  1448. ;
  1449. ;
  1450. NOTOG:      CALL    OUT$MODDATP
  1451.       MOV    B,A
  1452.       LDA    LOCFLG
  1453.       ORA    A
  1454.       JNZ    LTYPE
  1455.       LDA    ECHOFLG
  1456.       ORA    A
  1457.       JZ    CHKCR
  1458. ;
  1459. LTYPE:      MOV    A,B
  1460.       CALL    TYPE
  1461.       CALL    CHKSAVE        ;TO STORE LOCAL IF BUFFER OPEN
  1462.       CALL    CHKPRNT
  1463. ;
  1464. CHKCR:      MVI    A,CR
  1465.       CMP    B
  1466.       JNZ    TERML
  1467.       LDA    ADDLF
  1468.       ORA    A
  1469.       JZ    TERML
  1470.       JMP    SENDLF
  1471. ;.....
  1472. ;
  1473. ;
  1474. ;
  1475. TERML:      CALL    RCVREADY    ;TEST FOR RECEIVED CHARACTER
  1476.       JNZ    TERM2
  1477.       CALL    IN$MODDATP
  1478.       ANI    7FH        ;STRIP PARITY
  1479.       JZ    TERM2        
  1480. ;
  1481. GIVLF:      CALL    TYPE
  1482.       MOV    B,A
  1483.       CALL    CHKSAVE
  1484.       CALL    CHKPRNT
  1485.       LDA    ECHOFLG
  1486.       ORA    A
  1487.       JZ    NOECHO
  1488.       MOV    A,B
  1489.       CALL    OUT$MODDATP
  1490. ;
  1491. NOECHO:      MVI    A,CR
  1492.       CMP    B
  1493.       JNZ    TERM2
  1494.       LDA    ADDLF
  1495.       JZ    TERM2
  1496.       LDA    ECHOFLG
  1497.       ORA    A
  1498.       JNZ    SENDLF
  1499.       MVI    A,LF
  1500.       JMP    GIVLF
  1501. ;
  1502. CHKSAVE:  LDA    SAVEFLG
  1503.       ORA    A
  1504.       RZ
  1505.       MOV    M,B
  1506.       INX    H
  1507.       SHLD    HLSAVE        ;MENU COMMAND DESTROYS HL-REG..
  1508.       MVI    A,LF
  1509.       CMP    B
  1510.       JNZ    NOCOLON        ;..TYPE ":" AFTER EACH LINE FEED..
  1511.       MVI    A,':'        ;..WHEN MEMORY SAVE ACTIVE.
  1512.       CALL    TYPE
  1513. ;
  1514. NOCOLON:  CALL    GETMAX
  1515.       CMP    H
  1516.       PUSH    B
  1517.       CZ    INTDSKSV
  1518.       POP    B
  1519.       RET
  1520. ;.....
  1521. ;
  1522. ;
  1523. GETMAX:      LDA    SAVCCP
  1524.       ORA    A
  1525.       LDA    7
  1526.       JZ    SUB1
  1527.       SBI    8        ;..PAGE BELOW CCP ..
  1528. ;                ;..ORA BDOS HAS BEEN..
  1529. SUB1:      DCR    A        ;..REACHED AND DISKSAVE IS NEEDED
  1530.       RET
  1531. ;.....
  1532. ;
  1533. ;
  1534. CHKPRNT:  LDA    LISTFLG        ;OUT TO PRINTER?
  1535.       ORA    A
  1536.       RZ            ;RETURN IF NOT
  1537.       LDA    NFILFLG        ;IS BUFFER USED FOR FILE?
  1538.       ORA    A        ;IF YES DON'T BUFFER PRINTER, HOWEVER..
  1539.       CALL    GETMAX        ;..CHARACTERS WILL BE LOST IF PRINTER
  1540.       LHLD    HLSAVE1        ;..SLOWER THAN MODEM    
  1541.       CMP    H        ;ARE WE THERE?
  1542.       JNZ    NOTMAX        ;GO IF NOT
  1543.       LXI    H,BOTTRAM    ;FLUSH BUFFER
  1544.       SHLD    HLSAVE1
  1545.       SHLD    HLSAVE2
  1546. ;
  1547. NOTMAX:      MOV    M,B        ;SAVE CHARACTER IN BUFFER
  1548.       INX    H        ;INCREMENT END OF BUFFER
  1549.       SHLD    HLSAVE1
  1550.       MVI    A,TRUE        ;SET FLAG FOR PRINTER OUTPUT
  1551.       STA    LISTMOR
  1552.       RET
  1553. ;.....
  1554. ;
  1555. ;
  1556. NOBUFF:      CALL    LSTSTAT    
  1557.       ORA    A
  1558.       RZ            ;RETURN IF PRINTER NOT READY
  1559.       MOV    C,B        ;ELSE PRINT CHARACTER
  1560.       JMP    LISTER
  1561. ;
  1562. GOLIST:      CALL    LSTSTAT
  1563.       ORA    A
  1564.       RZ            ;RETURN IF PRINTER NOT READY
  1565.       LHLD    HLSAVE2        ;GET LOCATION OF NEXT CHARACTER TO PRINT
  1566.       MOV    C,M        ;GET CHARACTER
  1567.       INX    H        ;INCREMENT POINTER
  1568.       SHLD    HLSAVE2
  1569.       CALL    CMPBUFF        ;CHECK FOR END OF BUFFER
  1570.       JMP    LISTER        ;PRINT
  1571. ;
  1572. ;
  1573. ; ROUTINE CHECKS FOR END OF BUFFER, RESETS BUFFER IF SO AND STOPS THE
  1574. ; PRINTER OUTPUT
  1575. ;
  1576. CMPBUFF:  LHLD    HLSAVE2
  1577.       XCHG
  1578.       LHLD    HLSAVE1
  1579.       MOV    A,L
  1580.       SUB    E
  1581.       MOV    L,A
  1582.       MOV    A,H
  1583.       SBB    D
  1584.       ORA    L
  1585.       RNZ
  1586.       LXI    H,BOTTRAM
  1587.       SHLD    HLSAVE1
  1588.       SHLD    HLSAVE2
  1589.       XRA    A
  1590.       STA    LISTMOR
  1591.       RET
  1592. ;.....
  1593. ;
  1594. ;
  1595. INTDSKSV: MVI    A,XOFF        ;SEND A CTL-S TO STOP..
  1596.       CALL    OUT$MODDATP    ;..REMOTE COMPUTER OUTPUT.
  1597.       MVI    D,0        ;D IS THE BUFFER COUNT
  1598.       CALL    INMODEM        ;GET LAST BYTES SENT..
  1599.       STA    LASTBYT1    ;..AFTER CTL-S.
  1600.       CALL    INMODEM        ;ADD MORE CALLS TO INMODEM..
  1601.       STA    LASTBYT2    ;..AND STA LASTBYT# IF YOU ARE..
  1602.       PUSH    D
  1603.       CALL    NUMREC1        ;GET NUMBER OF RECORDS TO PUT ON DISK
  1604.       CALL    WRTDSK        ;WRITE THE RECORDS
  1605.       POP    D
  1606.       LXI    H,BOTTRAM
  1607.       INR    D
  1608.       DCR    D        ;TEST BUFFER COUNT FOR ZERO
  1609.       JZ    CTLQ
  1610.       LDA    LASTBYT1    ;GET THE LAST BYTES THAT WERE..
  1611.       MOV    M,A        ;..SAVED AND PUT THEM IN..
  1612.       INX    H        ;..BOTTRAM.
  1613.       CALL    TYPE
  1614.       DCR    D
  1615.       JZ    CTLQ
  1616.       LDA    LASTBYT2
  1617.       MOV    M,A
  1618.       INX    H
  1619.       CALL    TYPE
  1620. ;
  1621. CTLQ:      MVI    A,XON        ;SEND START CHARACTER..
  1622.       JMP    OUT$MODDATP    ;..TO REMOTE COMPUTER.
  1623. ;.....
  1624. ;
  1625. ;
  1626. BREAK:      PUSH    D        ;SAVE IT
  1627.       LXI    D,0        ;ZERO IT
  1628.       LDA    MODCTLB        ;GET THE LAST MODEM CONTROL BYTE
  1629.       ANI    BRKMSK        ;SET THE TRANSMIT BREAK BIT LOW
  1630.       CALL    OUT$MODCTL2     ;SEND IT TO THE MODEM
  1631.       PUSH    H
  1632.       LXI    H,48        ;100 MS. BREAK
  1633.       CALL    FIXCNT
  1634.       PUSH    H
  1635.       POP    B
  1636.       POP    H
  1637. ;
  1638. BRK1:      CALL    TIMERL
  1639.       JZ    BRK2        ;IF TIME IS UP RESET BREAK
  1640.       CPI    0        ;CHECK FOR NULLS
  1641.       JZ    BRK1        ;DON'T PROCESS THEM
  1642.       ANI    7FH        ;STRIP PARITY
  1643.       CALL    TYPE
  1644.       PUSH    PSW
  1645.       LDA    SAVEFLG
  1646.       CPI    FALSE
  1647.       JZ    NOSAVEB
  1648.       POP    PSW
  1649.       MOV    M,A
  1650.       INX    H
  1651.       SHLD    HLSAVE        ;MENU COMMAND DESTROYS HL-REG..
  1652. ;                ;..GET    HL WHEN ENTERING VIA 'NOL' CMD.
  1653. COLONB:   CPI    LF
  1654.       JNZ    BRK1        ;..TYPE ":" AFTER EACH LINE FEED..
  1655.       MVI    A,':'        ;..WHEN MEMORY SAVE ACTIVE.
  1656.       CALL    TYPE
  1657.       JMP    BRK1
  1658. ;...
  1659. ;
  1660. ;
  1661. NOSAVEB:  POP    PSW        ;RESTORE IT
  1662.       JMP    BRK1
  1663. ;...
  1664. ;
  1665. ;
  1666. BRK2:      LDA    MODCTLB        ;GET MODEM CONTROL BYTE
  1667.       CALL    OUT$MODCTL2
  1668.       POP    D
  1669.       LHLD    HLSAVE        ;LAST ADDRESS WRITTEN IF DATA BEING SAVED
  1670.       LDA    SAVCCP
  1671.       ORA    A
  1672.       JZ    SUB2
  1673.       LDA    7        ;CHECK TO SEE IF..
  1674.       SBI    8        ;..PAGE BELOW CCP ..
  1675.       JMP    SUB2A
  1676. ;...
  1677. ;
  1678. ;
  1679. SUB2:      LDA    7
  1680. ;
  1681. SUB2A:      DCR    A        ;..OR BDOS HAS BEEN ..
  1682.       CMP    H        ;..REACHED AND DISKSAVE IS NEEDED.
  1683.       JNZ    TERM2        ;NO PROBLEM - GO BACK TO NORMAL ROUTINE
  1684.       CALL    ILPRT
  1685.       DB    CR,LF,'Memory-save buffer full',CR,LF,BELL,0
  1686.       JMP    TERM2
  1687. ;.....
  1688. ;
  1689. ;
  1690. ; THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER OR 100
  1691. ; MILLISECONDS.  IF A CHARACTER IS RECEIVED, A FLAG IS SET TO STORE THE
  1692. ; CHARACTER.  A MAXIMUM OF TWO CHARACTERS ARE STORED, BUT MORE MAY BE
  1693. ; STORED IF DESIRED (SEE COMMENT IN "INTDSKSV" ABOVE).
  1694. ;
  1695. INMODEM:  PUSH    H
  1696.       LXI    H,48        ;100 MILLISECONDS
  1697.       CALL    FIXCNT
  1698.       PUSH    H
  1699.       POP    B
  1700.       POP    H
  1701. ;
  1702. TIMERL:      CALL    RCVREADY
  1703.       JZ    GETBYTE
  1704.       DCX    B
  1705.       MOV    A,B
  1706.       ORA    C
  1707.       JNZ    TIMERL
  1708.       RET
  1709. ;.....
  1710. ;
  1711. ;
  1712. GETBYTE:
  1713.       CALL    IN$MODDATP
  1714.       INR    D
  1715.       RET
  1716. ;.....
  1717. ;
  1718. ;
  1719. NUMRECS:
  1720.       MVI    M,EOFCHAR
  1721.       INX    H
  1722.       LXI    D,127
  1723.       DAD    D
  1724. ;
  1725. NUMREC1:  LXI    D,-(BOTTRAM)
  1726.       DAD    D
  1727.       MOV    A,L        ;DIVIDE HL BY 128..
  1728.       ORA    A
  1729.       RAL            ;..TO GET THE..
  1730.       MOV    L,H        ;..NUMBER OF RECORDS
  1731.       MVI    H,0
  1732.       PUSH    PSW
  1733.       DAD    H
  1734.       POP    PSW
  1735.       MVI    A,0
  1736.       ADC    L
  1737.       MOV    L,A        ;RETURNS WITH NUMBER OF..
  1738.       RET            ;..128 BYTE RECORDS IN HL.
  1739. ;.....
  1740. ;
  1741. ;
  1742. ; WRITE TO DISK BUT FIRST CHECK TO SEE IF ANYTHING TO WRITE.  IF NOT,
  1743. ; CLOSE THE EMPTY FILE.
  1744. ;
  1745. WRTDSK:      LXI    D,BOTTRAM    ;GET FIRST CHARACTER
  1746.       LDAX    D        ;GET THE CHARACTER AT START OF BUFFER
  1747.       CPI    EOFCHAR        ;END OF FILE CHARACTER?
  1748.       JZ    NOWRITE        ;DO NOT WRITE IF NO DATA TO STORE
  1749.       MOV    A,H        ;MAKE SURE THERE IS SOMETHING TO STORE
  1750.       ORA    L
  1751.       JZ    NOWRITE        ;DO NOT WRITE IF NO DATA TO STORE
  1752. ;
  1753. NEXTWRT:  MVI    C,SETDMA
  1754.       CALL    BDOSRT
  1755.       PUSH    D
  1756.       LXI    D,FCB3
  1757.       MVI    C,WRITE
  1758.       CALL    BDOSRT
  1759.       POP    D
  1760.       XCHG
  1761.       PUSH    D
  1762.       LXI    D,128
  1763.       DAD    D
  1764.       POP    D
  1765.       XCHG
  1766.       DCX    H
  1767.       MOV    A,H
  1768.       ORA    L
  1769.       JNZ    NEXTWRT
  1770.       RET
  1771. ;.....
  1772. ;
  1773. ;
  1774. ; IF NO DATA TO STORE ON DISK, CLOSE THE EMPTY FILE AND ERASE IT
  1775. ;
  1776. NOWRITE:  CALL  CLOSFIL        ;CLOSE THE EMPTY FILE
  1777.       CALL    NOASK        ;ERASE THE EMPTY FILE
  1778.       CALL    ILPRT
  1779.       DB    '++ Nothing to save, erasing the file ++'
  1780.       DB    CR,LF,BELL,0
  1781.       JMP    DONETCA        ;RESET ANY FLAGS, RETURN TO MENU
  1782. ;.....
  1783. ;
  1784. ;
  1785. CLOSE3:      LXI    D,FCB3
  1786.       MVI    C,CLOSE
  1787.       JMP    BDOS
  1788. ;.....
  1789. ;
  1790. ;
  1791. BDOSRT:      PUSH    B
  1792.       PUSH    D
  1793.       PUSH    H
  1794.       PUSH    PSW
  1795.       CALL    BDOS
  1796.       POP    PSW
  1797.       POP    H
  1798.       POP    D
  1799.       POP    B
  1800.       RET
  1801. ;
  1802. MOVE2:      LXI    H,FCB3
  1803.       CALL    INITFCB
  1804.       LXI    H,FCB
  1805.       LXI    D,FCB3
  1806.       MVI    B,12
  1807.       JMP    MOVE
  1808. ;.....
  1809. ;
  1810. ;
  1811. INITFCB:  MVI    M,0        ;ENTRY AT +2 WILL LEAVE DRIVE NO. INTACT
  1812.       INX    H        ;WILL INITIALIZE AN FCB..
  1813.       MVI    B,11        ;..POINTED TO BY HL-REG. FILLS 1ST POS
  1814. ;
  1815. LOOP10:      MVI    M,' '        ;..WITH 0, NEXT 11 WITH..
  1816.       INX    H        ;..WITH BLANKS, AND LAST..
  1817.       DCR    B        ;..21 WITH NULLS.
  1818.       JNZ    LOOP10
  1819.       MVI    B,21
  1820. ;
  1821. LOOP11:      MVI    M,0
  1822.       INX    H
  1823.       DCR    B
  1824.       JNZ    LOOP11
  1825.       RET
  1826. ;.....
  1827. ;
  1828. ;
  1829. ; SCANS CMDBUF COUNTING NAMES AND PUTTING DELIMITER (SPACE) AFTER LAST
  1830. ; NAME
  1831. ;
  1832. SCAN:      PUSH    H
  1833.       LXI    H,NAMECT
  1834.       MVI    M,0
  1835.       LXI    H,CMDBUF+1    ;FIND END OF CMD LINE..
  1836.       MOV    C,M        ;..AND PUT SPACE THERE.
  1837.       MVI    B,0
  1838.       LXI    H,CMDBUF+2
  1839.       DAD    B
  1840.       MVI    M,' '
  1841.       LXI    H,CMDBUF+1
  1842.       MOV    B,M
  1843.       INR    B
  1844.       INR    B
  1845. ;
  1846. SCANLP1:  INX    H
  1847.       DCR    B
  1848.       JZ    DNSCAN
  1849.       MOV    A,M
  1850.       CPI    ' '
  1851.       JNZ    SCANLP1
  1852. ;
  1853. SCANLP2:  INX    H        ;EAT EXTRA SPACES
  1854.       DCR    B
  1855.       JZ    DNSCAN
  1856.       MOV    A,M
  1857.       CPI    ' '
  1858.       JZ    SCANLP2
  1859.       SHLD    BGNMS        ;SAVE START OF NAMES IN CMDBUF
  1860.       INR    B
  1861.       DCX    H
  1862. ;
  1863. SCANLP3:  INX    H
  1864.       DCR    B
  1865.       JZ    DNSCAN
  1866.       MOV    A,M
  1867.       CPI    ' '
  1868.       JNZ    SCANLP3
  1869.       LDA    NAMECT        ;COUNTS NAMES
  1870.       INR    A
  1871.       STA    NAMECT
  1872. ;
  1873. SCANLP4:  INX    H        ;EAT SPACES
  1874.       DCR    B
  1875.       JZ    DNSCAN
  1876.       MOV    A,M
  1877.       CPI    ' '
  1878.       JZ    SCANLP4
  1879.       JMP    SCANLP3
  1880. ;.....
  1881. ;
  1882. ;
  1883. DNSCAN:      MVI    M,' '        ;SPACE AFTER LAST CHAR
  1884.       POP    H
  1885.       RET
  1886. ;.....
  1887. ;
  1888. ;
  1889. ; PLACES NEXT NAME IN BUFFER SO 'CMDLINE' MAY PARSE IT
  1890. ;
  1891. TRTOBUF:  LHLD    BGNMS
  1892.       MVI    B,0
  1893.       LXI    D,FCBBUF+2
  1894. ;
  1895. TBLP:      MOV    A,M
  1896.       CPI    ' '
  1897.       JZ    TRBFEND
  1898.       STAX    D
  1899.       INX    H
  1900.       INX    D
  1901.       INR    B        ;COUNT CHARS IN NAME
  1902.       JMP    TBLP
  1903. ;.....
  1904. ;
  1905. ;
  1906. TRBFEND:  INX    H
  1907.       MOV    A,M        ;EAT EXTRA SPACES
  1908.       CPI    ' '
  1909.       JZ    TRBFEND
  1910.       SHLD    BGNMS
  1911.       LXI    H,FCBBUF+1    ;PUT # CHARS BEFORE NAME
  1912.       MOV    M,B
  1913.       RET
  1914. ;.....
  1915. ;
  1916. ;
  1917. ; IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'.
  1918. ;
  1919. CKCPM2:      MVI    C,CPMVER    ;BDOS 12 -- VERSION NUMBER -- CP/M 2.2?
  1920.       CALL    BDOS
  1921.       ORA    A    
  1922.       RZ
  1923.       MVI    C,SETDMA
  1924.       LXI    D,80H
  1925.       CALL    BDOS
  1926.       MVI    C,SRCHF
  1927.       LXI    D,FCB
  1928.       CALL    BDOS
  1929.       CPI    0FFH
  1930.       RZ
  1931. ;
  1932.       ADD    A
  1933.       ADD    A
  1934.       ADD    A
  1935.       ADD    A        ;..32 TO FIND..
  1936.       ADD    A        ;..NAME IN DMA.
  1937.       LXI    H,80H
  1938.       ADD    L
  1939.       MOV    L,A        ;'HL' POINTS TO DIRECTORY NAME
  1940.       LXI    D,9
  1941.       DAD    D        ;POINT TO R/O ATTRIBUTE BYTE
  1942.       MOV    A,M
  1943.       ANI    80H        ;TEST MOST SIGNIFICANT BYTE
  1944.       JNZ    MKCHG        ;IF SET, MAKE CHANGE
  1945.       INX    H        ;CHECK SYSTEM ATTRIBUTE BYTE
  1946.       MOV    A,M
  1947.       ANI    80H
  1948.       RZ            ;NOT $SYS OR $R/O ATTRIBUTE
  1949.       DCX    H
  1950. ;
  1951. MKCHG:      LXI    D,-8
  1952.       DAD    D        ;POINT HL TO FILENAME + 1
  1953.       LXI    D,FCB+1        ;MOVE DIRECTORY NAME TO FCB..
  1954.       MVI    B,11        ;..WITHOUT CHANGING DRIVE.
  1955.       CALL    MOVE
  1956.       LXI    H,FCB+9        ;R/O ATTRIBUTE
  1957.       MOV    A,M
  1958.       ANI    7FH        ;STRIP R/O ATTRIBUTE
  1959.       MOV    M,A
  1960.       INX    H        ;SYSTEM ATTRIBUTE
  1961.       MOV    A,M
  1962.       ANI    7FH
  1963.       MOV    M,A
  1964.       LXI    D,FCB
  1965.       MVI    C,30        ;SET NEW ATTRIBUTES IN DIRECTORY
  1966.       CALL    BDOS
  1967. ;
  1968. ;
  1969. ; CALLED BY CKBAKUP BELOW, RETURN DONE HERE THROUGH BDOS JUMP
  1970. ;
  1971. PLANCHG:  LXI    H,FCB        ;CHANGE NAME TO TYPE "BAK"
  1972.       LXI    D,FCB2
  1973.       MVI    B,9        ;MOVE DRIVE AND NAME (NOT TYPE)
  1974.       CALL    MOVE
  1975.       LXI    H,75H        ;START OF TYPE IN FCB2
  1976.       MVI    M,'B'
  1977.       INX    H
  1978.       MVI    M,'A'
  1979.       INX    H
  1980.       MVI    M,'K'
  1981.       LXI    D,FCB2
  1982.       MVI    C,ERASE        ;ERASE ANY PREV BACKUPS
  1983.       CALL    BDOS
  1984.       LXI    H,FCB2        ;FCB2 DR FIELD SHOULD..
  1985.       MVI    M,0        ;..0 FOR RENAME.
  1986.       LXI    D,FCB
  1987.       MVI    C,23        ;RENAME
  1988.       JMP    BDOS
  1989. ;.....
  1990. ;
  1991. ;
  1992. CKBAKUP:  LDA    BAKUPBYTE
  1993.       ORA    A
  1994.       RZ
  1995.       MVI    C,SRCHF
  1996.       LXI    D,FCB
  1997.       CALL    BDOS
  1998.       INR    A
  1999.       RZ            ;FILE NOT FOUND
  2000.       JMP    PLANCHG        ;IN "CKCPM2" - RET DONE THERE
  2001. ;.....
  2002. ;
  2003. ;
  2004. ;***********************************************************************
  2005. ;
  2006. ; RECEIVE A RECORD FROM SENDING STATION
  2007. ;
  2008. ;***********************************************************************
  2009. ;
  2010. ;
  2011. RCVRECD:  MVI    A,1
  2012.       STA    ERRCT
  2013.       XRA    A
  2014.       STA    ONERR
  2015. ;
  2016. RCVRPT:      XRA    A        ;ZERO ACCUM
  2017.       STA    ERRCDE        ;CLEAR RECEIVE ERROR CODE
  2018.       
  2019.       CALL    CKABORT        ;WANT TO STOP RECEIVING FILE?
  2020.       LDA    QFLG
  2021.       ORA    A
  2022.       JZ    RCVSQ
  2023.       CALL    ILPRT
  2024.       DB    CR,'Awaiting # ',0
  2025.       PUSH    H        ;SAVE IT
  2026.       LHLD    RECDNO        ;GET RECORD NUMBER
  2027.       INX    H        ;BUMP IT
  2028.       CALL    DECOUT        ;PRINT RECORD NUMBER IN DECIMAL
  2029.       CALL    ILPRT
  2030.       DB    ' (', 0
  2031.       CALL    DHXOUT        ;16-BIT HEX CONVERSION AND OUTPUT
  2032.       CALL    ILPRT
  2033.       DB    'H) ',0
  2034.       MOV    A,L        ;ONLY LOW BYTE USED BY PROGRAM
  2035.       POP    H        ;RESTORE IT
  2036. ;
  2037. ;
  2038. ; If CRC is in effect, there is a 10-second timeout to the first SOH.
  2039. ; It then tries several more times to let the sender know the system is
  2040. ; capable of receiving a CRC check.  At the end of that time a NAK is
  2041. ; sent which tells the sender to use CHECKSUM checking instead of CRC.
  2042. ; This allows automatic compatability with systems implementing CRC -
  2043. ; (Cyclic Redundancy Checking).
  2044. ;
  2045. ; During this time incoming CRC and NAK characters are ignored as these
  2046. ; may be the ones we are sending at each timeout, coming back from the
  2047. ; full duplex system.
  2048. ;
  2049. RCVSQ:      MVI    B,10-1        ;10-SECOND WAIT FOR 'SOH' OR 'EOT' CHAR.
  2050.       CALL    RECV        ;..(EXTRA 1 SECOND FROM RCVSERR)
  2051.       JC    RCVSTOT        ;SEND TIMEOUT MSG IF NO CHAR. IN 10 SEC.
  2052.       CALL    RCVERR        ;SEE IF IT WAS AN I/O ERROR
  2053.       CPI    SOH        ;GET A START OF HEADER?
  2054.       JZ    RCVSOH
  2055.       ORA    A
  2056.       JZ    RCVSQ
  2057.       CPI    CRC        ;IGNORE OUR OWN 'CRC' CHAR. IF ANY
  2058.       JZ    RCVSQ        ;DO NOT COUNT THIS AS A TIMEOUT
  2059.       CPI    NAK        ;IGNORE OUR OWN 'NAK' CHAR. IF ANY
  2060.       JZ    RCVSQ        ;DO NOT COUNT THIS AS A TIMEOUT
  2061.       CPI    EOT
  2062.       STC
  2063.       RZ
  2064. ;
  2065.       MOV    B,A
  2066.       LDA    BATCHFLG    ;USING BATCH MODE NOW?
  2067.       ORA    A
  2068.       JNZ    RCVSQ1        ;IF NOT, EXIT
  2069.       LDA    ONERR        ;THIS THE FIRST ERROR THIS TRANSFER?
  2070.       ORA    A
  2071.       JNZ    RCVSQ1        ;IF NOT, HANDLE NORMALLY^
  2072.       STA    ERRCT        ;RESET THE ERROR COUT TO EXCLUDE THIS
  2073.       CMA            ;IF YES, IGNORE THIS ERROR
  2074.       STA    ONERR        ;SET THE FLAG
  2075.       JMP    RCVSERR    
  2076. ;
  2077. RCVSQ1:   CALL    RCVQERR        ;SEE IF QUIET MODE
  2078. ;
  2079. RCVSQ2:      MOV    A,B
  2080.       CALL    CRLF
  2081.       CALL    HEXO
  2082.       CALL    ILPRT
  2083.       DB    'H received not SOH - ',0
  2084. ;
  2085. RCVPRN:      CALL    SHOWERR        ;DISPLAY ERROR COUNT
  2086. ;
  2087. RCVSERR:  MVI    B,1        ;1 SECOND WAIT AFTER ANY CHAR. IS SENT..
  2088.       CALL    RECV        ;..TO INSURE SENDER IS WAITING TO COPY
  2089.       JNC    RCVSERR     ;IF STILL SENDING, IGNORE ALL CHARS.
  2090.       CALL    CKABORT        ;WANT TO STOP RECEIVING NOW?
  2091.       LDA    CRCFLAG        ;GET 'CRC' FLAG
  2092.       ORA    A        ;'CRC' IN EFFECT?
  2093.       MVI    A,NAK        ;PUT 'NAK' IN ACCUM
  2094.       JNZ    RCVSER1        ;NO, SEND THE 'NAK'
  2095.       LDA    FIRSTME     ;GET FIRST TIME SWITCH
  2096.       ORA    A        ;HAS FIRST SOH BEEN RECEIVED?
  2097.       MVI    A,NAK
  2098.       JZ    RCVSER1        ;YES, THEN SEND 'NAK'
  2099.       MVI    A,CRC        ;TELL SENDER 'CRC' IS IN EFFECT
  2100. ;
  2101. RCVSER1:  CALL    SEND        ;SEND THE 'NAK' OR 'CRC' REQUEST
  2102.       LDA    ERRCT        ;INCREMENT THE  ERROR COUNT
  2103.       INR    A
  2104.       STA    ERRCT
  2105.       CPI    10+1        ;IF 10 ALREADY, ABORT
  2106.       JC    RCVRPT        ;IF LESS THAN 10, KEEP GOING
  2107.       JMP    ABORT
  2108. ;.....
  2109. ;
  2110. ;
  2111. RCVQERR:  LDA    QFLG        ;SEE IF QUIET MODE NOW
  2112.       ORA    A
  2113.       RNZ            ;IF NOT, PROCEED NORMALLY
  2114.       POP    H        ;RESET STACK FOR 'CALL'
  2115.       JMP    RCVSERR
  2116. ;.....
  2117. ;
  2118. ;
  2119. RCVSABT:  LXI    SP,STACK    ;RESET THE STACK JUST IN CASE
  2120.       CALL    CLOSFIL        ;CLOSE THE PARTIAL FILE
  2121.       CALL    NOASK        ;DELETE PARTIAL FILE
  2122.       CALL    ILPRT
  2123.       DB    CR,LF,LF
  2124.       DB    '++ RECEIVED FILE CANCELLED ++',CR,LF,BELL
  2125.       DB    '++ UNFINISHED FILE DELETED ++',CR,LF,0
  2126.       JMP    DONETCA
  2127. ;.....
  2128. ;
  2129. ;
  2130. ; TIMEOUT ROUTINE EACH 10 SECONDS OF NO 'SOH' (START-OF-HEADER)
  2131. ;
  2132. RCVSTOT:  MVI    A,TRUE
  2133.       STA    ONERR
  2134.       LDA    QFLG
  2135.       ORA    A
  2136.       JZ    RCVSTOT1
  2137.       CALL    ILPRT
  2138.       DB    CR,LF,'++ Timeout ',0
  2139.       CALL    SHOWERR        ;DISPLAY THE CURRENT ERROR COUNT
  2140. ;
  2141. ;
  2142. ; ROUTINE WILL SWITCH FROM CRC TO CHECKSUM IF ERCNT REACHES ERRCRC AND
  2143. ; CURRENTLY IN CRC MODE.
  2144. ;
  2145. RCVSTOT1: LDA    ERRCT        ;GET THE ERROR COUNT
  2146.       CPI    ERRCRC        ;SEE IF LESS THAN CRC-ERROR TRY LIMIT
  2147.       JC    RCVSTOT2    ;IF YES, KEEP TRYING
  2148.       LDA    FIRSTME        ;OTHERWISE SEE IF WE ALREADY GOT A SOH
  2149.       ORA    A
  2150.       JZ    RCVSTOT2    ;IF YES, DON'T SWITCH TO CHECKSUM
  2151.       LDA    CRCFLAG        ;IF NOT, SEE IF ALREADY IN CHECKSUM
  2152.       ORA    A
  2153.       JNZ    RCVSTOT2
  2154.       MVI    A,TRUE        ;SHOW IN CHECKSUM NOW
  2155.       STA    CRCFLAG        ;CHANGE FROM CRC TO CHECKSUM
  2156.       STA    CKSUMDFLT    ;OPTION FLAG NOW SHOWS CHECKSUM...
  2157.       CALL    ILPRT        ;...FOR FUTURE FILES
  2158.       DB    '++ Switching to CHECKSUM mode ++',CR,LF,BELL,0
  2159. ;
  2160. RCVSTOT2: JMP    RCVSERR        ;INCREMENT ERROR COUNT
  2161. ;.....
  2162. ;
  2163. ;
  2164. ; GET THE ERROR COUNT AND DISPLAY ON CRT
  2165. ;
  2166. SHOWERR:  PUSH    H        ;SAVE THE CURRENT ADDRESS
  2167.       LHLD    ERRCT        ;GET THE CURRENT ERROR NUMBER
  2168.       MVI    H,0        ;ONLY A 8-BIT NUMBER, NOW IN 'L' REG.
  2169.       CALL    DECOUT        ;DISPLAY THE ERROR IN DECIMAL
  2170.       POP    H        ;RESTORE THE CURRENT ADDRESS
  2171.       CALL    ILPRT
  2172.       DB    ' ++',CR,LF,0    ;FINISH THE ERROR MESSAGE
  2173.       RET
  2174. ;.....
  2175. ;
  2176. ;
  2177. ;---->    RCVERR:
  2178. ;
  2179. ; Checks for framing, overrun, and parity errors.  Parity errors cannot
  2180. ; be detected unless the parity option has been selected.
  2181. ;    1. Error code (ERRCDE) was set in RECV routine.
  2182. ;    2. ERRCDE=0 for no errors, ERRCDE<>0 for errors.
  2183. ;    3. If there is an error, routine returns with carry flag set.
  2184. ;
  2185. RCVERR:      PUSH    PSW        ;SAVE CHARACTER RECEIVED
  2186.       LDA    ERRCDE        ;CHECK FOR ANY RECEIVE ERROR
  2187.       ORA    A
  2188.       JNZ    RCVDERR        ;IF AN ERROR GO SHOW WHICH ERROR IT IS
  2189.       POP    PSW        ;IF NO ERROR, GET RECEIVED CHAR. BACK
  2190.       RET
  2191. ;...
  2192. ;
  2193. ;
  2194. ;----> RCVDERR:  Checks for a receive error and displays an appropriate
  2195. ;                error message.  Then goes to RCVSERR to purge the line
  2196. ;                and send a NAK.
  2197. ;
  2198. RCVDERR:  STA    ONERR
  2199.       POP    PSW        ;CLEAR STACK OF "PUSH PSW" IN 'RCVERR'
  2200.       POP    PSW        ;CLEAR STACK OF "CALL  RCVERR"
  2201.       CALL    RCVQERR        ;SEE IF QUIET MODE
  2202.       LDA    ERRCDE        ;GET RECEIVE ERR CODE
  2203.       ANI    FRMER        ;WAS THERE A FRAMING ERROR?
  2204.       JZ    RCVDERR1    ;NO, GO CHECK FOR OVERRUN
  2205.       CALL    ILPRT
  2206.       DB    CR,LF,'++ Framing error ',0
  2207.       JMP    RCVPRN        ;PRINT # OF ERROR
  2208. ;
  2209. RCVDERR1: LDA    ERRCDE        ;GET RECEIVE ERR CODE
  2210.       ANI    ORUNER        ;WAS THERE AN OVERRUN
  2211.       JZ    RCVDERR2    ;NO, GO CHECK FOR PARITY ERROR
  2212.       CALL    ILPRT
  2213.       DB    CR,LF,'++ Overrun error ',0
  2214.       JMP    RCVPRN        ;PRINT # OF ERROR
  2215. ;
  2216. RCVDERR2: LDA    ERRCDE        ;GET RECEIVE ERR CODE
  2217.       ANI    PARER        ;WAS THERE A PARITY ERROR?
  2218.       JZ    RCVRPT        ;NO, GO PURGE LINE
  2219.       CALL    ILPRT
  2220.       DB    CR,LF,'++ Parity error ',0
  2221.       JMP    RCVPRN        ;PRINT # OF ERROR
  2222. ;.....
  2223. ;
  2224. ;
  2225. ; GOT SOH - GET BLOCK #, BLOCK # COMPLEMENTED
  2226. ;
  2227. RCVSOH:      XRA    A        ;ZERO ACCUM
  2228.       STA    FIRSTME     ;INDICATE FIRST SOH RECV'D
  2229.       MVI    B,1        ;1-SECOND DELAY
  2230.       CALL    RECV        ;GET RECORD
  2231.       JC    RCVSTOT     ;GOT TIMEOUT
  2232.       CALL    RCVERR        ;CHECK FOR RECEIVE ERROR
  2233.       MOV    D,A
  2234.       MVI    B,1
  2235.       CALL    RECV
  2236.       JC    RCVSTOT
  2237.       CALL    RCVERR        ;CHECK FOR RECEIVE ERROR
  2238.       CMA
  2239.       CMP    D
  2240.       JZ    RCVDATA
  2241.       CALL    RCVQERR
  2242.       CALL    ILPRT
  2243.       DB    CR,LF,'++  Bad sector # in header',0
  2244.       JMP    RCVPRN
  2245. ;.....
  2246. ;
  2247. ;
  2248. RCVDATA:  MOV    A,D
  2249.       STA    RCVRNO
  2250.       MVI    A,1
  2251.       STA    DATAFLG
  2252.       MVI    C,0
  2253.       CALL    CLRCRC        ;CLEAR CRC COUNTER
  2254.       LXI    H,80H
  2255. ;
  2256. RCVCHR:      MVI    B,1
  2257.       CALL    RECV
  2258.       JC    RCVSTOT
  2259.       CALL    RCVERR        ;CHECK FOR RECEIVE ERROR
  2260.       MOV    M,A
  2261.       INR    L
  2262.       JNZ    RCVCHR
  2263.       XRA    A 
  2264.       STA    DATAFLG
  2265.       LDA    CRCFLAG        ;IN 'CRC' MODE?
  2266.       ORA    A
  2267.       JZ    RCVCRC        ;IF YES, EXIT
  2268.       MOV    D,C
  2269.       MVI    B,1
  2270.       CALL    RECV
  2271.       JC    RCVSTOT
  2272.       CALL    RCVERR        ;CHECK FOR RECEIVE ERROR
  2273.       CMP    D
  2274.       JNZ    RCVCERR
  2275. ;
  2276. CHKSNUM:  LDA    RCVRNO
  2277.       MOV    B,A
  2278.       LDA    RECDNO
  2279.       CMP    B
  2280.       JZ    RECVACK
  2281.       INR    A
  2282.       CMP    B
  2283.       JNZ    ABORT
  2284.       RET
  2285. ;.....
  2286. ;
  2287. ;
  2288. RCVCRC:   MVI    E,2        ;NUMBER OF CRC BYTES
  2289. ;
  2290. RCVCRC1:  MVI    B,1
  2291.       CALL    RECV
  2292.       JC    RCVSTOT
  2293.       CALL    RCVERR        ;SEE IF ANY RECEIVE ERRORS
  2294.       DCR    E
  2295.       JNZ    RCVCRC1
  2296.       CALL    CHKCRC        ;CHECK 'CRC' BYTES OF RECEIVED MESSAGE
  2297.       ORA    A
  2298.       JZ    CHKSNUM        ;IF OK, EXIT
  2299.       CALL    RCVQERR        ;SEE IF QUIET MODE
  2300.       CALL    ILPRT        ;IF NOT, SHOW ERROR MESSAGE
  2301.       DB    CR,LF,'++ CRC error ',0
  2302.       JMP    RCVPRN        ;SHOW ERROR NUMBER
  2303. ;.....
  2304. ;
  2305. ;
  2306. RCVCERR:  CALL    RCVQERR        ;SEE IF QUIET MODE
  2307.       CALL    ILPRT        ;IF NOT, SHOW ERROR MESSAGE
  2308.       DB    CR,LF,'++ CHECKSUM error ++ ',0
  2309.       JMP    RCVPRN        ;SHOW ERROR NUMBER
  2310. ;.....  
  2311. ;
  2312. ;
  2313. RECVACK:  CALL    SENDACK
  2314.       JMP    RCVRECD
  2315. ;.....
  2316. ;
  2317. ;
  2318. SENDACK:  MVI    A,ACK
  2319.       CALL    SEND
  2320.       RET
  2321. ;.....
  2322. ;
  2323. ;
  2324. SENDHDR:  LDA    QFLG
  2325.       ORA   A
  2326.       JZ    SENDHNM
  2327.         CALL    ILPRT
  2328.       DB    CR,'Sending # ',0
  2329.       PUSH    H        ;STORE CURRENT ADDRESS
  2330.       LHLD    RECDNO        ;GET RECORD NUMBER
  2331.       CALL    DECOUT        ;PRINT IT IN DECIMAL
  2332.       CALL    ILPRT
  2333.       DB    ' (',0
  2334.       CALL    DHXOUT        ;16 BIT HEX CONVERSION & OUTPUT
  2335.       CALL    ILPRT
  2336.       DB    'H) ',0
  2337.       POP    H        ;RESTORE CURRENT ADDRESS
  2338. ;
  2339. SENDHNM:  MVI    A,SOH        ;SEND 'SOH' CHARACTER TO THE OUTPUT
  2340.       CALL    SEND
  2341.       LDA    RECDNO        ;SEND RECORD NUMBER TO THE OUTPUT
  2342.       CALL    SEND
  2343.       LDA    RECDNO
  2344.       CMA            ;COMPLEMENT THE RECORD NUMBER
  2345.       JMP    SEND        ;SEND THIS VALUE TO THE OUTPUT
  2346. ;.....
  2347. ;
  2348. ;
  2349. SENDREC:  MVI    A,1
  2350.       STA    DATAFLG
  2351.       MVI    C,0
  2352.       CALL    CLRCRC
  2353.       LXI    H,80H
  2354. ;
  2355. SENDC:      MOV    A,M
  2356.       CALL    SEND
  2357.       INR    L
  2358.       JNZ    SENDC
  2359.       XRA    A
  2360.       STA    DATAFLG
  2361.       RET
  2362. ;.....
  2363. ;
  2364. ;
  2365. SENDCKS:  MOV    A,C
  2366.       JMP    SEND
  2367. ;.....
  2368. ;
  2369. ;
  2370. SENDCRC:  CALL    FINCRC
  2371.       MOV    A,D
  2372.       CALL    SEND
  2373.       MOV    A,E
  2374.       CALL    SEND
  2375.       XRA    A
  2376.       RET
  2377. ;.....
  2378. ;
  2379. ;
  2380. GETACK:      MVI    B,10        ;10-SECONDS MAXIMUM WAIT TIME
  2381.       CALL    RECVDG
  2382.       JC    GETATOT
  2383.       CPI    ACK
  2384.       RZ            ;ALL DONE IF 'ACK' CHARACTER RECEIVED
  2385.       MOV    B,A        ;OTHERWISE SHOW WHAT THE CHARACTER WAS
  2386.       LDA    QFLG
  2387.       ORA    A
  2388.       JZ    ACKERR
  2389.       MOV    A,B
  2390.       CALL    CRLF
  2391.       CPI    NAK        ;IS IT A NAK?
  2392.       JZ    GETACK1        ;SHOW 'NAK' IN THAT CASE
  2393.       CALL    HEXO
  2394.       CALL    ILPRT
  2395.       DB    'H',0
  2396.       JMP    GETACK2
  2397. ;
  2398. GETACK1:  CALL    ILPRT
  2399.       DB    'NAK',0    
  2400. ;
  2401. GETACK2:  CALL    ILPRT        ;PRINT THE ERROR MESSAGE
  2402.       DB    ' received not ACK - ',0
  2403.       CALL    SHOWERR        ;SHOW THE ERROR NUMBER
  2404. ;
  2405. ACKERR:      LDA    ERRCT        ;INCREMENT THE ERROR COUNT
  2406.       INR    A
  2407.       STA    ERRCT
  2408.       CPI    10+1        ;SEE IF AT THE LIMIT OF 10 ERRORS YET    
  2409.       RC            ;IF NOT, RETURN
  2410.       CALL    ERXIT
  2411.       DB    CR,LF,'++ SEND-FILE CANCELLED ++','$'
  2412. ;.....
  2413. ;
  2414. ;
  2415. ; TIME-OUT MESSAGE ON ACK
  2416. ;
  2417. GETATOT:  CALL    ILPRT
  2418.       DB    CR,LF,'TIMEOUT on ACK',CR,LF,0
  2419.       JMP    ACKERR
  2420. ;.....
  2421. ;
  2422. ;
  2423. CKABORT:  LDA    QFLG
  2424.       ORA    A
  2425.       RZ
  2426.       CALL    STAT
  2427.       RZ
  2428.       CALL    KEYIN
  2429.       CPI    CAN
  2430.       RNZ
  2431. ;
  2432. ;
  2433. ; ABORTS SEND OR RECEIVE ROUTINES AND RETURNS TO COMMAND LINE
  2434. ;
  2435. ABORT:      LXI    SP,STACK
  2436. ;
  2437. ABORTL:      MVI    B,1        ;1-SECOND DELAY TO CLEAR INPUT
  2438.       CALL    RECV
  2439.       JNC    ABORTL
  2440.       MVI    A,CAN        ;SHOW YOU ARE CANCELLING
  2441.       CALL    SEND
  2442. ;
  2443. ABORTW:      MVI    B,1        ;1-SECOND DELAY TO CLEAR INPUT
  2444.       CALL    RECV
  2445.       JNC    ABORTW
  2446.       MVI    A,' '
  2447.       CALL    SEND
  2448.       MVI    A,'B'       ;TURN MULTI-FILE MODE..
  2449.       STA    BATCHFLG      ;..OFF SO ROUTINE ENDS.
  2450.       MVI    A,TRUE
  2451.       STA    ABORTFLG    ;SHOWS AN ABORT WAS MADE
  2452.       STA    NFILFLG        ;STOP COPY INTO CRT
  2453.       LDA    OPTION        ;RECEIVING A FILE NOW?
  2454.       CPI    'R'
  2455.       JZ    RCVSABT        ;IF YES, CANCEL THE UNFINISHED FILE
  2456.       CALL    ILPRT
  2457.        DB    CR,LF,LF,'++ FILE CANCELLED ++',CR,LF,BELL,0
  2458.       JMP    DONETCA
  2459. ;.....
  2460. ;
  2461. ;
  2462. INCRRNO:  PUSH    H
  2463.       LHLD    RECDNO        ;GET RECORD NUMBER
  2464.       INX    H        ;BUMP IT
  2465.       SHLD    RECDNO        ;STORE IT
  2466.       MOV    A,L
  2467.       POP    H
  2468.       RET
  2469. ;.....
  2470. ;
  2471. ;
  2472. ; First check for any wild cards and disallow, just to be safe.  Do not
  2473. ; want a group of files being accidently erased.
  2474. ;
  2475. ERASFIL:  LXI    H,FCB        ;FILE NAME IS STORED HERE
  2476.       MVI    B,11        ;MAXIMUM OF 11 CHARS FOR FILENAME.EXT
  2477. ;
  2478. ERASFIL1: INX    H        ;NEXT LOCATION IN FILE NAME
  2479.       MOV    A,M        ;GET THE CHAR.
  2480.       CPI    '?'        ;CHECK FOR ANY WILD CARD CHARS.
  2481.       JZ    ERRORW        ;ERROR IF ONE IS FOUND
  2482.       DCR    B        ;NUMBER OF TRIES LEFT
  2483.       JNZ    ERASFIL1    ;IF NOT ZERO, KEEP CHECKING
  2484.       LDA    BATCHFLG    ;DON'T ASK FOR ERASE..
  2485.       ORA    A        ;..IN MULTI-FILE MODE,..
  2486.       JZ    NOASK        ;..JUST DO IT.
  2487.       LXI    D,FCB
  2488.       MVI    C,SRCHF
  2489.       CALL    BDOS
  2490.       INR    A
  2491.       RZ            ;FILE ERASED OK, RETURN
  2492.       CALL    ILPRT        ;OTHERWISE MAKE SURE IT'S OK
  2493.       DB    'File exists - erase?  (Y/N): ',BELL,0
  2494.       CALL    KBDCHR
  2495.       CPI    'Y'
  2496.       JNZ    MENU        ;IF NOT A 'Y' DO NOT ERASE
  2497.       CALL    CRLF        ;OTHERWISE ERASE THE FILE
  2498. ;
  2499. NOASK:      LXI    D,FCB
  2500.       MVI    C,ERASE
  2501.       JMP    BDOS
  2502. ;.....
  2503. ;
  2504. ;
  2505. ERRORW:   POP    H        ;RESTORE STACK FROM "CALL ERASFIL"
  2506.       CALL    ILPRT
  2507.       DB    '++ NO WILDCARDS ALLOWED FOR TEXT FILES ++'
  2508.       DB    CR,LF,BELL,0
  2509.       JMP    MENU
  2510. ;.....
  2511. ;
  2512. ;
  2513. BLKFILE:  CALL    ILPRT        ;ROUTINE IF NO FILE IS NAMED FOR
  2514. ;                ;"SEND" OR "RECEIVE"
  2515.       DB    '++ NO FILE SPECIFIED ++',CR,LF,BELL,0
  2516.       JMP    MENU
  2517. ;.....
  2518. ;
  2519. ;
  2520. MAKEFIL:  LXI    D,FCB
  2521.       MVI    C,MAKE
  2522.       CALL    BDOS
  2523.       INR    A
  2524.       RNZ
  2525.       CALL    ERXIT
  2526.       DB    '++ ERROR -- Can''t open file ++',CR,LF
  2527.       DB    '++ Directory is likely full ++','$'
  2528. ;
  2529. CNREC:      MVI    C,FILSIZ    ;COMPUTE FILE SIZE FUNCTION IN CP/M 2.x
  2530.       LXI    D,FCB        ;POINT TO FILE CONTROL BLOCK
  2531.       CALL    BDOS
  2532.       LHLD    FCB+33        ;GET RECORD COUNT
  2533.       SHLD    RCNT        ;STORE IT
  2534.       LXI    H,0        ;ZERO 'HL'
  2535.       SHLD    FCB+33        ;RESET RANDOM RECORD IN FCB
  2536.       RET
  2537. ;
  2538. ;.....
  2539. ;
  2540. ;
  2541. OPENFIL:  XRA    A
  2542.       STA    FCBEXT
  2543.       LXI    D,FCB
  2544.       MVI    C,OPEN
  2545.       CALL    BDOS
  2546.       INR    A
  2547.       JNZ    SENDTIME    ;SEND TRANSFER TIME, # OF RECORDS, ETC.
  2548.       CALL    ERXIT        ;FILE DID NOT OPEN
  2549.       DB    '++ FILE NOT FOUND ++','$'
  2550. ;
  2551. ;.....
  2552. ;
  2553. ;
  2554.  
  2555. CLOSFIL:  LXI    D,FCB
  2556.       MVI    C,CLOSE
  2557.       CALL    BDOS
  2558.       INR    A
  2559.       RNZ
  2560.       CALL    ERXIT
  2561.       DB    CR,LF,'++ UNABLE TO CLOSE FILE ++','$'
  2562. ;.....
  2563. ;
  2564. ;
  2565. ; UPDATE RECORD READ
  2566. ;
  2567. RDRECD:      LDA    RECINBF
  2568.       DCR    A
  2569.       STA    RECINBF
  2570.       JM    RDBLOCK
  2571.       LHLD    RECPTR
  2572.       LXI    D,80H
  2573.       CALL    MOVE128
  2574.       SHLD    RECPTR
  2575.       RET
  2576. ;.....
  2577. ;
  2578. ;
  2579. ; BUFFER EMPTY SO READ IN ANOTHER BLOCK (UP TO 16K OR 128 RECORDS)
  2580. ;
  2581. RDBLOCK:  LDA    EOFLG
  2582.       CPI    1
  2583.       STC
  2584.       RZ
  2585.       MVI    C,0
  2586.       LXI    D,DBUF
  2587. ;
  2588. RDRECLP:  PUSH    B
  2589.       PUSH    D
  2590.       MVI    C,SETDMA
  2591.       CALL    BDOS
  2592.       LXI    D,FCB
  2593.       MVI    C,READ
  2594.       CALL    BDOS
  2595.       POP    D
  2596.       POP    B
  2597.       ORA    A
  2598.       JZ    RDRECOK
  2599.       DCR    A
  2600.       JZ    REOF
  2601.       CALL    ERXIT
  2602.       DB    '++ FILE READ ERROR ++','$'
  2603. ;
  2604. RDRECOK:  LXI    H,80H
  2605.       DAD    D
  2606.       XCHG
  2607.       INR    C
  2608.       MOV    A,C
  2609.       CPI    DBUFSIZ*8    ;BUFFER SIZE IN 128 BYTE RECORDS
  2610.       JZ    RDBFULL
  2611.       JMP    RDRECLP
  2612. ;...
  2613. ;
  2614. ;
  2615. REOF:      MVI    A,1
  2616.       STA    EOFLG
  2617.       MOV    A,C
  2618. ;
  2619. ;
  2620. ; BUFFER FULL OR RECEIVED EOF
  2621. ;
  2622. RDBFULL:  STA    RECINBF
  2623.       LXI    H,DBUF
  2624.       SHLD    RECPTR
  2625.       LXI    D,80H
  2626.       MVI    C,SETDMA
  2627.       CALL    BDOS
  2628.       JMP    RDRECD
  2629. ;.....
  2630. ;
  2631. ;
  2632. ; WRITE A RECORD
  2633. ;
  2634. WRRECD:      LHLD    RECPTR
  2635.       XCHG
  2636.       LXI    H,80H
  2637.       CALL    MOVE128
  2638.       XCHG
  2639.       SHLD    RECPTR
  2640.       LDA    RECINBF
  2641.       INR    A
  2642.       STA    RECINBF
  2643.       CPI    DBUFSIZ*8     ;BUFFER SIZE IN 128 BYTE RECORDS
  2644.       RNZ
  2645. ;
  2646. ;
  2647. ; WRITE A 16K BLOCK TO DISK (128 RECORDS)
  2648. ;
  2649. WRBLOCK:  LDA    RECINBF
  2650.       ORA    A
  2651.       RZ
  2652.       MOV    C,A
  2653.       LXI    D,DBUF
  2654. ;
  2655. DKWRLP:      PUSH    H
  2656.       PUSH    D
  2657.       PUSH    B
  2658.       MVI    C,SETDMA
  2659.       CALL    BDOS
  2660.       LXI    D,FCB
  2661.       MVI    C,WRITE
  2662.       CALL    BDOS
  2663.       POP    B
  2664.       POP    D
  2665.       POP    H
  2666.       ORA    A
  2667.       JNZ    WRERR
  2668.       LXI    H,80H
  2669.       DAD    D
  2670.       XCHG
  2671.       DCR    C
  2672.       JNZ    DKWRLP
  2673.       XRA    A
  2674.       STA    RECINBF
  2675.       LXI    H,DBUF
  2676.       SHLD    RECPTR
  2677.       RET
  2678. ;.....
  2679. ;
  2680. ;
  2681. ; ERROR WHILE WRITING A RECORD, SHOW WHY IT IS ABORTING
  2682. ;
  2683. WRERR:      MVI    C,CAN
  2684.       CALL    SEND
  2685.       CALL    ERXIT
  2686.       DB    CR,LF,'++ FILE WRITE ERROR ++','$'
  2687. ;.....
  2688. ;
  2689. ;
  2690. ;----> RECV: Receive a character
  2691. ;
  2692. ; Timeout time is in B, in seconds.  Entry via 'RECVDG' deletes garbage
  2693. ; characters on the line.  For example, having just sent a sector,
  2694. ; calling RECVDG will delete any line noise induced characters LONG
  2695. ; before the ACK/NAK would be received.
  2696. ;
  2697. RECVDG:      CALL    IN$MODDATP
  2698.       CALL    IN$MODDATP
  2699. ;
  2700. RECV:      PUSH    D        ;SAVE ANY CURRENT VALUES
  2701.       MOV    A,B        ;MULTIPLY 'B' BY 4 FOR EXTRA DELAY
  2702.       RAL
  2703.       RAL
  2704.       MOV    B,A
  2705. ;
  2706. MSEC:      CALL    CKABORT        ;WANT TO INTENTIONALLY ABORT?
  2707.       PUSH    H
  2708.       LXI    H,175        ;MASTER DELAY FACTOR
  2709.       CALL    FIXCNT
  2710.       PUSH    H        ;SAVE THE DELAY VALUE NOW IN 'HL'
  2711.       POP    D        ;GET IT BACK, BUT IN 'DE'
  2712.       POP    H        ;RESTORE THE STACK TO NORMAL
  2713. ;
  2714. MWTI:      CALL    RCVREADY    ;INPUT HAVE A CHARACTER READY?
  2715.       JZ    MCHAR        ;IF YES, EXIT
  2716.       DCR    E
  2717.       JNZ    MWTI
  2718.       DCR    D
  2719.       JNZ    MWTI
  2720.       DCR    B        ;NUMBER OF SECONDS WANTED
  2721.       JNZ    MSEC        ;IF NOT ZERO, DO 1-SECOND LOOP AGAIN
  2722.       POP    D        ;RESTORE ORIGINAL VALUES
  2723.       STC            ;NO CHARACTER SO SET CARRY BIT
  2724.       RET
  2725. ;.....
  2726. ;
  2727. ;
  2728. MCHAR:      LDA    PMMIBYTE    ;USING A PMMI MODEM?
  2729.       ORA    A
  2730.       JZ    MCHAR1        ;IF NOT, SKIP THE FOLLOWING LINES
  2731.       CALL    IN$MODCTLP      ;GET ERROR-STATUS BYTE
  2732.       ANI    ERRCDMSK        ;MASK OUT ALL EXCEPT ERROR BITS (3-5)
  2733.       STA    ERRCDE          ;SAVE THE ERROR CODE
  2734. ;
  2735. MCHAR1:      CALL    IN$MODDATP
  2736.       POP    D        ;RESTORE ORIGINAL VALUES
  2737.       PUSH    PSW
  2738.       CALL    UPDCRC        ;CALCULATE CRC
  2739.       ADD    C    
  2740.       MOV    C,A
  2741.       LDA    RSEEFLG
  2742.       ORA    A
  2743.       JZ    MONIN
  2744.       LDA    VSEEFLG
  2745.       ORA    A
  2746.       JNZ    NOMONIN
  2747.       LDA    DATAFLG
  2748.       ORA    A
  2749.       JZ    NOMONIN
  2750. ;
  2751. MONIN:      POP    PSW
  2752.       PUSH    PSW
  2753.       CALL    SHOW
  2754. ;
  2755. NOMONIN:  POP    PSW
  2756.       ORA    A
  2757.       RET
  2758. ;.....
  2759. ;
  2760. ;
  2761. ; SEND A CHARACTER TO THE MODEM
  2762. ;
  2763. SEND:      PUSH    PSW
  2764.       LDA    NSEEFLG
  2765.       ORA    A
  2766.       JZ    MONOUT
  2767.       LDA    SSEEFLG
  2768.       ORA    A
  2769.       JZ    MONOUT
  2770.       LDA    VSEEFLG
  2771.       ORA    A
  2772.       JNZ    NOMONOT
  2773.       LDA    DATAFLG
  2774.       ORA    A
  2775.       JZ    NOMONOT
  2776. ;
  2777. MONOUT:      POP    PSW
  2778.       PUSH    PSW
  2779.       CALL    SHOW
  2780. ;
  2781. NOMONOT:  POP    PSW
  2782.       PUSH    PSW
  2783.       CALL    UPDCRC        ;CALCULATE CRC
  2784.       ADD    C
  2785.       MOV    C,A
  2786.       LDA    NSEEFLG        ;NOT SENDING TO MODEM?
  2787.       ORA    A
  2788.       JZ    SENDW1        ;IF YES, EXIT
  2789. ;
  2790. SENDW:      CALL    SENDRDY
  2791.       JNZ    SENDW
  2792.       POP    PSW
  2793.       JMP    OUT$MODDATP
  2794. ;
  2795. SENDW1:      POP    PSW        ;RESTORE STACK
  2796.       RET
  2797. ;.....
  2798. ;
  2799. ;
  2800. ; WAITS FOR THE FIRST CHARACTER RECEIVED WHILE WAITING TO SEND A FILE.
  2801. ; IF A CHARACTER IS NOT RECEIVED IN ONE SECOND, IT LOOPS AGAIN UNTIL A
  2802. ; CHAR IS RECEIVED OR IT TIMES OUT.  THE COUNT IS SET FOR 100 SECONDS
  2803. ; BEFORE TIMEOUT.  THIS GIVES ENOUGH THE RECEIVING STATION AMPLE TIME
  2804. ; TO NAME A FILE, ETC.
  2805. ;
  2806. WAITNAK:  CALL    ILPRT
  2807.       DB    'Awaiting CRC request',CR,LF,0
  2808. ;
  2809. WAITNLP:  CALL    CKABORT
  2810.       MVI    B,1
  2811.       CALL    RECV
  2812.       CPI    CAN        ;WANT TO QUIT?
  2813.       JZ    ABORT
  2814.       CPI    CRC        ;CRC REQUEST?
  2815.       JZ    WAITCRC        ;YES, GO SET CRC FLAG
  2816.       CPI    NAK
  2817.       RZ
  2818.       DCR    E
  2819.       JNZ    WAITNLP
  2820.       JMP    ABORT
  2821. ;...
  2822. ;
  2823. ;
  2824. WAITCRC:  CALL    ILPRTQ
  2825.       DB    'CRC request received',CR,LF,0
  2826.       XRA    A
  2827.       STA    CRCFLAG        ;MAKE SURE IN 'CRC' MODE THEN
  2828.       RET
  2829. ;.....
  2830. ;
  2831. ;
  2832. ;--->PARITY: Routine to setup PMMI for odd/even parity.
  2833. ;
  2834. PARITY:      LDA    PMMIBYTE    ;IS MODEM A PMMI?
  2835.       ORA    A        ;SET FLAGS
  2836.       RZ            ;NO, RETURN
  2837. ;MOD(BGL)***
  2838.       LDA    PARTY        ;CURRENTLY 8/NONE?
  2839.       CPI    ORIGMOD        ;IF NOT, IGNORE
  2840.       RNZ
  2841.       LDA    OPARITY        ;GET ODD PARITY REQUEST BYTE
  2842.       ORA    A        ;SET FLAGS
  2843.       JNZ    EVENPAR        ;IF NOT ODD SEE IF IT IS EVEN
  2844.       LDA    UARTCTLB    ;GET UART/MODEM CONTROL BYTE
  2845.       ANI    ODPARMSK
  2846.       JMP    PARITY1
  2847. ;...
  2848. ;
  2849. ;
  2850. EVENPAR:  LDA    EPARITY     ;GET EVEN PARITY REQUEST BYTE
  2851.       ORA    A             ;SET FLAGS
  2852.       RNZ                   ;IF EVEN PARITY NOT SPECIFIED RETURN
  2853.       LDA    UARTCTLB      ;GET UART/MODEM CONTROL BYTE
  2854.       ANI    ODPARMSK      ;SET FOR PARITY
  2855.       ORI    EVPARMSK      ;NOW SET FOR EVEN PARITY
  2856. ;
  2857. PARITY1:  JMP    OUT$MODCTLP    ;SEND TO PMMI -
  2858. ;                ;WHEN OUT$MODCTLP DOES RET IT
  2859. ;.....                ;WILL GO BACK TO CALLING ROUTINE
  2860. ;
  2861. ;
  2862. NOPARIT:  LDA    PMMIBYTE
  2863.       ORA    A
  2864.       RZ
  2865.       LDA    UARTCTLB    ;GET UART/MODEM CONTROL BYTE
  2866.       ORI    NOPARMSK    ;RESET PARITY BIT ON PMMI
  2867.       JMP    OUT$MODCTLP
  2868. ;.....
  2869. ;
  2870. ;MOD(BGL)***
  2871. TOGLPAR:  LXI    H,PARTOG
  2872.       MOV    A,M
  2873.       DCX    H
  2874.       SUB    M
  2875.       MOV    M,A
  2876.       STA    UARTCTLB
  2877.       CALL    OUT$MODCTLP
  2878.       JMP    XPRT
  2879. ;.....
  2880. ;
  2881. ;
  2882. INITADR:  LHLD    1        ;BIOS WARM REBOOT JUMP VECTOR
  2883.       LXI    D,3
  2884.       DAD    D
  2885.       SHLD    VSTAT+1        ;BIOS CONSOLE STATUS JUMP VECTOR
  2886.       DAD    D
  2887.       SHLD    VKEYIN+1    ;BIOS CONSOLE KEYBOARD JUMP VECTOR
  2888.       DAD    D
  2889.       SHLD    VTYPE+1        ;BIOS CONSOLE CRT JUMP VECTOR
  2890.       DAD    D
  2891.       SHLD    VLIST+1        ;BIOS LIST DEVICE JUMP VECTOR
  2892.       LXI    D,30
  2893.       DAD    D
  2894.       SHLD    VLSTAT+1    ;BIOS LIST DEVICE STATUS JUMP VECTOR
  2895.       LDA    PMMIBYTE
  2896.       ORA    A
  2897.       RZ            ;SKIP THE REST IF NOT PMMI
  2898.       LDA    IN$MODCTLP+1
  2899.       STA    OUT$MODCTLP+1
  2900.       INR    A
  2901.       STA    OUT$MODDATP+1
  2902.       STA    IN$MODDATP+1
  2903.       INR    A
  2904.       STA    IN$BAUDRP+1
  2905.       STA    OUT$BAUDRP+1
  2906.       INR    A
  2907.       STA    OUT$MODCTL2+1
  2908.       RET
  2909. ;.....
  2910. ;
  2911. ;
  2912. ; CHECK OPTIONS, PUT 0 IN APPROPRIATE PLACES IN OPTION TABLE IF OPTION
  2913. ; SELECTED
  2914. ;
  2915. PROCOPT:  LXI    D,FCB+1
  2916.        LDAX    D
  2917.       STA    OPTION
  2918. ;
  2919. OPTLP:      INX    D
  2920.       LDAX    D
  2921.       CPI    ' '
  2922.       JZ    ENDOPT
  2923.       LXI    H,OPTBL
  2924.       MVI    B,OPTBE-OPTBL
  2925. ;
  2926. OPTCK:      CMP    M
  2927.       JNZ    OPTNO
  2928.       CPI    'O'
  2929.       JNZ    OPTCK1
  2930.       XRA    A
  2931.       STA    UARTFLG
  2932.       JMP    OPTCK2
  2933. ;...
  2934. ;
  2935. ;
  2936. OPTCK1:      CPI    'A'
  2937.       JNZ    OPTCK2
  2938.       MVI    A,TRUE
  2939.       STA    UARTFLG
  2940. ;
  2941. OPTCK2:      MVI    M,0
  2942.       JMP    OPTLP
  2943. ;...
  2944. ;
  2945. ;
  2946. OPTNO:      INX    H
  2947.       DCR    B
  2948.       JNZ    OPTCK
  2949.       CALL    NTVLDMSG
  2950.       POP    PSW        ;PRESERVE STACK
  2951.       JMP    MENU
  2952. ;
  2953. ENDOPT:      LDA    VSEEFLG
  2954.       ORA    A
  2955.       RNZ
  2956.       STA    QFLG        ;QUITE MODE FOR DATA ITEMS
  2957.       RET
  2958. ;.....
  2959. ;
  2960. ;
  2961. DONE:       LDA    BATCHFLG    ;IN BATCH MODE?
  2962.       ORA    A
  2963.       JNZ    DONETC        ;EXIT IF NOT
  2964.       LDA    QFLG
  2965.       ORA    A
  2966.       JZ    NMSTRNS
  2967.       MVI    B,12        ;ZERO OUT FTRNMSG
  2968.       LXI    H,FTRNMSG
  2969.       MVI    A,0
  2970. ;
  2971. ZEROLP:      MOV    M,A
  2972.       INX    H
  2973.       DCR    B
  2974.       JNZ    ZEROLP
  2975.       MVI    B,12        ;PUT FILE NAME IN FTRNMSG
  2976.       LXI    H,FCB+1        
  2977.       LXI    D,FTRNMSG
  2978. ;
  2979. LOADMSG:  MVI    A,4        ;START OF FILE TYPE?
  2980.       CMP    B
  2981.       JZ    PERIOD        ;PUT IN PERIOD IF SO
  2982.       MOV    A,M    
  2983.       CPI    ' '        ;DON'T PUT IN SPACE
  2984.       JZ    SKPSP    
  2985.       STAX    D        ;STORE IN FTRNMSG
  2986.       INX    D
  2987. ;
  2988. SKPSP:      INX    H
  2989.       DCR    B
  2990.       MOV    A,B
  2991.       ORA    A        ;END OF FILE NAME?
  2992.       JZ    FTRNMSG0    ;DISPLAY FILE NAME
  2993.       JMP    LOADMSG        ;LOOP FOR ANOTHER CHARACTER
  2994. ;.....
  2995. ;
  2996. ;
  2997. PERIOD:      MOV    A,M
  2998.       CPI    ' '        ;IS FILE TYPE EMPTY?
  2999.       JZ    FTRNMSG0    ;GO IF SO
  3000.       MVI    A,'.'        ;ELSE PUT PERIOD IN MESSAGE
  3001.       STAX    D
  3002.       INX    D
  3003.       DCR    B
  3004.       JMP    LOADMSG
  3005. ;.....
  3006. ;
  3007. ;
  3008. FTRNMSG0: CALL    ILPRT
  3009.       DB    CR,LF
  3010. ;
  3011. FTRNMSG:  DS    12
  3012.       DB    0
  3013.       CALL    ILPRT
  3014.       DB    ' Transferred',CR,LF,LF,BELL,0
  3015. ;
  3016. NMSTRNS:  LDA    FCB        ;SAVE DRIVE NO.
  3017.       STA    DISKNO
  3018.       LXI    H,FCB        ;BLANK OUT FILE CONTROL BLOCKS
  3019.       CALL    INITFCB
  3020.       LDA    DISKNO        ;PUT DRIVE NUMBER BACK
  3021.       STA    FCB
  3022.       LXI    H,RESTSN    ;RESTORE RECORD NUMBERS..
  3023.       LXI    D,RECDNOB    ;..FOR NEW FILE TRANSFER.
  3024.       MVI    B,RECDNOE-RECDNOB ;ROUTINE ALSO DONE IN MENU.
  3025.       CALL    MOVE
  3026.       CALL    IN$MODDATP
  3027.       CALL    IN$MODDATP
  3028.       LDA    SENDFLG        ;GOES TO EITHER SEND OR..
  3029.       ORA    A        ;..RECEIVE FILE, DEPENDING..
  3030.       JNZ    SENDFIL1    ;..UPON WHICH ROUTINE SET..
  3031.       JMP    RCVFIL1        ;..THE FLAG IN MULTI-FILE MODE.
  3032. ;.....
  3033. ;
  3034. ;
  3035. DONETC:      CALL    CKABORT        ;SLIGHT DELAY FOR NEXT MESSAGE
  3036.       CALL    ILPRT
  3037.       DB    CR,LF,'[Transfer Completed]',CR,LF,BELL,0
  3038. ;
  3039. DONETCA:  LDA    XITFLG        ;SPECIAL 'X' FLAG SET?
  3040.       ORA    A
  3041.       JZ    BYEBYE        ;IF YES, DISCONNECT AND REBOOT
  3042.       LDA    DISCFLG        ;NORMAL 'D' FLAG SET?
  3043.       ORA    A
  3044.       JZ    DONETCC        ;IF YES, DISCONNECT, GET NEXT COMMAND
  3045. ;
  3046. DONETCB:  CALL    NOPARIT        ;RESET TO NO PARITY
  3047.       MVI    A,CRC
  3048.       STA    CRCFLAG        ;TURNS OFF CRC OPTION
  3049.       MVI    A,TRUE
  3050.       STA    FIRSTME        ;SET FIRST-TIME FLAG
  3051.       STA    FSTFLG        ;RESET MULTIFILE TRANS
  3052.       STA    NFILFLG        ;..USED IN TERMINAL ROUTINE.
  3053.       CMA
  3054.       STA    SAVEFLG        ;STOP MEMORY SAVE IN TERM ROUTINE.
  3055.       STA    LISTMOR        ;STOP ANY BUFFERED OUTPUT TO PRINTER
  3056.       LXI    H,BOTTRAM    ;RESET PRINTER BUFFER POINTERS
  3057.       SHLD    HLSAVE1
  3058.       SHLD    HLSAVE2    
  3059.       LXI    H,QFLG        ;IN QUIET MODE?
  3060.       MOV    A,M
  3061.       ORA    A
  3062.       MVI    M,'Q'        ;RESET THE FLAG TO NORMAL
  3063.       JZ    MENU        ;IF YES, GO BACK TO COMMAND LINE
  3064.       LDA    ABORTFLG    ;COME HERE FROM A TIMEOUT?
  3065.       ORA    A
  3066.       JNZ    MENU        ;IF YES, GO TO COMMANDE MODE
  3067.       LDA    TERMFLG        ;SEE IF RETURN TO..
  3068.       ORA    A        ;..TERMINAL MODE..
  3069.       JNZ    MENU        ;..AFTER X'FER.
  3070.       CALL    CRLF
  3071.       JMP    TERM
  3072. ;.....
  3073. ;
  3074. ;
  3075. DONETCC:  CALL    ILPRT
  3076.       DB    CR,LF,'<< DISCONNECTED >>',CR,LF,0
  3077.       CALL    JMP$DISCONNT    ;HANG-UP THE PMMI
  3078.       JMP    MENU        ;BACK TO COMMAND LINE
  3079. ;.....
  3080. ;
  3081. ;
  3082. MOVEFCB:  LXI    H,FCB+16
  3083.       LXI    D,FCB
  3084.       MVI    B,16
  3085.       CALL    MOVE
  3086.       XRA    A
  3087.       STA    FCBSNO
  3088.       STA    FCBEXT
  3089.       RET
  3090. ;.....
  3091. ;
  3092. ;
  3093. SHOW:      CPI    LF
  3094.       JZ    CTYPE
  3095.       CPI    CR
  3096.       JZ    CTYPE
  3097.       CPI    9
  3098.       JZ    CTYPE
  3099.       CPI    ' '
  3100.       JC    SHOWHEX
  3101.       CPI    7FH
  3102.       JC    CTYPE
  3103. ;
  3104. SHOWHEX:  PUSH    PSW
  3105.       MVI    A,'('
  3106.       CALL    CTYPE
  3107.       POP    PSW
  3108.       CALL    HEXO
  3109.       MVI    A,')'
  3110.       JMP    CTYPE
  3111. ;.....
  3112. ;
  3113. ;
  3114. CTYPE:      PUSH    B
  3115.       PUSH    D
  3116.       PUSH    H
  3117.       MOV    E,A
  3118.       MVI    C,WRCON
  3119.       CALL    BDOS
  3120.       POP    H
  3121.       POP    D
  3122.       POP    B
  3123.       RET
  3124. ;.....
  3125. ;
  3126. ;
  3127. CRLF:      PUSH    PSW
  3128.       MVI    A,CR
  3129.       CALL    TYPE
  3130.       MVI    A,LF
  3131.       CALL    TYPE
  3132.       POP    PSW
  3133.       RET
  3134. ;.....
  3135. ;
  3136. ;
  3137. STAT:      PUSH    B
  3138.       PUSH    D
  3139.       PUSH    H
  3140. ;
  3141. VSTAT:      CALL    $-$        ;BIOS CONSTAT ADDRESS, FILLED IN..
  3142.       POP    H        ;..BY INITADR ROUTINE
  3143.       POP    D
  3144.       POP    B
  3145.       ORA    A
  3146.       RET
  3147. ;.....
  3148. ;
  3149. ;
  3150. KEYIN:      PUSH    B
  3151.       PUSH    D
  3152.       PUSH    H
  3153. ;
  3154. VKEYIN:      CALL    $-$        ;BIOS CONIN ADDRESS, FILLED IN..
  3155.       POP    H        ;..BY INITADR ROUTINE
  3156.       POP    D
  3157.       POP    B
  3158.       RET
  3159. ;.....
  3160. ;
  3161. ;
  3162. LISTER:      PUSH    B
  3163.       PUSH    D
  3164.       PUSH    H
  3165. ;
  3166. VLIST:      CALL    $-$        ;BIOS LIST OUT ADDRESS, FILLED IN..
  3167.       POP    H        ;..BY INITADR ROUTINE
  3168.       POP    D
  3169.       POP    B
  3170.       RET
  3171. ;.....
  3172. ;
  3173. ;
  3174. LSTSTAT:  PUSH    B
  3175.       PUSH  D
  3176.       PUSH    H
  3177. ;
  3178. VLSTAT:      CALL    $-$        ;BIOS LIST DEVICE STATUS ADDRESS,..
  3179.       POP    H        ;..FILLED IN BY INITADR ROUTINE
  3180.       POP    D
  3181.       POP    B
  3182.       RET
  3183. ;.....
  3184. ;
  3185. ;
  3186. TYPE:      PUSH    PSW
  3187.       PUSH    B
  3188.       PUSH    D
  3189.       PUSH    H
  3190.       MOV    C,A
  3191. ;
  3192. VTYPE:      CALL    $-$        ;BIOS CONOUT ADDRESS, FILLED IN..
  3193.       POP    H        ;..BY INITADR ROUTINE
  3194.       POP    D
  3195.       POP    B
  3196.       POP    PSW
  3197.       RET
  3198. ;.....
  3199. ;
  3200. ; GET A CHARACTER FROM THE KEYBOARD, CONVERT TO UPPER CASE IF NEEDED,
  3201. ; AND SHOW ON CRT
  3202. ;
  3203. KBDCHR:      CALL    KEYIN        ;GET A KEYBOARD CHARACTER
  3204.       CALL    UCASE        ;CONVERT TO UPPER CASE IF NEEDED
  3205.       CALL    TYPE        ;SHOW ON CRT
  3206.       RET
  3207. ;.....
  3208. ;
  3209. ;
  3210. UCASE:      CPI    61H        ;CHANGES LOWER CASE CHARACTER..
  3211.       RC            ;..IN A-REG TO UPPER CASE.
  3212.       CPI    7AH+1        ;SEE IF MORE THAN SMALL 'Z'
  3213.       RNC
  3214.       ANI    5FH
  3215.       RET
  3216. ;.....
  3217. ;
  3218. ;
  3219. DECOUT:      PUSH    PSW
  3220.       PUSH    B
  3221.       PUSH    D
  3222.       PUSH    H
  3223.       LXI    B,-10
  3224.       LXI    D,-1
  3225. ;
  3226. DECOU2:      DAD    B
  3227.       INX    D
  3228.       JC    DECOU2
  3229.       LXI    B,10
  3230.       DAD    B
  3231.       XCHG
  3232.       MOV    A,H
  3233.       ORA    L
  3234.       CNZ    DECOUT
  3235.       MOV    A,E
  3236.       ADI    '0'
  3237.       CALL    CTYPE
  3238.       POP    H
  3239.       POP    D
  3240.       POP    B
  3241.       POP    PSW
  3242.       RET
  3243. ;.....
  3244. ;
  3245. ;
  3246. ;---->    DHXOUT: - DOUBLE PRECISION HEX OUTPUT ROUTINE.
  3247. ;
  3248. DHXOUT:      PUSH    H
  3249.       PUSH    PSW
  3250.       MOV    A,H        ;GET MS BYTE
  3251.       CALL    HEXO        ;OUTPUT HIGH ORDER BYTE
  3252.       MOV    A,L        ;GET LS BYTE
  3253.       CALL    HEXO        ;OUTPUT LOW ORDER BYTE
  3254.       POP    PSW
  3255.       POP    H
  3256.       RET
  3257. ;.....
  3258. ;
  3259. ;
  3260. ; PRINTS A HEX VALUE IN 'A' ON THE CRT
  3261. ;
  3262. HEXO:      PUSH    PSW
  3263.       RAR
  3264.       RAR
  3265.       RAR
  3266.       RAR
  3267.       CALL    NIBBL
  3268.       POP    PSW
  3269. ;
  3270. NIBBL:      ANI    0FH
  3271.       CPI    10
  3272.       JC    ISNUM
  3273.       ADI    7
  3274. ;
  3275. ISNUM:      ADI    '0'        ;ADD IN ASCII BIAS
  3276.       JMP    CTYPE
  3277. ;.....
  3278. ;
  3279. ;
  3280. ; DISPLAYS THE CONTROL-CHARACTERS SHOWN IN THE MENU
  3281. ;
  3282. SHFTYPE:  PUSH    PSW
  3283.       CALL    ILPRT
  3284.       DB    'CTL-',0
  3285.       POP    PSW
  3286.       ADI    40H        ;CONVERT BINARY TO ASCII CHARS.
  3287.       CALL    TYPE        ;SHOW ON THE CRT
  3288.       JMP    ILPRT
  3289. ;.....
  3290. ;
  3291. ;
  3292. ; WRITE A STRING OF CHARACTERS
  3293. ;
  3294. ILPRT:      XTHL
  3295. ;
  3296. ILPRT1:      MOV    A,M        ;GET THE CHARACTER
  3297.       ORA    A        ;SEE IF A "0" FOR END OF STRING
  3298.       JZ    ILPRT2        ;IF YES, ALL DONE
  3299.       CALL  CTYPE        ;SHOW ON CRT
  3300.       INX    H        ;GET THE NEXT LOCATION IN THE STRING    
  3301.       JMP    ILPRT1
  3302. ;
  3303. ILPRT2:      XTHL            ;RESTORE THE ADDRESS
  3304.       RET
  3305. ;.....
  3306. ;
  3307. ;
  3308. ; WRITE A STRING OF CHARACTERS UNLESS IN QUIET MODE
  3309. ;
  3310. ILPRTQ:      XTHL
  3311. ;
  3312. ILPRTQ1:  MOV    A,M        ;GET THE CHARACTER
  3313.       ORA    A        ;SEE IF A "0" FOR END OF STRING
  3314.       JZ    ILPRTQ2        ;IF YES, ALL DONE
  3315.       LDA    QFLG
  3316.       ORA    A
  3317.       MOV    A,M
  3318.       CNZ    CTYPE        ;SHOW ON CRT IF NOT IN QUITE MODE
  3319.       INX    H        ;GET THE NEXT LOCATION IN THE STRING    
  3320.       JMP    ILPRTQ1
  3321. ;
  3322. ILPRTQ2:  XTHL            ;RESTORE THE ADDRESS
  3323.       RET
  3324. ;.....
  3325. ;
  3326. ;
  3327. PRTMSG:      MVI    C,PRINT        ;PRINT THE STRING
  3328.       JMP    BDOS
  3329. ;.....
  3330. ;
  3331. ;
  3332. ; DISPLAYS ERROR STATEMENT THEN RETURNS TO COMMAND MODE
  3333. ;
  3334. ERXIT:      POP    D
  3335.       CALL    PRTMSG
  3336.       MVI    A,BELL
  3337.       CALL    TYPE
  3338.       CALL    CRLF
  3339.       MVI    A,TRUE
  3340.       STA    ABORTFLG    ;SHOWS AN UNINTENTIONAL ABORT
  3341.       LDA    BATCHFLG    ;IN BATCH MODE?
  3342.       ORA    A
  3343.       JNZ    DONETCB        ;IF NOT, EXIT
  3344.       JMP    ABORT        ;ABORT OTHER COMPUTER
  3345. ;.....
  3346. ;
  3347. ;
  3348. ; EXITS DIRECTLY TO CP/M, WITH NO REBOOT UNLESS YOU ALLOW POSSIBLE
  3349. ; OVERWRITING OF CCP.
  3350. ;
  3351. EXIT:      LDA    OLDUSER        ;GET ORIGINAL USER NUMBER BACK
  3352.       MOV    E,A
  3353.       CALL    SETUSER
  3354.       LXI    D,80H        ;RESTORE ORIGINAL BUFFER AREA
  3355.       MVI    C,SETDMA
  3356.       CALL    BDOS
  3357.       LDA    SAVCCP        ;WAS CCP LEFT INTACT?
  3358.       ORA    A
  3359.       JZ    0000H        ;IF NOT, WARM REBOOT JUST IN CASE
  3360. ;
  3361. EXIT1:      JMP    $-$        ;OVERWRITTEN WITH CCP RETURN BY "START"
  3362. ;.....
  3363. ;
  3364. ;
  3365. MOVE128:  MVI    B,128
  3366. ;
  3367. MOVE:      MOV    A,M
  3368.       STAX    D
  3369.       INX    H
  3370.       INX    D
  3371.       DCR    B
  3372.       JNZ    MOVE
  3373.       RET
  3374. ;.....
  3375. ;
  3376. ;
  3377. ; INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH
  3378. ;
  3379. SETFCB:      LXI    D,CMDBUF
  3380.       LXI    H,FCB
  3381.       CALL    CMDLINE
  3382.       CALL    PROCOPT
  3383.       LDA    FCB+1        ;CHECK ON THE PRIMARY OPTION
  3384.       CPI    'E'        ;RETURN IF ECHO OPTION
  3385.       RZ
  3386.       CPI    'H'        ;RETURN IF HELP OPTION
  3387.       RZ
  3388.       CPI    'L'        ;RETURN IF LOCAL ECHO OPTION
  3389.       RZ
  3390.       MOV    B,A
  3391.       LDA    PMMIBYTE
  3392.       ORA    A
  3393.       MOV    A,B
  3394.       JZ    S4
  3395.       CPI    'C'
  3396.       RZ
  3397. ;
  3398. S4:      CPI    'T'
  3399.       JZ    TERMSEL
  3400.       CPI    'S'
  3401.       JZ    CKFILE
  3402.       CPI    'R'
  3403.       JNZ    BDOPT
  3404.       LDA    BATCHFLG    ;IF MULT FILE MODE, THEN..
  3405.       ORA    A        ;..RECV OPT DOES NOT NEED..
  3406.       RZ            ;..NAME.
  3407.       JMP    CKFILE
  3408. ;.....
  3409. ;
  3410. ;
  3411. BDOPT:      CALL    ILPRT
  3412.       DB    CR,LF,'++ Bad Option ++',CR,LF,LF,0
  3413.       JMP    REENT
  3414. ;.....
  3415. ;
  3416. ;
  3417. CKFILE:   LDA    FCB+17        ;IF OPTION THAT NEEDS FILE NAME,..
  3418.       CPI    ' '        ;..THEN CHECK TO SEE IF NAME..
  3419.       RNZ            ;..EXISTS. IF NOT..
  3420. ;
  3421. REENT:      CALL    ILPRT        ;..DO EVERYTHING OVER.
  3422.       DB    '++ Enter primary option plus file name ++'
  3423.       DB    CR,LF,BELL,0
  3424.       POP    H        ;RESET STACK FROM 'CALL SETFCB'
  3425.       JMP    MENU        ;ABORT TO COMMAND LINE
  3426. ;.....
  3427. ;
  3428. ;
  3429. TERMSEL:  LDA    FCB+17
  3430.       CPI    ' '
  3431.       JNZ    SAVAGN
  3432.       MVI    A,FALSE
  3433.       STA    SAVEFLG
  3434.       MVI    A,TRUE
  3435.       STA    NFILFLG
  3436.       RET
  3437. ;.....
  3438. ;
  3439. ;
  3440. SAVAGN:      MVI    A,FALSE
  3441.       STA    NFILFLG
  3442.       RET
  3443. ;.....
  3444. ;
  3445. ;    
  3446. ; CHANGE BAUDRATE ON-THE-FLY WITH CTL-B (WHILE IN TERMINAL MODE)
  3447. ;
  3448. NEWBAUD:  LDA    PMMIBYTE
  3449.       ORA    A
  3450.       RZ
  3451.       CALL    ILPRT
  3452.       DB    CR,LF,'Enter new Baudrate: ',0
  3453.       LXI    H,FCB+9
  3454.       MVI    M,0        ;DEFAULTS TO 300 BAUD IF NO ANSWER TYPED
  3455. ;
  3456. NEWBAUD1: CALL    KEYIN        ;GET THE BAUD RATE
  3457.       CPI    CR        ;CARRIAGE RET FINISHES BAUD RATE ENTRY
  3458.       JNZ    CONNEWB        ;GOES TO THE ESTABLISHED ROUTINE    
  3459.       CALL    CRLF        ;PROGRAM IS DONE THERE.
  3460.       JMP    FIXBAUD        ;GO CHANGE THE BAUD RATE
  3461. ;.....
  3462. ;
  3463. ;
  3464. CONNEWB:  CPI    '0'        ;NUMERALS ARE 0-9
  3465.       JC    NEWBAUD1
  3466.       CPI    '9'+1
  3467.       JNC    NEWBAUD1    ;IF NOT A NUMERAL, IGNORE, ASK AGAIN
  3468.       MOV    M,A        ;STORE ANSWER STARTING AT FCB+9
  3469.       CALL    TYPE        ;SHOW THE NUMERAL ON THE CRT
  3470.       INX    H        ;NEXT STORAGE LOCATION IN FCB
  3471.       JMP    NEWBAUD1    ;GET THE NEXT NUMERAL
  3472. ;.....
  3473. ;
  3474. ;
  3475. ; ADJUSTS LOOP COUNTERS FOR THE SELECTED CLOCK SPEED
  3476. ;
  3477. FIXCNT:      LDA    CLOCK        ;GET THE USER'S CLOCK SPEED
  3478.       PUSH    D
  3479.       PUSH    H
  3480.       POP    D
  3481. ;
  3482. CNTMUL:      DAD    D
  3483.       DCR    A
  3484.       JNZ    CNTMUL
  3485.       POP    D        ;RETURN WITH ANSWER IN 'HL'
  3486.       RET
  3487. ;.....
  3488. ;
  3489. ;  
  3490. ;=======================================================================
  3491. ;
  3492. ; LOADS A COMMAND LINE ADDRESSED BY DE REGISTERS (MAX # CHARACTERS IN
  3493. ; LINE IN DE, NUMBER OF CHARS IN LINE IN DE+1, LINE STARTS IN DE+2) INTO
  3494. ; FCB ADDRESSED BY HL REGISTERS.  THE FCB SHOULD BE AT LEAST 33 BYTES IN
  3495. ; LENGTH.  THE COMMAND LINE BUFFER MUST HAVE A MAXIMUM LENGTH  AT LEAST
  3496. ; ONE MORE THAN THE GREATEST NUMBER OF CHARACTERS THAT WILL BE NEEDED.
  3497.  
  3498. CMDLINE:  PUSH    PSW
  3499.       PUSH    B
  3500.       PUSH    D
  3501.       PUSH    H
  3502.       CALL    INITIAL        ;FILLS FCBS WITH BLANKS AND NULLS
  3503.       XCHG            ;GET START OF COMMAND LINE IN HL.
  3504.       INX    H        ;ADDRESS # BYTES IN CMD LINE.
  3505.       MOV    E,M        ;LOAD DE PAIR WITH # BYTES.
  3506.       MVI    D,0
  3507.       INX    H
  3508.       DAD    D        ;POINT TO BYTE AFTER LAST CHAR..
  3509.       MVI    M,CR        ;..IN CMD LINE AND STORE DELIMITER.
  3510.       POP    H        ;RESTORE HL AND DE.
  3511.       POP    D
  3512.       PUSH    D
  3513.       PUSH    H
  3514.       INX    D        ;ADDRESS START OF COMMAND.
  3515.       INX    D
  3516.       CALL    DRIVE
  3517. ;
  3518. NAME1:      MVI    C,8        ;TRANSFER FIRST FILENAME TO FCB.
  3519.       CALL    TRANS
  3520.       CPI    CR
  3521.       JZ    DONEL
  3522.       CPI    ' '        ;IF SPACE, THEN START OF..
  3523.       JZ    NAME2        ;..SECOND FILENAME.
  3524. ;
  3525. TYPE1:      POP    H        ;FILETYPE MUST BE AFTER..
  3526.       PUSH    H        ;..EIGHTH BYTE OF NAME.
  3527.       LXI    B,9
  3528.       DAD    B
  3529.       MVI    C,3        ;TRANSFER TYPE OF FIRST FILE
  3530.       CALL    TRANS
  3531.       CPI    CR
  3532.       JZ    DONEL
  3533. ;
  3534. NAME2:      LDAX    D        ;EAT MULTIPLE SPACES..
  3535.       CPI    ' '        ;..BETWEEN NAMES.
  3536.       JNZ    NAME2C
  3537.       INX    D
  3538.       JMP    NAME2
  3539. ;
  3540. NAME2C:      POP    H        ;SECOND NAME STARTS IN 16TH BYTE.
  3541.       PUSH    H        ;POINT HL TO THIS BYTE.
  3542.       LXI    B,16
  3543.       DAD    B
  3544.       CALL    DRIVE
  3545.       MVI    C,8
  3546.       CALL    TRANS
  3547.       CPI    CR
  3548.       JZ    DONEL
  3549. ;
  3550. TYPE2:      POP    H        ;SECOND TYPE STARTS IN 25TH BYTE.
  3551.       PUSH    H
  3552.       LXI    B,25
  3553.       DAD    B
  3554.       MVI    C,3
  3555.       CALL    TRANS
  3556. ;
  3557. DONEL:      POP    H
  3558.       PUSH    H
  3559.       INX    H        ;POINT TO 1ST CHAR OF 1ST NAME IN FCB..
  3560.       CALL    SCANL        ;CHECK FOR * (AMBIGUOUS NAMES).
  3561.       POP    H
  3562.       PUSH    H
  3563.       LXI    B,17        ;..TO 1ST CHAR OF SECOND NAME IN FCB.
  3564.       DAD    B
  3565.       CALL    SCANL
  3566.       POP    H
  3567.       POP    D
  3568.       POP    B
  3569.       POP    PSW
  3570.       RET
  3571. ;.....
  3572. ;
  3573. ;
  3574. ; SUBROUTINES FOR CMDLINE SECTION
  3575. ;
  3576. INITIAL:  PUSH    H    ;INITIALIZES FCB WITH 1 NULL (FOR FIRST DRIVE)..
  3577.       PUSH    B    ;..11 BLANKS, 4 NULLS, 1 NULL (FOR 2ND DRIVE)..
  3578.       MVI    M,0    ;..11 BLANKS, AND 4 NULLS.
  3579.       INX    H
  3580.       MVI    B,11
  3581.       MVI    A,' '
  3582.       CALL    INITFILL
  3583.       MVI    B,5
  3584.       XRA    A
  3585.       CALL    INITFILL
  3586.       MVI    B,11
  3587.       MVI    A,' '
  3588.       CALL    INITFILL
  3589.       MVI    B,4
  3590.       XRA    A
  3591.       CALL    INITFILL
  3592.       POP    B
  3593.       POP    H
  3594.       RET
  3595. ;.....
  3596. ;
  3597. ;
  3598. INITFILL: MOV    M,A
  3599.       INX    H
  3600.       DCR    B
  3601.       JNZ    INITFILL
  3602.       RET
  3603. ;.....
  3604. ;
  3605. ;
  3606. DRIVE:      INX    D        ;CHECK 2ND BYTE OF FILENAME.  IF IT..
  3607.       LDAX    D        ;..IS A ":", THEN DRIVE WAS SPECIFIED..
  3608.       DCX    D
  3609.       CPI    ':'
  3610.       JNZ    DEFDR        ;..ELSE ZERO FOR DEFAULT DRIVE ..
  3611.       LDAX    D        ;..('INIT' PUT ZERO)
  3612.       ANI    5FH
  3613.       SUI    40H        ;CALCULATE DRIVE (A=1, B=2,...)..
  3614.       MOV    M,A        ;..AND PLACE IT IN FCB.
  3615.       INX    D        ;ADDRESS FIRST BYTE OF..
  3616.       INX    D        ;..IN CMD LINE,..
  3617. ;
  3618. DEFDR:      INX    H        ;..AND NAME FIELD IN FCB.
  3619.       RET
  3620. ;.....
  3621. ;
  3622. ;
  3623. TRANS:      LDAX    D        ;TRANSFER FROM CMD LINE TO FCB..
  3624.       INX    D        ;..UP TO NUMBER OF CHARS SPECIFIED..
  3625.       CPI    CR        ;..BY C-REG. KEEP SCANNING FIELD..
  3626.       RZ            ;..WITHOUT TRANSFER UNTIL A DELIMITING..
  3627. ;
  3628.       CPI    '.'        ;..FIELD CHAR SUCH AS '.', BLANK, OR..
  3629.       RZ            ;..C/R (FOR END OF CMD LINE).
  3630.       CPI    ' '
  3631.       RZ
  3632.       DCR    C
  3633.       JM    TRANS        ;ONCE C-REG IS LESS THAN ZERO, KEEP..
  3634.       MOV    M,A        ;..READING CMD LINE BUT DO NOT..
  3635.       INX    H        ;..TRANSFER TO FCB.
  3636.       JMP    TRANS
  3637. ;...
  3638. ;
  3639. ;
  3640. SCANL:      MVI    B,8        ;SCAN FILE NAME ADDRESSED BY HL.
  3641. ;
  3642. TSTNAM:      MOV    A,M
  3643.       CPI    '*'        ;IF '*' FOUND, FILL IN REST OF FIELD..
  3644.       JZ    FILL1        ;..WITH '?' FOR AMBIGUOUS NAME.
  3645.       INX    H
  3646.       DCR    B
  3647.       JNZ    TSTNAM
  3648.       JMP    TSTTYP
  3649. ;...
  3650. ;
  3651. ;
  3652. FILL1:      CALL    FILL
  3653. ;
  3654. TSTTYP:      MVI    B,3        ;SCAN AND FILL TYPE FIELD FOR NAME..
  3655. ;
  3656. TSTTYPL:  MOV    A,M        ;..SPECIFIED ABOVE.
  3657.       CPI    '*'
  3658.       JZ    FILL2
  3659. ;
  3660.       INX    H
  3661.       DCR    B
  3662.       JNZ    TSTTYPL
  3663.       RET
  3664. ;.....
  3665. ;
  3666. ;
  3667. FILL2:      CALL    FILL
  3668.       RET
  3669. ;.....
  3670. ;
  3671. ;
  3672. FILL:      MVI    M,'?'        ;ROUTINE TRANSFERS '?'.
  3673.       INX    H
  3674.       DCR    B
  3675.       JNZ    FILL
  3676.       RET
  3677.  
  3678. ;=======================================================================
  3679. ;
  3680. ; LISTS DIRECTORY AND GIVES FREE SPACE REMAINING ON THE REQUESTED DRIVE.
  3681. ;
  3682. ;
  3683. ; Disk system reset - currently bypassed, if you wish this feature, put
  3684. ;      JMP DIRLIST2 instead of JMP DIRLIST3 in the eighth line.  The
  3685. ;      current disk (plus the A: drive) will then reset each DIR re-
  3686. ;      quest.  You can also reset the disk with the LOG command when
  3687. ;      when inserting a different one.  This saves a reset each time
  3688. ;      DIR might be requested.
  3689. ;
  3690. DIRLIST:  MVI    C,CURDSK    ;CURRENT DEFAULT DISK, 25.
  3691.       CALL    BDOS
  3692.       PUSH    PSW        ;SAVE DEFAULT DISK LETTER
  3693.       ADI    41H        ;MAKE IT ASCII AND..
  3694.       STA    DRNAME        ;..STORE HERE AND..
  3695.       STA    DEFDRV        ;..HERE.
  3696. ;
  3697. DIRLIST1: JMP    DIRLIST3
  3698. ;
  3699. DIRLIST2: MVI    C,RESET        ;13 RESET DISK SYSTEM (RESETDK)
  3700.       CALL    BDOS
  3701. ;
  3702. DIRLIST3: POP    PSW        ;GET DEFAULT LETTER BACK AND..
  3703.       MOV    E,A        ;..PUT FOR SELECT.
  3704.       MVI    C,SELDSK    ;SELECT DISK AGAIN AS DEFAULT (SELDK)
  3705.       CALL    BDOS
  3706. ;
  3707. ;
  3708. ; Directory list routine
  3709. ;
  3710.       LXI    D,CMDBUF    ;PUT COMMAND LINE IN FCB..
  3711.       LXI    H,FCB        ;..ADDRESSED BY HL-REG..
  3712.       CALL    CMDLINE        ;..AND THEN...
  3713.       LXI    H,FCB4
  3714.       CALL    INITFCB
  3715.       LDA    FCB2        ;GET DRIVE NUMBER
  3716.       STA    FCB4
  3717.       LDA    FCB2+1
  3718.       CPI    ' '        ;IF A SPACE (BLANK) GET ALL NAMES
  3719.       PUSH    PSW
  3720.       CZ    QSTMARK
  3721.       POP    PSW
  3722.       CNZ    MOVNAME        ;ELSE MOVE NAME INTO FCB
  3723.       CALL    DRIVEL
  3724.       LXI    D,80H
  3725.       MVI    C,SETDMA
  3726.       CALL    BDOS
  3727.       LDA    NOOFCOL        ;NUMBER OF COLUMNS INTO REG-A
  3728.       STA    NAMECT        ;CRLF AFTER "NOOFCOL" NUMBER OF COLUMNS
  3729.       LXI    D,FCB4
  3730.       MVI    C,SRCHF        ;DO FIRST SEARCH
  3731.         CALL    BDOS
  3732.       INR    A        ;FFH --> 0 IF NO FILE(S) FOUND
  3733.       JNZ    DIRLOOP
  3734.       CALL    ILPRT
  3735.       DB    '++ FILE NOT FOUND ++',0
  3736.       JMP    STORAGE        ;STILL SHOW STORAGE ON DEFAULT DRIVE
  3737. ;
  3738. DIRLOOP:  CALL    GETADD
  3739.       INX    H        ;POINT TO FIRST LETTER OF FILENAME
  3740.       LXI    D,PRTNAME
  3741.       LXI    B,8
  3742.       CALL    MOVER
  3743.       INX    D
  3744.       LXI    B,3
  3745.       CALL    MOVER
  3746.       CALL    ILPRT
  3747. ;
  3748. PRTNAME:  DB    '        ','.','   ',0   ; 8 SPACES, PERIOD, 3 SPACES
  3749. ;
  3750. NEXTSR:      LXI    D,FCB4
  3751.       MVI    C,SRCHN        ;DO NEXT SEARCH
  3752.       CALL    BDOS
  3753.       INR    A        ;IF 0FFH --> 0 THEN..
  3754.       JZ    STORAGE        ;..DIRECTORY-READ FINISHED.
  3755.       PUSH    PSW
  3756.       PUSH    D
  3757.       PUSH    H
  3758.       LDA    NAMECT
  3759.       DCR    A
  3760.       STA    NAMECT        ;NAME COUNT UPDATED
  3761.       ORA    A
  3762.       CZ    CRLF        ;TERMINATE LINE OF FILE NAMES
  3763.       JNZ    FENCE
  3764.       LDA    NOOFCOL        ;RESTART COLUMNS-PER-LINE COUNT
  3765.       STA    NAMECT
  3766.       JMP    NOFENCE        ;FENCE NOT NEEDED
  3767. ;
  3768. FENCE:      CALL    ILPRT
  3769.       DB    ' : ',0        ;FENCE IF NOT AT END OF LINE OR..
  3770. ;                ;..LAST FILENAME
  3771. NOFENCE:  POP    H
  3772.       POP    D
  3773.       POP    PSW
  3774.       JMP    DIRLOOP
  3775. ;.....
  3776. ;
  3777. ;
  3778. ; DETERMINE STORAGE REMAINING ON DEFAULT DRIVE
  3779. ;
  3780. STORAGE:  CALL    CRLF
  3781.       MVI    C,DSKPAR    ;CURRENT DISK PARAMETER BLOCK
  3782.       CALL    BDOS
  3783.       INX    H
  3784.       INX    H
  3785.       MOV    A,M        ;GET BLOCK SHIFT FACTOR
  3786.       STA    BSHIFTF
  3787.       INX    H        ;BUMP TO BLOCK MASK
  3788.       MOV    A,M        ;GET IT
  3789.       STA    BMASK
  3790.       INX    H
  3791.       INX    H
  3792.       MOV    E,M        ;GET MAX BLOCK NUMBER
  3793.       INX    H
  3794.       MOV    D,M
  3795.       XCHG
  3796.       SHLD    BMAX        ;PUT IT AWAY
  3797.       MVI    C,DSKALL    ;ADDRESS OF CP/M ALLOCATION VECTOR
  3798.       CALL    BDOS
  3799.       XCHG            ;GET ITS LENGTH
  3800.       LHLD    BMAX
  3801.       INX    H
  3802.       LXI    B,0        ;INITIALIZE BLOCK COUNT TO ZERO
  3803. ;
  3804. GSPBYT:      PUSH    D        ;SAVE ALLOCATION ADDRESS
  3805.       LDAX    D
  3806.       MVI    E,8        ;SET TO PROCESS 8 BLOCKS
  3807. ;
  3808. GSPLUP:      RAL            ;TEST BIT
  3809.       JC    NOTFRE
  3810.       INX    B
  3811. ;
  3812. NOTFRE:      MOV    D,A        ;SAVE BITS
  3813.       DCX    H
  3814.       MOV    A,L
  3815.       ORA    H
  3816.       JZ    ENDALC        ;QUIT IF OUT OF BLOCKS
  3817.       MOV    A,D        ;RESTORE BITS
  3818.       DCR    E        ;COUNT DOWN 8 BITS
  3819.       JNZ    GSPLUP        ;DO ANOTHER BIT
  3820.       POP    D        ;BUMP TO NEXT COUNT..
  3821.       INX    D        ;..OF ALLOCATION VECTOR.
  3822.       JMP    GSPBYT        ;PROCESS IT
  3823. ;
  3824. ENDALC:      POP    D        ;CLEAR ALLOC VECTOR POINTER FROM STACK
  3825.       MOV    L,C        ;COPY BLOCK TO HL
  3826.       MOV    H,B
  3827.       LDA    BSHIFTF        ;GET BLOCK SHIFT FACTOR
  3828.       SUI    3        ;CONVERT FROM RECORDS TO THOUSANDS (K)
  3829.       JZ    PRTFREE        ;SKIP SHIFTS IF 1K BLOCKS
  3830. ;
  3831. FREKLP:      DAD    H        ;MULTIPLY BLOCKS BY K PER BLOCK
  3832.       DCR    A
  3833.       JNZ    FREKLP
  3834. ;
  3835. PRTFREE:  CALL     DECOUT        ;(# OF FREE K BYTES IN HL)
  3836.       LXI    D,FREEMSG
  3837.       CALL    PRTMSG
  3838.       CALL    GETUSER        ;GET USER NUMBER
  3839.       MVI    H,0
  3840.       MOV    L,A
  3841.       CALL    DECOUT        ;PRINT USER NUMBER
  3842.       LXI    D,DEFUSR
  3843.       JMP    PRTMSG
  3844. ;.....
  3845. ;
  3846. ;
  3847. ; SUBROUTINES FOR DIRLIST SECTION
  3848. ;
  3849. QSTMARK:  MVI    A,'?'        ;IF BLANK IN FCB, PUT IN 11 ?'S.
  3850.       MVI    B,11
  3851.       LXI    H,FCB4+1
  3852. ;
  3853. QSTLP:      MOV    M,A
  3854.       INX    H
  3855.       DCR    B
  3856.       JNZ    QSTLP
  3857.       RET
  3858. ;.....
  3859. ;
  3860. ;
  3861. MOVNAME:  LXI    H,FCB2+1
  3862.       LXI    D,FCB4+1
  3863.       LXI    B,11
  3864.       CALL    MOVER
  3865.       RET
  3866. ;.....
  3867. ;
  3868. ;
  3869. GETADD:      DCR    A        ;UN-DO THE INR ABOVE
  3870.       ADD    A        ;TIMES 32
  3871.       ADD    A
  3872.       ADD    A
  3873.       ADD    A
  3874.       ADD    A
  3875.       ADI    80H        ;ADD DMA (CMDBUF) OFFSET
  3876.       MOV    L,A
  3877.       MVI    H,0
  3878.       RET
  3879. ;.....
  3880. ;
  3881. ;
  3882. DRIVEL:      LDA    FCB4        ;IF NO DRIVE, USE
  3883.       ORA    A        ;DEFAULT DRIVE IN DRNAME.
  3884.       JZ    PRNTHD
  3885.       ADI    40H        ;MAKE 1=A, 2=B, ETC., AND..
  3886.       STA    DRNAME        ;..OVERWRITE DEFAULT STORED BELOW.
  3887. ;
  3888. PRNTHD:      CALL    ILPRT
  3889.       DB    'Drive '
  3890. ;
  3891. DRNAME:      DB    ' ',CR,LF,0
  3892.       RET
  3893. ;.....
  3894. ;
  3895. ;
  3896. ; INITIALIZED STORAGE
  3897. ;
  3898. FREEMSG:  DB     'k Bytes free on default drive '
  3899. DEFDRV:      DB    ' $'
  3900. DEFUSR:      DB    ':',CR,LF,'$'
  3901. ;
  3902. ;
  3903. ; UNINITIALIZED STORAGE
  3904. ;
  3905. BMAX:      DS    2        ;HIGHEST BLOCK NUMBER ON DRIVE
  3906. BMASK:      DS    1        ;REC/BLK - 1
  3907. BSHIFTF:  DS    1        ;NUMBER OF SHIFTS TO MULTIPLY BY REC/BLK
  3908. ;.....
  3909. ;
  3910. ;
  3911. ;=======================================================================
  3912. ;
  3913. ; DUPLICATES 'READ BUFFER' ROUTINE SAME AS CP/M FUNCTION 10, BUT DOES
  3914. ; NOT USE CTL-C (REASON FOR THE ROUTINE).  DOES ALLOW CONTROLS U, R, E
  3915. ; AND H (BACKSPACE).  OUTPUTS BELL IF THE INPUT IS GREATER THAN THE
  3916. ; BUFFER.
  3917. ;
  3918. INBUF:      PUSH    PSW
  3919.       PUSH    H
  3920.       PUSH    B 
  3921.       PUSH    D        ;DE REGISTERS MUST BE PUSHED LAST
  3922. ;
  3923. INBUFA:      CALL    CLEARBUF    ;CLEAR THE BUFFER AREA
  3924.       POP    D        ;GET ADDRESS OF BUFFER ON RETRIES
  3925.       PUSH    D        ;RESTORE STACK
  3926.       XRA    A
  3927.       INX    D        ;ADDRESS COUNT FIELD
  3928.       STAX    D        ;INITIALIZE WITH A ZERO IN COUNT BYTE
  3929.       INX    D
  3930.       XCHG            ;ADDRESS FIRST BUFFER BYTE WITH HL
  3931. ;
  3932. INBUFB:      CALL    KEYIN        ;(WAITS FOR CHAR)
  3933.       CALL    UCASE        ;..DITTO.
  3934.       CPI    CR        ;IS IT <RETURN> (ENTER COMMAND)?
  3935.       JZ    INBUFR        ;IF SO, THEN RETURN.
  3936.       CPI    7FH        ;IS IT A DELETE?
  3937.       JZ    DELETE
  3938.       CPI    8        ;CTR-H BACKSPACES..
  3939.       JZ    DELETE        ;..OVER DELETED CHAR.
  3940.       CPI    'U'-40H        ;IS IT A CTL-U?
  3941.       JZ    INBUFO        ;OUTPUT #, CR, LF, AND START OVER
  3942.       CPI    'R'-40H        ;CTL-R RETYPES LINE
  3943.       JZ    RETYPE
  3944.       CPI    'E'-40H        ;CTL-E OUTPUTS A CRLF
  3945.       JZ    PCRLF
  3946.       CPI    ' '        ;NO CONTROL CHARACTERS OTHER..
  3947.       JC    INBUFB        ;..THAN ABOVE ALLOWED.
  3948.       MOV    B,A        ;SAVE INPUTTED CHARACTER
  3949.       XCHG            ;SAVE HL IN DE
  3950.       POP    H        ;GET ADDRESS OF BUFFER IN HL
  3951.       PUSH    H        ;RESTORE STACK
  3952.       INX    H        ;ADDRESS COUNT BYTE
  3953.       INR    M        ;INCREASE COUNT BYTE
  3954.       DCX    H        ;ADDRESS MAXIMUM
  3955.       MOV    A,M        ;PUT MAXIMUM IN A
  3956.       INX    H        ;ADDRESS COUNT
  3957.       CMP    M        ;COMPARE COUNT TO MAXIMUM
  3958.       JC    ALERTL        ;IF MAXIMUM, RING BELL AND WAIT FOR CR.
  3959.       XCHG            ;RESTORE BUFFER POINTER TO HL
  3960.       MOV    M,B        ;PUT INPUTTED CHARACTER IN BUFFER
  3961.       MOV    A,B        ;OUTPUT IT
  3962.       CALL    TYPE
  3963.       INX    H        ;BUMP POINTER
  3964.       JMP    INBUFB        ;GET NEXT CHARACTER
  3965. ;...
  3966. ;
  3967. ;
  3968. DELETE:      XCHG            ;SAVE BUFFER POINTER IN DE
  3969.       POP    H        ;ADDRESS BEGINNING OF BUFFER
  3970.       PUSH    H        ;RESTORE STACK
  3971.       INX    H        ;ADDRESS COUNT FIELD
  3972.       MOV    B,A        ;SAVE DELETE CHAR, 7FH OR 08H.
  3973.       MOV    A,M
  3974.       SUI    1        ;DECREASE COUNT
  3975.       MOV    M,A
  3976.       JC    NODEL        ;DON'T DELETE PAST BEGINING OF BUFFER
  3977.       XCHG            ;RESTORE BUFFER POINTER TO HL
  3978.       DCX    H        ;POINT TO LAST BYTE INPUTTED
  3979.       MOV    A,B        ;GET BACK 7FH OR 08H
  3980.       MOV    B,M        ;GET CHARACTER BEING DELETED
  3981.       MVI    M,' '        ;RESTORE BLANK
  3982.       CPI    8
  3983.       JZ    BKSPC
  3984.       CPI    7FH
  3985.       JZ    BKSPC0
  3986.       JMP    INBUFB        ;GET NEXT CHARACTER
  3987. ;.....
  3988. ;
  3989. ;
  3990. NODEL:      INR    M        ;DON'T LEAVE COUNT NEGATIVE
  3991.       XCHG            ;RESTORE POINTER TO HL
  3992.       JMP    INBUFB
  3993. ;.....
  3994. ;
  3995. ;
  3996. BKSPC0:      MVI    A,08H
  3997. ;
  3998. BKSPC:      CALL    TYPE        ;TRUE ERASE IF 08H
  3999.       MVI    A,' '
  4000.       CALL    TYPE
  4001.       MVI    A,8
  4002.       CALL    TYPE
  4003.       JMP    INBUFB
  4004. ;.....
  4005. ;
  4006. ;
  4007. INBUFO:      MVI    A,'#'        ;ANNOUNCES THE LINE HAS BEEN REMOVED
  4008.       CALL    TYPE
  4009.       CALL    CRLF
  4010.       JMP    INBUFA
  4011. ;.....
  4012. ;
  4013. ;
  4014. RETYPE:      POP    D
  4015.       PUSH    D
  4016.       INX    D        ;POINT TO CURRENT NUMBER..
  4017.       LDAX    D        ;..OF CHARACTERS.
  4018.       MOV    B,A
  4019.       MVI    A,'#'
  4020.       CALL    TYPE
  4021.       CALL    CRLF
  4022.       MOV    A,B        ;TEST IF ZERO INPUT
  4023.       ORA    A
  4024.       JZ    INBUFB
  4025. ;...
  4026. ;
  4027. ;
  4028. CTLRLP:      INX    D
  4029.       LDAX    D
  4030.       CALL    TYPE
  4031.       DCR    B
  4032.       JNZ    CTLRLP
  4033.       JMP    INBUFB
  4034. ;.....
  4035. ;
  4036. ;    
  4037. ALERTL:      MVI    A,BELL        ;ALARM FOR FULL BUFFER
  4038.       CALL    TYPE
  4039.       DCR    M
  4040.       XCHG
  4041.       JMP    INBUFB
  4042. ;.....
  4043. ;
  4044. ;
  4045. PCRLF:      CALL    CRLF
  4046.       JMP    INBUFB
  4047. ;.....
  4048. ;
  4049. ;
  4050. INBUFR:      CALL    CRLF        ;1ST NEW LINE AFTER A COMMAND CHARACTER
  4051.       POP    D
  4052.       POP    B
  4053.       POP    H
  4054.       POP    PSW
  4055.       RET
  4056. ;.....
  4057. ;
  4058. ;
  4059. CLEARBUF: POP    D        ;ACCOUNTS FOR CALL
  4060.       POP    H        ;ADDRESS BUFFER IN HL
  4061.       PUSH    H        ;RESTORE..
  4062.       PUSH    D        ;..STACK
  4063.       MOV    B,M        ;SAVE MAXIMUM IN B
  4064.       INX    H        ;POINT TO FIRST..
  4065.       INX    H        ;..BUFFER BYTE.
  4066.       MVI    A,' '
  4067. ;
  4068. CLEARL:      MOV    M,A
  4069.       INX    H
  4070.       DCR    B
  4071.       JNZ    CLEARL
  4072.       RET
  4073. ;.....
  4074. ;
  4075. ;
  4076. ;=======================================================================
  4077. ;
  4078. ; IN-LINE COMPARE.  COMPARES STRING ADDRESSED BY DE-REG TO STRING AFTER
  4079. ; CALL (ENDS WITH ZERO).  RETURN WITH CARRY SET MEANS STRINGS NOT THE
  4080. ; SAME.  ALL REGISTERS EXCEPT A-REG ARE UNAFFECTED.
  4081. ;
  4082. INLNCOMP: XTHL            ;POINT HL TO 1ST CHAR.
  4083.       PUSH    D
  4084. ;
  4085. ILCOMPL:  MOV    A,M        ;HL POINTS TO IN-LINE STRING.
  4086.       ORA    A        ;END OF STRING IF ZERO.
  4087.       JZ    SAME
  4088.       LDAX    D
  4089.       CMP    M
  4090.       JNZ    NOTSAME
  4091.       INX    H
  4092.       INX    D
  4093.       JMP    ILCOMPL
  4094. ;...
  4095. ;
  4096. ;
  4097. NOTSAME:  XRA    A        ;IF NOT SAME, FINISH THRU..
  4098. ;
  4099. NSLP:      INX    H        ;..STRING SO RETURN WILL..
  4100.       CMP    M        ;..GO TO INSTRUCTION AFTER..
  4101.       JNZ    NSLP        ;..STRING AND NOT REMAINDER OF STRING.
  4102.       STC
  4103. ;
  4104. SAME:      POP    D
  4105.       INX    H        ;AVOIDS A NOP INSTRUCTION..
  4106.       XTHL            ;..WHEN RETURNING.
  4107.       RET
  4108. ;.....
  4109. ;
  4110. ;
  4111. ;=======================================================================
  4112. ;
  4113. ; MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING OF MULTIPLE FILES
  4114. ; (I.E., *.ASM) FROM DISK.  BUILDS THE CORRECT NAME IN THE FCB EACH TIME
  4115. ; IT IS CALLED.  THE COMMAND IS USED IN PROGRAMS TO PROCESS SINGLE OR 
  4116. ; MULTIPLE FILES.  THE FCB IS SET UP WITH THE NEXT NAME, READY TO DO
  4117. ; NORMAL PROCESSING (OPEN, READ, ETC.) WHEN ROUTINE IS CALLED.  CARRY IS
  4118. ; SET IF NO MORE NAMES ARE FOUND.
  4119.                 
  4120. MFNAME:      PUSH    B
  4121.       PUSH    D
  4122.       PUSH    H
  4123.       MVI    C,SETDMA
  4124.       LXI    D,80H
  4125.       CALL    BDOS
  4126.       POP    H
  4127.       POP    D
  4128.       POP    B
  4129.       XRA    A
  4130.       STA    FCBEXT
  4131.       LDA    MFFLG1
  4132.       ORA    A
  4133.       JNZ    MFNAME1
  4134.       MVI    A,1
  4135.       STA    MFFLG1
  4136.       LXI    H,FCB
  4137.       LXI    D,MFNAME5
  4138.       LXI    B,12
  4139.       CALL    MOVER
  4140.       LDA    FCB
  4141.       STA    MFNAME6        ;SAVE DISK IN CURR FCB
  4142.        LXI    H,MFNAME5
  4143.       LXI    D,FCB
  4144.       LXI    B,12
  4145.        CALL    MOVER
  4146.        PUSH    B
  4147.       PUSH    D
  4148.       PUSH    H
  4149.       MVI    C,SRCHF
  4150.       LXI    D,FCB
  4151.       CALL    BDOS
  4152.       POP    H
  4153.       POP    D
  4154.       POP    B
  4155.       JMP    MFNAME2
  4156. ;...
  4157. ;
  4158. ;
  4159. MFNAME1:  LXI    H,MFNAME6
  4160.       LXI    D,FCB
  4161.       LXI    B,12
  4162.       CALL    MOVER
  4163.       PUSH    B
  4164.       PUSH    D
  4165.       PUSH    H
  4166.       MVI    C,SRCHF
  4167.       LXI    D,FCB
  4168.       CALL    BDOS
  4169.       POP    H
  4170.       POP    D
  4171.       POP    B
  4172.       LXI    H,MFNAME5
  4173.       LXI    D,FCB
  4174.       LXI    B,12
  4175.       CALL    MOVER
  4176.       PUSH    B
  4177.       PUSH    D
  4178.       PUSH    H
  4179.       MVI    C,SRCHN
  4180.       LXI    D,FCB
  4181.       CALL    BDOS
  4182.       POP    H
  4183.       POP    D
  4184.       POP    B
  4185. ;
  4186. MFNAME2:  INR    A
  4187.       STC
  4188.       JNZ    MFNAME3
  4189.       STA    MFFLG1
  4190.       RET
  4191. ;.....
  4192. ;
  4193. ;     
  4194. MFNAME3:  DCR    A
  4195.       ANI    3
  4196.       ADD    A
  4197.       ADD    A
  4198.       ADD    A
  4199.       ADD    A
  4200.       ADD    A
  4201.       ADI    81H
  4202.       MOV    L,A
  4203.       MVI    H,0
  4204.       PUSH    H        ;SAVE NAME POINTER
  4205.       LXI    D,MFNAME6+1
  4206.       LXI    B,11
  4207.       CALL    MOVER
  4208.       POP    H
  4209.       LXI    D,FCB+1
  4210.       LXI    B,11
  4211.       CALL    MOVER
  4212.       XRA    A
  4213.       STA    FCBEXT
  4214.       STA    FCBRNO
  4215.       RET
  4216. ;.....
  4217. ;
  4218. ;
  4219. MOVER:      MVI    A,2
  4220.       INR    A
  4221.       JPE    MFNAME4
  4222.       DB    0EDH,0B0H    ;Z-80 'LDIR' INSTUCTION
  4223.       RET
  4224. ;.....
  4225. ;
  4226. ;    
  4227. MFNAME4:  MOV    A,M        ;USED IF AN 8080 CPU IS ACTIVE
  4228.       STAX    D
  4229.       INX    H
  4230.       INX    D
  4231.       DCX    B
  4232.       MOV    A,B
  4233.       ORA    C
  4234.       JNZ    MFNAME4
  4235.       RET
  4236. ;.....
  4237. ;
  4238. ;
  4239. ;=======================================================================
  4240. ;
  4241. ; SHOWS BAUD RATES SET FOR 'TIME TO SEND' FILE TRANSFER.
  4242. ;
  4243. PRTBAUD:  LXI    H,BAUDSPD
  4244.       MVI    D,0
  4245.       LDA    MSPEED        ;GET BAUD RATE CODE
  4246.       MOV    E,A        ;X1
  4247.       ADD    A        ;X2
  4248.       ADD    A        ;X4
  4249.       ADD    E        ;X5
  4250.       MOV    E,A
  4251.       DAD    D        ;POINT TO CORRECT RATE
  4252.       XCHG
  4253.       MVI    C,PRINT
  4254.       CALL    BDOS
  4255.       CALL    ILPRT
  4256.       DB    ' baud',CR,LF,0
  4257.       RET
  4258. ;.....
  4259. ;
  4260. ;
  4261. BAUDSPD      DB    '110$',0,'300$',0,'450$',0,'600$',0,'710$',0
  4262.       DB    '1200$','2400$','4800$','9600$'
  4263. ;.....
  4264. ;
  4265. ;
  4266. ;=======================================================================
  4267. ;
  4268. ; SHOWS THE TIME TO TRANSFER A FILE AT VARIOUS BAUD RATES.  (110-9600)
  4269. ;
  4270. SENDTIME: CALL    ILPRT            ;PRINT FOLLOWING MESSAGE:
  4271.       DB    'File open: ',0
  4272.       LHLD    RCNT        ;GET RECORD COUNT.
  4273.       CALL    DECOUT        ;PRINT DECIMAL NUMBER OF RECORDS
  4274.       CALL    ILPRT
  4275.       DB    ' (',0
  4276.       CALL    DHXOUT        ;NOW PRINT SIZE IN HEX.
  4277.       CALL    ILPRT
  4278.       DB    'H) records',CR,LF
  4279.       DB    'Send time: ',0
  4280.       LDA    MSPEED        ;GET THE SPEED INDICATOR
  4281.       MVI    D,0
  4282.       MOV    E,A        ;SET UP FOR TABLE ACCESS
  4283.       LXI    H,BTABLE    ;POINT TO BAUD FACTOR TABLE
  4284.       DAD    D        ;INDEX TO PROPER FACTOR
  4285.       DAD    D        ;FACTOR IN DE
  4286.       MOV    E,M
  4287.       INX    H
  4288.       MOV    D,M
  4289.       LHLD    RCNT        ;GET # OF RECORDS
  4290.       CALL    DVHLDE        ;DIVIDE 'HL' BY VALUE IN DE (RECORDS/MIN)
  4291.       PUSH    H
  4292.       MOV    L,C
  4293.       MOV    H,B
  4294.       CALL    DECOUT        ;PRINT THE MINUTES PORTION
  4295.       CALL    ILPRT
  4296.       DB    ' mins, ',0
  4297.       LXI    H,RECDBL    ;POINT TO DIVISORS FOR SECONDS
  4298.       LXI    D,0        ;   CALCULATION
  4299.       LDA    MSPEED        ;GET INDEX FOR BAUD RATE
  4300.       MOV    E,A
  4301.       DAD    D        ;INDEX INTO TABLE
  4302.       MOV    A,M        ;GET MULTIPLIER
  4303.       POP    H        ;GET REMAINDER
  4304.       CALL    MULHLA        ;MULTIPLY THE 'HL' X 'A'
  4305.       CALL    SHFTHL
  4306.       CALL    SHFTHL
  4307.       CALL    SHFTHL
  4308.       CALL    SHFTHL    
  4309.       MVI    H,0
  4310.       CALL    DECOUT        ;PRINT THE SECONDS PORTION
  4311.       CALL    ILPRT
  4312.       DB    ' secs at ',0
  4313.       CALL    PRTBAUD
  4314.       CALL    ILPRT
  4315.           DB    'To cancel: use CTL-X',CR,LF,0
  4316.       RET
  4317. ;.....
  4318. ;
  4319. ;
  4320. BTABLE:    DW    5,13,19,25,29,48,96,192,384,0    ;RECORDS/MIN FOR..
  4321. RECDBL:    DB    192,74,51,38,33,20,11,5,3,0    ;..110-9600 BAUD
  4322. ;
  4323. ;    
  4324. ;---->  DVHLDE: DIVIDES 'HL' BY VALUE IN 'DE',
  4325. ;    UPON EXIT: 'BC'=QUOTIENT,'L'=REMAINDER
  4326. ;
  4327. DVHLDE:      PUSH    D        ; SAVE DIVISOR
  4328.       MOV    A,E
  4329.       CMA            ; NEGATE DIVISOR
  4330.       MOV    E,A
  4331.       MOV    A,D
  4332.       CMA
  4333.       MOV    D,A
  4334.       INX    D        ; DE IS NOW TWOS COMPLEMENTED
  4335.       LXI    B,0        ; INIT QUOTIENT
  4336. ;
  4337. DIVL1:      DAD    D        ; SUBTRACT DIVISOR FROM DIVIDEND
  4338.       INX    B        ; BUMP QUOTIENT
  4339.       JC    DIVL1        ; LOOP TILL SIGN CHANGES
  4340.       DCX    B        ; ADJUST QUOTIENT
  4341.       POP    D        ; RETRIEVE DIVISOR
  4342.       DAD    D        ; ADJUST REMAINDER
  4343.       RET
  4344. ;.....
  4345. ;
  4346. ;
  4347. ;---->  MULHLA:  MULTIPLY THE VALUE IN 'HL' BY THE VALUE IN 'A'
  4348. ;         RETURN WITH ANSWER IN 'HL'
  4349. ;
  4350. MULHLA:      XCHG            ; MULTIPLICAND TO DE
  4351.       LXI    H,0        ; INIT PRODUCT
  4352.       INR    A        ; ADJUST MULTIPLIER FOR ZERO TEST
  4353. ;
  4354. MULLP:      DCR    A
  4355.       RZ
  4356. ;
  4357.       DAD    D
  4358.       JMP    MULLP
  4359. ;.....
  4360. ;
  4361. ;
  4362. ;  SHIFT 'HL' REGISTER PAIR ONE BIT TO THE RIGHT
  4363. ;
  4364. SHFTHL:      MOV    A,L
  4365.       RAR
  4366.       MOV    L,A
  4367.       ORA    A        ;CLEAR THE CARRY
  4368.       MOV    A,H
  4369.       RAR
  4370.       MOV    H,A
  4371.       RNC
  4372.       MVI    A,80H
  4373.       ORA    L
  4374.       MOV    L,A
  4375.       RET
  4376. ;.....
  4377. ;
  4378. ;
  4379. ;=======================================================================
  4380. ;
  4381. ;        PMMI BAUD RATE INITIALZATION
  4382. ;
  4383. ;=======================================================================
  4384. ;
  4385. GETBAUD:  LDA    FCB+9        ;GET 1ST DIGIT OF REQUESTED BAUDRATE
  4386.       CPI    ' '        ;IF A SPACE RETURN WITH 300 BAUD
  4387.       MVI    A,52
  4388.       RZ
  4389.       LDA    FCB+9
  4390.       ORA    A        ;IF A NULL RETURN WITH 300 BAUD
  4391.       MVI    A,52
  4392.       RZ
  4393.       LXI    D,FCB+9
  4394.       LXI    H,0
  4395. ;
  4396. DECLP:      LDAX    D
  4397.       INX    D
  4398.       CPI    ' '
  4399.       JZ    DECLP
  4400.       CPI    '0'        ;NUMERALS ARE 0-9
  4401.       JC    BADRATE
  4402.       CPI    '9'+1
  4403.       JNC    BADRATE
  4404.       SUI    '0'
  4405.       MOV    B,H
  4406.       MOV    C,L
  4407.       DAD    H
  4408.       DAD    H
  4409.       DAD    B
  4410.       DAD    H
  4411.       ADD    L
  4412.       MOV    L,A
  4413.       JNZ    DIGNC
  4414.       INR    H
  4415. ;
  4416. DIGNC:      MOV    A,E
  4417.       CPI    FCB+12
  4418.       JNZ    DECLP
  4419.       MOV    A,H
  4420.       CMA
  4421.       MOV    D,A
  4422.        MOV    A,L
  4423.       CMA
  4424.       MOV    E,A
  4425.       INX    D
  4426.       LXI    H,15625        ;250000/16
  4427.       LXI    B,-1
  4428. ;
  4429. DIVLP:      INX    B
  4430.       DAD    D
  4431.       JC     DIVLP
  4432.       MOV    A,B
  4433.       ORA    A
  4434.       MOV    A,C
  4435.       RZ
  4436. ;
  4437. BADRATE:  CALL    ERXIT
  4438.       DB    '++ INVALID BAUDRATE ++$'
  4439. ;...
  4440. ;
  4441. ;
  4442. CHGMSPD:  MVI    C,0        ;CHANGES PMMI MSPEED FOR 110-1200 BAUD
  4443.       CPI    100        ;<300 BAUD
  4444.       RNC
  4445.       INR    C        ;C=1 FOR 300 BAUD
  4446.       CPI    40        ;<450 BAUD
  4447.       RNC
  4448.       INR    C        ;C=2 FOR 450 BAUD
  4449.       CPI    30        ;<600 BAUD
  4450.       RNC
  4451.       INR    C        ;C=3 FOR 600 BAUD
  4452.       CPI    24        ;<710 BAUD
  4453.       RNC
  4454.       INR    C        ;C=4 FOR 710 BAUD
  4455.       RET
  4456. ;.....
  4457. ;
  4458. ;
  4459. ; The non-PMMI setup routines can go here.  The following is a starting
  4460. ; point.  Several hundreds of bytes are available.
  4461. ;
  4462. SETUPR:      RET
  4463. ;.....
  4464. ;
  4465. ;
  4466. ;=======================================================================
  4467. ;
  4468. ;    PMMI DIALING ROUTINES
  4469. ;
  4470. ;=======================================================================
  4471. ;
  4472. ; Dialing routines taken (and greatly modified) from PMMI manual.
  4473. ;
  4474. ; Modem control command words
  4475. ;
  4476. CLEAR:      EQU    3FH        ;IDLE MODE
  4477. MAKEM:      EQU    1        ;TELE LINE MAKE (OFF HOOK)
  4478. BRKM:      EQU    0        ;TELE LINE ON HOOK (BREAK DURING DIALING)
  4479. DTMSK:      EQU    1        ;DIAL TONE MASK
  4480. RBLMT:      EQU    35        ;7 SECONDS TO WAIT TIL NO-RING-HEARD MSG
  4481. RBWAIT:      EQU    50        ;5 SECOND DELAY BEFORE REDIALING NUMBER
  4482. TMPUL:      EQU    80H        ;TIMER PULSES MASK BIT
  4483. TRATE:      EQU    250        ;VALUE FOR 0.1 SECOND
  4484. ;.....
  4485. ;
  4486. ; Dialing routine
  4487. ;
  4488. DIAL:      LDA    PMMIBYTE    ;USING A PMMI MODEM?
  4489.       ORA    A
  4490.       RZ            ;IF NOT, SKIP AUTO-DIALING ROUTINE
  4491. ;
  4492.       XRA    A
  4493.       STA    CRFLAG        ;ZERO THE CONTINUOUS DIAL FLAG
  4494.       STA    RINGBKFL    ;ZERO THE RINGBACK FLAG
  4495.       LXI    H,0
  4496.       SHLD    DIALCT        ;ZERO THE DIAL COUNT
  4497.       LXI    H,CMDBUF+1    ;POINT TO THE NUMBER OF CHARACTERS IN..
  4498.       MOV    A,M        ;..THE BUFFER, THEN GET THE NUMBER
  4499.       CPI    3+1        ;ANYTHING TYPED AFTER "CAL"?
  4500.       JC    DIAL1        ;IF NOT, GO THROUGH LIBRARY ROUTINE
  4501. ;
  4502. ;
  4503. ; If there were only 3 characters, then "CAL<RET>" was typed -- the user
  4504. ; obviously expecting to get a phone number (or letter) from the library
  4505. ; file.  If 4 or more, a number (or letter) was typed in from the menu
  4506. ; command line, so move the characters down 4 to compensate.  Needed for
  4507. ; auto-redialing of menu command line entries.
  4508. ;
  4509.       MOV    C,A        ;PUT INTO THE 'C' REG.
  4510.       MVI    B,0        ;WILL MOVE ORIGINAL NUMBER DOWN 4
  4511.       SUI    4        ;ELIMINATE THE "CAL " PORTION
  4512.       MOV    M,A        ;STORE NEW COUNT AT CMDBUF+1
  4513.       INX    H        ;CMDBUF+2 (FIRST CHAR. OF STRING)
  4514.       XCHG            ;'DE' NOW HAS CMDBUF+2
  4515.       LXI    H,CMDBUF+6    ;POINT TO NUMBER (OR LETTER) TO DIAL
  4516.       CALL    MOVER        ;MOVE THE GROUP DOWN 4 PLACES
  4517.       JMP    DIAL4        ;CHECK IF LIBRARY NUMBER, THEN DIAL
  4518. ;...
  4519. ;
  4520. ;
  4521. ; Comes here if no phone number was manually entered after "CAL" and if
  4522. ; no phone library letter was entered.  Displays the phone number library
  4523. ; then asks for an entry.
  4524. ;
  4525. DIAL1:      MVI    C,13        ;NUMBER OF LINES TO MOVE
  4526.       LXI    H,NUMBLIB    ;START OF PHONE NUMBER LIBRARY
  4527.       LXI    D,DBUF        ;BUFFER ADDRESS TO STORE THEM TEMPORARILY
  4528.       CALL    NEWLINE        ;START WITH CRLF
  4529.       STAX    D        ;+LF
  4530.       INX    D        ;AND BUMP IT
  4531. ;
  4532. DIAL2:      MVI    B,LIBLEN    ;NUMBER OF BYTES TO MOVE
  4533.       CALL    MOVE        ;MOVE TO BUFFER
  4534.       CALL    SPACES        ;2 ENTRIES + 3 SPACES = 71 CHARACTERS
  4535.       MVI    B,LIBLEN
  4536.       CALL    MOVE
  4537.       CALL    NEWLINE
  4538.       DCR    C        ;ONE LESS LINE TO PRINT
  4539.       JNZ    DIAL2        ;IF NOT ZERO, PRINT ANOTHER
  4540. ;
  4541. DIAL3:      MVI    A,'$'        ;BDOS PRINT ROUTINE TERMINATE CHARACTER
  4542.       STAX    D        ;STORE IN BUFFER
  4543.       CALL    CLRTST
  4544.       MVI    C,PRINT
  4545.       LXI    D,DBUF        ;PRINT THE LIBRARY ON THE CRT
  4546.       CALL    BDOS
  4547.       CALL    ILPRT        ;ASK WHICH ONE IS WANTED
  4548.       DB    CR,LF,'Enter number or library letter - <CR> '
  4549.       DB    'when finished,',CR,LF
  4550.       DB    'CTL-X cancels while dialing: ',0
  4551.       LXI    D,CMDBUF
  4552.       CALL    INBUF
  4553. ;
  4554. ; You now have either a library letter or a manually entered phone num-
  4555. ; ber.  These either came from the menu command line or from the library
  4556. ; command line.  Next we see if a letter, if so, get the corresponding
  4557. ; line with phone number from the library.  If a number we ignore the
  4558. ; library look-up.  (Ringback numbers must end with letter 'R'.)
  4559. ;
  4560. DIAL4:      LXI    H,CMDBUF+1    ;NUBER OF CHARACTERS IN BUFFER
  4561.       MOV    A,M
  4562.       ORA    A        ;NULL MEAND <CR> WAS TYPED
  4563.       JZ    DIALEXIT    ;ABORT DIALING, RETURN TO MENU
  4564.       INX    H        ;FIRST TYPED CHAR OF NUMBER TO DIAL
  4565.       CALL    DIALBGN        ;DISCONNECT, RECONNECT, WAIT FOR TONE
  4566.       JC    DIALEXIT    ;IF NO DIALTONE, PONDER NEXT MOVE
  4567.       MVI    B,'A'        ;FIRST LETTER OF ALPHABET
  4568.       MVI    E,0        ;COUNTS NUMBER OF LETTERS TO MATCH
  4569.       MVI    C,26        ;NUMBER OF LETTERS IN ALPHABET
  4570.       MOV    A,M        ;GET CHAR BUFFER
  4571. ;
  4572. DIAL5:      CMP    B        ;NUMBER FROM TABLE?
  4573.       JZ    DIAL6
  4574.       INR    B        ;MAKE NEXT LETTER (A-Z)
  4575.       INR    E        ;COUNT UP
  4576.       DCR    C        ;COUNT DOWN
  4577.       JZ    DIAL9        ;WAS NOT A-Z SO EXIT
  4578.       JMP    DIAL5        ;LOOP
  4579. ;
  4580. ;
  4581. ; Now have a match between the requested letter and one in the library
  4582. ; 'E' holds the decimal equivalent (1-26) of the letter (A-Z).
  4583. ;
  4584. DIAL6:      LXI    H,NUMBLIB    ;PHONE NUMBER LIBRARY
  4585.       LXI    B,LIBLEN    ;LENGTH OF LIBRARY ENTRY
  4586.       MOV    A,E        ;NUMBER OF TIMES TO LIBRARY LENGTH TO HL
  4587.       ORA    A        ;SET FLAGS
  4588.       JZ    DIAL8
  4589. ;
  4590. DIAL7:      MOV    A,M        ;GET FIRST CHAR OF SELECTED LIB ENTRY
  4591.       ORA    A        ;SET FLAGS
  4592.       JZ    DIALBAD        ;SEND BAD LIBRARY MSG AND ABORT
  4593.       DAD    B        ;INCREMENT 'HL' BY LIBRARY LENGTH
  4594.       DCR    E        ;COUNTDOWN
  4595.       JNZ    DIAL7        ;NOT THERE YET, LOOP
  4596. ;
  4597. ;
  4598. ; Now have the line in the phone number library matching the requested
  4599. ; letter so store that line starting at 'CMDBUF+1'
  4600. ;
  4601. DIAL8:      MVI    B,LIBLEN    ;NUMBER OF CHARACTERS TO GET FROM TABLE
  4602.       LXI    D,CMDBUF+1    ;POINT TO BUFFER
  4603.       XCHG            ;'HL' POINTS TO CMDBUF+1
  4604.       MOV    M,B        ;LENGTH OF EACH TABLE ENTRY
  4605.       XCHG            ;RESTORE THE REGISTERS
  4606.       INX    D        ;POINT TO FIRST CHAR POSITION IN BUFFER
  4607.       CALL    MOVE        ;MOVE THE TABLE ENTRY TO THE BUFFER
  4608. ;
  4609. ;
  4610. ; Now have the full line including phone number in 'CMDBUF' area.
  4611. ;
  4612. DIAL9:      LXI    H,CMDBUF+1
  4613.       MOV    E,M        ;NUMBER OF CHARS IN BUFF
  4614.       INX    H        ;POINT TO 1ST CHAR. TO DIAL
  4615. ;
  4616. DIAL10:      MOV    A,M        ;GET FIRST NUMBER FROM THE BUFFER
  4617.       ORA    A        ;SET FLAGS
  4618.       JZ    DIALBAD        ;BUM NUMBER IF A NULL
  4619. ;
  4620. ;
  4621. ; Dial a digit, check keyboard for abort
  4622. ;
  4623.       CALL    DIALA        ;SHOW THE STRING, DIAL THE NUMBER
  4624. ;
  4625.       CALL    STAT        ;KEYPRESS?
  4626.       ORA    A        ;SET FLAGS
  4627.       CNZ    KEYIN        ;YES, GO GET IT
  4628.       CPI    CAN        ;CTL-X?
  4629.       JZ    DIALEXIT    ;YES, ABORT
  4630.       INX    H        ;BUMP POINTER
  4631.       PUSH    D        ;SAVE DE
  4632.       PUSH    H        ;SAVE HL
  4633.       MVI    B,1        ;WAIT 0.1 SECOND (ONE TIMER INTERVAL)
  4634.       CALL    TIMER
  4635.       POP    H        ;RESTORE HL
  4636.       POP    D        ;RESTORE DE    
  4637.       DCR    E        ;ONE LESS CHARACTER TO GO
  4638.       JNZ    DIAL10        ;IF NOT DONE, LOOP
  4639. ;
  4640. ;
  4641. ; Show the number of dial attempts
  4642. ;
  4643.       CALL    ILPRT
  4644.       DB    '  try #',0
  4645.       LHLD    DIALCT        ;INCREMENT THE DIAL COUNT
  4646.       INX    H
  4647.       SHLD    DIALCT
  4648.       CALL    DECOUT        ;SHOW NUMBER OF ATTEMPTS SO FAR
  4649. ;
  4650. ;
  4651. ; Dialing is all done
  4652. ;
  4653.       CALL    CRLF
  4654.       MVI    A,07FH        ;TURN ON 'DTR'
  4655.       CALL    OUT$MODCTL2    ;TIMER RATE?
  4656.       MVI    B,1        ;0.1 SECOND PER INTERVAL
  4657.       CALL    TIMER        ;WAIT FOR MODEM TO TURN ON 'DTR'
  4658. ;MOD(BGL)***
  4659.       LDA    PARTY        ;DEFAULT PARITY SET, NORMALLY
  4660.                 ;..1 STOP BIT, NO PARITY, 8 DATA
  4661.                 ;..BITS, NO DISCON. AFTER 17 SEC
  4662.       CALL    OUT$MODCTLP
  4663.       MVI    D,4        ;CLEAR TO SEND MASK
  4664.       MVI    C,WAITCTS    ;WAIT TIME FOR CTS..
  4665.       CALL    WAIT        ;..(30 SECONDS, CAN SET 'WAITCTS' FOR
  4666. ;                               ;..UP TO 51 SECONDS FOR EUROPEAN USE)
  4667. ;
  4668. ; If connection made, go get options for starting communications
  4669. ;
  4670.       JNC    CONMADE        ;CONNECTION MADE
  4671. ;
  4672. ;
  4673. ; Connection not made, see if a redial is desired
  4674. ;
  4675.       CALL    DISCONNT    ;HANG-UP SO WE CAN REDIAL IF DESIRED
  4676. ;
  4677. DIALAGN:  LDA    CRFLAG        ;CONTINUOUS REDIAL FLAG
  4678.       ORA    A
  4679.       JNZ    DIALAGN1    ;IF ALREADY SET, GO DIAL AGAIN
  4680.       CALL    ILPRT        ;IF NOT, SEE IF SHOULD REDIAL AGAIN
  4681.       DB    CR,LF,'No answer after time-out.  Redial? '
  4682.       DB    '(Y/N/C): ',BELL,0
  4683.       CALL    KBDCHR
  4684.       CALL    CRLF        ;NEW LINE
  4685.       CPI    'N'        ;REDIAL?
  4686.       JZ    MENU        ;NO, GO MENU
  4687.       CPI    'Y'        ;REDIAL?
  4688.       JZ    DIALAGN1    ;YES, REDIAL
  4689.       CPI    'C'        ;CONTINUOUS REDIAL?
  4690.       JNZ    DIALAGN        ;INVALID RESPONSE, ASK AGAIN
  4691.       MVI    A,TRUE        ;SET TRUE
  4692.       STA    CRFLAG        ;CONTINUOUS REDIAL FLAG
  4693. ;
  4694. DIALAGN1: MVI    B,RBWAIT    ;5 SECONDS WAIT FOR PMMI RESET (OR BUSY)
  4695.       CALL    TIMER        ;OR BUSY TONE MAY BE SENSED AS DIALTONE
  4696.       LDA    RINGBKFL    ;RINGBACK FLAG SET?
  4697.       ORA    A
  4698.       JZ    DIAL4        ;IF NOT, GO REDIAL A NORMAL NUMBER
  4699.       STA    CMDBUF+1    ;RESTORE ORIGINAL VALUE INCLUDING THE 'R'
  4700.       JMP    DIAL4        ;REDIAL ENTRY POINT
  4701. ;.....
  4702. ;
  4703. ;
  4704. ; Connection has been made
  4705. ;
  4706. CONMADE:  CALL    ILPRT
  4707.       DB    CR,LF,'Connection established - Select options: '
  4708.       DB    BELL,0
  4709. ;
  4710. CONMAD1:  CALL    STAT        ;KEYPRESS?
  4711.       ORA    A        ;SET FLAGS
  4712.       JNZ    GETCMD        ;KEY PRESSED, GO GET OPTIONS
  4713.       MVI    A,BELL
  4714.       CALL    TYPE        ;RING BELL
  4715.       LXI    B,2000H
  4716. ;
  4717. CONMAD2:  DCR    C
  4718.       JNZ    CONMAD2        ;KILL SOME TIME FOR TERMINAL..
  4719.       DCR    B        ;..PROCESS THE BELL
  4720.       JNZ    CONMAD2
  4721.       JMP    CONMAD1        ;LOOP UNTIL CONNECTED
  4722. ;.....
  4723. ;
  4724. ;
  4725. ; Automatic dialing routine, prints the number being dialed
  4726. ;
  4727. DIALA:      CALL    TYPE        ;PRINT WHATEVER CHARACTER, DASHES, ETC.
  4728.       CPI    'R'        ;COULD IT BE A RINGBACK CHARACTER?
  4729.       JNZ    DIALA1        ;IF NOT, PROBABLY A NUMBER SO EXIT
  4730.       PUSH    PSW        ;SAVE ACCUMULATOR & FLAGS
  4731.       MOV    A,E        ;GET THE CHARACTER COUNT.  IS THIS "R"..
  4732.       CPI    1        ;..THE LAST CHARACTER IN THE STRING?
  4733.       JZ    RINGBK        ;YES, MUST BE RINGBACK CHAR, DO RINGBACK
  4734.       POP    PSW        ;EVERYTHING BACK AS IT WAS
  4735. ;
  4736. DIALA1:   CPI    '0'        ;DIGITS ARE 0-9
  4737.       RC            ;EXIT LESS THAN ASCII '0'
  4738.       CPI    '9'+1
  4739.       RNC            ;EXIT IF MORE THAN ASCII '9'
  4740.       SUI    '0'        ;STRIP ASCII -- COULD ALSO DO 'ANI 0FH'
  4741.       JNZ    DIALA2
  4742.       MVI    A,10        ;CONVERT ZERO TO 10 PULSES
  4743. ;
  4744. DIALA2:      MOV    C,A
  4745.       LDA    PULSERATE    ;CONTAINS VALUE FOR DIAL SPEED
  4746.       CALL    OUT$BAUDRP
  4747. ;
  4748. DIALA3:      CALL    IN$BAUDRP
  4749.       ANI    TMPUL
  4750.       JNZ    DIALA3
  4751. ;
  4752. DIALA4:      CALL    IN$BAUDRP
  4753.       ANI    TMPUL
  4754.       JZ    DIALA4
  4755. ;
  4756. DIALA5:      MVI    A,MAKEM
  4757.       CALL    OUT$MODCTLP
  4758. ;
  4759. DIALA6:      CALL    IN$BAUDRP
  4760.       ANI    TMPUL
  4761.       JNZ    DIALA6
  4762.       MVI    A,BRKM
  4763.       CALL    OUT$MODCTLP
  4764. ;
  4765. DIALA7:      CALL    IN$BAUDRP
  4766.       ANI    TMPUL
  4767.       JZ    DIALA7
  4768.       DCR    C
  4769.       JNZ    DIALA5
  4770.       MVI    A,MAKEM
  4771.       CALL    OUT$MODCTLP
  4772. ;MOD(BGL)***
  4773.       MVI    B,8        ;0.1 SECOND PER TIMER INTERVAL
  4774.       JMP    TIMER        ;RETURN TO CALLER
  4775. ;.....
  4776. ;
  4777. ;
  4778. ; Print bad library number message and abort if a null is encountered.
  4779. ;
  4780. DIALBAD:  CALL    ILPRT
  4781.       DB    CR,LF,'++ Bad library number called ++',CR,LF,0
  4782. ;
  4783. DIALEXIT: CALL    DISCONNT    ;ABORT ROUTINE
  4784.       CALL    CRLF
  4785.       JMP    MENU
  4786. ;.....
  4787. ;
  4788. ;
  4789. ; Disconnect from the line, reconnect and wait for the dialtone.
  4790. ;
  4791. DIALBGN:  CALL    DISCONNT
  4792.       CALL    ILPRT
  4793.       DB    CR,LF,'Waiting for dial tone',CR,LF,0
  4794.       MVI    A,MAKEM        ;MAKE MAKE (OFF-HOOK)
  4795.       CALL    OUT$MODCTLP    ;DO IT
  4796.       MVI    D,DTMSK        ;DIAL TONE MASK
  4797.       MVI    C,50        ;WAITS UP TO 10 SEC. FOR DIAL TONE
  4798.       CALL    WAIT        ;WAIT FOR DIAL TONE
  4799. ;
  4800. ;
  4801. ; Wait subroutine will return with carry set if unable to get dialtone.
  4802. ; If carry is not set, the dialtone was received.
  4803. ;
  4804.       RNC            ;IF DIAL TONE WITHIN 10 SECONDS
  4805.       CALL    ILPRT        ;ELSE, MESSAGE AND RETURN WITH CARRY SET
  4806.       DB    CR,LF,'++ NO DIAL TONE ++',CR,LF,0
  4807.       CALL    DISCONNT
  4808.       STC            ;SET THE CARRY BIT (NO DIALTONE)
  4809.       RET
  4810. ;.....
  4811. ;
  4812. ;
  4813. DISCONNT: XRA    A        ;0
  4814.       CALL    OUT$MODCTL2     ;CLEAR DAV, ESD, ETC
  4815.       CALL    OUT$MODCTLP     ;HANG-UP
  4816.       PUSH    B
  4817.       MVI    B,8        ;WAIT FOR PMMI TO DISCONNECT (0.8 SEC)
  4818.       CALL    TIMER        ;0.1 SECOND PER TIMER INTERVAL
  4819.       POP    B
  4820.       RET
  4821. ;.....
  4822. ;
  4823. ;
  4824. HANGUP:   MVI    A,CLEAR
  4825.       CALL    OUT$MODCTL2
  4826.       MVI    A,0
  4827.       CALL    OUT$MODCTLP
  4828.       RET
  4829. ;.....
  4830. ;
  4831. ;
  4832. ; Handles the special ringback numbers.  Dials, lets it ring only once,
  4833. ; hangs up and then redials.
  4834. ;
  4835. RINGBK:      POP    PSW        ;TO GET IT OFF THE STACK
  4836.       LDA    CMDBUF+1    ;GET THE NUMBER OF CHARS. IN THE BUFFER
  4837.       STA    RINGBKFL    ;STORE ORIGINAL NUMBER INCLUDING THE 'R'
  4838.       SUI    1        ;SUBTRACT 1 TO AVOID THE RINGBACK CHAR
  4839.       STA    CMDBUF+1    ;STORE THE NEW VALUE
  4840.       MVI    D,DTMSK        ;LOAD TONE DETECT MASK
  4841.       MVI    C,RBLMT        ;WAITS UP TO 7 SECONDS FOR A RING
  4842.       CALL    WAIT
  4843.       JC    RBTIME        ;JUMP IF NO RING DETECTED
  4844.       MVI    B,25        ;GOT A RING, WAIT 2.5 SEC
  4845.       CALL    TIMER
  4846.       CALL    IN$BAUDRP    ;IS TONE STILL PRESENT?
  4847.       ANA    D
  4848.       JZ    DIALAGN        ;YES, MUST BE BUSY
  4849. ;.....
  4850. ;
  4851. ;
  4852. ; Hang up, redial and listen for dial tone
  4853. ;
  4854. RNGBK1:      CALL    HANGUP        ;HANG UP THE PHONE
  4855.       MVI    B,RBWAIT    ;WAIT 5 SECONDS BEFORE REDIALING..
  4856.       CALL    TIMER        ;..FOR LINE TO CLEAR, ETC.
  4857.       CALL    DIALBGN        ;DISCONNECT, RECONNECT, WAIT FOR TONE
  4858.       JNC    DIAL9        ;GO REDIAL NUMBER
  4859.       JMP    DIALAGN        ;NO DIAL TONE HEARD
  4860. ;.....
  4861. ;
  4862. ;
  4863. RBTIME:      CALL    CRLF
  4864.       JMP    RNGBK1        ;HANGUP, REDIAL, & LISTEN FOR CARRIER
  4865. ;.....
  4866. ;
  4867. ;
  4868. ; PMMI timer routine.  Waits 0.1 seconds for each unit in 'B' reg.
  4869. ;
  4870. TIMER:      MVI    A,TRATE        ;TRATE 250, VALUE FOR .1 SEC INTERVAL
  4871.       CALL    OUT$BAUDRP     ;'B' CONTAINS NUMBER OF .1 SEC INTERVALS
  4872. ;
  4873. TIMER1:   CALL    IN$BAUDRP      ;TO COUNT
  4874.       ANI    TMPUL
  4875.       JZ    TIMER1          ;WAIT FOR TIMER TO GO HIGH
  4876. ;
  4877. TIMER2:      CALL    IN$BAUDRP
  4878.       ANI    TMPUL
  4879.       JNZ    TIMER2          ;WAIT FOR TIMER TO GO LOW
  4880.       DCR    B
  4881.       JNZ    TIMER1
  4882.       RET
  4883. ;.....
  4884. ;
  4885. ;
  4886. ; Time-out routine.  Must be called with mask in 'D' reg. for input at
  4887. ; relative port 2 and number of seconds (times 10) in 'C' reg.
  4888. ;
  4889. WAIT:      MVI    B,2    
  4890.       CALL    TIMER        ;WAIT FOR TIMER TO GO HIGH THEN LOW
  4891.       CALL    IN$BAUDRP    ;PMMIADDR+2 (MODEM STATUS PORT)
  4892.       ANA    D        ;(CTS or DIALTONE MASK)
  4893.       RZ            ;ACTIVE LOW, SO RETURN ON 0
  4894.       PUSH    B        ;SAVE..
  4895.       PUSH    D        ;..ACTIVE REG'S
  4896.       CALL    STAT        ;KEYPRESS?
  4897.       ORA    A        ;SET FLAGS
  4898.       CNZ    KEYIN        ;YES, GET CHAR
  4899.       CPI    CAN        ;CTL-X TO INTENTIONALLY ABORT?
  4900.       JZ    WAIT1        ;YES, DISCONNECT, JMP TO MENU
  4901.       POP    D        ;RESTORE..
  4902.       POP    B        ;..REGS
  4903.       DCR    C        ;COUNT-DOWN
  4904.       JNZ    WAIT
  4905.       STC            ;SET CARRY TO INDICATE MASK NOT SET
  4906.       RET
  4907. ;.....
  4908. ;
  4909. ;
  4910. WAIT1:      POP    D        ;RESET..
  4911.       POP    B        ;..STACK
  4912.       JMP    DISCON1        ;DISCONNECT
  4913. ;.....
  4914. ;
  4915. ;
  4916. ;        (END OF PMMI DIALING ROUTINE)
  4917. ;
  4918. ;=======================================================================
  4919. ;***********************************************************************
  4920. ;*                                       *
  4921. ;*   CRCSUBS (Cyclic Redundancy Code Subroutines) version 1.20 8080    *
  4922. ;*   Mnemonics                                   *
  4923. ;*                                       *
  4924. ;*     These subroutines will compute and check a true 16-bit Cyclic   *
  4925. ;*   Redundancy Code for a message of arbitrary length.               *
  4926. ;*                                       *
  4927. ;*     The use of this scheme will guarantee detection of all single   *
  4928. ;*   and double bit errors, all errors with an odd number of error     *
  4929. ;*   bits, all burst errors of length 16 or less, 99.997% of all 17-   *
  4930. ;*   bit error bursts and 99.998% of all possible longer error bursts. *
  4931. ;*   (Ref: Computer Networks, Andrew S. Tanenbaum, Prentiss-Hall 1981) *
  4932. ;*                                       *
  4933. ;*    This program may be freely reproduced for non-profit use.      *
  4934. ;*    Copyrighted 1981, Carpenter Associates, Bloomfield Hills, MI   *
  4935. ;*                                       *
  4936. ;***********************************************************************
  4937. ;
  4938. ;
  4939. ;    ENTRY    CLRCRC,UPDCRC,FINCRC,CHKCRC
  4940. ;
  4941. CLRCRC:      PUSH    H        ;RESET CRC ACCUMULATOR FOR A NEW MESSAGE
  4942.       LXI    H,0
  4943.       SHLD    CRCVAL
  4944.       POP    H
  4945.       RET
  4946. ;.....
  4947. ;
  4948. ;
  4949. UPDCRC:      PUSH    PSW        ;UPDATE CRC ACCUMULATOR USING BYTE IN 'A'
  4950.       PUSH    B
  4951.       PUSH    H
  4952.       MVI    B,8
  4953.       MOV    C,A
  4954.       LHLD    CRCVAL
  4955. ;
  4956. UPDLOOP:  MOV    A,C
  4957.       RLC
  4958.       MOV    C,A
  4959.       MOV    A,L
  4960.       RAL
  4961.       MOV    L,A
  4962.       MOV    A,H
  4963.       RAL
  4964.       MOV    H,A
  4965.       JNC    SKIPIT
  4966.       MOV    A,H        ;THE GENERATOR IS X^16 + X^12 + X^5 + 1
  4967.       XRI    10H        ;  AS RECOMMENDED BY CCITT.
  4968.       MOV    H,A        ;  AN ALTERNATE GENERATOR WHICH IS OFTEN
  4969.       MOV    A,L        ;  USED IN SYNCHRONQOUS TRANSMISSION
  4970.       XRI    21H        ;  PROTOCOLS IS X^16 + X^15 + X^2 + 1.
  4971.       MOV    L,A        ;  THIS MAY BE USED BY SUBSTITUTING
  4972. ;
  4973. SKIPIT:      DCR    B        ;  XOR 80H FOR XOR 10H, AND XOR 05H FOR
  4974.       JNZ    UPDLOOP        ;  21H IN THE ADJACENT CODE.
  4975.       SHLD    CRCVAL
  4976.       POP    H
  4977.       POP    B
  4978.       POP    PSW
  4979.       RET
  4980. ;.....
  4981. ;
  4982. ;
  4983. FINCRC:      PUSH    PSW        ;FINISH CRC CALCULATIONS FOR OUTPUT MSG
  4984.       XRA    A
  4985.       CALL    UPDCRC
  4986.       CALL    UPDCRC
  4987.       PUSH    H
  4988.       LHLD    CRCVAL
  4989.       MOV    D,H
  4990.       MOV    E,L
  4991.       POP    H
  4992.       POP    PSW
  4993.       RET
  4994. ;.....
  4995. ;
  4996. ;
  4997. CHKCRC:      PUSH    H        ;CHECK CRC BYTES OF RECEIVED MESSAGE
  4998.       LHLD    CRCVAL
  4999.       MOV    A,H
  5000.       ORA    L
  5001.       POP    H
  5002.       RZ
  5003.       MVI    A,0FFH
  5004.       RET
  5005. ;.....
  5006. ;
  5007. ;
  5008. ;***********************************************************************
  5009. ;
  5010. ;                             MENU
  5011. ;
  5012. ;***********************************************************************
  5013. ;
  5014. ;
  5015. MENU0:      LDA    NFILFLG
  5016.       ORA    A
  5017.       JNZ    MENU        ;GO IF NO FILE ACTIVE
  5018.       CALL    ILPRT        ;ELSE PRINT MESSAGE
  5019.       DB    CR,LF
  5020.       DB    '** There may be text in the memory buffer.  It will **'
  5021.       DB    CR,LF
  5022.       DB    '** be lost unless the NOL or WRT commands are used. **'
  5023.       DB    CR,LF,BELL,0
  5024.       JMP    MENU1
  5025. ;
  5026. MENU:      XRA    A
  5027.       STA    ABORTFLG    ;NULL THE FLAG
  5028.       LDA    EXITFLG
  5029.       ORA    A
  5030.       JNZ    EXIT        ;IF SET, EXIT
  5031. ;
  5032. MENU1:      LXI    H,RESTSN    ;RESTORE RECORD NUMBERS..
  5033.       LXI    D,RECDNOB     ;..FOR NEW FILE TRANSFER.
  5034.       MVI    B,RECDNOE-RECDNOB
  5035.       CALL    MOVE
  5036.       LXI    H,RESTROPT    ;RESTORE OPTION TABLE
  5037.       LXI    D,OPTBL
  5038.       MVI    B,OPTBE-OPTBL
  5039.       CALL    MOVE
  5040.       XRA    A
  5041.       STA    MFFLG1        ;RESET MFACCESS ROUTINE..
  5042.       CMA            ;..AND MULTI TRANS IN CASE..
  5043.       STA    FSTFLG        ;..OF ABORT.
  5044.       JMP    XPRT
  5045. ;.....
  5046. ;
  5047. ;
  5048. ; *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *
  5049. ;
  5050. ;             THE COMMAND MENU
  5051. ;
  5052. ; *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *
  5053. ;
  5054. MENU2:      CALL    CLRTST
  5055.       CALL    ILPRT
  5056.       DB    '                  Single Letter Commands',CR,LF,LF
  5057.       DB    ' ?  - Display current settings',CR,LF
  5058.       DB    ' H  - Display this information',CR,LF
  5059.       DB    ' E  - Terminal mode with echo',CR,LF
  5060.       DB    ' L  - Terminal mode with local echo',CR,LF
  5061.       DB    ' T  - Terminal mode',CR,LF
  5062.       DB    '         For copying text to disk use T (or E or L) '
  5063.       DB    'FILENAME.TYP',CR,LF
  5064.       DB    '         Start or Stop toggles described on subsequent '
  5065.       DB    'screen.',CR,LF,LF
  5066.       DB    ' R  - Receive CP/M file using Christensen Protocol'
  5067.       DB    CR,LF
  5068.       DB    ' S  - Send CP/M file using Christensen Protocol',CR,LF 
  5069.       DB    '         Command: R (or S) FILENAME.TYP',CR,LF,LF
  5070.       DB    '         R and S can use the following subcommands:'
  5071.       DB    CR,LF
  5072.       DB    '            B  - Bulk transfer using wildcards '
  5073.       DB    '(e.g., *.*)',CR,LF
  5074.       DB    '            Q  - Quiet mode (no messages to console)'
  5075.       DB    CR,LF
  5076.       DB    '            T  - Return to terminal mode after '
  5077.       DB    'transfer',CR,LF
  5078.       DB    '            V  - View bytes transferred on console'
  5079.       DB    CR,LF,LF
  5080.       DB    '      The single letter commands may also be used on '
  5081.       DB    'the',CR,LF
  5082.       DB    '      command line when the program is initially '
  5083.       DB    'executed.',CR,LF,LF,0
  5084. ;
  5085.       CALL    NXTSCRN
  5086. ;
  5087.       LDA    PMMIBYTE
  5088.       ORA    A
  5089.       JZ    THREELTR    ;IF NOT PMMI, SKIP THIS SPECIAL PAGE
  5090.       CALL    ILPRT
  5091.       DB    '            Additional Subcommands for PMMI Modem'
  5092.       DB    CR,LF,LF
  5093.       DB    '  Modem control:',CR,LF
  5094.       DB    '    A - Answer tone for send or receive',CR,LF
  5095.       DB    '    O - Originate tone for send or receive',CR,LF
  5096.       DB    '    D - Disconnect from the phone line',CR,LF
  5097.       DB    '    X - Disconnect, then reboot to CP/M',CR,LF,LF
  5098.       DB    '  Parity option:',CR,LF
  5099.       DB    '    1 - Set and check for odd parity',CR,LF
  5100.       DB    '    0 - Set and check for even parity',CR,LF
  5101.       DB    '           Both ends must be capable of these options'
  5102.       DB    CR,LF
  5103.       DB    '           which are available only in R and S modes.'
  5104.       DB    CR,LF
  5105.       DB    '           The parity checking will be part of the'
  5106.       DB    CR,LF
  5107.       DB    '           file transfer protocol.',CR,LF,LF
  5108.       DB    '  Speed Options:',CR,LF
  5109.       DB    '        After entering your primary and secondary '
  5110.       DB    'options,',CR,LF
  5111.       DB    '        you can set the modem speed by placing a '
  5112.       DB    ' "." after',CR,LF
  5113.       DB    '        the options followed by the speed e.g., '
  5114.       DB    '300, 1200.',CR,LF,LF
  5115.       DB    '        EXAMPLE:  SBOT.600 will set the modem for '
  5116.        DB    '600 baud',CR,LF,LF,0
  5117. ;
  5118.       CALL    NXTSCRN
  5119. ;
  5120. THREELTR: CALL    ILPRT
  5121.       DB    '                Three Letter Commands',CR,LF
  5122.       DB    'CPM - Exit from this program to CP/M',CR,LF
  5123.       DB    'DIR - List directory and space free (may specify '
  5124.       DB    'drive)',CR,LF
  5125.       DB    'ERA - Erase file (may specify drive)',CR,LF
  5126.       DB    'LOG - Change default drive/user no. (specify '
  5127.       DB    'drive/user)',CR,LF
  5128.       DB    '      and reset disks.  e.g. LOG A0: or LOG B:  '
  5129.       DB    '(user # unchanged)',CR,LF
  5130.       DB    'SPD - Set speed of file output in terminal mode'
  5131.       DB    CR,LF,0
  5132. ;
  5133.       CALL    SORPTST
  5134.       JNZ    NOTIME
  5135.       CALL    ILPRT
  5136.       DB    'TIM - Select Baud rate for "time-to-send" msg.',CR,LF,0
  5137. ;
  5138. NOTIME:      LDA    TOGGLECRC
  5139.       ORA    A
  5140.       JZ    NOTOGCRC
  5141.       CALL    ILPRT
  5142.       DB    'TCC - Toggle CRC/Checksum mode on receive',CR,LF,0
  5143. ;
  5144. NOTOGCRC: LDA    TOGGLEBK
  5145.       ORA    A
  5146.       JZ    NOTOGBK
  5147.       CALL    ILPRT
  5148.       DB    'TBR - Toggle backspace to rubout conversion',CR,LF,0
  5149. ;
  5150. NOTOGBK:  LDA    TOGGLELOC
  5151.       ORA    A
  5152.       JZ    NOTOGLOC
  5153.       CALL    ILPRT
  5154.       DB    'TLC - Toggle  1) local command immediate',CR,LF
  5155.       DB    '              2) local command after ',0
  5156.       LDA    EXTCHR
  5157.       CALL    SHFTYPE
  5158.       DB    CR,LF,0
  5159. ;
  5160. NOTOGLOC: LDA    TOGGLELF
  5161.       ORA    A
  5162.       JZ    NOTOGLF
  5163.       CALL    ILPRT
  5164.       DB    'TLF - Toggle send linefeed after carriage return '
  5165.        DB    'in "T" mode',CR,LF,0
  5166. ;
  5167. NOTOGLF:  LDA    TOGXOFF
  5168.       ORA    A
  5169.       JZ    NOTOGXOF
  5170.       CALL    ILPRT
  5171.       DB    'TXO - Toggle XOFF testing in terminal mode '
  5172.       DB    'file output',CR,LF,0
  5173. ;
  5174. NOTOGXOF: LDA    PMMIBYTE
  5175.       ORA    A
  5176.       JNZ    NONUM
  5177.       CALL    ILPRT
  5178.       DB    'NUM - List remote systems',CR,LF,0
  5179.       LDA    SETUPTST
  5180.       ORA    A
  5181.       JZ    NOPMMI
  5182.       CALL    ILPRT
  5183.       DB    'SET - Set communication ports',CR,LF,0
  5184. ;
  5185. NONUM:      CALL    ILPRT
  5186.       DB    'PAR - Toggle 8 bits no par/7 bits even par',CR,LF
  5187.       DB    'BYE - Disconnect, then reboot to CP/M',CR,LF
  5188.       DB    'CAL - Dial number',CR,LF
  5189.       DB    'DSC - Disconnect from the phone line',CR,LF,0
  5190. ;
  5191. NOPMMI:      CALL    ILPRT
  5192.       DB    CR,LF,'          The following are terminal text '
  5193.       DB    'buffer commands:',CR,LF,0
  5194. ;
  5195. SKIPLF:      CALL    ILPRT
  5196.     
  5197.       DB    'DEL - Delete memory buffer and file',CR,LF
  5198.       DB    'NOL - Return to terminal mode - no loss of data '
  5199.       DB    'in buffer',CR,LF
  5200.       DB    'WRT - Write memory buffer to disk file',CR,LF,LF,0
  5201.       CALL    NXTSCRN
  5202. ;
  5203.       CALL    ILPRT
  5204.       DB    '      Local Commands while in Terminal Mode'
  5205.       DB    CR,LF,LF,0
  5206.       LDA    EXITCHR
  5207.       CALL    SHFTYPE
  5208.       DB    '  - Exit to command mode',CR,LF,0
  5209. ;
  5210.       LDA     PMMIBYTE
  5211.       ORA     A
  5212.       JZ      S5A
  5213. ;
  5214.       LDA    DISCCHR
  5215.       CALL    SHFTYPE
  5216.       DB    '  - Disconnect from the phone line',CR,LF,0
  5217.       LDA    BRKCHR
  5218.       CALL    SHFTYPE
  5219.       DB    '  - Send break',CR,LF,0
  5220.       LDA    CHGBAUD
  5221.       CALL    SHFTYPE
  5222.       DB    '  - Change baud rate',CR,LF,0
  5223. ;
  5224. S5A:      LDA    TRANLOGON
  5225.       ORA    A
  5226.       JZ    NOTRNLOG
  5227.       LDA    LOGCHR
  5228.       CALL    SHFTYPE
  5229.       DB    '  - Send log-on message',CR,LF,0
  5230. ;
  5231. NOTRNLOG: LDA    LSTTST
  5232.       ORA    A
  5233.       JZ    NOLST2
  5234.       LDA    LSTCHR
  5235.       CALL    SHFTYPE
  5236.       DB    '  - Toggle printer',CR,LF,0
  5237. ;
  5238. NOLST2:   MVI    A,LF
  5239.       CALL    TYPE
  5240.       LDA    SAVECHR
  5241.       CALL    SHFTYPE
  5242.       DB    '  - Start copy into buffer',CR,LF,0
  5243.       LDA    UNSAVECHR
  5244.         CALL    SHFTYPE
  5245.       DB    '  - Stop copy into buffer',CR,LF,LF
  5246.       DB    '             Start & Stop may be toggled as often as '
  5247.        DB    'desired.',CR,LF
  5248.       DB    '             A ":" at start of line indicates buffer '
  5249.       DB    'is copying.',CR,LF
  5250.       DB    '             XOFF automatically used to stop input '
  5251.       DB    'when writing',CR,LF
  5252.       DB    '                full buffer to disk, XON sent to '
  5253.       DB    'resume.',CR,LF,LF,0
  5254.       LDA    TRANCHR
  5255.       CALL    SHFTYPE
  5256.       DB    '  - Transfer ASCII file to remote',CR,LF,LF,0
  5257.       LDA    LOCONEXTCHR
  5258.       ORA    A
  5259.       LDA    EXTCHR
  5260.       JNZ    REMDFLT
  5261.       CALL    SHFTYPE
  5262.       DB    '  - Send local control character to remote'
  5263.       DB    CR,LF,LF,0
  5264.       JMP    XPRT
  5265. ;
  5266. REMDFLT:  CALL    SHFTYPE
  5267.       DB    '  - Next character will be used for local control'
  5268.       DB    CR,LF,0
  5269. ;
  5270. XPRT:      CALL    CRLF        ;TURN UP A BLANK LINE TO LOOK NICE
  5271.       LDA    NFILFLG        ;HAVE A FILE OPEN FOR TEXT MODE COPY?
  5272.       ORA    A
  5273.       JNZ    XPRT1        ;IF NOT, EXIT
  5274.       CALL    GETSPC        ;OTHERWISE SHOW REMAINING SPACE 
  5275.       CALL    ILPRT
  5276.       DB    ' Bytes of buffer free',CR,LF,0
  5277. ;
  5278. XPRT1:      MVI    C,CURDSK    ;CURRENT DISK FUNCTION
  5279.       CALL    BDOS
  5280.       ADI    'A'        ;MAKE ASCII
  5281.       CALL    TYPE
  5282. ;
  5283.       CALL    GETUSER        ;GET CURRENT USER NUMBER
  5284.       ORA    A
  5285.       JZ    XPRT2        ;SKIP IF USER 0
  5286.       MVI    H,0
  5287.       MOV    L,A
  5288.       CALL    DECOUT        ;SHOW USER CURRENT USER AREA
  5289. ;
  5290. XPRT2:      MVI    A,'>'
  5291.       CALL    TYPE
  5292.       MVI    A,' '
  5293.       CALL    TYPE
  5294.       CALL    ILPRT
  5295.       DB    'COMMAND (H for Help): ',0
  5296. ;
  5297. GETCMD:      LXI    D,CMDBUF    ;ENTER COMMAND
  5298.       CALL    INBUF
  5299.       LDA    CMDBUF+3
  5300.       CPI    ':'        ;SEE IF REQUEST FOR NEW DRIVER/USER
  5301.       JZ    SETDRV
  5302.       LXI    D,CMDBUF+2    ;POINT TO COMMAND
  5303.       CALL    INLNCOMP
  5304.       DB    'CPM',0
  5305.       JNC    EXIT
  5306.       CALL    CRLF        ;(1ST CR,LF AT "INBUFR")
  5307.       CALL    INLNCOMP
  5308.       DB    'LOG',0
  5309.       JNC    LOGNEW
  5310.       CALL    INLNCOMP
  5311.       DB    'DIR',0
  5312.       JNC    DIR
  5313.       CALL    INLNCOMP
  5314.       DB    'ERA',0
  5315.       JNC    ERASEF
  5316.       CALL    INLNCOMP
  5317.       DB    '?',0
  5318.       JNC    CURPAR
  5319.       CALL    INLNCOMP
  5320.       DB    'SPD',0
  5321.       JNC    SETSPD
  5322.       CALL    INLNCOMP
  5323.       DB    'TIM',0
  5324.       JNC    SETTIM
  5325.       CALL    INLNCOMP
  5326.       DB    'TCC',0
  5327.       JNC    TOGCRC
  5328.       CALL    INLNCOMP
  5329.       DB    'TBR',0
  5330.       JNC    TOGBKSP
  5331.       CALL    INLNCOMP
  5332.       DB    'TLC',0
  5333.       JNC    TOGLOC
  5334.       CALL    INLNCOMP
  5335.       DB    'TLF',0
  5336.       JNC    TOGLF
  5337.       CALL    INLNCOMP
  5338.       DB    'TXO',0
  5339.       JNC    TOGTXOFF
  5340.       LDA    PMMIBYTE 
  5341.       ORA    A
  5342.       JNZ    NONUM2
  5343.       CALL    INLNCOMP
  5344.       DB    'NUM',0
  5345.       JNC    NUMPRN
  5346. ;
  5347. NONUM2:      LDA    SETUPTST
  5348.       ORA    A
  5349.       JZ    NOSETUP
  5350.       CALL    INLNCOMP
  5351.       DB    'SET',0
  5352.       JNC    SETUPENT
  5353. ;
  5354. NOSETUP: CALL    INLNCOMP
  5355.       DB    'NOL',0
  5356.       JC    NXTOPT1        ;CARRY SET = NO MATCH
  5357.       LDA    NFILFLG
  5358.       ORA    A
  5359.       JNZ    NOFILOPN    ;GO TELL OPERATOR IF NO FILE OPEN
  5360.       LDA    ORIGSAV
  5361.       STA    ORIGFLG
  5362.       CALL    BUFMSG
  5363.       LHLD    HLSAVE        ;RETURN TO TERMINAL..
  5364.       JMP    TERM        ;..MODE WITH SAVE OPTION..
  5365. ;.....                ;..IF PREVIOUSLY ENABLED.
  5366. ;
  5367. ;
  5368. NXTOPT1:  CALL    INLNCOMP
  5369.       DB    'WRT',0
  5370.       JNC    WRTFIL
  5371.       CALL    INLNCOMP
  5372.       DB    'DEL',0
  5373.       JNC    NEWFILE
  5374.       CALL    INLNCOMP
  5375.       DB    'BYE',0
  5376.       JNC    BYEBYE
  5377.       LDA    PMMIBYTE
  5378.       ORA    A
  5379.       JZ    S6
  5380. ;MOD(BGL)***
  5381.       CALL    INLNCOMP
  5382.       DB    'PAR',0
  5383.       JNC    TOGLPAR
  5384.       CALL    INLNCOMP    ;'DE' SET FROM 1ST INLNCOMP CALL
  5385.       DB    'DSC',0
  5386.       JNC    DISCON1
  5387.       CALL    INLNCOMP
  5388.       DB    'CAL',0
  5389.       JC    S6
  5390.       MVI    A,' '        ;FOOL THE SYSTEM
  5391.       STA    CMDBUF+4    ;..CMDBUF SO THAT IT..
  5392.       JMP    DOOPT        ;..LOOKS AT OPTION FOR DIAL
  5393. ;
  5394. S6:      PUSH    H
  5395.       LDA    CMDBUF+2
  5396.       LXI    H,COMPLIST
  5397.       CALL    COMPARE        ;COMPARES LIST POINTED TO BY HL..
  5398.       POP    H        ;..TO CHAR IN A-REG.
  5399.       JC    NOTVLD        ;CARRY SET = NO MATCH
  5400. ;
  5401. DOOPT:      PUSH    H        ;LOAD ORIGINAL FCB WITH TRANSFER..
  5402.       CALL    SETFCB        ;..CMDS AND GO TO BEGINNING OF..
  5403.       POP    H        ;..PROGRAM. WILL FOLLOW SAME LOGIC..
  5404.       JMP    RESTART        ;..AS IF PROGRAM WERE CALLED WITH..
  5405. ;.....                ;..CP/M COMMAND LINE.
  5406. ;
  5407. ;
  5408. NOTVLD:      CALL    NTVLDMSG
  5409.       JMP    XPRT
  5410. ;
  5411. ;
  5412. NTVLDMSG: CALL    ILPRT
  5413.       DB    '++ Invalid command ++',CR,LF,BELL,0
  5414.       RET
  5415. ;.....
  5416. ;
  5417. ;
  5418. BYEBYE:      CALL    ILPRT
  5419.       DB    '<< Goodbye...back to CP/M >>',CR,LF,0
  5420.       XRA    A
  5421.       CALL    OUT$MODCTLP
  5422.       CALL    OUT$MODCTL2
  5423.       LDA    OLDUSER        ;GET ORIGINAL USER NUMBER
  5424.       MVI    E,A
  5425.       CALL    SETUSER
  5426.       LHLD    CLDBOOT
  5427.       PCHL            ;DO A COLD REBOOT, DONE
  5428. ;.....
  5429. ;
  5430. ;
  5431. DIR:      MVI    C,CURDSK
  5432.       CALL    BDOS
  5433.       STA    DISKSAV
  5434.       CALL    DIRLIST
  5435.       LDA    DISKSAV
  5436.        MOV    E,A
  5437.       MVI    C,SELDSK
  5438.       CALL    BDOS
  5439.       JMP    XPRT
  5440. ;.....
  5441. ;
  5442. ;
  5443. DISCON1:  CALL    JMP$DISCONNT
  5444.       CALL    ILPRT
  5445.       DB    CR,LF,'<< Disconnected >>',CR,LF,BELL,0
  5446.       JMP    EXITMEN
  5447. ;.....
  5448.  
  5449. ;
  5450. ERASEF:      LXI    D,CMDBUF    ;PUT CMD LINE INTO FCB AT 'HL'
  5451.       LXI    H,FCB
  5452.       CALL    CMDLINE
  5453.       CALL    MOVEFCB        ;MOVE FCB+16 TO FCB
  5454.       LDA    FCB+1
  5455.       CPI    ' '
  5456.       JZ    NOTVLD        ;GO IF NO FILE SPECIFIED
  5457.       LXI    D,FCB
  5458.       MVI    C,SRCHF
  5459.       CALL    BDOS
  5460.       INR    A        ;0 IF FILE NOT FOUND
  5461.       JNZ    ERAFILE     ;OK, GO ERASE
  5462.       CALL    ILPRT
  5463.       DB    '++ File not found ++',CR,LF,BELL,0
  5464.       JMP    XPRT
  5465. ;.....
  5466. ;
  5467. ;
  5468. ERAFILE:  LXI    D,FCB
  5469.       MVI    C,ERASE
  5470.       CALL    BDOS
  5471.       CALL    ILPRT
  5472.       DB    'File erased',CR,LF,0
  5473.       JMP    XPRT
  5474. ;.....
  5475. ;
  5476. ;
  5477. LOGNEW:      LDA    NFILFLG
  5478.       ORA    A
  5479.       JZ    NORESET
  5480.       LDA    CMDBUF+6    ;ANY DISK DRIVE SPECIFIED?
  5481.       CPI    ' '
  5482.       JNZ    LOGNEW1        ;IF NOT A BLANK, EXIT
  5483.       CALL    GETDISK        ;IF NOT, USE CURRENT DRIVE
  5484.       ADI    'A'        ;TO COMPENSATE FOR NEXT LINE
  5485. ;
  5486. LOGNEW1:  SUI    'A'
  5487.       CPI    15+1        ;FOR DRIVES 0-15
  5488.       JNC    NOTVLD        ;IF MORE THAN 15, DISPLAY ERROR MESSAGE
  5489.       STA    DISKSAV        ;STORE REQUESTED DRIVE
  5490.       CALL    GETUSER        ;PICK UP CURRENT USER NUMBER
  5491.       MOV    B,A        ;SAVE IT
  5492.       LDA    CMDBUF+7    ;GET NEW USER NUMBER
  5493.       CALL    CHRCHK        ;CHECK THE CHAR.
  5494.       CALL    FINDUSER
  5495.       LDA    CMDBUF+8    ;GET 2ND DIGIT
  5496.       CALL    CHRCHK        ;CHECK THE CHAR.
  5497.       CALL    FINDUSER+2
  5498. ;
  5499. LOGNEW2:  CALL    SAVEUSER    
  5500.       MVI    C,RESET
  5501.       CALL    BDOS
  5502.       LDA    DISKSAV
  5503.       MOV    E,A
  5504.       MVI    C,SELDSK
  5505.       CALL    BDOS
  5506.       LDA    SAVUSR
  5507.       MOV    E,A
  5508.       CALL    SETUSER    
  5509.       JMP    XPRT
  5510. ;.....
  5511. ;
  5512. ;
  5513. CHRCHK:      CPI    ' '
  5514.       JZ    CHRCHK1
  5515.       CPI    ':'        ;IN CASE OF A: OR A1: OR A11:  (ETC.)
  5516.       RNZ
  5517. ;
  5518. CHRCHK1:  POP    PSW        ;RESET THE 'CALL' ON THE STACK
  5519.       JMP    LOGNEW2
  5520. ;.....
  5521. ;
  5522. ;
  5523. FINDUSER: MVI    B,0        ;ZERO THE 'B' REG. FOR 1ST TIME THROUGH
  5524.       CALL    NUMCHK        ;IF NEITHER, SEE IF A VALID NUMBER
  5525.       MOV    C,A        ;SAVE
  5526.       MOV    A,B        ;GET SAVE FIRST DIGIT
  5527.       ADD    A        ;X2
  5528.       ADD    A        ;X4
  5529.       ADD    A        ;X8
  5530.       ADD    B        ;X9
  5531.       ADD    B        ;X10
  5532.       ADD    C
  5533.       MOV    B,A        ;SAVE
  5534.       RET
  5535. ;.....
  5536. ;
  5537. ;
  5538. SAVEUSER: MOV    A,B
  5539.       CPI    15+1        ;USER NUMBERS ARE 0-15
  5540.       JNC    NOTVLD
  5541.       STA    SAVUSR
  5542.       RET
  5543. ;.....
  5544. ;    
  5545. ;
  5546. NUMGET:      LXI    D,CMDBUF
  5547.       CALL    INBUF
  5548.       LDA    CMDBUF+2    ;GET NUMBER
  5549.       CPI    ' '
  5550.       RZ
  5551. ;
  5552. NUMCHK:      SUI    '0'        ;REMOVE ASCII BIAS
  5553.       CPI    9+1
  5554.       RC            ;OK IF 9 OR LESS
  5555.       POP    H        ;REMOVE 1ST CALL FROM THE STACK
  5556.       POP    H        ;REMOVE 2ND CALL FROM THE STACK    
  5557.       JMP    NOTVLD
  5558. ;
  5559. GETUSER:  MVI    E,0FFH        ;GET CURRENT USER
  5560. ;
  5561. SETUSER:  MVI    C,USER        ;SET UP BDOS CALL
  5562.       JMP    BDOS
  5563. ;.....
  5564. ;
  5565. ;
  5566. GETDISK:  MVI    C,CURDSK    ;GET CURRENT DRIVE
  5567.       JMP    BDOS
  5568. ;.....
  5569. ;
  5570. ;
  5571. NORESET:  CALL    ILPRT
  5572.       DB    '++      Terminal mode file open      ++',CR,LF
  5573.       DB    '++ Use WRT or DEL before LOG command ++',CR,LF
  5574.       DB    CR,LF,BELL,0
  5575.       XRA    A
  5576.       JMP    XPRT
  5577. ;.....
  5578. ;
  5579. ;
  5580. SETSPD:      CALL    ILPRT
  5581.       DB    'Delay between chars. (0-9): ',0
  5582. ;
  5583. NOKEYS:      CALL    STAT
  5584.       JZ    NOKEYS
  5585.       CALL    KEYIN
  5586.       CALL    TYPE
  5587.       CALL    SAVEA
  5588.       SUI    '0'
  5589.       CPI    10
  5590.       JNC    NOTVLD
  5591.       STA    BYTDLY
  5592. ;
  5593.       CALL    ILPRT
  5594.       DB    'Delay at end of line (0-9): ',0
  5595. ;
  5596. NOKEYS1:  CALL    STAT
  5597.       JZ    NOKEYS1
  5598.       CALL    KEYIN
  5599.       CALL    TYPE
  5600.       CALL    SAVEA
  5601.       SUI    '0'
  5602.       CPI    10
  5603.       JNC    NOTVLD
  5604.       STA    CRDLY
  5605. ;
  5606. SPDMSG:      CALL    ILPRT
  5607.       DB    CR,LF,'Char. delay (terminal file mode) is:  ',0
  5608.       LDA    BYTDLY
  5609.       MOV    B,A
  5610.       MOV    A,B
  5611.       PUSH    H
  5612.       MOV    L,A
  5613.       MVI    H,0
  5614.       CALL    DECOUT
  5615.       POP    H
  5616.       CALL    ILPRT
  5617.       DB    '0 ms. per character',CR,LF
  5618.       DB    'Line  delay (terminal file mode) is: ',0
  5619.       LDA    CRDLY
  5620.       MOV    B,A
  5621.       PUSH    H
  5622.       MOV    L,A
  5623.       MVI    H,0
  5624.       CALL    DECOUT
  5625.       POP    H
  5626.       CALL    ILPRT
  5627.       DB    '00 ms. per character',CR,LF,0
  5628.       JMP    XPRT
  5629. ;......
  5630. ;
  5631. ;
  5632. SAVEA:      PUSH    PSW
  5633.       CALL    ILPRT
  5634.       DB    CR,LF,0
  5635.       POP    PSW
  5636.       RET
  5637. ;.....
  5638. ;
  5639. ;
  5640. SETDRV:      LDA    CMDBUF+2    ;GET THE DISK DRIVE
  5641.       SUI    'A'        ;CONVERT TO BINARY VALUE
  5642.       CPI    15+1        ;FOR DRIVES 0-15
  5643.       JNC    NOTVLD
  5644.       MOV    E,A
  5645.       MVI    C,SELDSK    ;SELECT REQUESTED DRIVE
  5646.       CALL    BDOS
  5647.       LDA    CMDBUF+5    ;GET USER NUMBER, IF ANY
  5648.       CPI    ' '        ;KEEP CURRENT USER AREA?
  5649.       JZ    XPRT
  5650.       SUI    '0'        ;CONVERT TO BINARY VALUE
  5651.       CPI    1        ;IF A '1', COULD BE UNITS OR TENS
  5652.       JNZ    SETDRV1        ;IF NOT, NUMBERS STOP AT 15 SO EXIT
  5653.       LDA    CMDBUF+6    ;CHECK FOR A 2ND DIGIT
  5654.       CPI    '0'
  5655.       JC    SETDRV2        ;IF LESS, NOT A VALID NUMBER, IGNORE
  5656.       SUI    '0'-10        ;LEAVE THE '10' IN AS TWO DIGITS USED
  5657. ;
  5658. SETDRV1:  CPI    15+1        ;USER AREAS ARE 0-15
  5659.       JNC    NOTVLD
  5660.       MOV    E,A
  5661.       CALL    SETUSER
  5662.       JMP    XPRT        ;BACK TO WORK
  5663. ;
  5664. SETDRV2:  MVI    A,1
  5665.       JMP    SETDRV1
  5666. ;.....
  5667. ;
  5668. ;
  5669. SETTIM:   CALL    SORPTST
  5670.       JNZ    NOTVLD
  5671.       CALL    ILPRT
  5672.       DB    'Use 0-8 to give baud rate for ''S'' mode '
  5673.       DB    'time-to-send message,',CR,LF
  5674.       DB    'where 0=110, 1=300, 2=450, 3=600, 4=710, 5=1200, '
  5675.       DB    '6=2400, ',CR,LF,'7=4800 AND 8=9600 Baud.'
  5676.       DB    CR,LF,LF,'Enter value: ',0
  5677.       CALL    NUMGET
  5678.       CPI    8+1        ;ONLY LOOKING FOR 1-8 ANSWERS
  5679.       JNC    NOTVLD
  5680.       STA    MSPEED
  5681.       CALL    SETTIM2
  5682.       JMP    XPRT
  5683. ;.....
  5684. ;
  5685. ;
  5686. SETTIM2:  CALL    SORPTST
  5687.       JNZ    SETTIM3
  5688.       CALL    ILPRT
  5689.       DB    'Rate for the S mode time-to-send message is set to ',0
  5690.       JMP    SETTIM4
  5691. ;...
  5692. ;
  5693. ;
  5694. SETTIM3:  CALL    ILPRT
  5695.       DB    'Modem speed is ',0
  5696. ;
  5697. SETTIM4:  JMP    PRTBAUD
  5698. ;.....
  5699. ;
  5700. ;
  5701. SORPTST:  LDA    SETUPTST
  5702.       MOV    B,A
  5703.       LDA    PMMIBYTE
  5704.       ORA    B
  5705.       RET
  5706. ;.....
  5707. ;
  5708. ;
  5709. TOGCRC:      LDA    TOGGLECRC
  5710.       ORA    A
  5711.       JZ    NOTVLD
  5712.       LDA    CKSUMDFLT
  5713.       CMA
  5714.       STA    CKSUMDFLT
  5715.       CALL    TOGCRC1
  5716.       JMP    XPRT
  5717. ;.....
  5718. ;
  5719. ;
  5720. TOGCRC1:  ORA    A
  5721.       JNZ    CHEKMSG
  5722.       CALL    ILPRT
  5723.       DB    'CRC mode set',CR,LF,0
  5724.       RET
  5725. ;.....
  5726. ;
  5727. ;
  5728. CHEKMSG:  CALL    ILPRT
  5729.       DB    'CHECKSUM mode set',CR,LF,0
  5730.       RET
  5731. ;.....
  5732. ;
  5733. ;
  5734. TOGBKSP:  LDA    TOGGLEBK
  5735.       ORA    A
  5736.       JZ    NOTVLD
  5737.       LDA    CONVBKSP
  5738.       CMA
  5739.       STA    CONVBKSP
  5740.       CALL    TOGBKSP2
  5741.       JMP    XPRT
  5742. ;.....
  5743. ;
  5744. ;
  5745. TOGBKSP2: LDA    CONVBKSP
  5746.       ORA    A
  5747.       JZ    NORUBMSG
  5748.       CALL    ILPRT
  5749.       DB    'Backspace is rub',CR,LF,0
  5750.       RET
  5751. ;.....
  5752. ;
  5753. ;
  5754. NORUBMSG: CALL    ILPRT
  5755.       DB    'Backspace is backspace',CR,LF,0
  5756.       RET
  5757. ;.....
  5758. ;
  5759. ;
  5760. TOGLOC:      LDA    TOGGLELOC
  5761.       ORA    A
  5762.       JZ    NOTVLD
  5763.       LDA    LOCONEXTCHR
  5764.       CMA
  5765.       STA    LOCONEXTCHR
  5766.       CALL    TOGLOC2
  5767.       JMP    XPRT
  5768. ;.....
  5769. ;
  5770. ;
  5771. TOGLOC2:  CALL    ILPRT
  5772.       DB    'Use ',0
  5773.       LDA    LOCONEXTCHR
  5774.       ORA    A
  5775.       LDA    EXTCHR
  5776.       JZ    LOCMSG
  5777.       CALL    SHFTYPE
  5778.       DB    ' before local command',CR,LF,0
  5779.       RET
  5780. ;.....
  5781. ;
  5782. ;
  5783. LOCMSG:   CALL    SHFTYPE
  5784.       DB    ' to send local command to remote',CR,LF,0
  5785.       RET
  5786. ;.....
  5787. ;
  5788. ;
  5789. TOGLF:      LDA    TOGGLELF
  5790.       ORA    A
  5791.       JZ    NOTVLD
  5792.       LDA    ADDLF
  5793.       CMA
  5794.       STA    ADDLF
  5795.       CALL    TOGLF2
  5796.       JMP    XPRT
  5797. ;.....
  5798. ;
  5799. ;
  5800. TOGLF2:      CALL    ILPRT
  5801.       DB    'Linefeed ',0
  5802.       LDA    ADDLF
  5803.       ORA    A
  5804.       JNZ    LFMSG
  5805.       CALL    ILPRT
  5806.       DB    'NOT ',0
  5807. ;
  5808. LFMSG:      CALL    ILPRT
  5809.       DB    'sent after <CR>',CR,LF,0
  5810.       RET
  5811. ;.....
  5812. ;
  5813. ;
  5814. TOGTXOFF: LDA    TOGXOFF
  5815.       ORA    A
  5816.       JZ    NOTVLD
  5817.       CALL    ILPRT
  5818.       DB    'Use XOFF testing? (Y/N): ',0
  5819.       CALL    GETANS
  5820.       JC    NOCHG3
  5821.       STA    XOFFTST
  5822. ;
  5823. NOCHG3:      CALL    XOFFMSG
  5824.       CALL    ILPRT
  5825.       DB    CR,LF,'Use XON waiting after <CR> (Y/N): ',0
  5826.       CALL    GETANS
  5827.       JC    NOCHG4
  5828.       STA    XONWAIT
  5829. ;
  5830. NOCHG4:      CALL    XONMSG
  5831.       LDA    XONWAIT
  5832.       ORA    A
  5833.       JZ    XPRT
  5834.       CMA
  5835.       STA    XOFFTST        ;DON'T ALLOW BOTH
  5836.       CALL    ILPRT
  5837.       DB    'Therefore ',0
  5838.       CALL    XOFFMSG
  5839.       JMP    XPRT
  5840. ;.....
  5841. ;
  5842. ;
  5843. GETANS:   LXI    D,CMDBUF
  5844.       CALL    INBUF
  5845.       LDA    CMDBUF+2     ;GET ANSWER
  5846.       CPI    ' '
  5847.       CMC
  5848.       RZ
  5849.       MOV    B,A
  5850.       CPI    'N'
  5851.       MVI    A,FALSE
  5852.       RZ
  5853.       MOV    A,B
  5854.       CPI    'Y'
  5855.       MVI    A,TRUE
  5856.       RZ
  5857.       POP    PSW        ;PRESERVE STACK
  5858.       JMP    NOTVLD
  5859. ;.....
  5860. ;
  5861. ;
  5862. XOFFMSG:  CALL    ILPRT
  5863.       DB    'XOFF testing ',0
  5864.       LDA    XOFFTST
  5865.       ORA    A
  5866.       JNZ    XOTSTON
  5867.       CALL    ILPRT
  5868.       DB    'NOT ',0
  5869. ;
  5870. XOTSTON:  CALL    ILPRT
  5871.       DB    'used',0
  5872. ;
  5873. XONMSG3:  CALL    ILPRT
  5874.       DB    ' in terminal mode file output',CR,LF,0
  5875.       RET
  5876. ;.....
  5877. ;
  5878. ;
  5879. XONMSG:      CALL    ILPRT
  5880.       DB    'XON ',0
  5881.       LDA    XONWAIT
  5882.       ORA    A
  5883.       JNZ    XONMSG2
  5884.       CALL    ILPRT
  5885.       DB    'NOT ',0
  5886. ;
  5887. XONMSG2:  CALL    ILPRT
  5888.       DB    'automatically tested after <CR>',0
  5889.       JMP    XONMSG3
  5890. ;...
  5891. ;
  5892. ;
  5893. SETUPENT: LDA    SETUPTST
  5894.       ORA    A
  5895.       JZ    NOTVLD
  5896.       LXI    D,CMDBUF+1
  5897.       CALL    JMP$SETUPR
  5898.       JMP    XPRT
  5899. ;.....
  5900. ;
  5901. ;
  5902. NEWFILE:  LDA    NFILFLG
  5903.       ORA    A
  5904.       JNZ    NOFILOPN    
  5905.       LDA    FCB3+1        ;CHECK THAT FILE WAS REQUESTED
  5906.       CPI    ' '
  5907.       JZ    NOFILOPN    ;IF NO FILE, DON'T ERASE
  5908.       LXI    D,FCB3
  5909.       MVI    C,ERASE
  5910.       CALL    BDOSRT
  5911.       MVI    A,TRUE        ;DO NOT ALLOW TERMINAL..
  5912.       STA    NFILFLG        ;..SAVE SINCE NO FILE..
  5913.       CMA            ;..SPECIFIED.
  5914.       STA    SAVEFLG
  5915.       LXI    H,FCB3
  5916.       CALL    INITFCB
  5917.       LXI    H,BOTTRAM
  5918.       SHLD    HLSAVE
  5919.       JMP    XPRT
  5920. ;.....
  5921. ;
  5922. ;
  5923. WRTFIL:
  5924.       LDA    NFILFLG
  5925.       CPI    TRUE
  5926.       JZ    NOFILOPN
  5927.       LDA    FCB3+1        ;CHECK THAT FILE WAS REQUESTED
  5928.       CPI    ' '
  5929.       JZ    NOFILOPN
  5930.       LHLD    HLSAVE        ;START OF MEMORY BUFFER
  5931.       CALL    NUMRECS        ;DISK WRITE ROUTINE AS USED IN
  5932.       CALL    WRTDSK        ;   THE 'INTDSKSV' ROUTINE
  5933.       CALL    CLOSE3
  5934.       MVI    A,TRUE
  5935.       STA    NFILFLG        ;SHOW NO FILE OPEN NOW
  5936.       CMA
  5937.       STA    SAVEFLG
  5938.       LXI    H,FCB3
  5939.       CALL    INITFCB        ;BLANK OUT FCB TO WRITTEN FILE
  5940.       LXI    H,BOTTRAM    ;   CAN'T BE ERASED
  5941.       SHLD    HLSAVE        ;RESET TO BUFFER START FOR NEXT TIME
  5942.       JMP    XPRT
  5943. ;.....
  5944. ;
  5945. ;
  5946. NOFILOPN: CALL    ILPRT
  5947.       DB    '++ No File Open ++',CR,LF,BELL,0
  5948.       JMP    XPRT
  5949. ;.....
  5950. ;
  5951. ;
  5952. ;THIS ROUTINE DISPLAYS THE PHONE NUMBERS IN THE LIBRARY
  5953. ;
  5954. NUMPRN:      PUSH    H
  5955.       CALL    CLRTST
  5956.       CALL    ILPRT
  5957.       DB    '           Library of Phone Numbers of Remote Systems'
  5958.       DB    0
  5959.       MVI    C,13        ;NUMBER OF LINES TO MOVE
  5960.       LXI    H,NUMBLIB    ;ADDRESS OF SOURCE MEMORY
  5961.       LXI    D,DBUF        ;ADDRESS OF TARGET MEMORY
  5962.       CALL    NEWLINE        ;START WITH CRLF
  5963.       STAX    D        ;+LF
  5964.       INX    D        ;AND BUMP IT
  5965. ;
  5966. NUMPRN1:  INX    H        ;SKIP PMMI DIALING LETTER
  5967.       INX    H        ;AND EQUAL SIGN
  5968.       MVI    B,LIBLEN-2    ;NUMBER OF BYTES TO MOVE
  5969.       CALL    MOVE        ;MOVE TO BUFFER
  5970.       CALL    SPACES        ;2 ENTRIES + 3 SPACES = 63 CHARACTERS
  5971.       INX    H
  5972.       INX    H
  5973.       MVI    B,LIBLEN-2
  5974.       CALL    MOVE
  5975.       CALL    NEWLINE
  5976.       DCR    C        ;NUMBER OF LINES TO PRINT
  5977.       JZ    NUMPRN2
  5978.       JMP    NUMPRN1
  5979. ;.....
  5980. ;
  5981. ;
  5982. NEWLINE:  MVI    A,CR        ;PUTS CR-LF AT MEMORY POINTED BY 'DE'
  5983.       STAX    D        ;STORE IT
  5984.       MVI    A,LF        ;LF
  5985.       INX    D        ;BUMP POINTER
  5986.       STAX    D        ;STORE LF
  5987.       INX    D        ;BUMP POINTER
  5988.       RET
  5989. ;.....
  5990. ;
  5991. ;
  5992. SPACES:      MVI    A,' '        ;SPACE
  5993.       STAX    D
  5994.       INX    D        ;1
  5995.       STAX    D
  5996.       INX    D        ;2
  5997.       STAX    D
  5998.       INX    D        ;3
  5999.       RET
  6000. ;.....
  6001. ;
  6002. ;
  6003. NUMPRN2:  MVI    A,'$'
  6004.       STAX    D
  6005.       MVI    C,PRINT
  6006.       LXI    D,DBUF        ;POINT TO TABLE OF NUMBERS TO PRINT
  6007.       CALL    BDOS
  6008.       CALL    CRLF
  6009.       CALL    CRLF
  6010.       POP    H
  6011.       JMP    XPRT
  6012. ;......
  6013. ;
  6014. ;
  6015. COMPARE:  MOV    B,M        ;COMPARES A-REG WITH LIST..
  6016. ;
  6017. COMPLP:      INX    H        ;..ADDRESSED BY HL. FIRST ELEMENT..
  6018.       CMP    M        ;..OF LIST MUST BE NUMBER OF ELEMENTS..
  6019.       JZ    VALID        ;..BEING COMPARED. RETURNS WITH..
  6020.       DCR    B        ;..CARRY SET IF A-REG DOES NOT..
  6021.       JNZ    COMPLP        ;.. CONTAIN AN ELEMENT IN LIST.
  6022.       STC
  6023. ;
  6024. VALID:      RET
  6025. ;.....
  6026. ;
  6027. ;
  6028. NXTSCRN:  CALL  ILPRT
  6029.       DB    'HIT any KEY to CONTINUE',0
  6030. ;
  6031. NOKEY1:      CALL    STAT        ;GET KEYBOARD STATUS
  6032.       JZ    NOKEY1        ;KEEP LOOPING UNTIL KEYPRESS
  6033.       CALL    KEYIN        ;GOBBLE UP KEYPRESS
  6034.       CPI    'C'-40H        ;CONTROL-C TO ABORT?
  6035.       JNZ    CLRTST
  6036.       POP    H        ;CLEAR STACK OF RETURN ADDRESS
  6037.       CALL    CRLF        ;TURN UP A BLANK LINE
  6038.       JMP    XPRT
  6039. ;.....
  6040. ;
  6041. ;
  6042. CLRTST:      LDA    SCRNTEST
  6043.       ORA    A
  6044.       JNZ    CLRSCRN
  6045. ;.....
  6046. ;
  6047. ;
  6048. LOTSALF:  MVI    A,CR
  6049.       CALL    TYPE
  6050.       MVI    B,12
  6051.       MVI    A,LF
  6052. ;
  6053. LFLOOP:      CALL    TYPE
  6054.       DCR    B
  6055.       JNZ    LFLOOP
  6056.       RET
  6057. ;.....
  6058. ;
  6059. ;
  6060. CURPAR:      CALL    CLRTST
  6061.       CALL    ILPRT
  6062.       DB    '                Current Settings',CR,LF,LF,0
  6063.       LDA    CKSUMDFLT    ;SEE IF SET FOR 'CRC' OR 'CHECKSUM'
  6064.       CALL    TOGCRC1
  6065.       LDA    LSTTST
  6066.       ORA    A
  6067.       JZ    NOLST3
  6068.       CALL    LSTMSG
  6069. ;
  6070. NOLST3:      CALL    SETTIM2
  6071.       CALL    TOGBKSP2
  6072.       CALL    TOGLF2
  6073.       CALL    TOGLOC2
  6074.       CALL    ILPRT
  6075.       DB    'Terminal mode file buffer is ',0
  6076.       LDA    NFILFLG
  6077.       ORA    A
  6078.       JZ    ACTIVE
  6079.       CALL    ILPRT
  6080.       DB    'in',0
  6081. ;
  6082. ACTIVE:      CALL    ILPRT
  6083.       DB    'active',CR,LF,'Unused portion of buffer is ',0
  6084.       CALL    GETSPC
  6085.       CALL    ILPRT
  6086.       DB    ' bytes',CR,LF,0
  6087.       CALL    XOFFMSG
  6088.       CALL    XONMSG
  6089.       CALL    SPDMSG
  6090.       CALL    CRLF
  6091.       CALL    CRLF
  6092.       CALL    CRLF
  6093.       JMP    XPRT
  6094. ;.....
  6095. ;
  6096. ;
  6097. GETSPC:      CALL    GETMAX
  6098.       MOV    B,A
  6099.       LHLD    HLSAVE
  6100.       STC
  6101.       CMC
  6102.       MVI    A,0
  6103.       SBB    L
  6104.       MOV    L,A
  6105.       MOV    A,B
  6106.       SBB    H
  6107.       MOV    H,A
  6108.       CALL    DECOUT
  6109.       RET
  6110. ;.....
  6111. ;
  6112. ;
  6113. COMPLIST: DB     6, 'S', 'R', 'T', 'E', 'H', 'L'
  6114. ;.....
  6115. ;
  6116. ;
  6117. ;***********************************************************************
  6118. ;
  6119. ;       D - A - T - A    A - R - E - A
  6120. ;
  6121. ;***********************************************************************
  6122. ;
  6123. ;
  6124. ; OPTION TABLE
  6125. ;
  6126. OPTBL:      EQU    $
  6127. ANSWFLG:  DB    'A'
  6128. BATCHFLG: DB    'B'    ;SET TO 'B' BY MENU. DOES NOT ALLOW MULTI-FILE
  6129. DISCFLG:  DB    'D'
  6130. LOCCHFLG: DB    'L'
  6131. ORIGFLG:  DB    'O'
  6132. QFLG:      DB    'Q'
  6133. RSEEFLG:  DB    'R'
  6134. SSEEFLG:  DB    'S'
  6135. TERMFLG:  DB    'T'
  6136. VSEEFLG:  DB    'V'
  6137. XITFLG:      DB    'X'        
  6138. EPARITY:  DB    '0'    ;EVEN PARITY SUB-OPTION (ONLY IN S OR R MODE)
  6139. OPARITY:  DB    '1'    ;ODD PARITY SUB-OPTION  (ONLY IN S OR R MODE)
  6140. OPTBE:      EQU    $    ;..TRANSFER WHEN PROGRAM INITIALLY CALLED.
  6141. ;
  6142. ;
  6143. ; The following must be in the same order as the table above:
  6144. ;
  6145. RESTROPT: DB    'A','B','D','L','O','Q','R','S','T','V','X','0','1'
  6146. ;
  6147. ;
  6148. ; THE NEXT 13 BYTES EQUAL THE NUMBER OF BYTES BETWEEN RECDNOB AND
  6149. ; RECDNOE
  6150. ;
  6151. RESTSN:   DB    0,0,0,0,0,0
  6152.       DW    DBUF
  6153.       DB    0,0,0,0,0
  6154. ;
  6155. RECDNOB   EQU    $    ;START OF TABLE MARKER
  6156. RCVRNO:   DB    0    ;\
  6157. RECDNO:   DB    0,0    ; \
  6158. ERRCT:    DB    0    ;  \
  6159. ERRCDE:   DB    0    ;   \
  6160. EOFLG:    DB    0    ;    \    13 BYTES BETWEEN TABLE MARKERS
  6161. RECPTR:   DW    DBUF    ;    /
  6162. RECINBF:  DB    0    ;   /
  6163. MAXEXT:   DB    0    ;  /
  6164. RCNT:     DB    0,0     ; /
  6165. DATAFLG:  DB    0    ;/
  6166. RECDNOE   EQU    $    ;END OF TABLE MARKER
  6167. ;
  6168. CRCVAL:      DW    0
  6169. DIALCT:      DW    0
  6170. HLSAVE:      DW    BOTTRAM
  6171. HLSAVE1:  DW    BOTTRAM
  6172. HLSAVE2:  DW    BOTTRAM    
  6173. ;
  6174. ABORTFLG: DB    0
  6175. CRCFLAG:  DB    TRUE
  6176. CRFLAG:      DB    0    ;CONTINUOUS REDIAL FLAG    
  6177. DLYFLG:      DB    0
  6178. ECHOFLG:  DB    FALSE
  6179. EXACFLG:  DB    0
  6180. EXITFLG:  DB    TRUE
  6181. FIRSTME:  DB    TRUE    ;FIRST SOH RECEIVED SET FLAG TO ZERO
  6182. FSTFLG:      DB    TRUE
  6183. LASTBYT1: DB    0
  6184. LASTBYT2: DB    0
  6185. LISTFLG:  DB    FALSE
  6186. LISTMOR:  DB    FALSE    
  6187. LOCFLG:      DB    FALSE
  6188. MFFLG1:      DB    0    ;1ST TIME SWITCH
  6189. MODCTLB:  DB    07FH
  6190. NFILFLG:  DB    FALSE    ;ALLOWS WRITE TO MEMORY IN TERMINAL MODE
  6191. NSEEFLG:  DB    TRUE    ;FALSE TO SEE FILE NAME IN QUIET MODE
  6192. ONERR:    DB    0
  6193. OPTION:      DB    0
  6194. RINGBKFL: DB    0
  6195. SAVEFLG:  DB    FALSE
  6196. UARTCTLB: DB    ORIGMOD    ;FOR ORIGINATE MODE
  6197. UARTFLG:  DB    FALSE    ;FOR ORIGINATE MODE
  6198. CMDBUF:      DB    80H,0    ;COMMAND BUFFER, TWO PAGES PLUS ONE BYTE
  6199. ;
  6200.       DS    80H
  6201. BGNMS:      DS    2
  6202. DISKNO:      DS    1
  6203. DISKSAV:  DS    1
  6204. FILECT:      DS    1
  6205. FTYCNT:      DS    1
  6206. NAMECT:      DS    1
  6207. NBSAVE:      DS    2
  6208. OLDUSER:  DS    1
  6209. ORIGSAV:  DS    1
  6210. SENDFLG:  DS    1
  6211. SAVUSR:      DS    1
  6212.           DS    100    ;STACK DEPTH
  6213. STACK:      DS    0
  6214. ;
  6215. FCB3:      DS    33
  6216. FCB4:      DS    33
  6217. FCBBUF:      DS    15
  6218. MFNAME5:  DS    12    ;REQUESTED NAME
  6219. MFNAME6:  DS    12    ;CURRENT NAME
  6220. DBUF      EQU    $    
  6221. NAMEBUF      EQU    DBUF+(DBUFSIZ*1024)    ;BUFFER FOR NAMES IN BATCH MODE.
  6222. ;.....
  6223. ;
  6224. ;
  6225. ; BDOS EQUATES
  6226. ;
  6227. RDCON:      EQU    1
  6228. WRCON:      EQU    2
  6229. LSTOUT:      EQU    5
  6230. PRINT:      EQU    9
  6231. RDBUF:      EQU    10
  6232. CONST:      EQU    11
  6233. CPMVER:      EQU    12
  6234. RESET:      EQU    13
  6235. SELDSK:      EQU    14
  6236. OPEN:      EQU    15
  6237. CLOSE:      EQU    16
  6238. SRCHF:      EQU    17
  6239. SRCHN:      EQU    18
  6240. ERASE:      EQU    19
  6241. READ:      EQU    20
  6242. WRITE:      EQU    21
  6243. MAKE:      EQU    22
  6244. REN:      EQU    23
  6245. CURDSK:      EQU    25
  6246. SETDMA:      EQU    26
  6247. DSKALL:      EQU    27
  6248. DSKPAR:      EQU    31
  6249. USER:      EQU    32
  6250. FILSIZ:      EQU    35
  6251. BDOS:      EQU    0005H
  6252. REIPL:      EQU    0
  6253. FCB:      EQU    5CH
  6254. FCBEXT:      EQU    FCB+12
  6255. FCBSNO:      EQU    FCB+32
  6256. FCBRNO:      EQU    FCB+32
  6257. FCB2:      EQU    6CH
  6258. ;
  6259. LAST      END    100H
  6260.