home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / CPM86 / MDM9IBM1.A86 < prev    next >
Text File  |  2000-06-30  |  116KB  |  6,020 lines

  1. ;    MODEM901, a 16-bit "MODEM" program for CP/M-86
  2. ;
  3. ;    by:    Michael J. Mellinger,
  4. ;        Data Research Associates, Inc.,
  5. ;        9270 Olive Boulevard,
  6. ;        St. Louis,
  7. ;        Missouri, 63132,
  8. ;        U.S.A.
  9. ;
  10. ;    Many, many fixes to Mike's original translation and
  11. ;    further translation by:
  12. ;
  13. ;        Bill Bolton,
  14. ;        Software Tools RCPM,
  15. ;        P.O. Box 80,
  16. ;        Newport Beach,
  17. ;        NSW, 2106,
  18. ;        Australia
  19. ;
  20. ;*****************************************************************************
  21. ;    Converted for IBM PC-XT. Most changes and fixes marked
  22. ;       with "@DH".
  23. ;
  24. ;       by:    Dick Hill
  25. ;        (AMS) Advanced Micro Systems
  26. ;        2304 McCord Road
  27. ;        Valparaiso, IN 46383
  28. ;
  29. ;*****************************************************************************
  30. ;
  31. ;VERSION LIST, most recent version first
  32. ;
  33. ;30/DEC/84 Added option to change baud rate from terminal mode.
  34. ;       Word length, parity, stop bits not affected.
  35. ;       MODEM 9.01.IBM-1.1 Dick Hill 
  36. ;   
  37. ;24/Dec/84 Converted for IBMPC. Changed version to MODEM 9.01.IBM-1.0.
  38. ;       Many changes and fixes. Hopefully all marked with "@DH".
  39. ;
  40. ;***KNOWN PROBLEMS:***    When the IBM and a CP/M 80 system running a
  41. ;       Z80 B at 6 mhz are hooked up back to back the IBM can not keep
  42. ;       up at baud rates faster than 1200 baud when receiving a file.
  43. ;       No problem at any baud rate when the IBM is sending and the Z80 B
  44. ;       is receiving. Everything else seems to work.
  45. ;
  46. ;       HOW TO:    ASM86 MODM9IBM $PZ
  47. ;              GENCMD MODM9IBM 8080
  48. ;
  49. ;25/Nov/83 Fixed batch bugs, changed to proper speed calculations,
  50. ;       fixed printer support, fixed batch file name problems.
  51. ;
  52. ;24/Sep/83 Fixed many bugs, properly implemented command line
  53. ;       processor, added new USART implementations for SYS
  54. ;       module. Tidied up documentation and added version
  55. ;       lists etc. Basically made it work right!
  56. ;       Version 9.01.04. Bill Bolton
  57. ;
  58. ;08/Jul/83 Original quick translation from CP/M-80 code.
  59. ;       Version 9.01.02. Michael Mellinger
  60. ;
  61. ;    See the file MODEM-86.DOC for further details, otherwise
  62. ;    the existing CP/M-80 MODEM901 documentation applies.
  63. ;
  64. ;    Clearing house for comments, changes, suggestions:
  65. ;    (No guarantee of response and no liability assumed)
  66. ;
  67. ;U.S.A.        Thousand Oaks Technical RCP/M
  68. ;        805-492-5472
  69. ;
  70. ;AUSTRALIA    Software Tools RCPM
  71. ;        (02) 997-1836 (CCITT V21 standard,
  72. ;                   Bell 103 won't work!)    
  73. ;
  74. ;            MODEM9
  75. ;
  76. ;BASED ON THE CP/M-80 MODEM PROGRAM CREATED BY WARD CHRISTENSEN
  77. ;
  78. ;         ********* N O T I C E S *********
  79. ;
  80. ;    Revisers releasing new versions should only
  81. ;    change the version number by the digits in
  82. ;    the last 2 places, i.e. 9.01.??
  83. ;
  84. ;    This program is in the public domain, please
  85. ;    respect the massive effort of the CP/M-86
  86. ;    "translators" by leaving their names intact
  87. ;    in the signon message.
  88. ;
  89. ;    At the same time we wish to give full credit to
  90. ;    the many individuals who created the CP/M-80
  91. ;    version of MODEM901, and wish to thank them for
  92. ;    their efforts (and especially Ward for starting
  93. ;    it all!).
  94. ;
  95. ;         **********************************
  96. ;
  97. ;This is just a header file to give the HEX output the right name.
  98. ;
  99. ;
  100. ;    INCLUDE DEFF.A86
  101. ;    INCLUDE START.A86
  102. ;    INCLUDE SYS.A86        ;Rename your XXXXSYS.A86 to this
  103. ;    INCLUDE MAIN.A86
  104. ;    INCLUDE CONSOLE.A86
  105. ;    INCLUDE    TERM.A86
  106. ;    INCLUDE    SENDRECV.A86
  107. ;    INCLUDE    FILES.A86
  108. ;    INCLUDE    FINISH.A86
  109. ;
  110. ;        DEFF.A86
  111. ;
  112. ;Deffinitions for use in assembling MODEM9.xx.
  113. ;
  114. TRUE    EQU    0FFH
  115. FALSE    EQU    0
  116. ;
  117. CPM2X    EQU    TRUE    ;TRUE IF CP/M 2.X
  118. DBUFSIZ    EQU    16    ;BUFFER SIZE FOR FILE TRANSFER IN KBYTES
  119. CAPTURE    EQU    16    ;Buffer size for text capture
  120. ;
  121. ERRCRC    EQU    6    ;NUMBER OF TIMES TO TRY CRC MODE BEFORE
  122.             ;SWITCHING TO CHECKSUM
  123. ERRLIM    EQU    10    ;NUMBER OF TIMES TO RETRY
  124.             ;SEND/RECEIVE ERRORS BEFORE QUIT
  125. ;
  126. CRC       EQU   'C'         ;USED TO REQUEST 'CRC' INSTEAD OF 'CKSUM'
  127. ESC      EQU    '['-40H     ; ^[ = ESCAPE
  128. SOH       EQU   'A'-40H     ; ^A = START OF HEADER
  129. EOT       EQU   'D'-40H     ; ^D = END OF TEXT
  130. ACK       EQU   'F'-40H     ; ^F = ACKNOWLEDGE
  131. OKNMCH    EQU   'F'-40H     ; ^F = OKAY NAME MATCH
  132. BELL      EQU   'G'-40H     ; ^G = BELL CHARACTER
  133. BKSP      EQU    'H'-40H     ; ^H = BACKSPACE
  134. TAB      EQU    'I'-40H        ; ^I = TAB
  135. LF        EQU   'J'-40H     ; ^J = LINEFEED
  136. CR        EQU   'M'-40H     ; ^M = CARRIAGE RETURN
  137. XON       EQU   'Q'-40H     ; ^Q = XON CHARACTER
  138. XOFF      EQU   'S'-40H     ; ^S = XOFF CHARACTER
  139. NAK       EQU   'U'-40H     ; ^U = NOT ACKNOWLEDGE
  140. CAN       EQU   'X'-40H     ; ^X = CANCEL SEND/RECEIVE
  141. EOFCHAR   EQU   'Z'-40H     ; ^Z = END OF FILE
  142. SPACE      EQU    ' '        ; SPACE
  143. BDNMCH    EQU   75H         ; BAD NAME MATCH
  144. RUB      EQU    7FH        ; RUB
  145. ;
  146. ;BDOS EQUATES
  147. ;
  148. RDCON    EQU    1
  149. WRCON    EQU    2
  150. LSTOUT    EQU    5
  151. DCONIO    EQU    6
  152. PRINT    EQU    9
  153. RDBUF    EQU    10
  154. CONST    EQU    11
  155. RESET    EQU    13
  156. SELDSK    EQU    14
  157. OPEN    EQU    15
  158. CLOSE    EQU    16
  159. SRCHF    EQU    17
  160. SRCHN    EQU    18
  161. ERASE    EQU    19
  162. READ    EQU    20
  163. WRITE    EQU    21
  164. MAKE    EQU    22
  165. REN    EQU    23
  166. CURDSK    EQU    25
  167. STDMA    EQU    26
  168. GETALC    EQU    27        ;CP/M ALLOCATION VECTOR ADDRESS
  169. GETPARM    EQU    31        ;CURRENT DISK PARAMETERS ADDRESS
  170. USER    EQU    32
  171. FILSIZ    EQU    35
  172. REIPL    EQU    0
  173. FCB    EQU    5CH
  174. FCBEXT    EQU    FCB+12
  175. FCBSNO    EQU    FCB+32
  176. FCBRNO    EQU    FCB+32
  177. FCB2    EQU    6CH
  178. ;
  179. ;            START.A86
  180. ;
  181. ;This file is for making changes to MODEM9.xx which are not UART/MODEM
  182. ;specific. UART/MODEM suport is provided by the various SYS files.
  183. ;
  184. ;The user can make the following changes in this file:
  185. ;
  186. ;       a) Set the TRUE/FALSE statements in the lookup table which
  187. ;       begins with BAKUPBYTE and ends with EOFSEND
  188. ;       b) Change the control characters that are used for local commands,
  189. ;       this sequence starts with EXITCHR and ends with EXTCHR
  190. ;    c) Set STRGOK to TRUE and enter up to ten strings at location
  191. ;       STRINGS. These strings can be logon sequences or frequently
  192. ;       used commands that are sent to a remote computer
  193. ;
  194. ;
  195. STRGOK    EQU    FALSE        ;change to TRUE if you want to define
  196.                 ;strings, such as logon sequences, for
  197.                 ;transmission. Up to 10 strings may be
  198.                 ;entered at location STRINGS in this file.
  199. ;
  200. ;*** Don't change the ORG locations in this file or in the files    ***
  201. ;*** SETUP and MAIN. This ORG statements provide standard locations ***
  202. ;*** for modification by overaly files or DDT.                ***
  203. ;
  204.     CSEG
  205.     ORG    0100H
  206. ;
  207.     JMP    START
  208. ;
  209. BAKUPBYTE    DB    TRUE    ;true=make .BAK file
  210. CKSUMDFLT    DB    FALSE    ;true=default to Checksum checking
  211.                 ;false=default to CRC checking
  212. TOGGLECRC    DB    TRUE    ;true=allow toggling of Checksum to CRC
  213. CONVBKSP    DB    FALSE    ;true=convert backspace to rub
  214. TOGGLEBK    DB    TRUE    ;true=allow toggling of bksp to rub
  215. ADDLF        DB    TRUE    ;true=add LF after CR
  216. TOGGLELF    DB    TRUE    ;true=allow toggling of LF after CR
  217. STRLF        DB    FALSE    ;true=strip LF after CR in terminal file output
  218. TOGSLF        DB    TRUE    ;true=toggle strip LF after CR in file output
  219. LOCONEXTCHR    DB    FALSE    ;true=local command if EXTCHR precedes
  220.                 ;false=not local command if EXTCHR precedes
  221. TOGGLELOC    DB    TRUE    ;true=allow toggling of LOCONEXTCHR
  222. LSTTST        DB    TRUE    ;true=allow toggling of printer on/off
  223.                 ;in terminal mode. Set to false if your
  224.                 ;printer can't keep up with the modem
  225. XOFFTST        DB    FALSE    ;true=allow testing of XOFF from remote
  226.                 ;while transmitting a file in terminal mode
  227. XONWAIT        DB    FALSE    ;true=wait for XON after sending CR while
  228.                 ;transmitting a file in terminal mode
  229. TOGXOFF        DB    TRUE    ;true=allow toggling of XOFF/XON testing
  230. ECHWAIT        DB    FALSE    ;true=wait for echo before sending next
  231.                 ;character in terminal mode file output
  232. EOFSEND        DB    FALSE    ;true=send eof in terminal mode file output
  233. NAKONLY        DB    FALSE    ;true=resends a record only after a valid NAK
  234.                 ;false=resends a record after any non-ACK
  235.                 ;true is intended only for use with mainframes
  236.                 ;that send, for example, xoff when buffer is
  237.                 ;full
  238. ;
  239. SETUPTST    DB    SETUP
  240. SCRNTEST    DB    SCRNCLR
  241. TRANLOGON    DB    STRGOK
  242. DISCFLG        DB    DISCON
  243. CARDETFLG    DB    CARDET
  244. CLOCK        DB    CLKRATE
  245. ;
  246. MSPEED        DB    4    ;sets the display time to send a file
  247.                 ;0=110 1=300 2=450 3=600 4-1200        @DH
  248.                 ;5=2400 6=4800 7=9600 8=19200        @DH
  249. ;                ;0=110 1=300 2=600 3=1200        @DH
  250. ;                ;4=2400 5=4800 6=9600 7=19200        @DH
  251. BYTDLY        DB    0    ;default time to send character in
  252.                 ;terminal mode file transfer
  253.                 ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec
  254. CRDLY        DB    0    ;default time for extra wait after CR
  255.                 ;in terminal mode file transfer
  256.                 ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec
  257. BELRPT        DB    10    ;bell repeat time = value*0.03 sec
  258. NOOFCOL        DB    5    ;number of directory columns, currently
  259.                 ;set for 80 column screen
  260. ;
  261. BAUDCHR        DB    'B'-40H ; ^B = Change baud rate     30/DEC/84 @DH
  262.                 ;      from terminal mode          @DH
  263. EXITCHR        DB    'E'-40H    ; ^E = Exit without disconnect
  264. LOGCHR        DB    'O'-40H    ; ^O = Send logon           
  265. LSTCHR        DB    'P'-40H    ; ^P = Toggle printer           
  266. UNSAVECHR    DB    'R'-40H    ; ^R = Close input text buffer       
  267. TRANCHR        DB    'T'-40H ; ^T = Transmit file to remote       
  268. SAVECHR        DB    'Y'-40H    ; ^Y = Open input text buffer       
  269. EXTCHR        DB    '^'-40H    ; ^^ = Send next character
  270. ;
  271. VERNUM:    CALL    ILPRT
  272.     DB    CR,LF
  273.     DB    'MODEM 9.01.IBM-1.1 - 30/Dec/84'
  274.     DB    CR,LF,LF
  275.     DB    'CP/M-86 version by Michael Mellinger and Bill Bolton'
  276.     DB    CR,LF,LF
  277.     DB    'CP/M-86-IBM version by Dick Hill'
  278.     DB    CR,LF,LF,0
  279.     JMP    SYSVER
  280. ;
  281. ;ALL STRINGS MUST BE 31 CHARACTERS OR LESS AND MUST BE TERMINATED WITH 0
  282. ;
  283. STRINGS:
  284.     DB    'STRING #0 at 240H',0
  285.     RB    (OFFSET STRINGS)-(OFFSET $)+32*1
  286.     DB    'STRING #1 at 260H',0
  287.     RB    (OFFSET STRINGS)-(OFFSET $)+32*2
  288.     DB    'STRING #2 at 280H',0
  289.     RB    (OFFSET STRINGS)-(OFFSET $)+32*3
  290.     DB    'STRING #3 at 2A0H',0
  291.     RB    (OFFSET STRINGS)-(OFFSET $)+32*4
  292.     DB    'STRING #4 at 2C0H',0
  293.     RB    (OFFSET STRINGS)-(OFFSET $)+32*5
  294.     DB    'STRING #5 at 2E0H',0
  295.     RB    (OFFSET STRINGS)-(OFFSET $)+32*6
  296.     DB    'STRING #6 at 300H',0
  297.     RB    (OFFSET STRINGS)-(OFFSET $)+32*7
  298.     DB    'STRING #7 at 320H',0
  299.     RB    (OFFSET STRINGS)-(OFFSET $)+32*8
  300.     DB    'STRING #8 at 340H',0
  301.     RB    (OFFSET STRINGS)-(OFFSET $)+32*9
  302.     DB    'STRING #9 at 360H',0
  303. ;
  304. ;
  305. ;PHONE NUMBER LIBRARY TABLE.
  306. ;
  307. ;EACH DB MUST BE 32 CHARACTERS LONG FOR PROPER OPERATION.
  308. ;LAST DB MUST BE DB 0. UP TO 26 NUMBERS ARE ALLOWED.
  309. ;
  310. NUMBLIB:
  311. ;    '----5---10---15---20---25-----32'
  312. DB    'A=Amrad           1-703-734-1387'    ;'A'
  313. DB    'B=Palatine RCPM   1-312-359-8080'    ;'B'
  314. DB    'C=CBBS Pasadena   1-213-799-1632'    ;'C'
  315. DB    'D=PMMI            1-703-379-0303'    ;'D'
  316. DB    'E=Tech. CBBS      1-313-846-6127'    ;'E'
  317. DB    'F=Ron Fowler     1-313-729-1905R'    ;'F'
  318. DB    'G=Gasnet NASA     1-301-344-9156'    ;'G'
  319. DB    'H=Dave Hardy      1-313-846-6127'    ;'H'
  320. DB    'I=Wayne Hammerly  1-301-953-3753'    ;'I'
  321. DB    'J=RBBS Pasadena   1-213-356-1034'    ;'J'
  322. DB    'K=David Kozinn    1-216-334-4604'    ;'K'
  323. DB    'L=Program Store   1-202-337-4694'    ;'L'
  324. DB    'M=Kelly Smith     1-805-527-9321'    ;'M'
  325. DB    'N=SuperBrain Sys  1-617-862-0781'    ;'N'
  326. DB    'O=R.L.Plouffe     1-703-524-2549'    ;'O'
  327. DB    'P=K.Petersen     1-313-759-6569R'    ;'P'
  328. DB    'Q=Bruce Ratoff    1-201-272-1874'    ;'Q'
  329. DB    'R=Mark Pulver     1-312-789-0499'    ;'R'
  330. DB    'S=Smokin  Silicon 1-312-941-0049'    ;'S'
  331. DB    'T=                              '    ;'T'
  332. DB    'U=                              '    ;'U'
  333. DB    'V=                              '    ;'V'
  334. DB    'W=                              '    ;'W'
  335. DB    'X=                              '    ;'X'
  336. DB    'Y=                              '    ;'Y'
  337. DB    'Z=                              '    ;'Z'
  338. DB    0                    ; end
  339. ;    '----5---10---15---20---25-----32'
  340. ;
  341. ;            IBMSYS.A86
  342. ;
  343. ;    For the IBM Personal Computer communications port.
  344. ;
  345. ;Used 8250SYS.ASM from CP/M 80 version of MODEM9 and 8251SYS.A86 from
  346. ;CP/M 86 version of MODEM9 to make this file. 12/24/84 - Dick Hill (AMS)
  347. ;
  348. ;Change the clock speed to suit your system.
  349. CLKRATE    EQU    4        ;clock speed in MHz, 8 MHz maximum
  350. ;
  351. ;Do not change the next three equates.
  352. SETUP    EQU    TRUE
  353. DISCON    EQU    TRUE
  354. CARDET    EQU    TRUE
  355. SCRNCLR    EQU    TRUE
  356. ;
  357. ;8250 equates.
  358. ;
  359. MODRCVB    EQU    01H        ;bit to test for received data
  360. MODRCVR    EQU    MODRCVB        ;change to 0 if bit is 0 when
  361.                 ;data received
  362. MODSNDB    EQU    020H        ;bit to test for ready to send
  363. MODSNDR    EQU    MODSNDB        ;change to 0 if bit is 0 when
  364.                 ;ready to send
  365. ;
  366. MODDATP    EQU    03F8H        ;Serial Port 0 data
  367. MODCTLP    EQU    MODDATP+5    ;Serial Port 0 status
  368. ;
  369. ;Control and status ports.
  370. ;
  371. MODDLL    EQU    MODDATP            ;divisor latch low
  372. MODDLH    EQU    MODDATP+1        ;divisor latch high
  373. MODIER    EQU    MODDATP+1        ;interrupt enable
  374. ;MODIIR    EQU    MODDATP+2        ;interrupt ident.
  375. MODLCR    EQU    MODDATP+3        ;modem line control reg.
  376. MODMCR    EQU    MODDATP+4        ;modem control reg.
  377. ;MODLSR    EQU    MODDATP+5        ;line status, same as MODCTLP
  378. MODMSR    EQU    MODDATP+6        ;modem status reg.
  379. ;
  380. ;Control bytes
  381. ;
  382. DISABL    EQU    00H            ;disable interrupts
  383. LOOPNODTR EQU    10H            ;set loop back, DTR off 
  384. ACCBAUD    EQU    80H            ;access baud rate divisor latches
  385. DTR    EQU    03H            ;DTR and RTS on
  386. WORDLEN EQU    3            ;8 bit word, 1 stop bit, no parity, no
  387.                     ;break, deaccess baud rate divisor
  388.                     ;latches
  389. ;
  390. CLR1    EQU    1BH        ;clear from cursor to
  391. CLR2    EQU    'J'        ;end of screen
  392. CLR3    EQU    0
  393. CLR4    EQU    0
  394. ;
  395. SCLR1    EQU    1BH        ;clear entire screen
  396. SCLR2    EQU    'E'        ;and home cursor
  397. SCLR3    EQU    0
  398. SCLR4    EQU    0
  399. SCLR5    EQU    0
  400. SCLR6    EQU    0
  401. SCLR7    EQU    0
  402. ;
  403. CLREOS:        CALL    ILPRT
  404. ;
  405.         DB    CLR1,CLR2,CLR3,CLR4,0
  406.         RET
  407. ;
  408. CLRSCRN:    CALL    ILPRT
  409. ;
  410.         DB    SCLR1,SCLR2,SCLR3,SCLR4,SCLR5,SCLR6,SCLR7,0
  411.         RET
  412. ;
  413. INMODCTLP:    PUSH    DX
  414.         MOV    DX,MODCTLP
  415.         IN    AL,DX
  416.         POP    DX
  417.         RET
  418. ;
  419. OUTMODDATP:    PUSH    DX
  420.         MOV    DX,MODDATP
  421.         OUT    DX,AL
  422.         POP    DX
  423.         RET
  424. ;
  425. INMODDATP:    PUSH    DX
  426.         MOV    DX,MODDATP
  427.         IN    AL,DX
  428.         POP    DX
  429.         RET
  430. ;
  431. ANIMODSNDB:    AND    AL,MODSNDB         ;bit to test for send ready
  432.         RET
  433. ;
  434. CPIMODSNDR:    CMP    AL,MODSNDR         ;value of send bit when ready
  435.         RET
  436. ;
  437. ANIMODRCVB:    AND    AL,MODRCVB         ;bit to test for receive ready
  438.         RET
  439. ;
  440. CPIMODRCVR:    CMP    AL,MODRCVR         ;value of receive ready bit
  441.         RET
  442. ;
  443. OUTMODMCR:    PUSH    DX
  444.         MOV    DX,MODMCR
  445.         OUT    DX,AL
  446.         POP    DX
  447.         RET
  448. ;
  449. OUTMODLCR:    PUSH    DX
  450.         MOV    DX,MODLCR
  451.         OUT    DX,AL
  452.         POP    DX
  453.         RET
  454. ;
  455. OUTMODIER:    PUSH    DX
  456.         MOV    DX,MODIER
  457.         OUT    DX,AL
  458.         POP    DX
  459.         RET
  460. ;
  461. OUTMODMSR:    PUSH    DX
  462.         MOV    DX,MODMSR
  463.         OUT    DX,AL
  464.         POP    DX
  465.         RET
  466. ;
  467. OUTMODDLL:    PUSH    DX
  468.         MOV    DX,MODDLL
  469.         OUT    DX,AL
  470.         POP    DX
  471.         RET
  472. ;
  473. OUTMODDLH:    PUSH    DX
  474.         MOV    DX,MODDLH
  475.         OUT    DX,AL
  476.         POP    DX
  477.         RET
  478. ;
  479. INMODMSR:    PUSH    DX
  480.         MOV    DX,MODMSR
  481.         IN    AL,DX
  482.         POP    DX
  483.         RET
  484. ;
  485. ;This is where the message goes giving the system for
  486. ;which MODEM9 has been customized.
  487. ;
  488. SYSVER:
  489.     CALL    ILPRT
  490.     DB    'Set Up for: IBM Personal Computer',CR,LF,LF,0
  491.     RET
  492. ;
  493. ;The following is used to initialize the 8250 on execution
  494. ;of MODEM9.
  495. ;
  496. INITMOD:
  497.     MOV    AL,DISABL
  498.     CALL    OUTMODIER
  499.     MOV    AL,LOOPNODTR
  500.     CALL    OUTMODMCR
  501.     MOV    AL,ACCBAUD
  502.     CALL    OUTMODLCR
  503.     MOV    AL,MSPEED        ;value for offset into baud table
  504.     MOV    BX,OFFSET BDTABL    ;point to baud table
  505.     MOV    DX,0            ;initialize DX
  506.     ADD    AL,AL            ;X2 = offset into baud table for rate
  507.     MOV    DL,AL            ;put it in DX
  508.     ADD    BX,DX            ;point to baud rate
  509.     MOV    AX,[BX]                ;put baud divisor in AX..
  510.                     ;..AL=LSD, AH=MSD 
  511.     PUSH    AX            ;put it on stack
  512.     MOV    AL,AH            ;get high order of divisor
  513.     CALL    OUTMODDLH        ;to high divisor latch
  514.     POP    AX            ;get low order of divisor 
  515.     CALL    OUTMODDLL        ;to low divisor latch
  516.     MOV    AL,WORDLEN
  517. PARM1    EQU    OFFSET $ - 1
  518.     CALL    OUTMODLCR        ;to line control reg.
  519.     MOV    AL,DTR
  520.     CALL    OUTMODMCR        ;to modem control reg.
  521.     RET
  522. ;
  523. ;The following are parameters/masks used in setting word length
  524. ;stop bits and parity for the 8250.
  525. ;
  526. MSKWD    EQU    03H    ;word length mask
  527. SEVEN    EQU    02H    ;receive seven bit word
  528. EIGHT    EQU    03H    ;receive eight bit word
  529. MSKST    EQU    04H    ;stop bit mask
  530. ONE    EQU    00H    ;one stop bit
  531. TWO    EQU    04H    ;two stop bits
  532. MSKPA    EQU    18H    ;mask for parity bits
  533. NONE    EQU    00H    ;no parity
  534. ODD    EQU    08H    ;odd parity
  535. EVEN    EQU    18H    ;even parity
  536. ;
  537. ;The following routine changes the baud rate, stop bits and parity on
  538. ;the 8250 from the command level. Note the routine MUST modify the
  539. ;parameters used by the INITMOD routine.
  540. ;
  541. SETUPR:
  542.     PUSH    BX
  543.     CALL    CLRTST
  544.     CALL    ILPRT
  545.     DB    '              IBM/UART/Modem Control',CR,LF,LF,LF
  546.     DB    'Current settings -',CR,LF,0
  547.     CALL    SETTIM2
  548.     CALL    GIVEPRM
  549.     CALL    ILPRT
  550.     DB    CR,LF
  551.     DB    'Enter choices below - <CR> for no change',CR,LF,0
  552. AGAIN:
  553.     MOV    DX,OFFSET BAUDBUF    ;point to input buffer for ILCOMP
  554.     CALL    ILPRT
  555.     DB    'Baud Rate (110, 300, 450, 600, 1200, 2400, 4800, 9600, 19200): ',0
  556.     CALL    INBUFF
  557.     MOV    DX,OFFSET BAUDBUF+2
  558.     CALL    ILCOMP                ;compare BAUDBUF+2 with characters below
  559.     DB    '110',0
  560.     MOV    AL,0
  561.     JNC    OK            ;go if got match
  562.     CALL    ILCOMP
  563.     DB    '300',0
  564.     MOV    AL,1
  565.     JNC    OK
  566.     CALL    ILCOMP
  567.     DB    '450',0
  568.     MOV    AL,2
  569.     JNC    OK
  570.     CALL    ILCOMP
  571.     DB    '600',0
  572.     MOV    AL,3
  573.     JNC    OK
  574.     CALL    ILCOMP
  575.     DB    '1200',0
  576.     MOV    AL,4
  577.     JNC    OK
  578.     CALL    ILCOMP
  579.     DB    '2400',0
  580.     MOV    AL,5
  581.     JNC    OK
  582.     CALL    ILCOMP
  583.     DB    '4800',0
  584.     MOV    AL,6
  585.     JNC    OK
  586.     CALL    ILCOMP
  587.     DB    '9600',0
  588.     MOV    AL,7
  589.     JNC    OK
  590.     CALL    ILCOMP
  591.     DB    '19200',0
  592.     MOV    AL,8
  593.     JNC    OK
  594.     CALL    ILCOMP
  595.     DB    ' ',0
  596.     JNC    AGAIN2
  597.     CALL    WRONG
  598.     JMP    AGAIN        ;try again
  599. ;
  600. OK:
  601.     MOV    MSPEED,AL
  602. ;
  603. AGAIN2:
  604.     MOV    DX,OFFSET BAUDBUF    ;point to input buffer for ILCOMP
  605.     CALL    ILPRT
  606.     DB    CR,LF
  607.     DB    'Word Length (7, 8): ',0
  608.     CALL    INBUFF
  609.     MOV    DX,OFFSET BAUDBUF+2
  610.     CALL    ILCOMP               ;compare BAUDBUF+2 with characters below
  611.     DB    '7',0
  612.     MOV    AL,SEVEN
  613.     JNC    OK2
  614.     CALL    ILCOMP
  615.     DB    '8',0
  616.     MOV    AL,EIGHT
  617.     JNC    OK2
  618.     CALL    ILCOMP
  619.     DB    ' ',0
  620.     JNC    AGAIN3
  621.     CALL    WRONG
  622.     JMP    AGAIN2
  623. ;
  624. OK2:
  625.     MOV    WDLEN,AL
  626. ;
  627. AGAIN3:
  628.     MOV    DX,OFFSET BAUDBUF           ;point to input buffer for ILCOMP
  629.     CALL    ILPRT
  630.     DB    CR,LF
  631.     DB    'Stop Bits (1, 2): ',0
  632.     CALL    INBUFF
  633.     MOV    DX,OFFSET BAUDBUF+2
  634.     CALL    ILCOMP               ;compare BAUDBUF+2 with characters below
  635.     DB    '1',0
  636.     MOV    AL,ONE
  637.     JNC    OK3
  638.     CALL    ILCOMP
  639.     DB    '2',0
  640.     MOV    AL,TWO
  641.     JNC    OK3
  642.     CALL    ILCOMP
  643.     DB    ' ',0
  644.     JNC    AGAIN4
  645.     CALL    WRONG
  646.     JMP    AGAIN3
  647. ;
  648. OK3:
  649.     MOV    STPLN,AL
  650. ;
  651. AGAIN4:
  652.     MOV    DX,OFFSET BAUDBUF           ;point to input buffer for ILCOMP
  653.     CALL    ILPRT
  654.     DB    CR,LF
  655.     DB    'Parity (None, Even, Odd): ',0
  656.     CALL    INBUFF
  657.     MOV    DX,OFFSET BAUDBUF+2
  658.     CALL    ILCOMP               ;compare BAUDBUF+2 with characters below
  659.     DB    'NONE',0
  660.     MOV    AL,NONE
  661.     JNC    OK4            ;go if got match
  662.     CALL    ILCOMP
  663.     DB    'EVEN',0
  664.     MOV    AL,EVEN
  665.     JNC    OK4
  666.     CALL    ILCOMP
  667.     DB    'ODD',0
  668.     MOV    AL,ODD
  669.     JNC    OK4
  670.     CALL    ILCOMP
  671.     DB    ' ',0
  672.     JNC    GOSET
  673.     CALL    WRONG
  674.     JMP    AGAIN4            ;try again
  675. ;
  676. OK4:
  677.     MOV    PARIT,AL
  678. ;
  679. GOSET:
  680.     MOV    AL,0
  681.     OR    AL,WDLEN
  682.     OR    AL,PARIT
  683.     OR    AL,STPLN
  684.     MOV    BYTE PTR .PARM1,AL
  685.     CALL    ILPRT
  686.     DB    CR,LF
  687.     DB    'New settings -',CR,LF,0
  688.     CALL    SETTIM2
  689.     CALL    GIVEPRM
  690.     POP    BX
  691.     JMP    INITMOD                ;reset 8250
  692. ;
  693. GIVEPRM:
  694.     CALL    GETPRM
  695.     CALL    ILPRT
  696.     DB    'Word length is ',0
  697.     MOV    AL,WDLEN
  698.     CMP    AL,SEVEN
  699.     JNZ    NOTSEV
  700.     CALL    ILPRT
  701.     DB    'seven',0
  702.     JMP    GIVEST
  703. NOTSEV:
  704.     CALL    ILPRT
  705.     DB    'eight',0
  706. GIVEST:
  707.     CALL    ILPRT
  708.     DB    ', number of stop bits is ',0
  709.     MOV    AL,STPLN
  710.     CMP    AL,ONE
  711.     JNZ    NOTONE
  712.     CALL    ILPRT
  713.     DB    'one',0
  714.     JMP    GIVEPA
  715. NOTONE:
  716.     CALL    ILPRT
  717.     DB    'two',0
  718. GIVEPA:
  719.     CALL    ILPRT
  720.     DB    ', parity is ',0
  721.     MOV    AL,PARIT
  722.     CMP    AL,NONE
  723.     JNZ    NOTNON
  724.     CALL    ILPRT
  725.     DB    'none',CR,LF,0
  726.     RET
  727.  
  728. NOTNON:
  729.     MOV    AL,PARIT
  730.     CMP    AL,ODD
  731.     JNZ    NOTODD
  732.     CALL    ILPRT
  733.     DB    'odd',CR,LF,0
  734.     RET
  735. NOTODD:
  736.     CALL    ILPRT
  737.     DB    'even',CR,LF,0
  738.     RET
  739. ;
  740. GETPRM:
  741.     MOV    AL,BYTE PTR .PARM1        ;get present word length
  742.     AND    AL,MSKWD    
  743.     MOV    WDLEN,AL            ;store it
  744.     MOV    AL,BYTE PTR .PARM1          ;get present stop bits and parity
  745.     MOV    CH,AL
  746.     AND    AL,MSKST
  747.     MOV    STPLN,AL            ;store stop bits
  748.     MOV    AL,CH
  749.     AND    AL,MSKPA
  750.     MOV    PARIT,AL            ;store parity
  751.     RET
  752. ;
  753. WRONG:
  754.     CALL    ILPRT    ;all matches failed - tell operator
  755.     DB    '++ Incorrect entry ++',CR,LF,BELL,0
  756.     RET
  757. ;
  758. ;Table of baud rate parameters
  759. ;
  760. BDTABL    EQU    WORD PTR $
  761.     DW      0417H        ; 110 baud
  762.     DW    0180H        ; 300 baud
  763.     DW    0100H        ; 450 baud
  764.     DW    00C0H        ; 600 baud
  765.     DW    0060H        ; 1200 baud
  766.     DW    0030H        ; 2400 baud
  767.     DW    0018H        ; 4800 baud
  768.     DW    000CH        ; 9600 baud
  769.     DW    0006H        ; 19200 BAUD
  770. ;
  771. WDLEN    DB    EIGHT
  772. STPLN    DB    ONE
  773. PARIT    DB    NONE
  774. ;
  775. BAUDBUF:
  776.     DB    10,0
  777.     RB    10
  778. ;
  779. ;For MODEMs which disconnect from the telephone line when data terminal
  780. ;ready (DTR) drops, the following routine will disconnect.
  781. ;
  782. HANGUP    EQU    0        ;HANG UP THE TELEPHONE
  783. ;
  784. DISCR:
  785.     MOV    AL,HANGUP
  786.     CALL    OUTMODMCR
  787.     RET
  788. ;
  789. ;The following routine will give the carrier detect status
  790. ;
  791. RLSD    EQU    80H            ;RECEIVED LINE SIGNAL (CARRIER) DETECT
  792. ;
  793. DETCAR:
  794.     MOV    AL,CARDETFLG
  795.     OR    AL,AL
  796.     JZ    DETCARRET        ;RETURN IF FALSE
  797.     CALL    ILPRT
  798.     DB    'Carrier ',0
  799.     CALL    INMODMSR        ;in modem status reg.
  800.     AND    AL,RLSD
  801.     JNZ    DETCAR1
  802.     CALL    ILPRT
  803.     DB    'not ',0
  804. DETCAR1:
  805.     CALL    ILPRT
  806.     DB    'present',CR,LF,0
  807. DETCARRET:
  808.     RET
  809. ;
  810. ;        MAIN.A86
  811. ;
  812. ;Main line routines for MODEM9.xx.
  813. ;
  814. START:
  815.     MOV    AX,SS
  816.     MOV    SAVESS,AX
  817.     MOV    AX,SP
  818.     MOV    SAVESP,AX
  819.     PUSHF                ;push flags in CCP stack
  820.     POP    AX            ;save flags in AX        @DH
  821.     MOV    DX,DS            ;set SS register to base    @DH
  822.     MOV    SS,DX            ;set SS, SP with interrupt    @DH
  823.     MOV    SP,OFFSET STACKTOP    ;        for 8088        @DH
  824.     PUSH    AX            ;restore the flags        @DH
  825. ;    POP    BX            ;                @DH
  826. ;    MOV    AX,DS            ;                @DH
  827. ;    MOV    SS,AX            ;                @DH
  828. ;    MOV    SP,STACKTOP        ;                @DH
  829. ;    PUSH    BX            ;                @DH
  830.     POPF
  831.     CLD
  832.     CALL    INITADR        ;INITIALIZE ADDRESSES
  833.     CALL    VERNUM        ;GIVE CONFIGURATION MESSAGE
  834.     CALL    GETUSR        ;GET USER
  835.     MOV    SAVUSR,AL    ;SAVE FOR EXIT
  836.     MOV    NFILFLG,TRUE
  837.     MOV    SAVEFLG,FALSE
  838.     CALL    PROCOPT        ;PROCESS CONTROL OPTIONS
  839. ;
  840. RESTART:
  841.     MOV    AL,OPTION    ;GET MAIN OPTION
  842.     CMP    AL,' '        ;NO OPTION SPEC'D?
  843.     JZ    MENUJMP        ;TRUE, GO MENU
  844.     CMP    AL,'H'        ;MENU ASKED FOR?
  845.     JZ    MENU2JMP    ;YES, GO MENU2
  846.     CALL    INITMOD
  847.     CALL    MOVEFCB
  848.     CALL    INMODDATP     ;GOBBLE UP GARBAGE..
  849.     CALL    INMODDATP     ;..CHARACTERS ON LINE
  850.     MOV    ECHOFLG,0    ; RESET ECHO FLAG
  851.     MOV    LOCFLG,0    ; RESET LOCAL FLAG
  852.     MOV    AL,OPTION    ;PROCESS MAIN OPTION
  853.     CMP    AL,'E'        ;ECHO MODE?
  854.     JNZ    NOECH        ;JUMP IF NOT
  855.     MOV    ECHOFLG,TRUE    ;SET ECHO TO TRUE
  856.     JMP    DSKSAVE
  857. ;
  858. MENU2JMP:
  859.     JMP    MENU2
  860. ;
  861. NOECH:    CMP    AL,'L'        ;LOCAL ECHO MODE
  862.     JNZ    NOLOC
  863.     MOV    AL,TRUE
  864.     MOV    LOCFLG,AL
  865.     JMP    DSKSAVE
  866.  
  867. NOLOC:
  868.     CMP    AL,'T'        ;TERMINAL MODE?
  869.     JNZ    NOLOC1
  870.     JMP    DSKSAVE        ;YES
  871.  
  872. NOLOC1:
  873.     CMP    AL,'S'        ;SEND A FILE?
  874.     JNZ    NOLOC2
  875.     JMP    SENDFIL        ;YES
  876.  
  877. NOLOC2:
  878.     CMP    AL,'R'        ;RECEIVE A FILE?
  879.     JNZ    NOLOC3
  880.     JMP    RCVFIL        ;YES
  881.  
  882. NOLOC3:
  883.     CALL    NOTVLDMSG    ;SAY NOT A VALID OPTION
  884. MENUJMP:
  885.     JMP    MENU        ;NO VALID OPTION SPEC'D, GO MENU
  886. ;
  887. INITADR:
  888.     JMP    INITMOD            ;RETURN DONE FROM THIS ROUTINE..
  889. ;
  890. ; CHECK OPTIONS, PUT 0 IN APPROPRIATE PLACES IN OPTION TABLE
  891. ; IF OPTION SELECTED
  892. ;
  893. PROCOPT:
  894.     MOV    DX,OFFSET FCB+1
  895.     XCHG    BX,DX
  896.     MOV    AL,BYTE PTR [BX]
  897.     XCHG    BX,DX
  898.     MOV    OPTION,AL
  899. OPTLP:
  900.     INC    DX
  901.     XCHG    BX,DX
  902.     MOV    AL,BYTE PTR [BX]
  903.     XCHG    BX,DX
  904.     CMP    AL,' '
  905.     JZ    ENDOPT
  906.     MOV    BX,OFFSET OPTBL
  907.     MOV    CH,OFFSET OPTBE- OFFSET OPTBL
  908. OPTCK:
  909.     CMP    AL,BYTE PTR [BX]
  910.     JNZ    OPTNO
  911.     CMP    AL,'B'
  912.     JNZ    OPTCK1
  913.     MOV    AL,OPTION
  914.     CMP    AL,'S'
  915.     JZ    OPTCK1
  916.     CMP    AL,'R'
  917.     JNZ    OPTNO1
  918. OPTCK1:
  919.     MOV    BYTE PTR [BX],0
  920.     JMP    OPTLP
  921. ;
  922. OPTNO:
  923.     INC    BX
  924.     DEC    CH
  925.     JNZ    OPTCK
  926. OPTNO1:
  927.     CALL    NOTVLDMSG
  928.     POP    AX            ;PRESERVE STACK
  929.     JMP    MENU
  930. ;
  931. ENDOPT:
  932.     MOV    AL,VSEEFLG
  933.     OR    AL,AL
  934.     JNZ    ENDOPTRT
  935.     MOV    QFLG,AL            ;IF VIEWING SUPPRESS ALL ELSE
  936. ENDOPTRT:
  937.     RET
  938. ;
  939. MOVEFCB:
  940.     MOV    BX,OFFSET FCB+16
  941.     MOV    DX,OFFSET FCB
  942.     MOV    CH,16
  943.     CALL    MOVE
  944.     MOV    BYTE PTR .FCBSNO,0
  945.     MOV    BYTE PTR .FCBEXT,0
  946.     RET
  947. ;
  948. PRTMSG:
  949.     MOV    CL,PRINT
  950.     INT    224
  951.     RET
  952. ;
  953. EXIT:
  954.     MOV    DL,SAVUSR
  955.     CALL    SETUSR
  956.     MOV    DX,OFFSET 80H
  957.     MOV    CL,STDMA
  958.     INT    224
  959.     CALL    CKMODM        ;CATCH ANY GARBAGE CHARACTERS (is this safe?)
  960. COLDBOOT:
  961.     PUSHF            ;Must keep the flags in a register
  962.     POP    BX        ; as the current stack is about to blow
  963.     MOV    AX,SAVESS    ;Restore the original stack segment
  964.     MOV    SS,AX
  965.     MOV    AX,SAVESP    ; and pointer
  966.     MOV    SP,AX
  967.     PUSH    BX
  968.     POPF            ;Restore the flags
  969.     MOV    CX,0        ;Exit is via BDOS call 0
  970.     MOV    DX,0
  971.     INT    224        ;We're off to see the wizard....
  972. ;
  973. ;INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH
  974. ;
  975. SETFCB:
  976.     MOV    DX,OFFSET CMDBUF
  977.     MOV    BX,OFFSET FCB
  978.     CALL    CPMLINE
  979.     CALL    PROCOPT
  980. CHECKNM:
  981.     MOV    AL,BYTE PTR .FCB+1    ;CHECK ON THE PRIMARY OPTION
  982.     CMP    AL,'E'            ;RETURN IF ECHO OPTION
  983.     JZ    CHECKNMRT
  984.     CMP    AL,'H'            ;RETURN IF HELP OPTION
  985.     JZ    CHECKNMRT
  986.     CMP    AL,'L'            ;RETURN IF LOCAL ECHO OPTION
  987.     JZ    CHECKNMRT
  988.     CMP    AL,'T'
  989.     JNZ    L@103
  990.     JMP    TERMSEL
  991. L@103:
  992.     CMP    AL,'S'
  993.     JNZ    L@104
  994.     JMP    CKFILE
  995. L@104:
  996.     CMP    AL,'R'
  997.     JNZ    BDOPT
  998.     MOV    AL,BATCHFLG         ;IF MULT FILE MODE, THEN..
  999.     OR    AL,AL             ;..RECV OPT DOES NOT NEED..
  1000.     JNZ    CKFILE
  1001. CHECKNMRT:
  1002.     RET
  1003. ;
  1004. BDOPT:
  1005.     CALL    ILPRT
  1006.     DB    CR,LF,'++ Bad Option ++',CR,LF,0
  1007.     JMP    REENT
  1008.  
  1009. CKFILE:
  1010.     MOV    AL,BYTE PTR .FCB+17    ;IF OPTION THAT NEEDS FILE NAME,..
  1011.     CMP    AL,' '            ;..THEN CHECK TO SEE IF NAME..
  1012.     JNZ    CHECKNMRT        ;...EXISTS. IF NOT..
  1013. REENT:
  1014.     CALL    ILPRT            ;..DO EVERYTHING OVER.
  1015.     DB    CR,LF,'Re-enter PRIMARY option and file name only: ',BELL,0
  1016.     MOV    DX,OFFSET CMDBUF
  1017.     CALL    INBUFF
  1018.     JMP    SETFCB
  1019. ;
  1020. TERMSEL:
  1021.     CMP    BYTE PTR .FCB+17,' '
  1022.     JNZ    SAVAGN
  1023.     MOV    SAVEFLG,FALSE
  1024.     MOV    NFILFLG,TRUE
  1025.     RET
  1026. ;
  1027. SAVAGN:
  1028.     MOV    NFILFLG,FALSE
  1029.     RET
  1030. ;
  1031. ;
  1032. ;ADJUSTS LOOP COUNTERS FOR VARIOUS CLOCK SPEEDS
  1033. ;
  1034. FIXCNT:
  1035.     MOV    AL,CLOCK
  1036.     CMP    AL,1
  1037.     JZ    FIXCNTRT
  1038.     PUSH    DX
  1039.     PUSH    BX
  1040.     POP    DX
  1041. CNTMUL:
  1042.     ADD    BX,DX
  1043.     DEC    AL
  1044.     JNZ    CNTMUL
  1045.     POP    DX
  1046. FIXCNTRT:
  1047.     RET
  1048. ;
  1049. MOVE128:
  1050.     MOV    CH,128
  1051. ;
  1052. MOVE:
  1053.     MOV    SI,BX
  1054.     PUSH    DS
  1055.     POP    ES
  1056.     MOV    DI,DX
  1057. MOVE001:
  1058.     MOVS    BYTE PTR [DI], BYTE PTR [SI]
  1059.     DEC    CH
  1060.     JNZ    MOVE001
  1061.     MOV    BX,SI
  1062.     MOV    DX,DI
  1063.     RET
  1064. ;
  1065. MENU0:
  1066.     TEST    NFILFLG,0FFH
  1067.     JZ    MENU1
  1068.     JMP    MENU            ;GO IF NO FILE ACTIVE
  1069.  
  1070. MENU1:
  1071.     CALL    ILPRT            ;ELSE PRINT MESSAGE
  1072.     DB    CR,LF,LF
  1073.     DB    '** There may be text in the memory buffer **',CR,LF
  1074.     DB    '** It will be lost unless NOL or WRT commands are used **'
  1075.     DB    CR,LF,BELL,0
  1076.     MOV    CH,2            ;2 MORE BELLS
  1077. BLOOP:
  1078.     MOV    AL,BELRPT        ;GET TIME
  1079.     MOV    CL,AL
  1080. BCLOOP:
  1081.     MOV    BX, 1000        ;ABOUT 0.03 SECONDS
  1082.     CALL    FIXCNT
  1083. BILOOP:
  1084.     MOV    AL,BL
  1085.     OR    AL,BH
  1086.     DEC    BX
  1087.     JNZ    BILOOP
  1088.     DEC    CL
  1089.     JNZ    BCLOOP
  1090.     MOV    AL,BELL
  1091.     CALL    TIPE
  1092.     DEC    CH
  1093.     JNZ    BLOOP
  1094. ;
  1095. MENU:
  1096.     MOV    BX,OFFSET RESTSN               ;RESTORE SECTOR NUMBERS..
  1097.     MOV    DX,OFFSET SECTNOB              ;..FOR NEW FILE TRANSFER.
  1098.     MOV    CH,OFFSET SECTNOE- OFFSET SECTNOB
  1099.     CALL    MOVE
  1100.     MOV    BX,OFFSET RESTROPT              ;RESTORE OPTION TABLE
  1101.     MOV    DX,OFFSET OPTBL
  1102.     MOV    CH,OFFSET OPTBE- OFFSET OPTBL
  1103.     CALL    MOVE
  1104.     MOV    AL,0
  1105.     MOV    MFFLG1,AL              ;RESET MFACCESS ROUTINE..
  1106.     NOT    AL                  ;..AND MULTI TRANS IN CASE..
  1107.     MOV    FSTFLG,AL              ;..OF ABORT.
  1108.     JMP    XPRT
  1109. ;
  1110. MENU2:
  1111.     CALL    CLRTST
  1112.     CALL    ILPRT
  1113.     DB    '               Single Letter Commands',CR,LF,LF
  1114.     DB    ' H  - Display this information',CR,LF
  1115.     DB    ' ?  - Display current settings',CR,LF,LF
  1116.     DB      ' T  - Terminal mode',CR,LF
  1117.     DB      ' E  - Terminal mode with echo',CR,LF
  1118.     DB    ' L  - Terminal mode with local echo',CR,LF
  1119.     DB    '     For capturing text use T(or E or L) FILENAME.TYP and'
  1120.     DB    CR,LF
  1121.     DB    '     Start & Stop toggles described on subsequent screen.'
  1122.     DB    CR,LF,LF
  1123.     DB      ' R  - Receive CP/M file using Christensen Protocol',CR,LF
  1124.     DB      ' S  - Send CP/M file using Christensen Protocol',CR,LF
  1125.     DB    '     Command is: R(or S) FILENAME.TYP',CR,LF
  1126.     DB    '     R and S can use the following subcommands:',CR,LF
  1127.     DB    '          B  - Bulk transfer using wildcards (e.g. *.*)',CR,LF
  1128.     DB    '          Q  - Quiet mode (no messages to console)',CR,LF
  1129.     DB    '          T  - Return to terminal mode after transfer',CR,LF
  1130.     DB    '          V  - View bytes transferred on console',CR,LF,LF
  1131.     DB    'The single letter commands may also be used on the',CR,LF
  1132.     DB    'command line when the program is initially executed.'
  1133.     DB    CR,LF,LF,0
  1134. ;
  1135.     CALL    NXTSCRN
  1136. ;
  1137.     CALL    ILPRT
  1138.     DB    '               Three Letter Commands',CR,LF,LF
  1139.     DB      'CPM - Exit from this program to CP/M',CR,LF
  1140.     DB      'DIR - List directory and space free (may specify drive)'
  1141.     DB    CR,LF
  1142.     DB    'ERA - Erase file (may specify drive)',CR,LF
  1143.     DB    'LOG - Change default drive/user (specify drive/user)'
  1144.     DB    CR,LF
  1145.     DB    '      and reset disks.  e.g. LOG A0, LOG B (user unchanged)'
  1146.     DB    CR,LF
  1147.     DB    'FOP - Display commands for setting terminal mode file',CR,LF
  1148.     DB    '      output parameters',CR,LF,0
  1149. ;
  1150.     TEST    DISCFLG,0FFH
  1151.     JZ    NODISC
  1152.     CALL    ILPRT
  1153.     DB    'DSC - Disconnect the modem from the telephone line',CR,LF,0
  1154. ;
  1155. NODISC:
  1156.     TEST    SETUPTST,0FFH
  1157.     JNZ    NOTIME
  1158.     CALL    ILPRT
  1159.     DB    'TIM - Set S mode time-to-send message',CR,LF,0
  1160. ;
  1161. NOTIME:
  1162.     MOV    AL,TOGGLECRC
  1163.     OR    AL,AL
  1164.     JZ    NOTOGCRC
  1165.     CALL    ILPRT
  1166.     DB    'TCC - Toggle Checksum/CRC mode on receive',CR,LF,0
  1167. ;
  1168. NOTOGCRC:
  1169.     TEST    TOGGLEBK,0FFH
  1170.     JZ    NOTOGBK
  1171.     CALL    ILPRT
  1172.     DB    'TBR - Toggle backspace to rub conversion',CR,LF,0
  1173. ;
  1174. NOTOGBK:
  1175.     TEST    TOGGLELOC,0FFH
  1176.     JZ    NOTOGLOC
  1177.     CALL    ILPRT
  1178.     DB    'TLC - Toggle  1) local command immediate',CR,LF
  1179.     DB    '              2) local command after ',0
  1180.     MOV    AL,EXTCHR
  1181.     CALL    SHFTYPE
  1182.     DB    CR,LF,0
  1183. ;
  1184. NOTOGLOC:
  1185.     MOV    AL,TOGGLELF
  1186.     OR    AL,AL
  1187.     JZ    NOTOGLF
  1188.     CALL    ILPRT
  1189.     DB    'TLF - Toggle send linefeed after carriage return',CR,LF,0
  1190. ;
  1191. NOTOGLF:
  1192.     CALL    ILPRT
  1193.     DB    'NUM - List remote systems',CR,LF,0
  1194.     MOV    AL,SETUPTST
  1195.     OR    AL,AL
  1196.     JZ    NOSETUP
  1197.     CALL    ILPRT
  1198.     DB    'SET - Set communication ports',CR,LF,0
  1199. ;
  1200. NOSETUP:
  1201.     MOV    AL,LF
  1202.     CALL    TIPE
  1203.     CALL    ILPRT
  1204.     DB    '    The following are terminal text buffer commands:'
  1205.     DB    CR,LF,0
  1206.     CALL    ILPRT
  1207.     DB      'DEL - Delete memory buffer and file',CR,LF
  1208.     DB      'NOL - Return to terminal mode - no loss of data in buffer'
  1209.     DB    CR,LF
  1210.     DB      'WRT - Write memory buffer to disk file',CR,LF,LF,0
  1211.     CALL    NXTSCRN
  1212. ;
  1213.     CALL    ILPRT
  1214.     DB    '      Local Commands while in Terminal Mode',CR,LF,LF,0
  1215.     MOV    AL,BAUDCHR        ;                @DH
  1216.     CALL    SHFTYPE            ;                @DH
  1217.     DB    '  - Change baud rate from terminal mode',CR,LF,LF,0 ;    @DH
  1218.     MOV    AL,EXITCHR
  1219.     CALL    SHFTYPE
  1220.     DB    '  - Exit to command mode',CR,LF,LF,0
  1221.     MOV    AL,TRANLOGON
  1222.     OR    AL,AL
  1223.     JZ    NOTRANLOG
  1224.     MOV    AL,LOGCHR
  1225.     CALL    SHFTYPE
  1226.     DB    '  - Transmit string',CR,LF
  1227.     DB    '     Must be followed by number of string (0-9)',CR,LF
  1228.     DB    '     or L to display list of strings',CR,LF,LF,0
  1229. ;
  1230. NOTRANLOG:
  1231.     TEST    LSTTST,0FFH
  1232.     JZ    NOLST2
  1233.     MOV    AL,LSTCHR
  1234.     CALL    SHFTYPE
  1235.     DB    '  - Toggle printer',CR,LF,0
  1236. ;
  1237. NOLST2:
  1238.     MOV    AL,LF
  1239.     CALL    TIPE
  1240.     MOV    AL,SAVECHR
  1241.     CALL    SHFTYPE
  1242.     DB    '  - Start copy into buffer',CR,LF,0
  1243.     MOV    AL,UNSAVECHR
  1244.     CALL    SHFTYPE
  1245.     DB      '  - Stop copy into buffer',CR,LF
  1246.     DB    '     Start & Stop may be toggled as often as desired.',CR,LF
  1247.     DB    '     A ":" at start of line indicates buffer is open.',CR,LF
  1248.     DB    '     XOFF automatically used to stop input when writing',CR,LF
  1249.     DB    '     full buffer to disk, XON sent to resume.',CR,LF,LF,0
  1250.     MOV    AL,TRANCHR
  1251.     CALL    SHFTYPE
  1252.     DB    '  - Transfer ASCII file to remote',CR,LF,LF,0
  1253.     MOV    AL,LOCONEXTCHR
  1254.     OR    AL,AL
  1255.     MOV    AL,EXTCHR
  1256.     JNZ    REMDFLT
  1257.     CALL    SHFTYPE
  1258.     DB    '  - Send local control character to remote',CR,LF,0
  1259.     JMP    XPRT
  1260. REMDFLT:
  1261.     CALL    SHFTYPE
  1262.     DB    '  - Next character will be used for local control',CR,LF,0
  1263. ;
  1264. XPRT:
  1265.     CALL    ILPRT
  1266.     DB    CR,LF,'Drive ',0
  1267.     MOV    CL,CURDSK            ;CURRENT DISK FUNCTION
  1268.     INT    224
  1269.     ADD    AL,'A'                ;MAKE ASCII
  1270.     CALL    TIPE
  1271.     CALL    GETUSR                ;GET CURRENT USER NUMBER
  1272.     CMP    AL,0
  1273.     JZ    SR3B                ;SKIP IF USER 0
  1274.     PUSH    AX
  1275.     CALL    ILPRT
  1276.     DB    ', User ',0
  1277.     POP    AX
  1278.     MOV    BH,0
  1279.     MOV    BL,AL
  1280.     CALL    DECOUT                ;REPORT USER
  1281. ;
  1282. SR3B:
  1283.     CALL    CRLF
  1284.     TEST    NFILFLG,0FFH
  1285.     JNZ    NOBUFMSG
  1286.     CALL    GETSPC
  1287.     CALL    ILPRT
  1288.     DB    ' bytes of buffer free',CR,LF,0
  1289. NOBUFMSG:    
  1290.     CALL    ILPRT
  1291.     DB    'COMMAND (H for Help): ',0
  1292. GETCMD:
  1293.     MOV    DX,OFFSET CMDBUF        ;ENTER COMMAND
  1294.     CALL    INBUFF
  1295.     CALL    CRLF
  1296.     MOV    DX,OFFSET CMDBUF+2         ;POINT TO COMMAND
  1297.     CALL    ILCOMP
  1298.     DB    'CPM',0
  1299.     JC    GETCMD1
  1300.     JMP    EXIT
  1301.  
  1302. GETCMD1:
  1303.     CALL    ILCOMP
  1304.     DB    'LOG',0
  1305.     JC    GETCMD2
  1306.     JMP    LOGNEW
  1307.  
  1308. GETCMD2:
  1309.     CALL    ILCOMP
  1310.     DB    'DIR',0
  1311.     JC    GETCMD3
  1312.     JMP    DIR
  1313.  
  1314. GETCMD3:
  1315.     CALL    ILCOMP
  1316.     DB    'ERA',0
  1317.     JC    GETCMD4
  1318.     JMP    ERASEF
  1319.  
  1320. GETCMD4:
  1321.     CALL    ILCOMP
  1322.     DB    'DSC',0
  1323.     JC    GETCMD5
  1324.     JMP    DISC
  1325.  
  1326. GETCMD5:
  1327.     CALL    ILCOMP
  1328.     DB    '?',0
  1329.     JC    GETCMD6
  1330.     JMP    CURPAR
  1331.  
  1332. GETCMD6:
  1333.     CALL    ILCOMP
  1334.     DB    'SPD',0
  1335.     JC    GETCMD7
  1336.     JMP    SETSPD
  1337.  
  1338. GETCMD7:
  1339.     CALL    ILCOMP
  1340.     DB    'FOP',0
  1341.     JC    GETCMD8
  1342.     JMP    TFOMENU
  1343.  
  1344. GETCMD8:
  1345.     CALL    ILCOMP
  1346.     DB    'TIM',0
  1347.     JC    GETCMD9
  1348.     JMP    SETTIM
  1349.  
  1350. GETCMD9:
  1351.     CALL    ILCOMP
  1352.     DB    'TCC',0
  1353.     JC    GETCMD10
  1354.     JMP    TOGCRC
  1355.  
  1356. GETCMD10:
  1357.     CALL    ILCOMP
  1358.     DB    'TBR',0
  1359.     JC    GETCMD11
  1360.     JMP    TOGBKSP
  1361.  
  1362. GETCMD11:
  1363.     CALL    ILCOMP
  1364.     DB    'TLC',0
  1365.     JC    GETCMD12
  1366.     JMP    TOGLOC
  1367.  
  1368. GETCMD12:
  1369.     CALL    ILCOMP
  1370.     DB    'TLF',0
  1371.     JC    GETCMD13
  1372.     JMP    TOGLF
  1373.  
  1374. GETCMD13:
  1375.     CALL    ILCOMP
  1376.     DB    'TSL',0
  1377.     JC    GETCMD14
  1378.     JMP    TOGSTL
  1379.  
  1380. GETCMD14:
  1381.     CALL    ILCOMP
  1382.     DB    'TXF',0
  1383.     JC    GETCMD15
  1384.     JMP    TOGTXOFF
  1385.  
  1386. GETCMD15:
  1387.     CALL    ILCOMP
  1388.     DB    'TXN',0
  1389.     JC    GETCMD16
  1390.     JMP    TOGTXON
  1391.  
  1392. GETCMD16:
  1393.     CALL    ILCOMP
  1394.     DB    'TWE',0
  1395.     JC    GETCMD17
  1396.     JMP    TOGWECH
  1397.  
  1398. GETCMD17:
  1399.     CALL    ILCOMP
  1400.     DB    'TEF',0
  1401.     JC    GETCMD18
  1402.     JMP    TOGTEOF
  1403.  
  1404. GETCMD18:
  1405.     CALL    ILCOMP
  1406.     DB    'NUM',0
  1407.     JC    GETCMD19
  1408.     JMP    NUMPRN
  1409.  
  1410. GETCMD19:
  1411.     MOV    AL,SETUPTST
  1412.     OR    AL,AL
  1413.     JZ    NOSETUP2
  1414.     CALL    ILCOMP
  1415.     DB    'SET',0
  1416.     JC    NOSETUP2
  1417.     JMP    SETUPENT
  1418.  
  1419. NOSETUP2:
  1420.     CALL    ILCOMP
  1421.     DB    'NOL',0
  1422.     JC    NXTOPT1        ;CARRY SET = NO MATCH
  1423.     MOV    AL,NFILFLG
  1424.     OR    AL,AL
  1425.     JZ    NOSETUP3
  1426.     JMP    NOFILOPN    ;GO TELL OPERATOR IF NO FILE OPEN
  1427.  
  1428. NOSETUP3:
  1429.     CALL    BUFMSG
  1430.     MOV    BX,HLSAVE    ;RETURN TO TERMINAL..
  1431.     JMP    TERM        ;..MODE WITH SAVE OPTION..
  1432.                 ;..IF PREVIOUSLY ENABLED.
  1433. ;
  1434. NXTOPT1:
  1435.     CALL    ILCOMP
  1436.     DB    'WRT',0
  1437.     JC    NXTOPT2
  1438.     JMP    WRTFIL
  1439.  
  1440. NXTOPT2:
  1441.     CALL    ILCOMP
  1442.     DB    'DEL',0
  1443.     JC    NXTOPT3
  1444.     JMP    NEWFILE
  1445.  
  1446. NXTOPT3:
  1447.     PUSH    BX
  1448.     MOV    AL,CMDBUF+2
  1449.     MOV    BX,OFFSET COMPLIST
  1450.     CALL    COMPARE            ;COMPARES LIST POINTED TO BY HL..
  1451.     POP    BX            ;..TO CHAR IN A-REG.
  1452.     JC    NOTVLD            ;CARRY SET = NO MATCH
  1453. DOOPT:
  1454.     PUSH    BX            ;LOAD ORIGINAL FCB WITH TRANSFER..
  1455.     CALL    SETFCB            ;..CMDS AND GO TO BEGINNING OF..
  1456.     POP    BX            ;..PROGRAM. WILL FOLLOW SAME LOGIC..
  1457.     JMP    RESTART            ;..AS IF PROGRAM WERE CALLED WITH..
  1458.                     ;..CP/M COMMAND LINE.
  1459. ;
  1460. NOTVLD:
  1461.     CALL    NOTVLDMSG
  1462.     JMP    XPRT
  1463. ;
  1464. NOTVLDMSG:
  1465.     CALL    ILPRT
  1466.     DB    '++ Invalid Command ++',CR,LF,BELL,0
  1467.     RET
  1468. ;
  1469. DIR:
  1470.     MOV    CL,CURDSK
  1471.     INT    224
  1472.     MOV    DISKSAV,AL
  1473.     CALL    DIRLST
  1474.     MOV    DL,DISKSAV
  1475.     MOV    CL,SELDSK
  1476.     INT    224
  1477.     JMP    XPRT
  1478. ;
  1479. LOGNEW:
  1480.     TEST    NFILFLG,0FFH
  1481.     JNZ    LOGNEW1
  1482.     JMP    NORESET
  1483.  
  1484. LOGNEW1:
  1485.     MOV    AL,CMDBUF+6
  1486.     CMP    AL,' '
  1487.     JNZ    SPECIFD
  1488.     MOV    CL,CURDSK
  1489.     INT    224
  1490.     ADD    AL,'A'
  1491. SPECIFD:
  1492.     SUB    AL,'A'
  1493.     MOV    DISKSAV,AL
  1494.     CMP    AL,16
  1495.     JC    SPECIFD1
  1496.     JMP    NOTVLD
  1497.  
  1498. SPECIFD1:
  1499.     MOV    AL,CMDBUF+7    ;GET NEW USER NUMBER
  1500.     CMP    AL,' '        ;CHECK FOR SPACE
  1501.     JZ    SR7A        ;EXIT IF NO NEW USER NUMBER SPECIFIED
  1502.     CALL    NUMCHK        ;CHECK TO SEE IF IT IS A NUMBER
  1503.     MOV    CH,AL        ;SAVE
  1504.     MOV    AL,CMDBUF+8    ;GET SECOND DIGIT
  1505.     CMP    AL,' '
  1506.     JZ    SR7B        ;GO IF SPACE
  1507.     CALL    NUMCHK
  1508.     MOV    CL,AL        ;SAVE
  1509.     MOV    AL,CH        ;GET SAVED FIRST DIGIT
  1510.     ADD    AL,AL        ; X2
  1511.     ADD    AL,AL        ; X4
  1512.     ADD    AL,AL        ; X8
  1513.     ADD    AL,CH        ; X9
  1514.     ADD    AL,CH        ; X10
  1515.     ADD    AL,CL
  1516.     CMP    AL,16        ;CHECK FOR < 16
  1517.     JC    SPECIFD2
  1518.     JMP    NOTVLD        ;GO IF NOT
  1519.  
  1520. SPECIFD2:
  1521.     MOV    CH,AL
  1522. SR7B:
  1523.     PUSH    CX
  1524.     CALL    GETUSR
  1525.     POP    CX        ;RESTORE SELECTED USER
  1526.     CMP    AL,CH        ;AND COMPARE THEM
  1527.     JZ    SR7A        ;EXIT IF UNCHANGED
  1528.     MOV    DL,CH        ;ELSE SET NEW USER
  1529.     CALL    SETUSR
  1530. ;
  1531. SR7A:
  1532.     CALL    ILPRT
  1533.     DB    'Insert disk for drive ',0
  1534.     MOV    AL,DISKSAV
  1535.     ADD    AL,'A'
  1536.     CALL    TIPE
  1537. NOTCR:
  1538.     CALL    ILPRT
  1539.     DB    CR,LF,'Hit return when ready',0
  1540.     CALL    KEYIN
  1541.     CMP    AL,CR
  1542.     JNZ    NOTCR
  1543.     CALL    CRLF
  1544.     MOV    CL,RESET
  1545.     INT    224    
  1546.     MOV    DL,DISKSAV
  1547.     MOV    CL,SELDSK
  1548.     INT    224
  1549.     JMP    XPRT
  1550. ;
  1551. GETUSR:
  1552.     MOV    DL,0FFH        ;GET CURRENT USER
  1553. SETUSR:
  1554.     MOV    CL,USER        ;SET-UP FUNCTION CALL
  1555.     INT    224        ;NUMBER IN RETURNED IN A
  1556.     RET
  1557. ;
  1558. NORESET:
  1559.     CALL    ILPRT
  1560.     DB    '++      Terminal mode file open      ++',CR,LF
  1561.     DB    '++ Use WRT or DEL before LOG command ++',CR,LF
  1562.     DB    CR,LF,LF,BELL,0
  1563.     XOR    AL,AL
  1564.     JMP    XPRT
  1565. ;
  1566. ERASEF:
  1567.     MOV    DX,OFFSET CMDBUF         ;PUT CMD LINE INTO FCB AT HL
  1568.     MOV    BX,OFFSET FCB
  1569.     CALL    CPMLINE
  1570.     CALL    MOVEFCB                ;MOVE FCB+16 TO FCB
  1571.     CMP    BYTE PTR .FCB+1,' '
  1572.     JNZ     ERASEF1
  1573.     JMP    NOTVLD                ;GO IF NO FILE SPECIFIED
  1574.  
  1575. ERASEF1:
  1576.     MOV    DX,OFFSET FCB
  1577.     MOV    CL,SRCHF
  1578.     INT    224
  1579.     INC    AL                ;0 IF FILE NOT FOUND
  1580.     JNZ    ERAFILE             ;OK, GO ERASE
  1581.     CALL    ILPRT
  1582.     DB    '++ File not found ++',CR,LF,BELL,0
  1583.     JMP    XPRT
  1584. ;
  1585. ERAFILE:
  1586.     MOV    DX,OFFSET FCB
  1587.     MOV    CL,ERASE
  1588.     INT    224
  1589.     CALL    ILPRT
  1590.     DB    'File erased',CR,LF,0
  1591.     JMP    XPRT
  1592. ;
  1593. DISC:
  1594.     MOV    AL,DISCFLG
  1595.     OR    AL,AL
  1596.     JNZ    DISC1
  1597.     JMP    NOTVLD
  1598.  
  1599. DISC1:
  1600.     CALL    DISCR
  1601.     CALL    ILPRT
  1602.     DB    '** Disconnected **',CR,LF,BELL,0
  1603.     JMP    XPRT
  1604. ;
  1605. SETSPD:
  1606.     CALL    ILPRT
  1607.     DB    'Enter character output delay [0(none) - 9(longest delay)]: ',0
  1608.     CALL    NUMGET
  1609.     JNC    NOCHG1
  1610.     MOV    BYTDLY,AL
  1611. NOCHG1:
  1612.     CALL    SPDMSG
  1613.     CALL    ILPRT
  1614.     DB    CR,LF,'Enter additional delay after <CR> [0-9]: ',0
  1615.     CALL    NUMGET
  1616.     JNC    NOCHG2
  1617.     ROL    AL,1        ;X2
  1618.     ROL    AL,1        ;X4
  1619.     MOV    CRDLY,AL
  1620. NOCHG2:
  1621.     CALL    CRDLYMSG
  1622.     JMP    XPRT
  1623. ;
  1624. NUMGET:
  1625.     MOV    DX,OFFSET CMDBUF
  1626.     CALL    INBUFF
  1627.     MOV    AL,CMDBUF+2     ;GET NUMBER
  1628.     CMP    AL,' '
  1629.     JZ    NUMCHKRT
  1630. NUMCHK:
  1631.     SUB    AL,'0'
  1632.     CMP    AL,10
  1633.     JC    NUMCHKRT
  1634.     POP    AX        ;PRESERVE STACK
  1635.     JMP    NOTVLD
  1636.  
  1637. NUMCHKRT:
  1638.     RET
  1639. ;
  1640. SPDMSG:
  1641.     CALL    ILPRT
  1642.     DB    'Terminal mode file output delay is 0.',0
  1643.     MOV    AL,BYTDLY
  1644.     CALL    GIVNUM
  1645.     CALL    ILPRT
  1646.     DB    ' seconds per character',CR,LF,0
  1647.     RET
  1648. ;
  1649. CRDLYMSG:
  1650.     CALL    ILPRT
  1651.     DB    'Additional delay after <CR> is 0.',0
  1652.     MOV    AL,CRDLY
  1653.     CALL    GIVNUM
  1654.     CALL    ILPRT
  1655.     DB    ' seconds',CR,LF,0
  1656.     RET
  1657. ;
  1658. GIVNUM:
  1659.     ADD    AL,AL        ;2X
  1660.     CMP    AL,10
  1661.     MOV    CH,AL
  1662.     JNC    NOZERO
  1663.     MOV    AL,'0'
  1664.     CALL    TIPE
  1665.     MOV    AL,CH
  1666. NOZERO:
  1667.     PUSH    BX
  1668.     MOV    BL,AL
  1669.     MOV    BH,0
  1670.     CALL    DECOUT
  1671.     POP    BX
  1672.     RET
  1673. ;
  1674. ;Routine to change baud rate from terminal mode       30/DEC/84        @DH
  1675. ;
  1676. BAUDCHG:                ;                @DH
  1677.     PUSH    BX            ;                @DH
  1678.     PUSH    DX            ;                @DH
  1679.     PUSH    CX            ;                @DH
  1680.     PUSH    AX            ;                @DH
  1681.     CALL    CLRSCRN            ;                @DH
  1682.     CALL    ILPRT            ;                @DH
  1683.     DB    CR,LF,LF        ;                @DH
  1684.     DB    '  Select 0 - 8 for new baud rate'    ;        @DH
  1685.     DB    CR,LF,LF        ;                @DH
  1686.     DB    '  0 = 110 bps          5 = 2400 bps',CR,LF,LF    ;    @DH
  1687.     DB    '  1 = 300 bps          6 = 4800 bps',CR,LF,LF    ;    @DH
  1688.     DB    '  2 = 450 bps          7 = 9600 bps',CR,LF,LF    ;    @DH
  1689.     DB    '  3 = 600 bps          8 = 19200 bps',CR,LF,LF    ;    @DH
  1690.     DB    '  4 = 1200 bps',CR,LF,LF            ;    @DH
  1691.     DB    '  Enter selection (0 - 8 or <CR> for no change): ',0;    @DH
  1692. ;
  1693.     CALL    NUMGET
  1694.     CMP    AL,' '            ;                @DH
  1695.     JNZ    BAUD0            ;                @DH
  1696.     JMP    RETURN            ;                @DH
  1697. ;
  1698. BAUD0:    CMP    AL,9            ;                @DH
  1699. ;    CMP    AL,8            ;                @DH
  1700.     JC    BAUD1            ;                @DH
  1701.     JMP    BAUDCHG            ;                @DH
  1702. ;
  1703. BAUD1:                    ;                @DH
  1704.     MOV    MSPEED,AL        ;                @DH
  1705.     CALL    CLRSCRN            ;                @DH
  1706.     CALL    ILPRT            ;                @DH
  1707.     DB    CR,LF,LF        ;                @DH
  1708.     DB    'New Modem speed is ',0    ;                @DH
  1709.     CALL    BAUDPRT            ;                @DH
  1710.     CALL    INITMOD            ;                @DH
  1711.     JMP    RETURN            ;                @DH
  1712. ;
  1713. SETTIM:
  1714.     MOV    AL,SETUPTST
  1715.     OR    AL,AL
  1716.     JZ    SETTIM1
  1717.     JMP    NOTVLD
  1718.  
  1719. SETTIM1:
  1720.     CALL    CLRSCRN            ;                @DH
  1721.     CALL    ILPRT
  1722.     DB    CR,LF,LF            ;                @DH
  1723.     DB    'Use 0-8 to give baud rate for S mode time-to-send message,'
  1724.     DB    CR,LF
  1725.     DB    'where 0=110, 1=300, 2=450, 3=600, 4=1200, 5=2400',CR,LF ;@DH
  1726.     DB    '6=4800, 7=9600 and 8=19200 baud',CR,LF,LF,'Enter value: ',0;@DH
  1727. ;    DB    'where 0=110, 1=300, 2=600, 3=1200, 4=2400',CR,LF    ;@DH
  1728. ;    DB    '5=4800, 6=9600 and 7=19200 baud',CR,LF,LF,'Enter value: ',0;@DH
  1729.     CALL    NUMGET
  1730.     CMP    AL,9            ;                @DH
  1731. ;    CMP    AL,8            ;                @DH
  1732.     JC    SETTIM1A
  1733.     JMP    NOTVLD
  1734. ;
  1735. SETTIM1A:
  1736.     MOV    MSPEED,AL
  1737.     CALL    SETTIM2
  1738.     JMP    XPRT
  1739. ;
  1740. SETTIM2:
  1741.     MOV    AL,SETUPTST
  1742.     OR    AL,AL
  1743.     JNZ    SETTIM3
  1744.     CALL    ILPRT
  1745.     DB    'Rate for the S mode time-to-send message is set to ',0
  1746.     JMP    SETTIM4
  1747. ;
  1748. SETTIM3:
  1749.     CALL    ILPRT
  1750.     DB    'Modem speed is ',0
  1751. SETTIM4:
  1752.     CALL    BAUDPRT
  1753.     RET
  1754. ;
  1755. ;Shows baud rates set for 'time to send' file transfer.
  1756. ;
  1757. BAUDPRT:
  1758.     MOV    BX,OFFSET BAUDSPD
  1759.     MOV    DH,0
  1760.     MOV    AL,MSPEED        ;GET BAUD RATE CODE
  1761.     ADD    AL,AL            ;X2
  1762.     MOV    DL,AL
  1763.     ADD    BX,DX            ;POINT TO CORRECT RATE
  1764.     MOV    AL,BYTE PTR [BX]     ; GET FIRST DIGIT
  1765.     CALL    TIPE
  1766.     INC    BX
  1767.     MOV    AL,BYTE PTR [BX]     ; GET SECOND DIGIT
  1768.     CALL    TIPE
  1769.     MOV    AL,MSPEED
  1770. ;    CMP    AL,7            ;                @DH
  1771.     CMP    AL,8            ;FOR ADDITION OF 19200 BAUD RATE @DH
  1772.     JC    NOTFAST
  1773.     INC    BX
  1774.     MOV    AL,Byte Ptr [BX]     ;Get third digit
  1775.     CALL    TIPE
  1776. NOTFAST:
  1777.     MOV    AL,MSPEED        ;CHECK FOR GREATER THAN 1000
  1778.     CMP    AL,4            ;FOR ADDITION OF 450 BAUD RATE    @DH
  1779. ;    CMP    AL,3            ;                @DH
  1780.     JC    NOTHOU            ;GO IF LESS
  1781.     MOV    AL,'0'            ;PRINT EXTRA 0
  1782.     CALL    TIPE
  1783. NOTHOU:
  1784.     CALL    ILPRT
  1785.     DB    '0 baud',CR,LF,0
  1786.     RET
  1787. ;                    ;added 450 and 19200 baud rates @DH
  1788. BAUDSPD        DB    '11','30','45','60','12','24','48','96','192';  @DH  
  1789. ;BAUDSPD    DB    '11','30','60','12','24','48','96','192';    @DH
  1790. ;
  1791. TOGCRC:
  1792.     MOV    AL,TOGGLECRC
  1793.     OR    AL,AL
  1794.     JNZ    TOGCRC1
  1795.     JMP    NOTVLD
  1796. TOGCRC1:
  1797.     MOV    AL,CKSUMDFLT
  1798.     NOT    AL
  1799.     MOV    CKSUMDFLT,AL
  1800.     CALL    TOGCRC2
  1801.     JMP    XPRT
  1802. ;
  1803. TOGCRC2:
  1804.     OR    AL,AL
  1805.     JNZ    CHEKMSG
  1806.     CALL    ILPRT
  1807.     DB    'CRC mode set',CR,LF,0
  1808.     RET
  1809. ;
  1810. CHEKMSG:
  1811.     CALL    ILPRT
  1812.     DB    'Checksum mode set',CR,LF,0
  1813.     RET
  1814. ;
  1815. TOGBKSP:
  1816.     MOV    AL,TOGGLEBK
  1817.     OR    AL,AL
  1818.     JNZ    TEMP8
  1819.     JMP    NOTVLD
  1820. TEMP8:
  1821.     MOV    AL,CONVBKSP
  1822.     NOT    AL
  1823.     MOV    CONVBKSP,AL
  1824.     CALL    TOGBKSP2
  1825.     JMP    XPRT
  1826. ;
  1827. TOGBKSP2:
  1828.     TEST    CONVBKSP,0FFH
  1829.     JZ    NORUBMSG
  1830.     CALL    ILPRT
  1831.     DB    'Backspace is rub',CR,LF,0
  1832.     RET
  1833. ;
  1834. NORUBMSG:
  1835.     CALL    ILPRT
  1836.     DB    'Backspace is backspace',CR,LF,0
  1837.     RET
  1838. ;
  1839. TOGLOC:
  1840.     MOV    AL,TOGGLELOC
  1841.     OR    AL,AL
  1842.     JNZ    TOGLOC1
  1843.     JMP    NOTVLD
  1844.  
  1845. TOGLOC1:
  1846.     NOT    LOCONEXTCHR
  1847.     CALL    TOGLOC2
  1848.     JMP    XPRT
  1849. ;
  1850. TOGLOC2:
  1851.     CALL    ILPRT
  1852.     DB    'Use ',0
  1853.     MOV    AL,LOCONEXTCHR
  1854.     OR    AL,AL
  1855.     MOV    AL,EXTCHR
  1856.     JZ    LOCMSG
  1857.     CALL    SHFTYPE
  1858.     DB    ' before local command',CR,LF,0
  1859.     RET
  1860. ;
  1861. LOCMSG:
  1862.     CALL    SHFTYPE
  1863.     DB    ' to send local command to remote',CR,LF,0
  1864.     RET
  1865. ;
  1866. TOGLF:
  1867.     MOV    AL,TOGGLELF
  1868.     OR    AL,AL
  1869.     JNZ    TOGLF1
  1870.     JMP    NOTVLD
  1871.  
  1872. TOGLF1:
  1873.     NOT    ADDLF
  1874.     CALL    TOGLF2
  1875.     JMP    XPRT
  1876. ;
  1877. TOGLF2:
  1878.     CALL    ILPRT
  1879.     DB    'Linefeed ',0
  1880.     MOV    AL,ADDLF
  1881.     OR    AL,AL
  1882.     JNZ    LFMSG
  1883.     CALL    ILPRT
  1884.     DB    'NOT ',0
  1885. LFMSG:
  1886.     CALL    ILPRT
  1887.     DB    'sent after <CR>',CR,LF,0
  1888.     RET
  1889. ;
  1890. TOGSTL:
  1891.     MOV    AL,TOGSLF
  1892.     OR    AL,AL
  1893.     JNZ    TOGSTL1
  1894.     JMP    NOTVLD
  1895.  
  1896. TOGSTL1:
  1897.     NOT    STRLF
  1898.     CALL    TOGSTL2
  1899.     JMP    XPRT
  1900. ;
  1901. TOGSTL2:
  1902.     CALL    ILPRT
  1903.     DB    'Linefeed ',0
  1904.     MOV    AL,STRLF
  1905.     OR    AL,AL
  1906.     JZ    SLFMSG
  1907.     CALL    ILPRT
  1908.     DB    'NOT ',0
  1909. SLFMSG:
  1910.     CALL    ILPRT
  1911.     DB    'sent after <CR> in terminal mode file output',CR,LF,0
  1912.     RET
  1913. ;
  1914. TOGTXOFF:
  1915.     MOV    AL,TOGXOFF
  1916.     OR    AL,AL
  1917.     JNZ    TOGTXOFF1
  1918.     JMP    NOTVLD
  1919.  
  1920. TOGTXOFF1:
  1921.     CALL    ILPRT
  1922.     DB    'Use XOFF testing? (Y/N): ',0
  1923.     CALL    GETANS
  1924.     JC    NOCHG3
  1925.     MOV    XOFFTST,AL
  1926. NOCHG3:
  1927.     CALL    XOFFMSG
  1928.     MOV    AL,XOFFTST
  1929.     OR    AL,AL
  1930.     JNZ    NOCHG3A
  1931.     JMP    XPRT
  1932.  
  1933. NOCHG3A:
  1934.     NOT    AL
  1935.     MOV    XONWAIT,AL
  1936.     MOV    ECHWAIT,AL
  1937.     CALL    THEREF
  1938.     CALL    XONMSG
  1939.     CALL    ECHMSG
  1940.     JMP    XPRT
  1941. ;
  1942. TOGTXON:
  1943.     CALL    ILPRT
  1944.     DB    'Use XON waiting after <CR> (Y/N): ',0
  1945.     CALL    GETANS
  1946.     JC    NOCHG4
  1947.     MOV    XONWAIT,AL
  1948. NOCHG4:
  1949.     CALL    XONMSG
  1950.     MOV    AL,XONWAIT
  1951.     OR    AL,AL
  1952.     JNZ    NOCHG4A
  1953.     JMP    XPRT
  1954.  
  1955. NOCHG4A:
  1956.     NOT    AL
  1957.     MOV    XOFFTST,AL        ;DON'T ALLOW BOTH
  1958.     MOV    ECHWAIT,AL
  1959.     CALL    THEREF
  1960.     CALL    XOFFMSG
  1961.     CALL    ECHMSG
  1962.     JMP    XPRT
  1963. ;
  1964. TOGWECH:
  1965.     CALL    ILPRT
  1966.     DB    'Use echo waiting before transmitting next character (Y/N): ',0
  1967.     CALL    GETANS
  1968.     JC    NOCHG5
  1969.     MOV    ECHWAIT,AL
  1970. NOCHG5:
  1971.     CALL    ECHMSG
  1972.     MOV    AL,ECHWAIT
  1973.     OR    AL,AL
  1974.     JNZ    NOCHG5A
  1975.     JMP    XPRT
  1976.  
  1977. NOCHG5A:
  1978.     NOT    AL
  1979.     MOV    XOFFTST,AL
  1980.     MOV    XONWAIT,AL
  1981.     CALL    THEREF
  1982.     CALL    XOFFMSG
  1983.     CALL    XONMSG
  1984.     JMP    XPRT
  1985. ;
  1986. ECHMSG:    CALL    ILPRT
  1987.     DB    'Waiting for character echo ',0
  1988.     MOV    AL,ECHWAIT
  1989.     OR    AL,AL
  1990.     JNZ    ECHMSG2
  1991.     CALL    ILPRT
  1992.     DB    'NOT ',0
  1993. ECHMSG2:
  1994.     CALL    ILPRT
  1995.     DB    'used in terminal mode file output',CR,LF,0
  1996.     RET
  1997. ;
  1998. GETANS:
  1999.     MOV    DX,OFFSET CMDBUF
  2000.     CALL    INBUFF
  2001.     MOV    AL,CMDBUF+2             ;GET ANSWER
  2002.     CMP    AL,' '
  2003.     CMC
  2004.     JZ    GETANSRT
  2005.     MOV    CH,AL
  2006.     CMP    AL,'N'
  2007.     MOV    AL,FALSE
  2008.     JZ    GETANSRT
  2009.     MOV    AL,CH
  2010.     CMP    AL,'Y'
  2011.     MOV    AL,TRUE
  2012.     JZ    GETANSRT
  2013.     POP    AX            ;PRESERVE STACK
  2014.     JMP    NOTVLD
  2015. GETANSRT:
  2016.     RET
  2017. ;
  2018. THEREF:
  2019.     CALL    ILPRT
  2020.     DB    'Therefore -',CR,LF,0
  2021.     RET
  2022. ;
  2023. XOFFMSG:
  2024.     CALL    ILPRT
  2025.     DB    'XOFF testing ',0
  2026.     MOV    AL,XOFFTST
  2027.     OR    AL,AL
  2028.     JNZ    XOTSTON
  2029.     CALL    ILPRT
  2030.     DB    'NOT ',0
  2031. XOTSTON:
  2032.     CALL    ILPRT
  2033.     DB    'used',0
  2034. XONMSG3:
  2035.     CALL    ILPRT
  2036.     DB    ' in terminal mode file output',CR,LF,0
  2037.     RET
  2038. ;
  2039. XONMSG:
  2040.     CALL    ILPRT
  2041.     DB    'XON ',0
  2042.     MOV    AL,XONWAIT
  2043.     OR    AL,AL
  2044.     JNZ    XONMSG2
  2045.     CALL    ILPRT
  2046.     DB    'NOT ',0
  2047. XONMSG2:
  2048.     CALL    ILPRT
  2049.     DB    'automatically tested after <CR>',0
  2050.     JMP    XONMSG3
  2051. ;
  2052. SETUPENT:
  2053.     MOV    AL,SETUPTST
  2054.     OR    AL,AL
  2055.     JNZ    SETUPENT1
  2056.     JMP    NOTVLD
  2057. SETUPENT1:
  2058.     CALL    SETUPR
  2059.     JMP    XPRT
  2060. ;
  2061. NEWFILE:
  2062.     MOV    AL,NFILFLG
  2063.     OR    AL,AL
  2064.     JNZ    NOFILOPN    
  2065.     MOV    AL,FCB3+1        ;CHECK THAT FILE WAS REQUESTED
  2066.     CMP    AL,' '
  2067.     JZ    NOFILOPN        ;IF NO FILE, DON'T ERASE
  2068.     MOV    DX,OFFSET FCB3
  2069.     MOV    CL,ERASE
  2070.     CALL    BDOSRT
  2071.     MOV    AL,TRUE            ;DO NOT ALLOW TERMINAL..
  2072.     MOV    NFILFLG,AL        ;..SAVE SINCE NO FILE..
  2073.     NOT    AL            ;..SPECIFIED.
  2074.     MOV    SAVEFLG,AL
  2075.     MOV    BX,OFFSET FCB3
  2076.     CALL    INITFCBS
  2077.     MOV    BX,OFFSET BOTTRAM
  2078.     MOV    HLSAVE,BX
  2079.     JMP    XPRT
  2080. ;
  2081. WRTFIL:
  2082.     CMP    NFILFLG,TRUE
  2083.     JZ    NOFILOPN
  2084.     MOV    AL,FCB3+1        ;CHECK THAT FILE WAS REQUESTED
  2085.     CMP    AL,' '
  2086.     JZ    NOFILOPN
  2087.     MOV    BX,HLSAVE
  2088.     CALL    NUMRECS            ;DISK WRITE ROUTINE AS USED IN..
  2089.     CALL    WRTDSK            ;..IN THE INTDSKSV ROUTINE.
  2090.     CALL    CLOSE3
  2091.     MOV    NFILFLG,TRUE
  2092.     MOV    SAVEFLG,FALSE
  2093.     MOV    BX,OFFSET FCB3
  2094.     CALL    INITFCBS             ;BLANK OUT FCB SO WRITTEN..
  2095.                         ;..FILE CAN'T BE ERASED
  2096.     MOV    BX,OFFSET BOTTRAM
  2097.     MOV    HLSAVE,BX
  2098.     JMP    XPRT
  2099. ;
  2100. NOFILOPN:
  2101.     CALL    ILPRT
  2102.     DB    '++ No File Open ++',CR,LF,BELL,0
  2103.     JMP    XPRT
  2104. ;
  2105. COMPARE:
  2106.     MOV    CH,BYTE PTR [BX]    ;COMPARES A-REG WITH LIST..
  2107. COMPLP:
  2108.     INC    BX            ;..ADDRESSED BY HL. FIRST ELEMENT..
  2109.     CMP    AL,BYTE PTR [BX]    ;..OF LIST MUST BE NUMBER OF ELEMENTS..
  2110.     JZ    VALID            ;..BEING COMPARED. RETURNS WITH..
  2111.     DEC    CH            ;..CARRY SET IF A-REG DOES NOT..
  2112.     JNZ    COMPLP            ;.. CONTAIN AN ELEMENT IN LIST.
  2113.     STC
  2114. VALID:
  2115.     RET
  2116. ;
  2117. NXTSCRN:
  2118.     CALL    ILPRT
  2119.     DB    'HIT any KEY to CONTINUE',0
  2120. NOKEY1:
  2121.     CALL    STAT                ;GET KEYBOARD STATUS
  2122.     JZ    NOKEY1                ;KEEP LOOPING UNTIL KEYPRESS
  2123.     CALL    KEYIN                ;GOBBLE UP KEYPRESS
  2124.     CALL    CLRTST
  2125.     RET
  2126. ;
  2127. CLRTST:
  2128.     TEST    SCRNTEST,0FFH
  2129.     JZ    LOTSALF
  2130.     CALL    CLRSCRN
  2131.     RET
  2132. ;
  2133. LOTSALF:
  2134.     MOV    AL,CR
  2135.     CALL    TIPE
  2136.     MOV    CH,12
  2137.     MOV    AL,LF
  2138. LFLOOP:
  2139.     CALL    TIPE
  2140.     DEC    CH
  2141.     JNZ    LFLOOP
  2142.     RET    
  2143. ;
  2144. CURPAR:
  2145.     CALL    CLRTST
  2146.     CALL    ILPRT
  2147.     DB    '                Current Settings',CR,LF,LF,LF,0
  2148.     MOV    AL,CKSUMDFLT
  2149.     CALL    TOGCRC2
  2150.     MOV    AL,LSTTST
  2151.     OR    AL,AL
  2152.     JZ    NOLST3
  2153.     CALL    LSTMSG
  2154. NOLST3:
  2155.     CALL    DETCAR
  2156.     CALL    SETTIM2
  2157.     CALL    TOGBKSP2
  2158.     CALL    TOGLF2
  2159.     CALL    TOGLOC2
  2160.     CALL    ILPRT
  2161.     DB    'Terminal mode file buffer is ',0
  2162.     TEST    NFILFLG,0FFH
  2163.     JZ    ACTIVE
  2164.     CALL    ILPRT
  2165.     DB    'in',0
  2166. ACTIVE:
  2167.     CALL    ILPRT
  2168.     DB    'active',CR,LF,'Unused portion of buffer is ',0
  2169.     CALL    GETSPC
  2170.     CALL    ILPRT
  2171.     DB    ' bytes',CR,LF,0
  2172.     TEST    SETUPTST,0FFH
  2173.     JZ    NOSETP
  2174.     CALL    GIVEPRM
  2175. NOSETP:
  2176.     CALL    TOGSTL2
  2177.     CALL    TOGTEOF2
  2178.     CALL    XOFFMSG
  2179.     CALL    XONMSG
  2180.     CALL    ECHMSG
  2181.     CALL    SPDMSG
  2182.     CALL    CRDLYMSG
  2183.     CALL    CRLF
  2184.     JMP    XPRT
  2185. ;
  2186. GETSPC:
  2187.     CALL    GETMAX
  2188.     MOV    CH,AL
  2189.     MOV    BX,HLSAVE
  2190.     STC
  2191.     CMC
  2192.     MOV    AL,0
  2193.     SBB    AL,BL
  2194.     MOV    BL,AL
  2195.     MOV    AL,CH
  2196.     SBB    AL,BH
  2197.     MOV    BH,AL
  2198.     CALL    DECOUT
  2199.     RET
  2200. ;
  2201. TFOMENU:
  2202.     CALL    CLRTST
  2203.     CALL    ILPRT
  2204.     DB    '     Commands for Setting Terminal Mode File Output'
  2205.     DB    ' Parameters',CR,LF,LF,LF
  2206.     DB    'SPD - Set speed of file output',CR,LF
  2207.     DB    'TEF - Toggle transmission of end-of-file character',CR,LF,0
  2208.     MOV    AL,TOGSLF
  2209.     OR    AL,AL
  2210.     JZ    NOTOGSLF
  2211.     CALL    ILPRT
  2212.     DB    'TSL - Toggle stripping linefeeds',CR,LF
  2213.     DB    'TWE - Toggle wait for character echo',CR,LF,0
  2214. ;
  2215. NOTOGSLF:
  2216.     TEST    TOGXOFF,0FFH
  2217.     JZ    NOTOGXOFF
  2218.     CALL    ILPRT
  2219.     DB    'TXF - Toggle XOFF testing',CR,LF
  2220.     DB    'TXN - Toggle XON waiting after <CR>',CR,LF,LF,LF,0
  2221. ;
  2222. NOTOGXOFF:
  2223.     JMP    XPRT
  2224. ;    
  2225. TOGTEOF:
  2226.     NOT    EOFSEND
  2227.     CALL    TOGTEOF2
  2228.     JMP    XPRT
  2229. ;
  2230. TOGTEOF2:
  2231.     CALL    ILPRT
  2232.     DB    'End-of-file character ',0
  2233.     TEST    EOFSEND,0FFH
  2234.     JNZ    EOFMSG
  2235.     CALL    ILPRT
  2236.     DB    'NOT ',0
  2237. EOFMSG:
  2238.     CALL    ILPRT
  2239.     DB    'sent in terminal mode file output',CR,LF,0
  2240.     RET
  2241. ;
  2242. ;
  2243. ;THIS ROUTINE DISPLAYS THE PHONE NUMBERS IN THE LIBRARY
  2244. ;
  2245. NUMPRN:
  2246.     PUSH    BX
  2247.     CALL    CLRTST
  2248.     CALL    ILPRT
  2249.     DB    '           Library of Phone Numbers of Remote Systems',0
  2250.     MOV    CL,13                   ;NUMBER OF LINES TO MOVE
  2251.     MOV    BX,OFFSET NUMBLIB          ;ADDRESS OF SOURCE MEMORY
  2252.     MOV    DX,OFFSET DBUF             ;ADDRESS OF TARGET MEMORY
  2253.     CALL    NEWLINE                ;START WITH CRLF
  2254.     XCHG    BX,DX
  2255.     MOV    BYTE PTR [BX],AL        ;+LF
  2256.     XCHG    BX,DX
  2257.     INC    DX                      ;AND BUMP IT
  2258. NUMPRN1:
  2259.     INC    BX        ;SKIP PMMI DIALING LETTER
  2260.     INC    BX        ;AND EQUAL SIGN
  2261.     MOV    CH,30        ;NUMBER OF BYTES TO MOVE
  2262.     CALL    MOVE        ;MOVE TO BUFFER
  2263.     CALL    SPACES        ;2 ENTRIES + 3 SPACES = 63 CHARACTERS
  2264.     INC    BX
  2265.     INC    BX
  2266.     MOV    CH,30
  2267.     CALL    MOVE
  2268.     CALL    NEWLINE
  2269.     DEC    CL            ;NUMBER OF LINES TO PRINT
  2270.     JZ    NUMPRN2
  2271.     JMP    NUMPRN1
  2272. ;
  2273. NEWLINE:                ;PUTS CR-LF AT MEMORY POINTED BY 'DE'
  2274.     MOV    AL,CR            ;CR
  2275.     XCHG    BX,DX
  2276.     MOV    BYTE PTR [BX],AL
  2277.     MOV    AL,LF            ;LF
  2278.     INC    BX            ;BUMP POINTER
  2279.     MOV    BYTE PTR [BX],AL    ;STORE LF
  2280.     XCHG    BX,DX
  2281.     INC    DX            ;BUMP POINTER
  2282.     RET
  2283. ;
  2284. SPACES:
  2285.     MOV    AL,20H    ;SPACE
  2286.     XCHG    BX,DX
  2287.     MOV    BYTE PTR [BX],AL    ;1
  2288.     INC    BX
  2289.     MOV    BYTE PTR [BX],AL    ;2
  2290.     INC    BX
  2291.     MOV    BYTE PTR [BX],AL    ;3
  2292.     INC    BX
  2293.     XCHG    BX,DX
  2294.     RET
  2295. ;
  2296. NUMPRN2:
  2297.     MOV    AL,'$'
  2298.     XCHG    BX,DX
  2299.     MOV    BYTE PTR [BX],AL
  2300.     XCHG    BX,DX
  2301.     MOV    CL,PRINT
  2302.     MOV    DX,OFFSET DBUF        ;POINT TO TABLE OF NUMBERS TO PRINT
  2303.     INT    224
  2304.     CALL    CRLF
  2305.     CALL    CRLF
  2306.     POP    BX
  2307.     JMP    XPRT
  2308. ;
  2309. ;
  2310. ;        CONSOLE.A86
  2311. ;
  2312. DBIOS        EQU    50    ;Access BIOS through BDOS
  2313. DCONSTAT    EQU    2    ;BIOS console status
  2314. DCONIN        EQU    3    ;BIOS console input
  2315. DCONOUT        EQU    4    ;BIOS console out
  2316. DLIST        EQU    5    ;BIOS list out
  2317. DLISTST        EQU    15    ;BIOS list status
  2318. ;    
  2319. ;Console I/O routines for MODEM9.xx.
  2320. ;
  2321. SHOW:
  2322.     CMP    AL,LF
  2323.     JZ    CTYPE
  2324.     CMP    AL,CR
  2325.     JZ    CTYPE
  2326.     CMP    AL,9
  2327.     JZ    CTYPE
  2328.     CMP    AL,' '
  2329.     JC    SHOWHEX
  2330.     CMP    AL,7FH
  2331.     JC    CTYPE
  2332. SHOWHEX:
  2333.     PUSH    AX
  2334.     MOV    AL,'('
  2335.     CALL    CTYPE
  2336.     POP    AX
  2337.     CALL    HEXO
  2338.     MOV    AL,')'
  2339.     JMP    CTYPE
  2340. ;
  2341. CTYPE:
  2342.     PUSH    CX
  2343.     PUSH    DX
  2344.     PUSH    BX
  2345.     MOV    DL,AL
  2346.     MOV    CL,WRCON
  2347.     INT    224
  2348.     POP    BX
  2349.     POP    DX
  2350.     POP    CX
  2351.     RET
  2352. ;
  2353. CRLF:
  2354.     PUSH    AX
  2355.     MOV    AL,CR
  2356.     CALL    TIPE
  2357.     MOV    AL,LF
  2358.     CALL    TIPE
  2359.     POP    AX
  2360.     RET
  2361. ;
  2362. TIPE:
  2363.     PUSH    SI
  2364.     PUSH    CX
  2365.     PUSH    DX
  2366.     PUSH    BX
  2367.     MOV    Byte Ptr TBLOCK1,AL
  2368.     MOV    CL,DBIOS
  2369.     MOV    DX,Offset TIPEBLOCK
  2370.     INT    224
  2371.     POP    BX
  2372.     POP    DX
  2373.     POP    CX
  2374.     POP    SI
  2375.     RET
  2376. ;
  2377. TIPEBLOCK    DB    DCONOUT
  2378. TBLOCK1        DW    0
  2379.         DW    0    
  2380. ;
  2381. STAT:
  2382.     PUSH    CX
  2383.     PUSH    DX
  2384.     PUSH    BX
  2385.     MOV    CL,DBIOS
  2386.     MOV    DX,Offset STATBLOCK
  2387.     INT    224
  2388.     POP    BX
  2389.     POP    DX
  2390.     POP    CX
  2391.     OR    AL,AL
  2392.     RET
  2393. ;
  2394. STATBLOCK:
  2395.     DB    DCONSTAT
  2396.     DW    0
  2397.     DW    0
  2398. ;
  2399. KEYIN:
  2400.     PUSH    CX
  2401.     PUSH    DX
  2402.     PUSH    BX
  2403. KEYIN1:
  2404.     MOV    CL,DBIOS
  2405.     MOV    DX,Offset KEYBLOCK
  2406.     INT    224
  2407.     POP    BX
  2408.     POP    DX
  2409.     POP    CX
  2410.     RET
  2411. ;
  2412. KEYBLOCK:
  2413.     DB    DCONIN
  2414.     DW    0
  2415.     DW    0
  2416. ;
  2417. LISTER:
  2418.     PUSH    CX
  2419.     PUSH    DX
  2420.     PUSH    BX
  2421.     MOV    CH,0            ; MJM 9.01.05
  2422.     MOV    LBLOCK1,CX        ; MJM 9.01.05
  2423.     MOV    DX,Offset LSTBLOCK
  2424.     MOV    CL,DBIOS
  2425.     INT    224
  2426.     POP    BX
  2427.     POP    DX
  2428.     POP    CX
  2429.     RET
  2430. ;
  2431. LSTBLOCK    DB    DLIST
  2432. LBLOCK1        DW    0
  2433.         DW    0
  2434. ;
  2435. LSTSTAT:
  2436.     PUSH    CX
  2437.     PUSH    DX
  2438.     PUSH    BX
  2439.     MOV    DX, OFFSET LSTSTATBLOCK
  2440.     MOV    CL,DBIOS
  2441.     INT    224
  2442.     POP    BX
  2443.     POP    DX
  2444.     POP    CX
  2445.     OR    AL,AL
  2446.     RET
  2447.  
  2448. LSTSTATBLOCK:
  2449.     DB    DLISTST
  2450.     DW    0
  2451.     DW    0
  2452. ;
  2453. ;
  2454. UCASE:
  2455.     CMP    AL,61H        ;CHANGES LOWER CASE CHARACTER..
  2456.     JC    UCASERET    ;..IN 'AL' REG TO UPPER CASE.
  2457.     CMP    AL,7BH
  2458.     JNC    UCASERET
  2459.     AND    AL,5FH
  2460. UCASERET:
  2461.     RET
  2462. ;
  2463. DECOUT:
  2464.     PUSH    AX
  2465.     PUSH    CX
  2466.     PUSH    DX
  2467.     PUSH    BX
  2468.     MOV    CX, -10
  2469.     MOV    DX, -1
  2470. DECOU2:
  2471.     ADD    BX,CX
  2472.     INC    DX
  2473.     JC    DECOU2
  2474.     MOV    CX,OFFSET 10
  2475.     ADD    BX,CX
  2476.     XCHG    BX,DX
  2477.     MOV    AL,BH
  2478.     OR    AL,BL
  2479.     JZ    DECOU3
  2480.     CALL    DECOUT
  2481. DECOU3:
  2482.     MOV    AL,DL
  2483.     ADD    AL,'0'
  2484.     CALL    CTYPE
  2485.     POP    BX
  2486.     POP    DX
  2487.     POP    CX
  2488.     POP    AX
  2489.     RET
  2490. ;
  2491. ;---->    DHXOUT: - DOUBLE PRECISION HEX OUTPUT ROUTINE.
  2492. ;
  2493. DHXOUT:
  2494.     PUSH    BX
  2495.     PUSH    AX
  2496.     MOV    AL,BH        ;GET MS BYTE
  2497.     CALL    HEXO        ;OUTPUT HIGH ORDER BYTE
  2498.     MOV    AL,BL        ;GET LS BYTE
  2499.     CALL    HEXO        ;OUTPUT LOW ORDER BYTE
  2500.     POP    AX
  2501.     POP    BX
  2502.     RET
  2503. ;
  2504. HEXO:
  2505.     PUSH    AX
  2506.     RCR    AL,1
  2507.     RCR    AL,1
  2508.     RCR    AL,1
  2509.     RCR    AL,1
  2510.     CALL    NIBBL
  2511.     POP    AX
  2512. NIBBL:
  2513.     AND    AL,0FH
  2514.     CMP    AL,10
  2515.     JC    ISNUM
  2516.     ADD    AL,7
  2517. ISNUM:
  2518.     ADD    AL,'0'
  2519.     JMP    TIPE
  2520. ;
  2521. SHFTYPE:
  2522.     PUSH    AX
  2523.     CALL    ILPRT
  2524.     DB    'ctrl-',0
  2525.     POP    AX
  2526.     ADD    AL,40H
  2527.     CALL    TIPE
  2528. ;
  2529. ;WRITE A STRING OF CHARACTERS
  2530. ;
  2531. ILPRT:
  2532.     POP    SI
  2533. ILPLP:
  2534.     LODS    BYTE PTR [SI]
  2535.     OR    AL,AL
  2536.     JZ    ILPRET
  2537. ;    CALL    TIPE            ;                @DH
  2538.     CALL    CTYPE            ;CTYPE expands tabs        @DH
  2539.     JMPS    ILPLP
  2540. ILPRET:
  2541.     PUSH    SI
  2542.     RET
  2543. ;
  2544. ;WRITE A STRING OF CHARACTERS EXCEPT IN QUIET MODE
  2545. ;
  2546. ILPRTQ:
  2547.     POP    SI
  2548. ILPLPQ:
  2549.     LODS    BYTE PTR [SI]
  2550.     OR    AL,AL
  2551.     JZ    ILPRETQ
  2552.     TEST    QFLG,0FFH
  2553.     JZ    ILPLPQ1
  2554. ;    CALL    TIPE            ;                @DH
  2555.     CALL    CTYPE            ;CTYPE expands tabs        @DH
  2556. ILPLPQ1:
  2557.     JMPS    ILPLPQ
  2558. ILPRETQ:
  2559.     PUSH    SI
  2560.     RET
  2561. ;
  2562.  
  2563. ;
  2564. ;Duplicates 'read buffer' routine same as CP/M function 10,
  2565. ;but does not use CTL-C (reason for the routine).  Does
  2566. ;allow controls U, R, E and H (backspace).  Outputs bell if
  2567. ;the input is greater than the buffer.
  2568. ;
  2569. INBUFF:
  2570.     LAHF
  2571.     XCHG    AL,AH
  2572.     PUSH    AX
  2573.     XCHG    AL,AH
  2574.     PUSH    BX
  2575.     PUSH    CX
  2576.     PUSH    DX            ;'DX' REGISTERS MUST BE PUSHED LAST
  2577. ISTART:
  2578.     CALL    CLEAR            ;CLEAR THE BUFFER AREA
  2579.     POP    DX            ;GET ADDRESS OF BUFFER ON RETRIES
  2580.     PUSH    DX            ;RESTORE STACK
  2581.     XOR    AL,AL
  2582.     LAHF                ;ADDRESS COUNT FIELD
  2583.     INC    DX
  2584.     SAHF
  2585.     MOV    SI,DX            ;INITIALIZE WITH A ZERO IN COUNT BYTE
  2586.     MOV    [SI],AL
  2587.     LAHF
  2588.     INC    DX
  2589.     SAHF
  2590.     XCHG    BX,DX            ;ADDRESS FIRST BUFFER BYTE WITH 'BX'
  2591. INBUFA:
  2592.     CALL    CONIN
  2593.     CMP    AL,CR            ;IS IT A RETURN?
  2594.     JNZ    INBUFA_1    
  2595.     JMP    INBUFR            ;IF SO, THEN RETURN
  2596. INBUFA_1:
  2597.     CMP    AL,7FH            ;IS IT A DELETE?
  2598.     JZ    DELETE
  2599.     CMP    AL,8            ;CTL-H WILL BACKSPACE..
  2600.     JZ    DELETE            ;..OVER DELETED CHAR.
  2601.     CMP    AL,'U'-40H        ;IS IT A CTL-U
  2602.     JNZ    INBUFA_2    
  2603.     JMP    INBUFO            ;OUTPUT # CR-LF AND START OVER
  2604. INBUFA_2:
  2605.     CMP    AL,'R'-40H        ;CTL-R RETYPES LINE
  2606.     JNZ    INBUFA_3    
  2607.     JMP    RETYPE
  2608. INBUFA_3:
  2609.     CMP    AL,'E'-40H
  2610.     JNZ    INBUFA_4    
  2611.     JMP    CRLF
  2612. INBUFA_4:
  2613.     CMP    AL,' '            ;NO CONTROL CHARACTERS OTHER..
  2614.     JB    INBUFA            ;..THAN ABOVE ALLOWED.
  2615.     MOV    CH,AL            ;SAVE INPUTTED CHARACTER
  2616.     XCHG    BX,DX            ;SAVE 'BX' IN 'DX'
  2617.     POP    BX            ;GET ADDRESS OF BUFFER IN 'BX'
  2618.     PUSH    BX            ;RESTORE STACK
  2619.     INC    BX            ;ADDRESS COUNT BYTE
  2620.     INC    Byte Ptr [BX]        ;INCREASE COUNT BYTE
  2621.     DEC    BX            ;ADDRESS MAXIMUM
  2622.     MOV    AL,Byte Ptr [BX]    ;PUT MAXIMUM IN 'AL'
  2623.     INC    BX            ;ADDRESS COUNT
  2624.     CMP    AL,Byte Ptr [BX]    ;COMPARE COUNT TO MAXIMUM
  2625.     JNB    INBUFA_5    
  2626.     JMP    ALERT            ;IF MAXIMUM, RING BELL AND WAIT FOR CR
  2627. INBUFA_5:
  2628.     XCHG    BX,DX            ;RESTORE BUFFER POINTER TO 'BX'
  2629.     MOV    Byte Ptr [BX],CH    ;PUT INPUTTED CHARACTER IN BUFFER
  2630.     MOV    AL,CH            ;OUTPUT IT
  2631.     CALL    TIPE
  2632.     LAHF                ;BUMP POINTER
  2633.     INC    BX
  2634.     SAHF
  2635.     JMPS    INBUFA            ;GET NEXT CHARACTER
  2636. ;
  2637. DELETE:
  2638.     XCHG    BX,DX            ;SAVE BUFFER POINTER IN 'DX'
  2639.     POP    BX            ;ADDRESS BEGINNING OF BUFFER
  2640.     PUSH    BX            ;RESTORE STACK
  2641.     INC    BX            ;ADDRESS COUNT FIELD
  2642.     MOV    CH,AL            ;SAVE DELETE CHAR - 7FH OR 08H
  2643.     MOV    AL,Byte Ptr [BX]
  2644.     SUB    AL,1            ;DECREASE COUNT
  2645.     MOV    Byte Ptr [BX],AL
  2646.     JB    NODEL            ;DON'T DELETE PAST BEGINING OF BUFFER.
  2647.     XCHG    BX,DX            ;RESTORE BUFFER POINTER TO 'BX'
  2648.     DEC    BX            ;POINT TO LAST BYTE INPUTTED
  2649.     MOV    AL,CH            ;GET BACK EITHER 7FH OR 08H
  2650.     MOV    CH,Byte Ptr [BX]    ;GET CHARACTER BEING DELETED
  2651.     MOV    Byte Ptr [BX],' '    ;RESTORE BLANK
  2652.     CMP    AL,8
  2653.     JZ    BKSPC
  2654.     CMP    AL,7FH
  2655.     JZ    BKSPC0
  2656.     JMP    INBUFA            ;GET NEXT CHARACTER
  2657. ;
  2658. NODEL:
  2659.     INC    Byte Ptr [BX]        ;DON'T LEAVE COUNT NEGATIVE
  2660.     XCHG    BX,DX            ;RESTORE POINTER TO 'BX'
  2661.     JMP    INBUFA
  2662. ;
  2663. BKSPC0:
  2664.     MOV    AL,08H
  2665. BKSPC:
  2666.     CALL    TIPE            ;TRUE ERASE IF 08H
  2667.     MOV    AL,' '
  2668.     CALL    TIPE
  2669.     MOV    AL,8
  2670.     CALL    TIPE
  2671.     JMP    INBUFA
  2672. ;
  2673. INBUFO:
  2674.     MOV    AL,'#'
  2675.     CALL    TIPE
  2676.     CALL    CRLF
  2677.     JMP    ISTART
  2678. ;
  2679. RETYPE:
  2680.     POP    DX
  2681.     PUSH    DX
  2682.     LAHF                ;POINT TO CURRENT NUMBER..
  2683.     INC    DX
  2684.     SAHF
  2685.     MOV    SI,DX            ;..OF CHARACTERS.
  2686.     MOV    AL,[SI]
  2687.     MOV    CH,AL
  2688.     MOV    AL,'#'
  2689.     CALL    TIPE
  2690.     CALL    CRLF
  2691.     MOV    AL,CH            ;TEST IF ZERO INPUT
  2692.     OR    AL,AL
  2693.     JNZ    CTLRLP    
  2694.     JMP    INBUFA
  2695. CTLRLP:
  2696.     LAHF
  2697.     INC    DX
  2698.     SAHF
  2699.     MOV    SI,DX
  2700.     MOV    AL,[SI]
  2701.     CALL    TIPE
  2702.     DEC    CH
  2703.     JNZ    CTLRLP
  2704.     JMP    INBUFA
  2705. ;    
  2706. ALERT:
  2707.     MOV    AL,7
  2708.     CALL    TIPE
  2709.     DEC    Byte Ptr [BX]
  2710.     XCHG    BX,DX
  2711.     JMP    INBUFA
  2712. ;
  2713. PCRLF:
  2714.     CALL    CRLF
  2715.     JMP    INBUFA
  2716. ;
  2717. INBUFR:
  2718.     CALL    CRLF
  2719.     POP    DX
  2720.     POP    CX
  2721.     POP    BX
  2722.     POP    AX
  2723.     XCHG    AL,AH
  2724.     SAHF
  2725.     RET
  2726. ;
  2727. CLEAR:
  2728.     POP    DX            ;ACCOUNTS FOR CALL
  2729.     POP    BX            ;ADDRESS BUFFER IN 'BX'
  2730.     PUSH    BX            ;RESTORE..
  2731.     PUSH    DX            ;..STACK
  2732.     MOV    CH,Byte Ptr [BX]    ;SAVE MAXIMUM IN 'CH'
  2733.     LAHF                ;POINT TO FIRST..
  2734.     INC    BX
  2735.     SAHF
  2736.     LAHF                ;..BUFFER BYTE.
  2737.     INC    BX
  2738.     SAHF
  2739.     MOV    AL,' '
  2740. CLEARL:
  2741.     MOV    Byte Ptr [BX],AL
  2742.     LAHF
  2743.     INC    BX
  2744.     SAHF
  2745.     DEC    CH
  2746.     JNZ    CLEARL
  2747.     RET
  2748. ;
  2749. CONIN:
  2750.     CALL    KEYIN
  2751.     CMP    AL,61H            ;CHANGE TO UPPER..
  2752.     JB    NOUCASE            ;..CASE SINCE CP/M..
  2753.     CMP    AL,7BH            ;..DOES THE SAME.
  2754.     JNB    NOUCASE
  2755.     AND    AL,5FH
  2756. NOUCASE:
  2757.     RET
  2758. ;
  2759. ;Parses a CP/M buffer into format same as CP/M command line.
  2760. ;
  2761. ;Loads a command line addressed by 'DX' registers (max # characters in
  2762. ;line in 'DX', number of characters in the line in 'DX'+1, line starts
  2763. ;in 'DX'+2) into FCB addressed by 'BX' registers.  The FCB should be at
  2764. ;least 33 bytes in length.  The command line buffer must have a maximum
  2765. ;length of at least one more than the greatest number of characters
  2766. ;that will be needed.
  2767. ;
  2768. CPMLINE:
  2769.     PUSH    AX
  2770.     PUSH    CX
  2771.     PUSH    DX
  2772.     PUSH    BX
  2773.     CALL    CINIT            ;FILLS FCBS WITH BLANKS AND NULLS
  2774.     XCHG    BX,DX            ;GET START OF COMMAND LINE IN 'BX'
  2775.     INC    BX            ;ADDRESS # BYTES IN CMD LINE
  2776.     MOV    DL,BYTE PTR [BX]     ;LOAD 'DX' PAIR WITH # BYTES
  2777.     MOV    DH,0
  2778.     INC    BX
  2779.     ADD    BX,DX            ;POINT TO BYTE AFTER LAST CHAR..
  2780.     MOV    BYTE PTR [BX],CR     ;..IN CMD LINE AND STORE DELIMITER
  2781.     POP    BX            ;RESTORE 'BX' AND 'DX'
  2782.     POP    DX
  2783.     PUSH    DX
  2784.     PUSH    BX
  2785.     INC    DX            ;ADDRESS START OF COMMAND
  2786.     INC    DX
  2787.     CALL    DRIVE
  2788. NAME1:
  2789.     MOV    CL,8        ;TRANSFER FIRST FILENAME TO FCB
  2790.     CALL    TRANS
  2791.     CMP    AL,CR
  2792.     JZ    CDONE
  2793.     CMP    AL,' '        ;IF SPACE, THEN START OF..
  2794.     JZ    NAME2        ;..SECOND FILENAME.
  2795. TYPE1:
  2796.     POP    BX        ;FILETYPE MUST BE AFTER..
  2797.     PUSH    BX        ;..EIGHTH BYTE OF NAME
  2798.     MOV    CX, 9
  2799.     ADD    BX,CX
  2800.     MOV    CL,3        ;TRANSFER TYPE OF FIRST FILE
  2801.     CALL    TRANS
  2802.     CMP    AL,CR
  2803.     JZ    CDONE
  2804. NAME2:
  2805.     XCHG    BX,DX
  2806.     MOV    AL,BYTE PTR [BX]    ;EAT MULTIPLE SPACES..
  2807.     XCHG    BX,DX
  2808.     CMP    AL,' '            ;..BETWEEN NAMES
  2809.     JNZ    NAME2C
  2810.     INC    DX
  2811.     JMP    NAME2
  2812. NAME2C:
  2813.     POP    BX        ;SECOND NAME STARTS IN 16TH BYTE
  2814.     PUSH    BX        ;POINT 'BX' TO THIS BYTE
  2815.     MOV    CX, 16
  2816.     ADD    BX,CX
  2817.     CALL    DRIVE
  2818.     MOV    CL,8
  2819.     CALL    TRANS
  2820.     CMP    AL,CR
  2821.     JZ    CDONE
  2822. TYPE2:
  2823.     POP    BX            ;SECOND TYPE STARTS IN 25TH BYTE.
  2824.     PUSH    BX
  2825.     MOV    CX,OFFSET 25
  2826.     ADD    BX,CX
  2827.     MOV    CL,3
  2828.     CALL    TRANS
  2829. CDONE:
  2830.     POP    BX
  2831.     PUSH    BX
  2832.     INC    BX        ;POINT TO 1ST CHAR OF 1ST NAME IN FCB
  2833.     CALL    CSCAN        ;CHECK FOR * (AMBIGUOUS NAMES).
  2834.     POP    BX
  2835.     PUSH    BX
  2836.     MOV    CX,OFFSET 17    ;POINT TO 1ST CHAR OF 2ND NAME IN FCB.
  2837.     ADD    BX,CX
  2838.     CALL    CSCAN
  2839.     POP    BX
  2840.     POP    DX
  2841.     POP    CX
  2842.     POP    AX
  2843.     RET
  2844. ;
  2845. CINIT:
  2846.     PUSH    BX        ;INITIALIZES FCB WITH 1 NULL (FOR 1ST DRIVE),..
  2847.     PUSH    CX        ;..11 BLANKS, 4 NULLS, 1 NULL (FOR 2ND DRIVE)..
  2848.     MOV    BYTE PTR [BX],0      ;..11 BLANKS, AND 4 NULLS
  2849.     INC    BX
  2850.     MOV    CH,11
  2851.     MOV    AL,' '
  2852.     CALL    INITFILL
  2853.     MOV    CH,5
  2854.     MOV    AL,0
  2855.     CALL    INITFILL
  2856.     MOV    CH,11
  2857.     MOV    AL,' '
  2858.     CALL    INITFILL
  2859.     MOV    CH,4
  2860.     MOV    AL,0
  2861.     CALL    INITFILL
  2862.     POP    CX
  2863.     POP    BX
  2864.     RET
  2865. ;
  2866. INITFILL:
  2867.     MOV    BYTE PTR [BX],AL
  2868.     INC    BX
  2869.     DEC    CH
  2870.     JNZ    INITFILL
  2871.     RET
  2872. ;
  2873. DRIVE:
  2874.     INC    DX            ;CHECK 2ND BYTE OF FILENAME. IF IT..
  2875.     XCHG    BX,DX
  2876.     MOV    AL,BYTE PTR [BX]    ;..IS A ":", THEN DRIVE WAS SPECIFIED
  2877.     XCHG    BX,DX
  2878.     DEC    DX
  2879.     CMP    AL,':'
  2880.     JNZ    DEFDR        ;ELSE ZERO FOR DEFAULT DRIVE ('INIT' PUT ZERO)
  2881.     XCHG    BX,DX
  2882.     MOV    AL,BYTE PTR [BX]
  2883.     XCHG    BX,DX
  2884.     AND    AL,5FH
  2885.     SUB    AL,40H            ;CALCULATE DRIVE (A=1, B=2,...)..
  2886.     MOV    BYTE PTR [BX],AL    ;..AND PLACE IT IN FCB
  2887.     INC    DX            ;ADDRESS FIRST BYTE OF..
  2888.     INC    DX            ;..IN CMD LINE..
  2889. DEFDR:
  2890.     INC    BX            ;..AND NAME FIELD IN FCB
  2891. DEFDRRET:
  2892.     RET
  2893. ;
  2894. TRANS:
  2895.     XCHG    BX,DX
  2896.     MOV    AL,BYTE PTR [BX]
  2897.     XCHG    BX,DX            ;TRANSFER FROM CMD LINE TO FCB..
  2898.     INC    DX            ;..UP TO NUMBER OF CHARS SPECIFIED..
  2899.     CMP    AL,CR            ;..BY 'CL' REG. KEEP SCANNING FIELD..
  2900.     JZ    DEFDRRET           ;..WITHOUT TRANSFER UNTIL A DELIMITING..
  2901.     CMP    AL,'.'            ;..FIELD CHAR SUCH AS '.', BLANK, OR..
  2902.     JZ    DEFDRRET        ;..C/R (FOR END OF CMD LINE)
  2903.     CMP    AL,' '
  2904.     JZ    DEFDRRET
  2905.     DEC    CL
  2906.     JB    TRANS        ;ONCE 'CL' REG IS LESS THAN '0' KEEP READING
  2907.     MOV    BYTE PTR [BX],AL    ;..CMD LINE BUT DO NOT TRANSFER TO FCB
  2908.     INC    BX
  2909.     JMP    TRANS
  2910. ;
  2911. CSCAN:
  2912.     MOV    CH,8            ;SCAN FILE NAME ADDRESSED BY 'BX'
  2913. TSTNAM:
  2914.     MOV    AL,BYTE PTR [BX]
  2915.     CMP    AL,'*'            ;IF '*' FOUND, FILL IN REST OF FIELD..
  2916.     JZ    FILL1            ;..WITH '?' FOR AMBIGUOUS NAME
  2917.     INC    BX
  2918.     DEC    CH
  2919.     JNZ    TSTNAM
  2920.     JMP    TSTTYP
  2921. ;
  2922. FILL1:
  2923.     CALL    FILL
  2924. TSTTYP:
  2925.     MOV    CH,3            ;SCAN AND FILL TYPE FIELD FOR NAME..
  2926. TSTTYPL:
  2927.     MOV    AL,BYTE PTR [BX]    ;..SPECIFIED ABOVE
  2928.     CMP    AL,'*'
  2929.     JZ    FILL2
  2930.     INC    BX
  2931.     DEC    CH
  2932.     JZ    FILL2RET
  2933.     JMP    TSTTYPL
  2934. ;
  2935. FILL2:
  2936.     CALL    FILL
  2937. FILL2RET:
  2938.     RET
  2939. ;
  2940. FILL:
  2941.     MOV    BYTE PTR [BX],'?'    ;ROUTINE TRANSFERS '?'
  2942.     INC    BX
  2943.     DEC    CH
  2944.     JNZ    FILL
  2945.     RET
  2946. ;
  2947. ;
  2948. ;In-line compare.  Compares string addressed by 'DX' pair to string af-
  2949. ;the call (ends with '0').  Return with carry set means strings not the
  2950. ;same.  All registers (except 'AL') are unaffected.
  2951. ;
  2952. ILCOMP:
  2953.     POP    SI            ; POINT 'SI' TO 1ST CHARACTER
  2954.     PUSH    BX
  2955.     MOV    BX,SI
  2956.     PUSH    DX
  2957. ILCOMPL:
  2958.     MOV    AL,BYTE PTR [BX]     ;'BX' POINTS TO IN-LINE STRING
  2959.     OR    AL,AL            ;END OF STRING IF ZERO
  2960.     JZ    SAME
  2961.     XCHG    BX,DX
  2962.     MOV    AL,BYTE PTR [BX]
  2963.     XCHG    BX,DX
  2964.     CMP    AL,BYTE PTR [BX]
  2965.     JNZ    NOTSAME
  2966.     INC    BX
  2967.     INC    DX
  2968.     JMP    ILCOMPL
  2969. ;
  2970. NOTSAME:
  2971.     MOV    AL,0            ;IF NOT SAME, FINISH THRU..
  2972. NSLP:
  2973.     INC    BX            ;..STRING SO RETURN WILL..
  2974.     CMP    AL,BYTE PTR [BX]    ;..GO TO INSTRUCTION AFTER..
  2975.     JNZ    NSLP            ;..STRING AND NOT REMAINDER OF STRING
  2976.     STC
  2977. SAME:
  2978.     POP    DX
  2979.     INC    BX            ;AVOIDS A NOP INSTRUCTION..
  2980.     MOV    SI,BX            ;..WHEN RETURNING
  2981.     POP    BX
  2982.     PUSH    SI
  2983.     RET
  2984. ;
  2985. ;
  2986. ;        TERM.A86
  2987. ;
  2988. ;Terminal routines with text file I/O for MODEM9.xx.
  2989. ;
  2990. DSKSAVE:
  2991.     CALL    CKMODM
  2992.     MOV    AL,BYTE PTR .FCB+1    ;FIRST CHAR OF FILENAME
  2993.     CMP    AL,' '            ;FILE SPEC'D
  2994.     JNZ    GOODNM            ;YES, GOOD NAME
  2995.     MOV    NFILFLG,TRUE
  2996.     MOV    SAVEFLG,FALSE
  2997.     JMP    TERM
  2998. ;
  2999. GOODNM:
  3000.     CALL    ERASFIL
  3001.     CALL    MOVE2
  3002.     MOV    DX,OFFSET FCB3
  3003.     MOV    CL,MAKE
  3004.     INT    224
  3005.     MOV    DX,OFFSET FCB3
  3006.     MOV    CL,OPEN
  3007.     INT    224
  3008.     MOV    BX,OFFSET BOTTRAM
  3009.     MOV    HLSAVE,BX
  3010.     MOV    NFILFLG,0
  3011.     MOV    LISTMOR,0        ;STOP ANY BUFFERED PRINTER OUTPUT
  3012. TERM:
  3013.     TEST    LISTMOR,0FFH        ;ANY BUFFERED PRINTER OUTPUT?
  3014.     JZ    TERM1
  3015.     CALL    GOLIST            ;GO IF SO
  3016. TERM1:
  3017.     CALL    STAT            ;KEYPRESS?
  3018.     JNZ    TERM2
  3019.     JMP    TERML            ;NO, CHECK LINE
  3020.  
  3021. TERM2:
  3022.     CALL    KEYIN            ;GET CHAR FROM KBD
  3023.     CMP    AL,' '
  3024.     JC    TERM3
  3025.     JMP    NOTOG            ;GO IF NOT CONTROL CHARACTER
  3026.  
  3027. TERM3:
  3028.     MOV    CH,AL            ;SAVE
  3029.     CMP    AL,BKSP            ;TEST FOR BACKSPACE
  3030.     JNZ    NOBKSP
  3031.     TEST    CONVBKSP,0FFH        ;CONVERT BACKSPACE TO RUB?
  3032.     JZ    NOBKSP            ;GO IF NO CONVERSION
  3033.     MOV    AL,RUB
  3034.     JMP    NOTOG
  3035.  
  3036. NOBKSP:
  3037.     TEST    EXACFLG,0FFH        ; EXACT ?
  3038.     MOV    EXACFLG,0        ;CLR FOR NEXT TIME
  3039.     JZ    NOTEXAFLG        ;GO OF EXAFLG FALSE
  3040.     TEST    LOCONEXTCHR,0FFH    ;SHOULD WE SEND ON EXAFLG?
  3041.     MOV    AL,CH
  3042.     JNZ    NOBKSP1
  3043.     JMP    NOTOG            ;YES, IF LOCONEXTCHR FALSE
  3044.  
  3045. NOBKSP1:
  3046.     MOV    AL,EXTCHR        ;WE WANT TO SEND EXTCHR IN ANY CASE
  3047.     CMP    AL,CH
  3048.     MOV    AL,CH
  3049.     JNZ    NOBKSP2
  3050.     JMP    NOTOG            ;SEND IF EXTCHR
  3051.  
  3052. NOBKSP2:
  3053.     JMP    LOCCHK            ;OTHERWISE DO LOCAL STUFF
  3054.  
  3055. NOTEXAFLG:
  3056.     MOV    AL,EXTCHR        ;TREAT NEXT CHARACTER IN SPECIAL WAY?
  3057.     CMP    AL,CH
  3058.     JNZ    NOTEXA1
  3059.     JMP    EXTFLG            ;YES, SET EXAFLG FOR NEXT CHAR
  3060.  
  3061. NOTEXA1:
  3062.     MOV    AL,LOCONEXTCHR
  3063.     OR    AL,AL            ;SHOULD WE SEND IF NOT EXAFLG
  3064.     MOV    AL,CH
  3065.     JZ    LOCCHK
  3066.     JMP    NOTOG            ;YES, IF LOCONEXTCHR TRUE
  3067.  
  3068. LOCCHK:
  3069.     MOV    AL,EXITCHR        ;RETURN TO MENU?
  3070.     CMP    AL,CH
  3071.     JNZ    LOCCHK1
  3072.     JMP    EXITMEN            ;YES, RETURN TO MENU
  3073.  
  3074. LOCCHK1:
  3075.     MOV    AL,TRANCHR        ;OUTPUT TEXT FILE TO REMOTE?
  3076.     CMP    AL,CH
  3077.     JNZ    LOCCHK1A        ;                @DH
  3078. ;    JNZ    LOCCHK2            ;                @DH
  3079.     CALL    TRANSFER        ;SEND-A-FILE (BLIND SEND)
  3080. LOCCHK1A:                ;                @DH
  3081.     MOV    AL,BAUDCHR        ;change baud rate.. 30/DEC/84    @DH
  3082.     CMP    AL,CH            ;..from terminal mode        @DH 
  3083.     JNZ    LOCCHK2            ;                @DH
  3084.     CALL    BAUDCHG            ;                @DH
  3085. LOCCHK2:
  3086.     JNZ    LOCCHK3
  3087.     JMP    TERM            ;LOOP
  3088.  
  3089. LOCCHK3:
  3090.     MOV    AL,TRANLOGON
  3091.     OR    AL,AL
  3092.     JZ    SKPLOGON
  3093.     MOV    AL,LOGCHR        ;SEND LOGON?
  3094.     CMP    AL,CH
  3095.     JNZ    SKPLOGON
  3096.     JMP    SENDLOG
  3097.  
  3098. SKPLOGON:
  3099.     MOV    AL,LSTTST
  3100.     OR    AL,AL
  3101.     JZ    NOLST
  3102.     MOV    AL,LSTCHR
  3103.     CMP    AL,CH
  3104.     JNZ    NOLST
  3105.     MOV    AL,LISTFLG
  3106.     NOT    AL
  3107.     MOV    LISTFLG,AL
  3108.     CALL    CRLF
  3109.     CALL    CRLF
  3110.     CALL    LSTMSG
  3111.     CALL    CRLF
  3112.     JMP    TERML
  3113.  
  3114. NOLST:
  3115.     MOV    AL,UNSAVECHR        ;CLOSE INPUT BUFFER?
  3116.     CMP    AL,CH
  3117.     JZ    S2A            ;IF YES, DISABLE COPY
  3118.     MOV    AL,SAVECHR        ;OPEN INPUT BUFFER?
  3119.     CMP    AL,CH
  3120.     MOV    AL,CH            ;RESTORE CHARACTER TYPED
  3121.     JZ    NOLST1
  3122.     JMP    NOTOG
  3123.  
  3124. NOLST1:
  3125.     MOV    AL,NFILFLG        ;DO NOT ALLOW SAVE IF..
  3126.     CMP    AL,TRUE            ;..THIS FLAG IS SET.
  3127.     JNZ     NOLST1A
  3128.     JMP    TERML
  3129.  
  3130. NOLST1A:
  3131.     MOV    AL,TRUE        ;0FFH -- ALLOW COPY INTO FILE
  3132.     JMP    S2B
  3133.  
  3134. S2A:
  3135.     MOV    AL,FALSE    ;0 -- STOP COPY INTO FILE
  3136. S2B:
  3137.     MOV    SAVEFLG,AL
  3138.     CALL    BUFMSG
  3139.     JMP    TERML
  3140. ;
  3141. BUFMSG:
  3142.     CALL    ILPRT
  3143.     DB    CR,LF,LF,'** Memory buffer ',0
  3144.     TEST    SAVEFLG,0FFH
  3145.     JZ    BUFMSG2
  3146.     CALL    ILPRT
  3147.     DB    'open **',CR,LF,LF,':',BELL,0
  3148.     RET
  3149. ;
  3150. BUFMSG2:
  3151.     CALL    ILPRT
  3152.     DB    'closed **',CR,LF,LF,BELL,0
  3153.     RET
  3154. ;
  3155. EXITMEN:
  3156.     CALL    CRLF
  3157.     CALL    CLREOS        ;CLEAR TO END OF SCREEN TO CLEAN UP ANY MESS
  3158.     JMP    MENU0
  3159. ;
  3160. SENDREADY:
  3161.     CALL    INMODCTLP
  3162.     CALL    ANIMODSNDB
  3163.     CALL    CPIMODSNDR
  3164.     RET
  3165. ;
  3166. SENDLF:
  3167.     CALL    SENDREADY
  3168.     JNZ    NOLFYET        ;GO IF NOT READY FOR OUTPUT YET
  3169.     MOV    AL,LF
  3170.     JMP    NOTOG        ;SEND LF
  3171.  
  3172. NOLFYET:
  3173.     CALL    EXITTEST
  3174.     JNC    EXITMEN        ;GO IF SO, SO DON'T GET HUNG UP
  3175.     JMP    SENDLF        ;ELSE KEEP TRYING TO SEND LF
  3176. ;
  3177. SENDLOG:
  3178.     PUSH    BX
  3179. SNDLG2:
  3180.     CALL    STAT
  3181.     JZ    SNDLG2
  3182.     CALL    KEYIN
  3183.     CALL    UCASE
  3184.     CMP    AL,'L'        ;TEST IF LIST OF STRINGS REQUESTED
  3185.     JZ    GIVESTRS
  3186.     SUB    AL,'0'
  3187.     CMP    AL,10
  3188.     JNC    ENDLOG
  3189.     ADD    AL,AL        ;X2
  3190.     ADD    AL,AL        ;X4
  3191.     ADD    AL,AL        ;X8
  3192.     ADD    AL,AL        ;X16
  3193.     MOV    DL,AL
  3194.     MOV    DH,0
  3195.     PUSH    DX
  3196.     POP    BX
  3197.     ADD    BX,DX            ;X32 IN HL
  3198.     MOV    DX,OFFSET STRINGS    ;DE POINTS TO START OF STRINGS
  3199.     ADD    BX,DX
  3200. LOGLP:
  3201.     CALL    SENDREADY
  3202.     JNZ    NOSENDLOG        ;GO IF NOT READY
  3203.     MOV    AL,BYTE PTR [BX]    ;GET LOGON BYTE
  3204.     INC    BX
  3205.     CMP    AL,0            ;IS IT THE END?
  3206.     JZ    ENDLOG            ;GO IF SO
  3207.     CALL    OUTMODDATP
  3208.     JMP    LOGLP
  3209.  
  3210. NOSENDLOG:
  3211.     CALL    EXITTEST        ;TEST SO DON'T GET HUNG UP
  3212.     JNC    EXITLOG            ;GO IF OPERATOR WANTS EXIT
  3213.     JMP    LOGLP
  3214. ;
  3215. ENDLOG:
  3216.     POP    BX
  3217.     JMP    TERML
  3218. ;
  3219. EXITLOG:
  3220.     POP    BX
  3221.     JMP    EXITMEN
  3222. ;
  3223. EXITTEST:
  3224.     CALL    STAT            ;KEYPRESS?
  3225.     JZ    NOKEY
  3226.     CALL    KEYIN    
  3227.     MOV    CH,AL
  3228.     MOV    AL,EXITCHR        ;SEE IF OPERATOR WANTS EXIT
  3229.     CMP    AL,CH
  3230.     JNZ    NOKEY            ;GO IF WRONG KEY        
  3231.     STC
  3232.     CMC                ;RESET FOR EXIT
  3233.     RET
  3234.  
  3235. NOKEY:
  3236.     STC                ;SET FOR NO KEY OR WRONG KEY
  3237.     RET
  3238. ;
  3239. GIVESTRS:
  3240.     CALL    ILPRT
  3241.     DB    CR,LF,'    List of Strings',CR,LF,LF,LF,0
  3242.     MOV    BX,OFFSET STRINGS
  3243.     MOV    STRSAVE,BX
  3244.     MOV    CH,'0'
  3245. GVSTRS1:
  3246.     MOV    AL,CH
  3247.     CALL    TIPE
  3248.     CALL    ILPRT
  3249.     DB    '  =  ',0
  3250.     MOV    BX,STRSAVE
  3251.     MOV    AL,BYTE PTR [BX]
  3252.     CMP    AL,0
  3253.     JNZ    NONULL
  3254.     CALL    ILPRT
  3255.     DB    '* null string *',0
  3256.     JMP    GVSTRS2
  3257.  
  3258. NONULL:
  3259.     MOV    BX,STRSAVE
  3260. NONUL2:
  3261.     MOV    AL,BYTE PTR [BX]
  3262.     CMP    AL,0
  3263.     JZ    GVSTRS2
  3264.     CMP    AL,CR
  3265.     JZ    NONUL3
  3266.     CALL    TIPE
  3267. NONUL3:
  3268.     JNZ    NOTACR
  3269.     PUSH    BX
  3270.     CALL    ILPRT
  3271.     DB    '<CR>',0
  3272.     POP    BX
  3273. NOTACR:
  3274.     INC    BX
  3275.     JMP    NONUL2
  3276. ;
  3277. GVSTRS2:
  3278.     MOV    AL,'9'
  3279.     CMP    AL,CH
  3280.     JZ    GVSTRS3
  3281.     INC    CH
  3282.     MOV    BX,STRSAVE
  3283.     MOV    DX,OFFSET 32
  3284.     ADD    BX,DX
  3285.     MOV    STRSAVE,BX
  3286.     CALL    CRLF
  3287.     JMP    GVSTRS1
  3288. ;
  3289. GVSTRS3:
  3290.     CALL    ILPRT
  3291.     DB    CR,LF,LF,'Enter number to transmit string',CR,LF,0
  3292.     POP    BX
  3293.     JMP    SENDLOG
  3294. ;
  3295. EXTFLG:
  3296.     MOV    AL,TRUE
  3297.     MOV    EXACFLG,AL
  3298.     JMP    TERML
  3299. ;
  3300. RCVREADY:
  3301.     CALL    INMODCTLP
  3302.     CALL    ANIMODRCVB
  3303.     CALL    CPIMODRCVR
  3304.     RET
  3305. ;
  3306. LSTMSG:
  3307.     MOV    AL,LISTFLG
  3308.     OR    AL,AL
  3309.     JZ    LSTMSG2
  3310.     CALL    ILPRT
  3311.     DB    'Printer is on',CR,LF,0
  3312.     RET
  3313.  
  3314. LSTMSG2:
  3315.     CALL    ILPRT
  3316.     DB    'Printer is off',CR,LF,0
  3317.     RET
  3318. ;
  3319. NOTOG:
  3320.     PUSH    AX
  3321. NOTOG1:
  3322.     CALL    SENDREADY
  3323.     JNZ    NOTOG1
  3324.     POP    AX
  3325.     CALL    OUTMODDATP
  3326.     MOV    CH,AL
  3327.     MOV    AL,LOCFLG
  3328.     OR    AL,AL
  3329.     JNZ    LTYPE
  3330.     MOV    AL,ECHOFLG
  3331.     OR    AL,AL
  3332.     JZ    CHKCR
  3333. LTYPE:
  3334.     MOV    AL,CH
  3335.     CALL    TIPE
  3336.     CALL    CHKSAVE        ;TO STORE LOCAL IF BUFFER OPEN
  3337.     CALL    CHKPRNT
  3338. CHKCR:
  3339.     MOV    AL,CR
  3340.     CMP    AL,CH
  3341.     JNZ    TERML
  3342.     MOV    AL,ADDLF
  3343.     OR    AL,AL
  3344.     JZ    TERML
  3345.     JMP    SENDLF
  3346. ;
  3347. TERML:
  3348.     CALL    RCVREADY    ;TEST FOR RECEIVED CHARACTER
  3349.     JZ    TERML1
  3350.     JMP    TERM
  3351.  
  3352. TERML1:
  3353.     CALL    INMODDATP
  3354.     AND    AL,7FH        ;STRIP PARITY
  3355.     JNZ    GIVLF
  3356.     JMP    TERM    
  3357.  
  3358. GIVLF:
  3359.     MOV    CH,AL
  3360. ;    CALL    TIPE            ;                @DH
  3361.     CALL    CTYPE            ;CTYPE EXPANDS TABS        @DH
  3362.     CALL    CHKSAVE
  3363.     CALL    CHKPRNT
  3364.     MOV    AL,ECHOFLG
  3365.     OR    AL,AL
  3366.     JZ    NOECHO
  3367.     MOV    AL,CH
  3368.     CALL    OUTMODDATP
  3369. NOECHO:
  3370.     MOV    AL,CR
  3371.     CMP    AL,CH
  3372.     JZ    NOECHO1
  3373.     JMP    TERM
  3374.  
  3375. NOECHO1:
  3376.     MOV    AL,ADDLF
  3377.     JNZ    NOECHO2
  3378.     JMP    TERM
  3379.  
  3380. NOECHO2:
  3381.     MOV    AL,ECHOFLG
  3382.     OR    AL,AL
  3383.     JZ    NOECHO3
  3384.     JMP    SENDLF
  3385.  
  3386. NOECHO3:
  3387.     MOV    AL,LF
  3388.     JMP    GIVLF
  3389. ;
  3390. CHKSAVE:
  3391.     MOV    AL,SAVEFLG
  3392.     OR    AL,AL
  3393.     JNZ    CHKSAVE1
  3394.     RET
  3395.  
  3396. CHKSAVE1:
  3397.     MOV    BYTE PTR [BX],CH
  3398.     INC    BX
  3399.     MOV    HLSAVE,BX        ;MENU COMMAND DESTROYS HL-REG..
  3400.     MOV    AL,LF
  3401.     CMP    AL,CH
  3402.     JNZ    NOCOLON            ;..TYPE ":" AFTER EACH LINE FEED..
  3403.     MOV    AL,':'            ;..WHEN MEMORY SAVE ACTIVE.
  3404.     CALL    TIPE
  3405. NOCOLON:
  3406.     CALL    GETMAX
  3407.     CMP    AL,BH
  3408.     PUSH    CX
  3409.     JNZ    NOCOLON1
  3410.     CALL    INTDSKSV
  3411. NOCOLON1:
  3412.     POP    CX
  3413.     RET
  3414. ;
  3415. GETMAX:
  3416.     MOV    AL,XAST SHR 8        ;END OF RESERVED BUFFER HAS BEEN
  3417.     RET                ;..REACHED AND DISKSAVE IS NEEDED.
  3418. ;
  3419. CHKPRNT:
  3420.     TEST    LISTFLG,0FFH    ;OUT TO PRINTER?
  3421.     JNZ    CHKPRNT1
  3422.     RET            ;RETURN IF NOT
  3423.  
  3424. CHKPRNT1:
  3425.     TEST    NFILFLG,0FFH    ;IS BUFFER USED FOR FILE?
  3426.     JZ    NOBUFF        ;DON'T BUFFER PRINTER IF SO, HOWEVER CHARACTERS
  3427.                 ;WILL BE LOST IF PRINTER IS SLOWER THAN MODEM
  3428.     CALL    GETMAX        ;GET MAXIMUM FOR BUFFER
  3429.     MOV    BX,HLSAVE1    
  3430.     CMP    AL,BH            ;ARE WE THERE?
  3431.     JNZ    NOTMAX            ;GO IF NOT
  3432.     MOV    BX,OFFSET BOTTRAM    ;FLUSH BUFFER
  3433.     MOV    HLSAVE1,BX
  3434.     MOV    HLSAVE2,BX
  3435. NOTMAX:    
  3436.     MOV    BYTE PTR [BX],CH    ;SAVE CHARACTER IN BUFFER
  3437.     INC    BX            ;INCREMENT END OF BUFFER
  3438.     MOV    HLSAVE1,BX
  3439.     MOV    AL,TRUE            ;SET FLAG FOR PRINTER OUTPUT
  3440.     MOV    LISTMOR,AL
  3441.     RET
  3442. ;
  3443. NOBUFF:
  3444.     CALL    LSTSTAT    
  3445.     JNZ    NOBUFF1
  3446.     RET            ;RETURN IF PRINTER BUSY
  3447.  
  3448. NOBUFF1:
  3449.     MOV    CL,CH        ;ELSE PRINT CHARACTER
  3450.     CALL    LISTER
  3451.     RET
  3452. ;
  3453. GOLIST:
  3454.     CALL    LSTSTAT
  3455.     JNZ    GOLIST1
  3456.     RET            ;RETURN IF PRINTER BUSY
  3457.  
  3458. GOLIST1:
  3459.     MOV    BX,HLSAVE2           ;GET LOCATION OF NEXT CHARACTER TO PRINT
  3460.     MOV    CL,BYTE PTR [BX]    ;GET CHARACTER
  3461.     INC    BX            ;INCREMENT POINTER
  3462.     MOV    HLSAVE2,BX
  3463.     CALL    CMPBUFF            ;CHECK FOR END OF BUFFER
  3464.     CALL    LISTER            ;PRINT
  3465.     RET
  3466. ;
  3467. ;ROUTINE CHECKS FOR END OF BUFFER, RESETS BUFFER IF SO AND STOPS
  3468. ;PRINTER OUTPUT
  3469. ;
  3470. CMPBUFF:
  3471.     MOV    BX,HLSAVE2
  3472.     CMP    BX,HLSAVE1
  3473.     JZ    CMPBUFF1
  3474.     RET
  3475.  
  3476. CMPBUFF1:
  3477.     MOV    BX,OFFSET BOTTRAM
  3478.     MOV    HLSAVE1,BX
  3479.     MOV    HLSAVE2,BX
  3480.     MOV    LISTMOR,0
  3481.     RET
  3482. ;
  3483. INTDSKSV:
  3484.     MOV    AL,XOFF            ;SEND A CTRL-S TO STOP..
  3485.     CALL    OUTMODDATP          ;..REMOTE COMPUTER OUTPUT.
  3486.     MOV    DH,0                 ;D IS THE BUFFER COUNT
  3487.     CALL    INMODEM            ;GET LAST BYTES SENT..
  3488.     MOV    LASTBYT1,AL        ;..AFTER CTRL-S.
  3489.     CALL    INMODEM            ;ADD MORE CALLS TO INMODEM..
  3490.     MOV    LASTBYT2,AL        ;..AND STA LASTBYT# IF YOU ARE..
  3491.     PUSH    DX
  3492.     CALL    NUMREC1
  3493.     CALL    WRTDSK            ;WRITE THE RECORDS
  3494.     POP    DX
  3495.     MOV    BX,OFFSET BOTTRAM
  3496.     INC    DH
  3497.     DEC    DH            ;TEST BUFFER COUNT FOR ZERO
  3498.     JZ    CTRLQ
  3499.     MOV    AL,LASTBYT1        ;GET THE LAST BYTES THAT WERE..
  3500.     MOV    BYTE PTR [BX],AL    ;..SAVED AND PUT THEM IN..
  3501.     INC    BX            ;..BOTTRAM.
  3502.     CALL    TIPE
  3503.     DEC    DH
  3504.     JZ    CTRLQ
  3505.     MOV    AL,LASTBYT2
  3506.     MOV    BYTE PTR [BX],AL
  3507.     INC    BX
  3508.     CALL    TIPE
  3509. CTRLQ:
  3510.     MOV    AL,XON            ;SEND START CHARACTER..
  3511.     CALL    OUTMODDATP        ;..TO REMOTE COMPUTER.
  3512.     RET
  3513. ;
  3514. ;THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER
  3515. ;OR 100 MILLISECONDS. IF A CHARACTER IS RECEIVED, A FLAG IS SET
  3516. ;TO STORE THE CHARACTER. A MAXIMUM OF TWO CHARACTERS ARE STORED,
  3517. ;BUT MORE MAY BE STORED IF DESIRED (SEE COMMENT IN "INTDSKSV"
  3518. ;ABOVE).
  3519. ;
  3520. INMODEM:
  3521.     PUSH    BX
  3522.     MOV    BX,OFFSET 625
  3523.     CALL    FIXCNT
  3524.     PUSH    BX
  3525.     POP    CX
  3526.     POP    BX
  3527. TIMERL:
  3528.     CALL    RCVREADY
  3529.     JZ    GETBYTE
  3530.     DEC    CX
  3531.     MOV    AL,CH
  3532.     OR    AL,CL
  3533.     JNZ    TIMERL
  3534.     RET
  3535. ;
  3536. GETBYTE:
  3537.     CALL    INMODDATP
  3538.     INC    DH
  3539.     RET
  3540. ;
  3541. NUMRECS:
  3542.     MOV    BYTE PTR [BX],EOFCHAR
  3543.     INC    BX
  3544.     MOV    DX,OFFSET 127
  3545.     ADD    BX,DX
  3546. NUMREC1:
  3547.     MOV    DX,-(OFFSET BOTTRAM)
  3548.     ADD    BX,DX
  3549.     MOV    AL,BL            ;DIVIDE HL BY 128..
  3550.     RCL    AL,1            ;High bit set if sector to save
  3551.     MOV    AL,0            ;Save in carry
  3552.     RCL     AL,1            ;Now see if needed
  3553.     MOV    BL,BH            ;..NUMBER OF SECTORS
  3554.     MOV    BH,0
  3555.     PUSH    AX
  3556.     ADD    BX,BX
  3557.     POP    AX
  3558.     ADC    AL,BL
  3559.     MOV    BL,AL            ;RETURNS WITH NUMBER OF..
  3560.     RET                ;..128 BYTE RECORDS IN HL.
  3561. ;
  3562. WRTDSK:
  3563.     MOV    DX,OFFSET BOTTRAM
  3564. NEXTWRT:
  3565.     MOV    CL,STDMA
  3566.     CALL    BDOSRT
  3567.     PUSH    DX
  3568.     MOV    DX,OFFSET FCB3
  3569.     MOV    CL,WRITE
  3570.     CALL    BDOSRT
  3571.     POP    DX
  3572.     ADD    DX,128
  3573.     DEC    BX
  3574.     JNZ    NEXTWRT
  3575.     RET
  3576. ;
  3577. CLOSE3:
  3578.     MOV    DX,OFFSET FCB3
  3579.     MOV    CL,CLOSE
  3580.     INT    224
  3581.     RET
  3582. ;
  3583. BDOSRT:
  3584.     PUSH    CX
  3585.     PUSH    DX
  3586.     PUSH    BX
  3587.     PUSH    AX
  3588.     INT    224
  3589.     POP    AX
  3590.     POP    BX
  3591.     POP    DX
  3592.     POP    CX
  3593.     RET
  3594. ;
  3595. MOVE2:
  3596.     MOV    BX,OFFSET FCB3
  3597.     CALL    INITFCBS
  3598.     MOV    BX,OFFSET FCB
  3599.     MOV    DX,OFFSET FCB3
  3600.     MOV    CH,12
  3601.     CALL    MOVE
  3602.     RET
  3603. ;
  3604. ;FILE TRANSFER ROUTINE - CALLED WITH 
  3605. ;CONTROL-T FROM TERMINAL ROUTINE.
  3606. ;TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X.
  3607. ;
  3608. TRANSFER:
  3609.     PUSH    BX
  3610.     PUSH    DX
  3611.     PUSH    CX
  3612.     PUSH    AX
  3613.     MOV    BX,OFFSET FCB4
  3614.     CALL    INITFCBS         ;INITIALIZES FCBS POINTED..
  3615.     MOV    BX,OFFSET FCB+16     ;..TO BY HL REG.
  3616.     CALL    INITFCBS
  3617. GET:
  3618.     CALL    GETNAME
  3619.     MOV    AL,CMDBUF+2         ;WAS FILE ENTERED
  3620.     CMP    AL,20H
  3621.     JZ    TRANSL2
  3622.     CALL    MOVE4
  3623.     CALL    OPEN4
  3624.     CMP    AL,0FFH            ;RETURN WITH 0FFH MEANS
  3625.     JNZ    CONTIN            ;FILE DOES NOT EXIST
  3626. TRANSL1:
  3627.     CALL    ILPRT
  3628.     DB    CR,LF,'++ File does not exist ++',CR,LF,0
  3629. TRANSL2:
  3630.     CALL    ILPRT
  3631.     DB    'Type "R" to return to modem',CR,LF
  3632.     DB    'Type "A" to re-enter name: ',BELL,0
  3633.     CALL    KEYIN
  3634.     CALL    UCASE
  3635.     PUSH    AX
  3636.     CALL    TIPE            ;ECHO RESPONSE
  3637.     CALL    CRLF
  3638.     POP    AX
  3639.     CMP    AL,'A'
  3640.     JNZ    TRANSL3
  3641.     JMP    GET
  3642.  
  3643. TRANSL3:
  3644.     CMP    AL,'R'
  3645.     JNZ    TRANSL2
  3646.     JMP    RETURN
  3647. ;
  3648. CONTIN:
  3649.     MOV    DX,OFFSET 80H
  3650.     MOV    CL,STDMA
  3651.     INT    224
  3652. READMR:
  3653.     CALL    READ80
  3654.     CMP    AL,1        ;END OF FILE
  3655.     JZ    RETURNS
  3656.     CMP    AL,2        ;BAD READ
  3657.     JZ    RETURNU
  3658.     CALL    SEND80C
  3659.     CMP    AL,EOFCHAR    ;END OF FILE - OMIT IF OBJECT..
  3660.     JZ    RETURNS        ;..CODE IS TO BE SENT.
  3661.     CMP    AL,CAN        ;CANCELLATION?
  3662.     JZ    TRANCAN
  3663.     JMP    READMR
  3664. ;
  3665. RETURNS:
  3666.     CALL    ILPRT
  3667.     DB    CR,LF,'File transfer completed',CR,LF,BELL,0
  3668.     JMP    RETURN
  3669. ;
  3670. RETURNU:
  3671.     CALL    ILPRT
  3672.     DB    CR,LF,'++ File transfer unsuccessful ++',CR,LF,BELL,0
  3673.     JMP    RETURN
  3674. ;
  3675. TRANCAN:
  3676.     CALL    ILPRT
  3677.     DB    CR,LF,LF,'++ Transfer cancelled ++',CR,LF,BELL,0
  3678. RETURN:
  3679.     POP    AX
  3680.     POP    CX
  3681.     POP    DX
  3682.     POP    BX
  3683.     RET
  3684. ;
  3685. INITFCBS:                ;ENTRY AT +2 WILL LEAVE..
  3686.     MOV    BYTE PTR [BX],0        ;..DRIVE NO. INTACT.
  3687.                     ;see comments at label GETFN:    @DH
  3688.                     ;..about drive            @DH
  3689.     INC    BX            ;WILL INITIALIZE AN FCB..
  3690.     MOV    CH,11            ;..POINTED TO BY HL-REG. FILLS 1ST POS
  3691. LOOP10:
  3692.     MOV    BYTE PTR [BX],' '    ;..WITH 0, NEXT 11 WITH..
  3693.     INC    BX            ;..WITH BLANKS, AND LAST..
  3694.     DEC    CH            ;..21 WITH NULLS.
  3695.     JNZ    LOOP10
  3696.     MOV    CH,21
  3697. LOOP11:
  3698.     MOV    BYTE PTR [BX],0
  3699.     INC    BX
  3700.     DEC    CH
  3701.     JNZ    LOOP11
  3702.     RET
  3703. ;
  3704. GETNAME:
  3705.     CALL    ILPRT
  3706.     DB    CR,LF,'Enter file name to be transferred -  <CR> TO QUIT: ',0
  3707.     MOV    DX,OFFSET CMDBUF
  3708.     CALL    INBUFF
  3709.     CALL    CRLF
  3710.     RET
  3711. ;
  3712. MOVE4:
  3713.     MOV    DX,OFFSET CMDBUF
  3714.     MOV    BX,OFFSET FCB4
  3715.     CALL    CPMLINE
  3716.     RET
  3717. ;
  3718. OPEN4:
  3719.     MOV    DX,OFFSET FCB4
  3720.     MOV    CL,OPEN
  3721.     INT    224
  3722.     RET
  3723. ;
  3724. READ80:
  3725.     MOV    DX,OFFSET FCB4
  3726.     MOV    CL,READ
  3727.     INT    224
  3728.     RET
  3729. ;
  3730. SEND80C:
  3731.     MOV    CH,80H
  3732.     MOV    BX,OFFSET 80H
  3733. SENDCH1:
  3734.     PUSH    DX
  3735.     CALL    SPEED
  3736.     POP    DX
  3737.     MOV    AL,BYTE PTR [BX]
  3738.     CMP    AL,EOFCHAR
  3739.     JNZ    SENDCH3
  3740.     MOV    AL,EOFSEND
  3741.     OR    AL,AL
  3742.     JNZ    SENDCH2
  3743.     RET
  3744.  
  3745. SENDCH2:
  3746.     MOV    AL,BYTE PTR [BX]
  3747. SENDCH3:
  3748.     CALL    MODOUT
  3749.     CMP    AL,EOFCHAR
  3750.     JNZ    SENDCH4
  3751.     RET
  3752.  
  3753. SENDCH4:
  3754.     CALL    STAT        ;TEST TO SEE IF
  3755.     OR    AL,AL        ;CANCELLATION REQUESTED
  3756.     JZ    SKIP12
  3757.     CALL    KEYIN
  3758.     CMP    AL,CAN
  3759.     JNZ    SKIP12
  3760.     RET
  3761.  
  3762. SKIP12:
  3763.     INC    BX
  3764.     DEC    CH
  3765.     JNZ    SENDCH1
  3766.     RET
  3767. ;
  3768. MODOUT:
  3769.     PUSH    AX
  3770. MODOUTL:
  3771.     MOV    AL,XOFFTST
  3772.     OR    AL,AL
  3773.     JZ    MODOUTL1
  3774.     CALL    TXOFF
  3775. MODOUTL1:
  3776.     CALL    SENDREADY
  3777.     JNZ    MODOUTL
  3778.     MOV    AL,STRLF
  3779.     OR    AL,AL
  3780.     JZ    NOLFTST
  3781.     POP    AX
  3782.     PUSH    AX
  3783.     CMP    AL,LF
  3784.     JZ    NOTMOUT
  3785. NOLFTST:
  3786.     POP    AX
  3787.     PUSH    AX
  3788.     MOV    SAVEOUT,AL    ;SAVE OUTPUT FOR POSSIBLE ECHO TEST
  3789.     CALL    OUTMODDATP
  3790.     MOV    AL,ECHWAIT    ;DO WE WANT TO TEST FOR ECHOED CHAR?
  3791.     OR    AL,AL
  3792.     JZ    NOTMOUT
  3793.     CALL    WAITECHO    ;GO IF SO
  3794. NOTMOUT:
  3795.     POP    AX
  3796. ;    CALL    TIPE        ;                    @DH
  3797.     CALL    CTYPE        ;CTYPE EXPANDS TABS            @DH
  3798.     CMP    AL,CR
  3799.     JZ    DLYCR
  3800.     RET
  3801. ;
  3802. DLYCR:
  3803.     MOV    AL,XONWAIT    ;WAIT FOR XON AFTER CR?
  3804.     OR    AL,AL
  3805.     JNZ    WAITXON
  3806.     MOV    AL,CRDLY    ;EXTRA DELAY AFTER CR
  3807.     JMP    DLYCR2
  3808. ;
  3809. SPEED:
  3810.     MOV    AL,BYTDLY    ;GET SPEED VALUE (0-9)
  3811.                 ;DELAY IS FROM 0.02 SEC FOR SPDVAL = 1
  3812.                 ;TO 0.18 SEC FOR SPDVAL    = 9
  3813. DLYCR2:
  3814.     OR    AL,AL
  3815.     JNZ    DLYCR3
  3816.     RET            ;RETURN IF 0
  3817.  
  3818. DLYCR3:
  3819.     MOV    CL,AL
  3820. SPDLP:
  3821.     CALL    SPD1        ;OUTER LOOP
  3822.     DEC    CL
  3823.     JNZ    SPDLP
  3824.     RET
  3825. ;
  3826. SPD1:
  3827.     PUSH    BX
  3828.     MOV    BX,OFFSET 357    ;ABOUT 0.02 SEC
  3829.     MOV    AL,XOFFTST
  3830.     OR    AL,AL
  3831.     JZ    SPD2
  3832.     MOV    BX,OFFSET 102    ;ADJUST FOR XOFF TESTING
  3833.     MOV    AL,ECHOFLG
  3834.     OR    AL,AL
  3835.     JZ    SPD2
  3836.     MOV    AL,LOCFLG
  3837.     OR    AL,AL
  3838.     JZ    SPD2
  3839.     MOV    BX,OFFSET 76    ;ADJUST AGAIN FOR REMOTE ECHO
  3840. SPD2:
  3841.     CALL    FIXCNT
  3842.     PUSH    BX
  3843.     POP    DX
  3844.     POP    BX
  3845. SPDLP1:
  3846.     DEC    DX            ;INNER LOOP
  3847.     MOV    AL,XOFFTST
  3848.     OR    AL,AL
  3849.     JZ    SPDLP2
  3850.     CALL    TXOFF
  3851. SPDLP2:
  3852.     MOV    AL,DL
  3853.     OR    AL,DH
  3854.     JNZ    SPDLP1
  3855.     RET
  3856. ;
  3857. TXOFF:
  3858.     CALL    RCVREADY
  3859.     JZ    TXOFF1
  3860.     RET
  3861.  
  3862. TXOFF1:
  3863.     CALL    INMODDATP
  3864.     AND    AL,7FH
  3865.     CMP    AL,XOFF
  3866.     JNZ    TXOFF2
  3867.     CALL    WAITXON
  3868. TXOFF2:
  3869.     RET
  3870. ;
  3871. WAITXON:
  3872.     CALL    RCVREADY
  3873.     JNZ    WTXON2
  3874.     CALL    INMODDATP
  3875.     AND    AL,7FH
  3876.     CMP    AL,XON
  3877.     JNZ    WTXON2
  3878.     RET
  3879.  
  3880. WTXON2:
  3881.     CALL    STAT        ;TEST TO SEE IF
  3882.     OR    AL,AL        ;CANCELLATION REQUESTED
  3883.     JZ    WAITXON        ;SO DON'T GET HUNG UP
  3884.     CALL    KEYIN
  3885.     CMP    AL,CAN
  3886.     JNZ    WAITXON
  3887.      RET
  3888. ;
  3889. WAITECHO:
  3890.     MOV    AL,50        ;1 SECOND MAXIMUM DELAY WAITING FOR ECHO
  3891.     MOV    MECHDLY,AL
  3892. WTECH1:
  3893.     CALL    RCVREADY    ;IS THERE INPUT?
  3894.     JNZ    WTECH2        ;GO IF NOT
  3895.     CALL    INMODDATP    ;GET INPUT
  3896.     AND    AL,7FH
  3897.     MOV    CL,AL        ;SAVE INPUT
  3898.     MOV    AL,SAVEOUT    ;GET OUTPUT
  3899.     CMP    AL,CL        ;ARE THEY THE SAME?
  3900.     JNZ    WTECH1A
  3901.     RET            ;RETURN IF SO
  3902.  
  3903. WTECH1A:
  3904.     MOV    AL,SAVEOUT    ;GET OUTPUT
  3905.     CMP    AL,TAB        ;CHECK IF TAB
  3906.     JNZ    WTECH2        ;GO IF NOT
  3907.     MOV    AL,SPACE    ;MAYBE REMOTE CONVERTS TABS TO SPACES
  3908.     CMP    AL,CL        
  3909.     JNZ    WTECH2
  3910.     RET            ;RETURN IF SPACE ECHOED ON TAB OUTPUT
  3911.  
  3912. WTECH2:
  3913.     MOV    AL,MECHDLY    ;LOOP FOR 1 SECOND
  3914.     DEC    AL
  3915.     MOV    MECHDLY,AL
  3916.     JNZ    WTECH3
  3917.     RET
  3918.  
  3919. WTECH3:
  3920.     MOV    AL,1        ;0.02 SECOND
  3921.     CALL    DLYCR2
  3922.     JMP    WTECH1
  3923. ;    
  3924. ; Check for any garbage characters on line.
  3925. ;
  3926. CKMODM:
  3927.     CALL    RCVREADY    ;ANY CHARACTERS READY TO RECEIVE?
  3928.     JZ    CKMODM1
  3929.     RET            ;IF NOT, RETURN
  3930.  
  3931. CKMODM1:
  3932.     CALL    INMODDATP    ;OTHERWISE GET THE CHARACTER AND IGNORE
  3933.     JMP    CKMODM        ;CHECK FOR ANY ADDITIONAL CHARACTERS
  3934. ;
  3935. ;
  3936. ;        SENDRECV.A86
  3937. ;
  3938. ;Christensen protocol routines for MODEM9.xx.
  3939. ;
  3940. ;SEND A CP/M FILE
  3941. ;
  3942. SENDFIL:
  3943.     MOV    CKSUMFLG,TRUE      ;ALWAYS FORCE CHECKSUM MODE INITIALLY ON SEND
  3944.     CALL    CKMODM            ;REMOVE GARBAGE FROM LINE
  3945. SENDFIL1:
  3946.     TEST    BATCHFLG,0FFH        ;CHECK IF MULTIPLE FILE..
  3947.     JNZ    SENDC1
  3948.     CALL    ILPRT
  3949.     DB    'Ready to send in the batch mode',CR,LF,0
  3950.     MOV    SENDFLG,TRUE            ;INDICATE SEND FOR BATCH MODE
  3951.     MOV    AL,FSTFLG            ;IF FIRST TIME THRU..
  3952.     OR    AL,AL                ;..SCAN THE COMMAND LINE..
  3953.     JZ    SENDFIL2
  3954.     CALL    TNMBUF                ;..FOR MULTIPLE NAMES.
  3955. SENDFIL2:
  3956.     CALL    SENDFN                ;SENDS FILE NAME TO RECEIVER
  3957.     JNC    SENDC2                ;CARRY SET MEANS NO MORE FILES.
  3958.     MOV    BATCHFLG,'B'             ;STOP BATCH ....MODE OPTION.
  3959.     MOV    AL,EOT                ;FINAL XFER END
  3960.     CALL    SEND
  3961.     JMP    DONE
  3962. ;
  3963. SENDC1:
  3964.     CMP    BYTE PTR .FCB+1,' '
  3965.     JNZ    SENDC2
  3966.     JMP    BLKFILE
  3967.  
  3968. SENDC2:
  3969.     CALL    CNREC                ;GET NUMBER OF RECORDS
  3970.     CALL    OPENFIL
  3971.     MOV    DL,80
  3972.     CALL    WAITNAK
  3973.  
  3974. SENDLP:
  3975.     CALL    CKABORT            ;WANT TO TERMINATE WHLE SENDING FILE?
  3976.     CALL    RDSECT
  3977.     JC    SENDEOF
  3978.     CALL    INCRSNO
  3979.     MOV    ERRCT,1
  3980. SENDRPT:
  3981.     CALL    CKABORT            ;WANT TO TERMINATE WHILE SENDING FILE?
  3982.     CALL    SENDHDR
  3983.     CALL    SENDSEC
  3984.     MOV    AL,CKSUMFLG
  3985.     OR    AL,AL
  3986.     JNZ    SENDRPT1
  3987.     CALL    SENDCRC
  3988.     JMPS    SENDRPT2
  3989.  
  3990. SENDRPT1:
  3991.     CALL    SENDCKS
  3992. SENDRPT2:
  3993.     CALL    GETACK
  3994.     JC    SENDRPT
  3995.     JMP    SENDLP
  3996. ;
  3997. SENDEOF:
  3998.     MOV    AL,EOT
  3999.     CALL    SEND
  4000.     CALL    GETACK
  4001.     JC    SENDEOF
  4002.     JMP    DONE
  4003. ;
  4004. ;RECEIVE A FILE
  4005. ;
  4006. RCVFIL:
  4007.     MOV    AL,CKSUMDFLT    ;GET MODE REQUESTED BY OPERATOR
  4008.     MOV    CKSUMFLG,AL    ;STORE IT
  4009.     CALL    CKMODM        ;CATCH ANY GARBAGE CHARACTERS
  4010. RCVFIL1:
  4011.     MOV    AL,BATCHFLG    ;CHECK IF MULT..
  4012.     OR    AL,AL        ;..FILE MODE.
  4013.     JNZ    RCVC1
  4014.     MOV    AL,FALSE    ;FLAG WHERE TO RETURN..
  4015.     MOV    SENDFLG,AL    ;..FOR NEXT FILE TRANS.
  4016.     CALL    GETFN        ;GET THE FILE NAME.
  4017.     JNC    RCVC2        ;CARRY SET MEANS NO MORE FILES.
  4018.     MOV    AL,'B'        ;STOP BATCH..
  4019.     MOV    BATCHFLG,AL     ;..MODE OPTION.
  4020.     JMP    DONE
  4021. ;
  4022. RCVC1:
  4023.     MOV    AL,BYTE PTR .FCB+1    ;MAKE SURE FILE IS NAMED
  4024.     CMP    AL,' '
  4025. ;    JNZ    RECV1A            ;                @DH
  4026.     JNZ    RCVC2            ;                @DH
  4027.     JMP    BLKFILE
  4028.  
  4029. ;RECV1A:                ;                @DH
  4030. ;    JMP    RCVC3            ;                @DH
  4031. ;
  4032. RCVC2:
  4033.     CALL    CKCPM2
  4034.     CALL    CKBAKUP
  4035. RCVC3:
  4036.     CALL    ERASFIL
  4037.     CALL    MAKEFIL
  4038.     MOV    AL,BATCHFLG        ;DON'T PRINT MSG IF IN BATCH
  4039.     OR    AL,AL
  4040.     JZ    RCVFST
  4041.     CALL    ILPRTQ
  4042.     DB    'File open, ready to receive',CR,LF,0
  4043. RCVFST:
  4044.     MOV    AL,CKSUMFLG
  4045.     OR    AL,AL
  4046.     MOV    AL,NAK
  4047.     JNZ    RCVFIL2
  4048.     MOV    AL,CRC
  4049. RCVFIL2:
  4050.     CALL    SEND
  4051.     MOV    AL,CKSUMFLG
  4052.     OR    AL,AL
  4053.     JNZ    RCVNAKM                ;IF IN CRC MODE
  4054.     CALL    ILPRTQ                ;THEN SAY SO
  4055.     DB    'CRC in effect',CR,LF,0
  4056.     JMP    RCVLP
  4057.  
  4058. RCVNAKM:
  4059.     CALL    ILPRTQ                ;ELSE SAY CHECKSUM MODE
  4060.     DB    'Checksum in effect',CR,LF,0
  4061. RCVLP:
  4062.     CALL    RCVSECT
  4063.     JC    RCVEOT
  4064.     CALL    WRSECT
  4065.     CALL    INCRSNO
  4066.     CALL    SENDACK
  4067.     JMP    RCVLP
  4068. ;
  4069. RCVEOT:
  4070.     CALL    WRBLOCK
  4071.     CALL    SENDACK
  4072.     CALL    CLOSFIL
  4073.     JMP    DONE
  4074. ;    
  4075. ;SUBROUTINES
  4076. ;
  4077. SENDFN:
  4078.     CALL    ILPRTQ
  4079.     DB    'Awaiting name NAK',CR,LF,0
  4080.     MOV    DL,80
  4081.     CALL    WAITNLP
  4082.     MOV    AL,ACK                ;GOT NAK, SEND ACK
  4083.     CALL    SEND
  4084.     MOV    BX,OFFSET FILECT
  4085.     DEC    BYTE PTR [BX]
  4086.     JS    NOMRNM
  4087.     MOV    BX,NBSAVE            ;GET FILE NAME..
  4088.     MOV    DX,OFFSET FCB            ;..IN FCB
  4089.     MOV    CH,12
  4090.     CALL    MOVE
  4091.     MOV    NBSAVE,BX
  4092.     CALL    SENDNM                ;SEND IT
  4093.     OR    AL,AL                ;CLEAR CARRY
  4094.     RET
  4095. ;
  4096. NOMRNM:
  4097.     MOV    AL,EOT
  4098.     CALL    SEND
  4099.     STC
  4100.     RET
  4101. ;
  4102. SENDNM:
  4103.     PUSH    BX
  4104. SENDNM1:
  4105.     MOV    DH,11            ;COUNT CHARS IN NAME
  4106.     MOV    CL,0            ;INIT CHECKSUM
  4107.     MOV    AL,CL
  4108.     MOV    FTYCNT,AL        ;INITIATE FILE TYPE COUNT
  4109.     MOV    BX,OFFSET FCB+1        ;ADDRESS NAME
  4110. NAMLPS:
  4111.     MOV    AL,BYTE PTR [BX]    ;SEND NAME
  4112.     AND    AL,07FH            ;STRIP HIGH ORDER BIT SO CP/M 2..
  4113.     CALL    SEND            ;..WON'T SEND R/O FILE DESIGNATION.
  4114.     MOV    AL,QFLG            ;SHOW NAME IF..
  4115.     OR    AL,AL            ;..QFLG NOT SET.
  4116.     MOV    AL,BYTE PTR [BX]
  4117.     JZ    ACKLP
  4118.     CALL    FTYTST            ;TYPE CHARACTER ETC.
  4119. ACKLP:
  4120.     PUSH    CX            ;SAVE CKSUM
  4121.     MOV    CH,1            ;WAIT FOR RECEIVER..
  4122.     CALL    RECV            ;..TO ACKNOWLEDGE..
  4123.     POP    CX            ;..GETTING LETTER.
  4124.     JC    SCKSER
  4125.     CMP    AL,ACK
  4126.     JNZ    ACKLP
  4127.     INC    BX            ;NEXT CHAR
  4128.     DEC    DH
  4129.     JNZ    NAMLPS
  4130.     MOV    AL,EOFCHAR        ;TELL RECEIVER END OF NAME
  4131.     CALL    SEND
  4132.     MOV    AL,QFLG
  4133.     OR    AL,AL
  4134.     JZ    ACKLP1
  4135.     CALL    CRLF
  4136. ACKLP1:
  4137.     MOV    DH,CL                ;SAVE CHECKSUM
  4138.     MOV    CH,1
  4139.     CALL    RECV                ;GET CHECKSUM..
  4140.     CMP    AL,DH                ;..FROM RECEIVER.
  4141.     JZ    NAMEOK
  4142. SCKSER:    MOV    AL,BDNMCH            ;BAD NAME-TELL RECEIVER
  4143.     CALL    SEND
  4144.     CALL    ILPRTQ
  4145.     DB    'Checksum error',CR,LF,0
  4146.     MOV    DL,80                ;DO HANDSHAKING OVER
  4147.     CALL    WAITNLP                ;DON'T PRINT "AWAITING NAK" MSG
  4148.     MOV    AL,ACK
  4149.     CALL    SEND
  4150.     JMP    SENDNM1
  4151. ;
  4152. NAMEOK:
  4153.     MOV    AL,OKNMCH        ;GOOD NAME, TELL RECEIVER
  4154.     CALL    SEND
  4155.     POP    BX
  4156.     RET    
  4157. ;
  4158.                     ;fix for batch mode to save..    @DH
  4159.                     ;drive and handle file name..    @DH
  4160.                     ;properly. call to initfcb+2..    @DH
  4161.                     ;left the byte ptr set wrong..    @DH
  4162. GETFN:    MOV    AL,BYTE PTR .FCB    ;save drive number        @DH
  4163.     MOV    DISKNO,AL        ;                @DH
  4164.     MOV    BX,OFFSET FCB        ;blank out file control block   @DH
  4165.     CALL    INITFCBS        ;                @DH
  4166.     MOV    AL,DISKNO        ;put drive number back        @DH
  4167.     MOV    BYTE PTR .FCB,AL    ;                @DH
  4168. ;GETFN:    MOV    BX,OFFSET FCB        ;                @DH
  4169. ;    CALL    INITFCBS+2        ;DOES NOT INITIALIZE DRIVE    @DH
  4170.     CALL    ILPRTQ
  4171.     DB    'Awaiting file name',CR,LF,0
  4172. GNAMELP:
  4173.     CALL    HSNAK
  4174.     CALL    GETNM        ;GET THE NAME
  4175.     CMP    AL,EOT        ;IF EOT, THEN NO MORE FILES
  4176.     JZ    NOMRNMG
  4177.     OR    AL,AL        ;CLEAR CARRY
  4178.     RET
  4179. ;
  4180. NOMRNMG:
  4181.     STC
  4182.     RET
  4183. ;
  4184. GETNM:
  4185.     PUSH    BX
  4186. GETNM1:
  4187.     MOV    CL,0                ;INIT CHECKSUM
  4188.     MOV    AL,CL
  4189.     MOV    FTYCNT,AL            ;INITIATE COUNT FOR FILE TYPE
  4190.     MOV    BX,OFFSET FCB+1
  4191. NAMELPG:
  4192.     MOV    CH,5
  4193.     CALL    RECV                ;GET CHAR
  4194.     JNC    GETNM3
  4195.     CALL    ILPRTQ
  4196.     DB    'Time out receiving filename',CR,LF,0
  4197.     JMP    GCKSER
  4198. ;
  4199. GETNM3:
  4200.     CMP    AL,EOT                ;IF EOT, THEN NO MORE FILES
  4201.     JNZ    GETNM4
  4202.     JMP    GNRET
  4203.  
  4204. GETNM4:
  4205.     CMP    AL,EOFCHAR            ;GOT END OF NAME
  4206.     JZ    ENDNAME
  4207.     MOV    BYTE PTR [BX],AL        ;PUT NAME IN FCB
  4208.     MOV    AL,QFLG                ;CAN TYPE IT IF NO QFLG
  4209.     OR    AL,AL
  4210.     JZ    SKPTYP
  4211.     CALL    FTYTST
  4212. SKPTYP:
  4213.     PUSH    CX        ;SAVE CKSUM
  4214.     MOV    AL,ACK        ;ACK GETTING LETTER
  4215.     CALL    SEND
  4216.     POP    CX
  4217.     INC    BX        ;GET NEXT CHAR
  4218.     MOV    AL,BL        ;DON'T LET NOISE...
  4219.     CMP    AL,7FH        ;..CAUSE OVERFLOW..
  4220.     JZ    GCKSER        ;..INTO PROGRAM AREA.
  4221.     JMP    NAMELPG
  4222. ;
  4223. FTYTST:
  4224.     INC    FTYCNT
  4225.     CMP    FTYCNT,9    ; ARE WE AT THE FILE TYPE?
  4226.     JZ    SPCTST        ;GO IF SO
  4227. ENDSPT:
  4228.     MOV    AL,BYTE PTR [BX]
  4229.     CMP    AL,' '            ;TEST FOR SPACE
  4230.     JZ    ENDSPT1
  4231.     CALL    TIPE            ;TYPE IF NOT
  4232. ENDSPT1:
  4233.     RET
  4234. ;
  4235. SPCTST:
  4236.     MOV    AL,BYTE PTR [BX]
  4237.     CMP    AL,' '               ;TEST FOR SPACE IN FIRST FILE TYPE BYTE
  4238.     JZ    ENDSPT1            ;DON'T OUTPUT PERIOD IF SPACE
  4239.                     ; MJM 9.01.05 WAS JMPS
  4240.     MOV    AL,'.'    
  4241.     CALL    TIPE
  4242.     JMP    ENDSPT            ;OUTPUT FIRST FILE TYPE BYTE
  4243. ;
  4244. ENDNAME:
  4245.     MOV    AL,QFLG
  4246.     OR    AL,AL
  4247.     JZ    ENDNAME1
  4248.     CALL    CRLF
  4249. ENDNAME1:
  4250.     MOV    AL,CL                ;SEND CHECKSUM
  4251.     CALL    SEND
  4252.     MOV    CH,1
  4253.     CALL    RECV                ;CHECKSUM GOOD?
  4254.     CMP    AL,OKNMCH            ;YES IF OKNMCH SENT..
  4255.     JZ    GNRET                ;..ELSE DO OVER.
  4256. GCKSER:
  4257.     MOV    BX,OFFSET FCB            ;CLEAR FCB (EXCEPT DRIVE)..
  4258.     CALL    INITFCBS+2             ;..SINCE IT MIGHT BE DAMAGED..
  4259.     CALL    ILPRTQ
  4260.     DB    CR,LF,'++ Checksum error ++',CR,LF,0
  4261.     CALL    HSNAK                    ;DO HANDSHAKING OVER
  4262.     JMP    GETNM1
  4263. ;
  4264. GNRET:
  4265.     POP    BX
  4266.     RET
  4267. ;
  4268. HSNAK:
  4269.     MOV    DL,180        ;3-MINUTE MAXIMUM WAIT FOR A FILE NAME
  4270. HSNAK1:
  4271.     CALL    CKABORT        ;WANT TO ABORT?
  4272.     MOV    AL,NAK        ;SEND NAK UNTIL RECEIVING ACK
  4273.     CALL    SEND
  4274.     MOV    CH,1        ;WAIT UP TO 1 SECOND FOR A CHARACTER
  4275.     CALL    RECV
  4276.     CMP    AL,ACK        ;'ACK' IS WHAT WE WERE WAITING FOR
  4277.     JNZ    HSNAK2
  4278.     RET
  4279.  
  4280. HSNAK2:
  4281.     DEC    DL        ;ONE LESS TO TRY
  4282.     JNZ    HSNAK1
  4283.     JMP    ABORT        ;TIMED OUT, ABORT BACK TO COMMAND LINE
  4284. ;
  4285. TNMBUF:
  4286.     MOV    AL,FALSE    ;CALL FROM SENDFIL ONLY ONCE.
  4287.     MOV    FSTFLG,AL
  4288.     MOV    FILECT,AL
  4289.     CALL    SCAN
  4290.     MOV    BX,OFFSET NAMEBUF
  4291.     MOV    NBSAVE,BX        ;SAVE ADDR OF 1ST NAME
  4292. TNLP1:
  4293.     CALL    TRTOBUF
  4294.     MOV    BX,OFFSET FCB
  4295.     MOV    DX,OFFSET FCBBUF
  4296.     CALL    CPMLINE            ;PARSE NAME TO CP/M FORMAT
  4297. TNLP2:
  4298.     CALL    MFNAME            ;SEARCH FOR NAMES (* FORMAT)
  4299.     JC    NEXTNM
  4300.     MOV    AL,BYTE PTR .FCB+10    ;IF CP/M 2 $SYS FILE..
  4301.     AND    AL,80H            ;..DON'T SEND
  4302.     JNZ    TNLP2
  4303.     MOV    BX,NBSAVE        ;GET NAME
  4304.     MOV    DX,OFFSET FCB        ;MOVE IT TO FCB
  4305.     XCHG    BX,DX
  4306.     MOV    CH,12
  4307.     CALL    MOVE
  4308.     XCHG    BX,DX
  4309.     MOV    NBSAVE,BX        ;ADDR OF NEXT NAME
  4310.     MOV    BX,OFFSET FILECT    ;COUNT FILES FOUND
  4311.     INC    BYTE PTR [BX]
  4312.     JMP    TNLP2
  4313. ;
  4314. NEXTNM:
  4315.     MOV    BX,OFFSET SNAMECT     ;COUNT NAMES FOUND
  4316.     DEC    BYTE PTR [BX]
  4317.     JNZ    TNLP1
  4318.     MOV    BX,OFFSET NAMEBUF      ;SAVE START OF BUFFER
  4319.     MOV    NBSAVE,BX
  4320.     MOV    AL,FILECT
  4321.     CMP    AL,65                ;NO MORE THAN 64 TRANSFERS
  4322.     JNC    NEXTNM1
  4323.     RET
  4324.  
  4325. NEXTNM1:
  4326.     MOV    AL,64                ;ONLY X'FER FIRST 64
  4327.     MOV    FILECT,AL
  4328.     RET
  4329. ;
  4330. ;SCANS CMDBUF COUNTING NAMES AND PUTTING DELIMITER (SPACE)
  4331. ;AFTER LAST NAME
  4332. ;
  4333. SCAN:
  4334.     PUSH    BX
  4335.     MOV    BX,OFFSET SNAMECT
  4336.     MOV    BYTE PTR [BX],0
  4337.     MOV    BX,OFFSET CMDBUF+1          ;FIND END OF CMD LINE..
  4338.     MOV    CL,BYTE PTR [BX]          ;..AND PUT SPACE THERE.
  4339.     MOV    CH,0
  4340.     MOV    BX,OFFSET CMDBUF+2
  4341.     ADD    BX,CX
  4342.     MOV    BYTE PTR [BX],20H
  4343.     MOV    BX,OFFSET CMDBUF+1
  4344.     MOV    CH,BYTE PTR [BX]
  4345.     INC    CH
  4346.     INC    CH
  4347. SCANLP1:
  4348.     INC    BX
  4349.     DEC    CH
  4350.     JZ    DNSCAN
  4351.     MOV    AL,BYTE PTR [BX]
  4352.     CMP    AL,20H
  4353.     JNZ    SCANLP1
  4354. SCANLP2:
  4355.     INC    BX            ;EAT EXTRA SPACES
  4356.     DEC    CH
  4357.     JZ    DNSCAN
  4358.     MOV    AL,BYTE PTR [BX]
  4359.     CMP    AL,20H
  4360.     JZ    SCANLP2
  4361.     MOV    BGNMS,BX        ;SAVE START OF NAMES IN CMDBUF
  4362.     INC    CH
  4363.     DEC    BX
  4364. SCANLP3:
  4365.     INC    BX
  4366.     DEC    CH
  4367.     JZ    DNSCAN
  4368.     MOV    AL,BYTE PTR [BX]
  4369.     CMP    AL,20H
  4370.     JNZ    SCANLP3
  4371.     MOV    AL,SNAMECT        ;COUNTS NAMES
  4372.     INC    AL
  4373.     MOV    SNAMECT,AL
  4374. SCANLP4:
  4375.     INC    BX            ;EAT SPACES
  4376.     DEC    CH
  4377.     JZ    DNSCAN
  4378.     MOV    AL,BYTE PTR [BX]
  4379.     CMP    AL,20H
  4380.     JZ    SCANLP4
  4381.     JMP    SCANLP3
  4382. ;
  4383. DNSCAN:
  4384.     MOV    BYTE PTR [BX],20H    ;SPACE AFTER LAST CHAR
  4385.     POP    BX
  4386.     RET
  4387. ;
  4388. ;PLACES NEXT NAME IN BUFFER SO 'CPMLINE' MAY PARSE IT
  4389. ;
  4390. TRTOBUF:
  4391.     MOV    BX,BGNMS
  4392.     MOV    CH,0
  4393.     MOV    DX,OFFSET FCBBUF+2
  4394. TBLP:
  4395.     MOV    AL,BYTE PTR [BX]
  4396.     CMP    AL,20H
  4397.     JZ    TRBFEND
  4398.     XCHG    BX,DX
  4399.     MOV    BYTE PTR [BX],AL
  4400.     XCHG    BX,DX
  4401.     INC    BX
  4402.     INC    DX
  4403.     INC    CH            ;COUNT CHARS IN NAME
  4404.     JMP    TBLP
  4405. ;
  4406. TRBFEND:
  4407.     INC    BX
  4408.     MOV    AL,BYTE PTR [BX]    ;EAT EXTRA SPACES
  4409.     CMP    AL,20H
  4410.     JZ    TRBFEND
  4411.     MOV    BGNMS,BX
  4412.     MOV    BX,OFFSET FCBBUF+1     ;PUT # CHARS BEFORE NAME
  4413.     MOV    BYTE PTR [BX],CH
  4414.     RET
  4415. ;
  4416. RCVSECT:
  4417.     MOV    AL,1
  4418.     MOV    ERRCT,AL
  4419. RCVRPT:
  4420.     CALL    CKABORT            ;WANT TO STOP RECEIVING FILE?
  4421.     MOV    AL,QFLG
  4422.     OR    AL,AL
  4423.     JZ    RCVSQ
  4424.     CALL    ILPRT
  4425.     DB    CR,'Awaiting # ',0
  4426.     PUSH    BX            ;SAVE IT
  4427.     MOV    BX,SECTNO        ;GET SECTOR NUMBER
  4428.     INC    BX            ;BUMP IT
  4429.     CALL    DECOUT            ;PRINT SECTOR NUMBER IN DECIMAL
  4430.     CALL    ILPRT
  4431.     DB    ' (', 0
  4432.     CALL    DHXOUT            ;16 BIT HEX CONVERSION & OUTPUT
  4433.     CALL    ILPRT
  4434.     DB    'H)',0
  4435.     MOV    AL,BL            ;ONLY LOW BYTE USED BY PROGRAM
  4436.     POP    BX            ;RESTORE IT
  4437. RCVSQ:                    ;WAIT FOR SOH OR EOT
  4438.     MOV    CH,10            ;10 SECONDS
  4439.     CALL    RECV
  4440.     JNC    RCVSQ1
  4441.     JMP    RCVSTOT
  4442.  
  4443. RCVSQ1:
  4444.     CMP    AL,SOH
  4445.     JNZ    RCVSQ2
  4446.     JMP    RCVSOH
  4447.  
  4448. RCVSQ2:
  4449.     OR    AL,AL
  4450.     JZ    RCVSQ
  4451.     CMP    AL,EOT
  4452.     STC
  4453.     JNZ    RCVSQ3
  4454.     RET
  4455.  
  4456. RCVSQ3:
  4457.     MOV    CH,AL
  4458.     MOV    AL,QFLG
  4459.     OR    AL,AL
  4460.     JZ    RCVSERR
  4461. RCVSEH:
  4462.     MOV    AL,CH
  4463.     CALL    CRLF
  4464.     CALL    HEXO
  4465.     CALL    ILPRT
  4466.     DB    'H received not SOH - ',0
  4467. RCVPRN:
  4468.     CALL    SHOWERR                ;DISPLAY ERROR COUNT
  4469. RCVSERR:
  4470.     MOV    CH,1            ;WAIT FOR 1 SEC..
  4471.     CALL    RECV            ;..WITH NO CHARS
  4472.     JNC    RCVSERR             ;LOOP UNTIL SENDER DONE
  4473.     CALL    CKABORT            ;WANT TO STOP RECEIVING NOW?
  4474.     MOV    AL,CKSUMFLG        ;GET CHECKSUM FLAG
  4475.     OR    AL,AL            ;CRC IN EFFECT?
  4476.     MOV    AL,NAK            ;PUT NAK IN ACCUM
  4477.     JNZ    RCVSER2            ;NO, SEND THE NAK
  4478.     MOV    AL,FIRSTME         ;GET FIRST TIME SWITCH
  4479.     OR    AL,AL            ;HAS FIRST SOH BEEN RECEIVED?
  4480.     MOV    AL,NAK            ;PUT NAK IN ACCUM
  4481.     JZ    RCVSER2            ;YES, THEN SEND NAK
  4482.     MOV    AL,CRC            ;TELL SENDER CRC IS IN EFFECT
  4483. RCVSER2:
  4484.     CALL    SEND            ;..THE NAK or CRC request
  4485.     MOV    AL,ERRCT        ;ABORT IF..
  4486.     INC    AL            ;..WE HAVE REACHED..
  4487.     MOV    ERRCT,AL        ;..THE ERROR..
  4488.     CMP    AL,ERRLIM        ;..LIMIT?
  4489.     JNC    RCVSER3
  4490.     JMP    RCVRPT            ;..NO, TRY AGAIN
  4491.  
  4492. RCVSER3:
  4493.     MOV    AL,QFLG
  4494.     OR    AL,AL
  4495.     JZ    RCVSABT
  4496. RCVCKQ:
  4497.     CALL    CKQUIT
  4498.     JNZ    RCVSABT
  4499.     JMP    RCVSECT
  4500.  
  4501. RCVSABT:
  4502.     CALL    CLOSFIL            ;CLOSE THE PARTIAL FILE
  4503.     CALL    NOASK            ;DELETE PARTIAL FILE
  4504.     CALL    ILPRT
  4505.     DB    CR,LF,LF
  4506.     DB    '++ File receive cancelled and unfinished file deleted ++'
  4507.     DB    BELL,CR,LF,0
  4508.     JMP    DONETCA
  4509. ;
  4510. RCVSTOT:
  4511.     MOV    AL,QFLG
  4512.     OR    AL,AL
  4513. RCVSPT:    CALL    ILPRT
  4514.     DB    CR,LF,'++ Timeout ',0
  4515.     CALL    SHOWERR
  4516. RCVSCRC:
  4517.     CALL    RCVSCRC2
  4518.     JMP    RCVSERR
  4519. ;
  4520. ;ROUTINE WILL SWITCH FROM CRC TO CHECKSUM IF ERCNT REACHES ERRCRC
  4521. ;AND FIRSTME IS TRUE
  4522. ;
  4523. RCVSCRC2:
  4524.     MOV    AL,ERRCT
  4525.     CMP    AL,ERRCRC
  4526.     JNZ    RCVSCRC3
  4527.     MOV    AL,FIRSTME
  4528.     OR    AL,AL
  4529.     JZ    RCVSCRC3
  4530.     MOV    AL,CKSUMFLG
  4531.     OR    AL,AL
  4532.     JNZ    RCVSCRC3
  4533.     NOT    AL
  4534.     MOV    CKSUMFLG,AL
  4535.     MOV    CKSUMDFLT,AL
  4536.     CALL    ILPRTQ
  4537.     DB    '++ Switching to Checksum mode ++',CR,LF
  4538.     DB    '++ Sender may not be CRC capable ++',CR,LF,BELL,0
  4539. RCVSCRC3:
  4540.     RET
  4541. ;
  4542. ;Got SOH - get block #, block # complemented
  4543. ;
  4544. RCVSOH:
  4545.     XOR    AL,AL            ;ZERO ACCUM
  4546.     MOV    FIRSTME,AL        ;INDICATE FIRST SOH RECV'D
  4547.     MOV    CH,1            ;TIMEOUT = 1 SEC
  4548.     CALL    RECV            ;GET SECTOR
  4549.     JNC    RCVSOH1
  4550.     JMP    RCVSTOT            ;GOT TIMEOUT
  4551.  
  4552. RCVSOH1:
  4553.     MOV    DH,AL
  4554.     MOV    CH,1
  4555.     CALL    RECV
  4556.     JNC    RCVSOH2
  4557.     JMP    RCVSTOT
  4558.  
  4559. RCVSOH2:
  4560.     NOT    AL
  4561.     CMP    AL,DH
  4562.     JZ    RCVDATA
  4563.     MOV    AL,QFLG
  4564.     OR    AL,AL
  4565.     JNZ    RCVBSE
  4566.     JMP    RCVSERR
  4567.  
  4568. RCVBSE:
  4569.     CALL    ILPRT
  4570.     DB    CR,LF,'++ Bad sector # in Header ',0
  4571.     JMP    RCVPRN
  4572. ;
  4573. RCVDATA:
  4574.     MOV    AL,DH
  4575.     MOV    RCVSNO,AL
  4576.     MOV    AL,1
  4577.     MOV    DATAFLG,AL
  4578.     MOV    CL,0
  4579.     CALL    CLRCRC            ;CLEAR CRC COUNTER
  4580.     MOV    BX,OFFSET 80H
  4581. RCVCHR:
  4582.     MOV    CH,1
  4583.     CALL    RECV
  4584.     JNC    RCVCHR1
  4585.     JMP    RCVSTOT
  4586.  
  4587. RCVCHR1:
  4588.     MOV    BYTE PTR [BX],AL
  4589.     INC    BL
  4590.     JNZ    RCVCHR
  4591.     MOV    AL,CKSUMFLG
  4592.     OR    AL,AL
  4593.     JZ    RCVCRC
  4594.     MOV    DH,CL            ; 9.01.02 MJM 7/8/83
  4595.     XOR    AL,AL
  4596.     MOV    DATAFLG,AL
  4597.     MOV    CH,1
  4598.     CALL    RECV
  4599.     JNC    RCVCHR2
  4600.     JMP    RCVSTOT
  4601.  
  4602. RCVCHR2:
  4603.     CMP    AL,DH
  4604.     JNZ    RCVCERR
  4605. CHKSNUM:
  4606.     MOV    AL,RCVSNO
  4607.     MOV    CH,AL
  4608.     MOV    AX,SECTNO
  4609.     CMP    AL,CH
  4610.     JZ    RECVACK
  4611.     INC    AL
  4612.     CMP    AL,CH
  4613.     JZ    CHKSNUM1
  4614.     JMP    ABORT
  4615.  
  4616. CHKSNUM1:
  4617.     RET
  4618. ;
  4619. RCVCRC:
  4620.     MOV    DL,2            ;NUMBER OF CRC BYTES
  4621. RCVCRC2:
  4622.     MOV    CH,1
  4623.     CALL    RECV
  4624.     JNC    RCVCRC3
  4625.     JMP    RCVSTOT
  4626.  
  4627. RCVCRC3:
  4628.     DEC    DL
  4629.     JNZ    RCVCRC2
  4630.     CALL    CHKCRC
  4631.     OR    AL,AL
  4632.     JZ    CHKSNUM
  4633.     MOV    AL,QFLG
  4634.     OR    AL,AL
  4635.     JNZ    RCVCRER
  4636.     JMP    RCVSERR
  4637.  
  4638. RCVCRER:
  4639.     CALL    ILPRT
  4640.     DB    CR,LF,'++ CRC error ',0
  4641.     JMP    RCVPRN
  4642. ;
  4643. RCVCERR:
  4644.     MOV    AL,QFLG
  4645.     OR    AL,AL
  4646.     JNZ    RCVCPR
  4647.     JMP    RCVSERR
  4648.  
  4649. RCVCPR:
  4650.     CALL    ILPRT
  4651.     DB    CR,LF,'++ Checksum error ',0
  4652.     JMP    RCVPRN
  4653. ;
  4654. RECVACK:
  4655.     CALL    SENDACK
  4656.     JMP    RCVSECT
  4657. ;
  4658. SENDACK:
  4659.     MOV    AL,ACK
  4660.     CALL    SEND
  4661.     RET
  4662. ;
  4663. SENDHDR:
  4664.     MOV    AL,QFLG
  4665.     OR    AL,AL
  4666.     JZ    SENDHNM
  4667.     CALL    ILPRT
  4668.     DB    CR,'Sending # ',0
  4669.     PUSH    BX
  4670.     MOV    BX,SECTNO        ;GET SECTOR NUMBER
  4671.     CALL    DECOUT            ;PRINT IT IN DECIMAL
  4672.     CALL    ILPRT
  4673.     DB    ' (',0
  4674.     CALL    DHXOUT            ;16 BIT HEX CONVERSION & OUTPUT
  4675.     CALL    ILPRT
  4676.     DB    'H)',0
  4677.     POP    BX
  4678. SENDHNM:
  4679.     MOV    AL,SOH
  4680.     CALL    SEND
  4681.     MOV    AX,SECTNO
  4682.     CALL    SEND
  4683.     MOV    AX,SECTNO
  4684.     NOT    AL
  4685.     CALL    SEND
  4686.     RET
  4687. ;
  4688. SENDSEC:
  4689.     MOV    AL,1
  4690.     MOV    DATAFLG,AL
  4691.     MOV    CL,0
  4692.     CALL    CLRCRC
  4693.     MOV    BX,OFFSET 80H
  4694. SENDC:
  4695.     MOV    AL,BYTE PTR [BX]
  4696.     CALL    SEND
  4697.     INC    BL
  4698.     JNZ    SENDC
  4699.     XOR    AL,AL
  4700.     MOV    DATAFLG,AL
  4701.     RET
  4702. ;
  4703. SENDCKS:
  4704.     MOV    AL,CL
  4705.     CALL    SEND
  4706.     RET
  4707. ;
  4708. SENDCRC:
  4709.     CALL    FINCRC
  4710.     MOV    AL,DH
  4711.     CALL    SEND
  4712.     MOV    AL,DL
  4713.     CALL    SEND
  4714.     XOR    AL,AL
  4715.     RET
  4716. ;
  4717. ;
  4718. ;After a record is sent, a character is returned telling if it was re-
  4719. ;ceived properly or not.  An ACK allows the next record to be sent.  A
  4720. ;NAK sends an error message and the current record is again repeated.
  4721. ;This occurs until the error limit has been reached.  If the first NAK
  4722. ;is missed, it waits up to 12 seconds before declaring a 2nd error.
  4723. ;This insures there is no collision with the station attempting to send
  4724. ;the NAK, since it waits only 10 seconds.
  4725. ;
  4726. GETACK:
  4727.     MOV    CH,12            ;12 SECONDS
  4728.     CALL    RECVDG            ;WAIT FOR ACK OR NAK
  4729.     JNC    GETACK1
  4730.     JMP    GETATOT            ;NO CHARACTER, TIMED OUT
  4731.  
  4732. GETACK1:
  4733.     CMP    AL,ACK
  4734.     JNZ    NOTACK
  4735.     RET                ;IF ACK RETURN AND SEND NEXT RECORD
  4736.  
  4737. NOTACK:
  4738. ;
  4739. ;If the ACKNAK option is FALSE it will resend the sector when any char-
  4740. ;acter other than ACK is received (including NAK).
  4741. ;
  4742.     MOV    CH,AL
  4743.     MOV    AL,NAKONLY
  4744.     OR    AL,AL
  4745.     JZ    ALLOTH
  4746.     CMP    AL,NAK            ;WAS IT AN AUTHENTIC 'NAK'?
  4747.     JNZ    GETACK            ;IGNORE IF NEITHER 'ACK' NOR 'NAK'
  4748.                     ;WILL EVENTUALLY TIME OUT
  4749. ALLOTH:
  4750.     MOV    AL,QFLG
  4751.     OR    AL,AL
  4752.     JZ    ACKERR
  4753.     CALL    ILPRT
  4754.     DB    CR,LF,'++ ',0
  4755.     MOV    AL,CH
  4756.     CMP    AL,NAK            ;IS IT A 'NAK'?
  4757.     JZ    GETACK2            ;SHOW 'NAK' IN THAT CASE
  4758.     CALL    HEXO
  4759.     MOV    AL,'H'
  4760.     CALL    TIPE
  4761.     JMP    GETACK3
  4762. GETACK2:
  4763.     CALL    ILPRT
  4764.     DB    'NAK',0    
  4765. GETACK3:
  4766.     CALL    ILPRT                ;PRINT THE ERROR MESSAGE
  4767.     DB    ' received not ACK - ',0
  4768.     CALL    SHOWERR                ;SHOW THE ERROR NUMBER
  4769. ACKERR:
  4770.     MOV    AL,ERRCT
  4771.     INC    AL
  4772.     MOV    ERRCT,AL
  4773.     DEC    AL
  4774.     CMP    AL,ERRLIM
  4775.     JNC    ACKERR1
  4776.     RET
  4777.  
  4778. ACKERR1:
  4779.     MOV    AL,QFLG
  4780.     OR    AL,AL
  4781.     JZ    CSABORT
  4782. GACKV:
  4783.     CALL    CKQUIT
  4784.     STC
  4785.     JNZ    CSABORT
  4786.     RET
  4787. CSABORT:
  4788.     CALL    ERXIT
  4789.     DB    CR,LF,'Can''t send sector -- Aborting',CR,LF,'$'
  4790. GETATOT:
  4791.     MOV    AL,QFLG
  4792.     OR    AL,AL
  4793.     JZ    ACKERR
  4794.     CALL    ILPRT
  4795.     DB    CR,LF,'++ Timeout on ACK - ',0
  4796.     CALL    SHOWERR                    ;DISPLAY ERROR COUNT
  4797.     JMP    ACKERR
  4798. ;
  4799. CKABORT:
  4800. ;    MOV    AL,QFLG            ;SO CTRL X..            @DH
  4801. ;    OR    AL,AL            ;..WILL WORK..            @DH
  4802. ;    JNZ    CKABGO            ;..EVEN IF IN..            @DH
  4803. ;    RET                ;..QUIET MODE.            @DH
  4804.  
  4805. CKABGO:
  4806.     CALL    STAT
  4807.     JNZ    CKABGO1
  4808.     RET
  4809.  
  4810. CKABGO1:
  4811.     CALL    KEYIN
  4812.     CMP    AL,CAN
  4813.     JZ    ABORT
  4814.     RET
  4815.  
  4816. ABORT:    
  4817.     MOV    CH,1
  4818.     CALL    RECV
  4819.     JNC    ABORT
  4820.     MOV    AL,CAN
  4821.     CALL    SEND
  4822. ABORTW:
  4823.     MOV    CH,1
  4824.     CALL    RECV
  4825.     JNC    ABORTW
  4826.     MOV    AL,' '
  4827.     CALL    SEND
  4828.     MOV    AL,'B'             ;TURN MULTI-FILE MODE..
  4829.     MOV    BATCHFLG,AL        ;..OFF SO ROUTINE ENDS.
  4830.     MOV    AL,OPTION        ;RECEIVING A FILE NOW?
  4831.     CMP    AL,'R'
  4832.     JNZ    ABORTW1
  4833.     JMP    RCVSABT            ;IF YES, CANCEL THE UNFINISHED FILE
  4834.  
  4835. ABORTW1:
  4836.     CALL    ILPRT
  4837.      DB    CR,LF,LF,'++ File send cancelled ++',CR,LF,BELL,0
  4838.     JMP    DONETCA
  4839. ;
  4840. INCRSNO:
  4841.     INC    SECTNO            ; INCREMENT SECTOR NUMBER
  4842.     MOV    AX,SECTNO       ; NEED IT IN LOW BYTE, DON'T CARE ABOUT HIGH
  4843.     RET
  4844. ;
  4845. ;---->    RECV: Receive a character
  4846. ;
  4847. ;Timeout time is in B, in seconds. Entry via 'RECVDG' deletes garbage
  4848. ;characters on the line. For example, having just sent a sector, calling
  4849. ;RECVDG will delete any line noise induced characters LONG before the
  4850. ;ACK/NAK would be received.
  4851. ;
  4852. RECVDG:
  4853.     CALL    CKMODM            ;CATCH ANY GARBAGE CHARACTERS
  4854. RECV:
  4855.     PUSH    DX
  4856. MSEC:
  4857.     PUSH    BX
  4858.     MOV    BX,OFFSET 5000
  4859.     CALL    FIXCNT
  4860.     PUSH    BX
  4861.     POP    DX
  4862.     POP    BX
  4863.     CALL    CKABORT
  4864. MWTI:
  4865.     CALL    RCVREADY
  4866.     JZ    MCHAR
  4867.     DEC    DL
  4868.     JNZ    MWTI
  4869.     DEC    DH
  4870.     JNZ    MWTI
  4871.     DEC    CH
  4872.     JNZ    MSEC
  4873.     POP    DX
  4874.     STC
  4875.     RET
  4876. ;
  4877. MCHAR:
  4878.     CALL    INMODDATP
  4879.     POP    DX
  4880.     PUSH    AX
  4881.     CALL    UPDCRC              ;CALCULATE CRC
  4882.     ADD    CL,AL
  4883.     MOV    AL,RSEEFLG
  4884.     OR    AL,AL
  4885.     JZ    MONIN
  4886.     MOV    AL,VSEEFLG
  4887.     OR    AL,AL
  4888.     JNZ    NOMONIN
  4889.     MOV    AL,DATAFLG
  4890.     OR    AL,AL
  4891.     JZ    NOMONIN
  4892. MONIN:
  4893.     POP    AX
  4894.     PUSH    AX
  4895.     CALL    SHOW
  4896. NOMONIN:
  4897.     POP    AX
  4898.     OR    AL,AL
  4899.     RET
  4900. ;
  4901. SEND:
  4902.     PUSH    AX
  4903.     MOV    AL,SSEEFLG
  4904.     OR    AL,AL
  4905.     JZ    MONOUT
  4906.     MOV    AL,VSEEFLG
  4907.     OR    AL,AL
  4908.     JNZ    NOMONOT
  4909.     MOV    AL,DATAFLG
  4910.     OR    AL,AL
  4911.     JZ    NOMONOT
  4912. MONOUT:
  4913.     POP    AX
  4914.     PUSH    AX
  4915.     CALL    SHOW
  4916. NOMONOT:
  4917.     POP    AX
  4918.     PUSH    AX
  4919.     CALL    UPDCRC            ;CALCULATE CRC
  4920.     ADD    CL,AL
  4921. SENDW:
  4922.     CALL    SENDREADY
  4923.     JNZ    SENDW
  4924.     POP    AX
  4925.     CALL    OUTMODDATP
  4926.     RET
  4927. ;
  4928. WAITNAK:
  4929.     CALL    ILPRTQ
  4930.     DB    'Awaiting initial NAK',CR,LF,0
  4931. WAITNLP:
  4932.     CALL    CKABORT
  4933.     MOV    CH,1
  4934.     CALL    RECV
  4935.     CMP    AL,NAK
  4936.     JNZ    WAITNLP1
  4937.     RET
  4938.  
  4939. WAITNLP1:
  4940.                     ;CTRL X FIX            @DH
  4941.     CMP    AL,CAN            ;ABORT REQUEST?            @DH
  4942.     JNZ    WAITNLP0        ;NO..                @DH
  4943.     JMP    ABORT            ;YES ABORT            @DH
  4944. WAITNLP0:                ;                @DH
  4945.     CMP    AL,CRC            ;CRC REQUEST?
  4946.     JZ    WAITCRC            ;YES, GO SET CRC FLAG
  4947. ;    CMP    AL,CAN            ;                @DH
  4948. ;    JNZ    WAITNLP2        ;                @DH
  4949. ;    JMP    ABORT            ;                @DH
  4950.  
  4951. WAITNLP2:
  4952.     DEC    DL
  4953.     JNZ    WAITNLP
  4954.     JMP    ABORT
  4955. ;
  4956. WAITCRC:
  4957.     CALL    ILPRTQ
  4958.     DB    'CRC request received',CR,LF,0
  4959.     XOR    AL,AL
  4960.     MOV    CKSUMFLG,AL
  4961.     RET
  4962. ;
  4963. ;RETURNS W/ ZERO SET IF RETRY ASKED. IF MULTI-FILE MODE, THEN
  4964. ;NO QUESTIONS ASKED, JUST QUIT
  4965. ;
  4966. CKQUIT:
  4967.     MOV    AL,BATCHFLG
  4968.     OR    AL,AL
  4969.     JNZ    CKQTASK            ;ASK FOR RETRY
  4970.     INC    AL            ;RESET ZERO FLG
  4971.     RET
  4972. ;
  4973. CKQTASK:
  4974.     MOV    ERRCT,1
  4975.     CALL    ILPRT
  4976.     DB    CR,LF,'Multiple errors encountered.',CR,LF
  4977.     DB    'Type Q to quit, R to retry:  ',BELL,0
  4978.     CALL    KEYIN
  4979.     CALL    CRLF
  4980.     CALL    UCASE            ;INSTEAD OF "ANI 5FH"
  4981.     CMP    AL,'R'
  4982.     JZ    CKQTASK1
  4983.     CMP    AL,'Q'
  4984.     JNZ    CKQUIT
  4985.     OR    AL,AL
  4986. CKQTASK1:
  4987.     RET
  4988. ;
  4989. ;Get the error count and display on CRT
  4990. ;
  4991. SHOWERR:
  4992.     PUSH    BX            ;SAVE THE CURRENT ADDRESS
  4993.     MOV    BL,ERRCT        ;GET THE CURRENT ERROR NUMBER
  4994.     MOV    BH,0            ;ONLY A 8-BIT NUMBER, NOW IN 'L' REG.
  4995.     CALL    DECOUT            ;DISPLAY THE ERROR IN DECIMAL
  4996.     POP    BX            ;RESTORE THE CURRENT ADDRESS
  4997.     CALL    ILPRT
  4998.     DB    ' ++',CR,LF,0        ;FINISH THE ERROR MESSAGE
  4999.     RET
  5000. ;
  5001. ERXIT:
  5002.     POP    DX
  5003.     CALL    PRTMSG
  5004.     MOV    AL,BELL
  5005.     CALL    TIPE
  5006.     MOV    AL,BATCHFLG
  5007.     OR    AL,AL
  5008.     JZ    ERXIT1
  5009.     JMP    DONETCA
  5010.  
  5011. ERXIT1:
  5012.     MOV    AL,'Q'            ;RESET QFLG
  5013.     MOV    QFLG,AL
  5014.     JMP    ABORT            ;ABORT OTHER COMPUTER
  5015. ;
  5016. DONE:
  5017.     MOV    AL,BATCHFLG
  5018.     OR    AL,AL
  5019.     JZ    DONE1
  5020.     JMP    DONETC
  5021.  
  5022. DONE1:
  5023.     MOV    AL,QFLG
  5024.     OR    AL,AL
  5025.     JZ    NMSTRNS
  5026.     MOV    CH,12            ;ZERO OUT FTRNMSG
  5027.     MOV    BX,OFFSET FTRNMSG
  5028. ZEROLP:
  5029.     MOV    BYTE PTR [BX],' '     ; mjm 9.01.05 FIX BATCH NAME REPORT
  5030.     INC    BX
  5031.     DEC    CH
  5032.     JNZ    ZEROLP
  5033.     MOV    CH,12            ;PUT FILE NAME IN FTRNMSG
  5034.     MOV    BX,OFFSET FCB+1        
  5035.     MOV    DX,OFFSET FTRNMSG
  5036. LOADMSG:
  5037.     MOV    AL,4            ;START OF FILE TYPE?
  5038.     CMP    AL,CH
  5039.     JZ    PERIOD            ;PUT IN PERIOD IF SO
  5040.     MOV    AL,BYTE PTR [BX]    
  5041.     CMP    AL,' '            ;DON'T PUT IN SPACE
  5042.     JZ    SKPSP    
  5043.     XCHG    BX,DX
  5044.     MOV    BYTE PTR [BX],AL    ;STORE IN FTRNMSG
  5045.     XCHG    BX,DX
  5046.     INC    DX
  5047. SKPSP:
  5048.     INC    BX
  5049.     DEC    CH
  5050.     MOV    AL,CH
  5051.     OR    AL,AL            ;END OF FILE NAME?
  5052.     JZ    FTRNMSG0        ;DISPLAY FILE NAME
  5053.     JMP    LOADMSG            ;LOOP FOR ANOTHER CHARACTER
  5054. ;
  5055. PERIOD:
  5056.     MOV    AL,BYTE PTR [BX]
  5057.     CMP    AL,' '            ;IS FILE TYPE EMPTY?
  5058.     JZ    FTRNMSG0        ;GO IF SO
  5059.     MOV    AL,'.'            ;ELSE PUT PERIOD IN MESSAGE
  5060.     XCHG    BX,DX
  5061.     MOV    BYTE PTR [BX],AL
  5062.     XCHG    BX,DX
  5063.     INC    DX
  5064.     DEC    CH
  5065.     JMP    LOADMSG    
  5066. ;
  5067. FTRNMSG0:
  5068.     CALL    ILPRT
  5069.     DB    CR,LF
  5070. FTRNMSG    RB    12
  5071.     DB    0
  5072.     CALL    ILPRT
  5073.     DB    ' Transferred',CR,LF,LF,0
  5074. NMSTRNS:
  5075.     MOV    AL,BYTE PTR .FCB            ;SAVE DRIVE NO.
  5076.     MOV    DISKNO,AL
  5077.     MOV    BX,OFFSET FCB            ;BLANK OUT FILE CONTROL BLOCKS
  5078.     CALL    INITFCBS
  5079.     MOV    AL,DISKNO            ;PUT DRIVE NUMBER BACK
  5080.     MOV    BYTE PTR .FCB,AL
  5081.     MOV    BX,OFFSET RESTSN         ;RESTORE SECTOR NUMBERS..
  5082.     MOV    DX,OFFSET SECTNOB         ;..FOR NEW FILE TRANSFER.
  5083.     MOV    CH,OFFSET SECTNOE-OFFSET SECTNOB    ;ROUTINE ALSO DONE IN MENU.
  5084.     CALL    MOVE
  5085.     CALL    CKMODM                ;CATCH ANY GARBAGE CHARACTERS
  5086.     MOV    AL,SENDFLG            ;GOES TO EITHER SEND OR..
  5087.     OR    AL,AL                ;..RECEIVE FILE, DEPENDING..
  5088.     JZ    NMSTRNS1
  5089.     JMP    SENDFIL1            ;..UPON WHICH ROUTINE SET..
  5090.  
  5091. NMSTRNS1:
  5092.     JMP    RCVFIL1                ;..THE FLAG IN MULTI-FILE MODE.
  5093. ;
  5094. DONETC:
  5095.     CALL    CKABORT                ;SLIGHT DELAY FOR NEXT MESSAGE
  5096.     CALL    ILPRT
  5097.     DB    CR,LF,'All transfers completed',CR,LF,BELL,0
  5098. DONETCA:
  5099.     MOV    AL,TRUE
  5100.     MOV    FIRSTME,AL            ;SET FIRST-TIME FLAG
  5101.     MOV    FSTFLG,AL            ;RESET MULTIFILE TRANS
  5102.     MOV    NFILFLG,AL            ;..USED IN TERMINAL ROUTINE
  5103.     NOT    AL
  5104.     MOV    SAVEFLG,AL        ;STOP MEMORY SAVE IN TERM ROUTINE
  5105.     MOV    LISTMOR,AL        ;STOP ANY BUFFERED OUTPUT TO PRINTER
  5106.     MOV    BX,OFFSET BOTTRAM    ;RESET PRINTER BUFFER POINTERS
  5107.     MOV    HLSAVE1,BX
  5108.     MOV    HLSAVE2,BX
  5109.     MOV    AL,TERMFLG        ;SEE IF RETURN TO..
  5110.     OR    AL,AL            ;..TERMINAL MODE..
  5111.     JNZ    DONETCA1        ;..AFTER X'FER.
  5112.     CALL    ILPRT
  5113.     DB    CR,LF,'** Entering terminal mode **',CR,LF,LF,BELL,0
  5114.     JMP    TERM
  5115.  
  5116. DONETCA1:
  5117.     JMP    MENU
  5118. ;
  5119. ;Shows the time to transfer a file at various baud rates
  5120. ;
  5121. SENDTIM:
  5122.     CALL    ILPRT                ;PRINT
  5123.     DB    'File open:  ',0
  5124.     MOV    BX,RCNT            ;GET RECORD COUNT.
  5125.     CALL    DECOUT            ;PRINT DECIMAL NUMBER OF RECORDS
  5126.     CALL    ILPRT
  5127.     DB    ' (',0
  5128.     CALL    DHXOUT            ;NOW PRINT SIZE IN HEX.
  5129.     CALL    ILPRT
  5130.     DB    ' Hex) Records',CR,LF
  5131.     DB    'Send time:  ',0
  5132.     MOV    AL,MSPEED        ;GET THE SPEED INDICATOR
  5133.     MOV    DH,0
  5134.     MOV    DL,AL            ;SET UP FOR TABLE ACCESS
  5135.     MOV    BX,OFFSET BTABLE    ;POINT TO BAUD FACTOR TABLE
  5136.     ADD    BX,DX            ;INDEX TO PROPER FACTOR
  5137.     ADD    BX,DX
  5138.     MOV    DL,BYTE PTR [BX];FACTOR IN DE
  5139.     INC    BX
  5140.     MOV    DH,BYTE PTR [BX]
  5141.     MOV    BX,RCNT            ;GET # OF RECORDS
  5142.     CALL    DIVHLDE                    ;DIVIDE HL BY VALUE IN A (RECORDS/MIN)
  5143.     PUSH    BX
  5144.     MOV    BX,CX
  5145.     CALL    DECOUT            ;PRINT THE MINUTES PORTION
  5146.     CALL    ILPRT
  5147.     DB    ' mins, ',0
  5148.     MOV    BX,OFFSET SECTBL        ;POINT TO DIVISORS FOR SECONDS
  5149.     MOV    DX,0            ;   CALCULATION
  5150.     MOV    AL,MSPEED        ;GET INDEX FOR BAUD RATE
  5151.     MOV    DL,AL
  5152.     ADD    BX,DX            ;INDEX INTO TABLE
  5153.     MOV    AL,BYTE PTR [BX]    ;GET MULTIPLIER = (SEC/REC) x 16
  5154.     POP    BX            ;GET REMAINDER
  5155.     CALL    MULHLA            ;MULTIPLY THE 'HL' x 'A'
  5156.     CALL    SHFTHL            ;DIVIDE BY 16
  5157.     CALL    SHFTHL
  5158.     CALL    SHFTHL
  5159.     CALL    SHFTHL    
  5160.     MOV    BH,0
  5161.     CALL    DECOUT            ;PRINT THE SECONDS PORTION
  5162.     CALL    ILPRT
  5163.     DB    ' secs at ',0
  5164.     CALL    BAUDPRT
  5165.     CALL    ILPRT
  5166.         DB    'To cancel use ctrl-X',CR,LF,0
  5167.     RET
  5168. ;
  5169. ; CORRECTED BY M.J. MELLINGER FOR 9.01.05 11/25/83
  5170. BTABLE    DW    5,13,25,48,96,192,384,0    ;RECORDS/MIN FOR 110-9600 BAUD
  5171. SECTBL    DB    192,74,38,20,11,5,3,0
  5172. ;
  5173. ;    
  5174. ;---->  DIVHLDE: DIVIDES 'HL' BY VALUE IN 'DE', 
  5175. ;    UPON EXIT: 'BC'=QUOTIENT,'L'=REMAINDER
  5176. ;
  5177. DIVHLDE:
  5178.     PUSH    DX        ;SAVE DIVISOR
  5179. ;    MOV    AL,DL
  5180. ;    NOT    AL        ;NEGATE DIVISOR
  5181. ;    MOV    DL,AL
  5182. ;    MOV    AL,DH
  5183. ;    NOT    AL
  5184. ;    MOV    DH,AL
  5185. ;    INC    DX        ;DE IS NOW TWOS COMPLEMENTED
  5186.     NEG    DX
  5187.     MOV    CX,0        ;INITIATE QUOTIENT
  5188. DIVL1:
  5189.     ADD    BX,DX        ;SUBTRACT DIVISOR FROM DIVIDEND
  5190.     INC    CX        ;INCREASE QUOTIENT
  5191.     JC    DIVL1        ;LOOP UNTIL SIGN CHANGES
  5192.     DEC    CX        ;ADJUST QUOTIENT
  5193.     POP    DX        ;RETRIEVE DIVISOR
  5194.     ADD    BX,DX        ;ADJUST REMAINDER
  5195.     RET
  5196.  
  5197. ;
  5198. ;---->  MULHLA:  MULTIPLY THE VALUE IN 'HL' BY THE VALUE IN 'A'
  5199. ;            RETURN WITH ANSWER IN 'HL'
  5200. ;
  5201. MULHLA:
  5202.     XCHG    BX,DX        ;MULTIPLICAND TO DE
  5203.     MOV    BX,OFFSET 0    ;INITIALIZE PRODUCT
  5204.     INC    AL        ;ADJUST MULTIPLIER
  5205. MULLP:
  5206.     DEC    AL
  5207.     JNZ    MULLP1
  5208.     RET
  5209.  
  5210. MULLP1:
  5211.     ADD    BX,DX
  5212.     JMPS    MULLP
  5213. ;
  5214. ;  SHIFT 'HL' REGISTER PAIR ONE BIT TO THE RIGHT
  5215. ;
  5216. SHFTHL:
  5217.     CLC                        ;CLEAR THE CARRY
  5218.     RCR    BX,1
  5219.     RET
  5220. ;
  5221. ;****************************************************************
  5222. ;*                                *
  5223. ;*   CRCSUBS (Cyclic Redundancy Code Subroutines) version 1.20    *
  5224. ;*   8080 Mnemonics                        *
  5225. ;*                                *
  5226. ;*     These subroutines will compute and check a true 16-bit    *
  5227. ;*   Cyclic Redundancy Code for a message of arbitrary length.    *
  5228. ;*                                *
  5229. ;*     The use of this scheme will guarantee detection of all    *
  5230. ;*   single and double bit errors, all  errors  with  an  odd    *
  5231. ;*   number  of  error bits, all burst errors of length 16 or    *
  5232. ;*   less, 99.9969% of all 17-bit error bursts, and  99.9984%    *
  5233. ;*   of  all  possible  longer  error bursts.  (Ref: Computer    *
  5234. ;*   Networks, Andrew S.  Tanenbaum, Prentiss-Hall, 1981)    *
  5235. ;*                                *
  5236. ;*   Designed & coded by Paul Hansknecht, June 13, 1981        *
  5237. ;*                                *
  5238. ;*   Copyright (c) 1981, Carpenter Associates            *
  5239. ;*            Box 451                    *
  5240. ;*            Bloomfield Hills, MI 48013            *
  5241. ;*            313/855-3074                *
  5242. ;*                                *
  5243. ;*   This program may be freely reproduced for non-profit use.    *
  5244. ;*                                *
  5245. ;****************************************************************
  5246. ;
  5247. ;
  5248. CLRCRC:                ;RESET CRC ACCUMULATOR FOR A NEW MESSAGE.
  5249.     MOV    CRCVAL,0
  5250.     RET
  5251. ;
  5252. UPDCRC:                ;UPDATE CRC ACCUMULATOR USING BYTE IN (A).
  5253.     PUSH    AX
  5254.     PUSH    CX
  5255.     PUSH    BX
  5256.     MOV    CH,8
  5257.     MOV    CL,AL
  5258.     MOV    BX,CRCVAL
  5259. UPDLOOP:
  5260.     ROL    CL,1
  5261. ;    MOV    AL,CL
  5262. ;    ROL    AL,1
  5263. ;    MOV    CL,AL
  5264.     RCL    BX,1
  5265.     JNC    SKIPIT
  5266.     XOR    BX,1021H
  5267. SKIPIT:
  5268.     DEC    CH        ;AND XOR 05H FOR XOR 21H IN THE ADJACENT CODE
  5269.     JNZ    UPDLOOP
  5270.     MOV    CRCVAL,BX
  5271.     POP    BX
  5272.     POP    CX
  5273.     POP    AX
  5274.     RET
  5275. ;
  5276. FINCRC:                ;FINISH CRC CALCULATION FOR OUTPUT MESSAGE
  5277.     PUSH    AX
  5278.     XOR    AL,AL
  5279.     CALL    UPDCRC
  5280.     CALL    UPDCRC
  5281.     MOV    DX,CRCVAL
  5282.     POP    AX
  5283.     RET
  5284. ;
  5285. CHKCRC:                ;CHECK CRC BYTES OF RECEIVED MESSAGE
  5286.     MOV    AX,CRCVAL
  5287.     OR    AL,AH
  5288.     JZ    CHKCRCRT
  5289.     MOV    AL,0FFH
  5290. CHKCRCRT:
  5291.     RET
  5292. ;
  5293. CRCVAL    DW    0
  5294. ;
  5295. ;
  5296. ;        FILES.A86
  5297. ;
  5298. ;Disk file routines for MODEM9.xx.
  5299. ;
  5300. ;
  5301. ;Multi-file access subroutine.  Allows processing of multiple files
  5302. ;(i.e., *.ASM) from disk.  This routine builds the proper name in the
  5303. ;FCB each time it is called.  This command would be used in such pro-
  5304. ;grams such as modem transfer, tape save, etc. in which you want to
  5305. ;process single or multiple files.
  5306. ;
  5307. ;The FCB will be set up with the next name, ready to do normal proces-
  5308. ;sing (OPEN, READ, etc.) when routine is called.
  5309. ;
  5310. ;Carry is set if no more names can be found
  5311. ;
  5312. MFNAME:                    ;INIT DMA ADDR, FCB
  5313.     MOV    CL,STDMA
  5314.     MOV    DX,OFFSET 80H
  5315.     INT    224
  5316.     MOV    byte ptr .FCBEXT,0
  5317.     TEST    MFFLG1,0FFH
  5318.     JNZ    MFN01            ;IF FIRST TIME
  5319.     MOV    MFFLG1,1        ;TURN OFF 1ST TIME SW
  5320.     MOV    BX,OFFSET FCB        ;SAVE THE REQUESTED NAME
  5321.     MOV    DX,OFFSET MFREQ
  5322.     MOV    CX,OFFSET 12
  5323.     CALL    MOVER
  5324.     MOV    AL,BYTE PTR .FCB
  5325.     MOV    MFCUR,AL        ;SAVE DISK IN CURRENT FCB
  5326.     MOV    BX,OFFSET MFREQ        ;SRCHF REQ NAME
  5327.     MOV    DX,OFFSET FCB
  5328.     MOV    CX,OFFSET 12
  5329.     CALL    MOVER
  5330.     PUSH    CX
  5331.     PUSH    DX
  5332.     PUSH    BX
  5333.     MOV    CL,SRCHF
  5334.     MOV    DX,OFFSET FCB
  5335.     INT    224
  5336.     POP    BX
  5337.     POP    DX
  5338.     POP    CX
  5339.     JMP    MFN02
  5340. ;
  5341. MFN01:
  5342.     MOV    BX,OFFSET MFCUR        ;SRCHF CURR NAME
  5343.     MOV    DX,OFFSET FCB
  5344.     MOV    CX,OFFSET 12
  5345.     CALL    MOVER
  5346.     MOV    CL,SRCHF
  5347.     MOV    DX,OFFSET FCB
  5348.     INT    224
  5349.     MOV    BX,OFFSET MFREQ        ;SRCHN REQ NAME
  5350.     MOV    DX,OFFSET FCB
  5351.     MOV    CX,OFFSET 12
  5352.     CALL    MOVER
  5353.     MOV    CL,SRCHN
  5354.     MOV    DX,OFFSET FCB
  5355.     INT    224
  5356. MFN02:
  5357.     INC    AL            ;RETURN CARRY IF NOT FOUND
  5358.     STC
  5359.     JNZ    MFFIX1
  5360.     MOV    MFFLG1,AL
  5361.     RET
  5362. ;
  5363. MFFIX1:
  5364.     DEC    AL            ;MOVE NAME FOUND TO CURR
  5365.     AND    AL,3
  5366.     ADD    AL,AL
  5367.     ADD    AL,AL
  5368.     ADD    AL,AL
  5369.     ADD    AL,AL
  5370.     ADD    AL,AL
  5371.     ADD    AL,81H
  5372.     MOV    BL,AL
  5373.     MOV    BH,0
  5374.     PUSH    BX            ;SAVE NAME POINTER
  5375.     MOV    DX,OFFSET MFCUR+1
  5376.     MOV    CX,OFFSET 11
  5377.     CALL    MOVER
  5378.     POP    BX            ;MOVE NAME FOUND TO FCB
  5379.     MOV    DX,OFFSET FCB+1
  5380.     MOV    CX,OFFSET 11
  5381.     CALL    MOVER
  5382.     XOR    AL,AL            ;SETUP FCB
  5383.     MOV    BYTE PTR .FCBEXT,AL
  5384.     MOV    BYTE PTR .FCBRNO,AL
  5385.     RET
  5386. ;
  5387. ; Move subroutine
  5388. ;
  5389. MOVER:    MOV    AL,BYTE PTR [BX]
  5390.     XCHG    BX,DX
  5391.     MOV    BYTE PTR [BX],AL
  5392.     XCHG    BX,DX
  5393.     INC    BX
  5394.     INC    DX
  5395.     DEC    CX
  5396.     JNZ    MOVER
  5397.     RET
  5398. ;
  5399. ;Lists directory and gives free space remaining on the requested drive.
  5400. ;
  5401. DIRLST:
  5402.     MOV    DX,OFFSET CMDBUF    ;PUT COMMAND LINE IN FCB
  5403.     MOV    BX,OFFSET 5CH
  5404.     CALL    CPMLINE
  5405.     MOV    BX,OFFSET SRCHFCB
  5406.     CALL    INITFCBS
  5407.     MOV    AL,BYTE PTR .6CH    ;GET DRIVE #
  5408.     MOV    SRCHFCB,AL
  5409.     MOV    AL,BYTE PTR .6DH
  5410.     CMP    AL,20H            ;IF BLANK GET ALL NAMES
  5411.     PUSH    AX
  5412.     JNZ    DIRLST1
  5413.     CALL    QSTMARK
  5414. DIRLST1:
  5415.     POP    AX
  5416.     JZ    DIRLST2
  5417.     CALL    MOVENAME        ;ELSE MOVE NAME INTO FCB
  5418. DIRLST2:
  5419.     MOV    DX,OFFSET 80H
  5420.     MOV    CL,STDMA
  5421.     INT    224
  5422.     MOV    NAMEGD,0
  5423.     MOV    AL,NOOFCOL        ;GET NUMBER OF COLUMNS
  5424.     MOV    NAMECT,AL        ;STORE TO CALCULATE CRLF POSITION
  5425.     MOV    DX,OFFSET SRCHFCB
  5426.     MOV    CL,SRCHF        ;DO FIRST SEARCH
  5427.     INT    224
  5428.     CMP    AL,0FFH
  5429.     JZ    NOFILE
  5430.     PUSH    AX
  5431. DIRLP:
  5432.     POP    AX
  5433.     CALL    GETADD
  5434.     ADD    BX,15            ;OFFSET FOR RECORD COUNT
  5435.     MOV    AL,BYTE PTR [BX]
  5436.     OR    AL,AL
  5437.     JZ    NEXTSR            ;NO LIST IF FILE IS ZERO LENGTH
  5438.     ADD    BX,-5            ;POINT TO $SYS ATTRIB BYTE
  5439.     MOV    AL,BYTE PTR [BX]
  5440.     AND    AL,80H
  5441.     JNZ    NEXTSR            ;NO LIST IF $SYS FILE
  5442.     ADD    BX,-10            ;POINT TO BEGINNING OF NAME
  5443.     INC    BX            ;POINT TO FIRST LETTER
  5444.     MOV    DX,OFFSET PRNTNAME
  5445.     MOV    CH,8
  5446.     CALL    MOVE
  5447.     INC    DX
  5448.     MOV    CH,3
  5449.     CALL    MOVE
  5450.     CALL    ILPRT
  5451. PRNTNAME:
  5452.     DB '        ','.','   ',' ', 0   ;8 SPACES, PERIOD, 3 SPACES, 1 SPACE
  5453.     MOV    NAMEGD,0FFH
  5454. NEXTSR:
  5455.     MOV    DX,OFFSET SRCHFCB
  5456.     MOV    CL,SRCHN            ;DO NEXT SEARCH
  5457.     INT    224
  5458.     CMP    AL,0FFH
  5459.     JZ    DIRDONE
  5460.     PUSH    AX
  5461.     TEST    NAMEGD,0FFH
  5462.     JZ    DIRLP
  5463.     DEC    NAMECT
  5464.     JNZ    NEXTSR1
  5465.     CALL    NEWCT
  5466.     JMPS    NEXTSR2
  5467. NEXTSR1:
  5468.     CALL    FENCE
  5469. NEXTSR2:
  5470.     MOV    NAMEGD,0
  5471.     JMP    DIRLP
  5472. ;
  5473. NOFILE:
  5474.     CALL    ILPRT
  5475.     DB    'NO FILE',0
  5476. ;
  5477. ; Determines free space remaining
  5478. ;
  5479. DIRDONE:
  5480.     MOV    AL,SRCHFCB
  5481.     OR    AL,AL
  5482.     JZ    DEFLT
  5483.     DEC    AL
  5484.     MOV    DL,AL
  5485.     MOV    CL,SELDSK
  5486.     INT    224
  5487. DEFLT:
  5488.     MOV    CL,GETPARM         ;CURRENT DISK PARAMETER BLOACK
  5489.     INT    224
  5490.     ADD    BX,2
  5491.     MOV    AL,ES: BYTE PTR [BX]        ;GET BLOCK SHIFT FACTOR
  5492.     MOV    BSHIFTF,AL
  5493.     INC    BX            ;BUMP TO BLOCK MASK
  5494.     MOV    AL,ES: BYTE PTR [BX]    ;GET IT
  5495.     MOV    BMASK,AL
  5496.     ADD    BX,2
  5497.     MOV    DX,ES: WORD PTR [BX]     ;GET MAX BLOCK NUMBER
  5498. ;    MOV    DL,ES: BYTE PTR [BX]     ;GET MAX BLOCK NUMBER
  5499. ;    INC    BX
  5500. ;    MOV    DH,ES: BYTE PTR [BX]
  5501. ;    XCHG    BX,DX
  5502.     MOV    BMAX,DX            ;PUT IT AWAY
  5503.     MOV    CL,GETALC         ;ADDRESS OF CP/M ALLOCATION VECTOR
  5504.     INT    224
  5505.     XCHG    BX,DX            ;GET ITS LENGTH
  5506.     MOV    BX,BMAX
  5507.     INC    BX
  5508.     MOV    CX,0            ;INITIALIZE BLOCK COUNT TO ZERO
  5509. GSPBYT:
  5510.     PUSH    DX            ;SAVE ALLOCATION ADDRESS
  5511.     XCHG    BX,DX
  5512.     MOV    AL,ES: BYTE PTR [BX]
  5513.     XCHG    BX,DX
  5514.     MOV    DL,8            ;SET TO PROCESS 8 BLOCKS
  5515. GSPLUP:
  5516.     RCL    AL,1            ;TEST BIT
  5517.     JC    NOTFRE
  5518.     INC    CX
  5519. NOTFRE:
  5520.     MOV    DH,AL            ;SAVE BITS
  5521.     DEC    BX
  5522.     MOV    AL,BL
  5523.     OR    AL,BH
  5524.     JZ    ENDALC            ;QUIT IF OUT OF BLOCKS
  5525.     MOV    AL,DH            ;RESTORE BITS
  5526.     DEC    DL            ;COUNT DOWN 8 BITS
  5527.     JNZ    GSPLUP            ;DO ANOTHER BIT
  5528.     POP    DX                   ;BUMP TO NEXT COUNT OF ALLOCATION VECTOR
  5529.     INC    DX
  5530.     JMP    GSPBYT            ;PROCESS IT
  5531. ;
  5532. ENDALC:
  5533.     POP    DX            ;CLEAR ALLOCATION VECTOR FROM STACK
  5534.     MOV    BX,CX            ; COPY TO BX
  5535.     MOV    AL,BSHIFTF        ;GET BLOCK SHIFT FACTOR
  5536.     SUB    AL,3            ;CONVERT FROM RECORDS TO THOUSANDS
  5537.     JZ    PRTFREE            ;SKIP SHIFTS IF 1K BLOCKS
  5538. FREKLP:
  5539.     ADD    BX,BX            ;MULTIPLY BLOCKS BY 'K PER BLOCK'
  5540.     DEC    AL
  5541.     JNZ    FREKLP
  5542. PRTFREE:
  5543.     PUSH    BX
  5544.     CALL    ILPRT
  5545.     DB    CR,LF,'Drive ',0
  5546.     MOV    AL,SRCHFCB        ;IF NO DRIVE, GET
  5547.     OR    AL,AL            ;LOGGED IN DRIVE
  5548.     JNZ    PRNTHD
  5549.     MOV    CL,CURDSK
  5550.     INT    224
  5551.     INC    AL
  5552. PRNTHD:
  5553.     ADD    AL,'A'-1
  5554.     MOV    DRNAME,AL
  5555.     CALL    ILPRT
  5556. DRNAME    DB    '  has ',0
  5557.     POP    BX            ;GET NUMBER OF BYTES AVAILABLE
  5558.     CALL    DECOUT
  5559.     CALL    ILPRT
  5560.     DB    'K bytes free',CR,LF,0
  5561.     RET
  5562. ;
  5563. ; Subroutines
  5564. ;
  5565. FENCE:
  5566.     CALL    ILPRT
  5567.     DB    '| ',0
  5568.     RET
  5569. ;
  5570. NEWCT:
  5571.     CALL    CRLF
  5572.     MOV    AL,NOOFCOL
  5573.     MOV    NAMECT,AL
  5574.     RET
  5575. ;
  5576. QSTMARK:
  5577.     MOV    AL,'?'            ;IF BLANK IN FCB, PUT IN 11 ?'s
  5578.     MOV    CH,11
  5579.     MOV    BX,OFFSET SRCHFCB+1
  5580. QSTLP:
  5581.     MOV    BYTE PTR [BX],AL
  5582.     INC    BX
  5583.     DEC    CH
  5584.     JNZ    QSTLP
  5585.     RET
  5586. ;
  5587. MOVENAME:
  5588.     MOV    BX,OFFSET 6DH
  5589.     MOV    DX,OFFSET SRCHFCB+1
  5590.     MOV    CH,11
  5591.     CALL    MOVE            ;MOVE IN MAIN PROGRAM
  5592.     RET
  5593. ;
  5594. GETADD:
  5595.     AND    AL,03H            ;GET MOD4 FOR CP/M 1.4
  5596.     ADD    AL,AL            ;ADD 32
  5597.     ADD    AL,AL
  5598.     ADD    AL,AL
  5599.     ADD    AL,AL
  5600.     ADD    AL,AL
  5601.     MOV    DL,AL
  5602.     MOV    DH,0
  5603.     MOV    BX,OFFSET 80H        ;ADD DMA OFFSET
  5604.     ADD    BX,DX
  5605.     RET
  5606. ;
  5607. ;IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'.
  5608. ;
  5609. CKCPM2:
  5610.     MOV    CL,STDMA
  5611.     MOV    DX,OFFSET 80H
  5612.     INT    224
  5613.     MOV    CL,SRCHF        ;SEARCH FOR FILE
  5614.     MOV    DX,OFFSET FCB
  5615.     INT    224
  5616.     CMP    AL,0FFH
  5617.     JNZ    CKCPM2A
  5618.     RET
  5619. CKCPM2A:
  5620.     ADD    AL,AL
  5621.     ADD    AL,AL            ;MULT A-REG BY..
  5622.     ADD    AL,AL
  5623.     ADD    AL,AL            ;..32 TO FIND..
  5624.     ADD    AL,AL            ;..NAME IN DMA.
  5625.     MOV    BX,OFFSET 80H
  5626.     ADD    AL,BL
  5627.     MOV    BL,AL            ;HL POINTS TO DIR NAME
  5628.     MOV    DX,OFFSET 9
  5629.     ADD    BX,DX            ;POINT TO R/O ATTRIB BYTE
  5630.     MOV    AL,BYTE PTR [BX]
  5631.     AND    AL,80H            ;TEST MSB
  5632.     JNZ    MKCHG            ;IF SET, MAKE CHANGE
  5633.     INC    BX            ;CHECK SYSTEM ATTRIB BYTE
  5634.     MOV    AL,BYTE PTR [BX]
  5635.     AND    AL,80H
  5636.     JNZ    CKCPM2B            ; IS $SYS OR $R/O
  5637.     RET
  5638. CKCPM2B:
  5639.     DEC    BX
  5640. MKCHG:
  5641.     MOV    DX, -8
  5642.     ADD    BX,DX            ;POINT HL TO FILENAME + 1
  5643.     MOV    DX,OFFSET FCB+1        ;MOVE DIR NAME TO FCB..
  5644.     MOV    CH,11            ;..WITHOUT CHANGING DRIVE.
  5645.     CALL    MOVE
  5646.     MOV    BX,OFFSET FCB+9        ;R/O ATTRIB
  5647.     AND    BYTE PTR [BX],07FH    ; STRIP R/O ATTRIB
  5648.     INC    BX
  5649.     AND    BYTE PTR [BX],07FH    ; STRIP SYS ATTRIB
  5650.     MOV    DX,OFFSET FCB
  5651.     MOV    CL,30            ;SET NEW ATTRIBS IN DIR
  5652.     INT    224
  5653. ;
  5654. ;MAY BE CALLED BY CKBAKUP BELOW. ITS RETURN DONE HERE
  5655. ;
  5656. PLANCHG:
  5657.     MOV    BX,OFFSET FCB        ;CHANGE NAME TO TYPE "BAK"
  5658.     MOV    DX,OFFSET 6CH
  5659.     MOV    CH,9            ;MOVE DRIVE AND NAME (NOT TYPE)
  5660.     CALL    MOVE
  5661.     MOV    BX,OFFSET 75H        ;START OF TYPE IN FCB2
  5662.     MOV    BYTE PTR [BX],'B'
  5663.     INC    BX
  5664.     MOV    BYTE PTR [BX],'A'
  5665.     INC    BX
  5666.     MOV    BYTE PTR [BX],'K'
  5667.     MOV    DX,OFFSET 6CH
  5668.     MOV    CL,ERASE        ;ERASE ANY PREV BACKUPS
  5669.     INT    224
  5670.     MOV    BX,OFFSET 6CH        ;FCB2 DR FIELD SHOULD..
  5671.     MOV    BYTE PTR [BX],0        ;..0 FOR RENAME.
  5672.     MOV    DX,OFFSET FCB
  5673.     MOV    CL,23    ;RENAME
  5674.     INT    224
  5675.     RET
  5676. ;
  5677. CKBAKUP:
  5678.     MOV    AL,BAKUPBYTE
  5679.     OR    AL,AL
  5680.     JZ    CKBAKUPR
  5681.     MOV    CL,SRCHF
  5682.     MOV    DX,OFFSET FCB
  5683.     INT    224
  5684.     INC    AL
  5685.     JZ    CKBAKUPR
  5686.     JMP    PLANCHG            ;IN "CKCPM2" - RET DONE THERE
  5687. CKBAKUPR:
  5688.     RET
  5689. ;
  5690. ERASFIL:
  5691.     MOV    BX,OFFSET FCB        ;CHECK FOR WILD CARDS
  5692.     MOV    CH,11
  5693. ERASFIL1:
  5694.     INC    BX
  5695.     MOV    AL,BYTE PTR [BX]
  5696.     CMP    AL,'?'            ;IS IT A WILD CARD?
  5697.     JZ    WILDERR            ;GO IF SO
  5698.     DEC    CH
  5699.     JNZ    ERASFIL1
  5700.     MOV    AL,BATCHFLG         ;DON'T ASK FOR ERASE..
  5701.     OR    AL,AL            ;..IN MULTI-FILE MODE,..
  5702.     JZ    NOASK            ;..JUST DO IT.
  5703.     MOV    DX,OFFSET FCB
  5704.     MOV    CL,SRCHF
  5705.     INT    224
  5706.     INC    AL
  5707.     JZ    CKBAKUPR
  5708.     CALL    ILPRT
  5709.     DB    'File exists -- Type ''Y'' to erase: ',BELL,0
  5710.     CALL    KEYIN
  5711.     PUSH    AX
  5712.     CALL    TIPE
  5713.     POP    AX
  5714.     CALL    UCASE
  5715.     CMP    AL,'Y'
  5716.     JZ    ERASEIT
  5717.     JMP    MENU
  5718.  
  5719. ERASEIT:
  5720.     CALL    CRLF
  5721. NOASK:
  5722.     MOV    DX,OFFSET FCB
  5723.     MOV    CL,ERASE
  5724.     INT    224
  5725.     RET
  5726. ;
  5727. WILDERR:
  5728.     POP    BX        ;RESTORE STACK
  5729.     CALL    ILPRT
  5730.     DB    '++ No ambiguous file names allowed ++',CR,LF,BELL,0
  5731.     JMP    MENU
  5732. ;
  5733. BLKFILE:
  5734.     CALL    ILPRT    ;ROUTINE IF NO FILE IS NAMED FOR "SEND" OR "RECEIVE"
  5735.     DB    CR,LF,'No file specified',CR,LF,BELL,0
  5736.     JMP    MENU
  5737.  
  5738. MAKEFIL:
  5739.     MOV    DX,OFFSET FCB
  5740.     MOV    CL,MAKE
  5741.     INT    224
  5742.     INC    AL
  5743.     JZ    MAKEFIL1
  5744.     RET
  5745. MAKEFIL1:
  5746.     CALL    ERXIT
  5747.     DB    'Error - Can''t make file',CR,LF
  5748.     DB    'Directory is likely full',CR,LF,'$'
  5749. ;
  5750. CNREC:
  5751.     MOV    CL,FILSIZ         ;COMPUTE FILE SIZE FUNCTION IN CP/M 2.x
  5752.     MOV    DX,OFFSET FCB        ;POINT TO FILE CONTROL BLOCK
  5753.     INT    224
  5754.     MOV    BX,WORD PTR .FCB+33    ;GET RECORD COUNT
  5755.     MOV    RCNT,BX            ;STORE IT
  5756.     MOV    BX, 0            ;ZERO HL
  5757.     MOV    WORD PTR .FCB+33,BX    ;RESET RANDOM RECORD IN FCB
  5758.     RET
  5759. ;
  5760. OPENFIL:
  5761.     XOR    AL,AL
  5762.     MOV    BYTE PTR .FCBEXT,AL
  5763.     MOV    DX,OFFSET FCB
  5764.     MOV    CL,OPEN
  5765.     INT    224
  5766.     INC    AL
  5767.     JNZ    OPENOK
  5768.     CALL    ERXIT
  5769.     DB    'Can''t open file$'
  5770. OPENOK:
  5771.     MOV    AL,QFLG
  5772.     OR    AL,AL
  5773.     JNZ    OPENOK1
  5774.     RET
  5775.  
  5776. OPENOK1:
  5777.     CALL    SENDTIM                 ;A LIB MACRO SHOWS TIME TO SEND
  5778.     MOV    BYTE PTR .FCBRNO,0      ; MJM - 9.01.05 FIX BATCH SEND
  5779.     MOV    BYTE PTR .FCBEXT,0      ; MJM - 9.01.05 FIX BATCH SEND
  5780.     RET
  5781. ;
  5782. CLOSFIL:
  5783.     MOV    DX,OFFSET FCB
  5784.     MOV    CL,CLOSE
  5785.     INT    224
  5786.     INC    AL
  5787.     JZ    CLOSFIL1
  5788.     RET
  5789.  
  5790. CLOSFIL1:
  5791.     CALL    ERXIT
  5792.     DB    'Can''t close file$'
  5793. RDSECT:
  5794.     DEC    SECINBF
  5795.     JS    RDBLOCK
  5796.     MOV    BX,SECPTR
  5797.     MOV    DX,OFFSET 80H
  5798.     CALL    MOVE128
  5799.     MOV    SECPTR,BX
  5800.     RET
  5801. ;
  5802. RDBLOCK:
  5803.     MOV    AL,EOFLG
  5804.     CMP    AL,1
  5805.     STC
  5806.     JNZ    RDBLOCK1
  5807.     RET
  5808. RDBLOCK1:
  5809.     MOV    CL,0
  5810.     MOV    DX,OFFSET DBUF
  5811. RDSECLP:
  5812.     PUSH    CX
  5813.     PUSH    DX
  5814.     MOV    CL,STDMA
  5815.     INT    224
  5816.     MOV    DX,OFFSET FCB
  5817.     MOV    CL,READ
  5818.     INT    224
  5819.     POP    DX
  5820.     POP    CX
  5821.     OR    AL,AL
  5822.     JZ    RDSECOK
  5823.     DEC    AL
  5824.     JZ    REOF
  5825.     CALL    ERXIT
  5826.     DB    '++ File read error ++$'
  5827. RDSECOK:
  5828.     MOV    BX,OFFSET 80H
  5829.     ADD    BX,DX
  5830.     XCHG    BX,DX
  5831.     INC    CL
  5832.     MOV    AL,CL
  5833.     CMP    AL,DBUFSIZ*8         ;BUFFER SIZE IN 128 BYTE SECTORS
  5834.     JZ    RDBFULL
  5835.     JMP    RDSECLP
  5836. ;
  5837. REOF:    MOV    AL,1
  5838.     MOV    EOFLG,AL
  5839.     MOV    AL,CL
  5840. RDBFULL:
  5841.     MOV    SECINBF,AL
  5842.     MOV    BX,OFFSET DBUF
  5843.     MOV    SECPTR,BX
  5844.     MOV    DX,OFFSET 80H
  5845.     MOV    CL,STDMA
  5846.     INT    224
  5847.     JMP    RDSECT
  5848. ;
  5849. WRSECT:
  5850.     MOV    BX,SECPTR
  5851.     XCHG    BX,DX
  5852.     MOV    BX,OFFSET 80H
  5853.     CALL    MOVE128
  5854.     XCHG    BX,DX
  5855.     MOV    SECPTR,BX
  5856.     MOV    AL,SECINBF
  5857.     INC    AL
  5858.     MOV    SECINBF,AL
  5859.     CMP    AL,DBUFSIZ*8         ;BUFFER SIZE IN 128 BYTE SECTORS
  5860.     JZ    WRBLOCK
  5861.     RET
  5862. WRBLOCK:
  5863.     MOV    AL,SECINBF
  5864.     OR    AL,AL
  5865.     JNZ    WRBLOCK1
  5866.     RET
  5867. WRBLOCK1:
  5868.     MOV    CL,AL
  5869.     MOV    DX,OFFSET DBUF
  5870. DKWRLP:
  5871.     PUSH    BX
  5872.     PUSH    DX
  5873.     PUSH    CX
  5874.     MOV    CL,STDMA
  5875.     INT    224
  5876.     MOV    DX,OFFSET FCB
  5877.     MOV    CL,WRITE
  5878.     INT    224
  5879.     POP    CX
  5880.     POP    DX
  5881.     POP    BX
  5882.     OR    AL,AL
  5883.     JNZ    WRERR
  5884.     MOV    BX,OFFSET 80H
  5885.     ADD    BX,DX
  5886.     XCHG    BX,DX
  5887.     DEC    CL
  5888.     JNZ    DKWRLP
  5889.     XOR    AL,AL
  5890.     MOV    SECINBF,AL
  5891.     MOV    BX,OFFSET DBUF
  5892.     MOV    SECPTR,BX
  5893.     MOV    DX,OFFSET 80H        ;TO RESET..            @DH
  5894.     MOV    CL,STDMA        ;..DMA ADDRESS..        @DH
  5895.     INT    224            ;..BDOS ENTRY            @DH
  5896.     RET
  5897. ;
  5898. WRERR:    MOV    CL,CAN
  5899.     CALL    SEND
  5900.     CALL    ERXIT
  5901.     DB    CR,LF,'Error writing file',CR,LF,'$'
  5902. ;
  5903. ;
  5904. ;        FINISH.A86
  5905. ;
  5906. ;Parameters and buffers for MODEM9.xx.
  5907. ;
  5908. COMPLIST    DB     6, 'S', 'R', 'T', 'E', 'H', 'L'
  5909. ;
  5910. NFILFLG    DB    FALSE        ;NORMALLY SET TO FALSE. ALLOWS WRITE TO..
  5911. ;                ;..MEMORY IN TERMINAL MODE.
  5912. OPTION    DB    0
  5913. ;
  5914. OPTBL    EQU    $
  5915. ;
  5916. QFLG        DB    'Q'
  5917. RSEEFLG        DB    'R'
  5918. SSEEFLG        DB    'S'
  5919. VSEEFLG        DB    'V'
  5920. TERMFLG        DB    'T'
  5921. LOCCHFLG    DB    'L'
  5922. BATCHFLG    DB    'B'    ;SET TO 'B' BY MENU. DOES NOT ALLOW MULTIFILE
  5923.                 ;XFER WHEN PROGRAM INITIALLY CALLED.
  5924. OPTBE    EQU    $
  5925.  
  5926. RESTROPT    DB    'Q','R','S','V','T','L','B'
  5927.             ;MUST BE IN SAME ORDER AS TABLE ABOVE
  5928. ;
  5929. ;THE NEXT 12 BYTES EQUAL THE NUMBER OF BYTES BETWEEN SECTNOB AND SECTNOE
  5930. ;
  5931. RESTSN:
  5932.     DB    0,0,0,0,0
  5933.     DW    DBUF
  5934.     DB    0,0,0,0,0
  5935. ;
  5936. SECTNOB    EQU    $    ;START OF TABLE MARKER
  5937. RCVSNO    DB    0    ;\
  5938. SECTNO    DW    0    ; \
  5939. ERRCT    DB    0    ;  \
  5940. EOFLG    DB    0    ;   \
  5941. SECPTR    DW    DBUF    ;    12 BYTES BETWEEN TABLE MARKERS
  5942. SECINBF    DB    0    ;   /
  5943. MAXEXT    DB    0    ;  /
  5944. RCNT    DW    0     ; /
  5945. DATAFLG    DB    0    ;/
  5946. SECTNOE    EQU    $    ;END OF TABLE MARKER
  5947. ;
  5948. MODCTLB    DB    07FH
  5949. SAVEFLG    DB    FALSE
  5950. LASTBYT1 DB    0
  5951. LASTBYT2 DB    0
  5952. EXACFLG    DB    0
  5953. ECHOFLG    DB    FALSE
  5954. LOCFLG    DB    FALSE
  5955. CKSUMFLG DB    TRUE
  5956. LISTFLG    DB    FALSE
  5957. LISTMOR    DB    FALSE
  5958. FSTFLG    DB    TRUE
  5959. FIRSTME    DB    TRUE    ;FIRST SOH RECEIVED SWITCH (ZERO AFTER 1ST SOH)
  5960. MFFLG1    DB    0    ;1ST TIME SW FOR MFACESS
  5961. HLSAVE    DW    BOTTRAM
  5962. HLSAVE1    DW    BOTTRAM
  5963. HLSAVE2    DW    BOTTRAM
  5964. STRSAVE    DW    STRINGS
  5965. CMDBUF    DB    80H,0
  5966.     RB    80H
  5967. DISKNO    RB    1
  5968. DISKSAV    RB    1
  5969. SAVUSR    RB    1
  5970. SAVEOUT    RB    1
  5971. MECHDLY    RB    1
  5972. SENDFLG    RB    1
  5973. NBSAVE    RW    1
  5974. BGNMS    RW    1
  5975. FILECT    RB    2
  5976. SNAMECT RB    1
  5977. FTYCNT    RB    1
  5978.     RB    100
  5979. FCB3    RB    33
  5980. FCB4    RB    33
  5981. FCBBUF    RB    15
  5982.  
  5983. ;Multi-file access work area
  5984.  
  5985. MFREQ    RB    12    ;REQ NAME
  5986. MFCUR    RB    12    ;CURR NAME
  5987.  
  5988. ;Unitialized storage for DIRLST
  5989.  
  5990. SRCHFCB    RB    33
  5991. NAMEGD    RB    1
  5992. NAMECT    RB    1
  5993. BMAX    RW    1    ;HIGHEST BLOCK NUMBER ON DRIVE
  5994. BMASK    RB    1    ;(RECORDS/BLOCK)-1
  5995. BSHIFTF RB    1    ;NUMBER OF SHIFTS TO MULTIPLY BY REC/BLOCK
  5996. ;
  5997. STACK    RW    200H
  5998. STACKTOP EQU    Offset $
  5999. SAVESS    DW    0
  6000. SAVESP    DW    0
  6001. ;
  6002. ;DBUF    RB    DBUFSIZ*1024        ;                @DH
  6003. ;NAMEBUF RB    64*12            ;                @DH
  6004. ;
  6005. ;BOTTRAMEQU    (OFFSET $) + 0FFH AND 0FF00H    ;            @DH
  6006. ;    RB    CAPTURE*1024            ;            @DH
  6007. ;XAST    EQU    (OFFSET $) + 0FFH AND 0FF00H    ;            @DH
  6008. ;
  6009. DBUF    EQU    OFFSET $            ;            @DH
  6010.     RB    DBUFSIZ*1024            ;            @DH
  6011. NAMEBUF    EQU    OFFSET $            ;            @DH
  6012.     RB    64*12                ;            @DH
  6013. ;
  6014. BOTTRAM    EQU    OFFSET $            ;            @DH
  6015.     RB    CAPTURE*1024            ;            @DH
  6016. XAST    EQU    OFFSET $            ;            @DH
  6017.     DB    0            ;end byte for GENCMD        @DH
  6018. ;
  6019.       END
  6020.