home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol149 / modem7-z.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  45.4 KB  |  2,376 lines

  1.           page    56
  2.     title    'CP/M MODEM7 PROGRAM'
  3. ;        CP/M MODEM PROGRAM
  4.  
  5. ;THE FOLLOWING IS AN EXTENSIVE REVISION OF THE CP/M MODEM PROGRAM
  6. ;CREATED BY WARD CHRISTENSEN FOR THE CP/M USERS LIBRARY.
  7. ;IT ALSO INCORPORATES ROUTINES FOUND IN THE POTOMAC MICRO-MAGIC MODEM
  8. ;MANUAL WHICH MAY BE USED IF YOU HAVE A PMMI MODEM BOARD.
  9.  
  10. ;THE ADDITIONAL ROUTINES ARE COPYRIGHTED (1980) BY:
  11.  
  12. ;Mark M. Zeiger        and    James K. Mills
  13. ;198-01B 67th Ave.        824 Jordan Place
  14. ;Flushing, N.Y. 11365        Rockford, IL  61108
  15. ;(212) 454-6985            (815) 398-0579
  16.  
  17. ;Permission is granted to use, but not to sell, these routines.
  18.  
  19. ;  13 Feb 83    Modified by S. E. Andrews, major changes marked "** TA"
  20. ;
  21. ;    Note: All Baud Rates supported by the Z100 and this program do
  22. ;    work. However, only baud rates up to 1200 should be considered
  23. ;    reliable since the received 'Characters Per Second' above 1200
  24. ;    'Bits Per Second' are generally too fast for this programs
  25. ;    BIOS CALLS to handle when viewing the file being transfered.
  26. ;    38400 baud will not support file transfers at all, 19200 will
  27. ;    file transfer most of the time, 9600 and 4800 will generally
  28. ;    transfer files if not viewed.
  29. ;
  30. ;  13 Oct 82   Modified by Robert A. Ross Jr to work with
  31. ;              the H-89 system with the H-89-11 Multi-mode
  32. ;           card installed.  This revision will also work
  33. ;           on the Zenith Z-100 using CP/M-85.
  34. ;
  35. ;        Set the following equates depending on which system
  36. ;        you are using:
  37. ;        LABEL        H-89        Z-100
  38. ;        PORT        0D8H        0ECH
  39. ;        FASTCLK        FALSE        TRUE
  40. ;    
  41. ; REVISION 6 January 1982 by Sanford R. Smith
  42. ;    -- Modified MODEM7 to operate
  43. ;    on the HEATH / ZENITH H89/Z89 Systems using CPM.
  44. ;    Modification assumes use of the 8250 ACE.
  45. ;
  46. ;REVISION 12/18/80 -- changed disconnect timing
  47.  
  48.  
  49.     MACLIB MODEM    ;CONTAINS CMDLINE, INBUF, INLNCOMP,
  50.             ;DIR, AND MFACCESS ROUTINES
  51.             ;changed to MODEM.LIB by Jim Mills
  52.             ;to differentiate from other 'MACROS.LIB'
  53.  
  54. ; minor revision 10/26/80 to allow 25-second 'wait' after pmmi
  55. ; autodial -- longer time required for Chicago CBBS*.  Jim Mills.
  56. ; * CBBS is a trademark of Ward Christensen and Randy Suess.
  57.  
  58. FALSE    EQU    0
  59. TRUE    EQU    NOT FALSE
  60. ; PMMI EQUATES
  61.  
  62. PORT    EQU    0ECH        ;modem BASE ADDRESS
  63.  
  64. moddatp    equ    port        ;modem data port
  65. modlcr    equ    port+2        ;MODE CONTROL REGISTER
  66. modmcr    equ    port+3        ;COMMAND REGISTER
  67. modlsr    equ    port+1        ;STATUS REGISTER
  68. MODSNDB    EQU    01H        ;MODEM SEND BIT (XMIT BUFF EMPTY)
  69. MODSNDR    EQU    01H        ;MODEM SEND READY
  70. MODRCVB    EQU    02H        ;MODEM RECEIVE BIT (DAV)
  71. MODRCVR    EQU    02H        ;MODEM RECEIVE READY
  72. ;
  73. MODIER    EQU    00H
  74. MODIIR    EQU    00H
  75. MODMSR    EQU    PORT+1
  76. MODDLL    EQU    00H
  77. MODDLM    EQU    00H
  78. ;
  79. ;
  80. ;  DEFINITIONS FOR 2661-2 EPCI (ENHANCED PROGRAMMABLE COMM. INTERFACE)
  81. ;
  82. EP$BAS    EQU    0ECH        ;2661-2 BASE ADDRESS
  83. ;
  84. ;  PORT DISPLACEMENTS
  85. ;
  86. EP$DAT    EQU    0        ;DATA
  87. EP$SR    EQU    1        ;STATUS REGISTER
  88. EP$MR1    EQU    1        ;STATUS
  89. EP$MR2    EQU    2        ;MODE REGISTER 2
  90. EP$CR    EQU    3        ;COMMAND REGISTER
  91. EP$INT    EQU    4        ;INTERRUPT ENABLE (Z-89-11, NOT PART OF 2661)
  92. ;
  93. ;  STATUS REGISTER BITS
  94. ;
  95. SR$TXR    EQU    00000001B    ;TRANSMITTER READY
  96. SR$RXR    EQU    00000010B    ;RECEIVER READY
  97. SR$TXE    EQU    00000100B    ;TRANSMITTER EMPTY
  98. SR$DSC    EQU    00000100B    ;DSR CHANGED STATE
  99. SR$PER    EQU    00001000B    ;PARITY ERROR
  100. SR$OVE    EQU    00010000B    ;OVER RUN ERROR
  101. SR$FRE    EQU    00100000B    ;FRAMING ERROR
  102. SR$SYD    EQU    00100000B    ;SYNC DETECT (SYNC. MODE)
  103. SR$DCD    EQU    01000000B    ;DATA CARRIER DETECT
  104. SR$DSR    EQU    10000000B    ;DATA SET READY
  105. ;
  106. ;  MODE REGISTER 1 (MR1)
  107. ;
  108. MR1$MBM    EQU    00000011B    ;MODE AND BAUD CLOCK MASK
  109. MR1$S1X    EQU    00H        ;SYNC. 1X CLK
  110. MR1$A1X    EQU    01H        ;ASNYC. 1X CLK
  111. MR1$A16    EQU    02H        ;ASYNC. 16X CLK
  112. MR1$A64    EQU    03H        ;ASYNC. 64X CLK
  113. ;
  114. MR1$CLM    EQU    00001100B    ;CHARACTER LENGTH MASK
  115. MR1$5BW    EQU    00H        ;5 BIT CHARACTERS
  116. MR1$6BW    EQU    04H        ;6 BIT CHARACTERS
  117. MR1$7BW    EQU    08H        ;7 BIT CHARACTERS
  118. MR1$8BW    EQU    0CH        ;8 BIT CHARACTERS
  119. ;
  120. MR1$PEN    EQU    00010000B    ;PARITY ENABLE (0=DISABLE, 1=ENABLE)
  121. MR1$PEV    EQU    00100000B    ;EVEN/ODD PARITY (0=ODD, 1=EVEN)
  122. ;
  123. MR1$SBM    EQU    11000000B    ;(ASYNC.) STOP BIT MASK
  124. MR1$1SB    EQU    040H        ;1 STOP BIT
  125. MR1$15B    EQU    080H        ;1.5 STOP BIT
  126. MR1$2SB    EQU    0C0H        ;2 STOP BITS
  127. ;
  128. MR1$TSP    EQU    01000000B    ;(SYNC) TRANSP. MODE (0=NORMAL, 1=TRANSP)
  129. MR1$NSC    EQU    10000000B    ;(SYNC) NR. OF SYNC CHARS (0=SINGLE, 1=DOUBLE)
  130. ;
  131. ;  MODE REGISTER 2 (MR2)
  132. ;
  133. MR2$BRM    EQU    00001111B    ;BIT RATE MASK
  134. MR2$CKS    EQU    11110000B    ;CLOCK SELECT MASK (SEE DATA SHEET)
  135. ;
  136. ;  COMMAND REGISTER (CR)
  137. ;
  138. CR$TXEN    EQU    00000001B    ;TRANSMITTER ENABLE
  139. CR$DTR    EQU    00000010B    ;DTR ASSERTED (=LOW)
  140. CR$RXEN    EQU    00000100B    ;RECEIVER ENABLED
  141. CR$SBRK    EQU    00001000B    ;SEND BREAK (ASYNC.)
  142. CR$SDLE    EQU    00001000B    ;SEND DLE (SYNC.)
  143. CR$RESE    EQU    00010000B    ;RESET ERRORS IN SR
  144. CR$RTS    EQU    00100000B    ;RTS ASSERTED (=LOW)
  145. ;
  146. CR$OMM    EQU    11000000B    ;OPERATING MODE MASK
  147. CR$NML    EQU    00H        ;NORMAL
  148. CR$OM1    EQU    40H        ;MODE 1 (ASYNC=AUTO ECHO/SYNC=SYN/DLE STRP)
  149. CR$OMLL    EQU    80H        ;LOCAL LOOPBACK
  150. CR$OMRL    EQU    0C0H        ;REMOTE LOOPBACK
  151. ;
  152. IE$EN    EQU    00000001B    ;1=ENABLE EPCI INTERRUPTS, 0=DISABLE
  153. ;
  154. CHGBAUD    EQU    'B'-40H        ;USED IN TERMINAL MODE TO CHANGE
  155.                 ;BAUD RATE 'ON THE FLY'
  156. ERRLIM    EQU    10        ;NUMBER OF TIMES TO RETRY
  157.                 ;SEND/RECEIVE ERRORS BEFORE QUIT
  158. EXITCHR    EQU    'E'-40H        ; ^E = EXIT WITHOUT DISCONNECT
  159. DISCCHR    EQU    'D'-40H        ; ^D = DISCONNECT
  160. TRANCHR    EQU    'T'-40H        ; ^T = TRANSFER CHARACTER
  161. CAN    EQU    'X'-40H        ; ^X = CANCEL SEND/RECEIVE
  162. EOFCHAR    EQU    'Z'-40H        ; ^Z = END OF FILE
  163. SAVECHR    EQU    'Y'-40H        ; ^Y = SAVE CHARACTER
  164. XOFF    EQU    'S'-40H        ; ^S = XOFF CHARACTER
  165. XON    EQU    'Q'-40H        ; ^Q = XON CHARACTER
  166. SOH    EQU    1        ; START OF HEADER
  167. EOT    EQU    4        ; END OF TEXT
  168. ACK    EQU    6        ; ACKNOWLEDGE
  169. NAK    EQU    15H        ; NOT ACKNOWLEDGE
  170. BDNMCH    EQU    75H        ; BAD NAME MATCH
  171. OKNMCH    EQU    ACK        ; OKAY NAME MATCH
  172. LF    EQU    10        ; LINEFEED
  173. CR    EQU    13        ; CARRIAGE RETURN
  174. BELL    EQU    7        ; BELL CHARACTER
  175. ;FRONTPAN EQU    0FFH        ; IMSAI FRONT PANEL            ** ??
  176.  
  177. BOTTRAM    SET LAST+100H AND 0FF00H
  178.  
  179.     ORG    100H
  180.  
  181.     JMP    START
  182.  
  183. ;THESE ROUTINES ARE AT THE BEGINNING OF THE PROGRAM SO
  184. ;THEY CAN BE PATCHED BY A MONITER WITHOUT RE-ASSEMBLING
  185. ;THE PROGRAM.
  186.  
  187. PMMIBYTE    DB    TRUE        ;true=pmmi modem
  188. IMSAIBYTE    DB    FALSE        ;true=imsai front panel
  189. FASTCLK        DB    TRUE         ;4 MHz or greater
  190. BAKUPBYTE    DB    TRUE         ;true=make .BAK file
  191. XPRFLG        DB    false        ;true=no menu, false=print menu
  192. IN$MODlsr    IN    MODlsr  ! RET    ;in modem control port
  193. out$modlsr    out    modlsr  ! ret
  194. ;
  195. OUT$MODDATP    PUSH    PSW
  196. OUT267        IN    EP$BAS+EP$SR
  197.         ANI    SR$TXR
  198.         JZ    OUT267
  199.         POP    PSW
  200.         OUT    EP$BAS+EP$DAT
  201.         RET
  202. ;
  203. ANI$MODSNDB    ANI    MODSNDB ! RET    ;bit to test for send ready
  204. CPI$MODSNDR    CPI    MODSNDR ! RET    ;value of send bit when ready
  205. IN$MODDATP    IN    EP$BAS+EP$DAT
  206.         ORA    A        ;CLEAR FLAGS
  207.         RET
  208.  
  209. ANI$MODRCVB    ANI    MODRCVB ! RET    ;bit to test for receive ready
  210. CPI$MODRCVR    CPI    MODRCVR ! RET    ;value of receive bit when ready
  211. ;  Following corrects droping back to default baud rate            ** TA
  212. ;JMP$INITMOD    JMP    setbaud        ;to initialize port, if necessary
  213. JMP$INITMOD    JMP    INITMOD        ;initialize port after S,R,T or E
  214. OUT$modlcr    OUT    MODlcr ! RET    ;out modem control port
  215. OUT$moddll    OUT    moddll ! RET    ;out baudrate port 1
  216. OUT$moddlm    OUT    moddlm ! RET    ;out baudrate port 2
  217. out$modier    out    modier ! ret    ;out interrupt enable 
  218. out$modiir    out    modiir ! ret    ;out interrupt id reg
  219. out$modmcr    out    modmcr ! ret    ;out modem control reg
  220. in$modmcr    in    modmcr ! ret
  221. in$iir        in    modiir ! ret
  222. in$lcr        in    modlcr ! ret
  223. in$msr        in    modmsr ! ret    ;in modem status reg
  224.  
  225. CRFLAG        DB    0        ;CONTINUOUS REDIAL FLAG
  226.  
  227. START:    LXI    H,0
  228.     DAD    SP        ;GET CP/M'S STACK
  229.     SHLD    STACK        ;SAVE IT
  230.     LXI     SP,STACK    ;START LOCAL STACK
  231.     
  232.     CALL    INITMOD
  233.     CALL     START1
  234.  
  235. ;    DB     CR,LF,'         MODEM7 as of 2/16/83',cr,lf
  236. ;    DB     'Originally Written by: Ward Christensen',cr,lf
  237. ;    DB     'Revisions by: Mark M. Zeiger, Jim Mills',cr,lf
  238. ;    DB    'R. Ross Jr., S. R. Smith, S. E. Andrews',CR,LF,LF
  239.     DB    CR,LF,'   >>>   MODEM7 for the Zenith Z100  Version 1.03   <<<','$'
  240.  
  241. START1:    POP     D        ;GET ADDRESS OF ABOVE MESSAGE
  242.     MVI     C,PRINT        ; 9
  243.     CALL     BDOS
  244.  
  245.     CALL     INITADR        ;INITIALIZE ADDRESSES
  246.     MVI     A,TRUE        ; 0FFH
  247.     STA     NFILFLG
  248.     CMA            ; 0
  249.     STA     SAVEFLG
  250. ;    OUT     FRONTPAN    ; IMSAI                    ** ??
  251.  
  252.     CALL     PROCOPT        ;PROCESS CONTROL OPTIONS
  253.     LDA     OPTION        ;GET MAIN OPTION
  254.     CPI     'X'        ;EXPERT FLAG?
  255.     JNZ     RESTART        ;NO
  256.     MVI     A,TRUE        ;YES
  257.     STA     XPRFLG        ;MAKE EXPERT
  258.     JMP     MENU
  259.  
  260. ;   Process Menu options ' ', 'M', 'E', 'T', 'S', 'R'
  261.  
  262. RESTART: LDA     OPTION        ;GET MAIN OPTION
  263.     CPI     ' '        ;NO OPTION SPEC'D?
  264.     JZ     MENU        ;TRUE, GO MENU
  265.     CPI     'M'        ;MENU ASKED FOR?
  266.     JZ     MENU        ;YES, GO MENU
  267.     CALL     JMP$INITMOD    ; initalize modem port
  268.     CALL     MOVEFCB
  269.     MVI     A,FALSE        ; reset write to memory
  270.     STA     NFILFLG        ; .. in terminal mode
  271.     CALL     IN$MODDATP    ;GOBBLE UP GARBAGE..
  272.     CALL     IN$MODDATP    ;..CHARACTERS ON LINE
  273.     LDA     OPTION        ;PROCESS MAIN OPTION
  274.     CPI     'E'        ;ECHO MODE?
  275.     JZ     TRMECHO        ;YES
  276.     CPI     'T'        ;TERMINAL MODE?
  277.     JZ     DSKSAVE        ;YES
  278.     CPI     'S'        ;SEND A FILE?
  279.     JZ     SENDFIL        ;YES
  280.     CPI     'R'        ;RECEIVE A FILE?
  281.     JZ     RCVFIL        ;YES
  282. ;    CPI     'D'        ;DISCONNECT?                ** ??
  283.     JMP     MENU        ;NO OPTION SPEC'D, GO MENU
  284.  
  285. ;   REVISED TERMINAL ROUTINE ALLOWING MEMORY SAVE    "T" pri command
  286. ;    Note that characters typed from terminal will be saved
  287. ;    also because they are echoed back from distant end.
  288.  
  289. DSKSAVE: PUSH PSW
  290.     XRA    A        ; undo "E" pri commands patch        ** TA
  291.     STA    NOTOG+3        ; by storing 0,0,0            **  |
  292.     STA    NOTOG+4
  293.     STA    NOTOG+5
  294.     STA    TERML+0FH    ; and another 0,0,0
  295.     STA    TERML+10H
  296.     STA    TERML+11H    ;                    **  |
  297.     POP PSW            ;                    ** TA
  298.  
  299. DSKSAV1: LDA     NFILFLG        ;NEW FILE FLAG                ** TA
  300.     CPI     TRUE        ;OFFH? (TRUE=NORMAL TERMINAL MODE)
  301.     JZ     TERM        ;YES
  302.     LDA     FCB+1        ;FIRST CHAR OF FILENAME
  303.     CPI     ' '        ;FILE SPEC'D
  304.     JNZ     GOODNM        ;YES, GOOD NAME
  305.     MVI     A,TRUE        ;0FFH no file specified
  306.     STA     NFILFLG        ;.. so no saving
  307.     CMA            ; 0
  308.     STA     SAVEFLG        ;
  309.     JMP     TERM
  310.  
  311. GOODNM:    CALL     ERASFIL        ; see if file exists now and prompt
  312.     CALL     MOVE2
  313.     LXI     D,FCB3
  314.     MVI     C,MAKE
  315.     CALL     BDOS
  316.     LXI     D,FCB3
  317.     MVI     C,OPEN
  318.     CALL     BDOS
  319.     LXI     H,BOTTRAM
  320.     SHLD     HLSAVE
  321.     MVI     A,FALSE
  322.     STA     NFILFLG
  323.  
  324. TERM:    CALL     STAT        ; KEYPRESS ?
  325.     JZ     TERML        ; .. no, check modem
  326.     CALL     KEYIN        ; .. yes, GET CHAR FROM KBD
  327.     CPI     EXITCHR        ; ^E ?
  328.     JZ     MENU        ; .. YES, RETURN TO MENU
  329.  
  330. ;    CPI     DISCCHR        ; ^D ?                    ** ??
  331. ;    JZ     menu        ; .. YES, DISCONNECT & RETURN TO MENU    ** ??
  332.  
  333.     CPI     TRANCHR        ; ^T ?  TEST FOR TRANSFER REQUEST
  334.     CZ     TRANSFER    ; .. yes, SEND-A-FILE (BLIND SEND)
  335.     JZ     TERM        ; return from transfer and LOOP
  336.     CPI     CHGBAUD        ; ^B ?
  337.     PUSH     PSW
  338.     PUSH     H
  339.     CZ     NEWBAUD        ; .. yes, so set new baud rate
  340.     POP     H
  341.     POP     PSW
  342.     CPI     CHGBAUD        ; ^B ?
  343.     JZ     TERML        ; .. if so, already processed so go loop
  344.     CPI     SAVECHR        ; ^Y
  345.     JNZ     NOTOG        ; .. none of the above so send it
  346.     LDA     NFILFLG        ; do not allow save option if
  347.     CPI     TRUE        ; .. this flag is FFH.
  348.     JZ     TERML        ; .. so ignore ^Y
  349.     LDA     SAVEFLG        ; get save flag
  350.     CMA            ; .. toggle it
  351.     STA     SAVEFLG        ; .. and save it
  352.     JMP     TERML
  353.  
  354. NOTOG:    CALL     OUT$MODDATP    ; send typed char to modem
  355.     DB    0,0,0        ; patched by "E" pri command        ** TA
  356. ;                ;  to send typed char to terminal
  357. TERML:    CALL     IN$MODlsr    ; check modem control port
  358.     CALL    ANI$MODRCVB    ; anything at modem
  359.     CALL    CPI$MODRCVR    ; .. to read
  360.     JNZ     TERM        ; no, so loop again
  361.     CALL     IN$MODDATP    ; yes, so get it
  362.     DB    0,0,0        ; patched by "E" pri command        ** TA
  363. ;                ;  to echo character rcvd by
  364. ;                ;  the modem back to the modem
  365. ;                ;  and add LF if CR
  366.     CPI     0        ; NUL ?
  367.     JZ     TERM        ; yes, don't process
  368.     ANI     7FH        ; strip parity
  369.     cpi    7fh        ; DEL ?
  370.     jz    term        ; yes, don't process
  371.  
  372.     CPI    07H        ; less than a BEL ?            ** TA
  373.     JC    TERML2        ; .. yes, so only save it        **  |
  374.     CPI    0EH        ; less than a SO ?
  375.     JC    TERML1        ; .. yes, so ok to send to terminal
  376.     CPI    20H        ; less than a SPACE ?            **  |
  377.     JC    TERML2        ; .. yes, so only save it        ** TA
  378.  
  379. TERML1:    CALL     TYPE        ; send to terminal            ** TA
  380. TERML2:    PUSH     PSW        ;                    ** TA
  381.     LDA     SAVEFLG
  382.     CPI     FALSE
  383.     JZ     NOSAVE        ; don't save, loop
  384.     POP     PSW
  385.     MOV     M,A        ; save it
  386.     INX     H
  387.     SHLD     HLSAVE        ;MENU COMMAND DESTROYS HL-REG..
  388.                 ;..GET HL WHEN ENTERING VIA 'RET' CMD.
  389.  
  390. COLON:    CPI     LF        ;IF NO FRONT PANEL, THEN..
  391.     JNZ     NOCOLON        ;..TYPE ":" AFTER EACH LINE FEED..
  392.     MVI     A,':'        ;..WHEN MEMORY SAVE ACTIVE.
  393.     CALL     TYPE
  394. NOCOLON: LDA     7        ;CHECK TO SEE IF..
  395.     DCR     A        ;..PAGE BELOW BDOS HAS BEEN..
  396.     CMP     H        ;..REACHED AND DISKSAVE IS NEEDED.
  397.     CZ     INTDSKSV
  398.     JMP     TERM
  399.  
  400. NOSAVE:    POP     PSW
  401.     JMP     TERM
  402.  
  403. SAVEFLG: DB     FALSE
  404. LASTBYT1: DB     0
  405. LASTBYT2: DB     0
  406.  
  407. INTDSKSV: MVI     A,XOFF        ;SEND A CTRL-S TO STOP..
  408.     CALL     OUT$MODDATP    ;..REMOTE COMPUTER OUTPUT.
  409.  
  410.     MVI     D,0        ;D IS THE BUFFER COUNT
  411.     CALL     INMODEM        ;GET LAST BYTES SENT..
  412.     STA     LASTBYT1    ;..AFTER CTRL-S.
  413.     CALL     INMODEM        ;ADD MORE CALLS TO INMODEM..
  414.     STA     LASTBYT2    ;..AND STA LASTBYT# IF YOU ARE..
  415.                 ;..LOSING BYTES WHEN MEMORY IS FULL.
  416.     PUSH     D
  417.     CALL     NUMREC1
  418.     CALL     WRTDSK        ;WRITE THE RECORDS
  419.     POP     D
  420.  
  421.     LXI     H,BOTTRAM
  422.     INR     D
  423.     DCR     D        ;TEST BUFFER COUNT FOR ZERO
  424.     JZ     CTRLQ
  425.     LDA     LASTBYT1    ;GET THE LAST BYTES THAT WERE..
  426.     MOV     M,A        ;..SAVED AND PUT THEM IN..
  427.     INX     H        ;..BOTTRAM.
  428.     CALL     TYPE
  429.     DCR     D
  430.     JZ     CTRLQ
  431.     LDA     LASTBYT2
  432.     MOV     M,A
  433.     INX     H
  434.     CALL     TYPE
  435.  
  436. CTRLQ:    MVI     A,XON        ;SEND START CHARACTER..
  437.     CALL     OUT$MODDATP    ;..TO REMOTE COMPUTER.
  438.     RET
  439.  
  440. ;THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER
  441. ;OR 100 MILLISECONDS. IF A CHARACTER IS RECEIVED, A FLAG IS SET
  442. ;TO STORE THE CHARACTER. A MAXIMUM OF TWO CHARACTERS ARE STORED,
  443. ;BUT MORE MAY BE STORED IF DESIRED (SEE COMMENT IN "INTDSKSV"
  444. ;ABOVE).
  445.  
  446. INMODEM: LDA     FASTCLK
  447.     ORA     A
  448.     JZ     SLOW
  449.     LXI     B,2500
  450.     JMP     TIMERL
  451.  
  452. SLOW:    LXI     B,1250
  453. TIMERL:    CALL     IN$MODlsr
  454.     CALL     ANI$MODRCVB
  455.     CALL     CPI$MODRCVR
  456.     JZ     GETBYTE
  457.     DCX     B
  458.     MOV     A,B
  459.     ORA     C
  460.     JNZ     TIMERL
  461.     RET
  462.  
  463. GETBYTE: CALL     IN$MODDATP
  464.     INR     D
  465.     RET
  466.  
  467. NUMRECS: MVI     M,EOFCHAR
  468.     INX     H
  469.     LXI     D,127
  470.     DAD     D
  471. NUMREC1: LXI     D,-(BOTTRAM)
  472.     DAD     D
  473.  
  474.     MOV     A,L        ;DIVIDE HL BY 128..
  475.     ORA     A
  476.     RAL            ;..TO GET THE..
  477.     MOV     L,H        ;..NUMBER OF SECTORS
  478.     MVI     H,0
  479.     PUSH     PSW
  480.     DAD     H
  481.     POP     PSW
  482.     MVI     A,0
  483.     ADC     L
  484.     MOV     L,A        ;RETURNS WITH NUMBER OF..
  485.     RET            ;..128 BYTE RECORDS IN HL.
  486.  
  487. WRTDSK:    LXI     D,BOTTRAM
  488. NEXTWRT: MVI     C,STDMA
  489.     CALL     BDOSRT
  490.     PUSH     D
  491.     LXI     D,FCB3
  492.     MVI     C,WRITE
  493.     CALL     BDOSRT
  494.     POP     D
  495.     XCHG
  496.     PUSH     D
  497.     LXI     D,128
  498.     DAD     D
  499.     POP     D
  500.     XCHG
  501.     DCX     H
  502.     MOV     A,H
  503.     ORA     L
  504.     JNZ     NEXTWRT
  505.     RET
  506.  
  507. CLOSE3:    LXI     D,FCB3
  508.     MVI     C,CLOSE
  509.     CALL     BDOS
  510.     RET
  511.  
  512. BDOSRT:    PUSH B ! PUSH D ! PUSH H ! PUSH PSW
  513.     CALL     BDOS
  514.     POP PSW ! POP H ! POP D ! POP B
  515.     RET
  516.  
  517. MOVE2:    LXI     H,FCB3
  518.     CALL     INITFCBS
  519.     LXI     H,FCB
  520.     LXI     D,FCB3
  521.     MVI     B,12
  522.     CALL     MOVE
  523.     RET
  524.  
  525. ;FILE TRANSFER ROUTINE - CALLED WITH 
  526. ;CONTROL-T FROM TERMINAL ROUTINE.
  527. ;TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X.
  528.  
  529. TRANSFER: PUSH H ! PUSH D ! PUSH B ! PUSH PSW
  530.     LXI     H,FCB4
  531.     CALL     INITFCBS    ;INITIALIZES FCBS POINTED..
  532.     LXI     H,FCB+16    ;..TO BY HL REG.
  533.     CALL     INITFCBS
  534. GET:    CALL     GETNAME
  535.     LDA     CMDBUF+2    ;WAS FILE ENTERED
  536.     CPI     20H
  537.     JZ     TRANSL2
  538.     CALL     MOVE4
  539.     CALL     OPEN4
  540.     CPI     0FFH        ;RETURN WITH 0FFH MEANS
  541.     JNZ     CONTIN        ;FILE DOES NOT EXIST
  542. TRANSL1: CALL     ILPRT
  543.         DB     CR,LF,LF,'++ FILE DOES NOT EXIST ++',CR,LF,BELL,0
  544. TRANSL2: CALL     ILPRT
  545.         DB     'TYPE "R" TO RETURN TO MODEM',CR,LF
  546.         DB     'TYPE "A" TO RE-ENTER NAME: ',BELL,0
  547.     CALL     KEYIN
  548.     CALL     UCASE
  549.     CALL     TYPE        ;ECHO RESPONSE
  550.     CALL     CRLF
  551.     CPI     'A'
  552.     JZ     GET
  553.     CPI     'R'
  554.     JZ     RETURN
  555.     JMP     TRANSL2
  556.  
  557. CONTIN:    LXI     D,80H
  558.     MVI     C,STDMA
  559.     CALL     BDOS
  560. READMR:    CALL     READ80
  561.     CPI     1        ;END OF FILE
  562.     JZ     RETURNS
  563.     CPI     2        ;BAD READ
  564.     JZ     RETURNU
  565.     CALL     SEND80C
  566.     CPI     EOFCHAR        ;END OF FILE - OMIT IF OBJECT..
  567.     JZ     RETURNS        ;..CODE IS TO BE SENT.
  568.     CPI     CAN        ;CANCELLATION?
  569.     JZ     TRANCAN
  570.     JMP     READMR
  571.  
  572. RETURNS: CALL     ILPRT
  573.         DB     CR,LF,LF,'++ FILE TRANSFER COMPLETED ++',CR,LF,BELL,0
  574.     JMP     RETURN
  575.  
  576. RETURNU: CALL     ILPRT
  577.         DB     CR,LF,LF,'++ FILE TRANSFER UNSUCCESSFUL ++',CR,LF,BELL,0
  578.     JMP     RETURN
  579.  
  580. TRANCAN: CALL     ILPRT
  581.         DB     CR,LF,LF,'++ TRANSFER CANCELLED ++',CR,LF,BELL,0
  582. RETURN:    POP PSW ! POP B ! POP D ! POP H
  583.     RET
  584.  
  585. INITFCBS:            ;ENTRY AT +2 WILL LEAVE..
  586.     MVI     M,0        ;..DRIVE NO. INTACT.
  587.     INX     H        ;WILL INITIALIZE AN FCB..
  588.     MVI     B,11        ;..POINTED TO BY HL-REG. FILLS 1ST POS
  589. LOOP10:    MVI     M,' '        ;..WITH 0, NEXT 11 WITH..
  590.     INX     H        ;..WITH BLANKS, AND LAST..
  591.     DCR     B        ;..21 WITH NULLS.
  592.     JNZ     LOOP10
  593.     MVI     B,21
  594. LOOP11:    MVI     M,0
  595.     INX     H
  596.     DCR     B
  597.     JNZ     LOOP11
  598.     RET
  599.  
  600. GETNAME: CALL     ILPRT
  601.         DB     CR,LF,'ENTER FILE NAME TO BE TRANSFERRED -  C/R TO QUIT: ',0
  602.     LXI     D,CMDBUF
  603.     CALL     INBUFF
  604.     CALL     CRLF
  605.     RET
  606.  
  607. MOVE4:    LXI     D,CMDBUF
  608.     LXI     H,FCB4
  609.     CALL     CPMLINE
  610.     RET
  611.  
  612. OPEN4:    LXI     D,FCB4
  613.     MVI     C,OPEN
  614.     CALL     BDOS
  615.     RET
  616.  
  617. READ80:    LXI     D,FCB4
  618.     MVI     C,READ
  619.     CALL     BDOS
  620.     RET
  621.  
  622. SEND80C: MVI     B,80H
  623.     LXI     H,80H
  624. SENDCH1: MOV     A,M
  625.     CALL     MODOUT
  626.     CPI     EOFCHAR
  627.     RZ
  628.     CALL     STAT        ;TEST TO SEE IF
  629.     ORA     A        ;CANCELLATION REQUESTED
  630.     JZ     SKIP12
  631.     CALL     KEYIN
  632.     CPI     CAN
  633.     RZ
  634. SKIP12:    INX     H
  635.     DCR     B
  636.     JNZ     SENDCH1
  637.     RET
  638.  
  639. MODOUT:    PUSH     PSW
  640. MODOUTL: CALL     IN$MODlsr
  641.     CALL     ANI$MODSNDB
  642.     CALL     CPI$MODSNDR
  643.     JNZ     MODOUTL
  644.     POP     PSW
  645.     CALL     OUT$MODDATP
  646.     CALL     TYPE
  647.     RET
  648.  
  649. FCB4:    DS     33
  650.  
  651. ;   TERMINAL ECHO MODE WITH OPTIONAL SAVE        "E" pri command
  652. ;    Note that characters typed from terminal can not be saved
  653. ;    because they are not echoed back from distant end.
  654.  
  655. PROTECT: CPI    07H        ; less than a BEL ?            ** TA
  656.     RC            ; .. yes, so forget it            **  |
  657.     CPI    0EH        ; less than a SO ?
  658.     JC    PROTEC1        ; .. yes, so ok to send to terminal
  659.     CPI    20H        ; less than a SPACE ?
  660.     RC            ; .. yes, so forget it
  661. PROTEC1: CALL    TYPE        ; send it to terminal
  662.     RET
  663.  
  664. CONVERS: CALL    OUT$MODDATP    ; send character out on modem
  665.                 ; (place future "save" of typed
  666.                 ; characters from terminal here)
  667.     RET
  668.  
  669. TRMECHO: PUSH H ! PUSH PSW ! PUSH B ! PUSH D
  670.     MVI    A,0CDH        ; CALL instruction
  671.     STA    NOTOG+3        ; .. patched in
  672.     STA    TERML+0FH    ; .. two places
  673.     LXI    H,PROTECT    ; what to call, check for bad character
  674.     SHLD    NOTOG+4        ; where to store it
  675.     LXI    H,CONVERS    ; what to call, send echo back to modem
  676.     SHLD    TERML+10H    ; where to store it
  677.     POP D ! POP B ! POP PSW ! POP H            ;        **  |
  678.     JMP    DSKSAV1        ; routine to use after it's patched    ** TA
  679.  
  680. ;TRMECHO: CALL     IN$MODlsr    ; look at modem control port
  681. ;    CALL     ANI$MODRCVB    ; 
  682. ;    CALL     CPI$MODRCVR    ; anything there ?
  683. ;    JZ     LINECHR        ; .. yes, go get it
  684. ;    CALL     STAT        ; anything from the terminal ?
  685. ;    JZ     TRMECHO        ; .. no, loop
  686. ;    CALL     KEYIN        ; .. yes, get it
  687. ;    CPI     EXITCHR        ; ^E ?
  688. ;    JZ     MENU        ; .. yes, do a menu
  689. ;    CPI     CHGBAUD        ; ^B ?
  690. ;    PUSH     PSW
  691. ;    CZ     NEWBAUD        ; .. yes, change baud
  692. ;    POP     PSW
  693. ;    CPI     CHGBAUD        ; it might be ^B
  694. ;    JZ     TRMECHO        ; .. if it is, we already processed so loop
  695. ;    CALL     OUT$MODDATP    ; .. if none of the above, send it to modem
  696. ;    CALL     TYPE        ; .. and to the terminal
  697. ;    JMP     TRMECHO        ; loop again
  698.  
  699. LINECHR: CALL     IN$MODDATP
  700.     CALL     OUT$MODDATP
  701.     CALL     TYPE
  702.     JMP     TRMECHO
  703.  
  704.  
  705. ;   SEND A CP/M FILE                    "S" pri command
  706.  
  707. SENDFIL: LDA     BATCHFLG    ;CHECK IF MULTIPLE FILE..
  708.     ORA     A        ;..MODE IS SET.
  709.     JNZ     SENDC1
  710.     MVI     A,TRUE        ;INDICATE BATCH SEND
  711.     STA     SENDFLG
  712.     LDA     FSTFLG        ;IF FIRST TIME THRU..
  713.     ORA     A        ;..SCAN THE COMMAND LINE..
  714.     CNZ     TNMBUF        ;..FOR MULTIPLE NAMES.
  715.     CALL     SENDFN        ;SENDS FILE NAME TO RECEIVER
  716.     JNC     SENDC2        ;CARRY SET MEANS NO MORE FILES.
  717.     MVI     A,'B'        ;STOP BATCH..
  718.     STA     BATCHFLG    ;..MODE OPTION.
  719.     MVI     A,EOT        ;FINAL XFER END
  720.     CALL     SEND
  721.     JMP     DONE
  722.  
  723. SENDC1:    LDA     FCB+1
  724.     CPI     ' '
  725.     JZ     BLKFILE
  726. SENDC2:    CALL     OPENFIL
  727.     MVI     E,80
  728.     CALL     WAITNAK
  729. SENDLP:    CALL     RDSECT
  730.     JC     SENDEOF
  731.     CALL     INCRSNO
  732.     XRA     A
  733.     STA     ERRCT
  734. SENDRPT: CALL     SENDHDR
  735.     CALL     SENDSEC
  736.     CALL     SENDCKS
  737.     CALL     GETACK
  738.     JC     SENDRPT
  739.     JMP     SENDLP
  740.  
  741. SENDEOF: MVI     A,EOT
  742.     CALL     SEND
  743.     CALL     GETACK
  744.     JC     SENDEOF
  745.     JMP     DONE
  746.  
  747. ;   RECEIVE A FILE                    "R" pri command
  748.  
  749. RCVFIL:    LDA     BATCHFLG    ;CHECK IF MULT..
  750.     ORA     A        ;..FILE MODE.
  751.     JNZ     RCVC1
  752.     MVI     A,FALSE        ;FLAG WHERE TO RETURN..
  753.     STA     SENDFLG        ;..FOR NEXT FILE TRANS.
  754.     CALL     GETFN        ;GET THE FILE NAME.
  755.     JNC     RCVC2        ;CARRY SET MEANS NO MORE FILES.
  756.     MVI     A,'B'        ;STOP BATCH..
  757.     STA     BATCHFLG    ;..MODE OPTION.
  758.     JMP     DONE
  759.  
  760. RCVC1:    LDA     FCB+1        ;MAKE SURE FILE IS NAMED
  761.     CPI     ' '
  762.     JZ     BLKFILE
  763.     JMP     RCVC3
  764.  
  765. RCVC2:    CALL     CKCPM2
  766.     CALL     CKBAKUP
  767. RCVC3:    CALL     ERASFIL
  768.     CALL     MAKEFIL
  769.     LDA     QFLG
  770.     ORA     A
  771.     JNZ     RCVLP
  772.     LDA     BATCHFLG
  773.     ORA     A        ;DON'T PRINT MSSG IF..
  774.     JZ     RCVLP        ;..IN MULTI AND QUIET.
  775.     CALL     ILPRT
  776.     DB     'FILE OPEN, READY TO RECEIVE',CR,LF,0
  777. RCVLP:    CALL     RCVSECT
  778.     JC     RCVEOT
  779.     CALL     WRSECT
  780.     CALL     INCRSNO
  781.     CALL     SENDACK
  782.     JMP     RCVLP
  783.  
  784. RCVEOT:    CALL     WRBLOCK
  785.     CALL     SENDACK
  786.     CALL     CLOSFIL
  787.     JMP     DONE
  788.     
  789. ;   SUBROUTINES
  790.  
  791. SENDFN:    LDA     QFLG
  792.     ORA     A
  793.     JZ     SWNAK
  794.     CALL     ILPRT
  795.     DB     'AWAITING NAME NAK',CR,LF,0
  796. SWNAK:    MVI     E,80
  797.     CALL     WAITNLP
  798.     MVI     A,ACK        ;GOT NAK, SEND ACK
  799.     CALL     SEND
  800.     LXI     H,FILECT
  801.     DCR     M
  802.     JM     NOMRNM
  803.     LHLD     NBSAVE        ;GET FILE NAME..
  804.     LXI     D,FCB        ;..IN FCB
  805.     MVI     B,12
  806.     CALL     MOVE
  807.     SHLD     NBSAVE
  808.     CALL     SENDNM        ;SEND IT
  809.     ORA     A        ;CLEAR CARRY
  810.     RET
  811.  
  812. NOMRNM:    MVI     A,EOT
  813.     CALL     SEND
  814.     STC
  815.     RET
  816.  
  817. SENDNM:    PUSH     H
  818. SENDNM1: MVI     D,11        ;COUNT CHARS IN NAME
  819.     MVI     C,0        ;INIT CHECKSUM
  820.     LXI     H,FCB+1        ;ADDRESS NAME
  821. NAMLPS:    MOV     A,M        ;SEND NAME
  822.     ANI     7FH        ;STRIP HIGH ORDER BIT SO CP/M 2..
  823.     CALL     SEND        ;..WON'T SEND R/O FILE DESIGNATION.
  824.     LDA     QFLG        ;SHOW NAME IF..
  825.     ORA     A        ;..QFLG NOT SET.
  826.     MOV     A,M
  827.     CNZ     TYPE
  828. ACKLP:    PUSH     B        ;SAVE CKSUM
  829.     MVI     B,1        ;WAIT FOR RECEIVER..
  830.     CALL     RECV        ;..TO ACKNOWLEDGE..
  831.     POP     B        ;..GETTING LETTER.
  832.     JC     SCKSER
  833.     CPI     ACK
  834.     JNZ     ACKLP
  835.     INX     H        ;NEXT CHAR
  836.     DCR     D
  837.     JNZ     NAMLPS
  838.     MVI     A,EOFCHAR    ;TELL RECEIVER END OF NAME
  839.     CALL     SEND
  840.     LDA     QFLG
  841.     ORA     A
  842.     CNZ     CRLF
  843.     MOV     D,C        ;SAVE CHECKSUM
  844.     MVI     B,1
  845.     CALL     RECV        ;GET CHECKSUM..
  846.     CMP     D        ;..FROM RECEIVER.
  847.     JZ     NAMEOK
  848. SCKSER:    MVI     A,BDNMCH    ;BAD NAME-TELL RECEIVER
  849.     CALL     SEND
  850.     LDA     QFLG
  851.     ORA     A
  852.     JZ     SKCSER1
  853.     CALL     ILPRT
  854.     DB     'CHECKSUM ERROR',CR,LF,0
  855. SKCSER1: MVI     E,80        ;DO HANDSHAKING OVER
  856.     CALL     WAITNLP        ;DON'T PRINT "AWAITING NAK" MSG
  857.     MVI     A,ACK
  858.     CALL     SEND
  859.     JMP     SENDNM1
  860.  
  861. NAMEOK:    MVI     A,OKNMCH    ;GOOD NAME-TELL RECEIVER
  862.     CALL     SEND
  863.     POP     H
  864.     RET    
  865.  
  866. GETFN:    LXI     H,FCB
  867.     CALL     INITFCBS+2    ;DOES NOT INITIALIZE DRIVE
  868.     LDA     QFLG
  869.     ORA     A
  870.     JZ     GNAMELP
  871.     CALL     ILPRT
  872.     DB     'AWAITING FILE NAME',CR,LF,0
  873. GNAMELP: CALL     HSNAK
  874.     JC     GNAMELP
  875.     CALL     GETNM        ;GET THE NAME
  876.     CPI     EOT        ;IF EOT, THEN NO MORE FILES
  877.     JZ     NOMRNMG
  878.     ORA     A        ;CLEAR CARRY
  879.     RET
  880.  
  881. NOMRNMG: STC
  882.     RET
  883.  
  884. GETNM:    PUSH     H
  885. GETNM1:    MVI     C,0        ;INIT CHECKSUM
  886.     LXI     H,FCB+1
  887. NAMELPG: MVI     B,5
  888.     CALL     RECV        ;GET CHAR
  889.     JNC     GETNM3
  890.     LDA     QFLG
  891.     ORA     A
  892.     JZ     GETNM2
  893.     CALL     ILPRT
  894.     DB     'TIME OUT RECEIVING FILENAME',CR,LF,0
  895. GETNM2:    JMP     GCKSER
  896.  
  897. GETNM3:    CPI     EOT        ;IF EOT, THEN NO MORE FILES
  898.     JZ     GNRET
  899.     CPI     EOFCHAR        ;GOT END OF NAME
  900.     JZ     ENDNAME
  901.     MOV     M,A        ;PUT NAME IN FCB
  902.     LDA     QFLG        ;TYPE IT IF NO QFLG
  903.     ORA     A
  904.     MOV     A,M
  905.     CNZ     TYPE
  906.     PUSH     B        ;SAVE CKSUM
  907.     MVI     A,ACK        ;ACK GETTING LETTER
  908.     CALL     SEND
  909.     POP     B
  910.     INX     H        ;GET NEXT CHAR
  911.     MOV     A,L        ;DON'T LET NOISE...
  912.     CPI     7FH        ;..CAUSE OVERFLOW..
  913.     JZ     GCKSER        ;..INTO PROGRAM AREA.
  914.     JMP     NAMELPG
  915.  
  916. ENDNAME: LDA     QFLG
  917.     ORA    A
  918.     CNZ     CRLF
  919.     MOV     A,C        ;SEND CHECKSUM
  920.     CALL     SEND
  921.     MVI     B,1
  922.     CALL     RECV        ;CHECKSUM GOOD?
  923.     CPI     OKNMCH        ;YES IF OKNMCH SENT..
  924.     JZ     GNRET        ;..ELSE DO OVER.
  925. GCKSER:    LXI     H,FCB        ;CLEAR FCB (EXCEPT DRIVE)..
  926.     CALL     INITFCBS+2    ;..SINCE IT MIGHT BE DAMAGED..
  927.     LDA     QFLG        ;..BY TOO MANY CHARS.
  928.     ORA     A
  929.     JZ     GCKSER1
  930.     CALL     ILPRT
  931.     DB     'CHECKSUM ERROR',CR,LF,0
  932. GCKSER1: CALL     HSNAK        ;DO HANDSHAKING OVER
  933.     JC     GCKSER1
  934.     JMP     GETNM1
  935.  
  936. GNRET:    POP     H
  937.     RET
  938.  
  939. HSNAK:    MVI     A,NAK        ;SEND NAK UNTIL..
  940.     CALL     SEND        ;..RECEIVING ACK.
  941.     CALL     CKABORT        ;DON'T GET HUNG UP HERE
  942.     MVI     B,2        ;WAIT 2 SECONDS..
  943.     CALL     RECV        ;..IN RECEIVE.
  944.     CPI     CAN        ;IF SENDER ABORTS..
  945.     JZ     ABORT        ;..DURING NAME TRANSFER.
  946.     CPI     ACK        ;IF NAK,RETURN WITH..
  947.     RZ            ;..CARRY CLEAR.
  948.     STC
  949.     RET
  950.  
  951. TNMBUF:    MVI     A,FALSE        ;CALL FROM SENDFIL ONLY ONCE.
  952.     STA     FSTFLG
  953.     STA     FILECT
  954.     CALL     SCAN
  955.     LXI     H,NAMEBUF
  956.     SHLD     NBSAVE        ;SAVE ADDR OF 1ST NAME
  957. TNLP1:    CALL    TRTOBUF
  958.     LXI     H,FCB
  959.     LXI     D,FCBBUF
  960.     CALL     CPMLINE        ;PARSE NAME TO CP/M FORMAT
  961. TNLP2:    CALL     MFNAME        ;SEARCH FOR NAMES (* FORMAT)
  962.     JC     NEXTNM
  963.     LDA     FCB+10        ;IF CP/M 2 $SYS FILE..
  964.     ANI     80H        ;..DON'T SEND
  965.     JNZ     TNLP2
  966.     LHLD     NBSAVE        ;GET NAME
  967.     LXI     D,FCB        ;MOVE IT TO FCB
  968.     XCHG
  969.     MVI     B,12
  970.     CALL     MOVE
  971.     XCHG
  972.     SHLD     NBSAVE        ;ADDR OF NEXT NAME
  973.     LXI     H,FILECT    ;COUNT FILES FOUND
  974.     INR     M
  975.     JMP     TNLP2
  976.  
  977. NEXTNM:    LXI     H,NAMECT    ;COUNT NAMES FOUND
  978.     DCR     M
  979.     JNZ     TNLP1
  980.     LXI     H,NAMEBUF    ;SAVE START OF BUFFER
  981.     SHLD     NBSAVE
  982.     LDA     FILECT
  983.     CPI     65        ;NO MORE THAN 64 TRANSFERS
  984.     RC
  985.     MVI     A,64        ;ONLY X'FER FIRST 64
  986.     STA     FILECT
  987.     RET
  988.  
  989. ;SCANS CMDBUF COUNTING NAMES AND PUTTING DELIMITER (SPACE)
  990. ;AFTER LAST NAME
  991.  
  992. SCAN:    PUSH     H
  993.     LXI     H,NAMECT
  994.     MVI     M,0
  995.     LXI     H,CMDBUF+1    ;FIND END OF CMD LINE..
  996.     MOV     C,M        ;..AND PUT SPACE THERE.
  997.     MVI     B,0
  998.     LXI     H,CMDBUF+2
  999.     DAD     B
  1000.     MVI     M,20H
  1001.     LXI     H,CMDBUF+1
  1002.     MOV     B,M
  1003.     INR     B
  1004.     INR     B
  1005. SCANLP1: INX     H
  1006.     DCR     B
  1007.     JZ     DNSCAN
  1008.     MOV     A,M
  1009.     CPI     20H
  1010.     JNZ     SCANLP1
  1011. SCANLP2: INX     H        ;EAT EXTRA SPACES
  1012.     DCR     B
  1013.     JZ     DNSCAN
  1014.     MOV     A,M
  1015.     CPI     20H
  1016.     JZ     SCANLP2
  1017.     SHLD     BGNMS        ;SAVE START OF NAMES IN CMDBUF
  1018.     INR     B
  1019.     DCX     H
  1020. SCANLP3: INX     H
  1021.     DCR     B
  1022.     JZ     DNSCAN
  1023.     MOV     A,M
  1024.     CPI     20H
  1025.     JNZ     SCANLP3
  1026.     LDA     NAMECT        ;COUNTS NAMES
  1027.     INR     A
  1028.     STA     NAMECT
  1029. SCANLP4: INX     H        ;EAT SPACES
  1030.     DCR     B
  1031.     JZ     DNSCAN
  1032.     MOV     A,M
  1033.     CPI     20H
  1034.     JZ     SCANLP4
  1035.     JMP     SCANLP3
  1036.  
  1037. DNSCAN:    MVI     M,20H        ;SPACE AFTER LAST CHAR
  1038.     POP     H
  1039.     RET
  1040.  
  1041. ;PLACES NEXT NAME IN BUFFER SO CPMLINE MAY PARSE IT
  1042.  
  1043. TRTOBUF: LHLD     BGNMS
  1044.     MVI     B,0
  1045.     LXI     D,FCBBUF+2
  1046. TBLP:    MOV     A,M
  1047.     CPI     20H
  1048.     JZ     TRBFEND
  1049.     STAX     D
  1050.     INX     H
  1051.     INX     D
  1052.     INR     B        ;COUNT CHARS IN NAME
  1053.     JMP     TBLP
  1054.  
  1055. TRBFEND: INX     H
  1056.     MOV     A,M        ;EAT EXTRA SPACES
  1057.     CPI     20H
  1058.     JZ     TRBFEND
  1059.     SHLD     BGNMS
  1060.     LXI     H,FCBBUF+1    ;PUT # CHARS BEFORE NAME
  1061.     MOV     M,B
  1062.     RET
  1063.  
  1064. ;IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'.
  1065.  
  1066. CKCPM2:    MVI     C,12
  1067.     CALL     BDOS
  1068.     ORA     A        ;RETURN 0 MEANS CP/M 1
  1069.     RZ
  1070.     MVI     C,STDMA
  1071.     LXI     D,80H
  1072.     CALL     BDOS
  1073.     MVI     C,SRCHF        ;SEARCH FOR FILE
  1074.     LXI     D,FCB
  1075.     CALL     BDOS
  1076.     CPI     0FFH
  1077.     RZ
  1078.     ADD A ! ADD A        ;MULT A-REG BY..
  1079.     ADD A ! ADD A        ;..32 TO FIND..
  1080.     ADD     A        ;..NAME IN DMA.
  1081.     LXI     H,80H
  1082.     ADD     L
  1083.     MOV     L,A        ;HL POINTS TO DIR NAME
  1084.     LXI     D,9
  1085.     DAD     D        ;POINT TO R/O ATTRIB BYTE
  1086.     MOV     A,M
  1087.     ANI     80H        ;TEST MSB
  1088.     JNZ     MKCHG        ;IF SET, MAKE CHANGE
  1089.     INX     H        ;CHECK SYSTEM ATTRIB BYTE
  1090.     MOV     A,M
  1091.     ANI     80H
  1092.     RZ            ;NOT $SYS OR $R/O
  1093.     DCX     H
  1094. MKCHG:    LXI     D,-8
  1095.     DAD     D        ;POINT HL TO FILENAME + 1
  1096.     LXI     D,FCB+1        ;MOVE DIR NAME TO FCB..
  1097.     MVI     B,11        ;..WITHOUT CHANGING DRIVE.
  1098.     CALL     MOVE
  1099.     LXI     H,FCB+9        ;R/O ATTRIB
  1100.     MOV     A,M
  1101.     ANI     7FH        ;STRIP R/O ATTRIB
  1102.     MOV     M,A
  1103.     INX     H        ;SYS ATTRIB
  1104.     MOV     A,M
  1105.     ANI     7FH
  1106.     MOV     M,A
  1107.     LXI     D,FCB
  1108.     MVI     C,30        ;SET NEW ATTRIBS IN DIR
  1109.     CALL     BDOS
  1110.  
  1111. ;MAY BE CALLED BY CKBAKUP BELOW. ITS RETURN DONE HERE
  1112.  
  1113. PLANCHG: LXI     H,FCB        ;CHANGE NAME TO TYPE "BAK"
  1114.     LXI     D,6CH
  1115.     MVI     B,9        ;MOVE DRIVE AND NAME (NOT TYPE)
  1116.     CALL     MOVE
  1117.     LXI     H,75H        ;START OF TYPE IN FCB2
  1118.     MVI     M,'B'
  1119.     INX     H
  1120.     MVI     M,'A'
  1121.     INX     H
  1122.     MVI     M,'K'
  1123.     LXI     D,6CH
  1124.     MVI     C,ERASE        ;ERASE ANY PREV BACKUPS
  1125.     CALL     BDOS
  1126.     LXI     H,6CH        ;FCB2 DR FIELD SHOULD..
  1127.     MVI     M,0        ;..0 FOR RENAME.
  1128.     LXI     D,FCB
  1129.     MVI     C,23        ;RENAME
  1130.     CALL     BDOS
  1131.     RET
  1132.  
  1133. CKBAKUP: LDA     BAKUPBYTE
  1134.     ORA     A
  1135.     RZ
  1136.     MVI     C,SRCHF
  1137.     LXI     D,FCB
  1138.     CALL     BDOS
  1139.     INR     A
  1140.     RZ            ;FILE NOT FOUND
  1141.     JMP     PLANCHG        ;IN "CKCPM2" - RET DONE THERE
  1142.  
  1143. ;MULTI-FILE ACCESS SUBROUTINE FROM CP/M USER'S GROUP
  1144. ;FIXED BY MARK ZEIGER 8/17/80
  1145. ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  1146.  
  1147. MFNAME:    MFACCESS        ;A MACRO IN MACROS.LIB
  1148.  
  1149.  
  1150. RCVSECT: XRA     A
  1151.     STA     ERRCT
  1152. RCVRPT:    LDA     QFLG
  1153.     ORA     A
  1154.     JZ     RCVSQ
  1155.     CALL     ILPRT
  1156.     DB     'AWAITING #',0
  1157.     LDA     SECTNO
  1158.     INR     A
  1159.     CALL     HEXO
  1160.     CALL     CRLF
  1161. RCVSQ:    MVI     B,7        ;10 IN ORIG PROG
  1162.     CALL     RECV
  1163.     JC     RCVSTOT
  1164.     CPI     CAN        ;CHECK FOR CANCEL..
  1165.     JZ     ABORT        ;..REQUEST FROM SENDER.
  1166.     CPI     SOH
  1167.     JZ     RCVSOH
  1168.     ORA     A
  1169.     JZ     RCVSQ
  1170.     CPI     EOT
  1171.     STC
  1172.     RZ
  1173.     MOV     B,A
  1174.     LDA     VSEEFLG
  1175.     ORA     A
  1176.     JZ     RCVSEH
  1177.     LDA     QFLG
  1178.     ORA     A
  1179.     JZ     RCVSERR
  1180. RCVSEH:    MOV     A,B
  1181.     CALL     HEXO
  1182.     CALL     ILPRT
  1183.         DB     'H RCD, NOT SOH',CR,LF,0
  1184.  
  1185. RCVSERR: MVI     B,1
  1186.     CALL     RECV
  1187.     JNC     RCVSERR
  1188.     MVI     A,NAK
  1189.     CALL     SEND
  1190.     LDA     ERRCT
  1191.     INR     A
  1192.     STA     ERRCT
  1193.     CPI     ERRLIM
  1194.     JC     RCVRPT
  1195.     LDA     VSEEFLG
  1196.     ORA     A
  1197.     JZ     RCVCKQ
  1198.     LDA     QFLG
  1199.     ORA     A
  1200.     JZ     RCVSABT
  1201. RCVCKQ:    CALL     CKQUIT
  1202.     JZ     RCVSECT
  1203. RCVSABT: CALL     CLOSFIL
  1204.     CALL     ERXIT
  1205.     DB     '++ UNABLE TO RECEIVE BLOCK -- ABORTING ++',CR,LF,BELL,'$'
  1206.  
  1207. RCVSTOT: LDA     VSEEFLG
  1208.     ORA     A
  1209.     JZ     RCVSPT
  1210.     LDA     QFLG
  1211.     ORA     A
  1212.     JZ     RCVSERR
  1213. RCVSPT:    CALL     ILPRT
  1214.         DB     '++ TIMEOUT ++ ',0
  1215. RCVPRN:    LDA     ERRCT
  1216.     CALL     HEXO
  1217.     CALL     CRLF
  1218.     JMP     RCVSERR
  1219.  
  1220. RCVSOH:    MVI     B,1
  1221.     CALL     RECV
  1222.     JC     RCVSTOT
  1223.     MOV     D,A
  1224.     MVI     B,1
  1225.     CALL     RECV
  1226.     JC     RCVSTOT
  1227.     CMA
  1228.     CMP     D
  1229.     JZ     RCVDATA
  1230.     LDA     VSEEFLG
  1231.     ORA     A
  1232.     JZ     RCVBSE
  1233.     LDA     QFLG
  1234.     ORA     A
  1235.     JZ     RCVSERR
  1236. RCVBSE:    CALL     ILPRT
  1237.         DB     '++ BAD SECTOR # IN HDR ++',CR,LF,BELL,0
  1238.     JMP     RCVSERR
  1239.  
  1240. RCVDATA: MOV     A,D
  1241.     STA     RCVSNO
  1242.     MVI     A,1
  1243.     STA     DATAFLG
  1244.     MVI     C,0
  1245.     LXI     H,80H
  1246.  
  1247. RCVCHR:    MVI     B,1
  1248.     CALL     RECV
  1249.     JC     RCVSTOT
  1250.     MOV     M,A
  1251.     INR     L
  1252.     JNZ     RCVCHR
  1253.     MOV     D,C
  1254.     XRA     A
  1255.     STA     DATAFLG
  1256.     MVI     B,1
  1257.     CALL     RECV
  1258.     JC     RCVSTOT
  1259.     CMP     D
  1260.     JNZ     RCVCERR
  1261.     LDA     RCVSNO
  1262.     MOV     B,A
  1263.     LDA     SECTNO
  1264.     CMP     B
  1265.     JZ     RECVACK
  1266.     INR     A
  1267.     CMP     B
  1268.     JNZ     ABORT
  1269.     RET
  1270.  
  1271. RCVCERR: LDA     VSEEFLG
  1272.     ORA     A
  1273.     JZ     RCVCPR
  1274.     LDA     QFLG
  1275.     ORA     A
  1276.     JZ     RCVSERR
  1277. RCVCPR:    CALL     ILPRT
  1278.         DB     '++ CKSUM ++',0
  1279.     JMP     RCVPRN
  1280.  
  1281. RECVACK: CALL     SENDACK
  1282.     JMP     RCVSECT
  1283.  
  1284. SENDACK: MVI     A,ACK
  1285.     CALL     SEND
  1286.     RET
  1287.  
  1288. SENDHDR: LDA     QFLG
  1289.     ORA     A
  1290.     JZ     SENDHNM
  1291.     CALL     ILPRT
  1292.         DB     'SEND # ',0
  1293.     LDA     SECTNO
  1294.     CALL     HEXO
  1295.     CALL     CRLF
  1296. SENDHNM: MVI     A,SOH
  1297.     CALL     SEND
  1298.     LDA     SECTNO
  1299.     CALL     SEND
  1300.     LDA     SECTNO
  1301.     CMA
  1302.     CALL     SEND
  1303.     RET
  1304.  
  1305. SENDSEC: MVI     A,1
  1306.     STA     DATAFLG
  1307.     MVI     C,0
  1308.     LXI     H,80H
  1309. SENDC:    MOV     A,M
  1310.     CALL     SEND
  1311.     INR     L
  1312.     JNZ     SENDC
  1313.     XRA     A
  1314.     STA     DATAFLG
  1315.     RET
  1316.  
  1317. SENDCKS: MOV     A,C
  1318.     CALL     SEND
  1319.     MOV    A,0    ;SEND NULLS
  1320.     CALL    SEND    
  1321.     MOV    A,0
  1322.     CALL    SEND
  1323.     RET
  1324.  
  1325. GETACK:    MVI     B,7        ;10 IN ORIG PROG
  1326.     CALL     RECVDG
  1327.     JC     GETATOT
  1328.     CPI     ACK
  1329.     RZ
  1330.     CPI     CAN
  1331.     JZ     ABORT
  1332.     MOV     B,A
  1333.     LDA     QFLG
  1334.     ORA     A
  1335.     JZ     ACKERR
  1336.     MOV     A,B
  1337.     CALL     HEXO
  1338.     CALL     ILPRT
  1339.         DB     'H RCD, NOT ACK',CR,LF,0
  1340. ACKERR:    LDA     ERRCT
  1341.     INR     A
  1342.     STA     ERRCT
  1343.     CPI     ERRLIM
  1344.     RC
  1345.     LDA     VSEEFLG
  1346.     ORA     A
  1347.     JZ     GACKV
  1348.     LDA     QFLG
  1349.     ORA     A
  1350.     JZ     CSABORT
  1351. GACKV:    CALL     CKQUIT
  1352.     STC
  1353.     RZ
  1354. CSABORT: CALL     ERXIT
  1355.     DB     'CAN''T SEND SECTOR -- ABORTING',CR,LF,'$'
  1356.  
  1357. GETATOT: LDA     QFLG
  1358.     ORA     A
  1359.     JZ     ACKERR
  1360.     CALL     ILPRT
  1361.         DB     'TIMEOUT ON ACK',CR,LF,0
  1362.     JMP     ACKERR
  1363.  
  1364. CKABORT: LDA     VSEEFLG
  1365.     ORA     A
  1366.     JZ     CKABGO
  1367.     LDA     QFLG
  1368.     ORA     A
  1369.     RZ
  1370. CKABGO:    CALL     STAT
  1371.     RZ
  1372.     CALL     KEYIN
  1373.     CPI     CAN
  1374.     RNZ
  1375.  
  1376. ABORT:    LXI     SP,STACK
  1377. ABORTL:    MVI     B,1
  1378.     CALL     RECV
  1379.     JNC     ABORTL
  1380.     MVI     A,CAN
  1381.     CALL     SEND
  1382. ABORTW:    MVI     B,1
  1383.     CALL     RECV
  1384.     JNC     ABORTW
  1385.     MVI     A,' '
  1386.     CALL     SEND
  1387.     CALL     ILPRT
  1388.         DB     'ROUTINE CANCELLED',CR,LF,BELL,0
  1389.     MVI     A,'B'        ;TURN MULTI-FILE MODE..
  1390.     STA     BATCHFLG    ;..OFF SO ROUTINE ENDS.
  1391.     JMP     DONETCE
  1392.  
  1393. INCRSNO: LDA     SECTNO
  1394.     INR     A
  1395.     STA     SECTNO
  1396.     RET
  1397.  
  1398. ERASFIL: LDA     BATCHFLG    ;DON'T ASK FOR ERASE..
  1399.     ORA     A        ;..IN MULTI-FILE MODE,..
  1400.     JZ     NOASK        ;..JUST DO IT.
  1401.     LXI     D,FCB
  1402.     MVI     C,SRCHF
  1403.     CALL     BDOS
  1404.     INR     A
  1405.     RZ
  1406.     CALL     ILPRT
  1407.         DB     'FILES EXISTS -- TYPE ''Y'' TO ERASE: ',BELL,0
  1408.     CALL     KEYIN
  1409.     PUSH     PSW
  1410.     CALL     TYPE
  1411.     POP     PSW
  1412.     CALL     UCASE
  1413.     CPI     'Y'
  1414.     JNZ     MENU
  1415.     CALL     CRLF
  1416.  
  1417. NOASK:    LXI     D,FCB
  1418.     MVI     C,ERASE
  1419.     CALL     BDOS
  1420.     RET
  1421.  
  1422. BLKFILE: CALL     ILPRT    ;ROUTINE IF NO FILE IS NAMED FOR "SEND" OR "RECEIVE"
  1423.     DB     CR,LF,'No file specified',CR,LF,BELL,0
  1424.     JMP     MENU
  1425.  
  1426. MAKEFIL: LXI     D,FCB
  1427.     MVI     C,MAKE
  1428.     CALL     BDOS
  1429.     INR     A
  1430.     RNZ
  1431.     CALL     ERXIT
  1432.     DB     'ERROR - CAN''T MAKE FILE',CR,LF,BELL
  1433.     DB     'DIRECTORY MUST BE FULL',CR,LF,'$'
  1434.  
  1435. OPENFIL: LXI     D,FCB
  1436.     MVI     C,OPEN
  1437.     CALL     BDOS
  1438.     INR     A
  1439.     JNZ     OPENOK
  1440.     CALL     ERXIT
  1441.     DB     'CAN''T OPEN FILE$'
  1442.  
  1443. OPENOK:    LDA     BATCHFLG
  1444.     ORA     A
  1445.     JNZ     OPENOK1
  1446.     LDA     QFLG
  1447.     ORA     A
  1448.     RZ
  1449. OPENOK1: CALL     ILPRT
  1450.         DB     'FILE OPEN - EXTENT LENGTH: ',0
  1451.     LDA     FCB+15
  1452.     CALL     HEXO
  1453.     MVI     A,'H'
  1454.     CALL     TYPE
  1455.     CALL     CRLF
  1456.     RET
  1457.  
  1458. CLOSFIL: LXI     D,FCB
  1459.     MVI     C,CLOSE
  1460.     CALL     BDOS
  1461.     INR     A
  1462.     RNZ
  1463.     CALL     ERXIT
  1464.     DB     'CAN''T CLOSE FILE$'
  1465.  
  1466. RDSECT:    LDA     SECINBF
  1467.     DCR     A
  1468.     STA     SECINBF
  1469.     JM     RDBLOCK
  1470.     LHLD     SECPTR
  1471.     LXI     D,80H
  1472.     CALL     MOVE128
  1473.     SHLD     SECPTR
  1474.     RET
  1475.  
  1476. RDBLOCK: LDA     EOFLG
  1477.     CPI     1
  1478.     STC
  1479.     RZ
  1480.     MVI     C,0
  1481.     LXI     D,DBUF
  1482. RDSECLP: PUSH     B
  1483.     PUSH     D
  1484.     MVI     C,STDMA
  1485.     CALL     BDOS
  1486.     LXI     D,FCB
  1487.     MVI     C,READ
  1488.     CALL     BDOS
  1489.     POP     D
  1490.     POP     B
  1491.     ORA     A
  1492.     JZ     RDSECOK
  1493.     DCR     A
  1494.     JZ     REOF
  1495.     CALL     ERXIT
  1496.     DB     '++ FILE READ ERROR ++$'
  1497.  
  1498. RDSECOK: LXI     H,80H
  1499.     DAD     D
  1500.     XCHG
  1501.     INR     C
  1502.     MOV     A,C
  1503.     CPI     16
  1504.     JZ     RDBFULL
  1505.     JMP     RDSECLP
  1506.  
  1507. REOF:    MVI     A,1
  1508.     STA     EOFLG
  1509.     MOV     A,C
  1510.  
  1511. RDBFULL: STA     SECINBF
  1512.     LXI     H,DBUF
  1513.     SHLD     SECPTR
  1514.     LXI     D,80H
  1515.     MVI     C,STDMA
  1516.     CALL     BDOS
  1517.     JMP     RDSECT
  1518.  
  1519. WRSECT:    LHLD     SECPTR
  1520.     XCHG
  1521.     LXI     H,80H
  1522.     CALL     MOVE128
  1523.     XCHG
  1524.     SHLD     SECPTR
  1525.     LDA     SECINBF
  1526.     INR     A
  1527.     STA     SECINBF
  1528.     CPI     16
  1529.     RNZ
  1530.  
  1531. WRBLOCK: LDA     SECINBF
  1532.     ORA     A
  1533.     RZ
  1534.     MOV     C,A
  1535.     LXI     D,DBUF
  1536. DKWRLP:    PUSH     H
  1537.     PUSH     D
  1538.     PUSH     B
  1539.     MVI     C,STDMA
  1540.     CALL     BDOS
  1541.     LXI     D,FCB
  1542.     MVI     C,WRITE
  1543.     CALL     BDOS
  1544.     POP     B
  1545.     POP     D
  1546.     POP     H
  1547.     ORA     A
  1548.     JNZ     WRERR
  1549.     LXI     H,80H
  1550.     DAD     D
  1551.     XCHG
  1552.     DCR     C
  1553.     JNZ     DKWRLP
  1554.     XRA     A
  1555.     STA     SECINBF
  1556.     LXI     H,DBUF
  1557.     SHLD     SECPTR
  1558.     RET
  1559.  
  1560. WRERR:    MVI     C,CAN
  1561.     CALL     SEND
  1562.     CALL     ERXIT
  1563.     DB     'ERROR WRITING FILE',CR,LF,'$'
  1564.  
  1565. RECVDG    EQU     $
  1566.     CALL     IN$MODDATP
  1567.     CALL     IN$MODDATP
  1568.  
  1569. RECV:    PUSH     D
  1570.  
  1571.     LDA     FASTCLK
  1572.     ORA     A
  1573.     JZ     MSEC
  1574.     MOV     A,B
  1575.     ADD     A
  1576.     MOV     B,A
  1577.  
  1578. MSEC:    LXI     D,15000        ;60% OF ORIG 50000
  1579.     CALL     CKABORT
  1580. MWTI:    CALL     IN$MODlsr
  1581.     CALL     ANI$MODRCVB
  1582.     CALL     CPI$MODRCVR
  1583.     JZ     MCHAR
  1584.     IN    MODLSR
  1585.     ANI    038H
  1586.     JZ    MWTI2
  1587.     IN    MODDATP
  1588.     IN    MODMCR
  1589.     ORI    010H
  1590.     OUT    MODMCR
  1591. MWTI2:    DCR     E
  1592.     JNZ     MWTI
  1593.     DCR     D
  1594.     JNZ     MWTI
  1595.     DCR     B
  1596.     JNZ     MSEC
  1597.     POP     D
  1598.     STC
  1599.     RET
  1600.  
  1601. MCHAR:    CALL     IN$MODDATP
  1602.     POP     D
  1603.     PUSH     PSW
  1604.     ADD     C
  1605.     MOV     C,A
  1606.     LDA     RSEEFLG
  1607.     ORA     A
  1608.     JZ     MONIN
  1609.     LDA     VSEEFLG
  1610.     ORA     A
  1611.     JNZ     NOMONIN
  1612.     LDA     DATAFLG
  1613.     ORA     A
  1614.     JZ     NOMONIN
  1615. MONIN:    POP     PSW
  1616.     PUSH     PSW
  1617.     CALL     SHOW
  1618. NOMONIN: POP     PSW
  1619.     ORA     A
  1620.     RET
  1621.  
  1622. SEND:    PUSH     PSW
  1623.     LDA     SSEEFLG
  1624.     ORA     A
  1625.     JZ     MONOUT
  1626.     LDA     VSEEFLG
  1627.     ORA     A
  1628.     JNZ     NOMONOT
  1629.     LDA     DATAFLG
  1630.     ORA     A
  1631.     JZ     NOMONOT
  1632. MONOUT:    POP     PSW
  1633.     PUSH     PSW
  1634.     CALL     SHOW
  1635. NOMONOT: POP     PSW
  1636.     PUSH     PSW
  1637.     ADD     C
  1638.     MOV     C,A
  1639. SENDW:    CALL     IN$MODlsr
  1640.     CALL     ANI$MODSNDB
  1641.     CALL     CPI$MODSNDR
  1642.     JNZ     SENDW
  1643.     POP     PSW
  1644.     CALL     OUT$MODDATP
  1645.     RET
  1646.  
  1647. WAITNAK: LDA     VSEEFLG
  1648.     ORA     A
  1649.     JZ     WAITNPR
  1650.     LDA     QFLG
  1651.     ORA     A
  1652.     JZ     WAITNLP
  1653. WAITNPR: CALL     ILPRT
  1654.         DB     'AWAITING INITIAL NAK',CR,LF,0
  1655. WAITNLP: CALL     CKABORT
  1656.     MVI     B,1
  1657.     CALL     RECV
  1658.     CPI     NAK
  1659.     RZ
  1660.     CPI     CAN
  1661.     JZ     ABORT
  1662.     DCR     E
  1663.     JZ     ABORT
  1664.     JMP     WAITNLP
  1665.  
  1666. INITADR:
  1667.     LHLD     1
  1668.     LXI     D,3
  1669.     DAD     D
  1670.     SHLD     VSTAT+1
  1671.     DAD     D
  1672.     SHLD     VKEYIN+1
  1673.     DAD     D
  1674.     SHLD     VTYPE+1
  1675.     RET
  1676.  
  1677. PROCOPT:
  1678.     LXI     D,FCB+1
  1679.     LDAX     D
  1680.     STA     OPTION
  1681. OPTLP:    INX     D
  1682.     LDAX     D
  1683.     CPI     ' '
  1684.     JZ     ENDOPT
  1685.     LXI     H,OPTBL
  1686.     MVI     B,OPTBE-OPTBL
  1687. OPTCK:    CMP     M
  1688.     JNZ     OPTNO
  1689.     MVI     M,0
  1690.     JMP     OPTLP
  1691.  
  1692. OPTNO:    INX     H
  1693.     DCR     B
  1694.     JNZ     OPTCK
  1695.     JMP     BADOPT
  1696.  
  1697. ENDOPT:    LDA     VSEEFLG
  1698.     ORA     A
  1699.     RNZ
  1700.     STA     QFLG
  1701.     RET
  1702.  
  1703. DONE:    LDA     BATCHFLG
  1704.     ORA     A
  1705.     JNZ     DONETCC
  1706.     LDA     QFLG
  1707.     ORA     A
  1708.     JZ     NMSTRNS
  1709.     LXI     H,FCB+1            ;PUT FILE NAME IN..
  1710.     LXI     D,FTRNMSG        ;..SPACES IN MESSAGE..
  1711.     MVI     B,8            ;..BELOW.
  1712.     CALL     MOVE
  1713.     INX     D            ;PUT FILE TYPE AFTER..
  1714.     MVI     B,3            ;..SKIPPING ONE SPACE..
  1715.     CALL     MOVE            ;..BELOW.    
  1716.     CALL     ILPRT
  1717. FTRNMSG: DB '              TRANSFERRED',CR,LF,LF,0    ;13 SPACES
  1718.  
  1719. NMSTRNS: LDA     FCB        ;SAVE DRIVE NO.
  1720.     STA     DISKNO
  1721.     LXI     H,FCB        ;BLANK OUT FILE CONTROL BLOCKS
  1722.     CALL     INITFCBS
  1723.     LDA     DISKNO        ;PUT DRIVE NUMBER BACK
  1724.     STA     FCB
  1725.     LXI     H,RESTSN    ;RESTORE SECTORE NUMBERS..
  1726.     LXI     D,SECTNOB    ;..FOR NEW FILE TRANSFER.
  1727.     MVI     B,SECTNOE-SECTNOB  ;ROUTINE ALSO DONE IN MENU.
  1728.     CALL     MOVE
  1729.     LDA     SENDFLG        ;GOES TO EITHER SEND OR..
  1730.     ORA     A        ;..RECEIVE FILE, DEPENDING..
  1731.     JNZ     SENDFIL        ;..UPON WHICH ROUTINE SET..
  1732.     JMP     RCVFIL        ;..THE FLAG IN MULTI-FILE MODE.
  1733.  
  1734. DONETCC: MVI     A,TRUE        ;INDICATE NO FILES BEING..
  1735.     STA     FSTFLG        ;RESET MULTIFILE TRANS
  1736.     STA     NFILFLG        ;..USED IN TERMINAL ROUTINE.
  1737.     CMA
  1738.     STA     SAVEFLG        ;STOP MEMORY SAVE IN TERM ROUTINE.
  1739.     LDA     VSEEFLG
  1740.     ORA     A
  1741.     JZ     DONETC
  1742.     LDA     QFLG
  1743.     ORA     A
  1744.     JZ     donetce
  1745. DONETC:    CALL     ILPRT
  1746.         DB      CR,LF,'ALL TRANSFERS COMPLETED'
  1747.     DB     CR,LF,BELL,0
  1748.  
  1749. DONETCE: LDA     TERMFLG        ;SEE IF RETURN TO..
  1750.     ORA     A        ;..TERMINAL MODE..
  1751.     JNZ     MENU        ;..AFTER X'FER.
  1752.     CALL     CRLF
  1753.     JMP     TERM
  1754.  
  1755. INITMOD: LXI    H,180h        ;Default to 300 baud, H=01 (MS), L=80 (LS)
  1756.     JMP    I2661
  1757.  
  1758. INITM:    PUSH    B        ; what was in the B/C
  1759.     POP    H        ; .. is now in the H/L
  1760. I2661:    PUSH    B        ;
  1761.     PUSH    D        ;
  1762. ;
  1763. ;  Fixes selected (^B) baud rate in memory if different than default.    ** TA
  1764. ;                                    **  |
  1765.     SHLD    INITMOD+1    ; store baud for LXI H instruction
  1766. ;
  1767. ;    LS and MS bits of baud refer to 8250 type UART which are used
  1768. ;    here only as a referance point for program indexing. They are
  1769. ;     not a part of the code used to set up the 2661-2 EPCI.        **  |
  1770. ;                                    ** TA
  1771.     XCHG            ; swap D/E with H/L.. E = LS bits of baud
  1772.     LXI    H,TEPBD        ;BAUD RATE CONVERSATION TABLE
  1773.     XRA    A        ; zero A
  1774.     MOV    C,A        ; zero C
  1775.     MOV    A,E        ; move LS bits of baud to A
  1776. INIT1:    CMP    M        ; compare to table
  1777.     JZ    INIT2        ; found it in table
  1778.     INR    C        ; count number of trys (position in table 0-15)
  1779.     INX    H        ; get next address in table
  1780.     JMP    INIT1        ; go look at it
  1781.  
  1782. INIT2:    MOV    A,D        ; move MS bits of baud to A
  1783.     ANI    06H        ; is it less than 300 baud        ** TA
  1784.     JZ    INIT3        ; .. no
  1785.     MVI    A,MR1$2SB    ; .. yes, so 2 stop bits to A
  1786.     JMP    INIT4        ; 
  1787.  
  1788. INIT3:    MVI    A,MR1$1SB    ; add 40H (1 Stop Bit) to A
  1789. INIT4:    ADI    MR1$8BW+MR1$A1X    ; add 0CH (8 Bits) + 01H (Async 1X Clock) to A
  1790.     OUT    EP$BAS+EP$MR2    ; send to port 0EEH (Mode Register 2)
  1791.     MVI    A,30H        ; set the A to 30H
  1792.     ORA    C        ; combine the position in the table with A 
  1793. ;                ; 110/C=3, 300/C=6H, 1200/C=8H, 9600/C=DH
  1794.     OUT    EP$BAS+EP$MR2    ; send it to port 0EEH (Mode Register 2)
  1795.     MVI    A,CR$NML+CR$RTS+CR$RXEN+CR$DTR+CR$TXEN
  1796.     OUT    EP$BAS+EP$CR
  1797.     POP    D
  1798.     POP    B
  1799.     RET
  1800. ;
  1801. ;  EPBAUD -- BAUD RATE TABLE FOR 2661-2        "C"   *=not supported    ** TA
  1802. ;                                    **  |
  1803. TEPBD:    DB    0FFH        ;45.5        0    *
  1804.     DB    0FFH        ;50        1    *
  1805.     DB    0FFH        ;75        2    *
  1806.     DB    017H        ;110        3
  1807.     DB    0FFH        ;134.5        4    *
  1808.     DB    0FFH        ;150        5    *
  1809.     DB    080H        ;300        6
  1810.     DB    0C0H        ;600        7
  1811.     DB    060H        ;1200        8
  1812.     DB    0FFH        ;1800        9    *
  1813.     DB    0FFH        ;2000        10    *
  1814.     DB    030H        ;2400        11
  1815.     DB    018H        ;4800        12
  1816.     DB    00CH        ;9600        13
  1817.     DB    006H        ;19200        14            **  |
  1818.     DB    002H        ;38400        15            ** TA
  1819. ;
  1820. ;
  1821. delay:    lxi    b,10000
  1822. delay1:    dcx    b
  1823.     mov    a,b
  1824.     ora    c
  1825.     jnz    delay1
  1826.     ret
  1827.  
  1828. SETBAUD: CALL     GETBAUD        ;..ROUTINE RETURNS WITH CHANGE..
  1829.     call    initm        ;Go set the new rate
  1830.     ret
  1831.  
  1832. GETBAUD: LXI    b,180h        ;                    ** TA
  1833.     LDA     FCB+9        ;                    **  |
  1834.     CPI    '1'        ;110, 1200, 19200 baud
  1835.     JZ    ONEZY
  1836.     CPI    '3'        ;300, 38400 baud
  1837.     JZ    THREEZY
  1838.     CPI    '6'        ;600 baud
  1839.     LXI    b,0C0H
  1840.     RZ
  1841.     CPI    '2'        ;2400 baud
  1842.     LXI    B,030H
  1843.     RZ
  1844.     CPI    '4'        ;4800 baud
  1845.     LXI    B,018H
  1846.     RZ
  1847.     CPI    '9'        ;9600 baud
  1848.     LXI    B,00CH
  1849.     RZ
  1850.     JMP    OUTZY
  1851.  
  1852. ONEZY:    LDA    FCB+10
  1853.     CPI    '1'        ;110 baud
  1854.     LXI    B,417H
  1855.     RZ
  1856.     CPI    '2'        ;1200 baud
  1857.     LXI    B,060H
  1858.     RZ
  1859.     CPI    '9'        ;19200 baud
  1860.     LXI    B,006H
  1861.     RZ
  1862.     JMP    OUTZY
  1863.  
  1864. THREEZY: LDA    FCB+10 
  1865.     CPI    '0'        ;300 baud
  1866.     LXI    b,180H
  1867.     RZ
  1868.     CPI    '8'        ;38400 baud
  1869.     LXI    B,002H
  1870.     RZ
  1871. OUTZY:    CALL    ILPRT
  1872.     DB    CR,LF
  1873.     DB    '++ INVALID BAUD RATE ++   Baud Rate defaults to 300'
  1874.     DB    CR,LF,LF,BELL,0
  1875.     LXI    B,180H        ; default is 300 baud            **  |
  1876.     RET            ;                    ** TA
  1877. ;
  1878. ;BADRATE: CALL     ERXIT                            ** ??
  1879. ;    DB     '++ INVALID BAUD RATE ++$'                ** ??
  1880. ;
  1881. MOVEFCB: LXI     H,FCB+16
  1882.     LXI     D,FCB
  1883.     MVI     B,16
  1884.     CALL     MOVE
  1885.     XRA     A
  1886.     STA     FCBSNO
  1887.     STA     FCBEXT
  1888.     RET
  1889.  
  1890. SHOW:    CPI     LF
  1891.     JZ     CTYPE
  1892.     CPI     CR
  1893.     JZ     CTYPE
  1894.     CPI     9
  1895.     JZ     CTYPE
  1896.     CPI     ' '
  1897.     JC     SHOWHEX
  1898.     CPI     7FH
  1899.     JC     CTYPE
  1900. SHOWHEX: PUSH     PSW
  1901.     MVI     A,'('
  1902.     CALL     CTYPE
  1903.     POP     PSW
  1904.     CALL     HEXO
  1905.     MVI     A,')'
  1906.     JMP     CTYPE
  1907.  
  1908. CTYPE:    PUSH     B
  1909.     PUSH     D
  1910.     PUSH     H
  1911.     MOV     E,A
  1912.     MVI     C,WRCON
  1913.     CALL     BDOS
  1914.     POP     H
  1915.     POP     D
  1916.     POP     B
  1917.     RET
  1918.  
  1919. CRLF:    PUSH     PSW
  1920.     MVI     A,CR
  1921.     CALL     TYPE
  1922.     MVI     A,LF
  1923.     CALL     TYPE
  1924.     POP     PSW
  1925.     RET
  1926.  
  1927. TYPE:    PUSH     PSW
  1928.     PUSH     B
  1929.     PUSH     D
  1930.     PUSH     H
  1931.     MOV     C,A
  1932. VTYPE:    CALL     $-$
  1933.     POP     H
  1934.     POP     D
  1935.     POP     B
  1936.     POP     PSW
  1937.     RET
  1938.  
  1939. STAT:    PUSH     B
  1940.     PUSH     D
  1941.     PUSH     H
  1942. VSTAT:    CALL     $-$
  1943.     POP     H
  1944.     POP     D
  1945.     POP     B
  1946.     ORA     A
  1947.     RET
  1948.  
  1949. KEYIN:    PUSH     B
  1950.     PUSH     D
  1951.     PUSH     H
  1952. VKEYIN:    CALL     $-$
  1953.     POP     H
  1954.     POP     D
  1955.     POP     B
  1956.     RET
  1957.  
  1958. UCASE:    CPI     61H        ;CHANGES LOWER CASE CHARACTER..
  1959.     RC            ;..IN A-REG TO UPPER CASE.
  1960.     CPI     7BH
  1961.     RNC
  1962.     ANI     5FH
  1963.     RET
  1964.  
  1965. HEXO:    PUSH     PSW
  1966.     RAR
  1967.     RAR
  1968.     RAR
  1969.     RAR
  1970.     CALL     NIBBL
  1971.     POP     PSW
  1972. NIBBL:    ANI     0FH
  1973.     CPI     10
  1974.     JC     ISNUM
  1975.     ADI     7
  1976. ISNUM:    ADI     '0'
  1977.     JMP     TYPE
  1978.  
  1979. ;RETURNS W/ ZERO SET IF RETRY ASKED. IF MULTI-FILE MODE, THEN
  1980. ;NO QUESTIONS ASKED, JUST QUIT
  1981.  
  1982. CKQUIT:    LDA     BATCHFLG
  1983.     ORA     A
  1984.     JNZ     CKQTASK        ;ASK FOR RETRY
  1985.     INR     A        ;RESET ZERO FLG
  1986.     RET
  1987.  
  1988. CKQTASK: XRA     A
  1989.     STA     ERRCT
  1990.     CALL     ILPRT
  1991.         DB     'MULTIPLE ERRORS ENCOUNTERED.',CR,LF
  1992.         DB     'TYPE Q TO QUIT, R TO RETRY:  ',BELL,0
  1993.     CALL     KEYIN
  1994.     PUSH     PSW
  1995.     CALL     CRLF
  1996.     POP     PSW
  1997.     CALL     UCASE        ;INSTEAD OF "ANI 5FH"
  1998.     CPI     'R'
  1999.     RZ
  2000.     CPI     'Q'
  2001.     JNZ     CKQUIT
  2002.     ORA     A
  2003.     RET
  2004.  
  2005. ILPRT:    XTHL
  2006. ILPLP:    MOV     A,M
  2007.     ORA     A
  2008.     JZ     ILPRET
  2009.     CALL     CTYPE
  2010.     INX     H
  2011.     JMP     ILPLP
  2012.  
  2013. ILPRET:    XTHL
  2014.     RET
  2015.  
  2016. PRTMSG:    MVI     C,PRINT
  2017.     JMP     BDOS
  2018.  
  2019. ERXIT:    POP     D
  2020.     CALL     PRTMSG
  2021.     CALL     ILPRT
  2022.     DB     BELL,0
  2023.     LDA     BATCHFLG
  2024.     ORA     A
  2025.     JNZ     DONETCE
  2026.     MVI     A,'Q'        ;RESET QFLG
  2027.     STA     QFLG
  2028.     JMP     ABORT        ;ABORT OTHER COMPUTER
  2029.  
  2030. EXIT:    LXI     D,80H
  2031.     MVI     C,STDMA
  2032.     CALL     BDOS
  2033.     JMP     0
  2034.  
  2035. MOVE128: MVI     B,128
  2036. MOVE:    MOV     A,M
  2037.     STAX     D
  2038.     INX     H
  2039.     INX     D
  2040.     DCR     B
  2041.     JNZ     MOVE
  2042.     RET
  2043.  
  2044. ;INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH
  2045.  
  2046. SETFCB:    LXI     D,CMDBUF
  2047.     LXI     H,FCB
  2048.     CALL     CPMLINE
  2049.     CALL     PROCOPT
  2050.  
  2051. CHECKNM: LDA     FCB+1        ;CHECK ON THE PRIMARY OPTION
  2052.     CPI     'E'        ;RETURN IF ECHO OPTION
  2053.     RZ
  2054.     CPI     'M'        ;RETURN TO MENU
  2055.     RZ
  2056.     MOV     B,A
  2057.     LDA     PMMIBYTE
  2058.     ORA     A
  2059.     MOV     A,B
  2060.     JZ     S4
  2061.     CPI     'C'
  2062.     RZ
  2063. S4:    CPI     'T'
  2064.     JZ     TERMSEL
  2065.     CPI     'S'
  2066.     JZ     CKFILE
  2067.     CPI     'R'
  2068.     JNZ     BDOPT
  2069.     LDA     BATCHFLG    ;IF MULT FILE MODE, THEN..
  2070.     ORA     A        ;..RECV OPT DOES NOT NEED..
  2071.     RZ            ;..NAME.
  2072.     JMP     CKFILE
  2073.  
  2074. BDOPT:    CALL     ILPRT
  2075.     DB     CR,LF,'++ Bad Option ++',CR,LF,BELL,0
  2076.     JMP     REENT
  2077.  
  2078. CKFILE:    LDA     FCB+17        ;IF OPTION THAT NEEDS FILE NAME,..
  2079.     CPI     ' '        ;..THEN CHECK TO SEE IF NAME..
  2080.     RNZ            ;..EXISTS. IF NOT..
  2081. REENT:    CALL     ILPRT        ;..DO EVERYTHING OVER.
  2082.         DB     CR,LF,'Re-enter PRIMARY option and file name only: ',BELL,0
  2083.     LXI     D,CMDBUF
  2084.     CALL     INBUFF
  2085.     JMP     SETFCB
  2086.  
  2087. TERMSEL: LDA     FCB+17
  2088.     CPI     ' '
  2089.     JNZ     SAVAGN
  2090.     MVI     A,FALSE
  2091.     STA     SAVEFLG
  2092.     MVI     A,TRUE
  2093.     STA     NFILFLG
  2094.     CMA
  2095. ;    OUT     FRONTPAN                        ** ??
  2096.     RET
  2097.  
  2098. SAVAGN:    MVI     A,FALSE
  2099.     STA     NFILFLG
  2100.     RET
  2101.  
  2102. NEWBAUD: CALL     ILPRT        ;                (4) ** TA
  2103.     DB    CR,LF,LF
  2104.     DB    'Valid baudrates are: 110, 300, 600, 1200, '
  2105.     DB    '2400, 4800, 9600, 19200 and 38400.'
  2106.     DB    CR,LF
  2107.     DB     'Enter New Baudrate: ',0
  2108.  
  2109.     LXI     H,FCB+9        ;
  2110.     MVI     M,0        ;PUTS A ZERO IN FIRST POSITION SO AS TO
  2111. LOOP5:    call    stat
  2112.     jz    loop5
  2113.     CALL     KEYIN        ;FORCE THE DEFAULT OPTION OF 300 BAUD.
  2114.     CPI     CR        ;CARRIAGE RET ENTERS BAUD RATE
  2115.     JNZ     CONNEWB        ;GOES TO THE ESTABLISHED ROUTINE - RETURN TO MAIN
  2116.     CALL     CRLF        ;PROGRAM IS DONE THERE.
  2117.     JMP     SETBAUD
  2118.  
  2119. CONNEWB: CPI     30H        ;MAKE SURE IT'S..
  2120.     JC     LOOP5        ;..A DIGIT, ELSE..
  2121.     CPI     3AH        ;..DON'T ACCEPT IT.
  2122.     JNC     LOOP5
  2123.     MOV     M,A
  2124.     MOV     C,A
  2125.     CALL     TYPE        ;ECHO THE CHARACTER ENTERED
  2126.     INX     H
  2127.     JMP     LOOP5
  2128.  
  2129. MENU:    LXI     H,RESTSN    ;RESTORE SECTORE NUMBERS..
  2130.     LXI     D,SECTNOB    ;..FOR NEW FILE TRANSFER.
  2131.     MVI     B,SECTNOE-SECTNOB
  2132.     CALL     MOVE
  2133.     LXI     H,RESTROPT    ;RESTORE OPTION TABLE
  2134.     LXI     D,OPTBL
  2135.     MVI     B,OPTBE-OPTBL
  2136.     CALL     MOVE
  2137.     MVI     A,0
  2138.     STA     MFFLG1        ;RESET MFACCESS ROUTINE..
  2139.     CMA            ;..AND MULTI TRANS IN CASE..
  2140.     STA     FSTFLG        ;..OF ABORT.
  2141.  
  2142. MENU1:    LDA     XPRFLG        ;TEST IF MENU SHOULD BE SHOWN
  2143.     ORA     A
  2144.     JNZ     XPRT
  2145.     CALL     ILPRT
  2146.     DB     CR,LF,LF
  2147.     DB     'XPR  - Toggle expert mode (Menu on/off)',CR,LF
  2148.     DB     'DIR  - List directory (may specify drive)',CR,LF
  2149.     DB     'CPM  - Exit to CP/M',CR,LF,LF
  2150.     DB    '------------------- FILE TRANSFER MODE -------------------',CR,LF
  2151.     DB     'S    - Send CP/M file using protocol.           ^X cancels',CR,LF
  2152.     DB     'R    - Receive CP/M file using protocol.',CR,LF,LF
  2153.     DB    '--------------- TERMINAL CONVERSATION MODE ---------------',CR,LF
  2154.     DB     'WRT  - Write save file to disk and close it.',CR,LF
  2155.     DB     'DEL  - Erase save file and abort save.',CR,LF
  2156.     DB    'RET  - Return to terminal mode.',cr,lf
  2157.     DB     'T    - No echo Conversation mode (optional save file name)',CR,LF
  2158.     DB     'E    - Echo Conversation mode (optional save file name)',CR,LF
  2159.     DB    '       ^Y toggle save to file (":" indicates on)',CR,LF
  2160.     DB    '       ^B change baud rate       ^T transfer file',CR,LF
  2161.     DB    '       ^E return to menu         ^X cancel transfer',0
  2162. ;
  2163. XPRT:    CALL     ILPRT
  2164.     DB     CR,LF,LF,'DEFAULT DRIVE: ',0
  2165.     MVI     C,25        ;CURRENT DISK FUNCTION
  2166.     CALL     BDOS
  2167.     ADI     41H        ;MAKE ASCII
  2168.     CALL     TYPE
  2169.     CALL     ILPRT
  2170.     DB     CR,LF,LF,'Command: '
  2171.     DB     0
  2172.  
  2173. GETCMD:    LXI     D,CMDBUF    ;ENTER COMMAND
  2174.     CALL     INBUFF
  2175.     CALL     CRLF
  2176.     LXI     D,CMDBUF+2    ;POINT TO COMMAND
  2177.     CALL     ILCOMP
  2178.     DB     'CPM',0
  2179.     JNC     EXIT
  2180.     CALL     ILCOMP
  2181.     DB     'DIR',0
  2182.     JNC     DIR
  2183.     CALL     ILCOMP
  2184.     DB     'RET',0
  2185.     JC     NXTOPT1        ;CARRY SET = NO MATCH
  2186.     LHLD     HLSAVE        ;RETURN TO TERMINAL..
  2187.     JMP     TERM        ;..MODE WITH SAVE OPTION..
  2188.                 ;..IF PREVIOUSLY ENABLED.
  2189. NXTOPT1:
  2190.     CALL     ILCOMP
  2191.     DB     'WRT',0
  2192.     JNC     WRTFIL
  2193.     CALL     ILCOMP
  2194.     DB     'XPR',0
  2195.     JNC     XPRMODE
  2196.     CALL     ILCOMP
  2197.     DB     'DEL',0
  2198.     JNC     NEWFILE
  2199.     LDA     PMMIBYTE
  2200.     ORA     A
  2201.     JZ     NXTOPT2
  2202.     CALL     ILCOMP
  2203.     DB     'CAL',0
  2204.     JC     NXTOPT2
  2205.     MVI     A,1        ;FORCE 1 IN CHAR COUNT OF..
  2206.     STA     CMDBUF+1    ;..CMDBUF SO THAT IT ONLY..
  2207.     JMP     DOOPT        ;..LOOKS AT 'C' FOR DIAL
  2208.  
  2209. NXTOPT2: PUSH     H
  2210.     LDA     CMDBUF+2
  2211.     LXI     H,COMPLIST
  2212.     CALL     COMPARE        ;COMPARES LIST POINTED TO BY HL..
  2213.     POP     H        ;..TO CHAR IN A-REG.
  2214.     JC     MENU1        ;CARRY SET = NO MATCH
  2215.  
  2216. DOOPT:    PUSH     H        ;LOAD ORIGINAL FCB WITH TRANSFER..
  2217.     CALL     SETFCB        ;..CMDS AND GO TO BEGINNING OF..
  2218.     POP     H        ;..PROGRAM. WILL FOLLOW SAME LOGIC..
  2219.     JMP     RESTART        ;..AS IF PROGRAM WERE CALLED WITH..
  2220.                 ;..CP/M COMMAND LINE.
  2221.  
  2222. DIR:    CALL     DIRLST
  2223.     JMP     XPRT
  2224.  
  2225. NEWFILE: LDA     FCB3+1
  2226.     CPI     ' '
  2227.     JZ     MENU1        ;IF NO FILE, DON'T ERASE
  2228.     LXI     D,FCB3
  2229.     MVI     C,ERASE
  2230.     CALL     BDOSRT
  2231.     MVI     A,TRUE        ;DO NOT ALLOW TERMINAL..
  2232.     STA     NFILFLG        ;..SAVE SINCE NO FILE..
  2233.     CMA            ;..SPECIFIED.
  2234.     STA     SAVEFLG
  2235.     LXI     H,FCB3
  2236.     CALL     INITFCBS
  2237.     JMP     MENU1
  2238.  
  2239. WRTFIL:    LDA     NFILFLG
  2240.     CPI     TRUE
  2241.     JZ     MENU1
  2242.     LDA     FCB3+1        ;CHECK THAT FILE WAS REQUESTED
  2243.     CPI     ' '
  2244.     JZ     MENU1
  2245.     LHLD     HLSAVE
  2246.     CALL     NUMRECS        ;DISK WRITE ROUTINE AS USED IN..
  2247.     CALL     WRTDSK        ;..IN THE INTDSKSV ROUTINE.
  2248.     CALL     CLOSE3
  2249.     MVI     A,TRUE
  2250.     STA     NFILFLG
  2251.     CMA
  2252.     STA     SAVEFLG
  2253.     LXI     H,FCB3
  2254.     CALL     INITFCBS    ;BLANK OUT FCB SO WRITTEN FILE..
  2255.     JMP     MENU1    ;..CAN'T BE ERASED.
  2256.  
  2257. XPRMODE: LDA     XPRFLG
  2258.     CMA
  2259.     STA     XPRFLG
  2260.     JMP     MENU1
  2261.  
  2262. COMPARE: MOV     B,M        ;COMPARES A-REG WITH LIST..
  2263. COMPLP:    INX     H        ;..ADDRESSED BY HL. FIRST ELEMENT..
  2264.     CMP     M        ;..OF LIST MUST BE NUMBER OF ELEMENTS..
  2265.     JZ     VALID        ;..BEING COMPARED. RETURNS WITH..
  2266.     DCR     B        ;..CARRY SET IF A-REG DOES NOT..
  2267.     JNZ     COMPLP        ;.. CONTAIN AN ELEMENT IN LIST.
  2268.     STC
  2269. VALID:    RET
  2270.  
  2271. COMPLIST: DB     4, 'S', 'R', 'T', 'E'
  2272.  
  2273. ILCOMP:    INLNCOMP        ;A MACRO IN MACROS.LIB
  2274.  
  2275.  
  2276. INBUFF:    INBUF            ;A MACRO IN "MACROS.LIB"
  2277.  
  2278. ;IF ABOVE ROUTINE DOES NOT LET YOU EDIT IN A PROPER MANNER,
  2279. ;THEN THE MACRO MAY BE SUBSTITUTED FOR THE FOLLOWING ROUTINE:
  2280.  
  2281. ;INBUFF    MVI C,RDBUF
  2282. ;    CALL BDOSRT
  2283. ;    RET            ;BUT BE CAREFUL OF CONTROL-C
  2284.  
  2285.  
  2286. CPMLINE: CMDLINE        ;A MACRO IN "MACROS.LIB"
  2287.  
  2288. DIRLST:    DIRLIST            ;A MACRO IN "MACROS.LIB"
  2289.  
  2290. NFILFLG: DB     FALSE        ;NORMALLY SET TO FALSE. ALLOWS WRITE TO..
  2291.                 ;..MEMORY IN TERMINAL MODE.
  2292.  
  2293. OPTION:    DB     0
  2294.  
  2295. OPTBL    EQU     $
  2296. ANSWFLG: DB     'A'
  2297. DISCFLG: DB     'D'
  2298. ORIGFLG: DB     'O'
  2299. QFLG:    DB     'Q'
  2300. RSEEFLG: DB     'R'
  2301. SSEEFLG: DB     'S'
  2302. VSEEFLG: DB     'V'
  2303. TERMFLG: DB     'T'
  2304. BATCHFLG: DS     1    ;SET TO 'B' BY MENU. DOES NOT ALLOW MULTI-..
  2305. OPTBE    EQU     $    ;..FILE XFER WHEN PROGRAM INITIALLY CALLED.
  2306.  
  2307. RESTROPT:        ;MUST BE IN SAME ORDER AS TABLE ABOVE
  2308.  
  2309.     DB     'A','D','O','Q','R','S','V','T','B'
  2310.  
  2311. RESTSN:    DB     0,0,0,0
  2312.     DW     DBUF
  2313.     DB     0
  2314.     DB     0
  2315.  
  2316. SECTNOB EQU     $
  2317. RCVSNO:    DB     0
  2318. SECTNO:    DB     0
  2319. ERRCT:    DB     0
  2320. EOFLG:    DB     0
  2321. SECPTR:    DW     DBUF
  2322. SECINBF: DB     0
  2323. DATAFLG: DB     0
  2324. SECTNOE    EQU     $
  2325.  
  2326. BADOPT:    CALL     ILPRT
  2327.     DB     'INVALID OPTION',CR,LF,BELL,0
  2328.     JMP     MENU
  2329.  
  2330. FSTFLG:    DB     TRUE
  2331.  
  2332. CMDBUF:    DB     80H,0
  2333.     DS     80H
  2334. ;BADLIB:    DB    CR,LF,'++ BAD LIBRARY NUMBER CALLED ++',CR,LF,BELL,'$' ** ??
  2335. HLSAVE:    DS     2
  2336. DISKNO:    DS     1
  2337. SENDFLG: DS     1
  2338. NBSAVE:    DS     2
  2339. BGNMS:    DS     2
  2340. FILECT:    DS     1
  2341. NAMECT:    DS     1
  2342.  
  2343.     DS     40
  2344. STACK:    DS     2
  2345. FCB3:    DS     33
  2346. FCBBUF:    DS     15
  2347. DBUF:    DS     16*128        ;16 SECTOR DISK BUFFER
  2348. NAMEBUF: DS     1        ;BUFFER FOR NAMES IN BATCH MODE. OVERFLOWS..
  2349.                 ;..ABOVE PROGRAM CODE.
  2350. ;    BDOS EQUATES
  2351.  
  2352. RDCON    EQU     1
  2353. WRCON    EQU     2
  2354. PRINT    EQU     9
  2355. RDBUF    EQU     10
  2356. CONST    EQU     11
  2357. OPEN    EQU     15
  2358. CLOSE    EQU     16
  2359. SRCHF    EQU     17
  2360. SRCHN    EQU     18
  2361. ERASE    EQU     19
  2362. READ    EQU     20
  2363. WRITE    EQU     21
  2364. MAKE    EQU     22
  2365. REN    EQU     23
  2366. STDMA    EQU     26
  2367. BDOS    EQU     5
  2368. REIPL    EQU     0
  2369. FCB    EQU     5CH
  2370. FCBEXT    EQU     FCB+12
  2371. FCBSNO    EQU     FCB+32
  2372. FCBRNO    EQU     FCB+32
  2373. FCB2    EQU     6CH
  2374.  
  2375. LAST    END     100H
  2376.