home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug079.ark / SMODEM37.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  84.7 KB  |  3,965 lines

  1. ; If you have SMODEM36.MAC, save some time and use SSED to update.
  2. ;
  3. ; SOURCE FILE:    SMODEM36.MAC
  4. ; NEW FILE:    SMODEM37.ASM
  5. ;
  6. ; to convert SMODEM36.MAC to SMODEM37.ASM for assembly with
  7. ; the Digital Research MAC macro assembler, use SSED and the
  8. ; following command format:
  9. ;
  10. ;    SSED SMODEM36.MAC <SMODEM37.DIF >SMODEM37.ASM
  11. ;
  12. ; then assemble with MAC using the standard command format:
  13. ;
  14. ;    MAC SMODEM37 $PZSZ
  15. ;
  16. ; note: $PZSZ is optional to supress creation of .PRN and .SYM files.
  17. ; use optional disk id (A: etc.) as needed.
  18.  
  19. ; If you prefer to use Microsoft's M80 to assemble programs, you
  20. ; must comment-out the "ORG 100H" and de-comment the ".8080" command.
  21. ; Also, you must find the macros containing "IF NOT NUL" and change
  22. ; them as indicated in the comments in order for M80 to use them.
  23.  
  24. ; These changes by Jim Mills of CACHE.
  25.  
  26. ;.COMMENT \
  27. ;               *** SMODEM3 ***
  28.  
  29. ;          CP/M SMARTMODEM PROGRAMME
  30. ;          =========================
  31. ;         Version 3.6 by Walter Blady
  32.  
  33. ; 02/13/82: Fixed program to allow "A" and "O" options to be
  34. ; specified by user.  Previously, you had to use direct cmnds
  35. ; to SMARTMODEM or use the dialer routine to connect!
  36. ; Jim Mills, CACHE.
  37.  
  38. ;THIS PROGRAMME WAS ORIGINALLY MODEM7.MAC WRITTEN BY 
  39. ;WARD CHRISTENSEN AND REVISED BY M.ZEIGER AND J.MILLS FOR THE 
  40. ;PMMI MODEM BOARD.  FULL CREDITS FOR EXPERIENCE AND TALENT THAT
  41. ;MADE THIS PROGRAMME POSSIBLE, BELONG SOLELY TO THESE PEOPLE.
  42.  
  43. ;MANY ADDITIONAL ROUTINES INCLUDED ARE COPYRIGHTED (1980) BY
  44. ;MARK M.ZEIGER AND J.MILLS.  PERMISSION IS GRANTED TO USE
  45. ;BUT NOT SELL THESE ROUTINES.
  46.  
  47. ;THIS VERSION WAS PREPARED BY WALTER BLADY FOR USE WITH THE
  48. ;HAYES SMARTMODEM USING RS232 I/O ON THE DISC JOCKEY 
  49. ;CONTROLLER BOARD.  AN EXTENDED AND MORE FLEXIBLE AUTO-DIAL
  50. ;FEATURE WAS ADDED.  THE USER NOW HAS THE ABILITY TO KEEP
  51. ;SEVERAL TELEPHONE DIRECTORIES ON THE DISK AND THESE MAY BE
  52. ;EDITED WHEN NEW INFORMATION MUST BE ADDED.
  53.  
  54. ;THE ORIGIONAL SOURCE CODE WAS PREPARED FOR THE MAC ASSEMBLER.
  55. ;THIS VERSION HAS BEEN ADAPTED FOR COMPILATION WITH 
  56. ;MICROSOFT'S M80 ASSEMBLER.
  57.  
  58. ;FOR FULL INFORMATION ON THE USE OF 'SMODEM3', PLEASE REFER TO
  59. ;THE FILE 'SMODEM3.DQC'.
  60.  
  61. ;TO ASSEMBLE THIS PROGRAMME AND CREATE A CP/M 'COM' FILE, USE 
  62. ;THE FOLLOWING COMMANDS:
  63.  
  64. ;    M80 =SMODEM3
  65. ;    L80 /P:100,SMODEM3,SMODEM3/N/E
  66.  
  67. ;                           *****
  68. ;\
  69.  
  70. ;.8080    ;ASSEMBLE USING 8080 CODE RECOGNITION
  71.  
  72. TRUE    EQU 0FFH
  73. FALSE   EQU 0
  74.  
  75. CPM2    EQU TRUE    ;TRUE=CP/M 2+...FALSE=CP/M 1+
  76.  
  77. DBFSIZ    EQU 16        ;DISK BUFFER SIZE IN 128 BYTE SECTORS
  78.             ;CHANGE THIS TO 8 FOR A 32K SYSTEM
  79.  
  80. BOTRAM  EQU 2C00H    ;BOTTOM +  OF SMODEM3
  81.  
  82. ERRLIM  EQU 10        ;NUMBER OF TIMES TO RETRY
  83.                         ;SEND/RECEIVE ERRORS BEFORE QUIT
  84.  
  85. DJBRD    EQU    false    ;TRUE=DISK-JOCKEY CONTROLER RS232 I/O
  86.  
  87. PORTIO    EQU    true     ;TRUE=RS232 I/O OTHER THAN DISK-JOCKEY
  88.  
  89. INLZE    EQU    FALSE    ;TRUE=RS232 I/O PORT INITIALIZATION
  90.             ;IS NEEDED
  91.  
  92. CHEK    EQU    FALSE    ;TRUE=OVERRUN,FRAMING AND PARITY
  93.             ;CHECKS NEEDED...ONLY SET TO TRUE IF
  94.             ;PORTIO=TRUE.
  95.  
  96. PRINTR    EQU 'P'-40H    ; ^P = LIST DEVICE TOGGLE
  97. ECOTOG    EQU 'E'-40H    ; ^E = TERM/ECHO TOGGLE
  98. OFFLIN  EQU 'O'-40H     ; ^O = OFFLINE WITHOUT DISCONNECT
  99. DISCCHR EQU 'D'-40H     ; ^D = DISCONNECT
  100. TRANCHR EQU 'T'-40H     ; ^T = TRANSFER CHARACTER
  101. CAN     EQU 'X'-40H     ; ^X = CANCEL SEND/RECEIVE
  102. EOFCHAR EQU 'Z'-40H     ; ^Z = END OF FILE
  103. SAVECHR EQU 'R'-40H     ; ^Y = RECEIVE CHARACTER
  104. XOFF    EQU 'S'-40H     ; ^S = XOFF CHARACTER
  105. XON     EQU 'Q'-40H     ; ^Q = XON CHARACTER
  106. CRC    EQU 'C'        ; CRC CHECK INSTEAD OF CHECKSUM
  107. SOH     EQU 1           ; START OF HEADER
  108. EOT     EQU 4           ; END OF TEXT
  109. ACK     EQU 6           ; ACKNOWLEDGE
  110. NAK     EQU 15H         ; NOT ACKNOWLEDGE
  111. BDNMCH  EQU 75H         ; BAD NAME MATCH
  112. OKNMCH  EQU ACK         ; OKAY NAME MATCH
  113. LF      EQU 0AH         ; LINEFEED
  114. CR      EQU 0DH         ; CARRIAGE RETURN
  115. FF    EQU 0CH        ; FORM FEEDE
  116. BELL    EQU 7           ; BELL CHARACTER
  117. YES    EQU 59H        ;
  118. NO    EQU 4EH        ;
  119.  
  120.     org    100h
  121.         JMP     START    ;BEGINNING OF PROGRAMME
  122.  
  123. ;.COMMENT \
  124. ;'STYLE' DEFINES THE DIALING COMMAND THAT WILL BE SENT
  125. ;TO THE HAYES SMARTMODEM WHEN USING THE AUTO DIALING OPTION.
  126. ;'AT'= ATTENTION...'D'= DIAL.
  127. ;AND THE '$'= END OF COMMAND LINE (MUST BE IN PLACE).
  128. ;COMMANDS TO HAYES MAY ALSO BE ENTERED DIRECTLY IN TERMINAL OR
  129. ;ECHO MODES.  4 EXTRA BYTES ARE ALLOTED FOR LONGER COMMANDS.
  130. ;\
  131.  
  132. STYLE:  DB 'ATD $'    ;MODEM DIALING COMMAND...ENTER A 'P'
  133.     DS 4        ;OR 'T' FOR PULSE OR TOUCH AFTER THE
  134.             ;'ATD' IF DESIRED.
  135.  
  136.  
  137. ;.COMMENT \
  138. ;'OFFHK'DEFINES THE ESCAPE AND HANG-UP CODE SENT TO THE
  139. ;SMARTMODEM.  '+++'= THE HAYES DEFAULT ESCAPE CODE TO
  140. ;RE-ENTER THE COMMAND STATE, AND 'ATH'= THE HANG-UP COMMND.
  141. ;THE '$'= END COMMAND LINE (MUST BE IN PLACE). 
  142. ;\
  143.  
  144. OFFHK:  DB '+++$ATH',CR,'$'    ;MODEM ESCAPE AND 
  145.     DS 4            ;HANG-UP CODE
  146.   
  147. FASCLK:    DB     true     ;2 MZ OPERATION = FALSE...4 MZ = TRUE
  148. BKBYTE: DB     TRUE    ;TRUE = MAKE .BAK FILE
  149. XPRFLG: DB     FALSE   ;FALSE = PRINT MENU ON INITIALIZATION
  150. LSTFLG: DB 0        ;LIST DEVICE FLAG
  151. MACFLG: DB 0        ;SEND/RECEIVE OBJECT CODE FLAG
  152.  
  153.  
  154. ;PRESENTLY SET FOR DJ BOARD I/O
  155.  
  156.     IF    DJBRD        ;IF DISKJOCKEY BOARD
  157. MODATP     EQU 0D3F8H              ;MODEM DATA PORT
  158. MOCTLP     EQU 0D3F9H              ;MODEM CONTROL PORT
  159. MOSNDB     EQU 8                   ;MODEM SEND BIT 
  160. MOSNDR     EQU 0                   ;MODEM SEND READY
  161. MORCVB     EQU 4                   ;MODEM RECEIVE BIT 
  162. MORCVR     EQU 0                   ;MODEM RECEIVE READY
  163.  
  164. ;I/O ROUTINES FOR DJ BOARD SERIAL PORT
  165.  
  166. INCTLP: LDA    MOCTLP     ;in modem control port
  167.     RET
  168.  
  169. OTDATP: CMA        ;out modem data port
  170.     STA    MODATP
  171.     CMA
  172.     RET
  173.  
  174. ANSNDB: ANI     MOSNDB     ;bit to test/send ready
  175.     RET
  176.  
  177. CPSNDR:    CPI     MOSNDR     ;value send bit/ready
  178.     RET
  179.  
  180. INDATP: LDA    MODATP     ;in modem data port
  181.     CMA
  182.     RET
  183.  
  184. ANRCVB: ANI     MORCVB     ;bit test receive ready
  185.     RET
  186.  
  187. CPRCVR: CPI     MORCVR     ;value receive ready
  188.     RET
  189.  
  190. OTCTLP: LDA    MOCTLP     ;modem output control port
  191.     RET
  192.     ENDIF    ;DJBOARD
  193.  
  194. ;.COMMENT \
  195. ;SET THESE THE FOLLOWING EQUATES TO MATCH YOUR SERIAL 
  196. ;I/O ASSIGNMENTS, AND DELETE THE ONES NOT USED.
  197. ;\
  198.  
  199.     IF    PORTIO    ;IF OTHER THAN DJBOARD
  200. PORT    EQU    006H        ;BASE ADDRESS            5
  201.  
  202. MOCTLP    EQU    PORT        ;MODEM CONTROL PORT
  203. MOSNDB    EQU    2        ;MODEM SEND READY BIT        1
  204. MOSNDR    EQU    2        ;VALUE WHEN MODEM SEND READY    1
  205. MORCVB    EQU    1        ;MODEM RECEIVE READY BIT    2
  206. MORCVR    EQU    1        ;VALUE WHEN MODEM RECEIVE READY    2
  207. MODATP    EQU    PORT+1        ;MODEM DATA PORT        -1
  208. ;BAUDRP    EQU    PORT+?        ;BAUD RATE PORT
  209. ;MOCTL2    EQU    PORT+?        ;2ND MODEM CONTROL PORT
  210.  
  211.     IF    CHEK
  212. FRMER    EQU    00H        ;FRAMING ERROR MASK
  213. ORUNER    EQU    00H        ;OVERRUN ERROR MASK
  214. PARER    EQU    00H        ;PARITY ERROR MASK
  215. ERRMSK  EQU    00H        ;MASK TO BLOCK ALL BITS EXCEPT
  216.     ENDIF    ;CHEK
  217.  
  218. ;I/O ROUTINES FOR SERIAL PORTS OTHER THAN DJ BOARD
  219.  
  220. INCTLP: IN    MOCTLP     ;in modem control port
  221.     RET
  222.  
  223. OTDATP: OUT    MODATP    ;out modem data port
  224.     RET
  225.  
  226. ANSNDB: ANI     MOSNDB     ;bit to test/send ready
  227.     RET
  228.  
  229. CPSNDR:    CPI     MOSNDR     ;value send bit/ready
  230.     RET
  231.  
  232. INDATP: IN    MODATP     ;in modem data port
  233.     RET
  234.  
  235. ANRCVB: ANI     MORCVB     ;bit test receive ready
  236.     RET
  237.  
  238. CPRCVR: CPI     MORCVR     ;value receive ready
  239.     RET
  240.  
  241. OTCTLP: IN    MOCTLP     ;modem output control port
  242.     RET
  243.     ENDIF    ;PORTIO
  244.  
  245. ;IF YOUR SERIAL PORTS MUST BE INITIALIZED SET THESE EQUATES
  246.  
  247.     IF    INLZE    
  248.     INITC1    EQU    00H
  249.     INITC2    EQU    00H
  250.     ENDIF    ;INLZE
  251.  
  252.  
  253. START:  LXI     H,0
  254.         DAD     SP          ;GET CP/M'S STACK
  255.         SHLD     STACK       ;SAVE IT
  256.         LXI     SP,STACK    ;START LOCAL STACK
  257.     MVI     A,' '
  258.     STA     FCB3+1
  259.  
  260.         CALL     START1
  261.  
  262. START1:    CALL     INITDR    ;INITIALIZE ADDRESSES
  263.         MVI     A,TRUE      ; 0FFH
  264.         STA     NFLFLG
  265.         CMA             ; 0
  266.         STA     SAVFLG
  267.  
  268.         CALL     PROCOPT    ;PROCESS CONTROL OPTIONS
  269.         LDA     OPTION      ;GET MAIN OPTION
  270.         CPI     'X'         ;EXPERT FLAG?
  271.         JNZ     RESTAR     ;NO
  272.         MVI     A,TRUE      ;YES
  273.         STA     XPRFLG      ;MAKE EXPERT
  274.         JMP     MENU
  275.  
  276. RESTAR:    LDA     OPTION          ;GET MAIN OPTION
  277.     CPI     ' '             ;NO OPTION SPEC'D?
  278.     JZ    MENU
  279.         CPI     'M'                 ;MENU ASKED FOR?
  280.         JZ     MENU                 ;YES, GO MENU
  281.     CPI    'C'
  282.     JNZ    RSTR1
  283.     LXI    H,80H        ;POINT TO CP/M CMDBUF
  284.     LXI    D,CMDBUF+1
  285.     MOV    B,M        ;GET LENGTH OF COMMD.LINE
  286.     INR    B        ;UP ONE FOR CHAR.COUNTER
  287.     CALL    MOVE
  288.     JMP    DIALPL
  289. RSTR1:    CPI     'E'         ;ECHO MODE?
  290.         JZ     TRMECHO      ;YES
  291.         CPI     'D'         ;DISCONNECT?
  292.         JZ     DNTCB        ;YES, DISCONNECT & GO MENU
  293.  
  294.         CALL     MOVEFCB
  295.         MVI     A,FALSE
  296.         STA     NFLFLG
  297.         CALL     INDATP         ;GOBBLE UP GARBAGE..
  298.         CALL     INDATP         ;..CHARACTERS ON LINE
  299.         LDA     OPTION      ;PROCESS MAIN OPTION
  300.         CPI     'T'         ;TERMINAL MODE?
  301.         JZ     DSKSAVE      ;YES
  302.         CPI     'S'         ;SEND A FILE?
  303.         JZ     SENDFIL      ;YES
  304.         CPI     'R'         ;RECEIVE A FILE?
  305.         JZ     RCVFIL       ;YES
  306.     CPI    'K'        ;KILL A FILE?
  307.     JZ    KILFIL         ; YES, GO DO IT
  308.  
  309.     JMP    MENU        ;NO OPTION SPEC'D, GO MENU
  310.  
  311. ;REVISED TERMINAL ROUTINE ALLOWING MEMORY SAVE
  312.  
  313. DSKSAVE:LDA     NFLFLG     ;NEW FILE FLAG
  314.         CPI     TRUE        ;OFFH? (TRUE=NORMAL TERMINAL MODE)
  315.         JZ     TERM         ;YES
  316.         LDA     FCB+1       ;FIRST CHAR OF FILENAME
  317.         CPI     ' '         ;FILE SPEC'D
  318.         JNZ     GOODNM      ;YES, GOOD NAME
  319.         MVI     A,TRUE      ;0FFH
  320.         STA     NFLFLG     ;
  321.         CMA             ; 0
  322.         STA     SAVFLG     ;
  323.         JMP     TERM        ;
  324.  
  325. GOODNM:    CALL    ILPRT
  326.         DB CR,LF,'++ IS INCOMING FILE OBJECT CODE? >>',0
  327.  
  328.     LXI    D,CMDBUF
  329.     CALL    INBUFF
  330.     CALL    CRLF
  331.     LDA    CMDBUF+2
  332.     CPI    NO
  333.     JZ    GODNM2
  334.     CPI    YES
  335.     JZ    GODNM1
  336.  
  337.     CALL    ILPRT
  338.         DB CR,LF,'++ ANSWER YES OR NO ONLY PLEASE! ++',CR,LF,LF,0
  339.     JMP    GOODNM
  340.  
  341. GODNM1:    MVI    A,0FFH
  342.     STA    MACFLG        ;SET CODE FLAG ON    
  343.  
  344. GODNM2: CALL     ERASFIL
  345.         CALL     MOVE2
  346.         LXI     D,FCB3
  347.         MVI     C,MAKE
  348.         CALL     BDOS
  349.         LXI     D,FCB3
  350.         MVI     C,OPEN
  351.         CALL     BDOS
  352.         LXI     H,BOTRAM
  353.         SHLD     HLSAVE
  354.         MVI     A,FALSE
  355.         STA     NFLFLG
  356.  
  357. TERM:   CALL     STAT         ;KEYPRESS?
  358.         JZ     TERML        ;NO, CHECK LINE
  359.         CALL     KEYIN        ;GET CHAR FROM KBD
  360.  
  361.     CPI    ECOTOG         ;^E?    
  362.     JNZ    TERM10
  363.  
  364.     CALL    ILPRT
  365.         DB CR,LF,'++ ECHO ON ++',CR,LF,0
  366.     JMP    TRMECHO      ;YES, GO ECHO MODE
  367.  
  368. TERM10: CPI     OFFLIN      ;^O?
  369.         JZ     MENU         ;YES, RETURN TO MENU
  370.  
  371.         CPI     DISCCHR      ;^D?
  372.         JZ     DNTCB        ;YES, DISCONNECT & RETURN TO MENU
  373.  
  374. LST:    CPI    PRINTR         ;^P?     
  375.     JNZ    TERCON         ;NO OUTPUT TO LIST DEV...CONT.
  376.     LDA    LSTFLG       ;GET LIST DEV.TOGGLE    
  377.     CMA             ;MAKE TOGGLE
  378.     STA    LSTFLG       ;SAVE IT         
  379.     INR    A
  380.     JNZ    LST1
  381.  
  382.     CALL    ILPRT
  383.         DB CR,LF,'++ PRINTER ON ++',CR,LF,0
  384.     JMP    TERM
  385.  
  386. LST1:    CALL    ILPRT
  387.         DB CR,LF,'++ PRINTER OFF ++',CR,LF,0
  388.     JMP    TERM
  389.  
  390. TERCON: CPI     TRANCHR      ;^T TEST FOR TRANSFER REQUEST 
  391.         CZ     TRANSFER     ;SEND-A-FILE (BLIND SEND)
  392.         JZ     TERM         ;LOOP
  393.  
  394.     CPI     SAVECHR         ;^R TEST FOR RECEIVE REQUEST
  395.         JNZ     NOTOG         ;NO, CONT.
  396.  
  397.         LDA     NFLFLG     ; YES BUT, DO NOT ALLOW SAVE IF..
  398.         CPI     TRUE        ;..THIS FLAG IS SET.
  399.         JZ     TERML
  400.     LDA    SAVFLG       ;SAVE DATA TO DISK?    
  401.     CMA             ;MAKE TOGGLE
  402.     STA    SAVFLG       ;SAVE IT         
  403.     INR    A
  404.     JNZ    PRR1
  405.  
  406.     CALL    ILPRT
  407.         DB CR,LF,'++ RECEIVE ON ++',CR,LF,0
  408.     JMP    TERML
  409.  
  410. PRR1:    CALL    ILPRT
  411.         DB CR,LF,'++ RECEIVE OFF ++',CR,LF,0
  412.     JMP    TERML
  413.  
  414. NOTOG:  CALL     OTDATP
  415.  
  416. TERML:  CALL     INCTLP
  417.         CALL     ANRCVB
  418.         CALL     CPRCVR
  419.         JNZ     TERM
  420.         CALL     INDATP
  421.     PUSH    PSW        ;SAVE ORG.CHAR.
  422.     LDA    MACFLG        ;GET MACHINE LANG.FLAG
  423.     INR    A        ;MACHINE LANG.COMING THROUGH?
  424.     JZ    TERML9        ;YES...SKIP FILTER
  425.     POP    PSW        ;SAVE ORIG.CHAR
  426.         CPI     00H          ;CHECK FOR NULLS
  427.         JZ     TERM         ;DON'T PROCESS THEM
  428.         ANI     7FH          ;STRIP PARITY
  429.     PUSH    PSW        ;SAVE FILTERED CHAR.
  430. TERML9:    POP    PSW        ;GET FILTERED OR ORG.CHAR. 
  431.     PUSH    PSW        ;SAVE IT AGAIN
  432.     CALL    TYPE
  433.     LDA    LSTFLG
  434.     INR    A
  435.     JNZ    PUSHON
  436.     POP    PSW
  437.     CALL    LISTDV
  438. PUSHON: LDA     SAVFLG
  439.         INR     A
  440.         JNZ     NOSAVE
  441.         POP     PSW
  442.         MOV     M,A
  443.         INX     H
  444.         SHLD     HLSAVE     ;MENU COMMAND DESTROYS HL-REG..
  445.                          ;..GET HL WHEN ENTERING VIA 'RET' CMD.
  446.     CPI     LF          ;IF NO FRONT PANEL, THEN..
  447.         JNZ     NOCOLON     ;..TYPE ":" AFTER EACH LINE FEED..
  448.         MVI     A,':'       ;..WHEN MEMORY SAVE ACTIVE.
  449.         CALL     TYPE
  450. NOCOLON:LDA     07H           ;CHECK TO SEE IF..
  451.         DCR     A           ;..PAGE BELOW BDOS HAS BEEN..
  452.         CMP     H           ;..REACHED AND DISKSAVE IS NEEDED.
  453.         CZ     INTDSSV
  454.     JMP    TERM
  455. NOSAVE:    POP    PSW
  456.     JMP    TERM
  457.  
  458. SAVFLG:    DB FALSE
  459. LSTBY1:    DB 0
  460. LSTBY2:    DB 0
  461.  
  462.  
  463. INTDSSV:MVI A,XOFF      ;SEND A CTRL-S TO STOP..
  464.         CALL OTDATP        ;..REMOTE COMPUTER OUTPUT.
  465.  
  466.         MVI D,0         ;D IS THE BUFFER COUNT
  467.         CALL INMODEM    ;GET LAST BYTES SENT..
  468.         STA LSTBY1    ;..AFTER CTRL-S.
  469.         CALL INMODEM    ;ADD MORE CALLS TO INMODEM..
  470.         STA LSTBY2    ;..AND STA LASTBYT# IF YOU ARE..
  471.                         ;..LOSING BYTES WHEN MEMORY IS FULL.
  472.         PUSH D
  473.         CALL NMREC1
  474.         CALL WRTDSK     ;WRITE THE RECORDS
  475.         POP D
  476.  
  477.         LXI H,BOTRAM
  478.         INR D
  479.         DCR D           ;TEST BUFFER COUNT FOR ZERO
  480.         JZ CTRLQ
  481.         LDA LSTBY1    ;GET THE LAST BYTES THAT WERE..
  482.         MOV M,A         ;..SAVED AND PUT THEM IN..
  483.         INX H           ;..BOTRAM.
  484.         CALL TYPE
  485.         DCR D
  486.         JZ CTRLQ
  487.         LDA LSTBY2
  488.         MOV M,A
  489.         INX H
  490.         CALL TYPE
  491.  
  492. CTRLQ:  MVI A,XON       ;SEND START CHARACTER..
  493.         CALL OTDATP        ;..TO REMOTE COMPUTER.
  494.         RET
  495.  
  496. ;.COMMENT \
  497. ;THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER
  498. ;OR 100 MILLISECONDS. IF A CHARACTER IS RECEIVED, A FLAG IS SET
  499. ;TO STORE THE CHARACTER.A MAXIMUM OF TWO CHARACTERS ARE STORED,
  500. ;BUT MORE MAY BE STORED IF DESIRED (SEE COMMENT IN "INTDSSV"
  501. ;ABOVE).
  502. ;\
  503.  
  504. INMODEM:LXI B,1250
  505.  
  506. TIMERL: CALL INCTLP
  507.         CALL ANRCVB
  508.         CALL CPRCVR
  509.         JZ GETBYTE
  510.         DCX B
  511.         MOV A,B
  512.         ORA C
  513.         JNZ TIMERL
  514.         RET
  515. GETBYTE:CALL INDATP
  516.         INR D
  517.         RET
  518.  
  519. NMRECS:MVI M,EOFCHAR
  520.         INX H
  521.         LXI D,127
  522.         DAD D
  523.  
  524. NMREC1:LXI D,-(BOTRAM)
  525.         DAD D
  526.         MOV A,L         ;DIVIDE HL BY 128..
  527.         ORA A
  528.         RAL             ;..TO GET THE..
  529.         MOV L,H         ;..NUMBER OF SECTORS
  530.         MVI H,0
  531.         PUSH PSW
  532.         DAD H
  533.         POP PSW
  534.         MVI A,0
  535.         ADC L
  536.         MOV L,A         ;RETRNS WITH NUMBER OF..
  537.         RET             ;..128 BYTE RECORDS IN HL.
  538.  
  539. WRTDSK: LXI D,BOTRAM
  540.  
  541. NEXTWRT:MVI C,STDMA
  542.         CALL BDOSRT
  543.         PUSH D
  544.         LXI D,FCB3
  545.         MVI C,WRITE
  546.         CALL BDOSRT
  547.         POP D
  548.         XCHG
  549.         PUSH D
  550.         LXI D,128
  551.         DAD D
  552.         POP D
  553.         XCHG
  554.         DCX H
  555.         MOV A,H
  556.         ORA L
  557.         JNZ NEXTWRT
  558.         RET
  559.  
  560. CLOSE3: LXI D,FCB3
  561.         MVI C,CLOSE
  562.         CALL BDOS
  563.         RET
  564.  
  565. BDOSRT: PUSH B 
  566.     PUSH D 
  567.     PUSH H 
  568.     PUSH PSW
  569.         CALL BDOS
  570.         POP PSW 
  571.     POP H 
  572.     POP D 
  573.     POP B
  574.         RET
  575.  
  576. MOVE2:  LXI H,FCB3
  577.         CALL INITFCB
  578.         LXI H,FCB
  579.         LXI D,FCB3
  580.         MVI B,12
  581.         CALL MOVE
  582.         RET
  583.  
  584. ;FILE TRANSFER ROUTINE - CALLED WITH 
  585. ;CONTROL-T FROM TERMINAL ROUTINE.
  586. ;TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X.
  587.  
  588. TRANSFER:
  589.         PUSH H 
  590.     PUSH D 
  591.     PUSH B 
  592.     PUSH PSW
  593.         LXI H,FCB4
  594.         CALL INITFCB   ;INITIALIZES FCBS POINTED..
  595.         LXI H,FCB+16    ;..TO BY HL REG.
  596.         CALL INITFCB
  597.  
  598. GET:    CALL GETNAME
  599.         LDA CMDBUF+2    ;WAS FILE ENTERED
  600.         CPI 20H
  601.         JZ TRNSL2
  602.         CALL MOVE4
  603.         CALL OPEN4
  604.         CPI 0FFH        ;RETURN WITH 0FFH MEANS
  605.         JNZ CONTIN      ;FILE DOES NOT EXIST
  606.  
  607. TRNSL1:CALL ILPRT
  608.         DB CR,LF,'++ FILE DOES NOT EXIST ++',CR,LF,LF,0
  609.  
  610. TRNSL2:CALL ILPRT
  611.         DB '   ...TYPE ''R'' TO RETURN TO MODEM ++',CR,LF
  612.         DB '   ...TYPE ''A'' TO RE-ENTER NAME ',CR,LF,LF
  613.     DB '      COMMAND >>',BELL,0
  614.  
  615.         CALL KEYIN
  616.         CALL UCASE
  617.         CALL TYPE       ;ECHO RESPONSE
  618.         CALL CRLF
  619.         CPI 'A'
  620.         JZ GET
  621.         CPI 'R'
  622.         JZ RETURN
  623.         JMP TRNSL2
  624.  
  625. CONTIN: LXI D,80H
  626.         MVI C,STDMA
  627.         CALL BDOS
  628.  
  629. READMR: CALL READ80
  630.         CPI 1           ;END OF FILE
  631.         JZ RETRNS
  632.         CPI 2           ;BAD READ
  633.         JZ RETRNU
  634.         CALL SEND80C
  635.         CPI EOFCHAR     ;END OF FILE - OMIT IF OBJECT..
  636.         JZ RETRNS      ;..CODE IS TO BE SENT.
  637.         CPI CAN         ;CANCELLATION?
  638.         JZ TRANCAN
  639.         JMP READMR
  640.  
  641. RETRNS:CALL ILPRT
  642.         DB CR,LF,'++ FILE TRANSFER COMPLETED ++',CR,LF,BELL,0
  643.  
  644.         JMP RETURN
  645.  
  646. RETRNU:CALL ILPRT
  647.         DB CR,LF,'++ FILE TRANSFER UNSUCCESSFUL ++',CR,LF,BELL,0
  648.         JMP RETURN
  649.  
  650. TRANCAN:CALL ILPRT
  651.         DB CR,LF,'++ TRANSFER CANCELLED ++',CR,LF,BELL,0
  652.  
  653. RETURN: XRA A
  654.     STA MACFLG
  655.     POP PSW 
  656.     POP B 
  657.     POP D 
  658.     POP H
  659.         RET
  660.  
  661.                     ;ENTRY AT +2 WILL LEAVE..
  662. INITFCB:MVI M,0         ;..DRIVE NO. INTACT.
  663.         INX H           ;WILL INITIALIZE AN FCB..
  664.         MVI B,11        ;..POINTED TO BY HL-REG. FILLS 1ST POS
  665.  
  666. LOOP10: MVI M,' '       ;..WITH 0, NEXT 11 WITH..
  667.         INX H           ;..WITH BLANKS, AND LAST..
  668.         DCR B           ;..21 WITH NULLS.
  669.         JNZ LOOP10
  670.         MVI B,21
  671.  
  672. LOOP11: MVI M,0
  673.         INX H
  674.         DCR B
  675.         JNZ LOOP11
  676.         RET
  677.  
  678. GETNAME:CALL ILPRT
  679. DB CR,LF,'++ IS OUTGOING FILE OBJECT CODE? >>',0
  680.  
  681.     LXI    D,CMDBUF
  682.     CALL    INBUFF
  683.     CALL    CRLF
  684.     LDA    CMDBUF+2
  685.     CPI    NO
  686.     JZ    GTNAM2
  687.     CPI    YES
  688.     JZ    GTNAM1
  689.  
  690.     CALL    ILPRT
  691. DB 'ANSWER YES OR NO ONLY PLEASE!',CR,LF,LF,0
  692.     JMP    GETNAME
  693.  
  694. GTNAM1:    MVI    A,0FFH
  695.     STA    MACFLG        ;SET CODE FLAG ON    
  696.  
  697. GTNAM2: CALL ILPRT
  698. DB CR,LF,'++ ENTER FILE NAME TO BE TRANSFERED...C/R TO QUIT ++',CR,LF,LF
  699. DB '   COMMAND >>',0
  700.  
  701.         LXI D,CMDBUF
  702.         CALL INBUFF
  703.         CALL CRLF
  704.         RET
  705.  
  706. MOVE4:  LXI D,CMDBUF
  707.         LXI H,FCB4
  708.         CALL CPMLINE
  709.         RET
  710.  
  711. OPEN4:  LXI D,FCB4
  712.         MVI C,OPEN
  713.         CALL BDOS
  714.         RET
  715.  
  716. READ80: LXI D,FCB4
  717.         MVI C,READ
  718.         CALL BDOS
  719.         RET
  720.  
  721. SEND80C:MVI B,80H
  722.     LXI H,80H
  723.  
  724. SENDCH1:PUSH B
  725.     PUSH D
  726.     PUSH H
  727.     CALL INDATP
  728.     CPI  XOFF
  729.     JNZ  SNDCH9
  730.  
  731. TWO:    CALL STAT
  732.     JZ   THREE
  733.     CALL KEYIN
  734.     CPI  CAN
  735.     JZ   SNDCH9    
  736.  
  737. THREE:    CALL INDATP
  738.     CPI  XON
  739.     JNZ  TWO
  740.  
  741. SNDCH9: POP H
  742.     POP D
  743.     POP B
  744.     CPI CAN
  745.     RZ
  746.  
  747.     MOV A,M
  748.         CALL MODOUT
  749.  
  750.     PUSH PSW
  751.     LDA  MACFLG
  752.     INR  A
  753.     JZ   SNDC1    
  754.  
  755.     POP  PSW
  756.         CPI EOFCHAR
  757.         RZ
  758.     PUSH PSW
  759.  
  760. SNDC1:  POP  PSW    ;RESTORE STACK
  761.     CALL STAT       ;TEST TO SEE IF
  762.         ORA A           ;CANCELLATION REQUESTED
  763.         JZ SKIP12
  764.         CALL KEYIN
  765.         CPI CAN
  766.         RZ
  767.  
  768. SKIP12: INX H
  769.         DCR B
  770.         JNZ SENDCH1
  771.         RET
  772.  
  773. MODOUT: PUSH PSW
  774.  
  775. MODOTL: CALL OTCTLP
  776.         CALL ANSNDB
  777.         CALL CPSNDR
  778.         JNZ MODOTL
  779.         POP PSW
  780.         CALL OTDATP
  781.         CALL TYPE
  782.         RET
  783.  
  784. FCB4:   DS 33
  785.  
  786. ;TERMINAL ECHO MODE
  787.  
  788. TRMECHO:CALL INCTLP
  789.         CALL ANRCVB
  790.         CALL CPRCVR
  791.         JNZ KEYBRD
  792.  
  793. LINECHR:CALL INDATP
  794.  
  795. LINEC2:    CALL MODOUT
  796.  
  797.     PUSH PSW
  798.     LDA  LSTFLG
  799.     INR  A
  800.     JNZ  KYCONT
  801.     POP  PSW
  802.     CALL LISTDV
  803.     PUSH PSW
  804.  
  805. KYCONT: POP  PSW
  806.     CPI  CR
  807.     JNZ  TRMECHO
  808.     MVI  A,LF
  809.     JMP LINEC2
  810.  
  811. KEYBRD: CALL STAT
  812.         JZ TRMECHO
  813.         CALL KEYIN
  814.  
  815.     CPI  ECOTOG
  816.     JNZ  KEYBR3
  817.  
  818.     CALL ILPRT
  819.         DB CR,LF,'++ ECHO OFF ++',CR,LF,0
  820.     JMP  TERM
  821.  
  822. KEYBR3: CPI OFFLIN
  823.         JZ MENU
  824.  
  825.     CPI DISCCHR
  826.     JZ  DNTCB
  827.  
  828.     CPI PRINTR         ;^P?     
  829.     JNZ KEYBR2         ;NO OUTPUT TO LIST DEV...CONT.
  830.     LDA LSTFLG       ;GET LIST DEV.TOGGLE    
  831.     CMA         ;MAKE TOGGLE
  832.     STA LSTFLG       ;SAVE IT         
  833.     JMP TRMECHO
  834.  
  835. KEYBR2:    CALL MODOUT
  836.     CPI  CR
  837.     JNZ  TRMECHO
  838.     MVI  A,LF
  839.     JMP  KEYBR2
  840.  
  841.  
  842. ;               SEND A CP/M FILE
  843.  
  844. SENDFIL:LDA BATCHFLG    ;CHECK IF MULTIPLE FILE..
  845.         ORA A           ;..MODE IS SET.
  846.         JNZ SENDC1
  847.         MVI A,TRUE      ;INDICATE BATCH SEND
  848.         STA SENDFLG
  849.         LDA FSTFLG      ;IF FIRST TIME THRU..
  850.         ORA A           ;..SCAN THE COMMAND LINE..
  851.         CNZ TNMBUF      ;..FOR MULTIPLE NAMES.
  852.         CALL SENDFN     ;SENDS FILE NAME TO RECEIVER
  853.         JNC SENDC2      ;CARRY SET MEANS NO MORE FILES.
  854.         MVI A,'B'       ;STOP BATCH..
  855.         STA BATCHFLG    ;..MODE OPTION.
  856.         MVI A,EOT       ;FINAL XFER END
  857.         CALL SEND
  858.         JMP DONE
  859.  
  860. SENDC1: LDA FCB+1
  861.         CPI ' '
  862.         JZ BLKFILE
  863.  
  864. SENDC2:    CALL     CNREC
  865.     CALL OPENFIL
  866.         MVI E,80
  867.         CALL WAITNAK
  868.  
  869. SENDLP: CALL RDSECT
  870.         JC SENDEOF
  871.         CALL INCRSNO
  872.         XRA A
  873.         STA ERRCT
  874.  
  875. SENDRPT:CALL SENDHDR
  876.         CALL SENDSEC
  877.     LDA  CRCFLG    ;CRC REQUEST?
  878.     ORA  A
  879.     CZ   SNDCRC    ;YES...SEND CRC CHECKS
  880.     CNZ  SENDCKS    ;NO...SEND CHECKSUMS
  881.         CALL GETACK
  882.         JC SENDRPT
  883.         JMP SENDLP
  884.  
  885. SENDEOF:MVI A,EOT
  886.         CALL SEND
  887.         CALL GETACK
  888.         JC SENDEOF
  889.         JMP DONE
  890.  
  891. ;               RECEIVE A FILE
  892.  
  893. RCVFIL: LDA BATCHFLG    ;CHECK IF MULT..
  894.         ORA A           ;..FILE MODE.
  895.         JNZ RCVC1
  896.         MVI A,FALSE     ;FLAG WHERE TO RETURN..
  897.         STA SENDFLG     ;..FOR NEXT FILE TRANS.
  898.         CALL GETFN      ;GET THE FILE NAME.
  899.         JNC RCVC2       ;CARRY SET MEANS NO MORE FILES.
  900.         MVI A,'B'       ;STOP BATCH..
  901.         STA BATCHFLG    ;..MODE OPTION.
  902.         JMP DONE
  903.  
  904. RCVC1:  LDA FCB+1       ;MAKE SURE FILE IS NAMED
  905.         CPI ' '
  906.         JZ BLKFILE
  907.         JMP RCVC3
  908.  
  909. RCVC2:  CALL CKCPM2
  910.         CALL CKBAKUP
  911.  
  912. RCVC3:  CALL ERASFIL
  913.         CALL MAKEFIL
  914.         LDA QFLG
  915.         ORA A
  916.     JZ  RCVFST
  917.         LDA BATCHFLG
  918.         ORA A           ;DON'T PRINT MSSG IF..
  919.     JZ  RCVFST    ;...IN MULTI AND QUIET MODE.
  920.  
  921.         CALL ILPRT
  922.         DB CR,LF,'++ FILE OPEN, READY TO RECEIVE ++',CR,LF,0
  923.  
  924. RCVFST: LDA CRCFLG
  925.     ORA A
  926.     MVI A,NAK
  927.     JNZ RCVFL2
  928.     MVI A,CRC
  929.  
  930. RCVFL2: CALL SEND
  931.  
  932. RCVLP:  CALL RCVSECT
  933.         JC RCVEOT
  934.         CALL WRSECT
  935.         CALL INCRSNO
  936.         CALL SENDACK
  937.         JMP RCVLP
  938.  
  939. RCVEOT: CALL WRBLOCK
  940.         CALL SENDACK
  941.         CALL CLOSFIL
  942.         JMP DONE
  943.         
  944. ;SUBROUTINES
  945.  
  946. SENDFN: LDA QFLG
  947.         ORA A
  948.         JZ SWNAK
  949.  
  950.         CALL ILPRT
  951.         DB CR,LF,'++ AWAITING NAME NAK ++',CR,LF,0
  952.  
  953. SWNAK:  MVI E,80
  954.         CALL WAITNLP
  955.         MVI A,ACK       ;GOT NAK, SEND ACK
  956.         CALL SEND
  957.         LXI H,FILECT
  958.         DCR M
  959.         JM NOMRNM
  960.         LHLD NBSAVE     ;GET FILE NAME..
  961.         LXI D,FCB       ;..IN FCB
  962.         MVI B,12
  963.         CALL MOVE
  964.         SHLD NBSAVE
  965.         CALL SENDNM     ;SEND IT
  966.         ORA A           ;CLEAR CARRY
  967.         RET
  968.  
  969. NOMRNM: MVI A,EOT
  970.         CALL SEND
  971.         STC
  972.         RET
  973.  
  974. SENDNM: PUSH H
  975.  
  976. SNDNM1: MVI D,11        ;COUNT CHARS IN NAME
  977.         MVI C,0         ;INIT CHECKSUM
  978.         LXI H,FCB+1     ;ADDRESS NAME
  979.  
  980. NAMLPS: MOV A,M         ;SEND NAME
  981.         ANI 7FH         ;STRIP HIGH ORDER BIT SO CP/M 2..
  982.         CALL SEND       ;..WON'T SEND R/O FILE DESIGNATION.
  983.         LDA QFLG        ;SHOW NAME IF..
  984.         ORA A           ;..QFLG NOT SET.
  985.         MOV A,M
  986.         CNZ TYPE
  987.  
  988. ACKLP:  PUSH B          ;SAVE CKSUM
  989.         MVI B,1         ;WAIT FOR RECEIVER..
  990.         CALL RECV       ;..TO ACKNOWLEDGE..
  991.         POP B           ;..GETTING LETTER.
  992.         JC SCKSER
  993.         CPI ACK
  994.         JNZ ACKLP
  995.         INX H           ;NEXT CHAR
  996.         DCR D
  997.         JNZ NAMLPS
  998.         MVI A,EOFCHAR   ;TELL RECEIVER END OF NAME
  999.         CALL SEND
  1000.         LDA QFLG
  1001.         ORA A
  1002.         CNZ CRLF
  1003.         MOV D,C         ;SAVE CHECKSUM
  1004.         MVI B,1
  1005.         CALL RECV       ;GET CHECKSUM..
  1006.         CMP D           ;..FROM RECEIVER.
  1007.         JZ NAMEOK
  1008.  
  1009. SCKSER: MVI A,BDNMCH    ;BAD NAME-TELL RECEIVER
  1010.         CALL SEND
  1011.         LDA QFLG
  1012.         ORA A
  1013.         JZ SKCSR1
  1014.  
  1015.         CALL ILPRT
  1016.         DB CR,LF,'++ CHECKSUM ERROR ++',CR,LF,0
  1017.  
  1018. SKCSR1:MVI E,80        ;DO HANDSHAKING OVER
  1019.         CALL WAITNLP    ;DON'T PRINT "AWAITING NAK" MSG
  1020.         MVI A,ACK
  1021.         CALL SEND
  1022.         JMP SNDNM1
  1023.  
  1024. NAMEOK: MVI A,OKNMCH    ;GOOD NAME-TELL RECEIVER
  1025.         CALL SEND
  1026.         POP H
  1027.         RET     
  1028.  
  1029. GETFN:  LXI H,FCB
  1030.         CALL INITFCB+2 ;DOES NOT INITIALIZE DRIVE
  1031.         LDA QFLG
  1032.         ORA A
  1033.         JZ GNAMELP
  1034.  
  1035.         CALL ILPRT
  1036.         DB CR,LF,'++ AWAITING FILE NAME ++',CR,LF,0
  1037.  
  1038. GNAMELP:CALL HSNAK
  1039.         JC GNAMELP
  1040.         CALL GETNM      ;GET THE NAME
  1041.         CPI EOT         ;IF EOT, THEN NO MORE FILES
  1042.         JZ NMRNMG
  1043.         ORA A           ;CLEAR CARRY
  1044.         RET
  1045.  
  1046. NMRNMG: STC
  1047.         RET
  1048.  
  1049. GETNM:  PUSH H
  1050.  
  1051. GETNM1: MVI C,0         ;INIT CHECKSUM
  1052.         LXI H,FCB+1
  1053.  
  1054. NAMELPG:MVI B,5
  1055.         CALL RECV       ;GET CHAR
  1056.         JNC GETNM3
  1057.         LDA QFLG
  1058.         ORA A
  1059.         JZ GETNM2
  1060.  
  1061.         CALL ILPRT
  1062.         DB CR,LF,'++ TIME OUT RECEIVING FILENAME ++',CR,LF,0
  1063.  
  1064. GETNM2: JMP GCKSER
  1065.  
  1066. GETNM3: CPI EOT         ;IF EOT, THEN NO MORE FILES
  1067.         JZ GNRET
  1068.         CPI EOFCHAR     ;GOT END OF NAME
  1069.         JZ ENDNAME
  1070.         MOV M,A         ;PUT NAME IN FCB
  1071.         LDA QFLG        ;TYPE IT IF NO QFLG
  1072.         ORA A
  1073.         MOV A,M
  1074.         CNZ TYPE
  1075.         PUSH B          ;SAVE CKSUM
  1076.         MVI A,ACK       ;ACK GETTING LETTER
  1077.         CALL SEND
  1078.         POP B
  1079.         INX H           ;GET NEXT CHAR
  1080.         MOV A,L         ;DON'T LET NOISE...
  1081.         CPI 7FH         ;..CAUSE OVERFLOW..
  1082.         JZ GCKSER       ;..INTO PROGRAM AREA.
  1083.         JMP NAMELPG
  1084.  
  1085. ENDNAME:LDA QFLG
  1086.         ORA A
  1087.         CNZ CRLF
  1088.         MOV A,C         ;SEND CHECKSUM
  1089.         CALL SEND
  1090.         MVI B,1
  1091.         CALL RECV       ;CHECKSUM GOOD?
  1092.         CPI OKNMCH      ;YES IF OKNMCH SENT..
  1093.         JZ GNRET        ;..ELSE DO OVER.
  1094.  
  1095. GCKSER: LXI H,FCB       ;CLEAR FCB (EXCEPT DRIVE)..
  1096.         CALL INITFCB+2 ;..SINCE IT MIGHT BE DAMAGED..
  1097.         LDA QFLG        ;..BY TOO MANY CHARS.
  1098.         ORA A
  1099.         JZ GCKSR1
  1100.  
  1101.         CALL ILPRT
  1102.         DB CR,LF,'++ CHECKSUM ERROR ++',CR,LF,0
  1103.  
  1104. GCKSR1:CALL HSNAK      ;DO HANDSHAKING OVER
  1105.         JC GCKSR1
  1106.         JMP GETNM1
  1107.  
  1108. GNRET:  POP H
  1109.         RET
  1110.  
  1111. HSNAK:  MVI A,NAK       ;SEND NAK UNTIL..
  1112.         CALL SEND       ;..RECEIVING ACK.
  1113.         CALL CKABORT    ;DON'T GET HUNG UP HERE
  1114.         MVI B,2         ;WAIT 2 SECONDS..
  1115.         CALL RECV       ;..IN RECEIVE.
  1116.  
  1117. ;REINITIALIZE THIS CODE IF YOU WANT THE ABILITY TO ABORT 
  1118. ;WHILE RECEIVING.
  1119.  
  1120. ;        CPI CAN         ;IF SENDER ABORTS..
  1121. ;        JZ ABORT        ;..DURING NAME TRANSFER.
  1122.  
  1123.         CPI ACK         ;IF NAK,RETURN WITH..
  1124.         RZ              ;..CARRY CLEAR.
  1125.         STC
  1126.         RET
  1127.  
  1128. TNMBUF: MVI A,FALSE     ;CALL FROM SENDFIL ONLY ONCE.
  1129.         STA FSTFLG
  1130.         STA FILECT
  1131.         CALL SCAN
  1132.         LXI H,NAMEBUF
  1133.         SHLD NBSAVE     ;SAVE ADDR OF 1ST NAME
  1134.  
  1135. TNLP1:  CALL TRTOBUF
  1136.         LXI H,FCB
  1137.         LXI D,FCBBUF
  1138.         CALL CPMLINE    ;PARSE NAME TO CP/M FORMAT
  1139.  
  1140. TNLP2:  CALL MFNAME    ;SEARCH FOR NAMES (* FORMAT)
  1141.  
  1142.         JC NEXTNM
  1143.         LDA FCB+10      ;IF CP/M 2 $SYS FILE..
  1144.         ANI 80H         ;..DON'T SEND
  1145.         JNZ TNLP2
  1146.         LHLD NBSAVE     ;GET NAME
  1147.         LXI D,FCB       ;MOVE IT TO FCB
  1148.         XCHG
  1149.         MVI B,12
  1150.         CALL MOVE
  1151.         XCHG
  1152.         SHLD NBSAVE     ;ADDR OF NEXT NAME
  1153.         LXI H,FILECT    ;COUNT FILES FOUND
  1154.         INR M
  1155.         JMP TNLP2
  1156.  
  1157. NEXTNM: LXI H,NAMECT    ;COUNT NAMES FOUND
  1158.         DCR M
  1159.     JNZ TNLP1
  1160.         LXI H,NAMEBUF   ;SAVE START OF BUFFER
  1161.         SHLD NBSAVE
  1162.         LDA FILECT
  1163.         CPI 65          ;NO MORE THAN 64 TRANSFERS
  1164.         RC
  1165.         MVI A,64        ;ONLY X'FER FIRST 64
  1166.         STA FILECT
  1167.         RET
  1168.  
  1169. ;SCANS CMDBUF COUNTING NAMES AND PUTTING DELIMITER (SPACE)
  1170. ;AFTER LAST NAME
  1171.  
  1172. SCAN:   PUSH H
  1173.         LXI H,NAMECT
  1174.         MVI M,0
  1175.         LXI H,CMDBUF+1  ;FIND END OF CMD LINE..
  1176.         MOV C,M         ;..AND PUT SPACE THERE.
  1177.         MVI B,0
  1178.         LXI H,CMDBUF+2
  1179.         DAD B
  1180.         MVI M,20H
  1181.         LXI H,CMDBUF+1
  1182.         MOV B,M
  1183.         INR B
  1184.         INR B
  1185.  
  1186. SCNLP1: INX H
  1187.         DCR B
  1188.         JZ DNSCAN
  1189.         MOV A,M
  1190.         CPI 20H
  1191.         JNZ SCNLP1
  1192.  
  1193. SCNLP2: INX H           ;EAT EXTRA SPACES
  1194.         DCR B
  1195.         JZ DNSCAN
  1196.         MOV A,M
  1197.         CPI 20H
  1198.         JZ SCNLP2
  1199.         SHLD BGNMS      ;SAVE START OF NAMES IN CMDBUF
  1200.         INR B
  1201.         DCX H
  1202.  
  1203. SCNLP3: INX H
  1204.         DCR B
  1205.         JZ DNSCAN
  1206.         MOV A,M
  1207.         CPI 20H
  1208.         JNZ SCNLP3
  1209.         LDA NAMECT      ;COUNTS NAMES
  1210.         INR A
  1211.         STA NAMECT
  1212.  
  1213. SCNLP4: INX H           ;EAT SPACES
  1214.         DCR B
  1215.         JZ DNSCAN
  1216.         MOV A,M
  1217.         CPI 20H
  1218.         JZ SCNLP4
  1219.         JMP SCNLP3
  1220.  
  1221. DNSCAN: MVI M,20H       ;SPACE AFTER LAST CHAR
  1222.         POP H
  1223.         RET
  1224.  
  1225. ;PLACES NEXT NAME IN BUFFER SO CPMLINE MAY PARSE IT
  1226.  
  1227. TRTOBUF:LHLD BGNMS
  1228.         MVI B,0
  1229.         LXI D,FCBBUF+2
  1230.  
  1231. TBLP:   MOV A,M
  1232.         CPI 20H
  1233.         JZ TRBFEND
  1234.         STAX D
  1235.         INX H
  1236.         INX D
  1237.         INR B           ;COUNT CHARS IN NAME
  1238.         JMP TBLP
  1239.  
  1240. TRBFEND:INX H
  1241.         MOV A,M         ;EAT EXTRA SPACES
  1242.         CPI 20H
  1243.         JZ TRBFEND
  1244.         SHLD BGNMS
  1245.         LXI H,FCBBUF+1  ;PUT # CHARS BEFORE NAME
  1246.         MOV M,B
  1247.         RET
  1248.  
  1249. ;IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'.
  1250.  
  1251. CKCPM2: MVI C,12
  1252.         CALL BDOS
  1253.     MOV A,L        ;TRANSFER VERSION #             W.B.
  1254.         ORA A           ;RETURN 0 MEANS CP/M 1
  1255.         RZ
  1256.         MVI C,STDMA
  1257.         LXI D,80H
  1258.         CALL BDOS
  1259.         MVI C,SRCHF     ;SEARCH FOR FILE
  1260.         LXI D,FCB
  1261.         CALL BDOS
  1262.         CPI 0FFH
  1263.         RZ
  1264.         ADD A 
  1265.     ADD A   ;MULT A-REG BY..
  1266.         ADD A 
  1267.     ADD A   ;..32 TO FIND..
  1268.         ADD A           ;..NAME IN DMA.
  1269.         LXI H,80H
  1270.         ADD L
  1271.         MOV L,A         ;HL POINTS TO DIR NAME
  1272.         LXI D,9
  1273.         DAD D           ;POINT TO R/O ATTRIB BYTE
  1274.         MOV A,M
  1275.         ANI 80H         ;TEST MSB
  1276.         JNZ MKCHG       ;IF SET, MAKE CHANGE
  1277.         INX H           ;CHECK SYSTEM ATTRIB BYTE
  1278.         MOV A,M
  1279.         ANI 80H
  1280.         RZ              ;NOT $SYS OR $R/O
  1281.         DCX H
  1282.  
  1283. MKCHG:  LXI D,-8
  1284.         DAD D           ;POINT HL TO FILENAME + 1
  1285.         LXI D,FCB+1     ;MOVE DIR NAME TO FCB..
  1286.         MVI B,11        ;..WITHOUT CHANGING DRIVE.
  1287.         CALL MOVE
  1288.         LXI H,FCB+9     ;R/O ATTRIB
  1289.         MOV A,M
  1290.         ANI 7FH         ;STRIP R/O ATTRIB
  1291.         MOV M,A
  1292.         INX H           ;SYS ATTRIB
  1293.         MOV A,M
  1294.         ANI 7FH
  1295.         MOV M,A
  1296.         LXI D,FCB
  1297.         MVI C,30        ;SET NEW ATTRIBS IN DIR
  1298.         CALL BDOS
  1299.  
  1300. ;MAY BE CALLED BY CKBAKUP BELOW. ITS RETURN DONE HERE
  1301.  
  1302. PLANCHG:LXI H,FCB       ;CHANGE NAME TO TYPE "BAK"
  1303.         LXI D,6CH
  1304.         MVI B,9         ;MOVE DRIVE AND NAME (NOT TYPE)
  1305.         CALL MOVE
  1306.         LXI H,75H       ;START OF TYPE IN FCB2
  1307.         MVI M,'B'
  1308.         INX H
  1309.         MVI M,'A'
  1310.         INX H
  1311.         MVI M,'K'
  1312.         LXI D,6CH
  1313.         MVI C,ERASE     ;ERASE ANY PREV BACKUPS
  1314.         CALL BDOS
  1315.         LXI H,6CH       ;FCB2 DR FIELD SHOULD..
  1316.         MVI M,0         ;..0 FOR RENAME.
  1317.         LXI D,FCB
  1318.         MVI C,23        ;RENAME
  1319.         CALL BDOS
  1320.         RET
  1321.  
  1322. CKBAKUP:LDA BKBYTE
  1323.         ORA A
  1324.         RZ
  1325.         MVI C,SRCHF
  1326.         LXI D,FCB
  1327.         CALL BDOS
  1328.         INR A
  1329.         RZ              ;FILE NOT FOUND
  1330.         JMP PLANCHG     ;IN "CKCPM2" - RET DONE THERE
  1331.  
  1332. ;.COMMENT \
  1333. ;-------------------------------------------------------------
  1334. ;MFACCESS    MACRO ROUTINES
  1335.  
  1336. ;MFFLG1 IS NOT SET LOCAL BECAUSE IT MUST BE RESET
  1337. ;IN MAIN MODEM PROGRAM ON AN ABORT
  1338.  
  1339. ;MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  1340. ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  1341. ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  1342. ;TIME IT IS CALLED.  THIS COMMAND WOULD BE USED
  1343. ;IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE,
  1344. ;ETC IN WHICH YOU WANT TO PROCESS SINGLE OR
  1345. ;MULTIPLE FILES.
  1346.  
  1347. ;THE FCB WILL BE SET UP WITH THE NEXT NAME, READY TO
  1348. ;DO NORMAL PROCESSING (OPEN, READ, ETC.) WHEN ROUTINE IS CALLED.
  1349.  
  1350. ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  1351. ;\
  1352.  
  1353. ;    DEFINE DATA MOVE MACRO
  1354.  
  1355. MOV1    MACRO   ?F,?T,?L,?I
  1356.  
  1357.         IF NOT NUL ?F    ;IFNB    <?F>
  1358.         LXI     H,?F
  1359.         ENDIF
  1360.  
  1361.         IF NOT NUL ?T    ;IFNB    <?T>
  1362.         LXI     D,?T
  1363.         ENDIF
  1364.  
  1365.         IF NOT NUL ?L    ;IFNB    <?L>
  1366.         LXI     B,?L
  1367.         ENDIF
  1368.  
  1369.         IF NOT NUL ?I    ;IFNB    <?I>
  1370.         LOCAL   ?N,?Z
  1371.         CALL    ?Z
  1372.  
  1373. ?N:     DB      ?I
  1374.  
  1375. ?Z:     POP     H       ;GET TO
  1376.         LXI     B,?Z-?N
  1377.         ENDIF
  1378.  
  1379.         CALL    MOVER
  1380.  
  1381. MF      SET     -1      ;;SHOW EXPANSION
  1382.         ENDM
  1383.  
  1384. ;DEFINE CP/M MACRO - CPM FNC,PARM
  1385.  
  1386. CPM     MACRO   ?F,?P
  1387.  
  1388.         PUSH    B
  1389.         PUSH    D
  1390.         PUSH    H
  1391.  
  1392.         IF NOT NUL ?F    ;IFNB    <?F>
  1393.         MVI     C,?F
  1394.         ENDIF
  1395.  
  1396.         IF NOT NUL ?P    ;IFNB    <?P>
  1397.         LXI     D,?P
  1398.         ENDIF
  1399.  
  1400.         CALL    BDOS
  1401.         POP     H
  1402.         POP     D
  1403.         POP     B
  1404.         ENDM
  1405.  
  1406. ;.COMMENT \
  1407. ;------------------------------------------------
  1408. ;MULTI-FILE ACCESS SUBROUTINE
  1409.  
  1410. ;THE ROUTINE IS COMMENTED IN PSEUDO CODE,
  1411. ;EACH PSEUDO CODE STATEMENT IS IN <<...>>
  1412. ;\
  1413.  
  1414. MFNAME  EQU $
  1415.  
  1416. ;<<INIT DMA ADDR, FCB>>
  1417.  
  1418.  
  1419. CPM STDMA,80H
  1420.  
  1421.     XRA A 
  1422.      STA FCBEXT
  1423.  
  1424. ;<<IF FIRST TIME>>
  1425.  
  1426.     LDA MFFLG1 
  1427.      ORA A 
  1428.      JNZ MFN01
  1429.  
  1430. ;<<TURN OFF 1ST TIME SW>>
  1431.  
  1432.     MVI A,1 
  1433.      STA MFFLG1
  1434.  
  1435. ;<<SAVE THE REQUESTED NAME>>
  1436.  
  1437. MOV1 FCB,MFREQ,12    ;SAVE ORIG REQ
  1438.  
  1439.     LDA FCB 
  1440.      STA MFCUR ;SAVE DISK IN CURR FCB
  1441.  
  1442. ;<<SRCHF REQ NAME>>
  1443.  
  1444. MOV1 MFREQ,FCB,12
  1445.  
  1446. CPM SRCHF,FCB
  1447.  
  1448. ;<<ELSE>>
  1449.  
  1450.     JMP MFN02
  1451.  
  1452. MFN01  EQU $
  1453.  
  1454. ;<<SRCHF CURR NAME>>
  1455.  
  1456. MOV1 MFCUR,FCB,12
  1457.  
  1458. CPM SRCHF,FCB
  1459.  
  1460. ;<<SRCHN REQ NAME>>
  1461.  
  1462. MOV1 MFREQ,FCB,12
  1463.  
  1464. CPM SRCHN,FCB
  1465.  
  1466. ;<<ENDIF>>
  1467.  
  1468. MFN02  EQU $
  1469.  
  1470. ;<<RETURN CARRY IF NOT FOUND>>
  1471.  
  1472.     INR A 
  1473.      STC 
  1474.      JNZ MFFIX1 
  1475.      STA MFFLG1 
  1476.      RET            ;FIX BY M.Z.
  1477.  
  1478. MFFIX1  EQU $
  1479.  
  1480. ;<<MOVE NAME FOUND TO CURR>>
  1481.  
  1482.      DCR A 
  1483.      ANI 3 
  1484.      ADD A
  1485.      ADD A 
  1486.      ADD A 
  1487.      ADD A 
  1488.      ADD A
  1489.      ADI 81H 
  1490.      MOV L,A 
  1491.      MVI H,0
  1492.      PUSH H         ;SAVE NAME POINTER
  1493.  
  1494.  MOV1 ,MFCUR+1,11
  1495.  
  1496. ;<<MOVE NAME FOUND TO FCB>>
  1497.  
  1498.      POP H 
  1499.  
  1500.  MOV1 ,FCB+1,11
  1501.  
  1502. ;<<SETUP FCB>>
  1503.  
  1504.      XRA A 
  1505.      STA FCBEXT 
  1506.      STA FCBRNO                        ;FIX BY M.Z.
  1507.  
  1508. ;<<RETURN>>
  1509.  
  1510.      RET
  1511.  
  1512. ;MULTI-FILE ACCESS WORK AREA
  1513.  
  1514. MFFLG1: DB      0       ;1ST TIME SW
  1515. MFREQ:  DS      12      ;REQ NAME
  1516. MFCUR:  DS      12      ;CURR NAME
  1517. ;------------------------------------------------
  1518.  
  1519. ;MOVE SUBROUTINE
  1520.  
  1521. MOVER:  MOV     A,M
  1522.         STAX    D
  1523.         INX     H
  1524.         INX     D
  1525.         DCX     B
  1526.         MOV     A,B
  1527.         ORA     C
  1528.         JNZ     MOVER
  1529.         RET
  1530.  
  1531. ;END OF MFACCESS ROUTINES
  1532. ;--------------------------------------------------------------
  1533.  
  1534.  
  1535. RCVSECT:XRA A
  1536.         STA ERRCT
  1537.  
  1538. RCVRPT: XRA A        ;FOR ERROR CHECK RS232
  1539.     STA ERRCDE
  1540.     LDA QFLG
  1541.         ORA A
  1542.         JZ RCVSQ
  1543.  
  1544.         CALL ILPRT
  1545.         DB '   AWAITING SECTOR...',0
  1546.  
  1547.     PUSH    H
  1548.     LHLD    SECTNO
  1549.     INX    H
  1550.     CALL    DECOUT
  1551.  
  1552.     CALL    ILPRT
  1553.     DB    ' (',0
  1554.  
  1555.     CALL    DHXOUT
  1556.  
  1557.     CALL    ILPRT
  1558.     DB    'H)',CR,0
  1559.  
  1560.     MOV    A,L
  1561.     POP    H
  1562.  
  1563. RCVSQ:  MVI B,10         ;10 IN ORIG PROG
  1564.         CALL RECV
  1565.         JC RCVSTOT
  1566.  
  1567.     IF    CHEK
  1568.     CALL    RCVERR    ;FOR ERROR CHECK RS232
  1569.     JC    RCVDER
  1570.     ENDIF    ;CHEK
  1571.  
  1572.         CPI CAN         ;CHECK FOR CANCEL..
  1573.         JZ ABORT        ;..REQUEST FROM SENDER.
  1574.  
  1575.         CPI SOH
  1576.         JZ RCVSOH
  1577.         ORA A
  1578.         JZ RCVSQ
  1579.         CPI EOT
  1580.         STC
  1581.         RZ
  1582.         MOV B,A
  1583.         LDA VSEEFLG
  1584.         ORA A
  1585.         JZ RCVSEH
  1586.         LDA QFLG
  1587.         ORA A
  1588.         JZ RCVSERR
  1589.  
  1590. RCVSEH: CALL CRLF  
  1591.         MOV A,B
  1592.         CALL HEXO
  1593.  
  1594.         CALL ILPRT
  1595.         DB 'H RECEIVED, NOT (SOH) ++',CR,LF,0
  1596.  
  1597. RCVSERR:MVI B,1
  1598.         CALL RECV
  1599.         JNC RCVSERR
  1600.     LDA     CRCFLG    ;WB...REPEAT CRC REQUEST 
  1601.     ORA     A    ;     IN CASE SENDER WAS SLOW IN
  1602.     MVI     A,NAK    ;     GETTING STARTED.
  1603.     JNZ     RCVS1
  1604.     MVI     A,CRC
  1605. RCVS1:  CALL     SEND
  1606.  
  1607.         LDA ERRCT
  1608.         INR A
  1609.         STA ERRCT
  1610.         CPI ERRLIM
  1611.         JC RCVRPT
  1612.         LDA VSEEFLG
  1613.         ORA A
  1614.         JZ RCVCKQ
  1615.         LDA QFLG
  1616.         ORA A
  1617.         JZ RCVSABT
  1618.  
  1619. RCVCKQ: CALL CKQUIT
  1620.         JZ RCVSECT
  1621.  
  1622. RCVSABT:CALL CLOSFIL
  1623.  
  1624.         CALL ERXIT
  1625.         DB CR,LF,'++ UNABLE TO RECEIVE BLOCK...ABORTING ++',CR,LF,'$'
  1626.  
  1627. RCVSTOT:LDA VSEEFLG
  1628.         ORA A
  1629.         JZ RCVSPT
  1630.         LDA QFLG
  1631.         ORA A
  1632.         JZ RCVSERR
  1633.  
  1634. RCVSPT: CALL ILPRT
  1635.  
  1636.         DB CR,LF,'++ TIMEOUT...',0
  1637.  
  1638. RCVPRN: LDA ERRCT
  1639.         CALL HEXO
  1640.         CALL CRLF
  1641.         JMP RCVSERR
  1642.  
  1643. ;.COMMENT \
  1644. ;RCVERR: Checks for framing, overrun, and parity errors.
  1645. ;Parity errors cannot be detected unless the parity option
  1646. ;has been selected.
  1647. ;    1.  Error code (ERRCDE) was set in RECV routine.
  1648. ;    2.  ERRCDE=0 for no errors, ERRCDE<>0 for errors.
  1649. ;    3.  If there is an error this routine returns with
  1650. ;        carry flag set.
  1651. ;\
  1652.     IF    CHEK
  1653. RCVERR:    PUSH    PSW    ;SAVE CHAR TRANSMITTED
  1654.     LDA    ERRCDE    ;GET RECEIVE ERROR CODE
  1655.     ANA    A    ;IS IT ZERO?
  1656.     JZ    RCVER2    ;YES, NO RECEIVE ERROR
  1657.     POP    PSW    ;RESTORE CHAR TRANSMITTED
  1658.     STC        ;SET CARRY ON TO INDICATE AN ERROR
  1659.     RET
  1660.  
  1661. RCVER2: POP    PSW    ;RESTORE CHAR TRANSMITTED
  1662.     RET
  1663.  
  1664. ;RCVDER: Checks for a receive error and displays appropriate
  1665. ;error message. Then goes to RCVSERR to purge the line and
  1666. ;send a NAK.
  1667.  
  1668. RCVDER: LDA    VSEEFLG    ;VIEWING
  1669.     ORA    A    ;...MODE?
  1670.     JZ    RCVDEP ;YES,..PRT MSG
  1671.     LDA    QFLG    ;QUIET...
  1672.     ORA    A    ;...MODE?
  1673.     JZ    RCVSERR    ;YES, NO MSG
  1674.  
  1675. RCVDEP: CALL ILPRT
  1676.     DB    CR,LF,0
  1677.  
  1678.     LDA    ERRCDE    ;GET RECEIVE ERR CODE
  1679.     ANI    FRMER    ;WAS THERE A FRAMING ERROR?
  1680.     JZ    RCVDE2 ;NO, GO CHECK FOR OVERRUN
  1681.  
  1682.     CALL    ILPRT
  1683.     DB    '++ FRAMING ERROR...',0
  1684.  
  1685.     CALL    RCVDE5 ;PRINT # OF ERROR
  1686.  
  1687. RCVDE2: LDA    ERRCDE    ;GET RECEIVE ERR CODE
  1688.     ANI    ORUNER    ;WAS THERE AN OVERRUN
  1689.     JZ    RCVDE3 ;NO, GO CHECK FOR PARITY ERROR
  1690.  
  1691.     CALL    ILPRT
  1692.     DB    LF,'++ OVERRUN ERROR...',0
  1693.  
  1694.     CALL    RCVDE5
  1695.  
  1696. RCVDE3: LDA    ERRCDE    ;GET RECEIVE ERR CODE
  1697.     ANI    PARER    ;WAS THERE A PARITY ERROR?
  1698.     JZ    RCVDE4 ;NO, GO PURGE LINE
  1699.  
  1700.     CALL    ILPRT
  1701.     DB    LF,'++ PARITY ERROR...',0
  1702.     CALL    RCVDE5
  1703.  
  1704. RCVDE4: JMP    RCVSERR    ;GO PURGE LINE, SEND NAK
  1705.  
  1706. ;Display number of error, do a carriage return and line feed.
  1707.  
  1708. RCVDE5: LDA    ERRCT    ;GET ERROR NUMBER
  1709.     CALL    HEXO    ;DISPLAY IT
  1710.     CALL    CRLF    ;DO CR, LF
  1711.     RET
  1712.     ENDIF    ;CHEK
  1713.  
  1714.  
  1715. RCVSOH: MVI B,1
  1716.         CALL RECV
  1717.         JC RCVSTOT
  1718.  
  1719.     IF    CHEK
  1720.     CALL    RCVERR        ;RS232 ERROR CHECK
  1721.     JC    RCVDER
  1722.     ENDIF    ;CHEK
  1723.  
  1724.         MOV D,A
  1725.         MVI B,1
  1726.         CALL RECV
  1727.         JC RCVSTOT
  1728.  
  1729.     IF    CHEK
  1730.     CALL    RCVERR        ;RS232 ERROR CHECK
  1731.     JC    RCVDER
  1732.     ENDIF    ;CHEK
  1733.  
  1734.         CMA
  1735.         CMP D
  1736.         JZ RCVDATA
  1737.         LDA VSEEFLG
  1738.         ORA A
  1739.         JZ RCVBSE
  1740.         LDA QFLG
  1741.         ORA A
  1742.         JZ RCVSERR
  1743.  
  1744. RCVBSE: CALL ILPRT
  1745.  
  1746.         DB CR,LF,'++ BAD SECTOR NUMBER IN HEADER ++',CR,LF,0
  1747.         JMP RCVSERR
  1748.  
  1749. RCVDATA:MOV A,D
  1750.         STA RCVSNO
  1751.         MVI A,1
  1752.         STA DATAFLG
  1753.         MVI C,0
  1754.     CALL    CLRCRC    ;CLEAR CRC COUNTER
  1755.         LXI H,80H
  1756.  
  1757. RCVCHR: MVI B,1
  1758.         CALL RECV
  1759.         JC RCVSTOT
  1760.  
  1761.     IF    CHEK
  1762.     CALL    RCVERR        ;RS232 ERROR CHECK
  1763.     JC    RCVDER    
  1764.     ENDIF    ;CHEK
  1765.  
  1766.         MOV M,A
  1767.         INR L
  1768.         JNZ RCVCHR
  1769.     LDA    CRCFLG
  1770.     ORA    A
  1771.     JZ    RCVCRC
  1772.         MOV D,C
  1773.         XRA A
  1774.         STA DATAFLG
  1775.         MVI B,1
  1776.         CALL RECV
  1777.         JC RCVSTOT
  1778.  
  1779.     IF    CHEK
  1780.     CALL    RCVERR        ;RS232 ERROR CHECK
  1781.     JC    RCVDER
  1782.     ENDIF    ;CHEK
  1783.  
  1784.         CMP D
  1785.         JNZ RCVCERR
  1786.  
  1787. CHKSNM: LDA RCVSNO
  1788.         MOV B,A
  1789.         LDA SECTNO
  1790.         CMP B
  1791.         JZ RECVACK
  1792.         INR A
  1793.         CMP B
  1794.         JNZ ABORT
  1795.         RET
  1796.  
  1797. RCVCRC:    MVI    E,2    ;NUMBER OF CRC BYTES
  1798. RCVCR2:    MVI    B,1
  1799.     CALL    RECV
  1800.     JC    RCVSTOT
  1801.  
  1802.     IF    CHEK
  1803.     CALL    RCVERR        ;RS232 ERROR CHECK
  1804.     JC    RCVDER
  1805.     ENDIF    ;CHEK
  1806.  
  1807.     DCR    E
  1808.     JNZ    RCVCR2
  1809.     CALL    CHKCRC
  1810.     ORA    A
  1811.     JZ    CHKSNM
  1812.     LDA    VSEEFLG
  1813.     ORA    A
  1814.     JZ    RCVCRER
  1815.     LDA    QFLG
  1816.     ORA    A
  1817.     JZ    RCVSERR
  1818.  
  1819. RCVCRER:CALL    ILPRT
  1820.     DB    CR,LF,'++ CRC ERROR...',0
  1821.  
  1822.     JMP    RCVPRN    
  1823.  
  1824. RCVCERR:LDA VSEEFLG
  1825.         ORA A
  1826.         JZ RCVCPR
  1827.         LDA QFLG
  1828.         ORA A
  1829.         JZ RCVSERR
  1830.  
  1831. RCVCPR: CALL ILPRT
  1832.         DB CR,LF,'++ CHECKSUM ERROR...',0
  1833.  
  1834.         JMP RCVPRN
  1835.  
  1836. RECVACK:CALL SENDACK
  1837.         JMP RCVSECT
  1838.  
  1839. SENDACK:MVI A,ACK
  1840.         CALL SEND
  1841.         RET
  1842.  
  1843. SENDHDR:LDA QFLG
  1844.         ORA A
  1845.         JZ SENDHNM
  1846.  
  1847.         CALL ILPRT
  1848.         DB '   SENDING SECTOR...',0
  1849.  
  1850.     PUSH    H
  1851.     LHLD    SECTNO
  1852.     CALL    DECOUT
  1853.  
  1854.     CALL    ILPRT
  1855.     DB    ' (0',0
  1856.  
  1857.     CALL    DHXOUT
  1858.  
  1859.     CALL    ILPRT
  1860.     DB    'H)',CR,0
  1861.  
  1862.     POP    H
  1863.  
  1864. SENDHNM:MVI A,SOH
  1865.         CALL SEND
  1866.         LDA SECTNO
  1867.         CALL SEND
  1868.         LDA SECTNO
  1869.         CMA
  1870.         CALL SEND
  1871.         RET
  1872.  
  1873. SENDSEC:MVI A,1
  1874.         STA DATAFLG
  1875.         MVI C,0
  1876.     CALL    CLRCRC
  1877.         LXI H,80H
  1878.  
  1879. SENDC:  MOV A,M
  1880.         CALL SEND
  1881.         INR L
  1882.         JNZ SENDC
  1883.         XRA A
  1884.         STA DATAFLG
  1885.         RET
  1886.  
  1887. SENDCKS:MOV A,C
  1888.         CALL SEND
  1889.         RET
  1890.  
  1891. SNDCRC:    CALL    FINCRC
  1892.     MOV    A,D
  1893.     CALL    SEND
  1894.     MOV    A,E
  1895.     CALL    SEND
  1896.     XRA    A
  1897.     RET
  1898.  
  1899. GETACK: MVI  B,10
  1900.         CALL RECVDG
  1901.         JC GETATOT
  1902.         CPI ACK
  1903.         RZ
  1904.      MOV B,A
  1905.      ANI 7FH        
  1906.         CPI CAN
  1907.         JZ ABORT
  1908.         LDA QFLG
  1909.         ORA A
  1910.         JZ ACKERR
  1911.         CALL CRLF
  1912.         MOV A,B
  1913.         CALL HEXO
  1914.  
  1915.         CALL ILPRT
  1916.         DB 'H RECEIVED...NOT (ACK) ++',CR,LF,0
  1917.  
  1918. ACKERR: LDA ERRCT
  1919.         INR A
  1920.         STA ERRCT
  1921.         CPI ERRLIM
  1922.         RC
  1923.  
  1924. ;REACHED ERROR LIMIT
  1925.  
  1926.         LDA VSEEFLG
  1927.         ORA A
  1928.         JZ GACKV
  1929.         LDA QFLG
  1930.         ORA A
  1931.         JZ CSABORT
  1932.  
  1933. GACKV:  CALL CKQUIT
  1934.         STC
  1935.         RZ
  1936.  
  1937. CSABORT:CALL ERXIT
  1938.         DB CR,LF,'++ CAN''T SEND SECTOR...ABORTING ++',CR,LF,'$'
  1939.  
  1940. GETATOT:LDA QFLG
  1941.         ORA A
  1942.         JZ ACKERR
  1943.         CALL ILPRT
  1944.  
  1945.         DB CR,LF,'++ TIMEOUT ON (ACK) ++',CR,LF,0
  1946.  
  1947.         JMP ACKERR
  1948.  
  1949. CKABORT:
  1950. CKABGO: CALL STAT
  1951.         RZ
  1952.         CALL KEYIN
  1953.         CPI CAN
  1954.         RNZ
  1955.  
  1956. ABORT:  LXI SP,STACK
  1957.  
  1958. ABORTL: MVI B,1
  1959.         CALL RECV
  1960.         JNC ABORTL
  1961.         MVI A,CAN
  1962.         CALL SEND
  1963.  
  1964. ABORTW: MVI B,1
  1965.         CALL RECV
  1966.         JNC ABORTW
  1967.         MVI A,' '
  1968.         CALL SEND
  1969.         CALL ILPRT
  1970.  
  1971.         DB CR,LF,'++ ROUTINE CANCELLED ++',CR,LF,BELL,0
  1972.  
  1973.         MVI A,'B'               ;TURN MULTI-FILE MODE..
  1974.         STA BATCHFLG            ;..OFF SO ROUTINE ENDS.
  1975.         JMP DNTCE
  1976.  
  1977. INCRSNO:PUSH    H
  1978.     LHLD    SECTNO
  1979.     INX    H
  1980.     SHLD    SECTNO
  1981.     MOV    A,L
  1982.     POP    H
  1983.     RET
  1984.  
  1985. ;ERASE A FILE FROM DISK, MENU MODE
  1986.  
  1987. KILFIL:    MVI    A,TRUE
  1988.     STA    NFLFLG
  1989.     CMA
  1990.     STA    SAVFLG
  1991.     LDA FCB+1
  1992.     CPI ' '
  1993.     JZ  BLKFILE
  1994.     LXI D,FCB
  1995.     MVI C,SRCHF
  1996.     CALL BDOS
  1997.     INR A
  1998.     JNZ KILFL2
  1999.  
  2000.     CALL ILPRT
  2001.         DB CR,LF,'++ FILE DOES NOT EXIST ++',CR,LF,0
  2002.     JMP XPRT
  2003.  
  2004. KILFL2: LXI D,FCB
  2005.     MVI C,ERASE
  2006.     CALL BDOS
  2007.     JMP XPRT
  2008.  
  2009. ERASFIL:LDA BATCHFLG            ;DON'T ASK FOR ERASE..
  2010.         ORA A                   ;..IN MULTI-FILE MODE,..
  2011.         JZ NOASK                ;..JUST DO IT.
  2012.         LXI D,FCB
  2013.         MVI C,SRCHF
  2014.         CALL BDOS
  2015.         INR A
  2016.         RZ
  2017.  
  2018.         CALL ILPRT
  2019.         DB LF,'++ FILES EXISTS, TYPE ''Y'' TO ERASE...',BELL,0
  2020.  
  2021.         CALL KEYIN
  2022.         PUSH PSW
  2023.         CALL TYPE
  2024.         POP PSW
  2025.         CALL UCASE
  2026.         CPI 'Y'
  2027.         JNZ MENU
  2028.         CALL CRLF
  2029.  
  2030. NOASK:  LXI D,FCB
  2031.         MVI C,ERASE
  2032.         CALL BDOS
  2033.         RET
  2034.  
  2035. BLKFILE:CALL ILPRT      ;ROUTINE IF NO FILE IS NAMED FOR
  2036.                         ; "SEND" OR "RECEIVE"
  2037.  
  2038.         DB CR,LF,'++ NO FILE SPECIFIED ++',CR,LF,BELL,0
  2039.  
  2040.     LXI  B,0FFFFH
  2041. DELAY:    DCX  B
  2042.     MOV  A,B
  2043.     ORA  C
  2044.     JNZ  DELAY
  2045.         JMP MENU
  2046.  
  2047. MAKEFIL:LXI D,FCB
  2048.         MVI C,MAKE
  2049.         CALL BDOS
  2050.         INR A
  2051.         RNZ
  2052.  
  2053.         CALL ERXIT
  2054.         DB CR,LF,'++ CAN''T MAKE FILE...DIRECTORY FULL ++',CR,LF,'$'
  2055.  
  2056.     IF    CPM2        ;IFNB    <CPM2+>
  2057. CNREC:    MVI    C,FILSIZ    ;COMPUTE FILE SIZE FUNC IN CP/M 2.x
  2058.     LXI    D,FCB        ;POINT TO FILE CONTROL BLOCK
  2059.     CALL    BDOS
  2060.     LHLD    FCB+33        ;GET RECORD COUNT
  2061.     SHLD    RCNT        ;STORE IT
  2062.     LXI    H,0        ;ZERO HL
  2063.     SHLD    FCB+33        ;RESET RANDOM RECORD IN FCB
  2064.     RET
  2065.     ENDIF    ;CPM2+
  2066.  
  2067.     IF NOT    CPM2
  2068. CNREC:    MVI    A,'?'    ;MATCH ALL EXTENTS
  2069.     STA    FCBEXT
  2070.     MVI    A,0FFH
  2071.     STA    MAXEXT    ;INIT MAX EXT NO.
  2072.     MVI    C,SRCHF    ;GET 'SEARCH FIRST' FNC
  2073.     LXI    D,FCB
  2074.     CALL    BDOS    ;READ FIRST
  2075.     INR    A    ;WERE THERE ANY?
  2076.     JNZ    SOME    ;GOT SOME
  2077.  
  2078.     CALL    ERXIT
  2079.     DB    CR,LF,'++ FILE NOT FOUND ++',CR,LF,'$'
  2080.  
  2081. ;READ MORE DIRECTORY ENTRIES
  2082.  
  2083. MOREDIR:MVI    C,SRCHN    ;SEARCH NEXT
  2084.     LXI    D,FCB
  2085.     CALL    BDOS    ;READ DIR ENTRY
  2086.     INR    A    ;CHECK FOR END (0FFH)
  2087.     JNZ    SOME    ;NOT END OF DIR...PROCESS EXTENT
  2088.     LDA    MAXEXT    ;HIT END...GET HIGHEST EXTENT NO. SEEN
  2089.     MOV    L,A    ;WHICH GIVES EXTENT COUNT -1
  2090.     MVI    H,0
  2091.     MOV    D,H
  2092.     LDA    RCNT    ;GET RECORD COUNT OF MAX EXTENT SEEN
  2093.     MOV    E,A    ;SAVE IT IN DE
  2094.     DAD    H
  2095.     DAD    H    ;MULTIPLY # OF EXTENTS -1
  2096.     DAD    H    ; TIMES 128
  2097.     DAD    H
  2098.     DAD    H
  2099.     DAD    H
  2100.     DAD    H
  2101.     DAD    D    ;ADD IN SIZE OF LAST EXTENT
  2102.     SHLD    RCNT    ;SAVE TOTAL RECORD COUNT
  2103.     RET        ;AND EXIT
  2104.  
  2105. ;POINT TO DIRECTORY ENTRY
  2106.  
  2107. SOME:    DCR    A    ;UNDO PREV 'INR A'
  2108.     ANI    3    ;MAKE MODULUS 4
  2109.     ADD    A    ;MULTIPLY...
  2110.     ADD    A    ;..BY 32 BECAUSE
  2111.     ADD    A    ;..EACH DIRECTORY
  2112.     ADD    A    ;..ENTRY IS 32
  2113.     ADD    A    ;..BYTES LONG
  2114.     LXI    H,80H ;POINT TO BUFFER
  2115.     ADD    L    ;POINT TO ENTRY
  2116.     ADI    15    ;OFFSET TO RECORD COUNT
  2117.     MOV    L,A    ;HL NOW POINTS TO REC COUNT
  2118.     MOV    B,M    ;GET RECORD COUNT
  2119.     DCX    H
  2120.     DCX    H    ;BACK DOWN TO EXTENT NUMBER
  2121.     DCX    H
  2122.     LDA    MAXEXT    ;COMPARE WITH CURRENT MAX.
  2123.     ORA    A    ;IF NO MAX YET
  2124.     JM    BIGGER    ;THEN SAVE RECORD COUNT ANYWAY
  2125.     CMP    M
  2126.     JNC    MOREDIR
  2127. BIGGER:    MOV    A,B    ;SAVE NEW RECORD COUNT
  2128.     STA    RCNT
  2129.     MOV    A,M    ;SAVE NEW MAX. EXTENT NO.
  2130.     STA    MAXEXT
  2131.     JMP    MOREDIR    ;GO FIND MORE EXTENTS
  2132.     ENDIF    ;NOT CPM2+
  2133.  
  2134. OPENFIL:LXI D,FCB
  2135.         MVI C,OPEN
  2136.         CALL BDOS
  2137.         INR A
  2138.         JNZ OPENOK
  2139.  
  2140.         CALL ERXIT
  2141.         DB CR,LF,'++ CAN''T OPEN FILE...NOT FOUND ON DISK ++',CR,LF,'$'
  2142.  
  2143. OPENOK: LDA BATCHFLG
  2144.         ORA A
  2145.         JNZ OPNOK1
  2146.         LDA QFLG
  2147.         ORA A
  2148.         RZ
  2149.  
  2150. OPNOK1:CALL ILPRT
  2151.         DB CR,LF,'++ FILE OPEN...SIZE: ',0
  2152.  
  2153.     LHLD    RCNT    ;RECORD COUNT
  2154.     CALL    DECOUT    ;PRINT SECTORS IN DECIMAL
  2155.  
  2156.     CALL    ILPRT
  2157.     DB    ' (',0
  2158.  
  2159.     CALL    DHXOUT
  2160.  
  2161.     CALL    ILPRT
  2162.     DB    'H) SECTORS',CR,LF,0
  2163.  
  2164.     RET
  2165.  
  2166. CLOSFIL:LXI D,FCB
  2167.         MVI C,CLOSE
  2168.         CALL BDOS
  2169.         INR A
  2170.         RNZ
  2171.  
  2172.         CALL ERXIT
  2173.         DB CR,LF,'++ CAN''T CLOSE FILE...NOT FOUND ON DISK ++',CR,LF,'$'
  2174.  
  2175. RDSECT: LDA SECINBF
  2176.         DCR A
  2177.         STA SECINBF
  2178.         JM RDBLOCK
  2179.         LHLD SECPTR
  2180.         LXI D,80H
  2181.         CALL MOVE128
  2182.         SHLD SECPTR
  2183.         RET
  2184.  
  2185. RDBLOCK:LDA EOFLG
  2186.         CPI 1
  2187.         STC
  2188.         RZ
  2189.         MVI C,0
  2190.         LXI D,DBUF
  2191.  
  2192. RDSECLP:PUSH B
  2193.         PUSH D
  2194.         MVI C,STDMA
  2195.         CALL BDOS
  2196.         LXI D,FCB
  2197.         MVI C,READ
  2198.         CALL BDOS
  2199.         POP D
  2200.         POP B
  2201.         ORA A
  2202.         JZ RDSECOK
  2203.         DCR A
  2204.         JZ REOF
  2205.  
  2206.         CALL ERXIT
  2207.         DB CR,LF,'++ READ ERROR...END OF FILE ++',CR,LF,'$'
  2208.  
  2209. RDSECOK:LXI H,80H
  2210.         DAD D
  2211.         XCHG
  2212.         INR C
  2213.         MOV A,C
  2214.     CPI    DBFSIZ*8    ;BUFFER IN 128 BYTE SECTORS
  2215.         JZ RDBFULL
  2216.         JMP RDSECLP
  2217.  
  2218. REOF:   MVI A,1
  2219.         STA EOFLG
  2220.         MOV A,C
  2221.  
  2222. RDBFULL:STA SECINBF
  2223.         LXI H,DBUF
  2224.         SHLD SECPTR
  2225.         LXI D,80H
  2226.         MVI C,STDMA
  2227.         CALL BDOS
  2228.         JMP RDSECT
  2229.  
  2230. WRSECT: LHLD SECPTR
  2231.         XCHG
  2232.         LXI H,80H
  2233.         CALL MOVE128
  2234.         XCHG
  2235.         SHLD SECPTR
  2236.         LDA SECINBF
  2237.         INR A
  2238.         STA SECINBF
  2239.     CPI    DBFSIZ*8    ;BUFFER IN 128 BYTE SECTORS
  2240.         RNZ
  2241.  
  2242. WRBLOCK:LDA SECINBF
  2243.         ORA A
  2244.         RZ
  2245.         MOV C,A
  2246.         LXI D,DBUF
  2247.  
  2248. DKWRLP: PUSH H
  2249.         PUSH D
  2250.         PUSH B
  2251.         MVI C,STDMA
  2252.         CALL BDOS
  2253.         LXI D,FCB
  2254.         MVI C,WRITE
  2255.         CALL BDOS
  2256.         POP B
  2257.         POP D
  2258.         POP H
  2259.         ORA A
  2260.         JNZ WRERR
  2261.         LXI H,80H
  2262.         DAD D
  2263.         XCHG
  2264.         DCR C
  2265.         JNZ DKWRLP
  2266.         XRA A
  2267.         STA SECINBF
  2268.         LXI H,DBUF
  2269.         SHLD SECPTR
  2270.         RET
  2271.  
  2272. WRERR:  MVI C,CAN
  2273.         CALL SEND
  2274.  
  2275.         CALL ERXIT
  2276.         DB CR,LF,'++ WRITE ERROR...DISK FULL ++',CR,LF,'$'
  2277.  
  2278. RECVDG  EQU $
  2279.     CALL INDATP
  2280.     CALL INDATP
  2281.  
  2282. RECV:   PUSH D
  2283.  
  2284.     LDA FASCLK    ;DOUBLE UP THE LOOP COUNTER IF
  2285.     ORA A        ;4 MZ OR GREATER
  2286.     JZ MSEC
  2287.     MOV A,B
  2288.     ADD A
  2289.     MOV B,A
  2290.  
  2291. MSEC:   LXI D,15000             ;60% OF ORIG 50000
  2292.     CALL CKABORT
  2293.  
  2294. MWTI:   CALL INCTLP
  2295.         CALL ANRCVB
  2296.         CALL CPRCVR
  2297.         JZ MCHAR
  2298.         DCR E
  2299.         JNZ MWTI
  2300.         DCR D
  2301.         JNZ MWTI
  2302.         DCR B
  2303.         JNZ MSEC
  2304.         POP D
  2305.         STC
  2306.         RET
  2307.  
  2308.     IF    CHEK
  2309. MCHAR:    CALL INDATP
  2310.     ANI  ERRCDMSK
  2311.     STA  ERRCDE
  2312.  
  2313.     ELSE
  2314. MCHAR:  CALL INDATP
  2315.     ENDIF    ;CHEK
  2316.  
  2317.     POP D
  2318.         PUSH PSW
  2319.     CALL    UPDCRC    ;CALCULATE CRC
  2320.         ADD C
  2321.         MOV C,A
  2322.         LDA RSEEFLG
  2323.         ORA A
  2324.         JZ MONIN
  2325.         LDA VSEEFLG
  2326.         ORA A
  2327.         JNZ NOMONIN
  2328.         LDA DATAFLG
  2329.         ORA A
  2330.         JZ NOMONIN
  2331.  
  2332. MONIN:  POP PSW
  2333.         PUSH PSW
  2334.         CALL SHOW
  2335.  
  2336. NOMONIN:POP PSW
  2337.         ORA A
  2338.         RET
  2339.  
  2340. SEND:   PUSH PSW
  2341.         LDA SSEEFLG
  2342.         ORA A
  2343.         JZ MONOUT
  2344.         LDA VSEEFLG
  2345.         ORA A
  2346.         JNZ NOMONOT
  2347.         LDA DATAFLG
  2348.         ORA A
  2349.         JZ NOMONOT
  2350.  
  2351. MONOUT: POP PSW
  2352.         PUSH PSW
  2353.         CALL SHOW
  2354.  
  2355. NOMONOT:POP PSW
  2356.         PUSH PSW
  2357.     CALL    UPDCRC    ;CALCULATE CRC
  2358.         ADD C
  2359.         MOV C,A
  2360.  
  2361. SENDW:  CALL OTCTLP
  2362.         CALL ANSNDB
  2363.         CALL CPSNDR
  2364.         JNZ SENDW
  2365.         POP PSW
  2366.         CALL OTDATP
  2367.         RET
  2368.  
  2369. WAITNAK:LDA VSEEFLG
  2370.         ORA A
  2371.         JZ WAITNPR
  2372.         LDA QFLG
  2373.         ORA A
  2374.         JZ WAITNLP
  2375.  
  2376. WAITNPR:CALL ILPRT
  2377.         DB CR,LF,'++ AWAITING INITIAL (NAK) ++',CR,LF,0
  2378.  
  2379. WAITNLP:CALL CKABORT
  2380.         MVI B,1
  2381.         CALL RECV
  2382.         CPI NAK
  2383.         RZ
  2384.     CPI    CRC
  2385.     JZ    WAITCRC
  2386.         DCR E
  2387.         JZ ABORT
  2388.         JMP WAITNLP
  2389.  
  2390. WAITCRC:CALL    ILPRT
  2391. DB    CR,LF,'++ (CRC) REQUEST RECEIVED ++',CR,LF,BELL,0
  2392.  
  2393.     XRA    A
  2394.     STA    CRCFLG
  2395.     RET
  2396.  
  2397. INITDR:
  2398.         LHLD 1
  2399.         LXI D,3
  2400.         DAD D
  2401.         SHLD VSTAT+1
  2402.         DAD D
  2403.         SHLD VKEYIN+1
  2404.         DAD D
  2405.         SHLD VTYPE+1
  2406.     DAD D
  2407.     SHLD VLISTD+1
  2408.  
  2409.     IF    INLZE        ;ENTER WHATEVER OTHER
  2410.     MVI    A,INITC1    ;INIT. ROUTINES ARE REQUIRED
  2411.     OUT    MOCTLP
  2412.     MVI    A,INITC2
  2413.     OUT    MOCTLP
  2414.     ENDIF    ;INLZE
  2415.  
  2416.     RET
  2417.  
  2418. PROCOPT:LXI D,FCB+1
  2419.         LDAX D
  2420.         STA OPTION
  2421.  
  2422. OPTLP:  INX D
  2423.         LDAX D
  2424.         CPI ' '
  2425.         JZ ENDOPT
  2426.         LXI H,OPTBL
  2427.         MVI B,OPTBE-OPTBL
  2428.  
  2429. OPTCK:  CMP M
  2430.         JNZ OPTNO
  2431.         MVI M,0
  2432.         JMP OPTLP
  2433.  
  2434. OPTNO:  INX H
  2435.         DCR B
  2436.         JNZ OPTCK
  2437.         JMP BADOPT
  2438.  
  2439. ENDOPT:    LDA    CRCFLG
  2440.     ORA    A
  2441.     JNZ    ENDOP1
  2442.     LDA    OPTION
  2443.     CPI    'R'
  2444.     JNZ    BADOPT    ;CRC ONLY ALLOWED IN RECEIVE MODE
  2445.  
  2446. ; the following code added to smodem 3.7 to allow user to
  2447. ; specify answer or originate mode and go-online by smodem
  2448. ; command rather than having to do so in terminal mode.
  2449.  
  2450. endop1:    lda    origflg    ;originate mode requested?
  2451.     ora    a
  2452.     jnz    endop3    ;no, go next option
  2453.     jmp    setmode
  2454.  
  2455. endop3:    lda    answflg    ;answer mode requested?
  2456.     ora    a
  2457.     jnz    endop2
  2458.  
  2459. ;assume we are in terminal mode, online, break into cmd mode
  2460.  
  2461. setmode:
  2462.     mvi    a,cr
  2463.     call    modout
  2464.     lxi    d,plus    ;'+++'
  2465.     call    setm1    ;send it to modem
  2466.     call    setm2    ;delay for smartmodem response
  2467.     lxi    d,atten    ;'AT '
  2468.     call    setm1
  2469.     lxi    d,zee    ;'Z' resets all smodem values
  2470.     call    setm1
  2471.     call    setm2
  2472.     lxi    d,atten
  2473.     call    setm1
  2474.  
  2475.     lda    origflg
  2476.     ora    a
  2477.     jnz    setm4
  2478.     lxi    d,r    ;'R' changes to originate mode
  2479.     call    setm1
  2480.     call    setm2
  2481.  
  2482. setm4:    lxi    d,atten
  2483.     call    setm1
  2484.     lxi    d,o    ;'O' goes offhook and waits carrier
  2485.     call    setm1
  2486.     jmp    endop2
  2487.  
  2488. setm1:    ldax    d    ;get a char
  2489.     cpi    '$'    ;end?
  2490.     rz        ;yes, do next
  2491.     call    modout
  2492.     inx    d    ;bump pointer
  2493.     jmp    setm1    ;and loop
  2494.  
  2495. setm2:    mvi    b,15    ; 2 sec. delay for smartmodem response
  2496. setm3:    call    timer
  2497.     dcr    b
  2498.     jnz    setm3
  2499.  
  2500. atten:    db    'AT $'
  2501. zee:    db    'Z',cr,'$'
  2502. o:    db    'O',cr,'$'
  2503. r:    db    'R',cr,'$'
  2504. plus:    db    '+++$'
  2505.  
  2506. ENDOP2: LDA VSEEFLG
  2507.         ORA A
  2508.         RNZ
  2509.         STA QFLG
  2510.         RET
  2511.  
  2512. DONE:   LDA BATCHFLG
  2513.         ORA A
  2514.         JNZ DNTCC
  2515.         LDA QFLG
  2516.         ORA A
  2517.         JZ NMSTRNS
  2518.         LXI H,FCB+1             ;PUT FILE NAME IN..
  2519.         LXI D,FTRNMSG           ;..SPACES IN MESSAGE..
  2520.         MVI B,8                 ;..BELOW.
  2521.         CALL MOVE
  2522.         INX D                   ;PUT FILE TYPE AFTER..
  2523.         MVI B,3                 ;..SKIPPING ONE SPACE..
  2524.         CALL MOVE               ;..BELOW.       
  2525.  
  2526.         CALL ILPRT
  2527. FTRNMSG:DB '              TRANSFERRED ++',CR,LF,0    ;13 SPACES
  2528.  
  2529. NMSTRNS:LDA FCB                 ;SAVE DRIVE NO.
  2530.         STA DISKNO
  2531.         LXI H,FCB               ;BLANK OUT FILE CONTROL BLOCKS
  2532.         CALL INITFCB
  2533.         LDA DISKNO              ;PUT DRIVE NUMBER BACK
  2534.         STA FCB
  2535.         LXI H,RESTSN            ;RESTORE SECTORE NUMBERS..
  2536.         LXI D,SECTNB           ;..FOR NEW FILE TRANSFER.
  2537.         MVI B,SECTNE-SECTNB   ;ROUTINE ALSO DONE IN MENU.
  2538.         CALL MOVE
  2539.         LDA SENDFLG             ;GOES TO EITHER SEND OR..
  2540.         ORA A                   ;..RECEIVE FILE, DEPENDING..
  2541.         JNZ SENDFIL             ;..UPON WHICH ROUTINE SET..
  2542.         JMP RCVFIL              ;..THE FLAG IN MULTI-FILE MODE.
  2543.  
  2544. DNTCC:    MVI A,TRUE              ;INDICATE NO FILES BEING..
  2545.         STA FSTFLG              ;RESET MULTIFILE TRANS
  2546.         STA NFLFLG             ;..USED IN TERMINAL ROUTINE.
  2547.         CMA
  2548.         STA SAVFLG             ;STOP MEM.SAVE IN TERM ROUTINE.
  2549.         LDA VSEEFLG
  2550.         ORA A
  2551.         JZ DONETC
  2552.         LDA QFLG
  2553.         ORA A
  2554.         JZ DNTCA
  2555.  
  2556. DONETC: CALL ILPRT
  2557.         DB CR,LF,'++ ALL TRANSFERS COMPLETED ++',CR,LF,BELL,0
  2558.  
  2559. DNTCA:    MVI    A,TRUE
  2560.     STA    NFLFLG
  2561.     CMA
  2562.     STA    SAVFLG
  2563.     LDA     DISCFLG         ;DISCONNECT WHEN THROUGH?
  2564.         ORA     A
  2565.         JNZ     DNTCE             ;...NO, CONT.
  2566.  
  2567. DNTCB:    CALL    ILPRT
  2568.         DB      CR,LF,'++ DISCONNECTED ++',CR,LF,0
  2569.  
  2570.     LXI D,80H        ;RESET DMA AND SEND '+++'
  2571.     MVI C,STDMA        ;...ESCAPE CODE TO SMARTMO.
  2572.     CALL BDOS
  2573.     LXI D,OFFHK
  2574. OFF1:    LDAX D
  2575.     CPI '$'
  2576.     JZ OFF2
  2577.     CALL MODOUT
  2578.     INX D
  2579.     JMP OFF1
  2580.  
  2581. OFF2:    CALL CRLF        ;C/R COMPLETES ESCAPE
  2582.     MVI B,15        ;2 SECOND DELAY FOR SMARTMO.
  2583. OFF3:    CALL TIMER        ;...TO RESPOND.
  2584.     DCR B
  2585.     JNZ OFF3
  2586.     INX D
  2587. OFF4:    LDAX D            ;SEND ON-HOOK COMMAND TOO
  2588.     CPI '$'
  2589.     JZ OFF5
  2590.     CALL MODOUT
  2591.     INX D
  2592.     JMP OFF4
  2593.  
  2594. OFF5:    CALL TIMER        ;SHORT DELAY AT THE END
  2595.     CALL INDATP        ;...TIDY UP
  2596.     JMP  TERM        ;...CLOSE UP SHOP.
  2597.  
  2598. DNTCE:  LDA TERMFLG             ;SEE IF RETURN TO..
  2599.         ORA A                   ;..TERMINAL MODE..
  2600.     JZ  TERM
  2601.     LDA ECHOFLG
  2602.     ORA A
  2603.         JNZ MENU                ;..AFTER X'FER.
  2604.         JMP TRMECHO
  2605.  
  2606. TIMER:    PUSH     PSW        ;TIME INTERVAL BETWEEN ESCAPE
  2607.     PUSH     B        ;CODE AND ON-HOOK COMMAND
  2608.     LXI     B,3500H        
  2609. TIMER2: DCX     B    
  2610.     MOV     A,B
  2611.     ORA     C
  2612.     JNZ     TIMER2
  2613.     POP     B
  2614.     POP     PSW
  2615.     RET
  2616.  
  2617. ;INITMOD:
  2618.  
  2619. MOVEFCB:LXI H,FCB+16
  2620.         LXI D,FCB
  2621.         MVI B,16
  2622.         CALL MOVE
  2623.         XRA A
  2624.         STA FCBSNO
  2625.         STA FCBEXT
  2626.         RET
  2627.  
  2628. SHOW:   CPI LF
  2629.         JZ CTYPE
  2630.         CPI CR
  2631.         JZ CTYPE
  2632.         CPI 9
  2633.         JZ CTYPE
  2634.         CPI ' '
  2635.         JC SHOWHEX
  2636.         CPI 7FH
  2637.         JC CTYPE
  2638.  
  2639. SHOWHEX:PUSH PSW
  2640.         MVI A,'('
  2641.         CALL CTYPE
  2642.         POP PSW
  2643.         CALL HEXO
  2644.         MVI A,')'
  2645.         JMP CTYPE
  2646.  
  2647. LISTDV: PUSH B
  2648.     PUSH D
  2649.     PUSH H
  2650.     MOV  C,A
  2651. VLISTD:    CALL $-$
  2652.     POP  H
  2653.     POP  D
  2654.     POP  B
  2655.     RET
  2656.  
  2657. CTYPE:  PUSH B
  2658.         PUSH D
  2659.         PUSH H
  2660.         MOV E,A
  2661.         MVI C,WRCON
  2662.         CALL BDOS
  2663.         POP H
  2664.         POP D
  2665.         POP B
  2666.         RET
  2667.  
  2668. CRLF:   PUSH PSW
  2669.         MVI A,CR
  2670.         CALL TYPE
  2671.         MVI A,LF
  2672.         CALL TYPE
  2673.         POP PSW
  2674.         RET
  2675.  
  2676. TYPE:   PUSH PSW
  2677.         PUSH B
  2678.         PUSH D
  2679.         PUSH H
  2680.         MOV C,A
  2681. VTYPE:  CALL $-$
  2682.         POP H
  2683.         POP D
  2684.         POP B
  2685.         POP PSW
  2686.         RET
  2687.  
  2688. STAT:   PUSH B
  2689.         PUSH D
  2690.         PUSH H
  2691. VSTAT:  CALL $-$
  2692.         POP H
  2693.         POP D
  2694.         POP B
  2695.         ORA A
  2696.         RET
  2697.  
  2698. KEYIN:  PUSH B
  2699.         PUSH D
  2700.         PUSH H
  2701. VKEYIN: CALL $-$
  2702.         POP H
  2703.         POP D
  2704.         POP B
  2705.         RET
  2706.  
  2707. UCASE:  CPI 61H         ;CHANGES LOWER CASE CHARACTER..
  2708.         RC              ;..IN A-REG TO UPPER CASE.
  2709.         CPI 7BH
  2710.         RNC
  2711.         ANI 5FH
  2712.         RET
  2713.  
  2714. DECOUT:    PUSH    PSW
  2715.     PUSH    B
  2716.     PUSH    D
  2717.     PUSH    H
  2718.     LXI    B,-10
  2719.     LXI    D,-1
  2720. DECOT2:    DAD    B
  2721.     INX    D
  2722.     JC    DECOT2
  2723.     LXI    B,10
  2724.     DAD    B
  2725.     XCHG
  2726.     MOV    A,H
  2727.     ORA    L
  2728.     CNZ    DECOUT
  2729.     MOV    A,E
  2730.     ADI    '0'
  2731.     CALL    CTYPE
  2732.     POP    H
  2733.     POP    D
  2734.     POP    B
  2735.     POP    PSW
  2736.     RET
  2737.  
  2738. DHXOUT:    PUSH    H
  2739.     PUSH    PSW
  2740.     MOV    A,H
  2741.     CALL    HEXO
  2742.     MOV    A,L
  2743.     CALL    HEXO
  2744.     POP    PSW
  2745.     POP    H
  2746.     RET
  2747.  
  2748. HEXO:   PUSH PSW
  2749.         RAR
  2750.         RAR
  2751.         RAR
  2752.         RAR
  2753.         CALL NIBBL
  2754.         POP PSW
  2755. NIBBL:  ANI 0FH
  2756.         CPI 10
  2757.         JC ISNUM
  2758.         ADI 7
  2759. ISNUM:  ADI '0'
  2760.         JMP TYPE
  2761.  
  2762. ;RETRNS W/ ZERO SET IF RETRY ASKED. IF MULTI-FILE MODE, THEN
  2763. ;NO QUESTIONS ASKED, JUST QUIT
  2764.  
  2765. CKQUIT: LDA BATCHFLG
  2766.         ORA A
  2767.         JNZ CKQTASK     ;ASK FOR RETRY
  2768.         INR A           ;RESET ZERO FLG
  2769.         RET
  2770. CKQTASK:XRA A
  2771.         STA ERRCT
  2772.  
  2773.         CALL ILPRT
  2774.         DB CR,LF,'++ MULTIPLE ERRORS ENCOUNTERED',CR,LF,LF
  2775.         DB '   ...TYPE ''Q'' TO QUIT',CR,LF
  2776.     DB '   ...TYPE ''R'' TO RETRY',CR,LF,LF
  2777.     DB '      COMMAND >>',BELL,0
  2778.  
  2779.         CALL KEYIN
  2780.         PUSH PSW
  2781.         CALL CRLF
  2782.         POP PSW
  2783.         CALL UCASE      ;INSTEAD OF "ANI 5FH"
  2784.         CPI 'R'
  2785.         RZ
  2786.         CPI 'Q'
  2787.         JNZ CKQUIT
  2788.         ORA A
  2789.         RET
  2790.  
  2791. ILPRT:  XTHL
  2792.  
  2793. ILPLP:  MOV A,M
  2794.         ORA A
  2795.         JZ ILPRET
  2796.         CALL CTYPE
  2797.         INX H
  2798.         JMP ILPLP
  2799. ILPRET: XTHL
  2800.         RET
  2801.  
  2802. PRTMSG: MVI C,PRINT
  2803.         JMP BDOS
  2804.  
  2805. ERXIT:  POP D
  2806.         CALL PRTMSG
  2807.  
  2808.         CALL ILPRT
  2809.         DB BELL,0
  2810.  
  2811.         LDA BATCHFLG
  2812.         ORA A
  2813.         JNZ DNTCE
  2814.         MVI A,'Q'               ;RESET QFLG
  2815.         STA QFLG
  2816.         JMP ABORT               ;ABORT OTHER COMPUTER
  2817.  
  2818. EXIT:   LXI D,80H
  2819.         MVI C,STDMA
  2820.         CALL BDOS
  2821.         JMP 0
  2822.  
  2823. MOVE128:MVI B,80H
  2824. MOVE:   MOV A,M
  2825.         STAX D
  2826.         INX H
  2827.         INX D
  2828.         DCR B
  2829.         JNZ MOVE
  2830.         RET
  2831.  
  2832.  
  2833. ;DIALING ROUTINE MODIFIED FOR HAYES SMART MODEM
  2834. ;
  2835.  
  2836. DIRNAM:    DB 'PHONE   001'
  2837. DILFLG:    DB FALSE
  2838.  
  2839. ;THIS ROUTINE CHECKS TO SEE IF A DIRECTORY LETTER OR A 
  2840. ;PHONE NUMBER WAS ENTERED IN THE COMMAND LINE.
  2841.  
  2842. DIALPL:    MVI    A,FALSE        ;CLEAR DEFAULT DIAL FLAG
  2843.     STA    DILFLG
  2844.     LXI     H,CMDBUF+1      ;POINT # OF CHARS IN BUFF
  2845.         MOV     A,M             ;GET # OF CHARS
  2846.         CPI     4               ;WAS A NUMBER OR LETTER ENTRD.?
  2847.         JC      ENTNM           ;NO, DISPLAY DIREC.& ASK
  2848.     SUI    3        ;REDUCE COUNT FOR 'CAL'
  2849.     MOV    M,A        ;PUT IT BACK
  2850.     MVI    A,TRUE        ;SET DEFAULT DIAL FLAG
  2851.     STA    DILFLG
  2852.         LXI     H,CMDBUF+5      ;POINT TO NUMBER TO DIAL
  2853. DI8:    MOV    A,M        ;GET CHAR.OR NUMBER
  2854.     CPI    32        ;SPACE?
  2855.     JNZ    DI9        ;...NO, 
  2856.     INX    H        ;BUMP THE CMDBUF UP,
  2857.     PUSH    H
  2858.     LXI    H,CMDBUF+1
  2859.     DCR    M        ;...AND THE CHAR.COUNTER DOWN.
  2860.     POP    H
  2861.     JZ    ERROR3        ;ERROR IF NO MORE CHARS.
  2862.     JMP    DI8        ;CHECK AGAIN
  2863. DI9:    CPI    48        ;LOWER THAN A NUMBER?
  2864.     JC    ERROR3        ;...YES, HOPP IT!
  2865.     CPI    58        ;IS IT A NUMBER?
  2866.     JC    DIALPX        ;...YES, DIAL DIRECT
  2867.     JMP    ENTM2        ;...NO, LOAD DEFAULT FILE '001'
  2868.  
  2869. ;ASKS FOR DIRECTORY NAME THEN MOVES IT TO THE FCB.
  2870.  
  2871. ENTNM:    CALL    ILPRT
  2872.     DB '++ ENTER DIRECTORY NAME >>',0
  2873.  
  2874.     LXI    D,CMDBUF    ;GET FILE NAME    
  2875.     CALL    INBUFF
  2876.     LDA    CMDBUF+2
  2877.     CPI    32        
  2878.     JZ    MENU        ;ZERO MEANS 'NO ENTRY MADE'
  2879.     LXI    H,FCB4
  2880.     CALL    INITFCB
  2881.     CALL    MOVE4
  2882.     JMP    DI1
  2883.  
  2884. ;LOAD THE DEFAULT FILE NAME FROM DEFAULT DRIVE
  2885.  
  2886. ENTM2:    PUSH    H
  2887.     LXI    H,FCB4
  2888.     CALL    INITFCB        ;INITIALIZE FCB
  2889.     LXI    D,FCB4+1
  2890.     LXI    H,DIRNAM
  2891.     MVI    B,11        ;COUNT
  2892.     CALL    MOVE        ;GET CHARS.IN 
  2893.     POP    H
  2894.  
  2895. ;THIS ROUTINE READS THE FILE TO THE DBUF
  2896.  
  2897. DI1:    PUSH    H
  2898.     CALL    OPEN4
  2899.     POP    H
  2900.     INR    A        ;OPEN OK?
  2901.     JZ    ERROR2        ;...NO, PRINT NO FILE.
  2902.     PUSH    H
  2903.     LXI    D,DBUF        ;SET DMA.
  2904. DI2:    PUSH    D
  2905.     MVI    C,STDMA
  2906.     CALL    BDOS
  2907.     CALL    READ80        ;128 BYTES SEQUENTIAL
  2908.     POP    D        ;ONCE MORE INTO THE BREACH
  2909.     LXI    H,128        ;LOAD DMA INCREMENT
  2910.     DAD    D        ;AND INCREMENT IN 'HL'
  2911.     XCHG            ;GIVE IT BACK TO 'DE'
  2912.     ORA    A        ;END OF FILE?
  2913.     JZ    DI2        ;...NO, CONT. 
  2914.     POP    H
  2915.     LDA    DILFLG        
  2916.     INR    A        ;DIRECT DIAL TO DEFAULT FILE?
  2917.     JZ    DIAL10        ;...YES, DON''T PRINT DIR.
  2918.  
  2919. ;THIS ROUTINE PRINTS THE DIRECTORY TO THE SCREEN
  2920.  
  2921.     CALL    ILPRT
  2922. DB FF
  2923. DB '                 *** PHONE DIRECTORY ***',CR,LF
  2924. DB '===============================================================',CR,LF,0
  2925.  
  2926.     MVI    C,PRINT        ;PRINT TO SCREEN
  2927.     LXI    D,DBUF        
  2928.     CALL    BDOS        
  2929.  
  2930. ;THIS ROUTINE ASKS FOR NUMBER TO DIAL
  2931.  
  2932. COMMD:    CALL ILPRT
  2933. DB '++ ENTER NUMBER/LETTER...C/R TO QUIT >>',0
  2934.  
  2935.     LXI     D,CMDBUF
  2936.         CALL     INBUFF
  2937.     CALL    CRLF
  2938.     LDA     CMDBUF+1    ;NO.OF CHARS.IN BUFFER
  2939.         ORA    A               ;NULL MEANS <CR> WAS TYPED
  2940.         JZ     MENU            ;ABORT DIALING, RETURN TO MENU
  2941.     LXI     H,CMDBUF+2    ;FIRST CHAR.OF NO.TO DIAL
  2942.  
  2943. ; ENTER THIS ROUTINE WITH HL POINTING TO DIAL LINE
  2944.  
  2945. DIAL10:    MOV    A,M        ;GET CHAR.OR NUMBER
  2946.     CPI    32        ;SPACE?
  2947.     JNZ    DI6        ;...NO, 
  2948.     INX    H        ;BUMP THE CMDBUF UP,
  2949.     PUSH    H
  2950.     LXI    H,CMDBUF+1
  2951.     DCR    M        ;...AND THE CHAR.COUNTER DOWN.
  2952.     POP    H
  2953.     JZ    ERROR4
  2954.     JMP    DIAL10        ;CHECK AGAIN
  2955.  
  2956.  
  2957. DI6:    CPI    48        ;LOWER THAN A NUMBER?
  2958.     JC    ERROR4
  2959.     CPI    58        ;IS IT A NUMBER?
  2960.     JC    DIALPX        ;...YES, DIAL DIRECT
  2961.     CPI    91        ;IS IT UPPER CASE?
  2962.     JC    DI3        ;...YES, GO POINT TO IT.
  2963.     SUI    6        ;READY FOR LOWER CASE
  2964.     CPI    117        ;IS IT LOWER CASE?
  2965.     JC    DI3        ;...YES, POINT.
  2966. DI5:    XRA    A        ;NO, MAKE NULL
  2967.     JMP    DILP2        ;PRINT ERROR MESSAGE
  2968. DI3:    SUI    64        ;MAKE INDEX NO.
  2969.     MOV    B,A        ;LOAD INDEX NUMBER
  2970.     LXI    H,DBUF        ;POINT TO START OF DBUF
  2971.     LXI    D,31        ;LOAD INCREMENT
  2972. DI4:    DCR    B        ;ARE WE THERE?
  2973.     JZ    DIAL13        ;...YES, DIAL IT.
  2974.     DAD    D        ;INCREMENT TO NEXT LINE
  2975.     JMP    DI4        ;DO AGAIN
  2976.  
  2977. DIAL13:    MVI     E,29            ;NO. OF CHAR TO GET FROM TABLE
  2978.         JMP     DIALP2        ;GO DIAL
  2979.  
  2980. DIALPX:    LDA    CMDBUF+1    ;LOAD CDMBUF COUNT
  2981.     MOV    E,A        ;...& PUT HERE
  2982.  
  2983. ;THIS ROUTINE SENDS THE PROPER DIALING INITIATION 
  2984. ;COMMANDS TO THE HAYES SMARTMODEM.  IT CAN BE CHANGED BY
  2985. ;ALTERING THE 'STYLE' OPTION AT THE BEGINNING OF THIS PRGM.
  2986.  
  2987. DIALP2:    PUSH     D
  2988.     MVI     A,CR
  2989.     CALL     MODOUT
  2990.     LXI     D,STYLE
  2991. ONW1:    LDAX     D
  2992.     CPI     '$'        ;SEND 'ATD' TO SMARTMODEM
  2993.     JZ     ONW2
  2994.     CALL     MODOUT
  2995.     INX     D
  2996.     JMP     ONW1
  2997. ONW2:    POP     D
  2998.  
  2999. ;DIAL DIGIT OR ABORT IF NULL ENCOUNTERED
  3000.  
  3001. DILP2:    MOV     A,M             ;GET FIRST # FROM BUFFER
  3002.     ORA     A               ;FAULTY DIRECTORY ENTRY?
  3003.     JZ    ERROR1        ;...YES, ABORT DIAL.
  3004.         CALL     DIAL            ;DIAL IT
  3005.         INX     H               ;BUMP POINTER
  3006.         DCR     E               ;COUNT DOWN CHARS IN BUFF
  3007.         JNZ     DILP2           ;NOT DONE, LOOP
  3008.         JMP     DIALDN          ;DIALING DONE
  3009.  
  3010.  
  3011. ;AUTO DIALER
  3012.  
  3013. DIAL:    CPI     48
  3014.         JC     DIA1            ;DIGIT MUST BE AT LEAST 0..
  3015.         CPI     58
  3016.         JNC     DIA1            ;..AND NOT MORE THAN 9
  3017.     CALL     MODOUT           ;NUMBERS PRINTED IN THIS ROUTINE
  3018.     RET
  3019. DIA1:    CALL     TYPE        ;PRINT ALL EXCEPT NUMBERS 
  3020.     RET
  3021.      
  3022. DIALDN:    CALL ILPRT
  3023. DB CR,LF,'++ DIAL COMPLETED...NOW IN TERMINAL MODE ++',CR,LF,BELL,0
  3024.  
  3025. ;ROUTINE TO SEND C/R TO SMARTMODEM AT END OF DIAL
  3026.  
  3027.     MVI     A,CR
  3028.     CALL     MODOUT        ;COMPLETE THE DIALING
  3029.     CALL     INDATP        ;GOBBLE GARBAGE
  3030.     CALL     INDATP
  3031.     MVI    C,STDMA
  3032.     LXI    D,80H
  3033.     CALL    BDOS        ;RESTORE ORIG.DMA
  3034.     MVI    A,TRUE
  3035.     STA    NFLFLG
  3036.     CMA
  3037.     STA    SAVFLG
  3038.     JMP      TERM
  3039.  
  3040. ERROR1:    CALL     ILPRT
  3041. DB CR,LF,'++ FAULTY NUMBER...INSPECT DIRECTORY ++',CR,LF,LF,0
  3042.     JMP    XPRT9
  3043.  
  3044. ERROR2:    CALL    ILPRT
  3045. DB CR,LF,'++ FILE DOSN''T EXIST ++',CR,LF,LF,0
  3046.     JMP    XPRT9
  3047.  
  3048. ERROR3:    CALL    ILPRT
  3049. DB CR,LF,'++ BAD NUMBER...CALL AGAIN ++',CR,LF,LF,0
  3050.     JMP    XPRT9
  3051.  
  3052. ERROR4:    CALL    ILPRT
  3053. DB CR,LF,'++ BAD NUMBER...TRY AGAIN ++',CR,LF,LF,0
  3054.     JMP    COMMD
  3055.  
  3056. ;INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH
  3057.  
  3058. SETFCB: LXI D,CMDBUF
  3059.         LXI H,FCB
  3060.         CALL CPMLINE
  3061.         CALL PROCOPT
  3062.  
  3063. CHECKNM:LDA FCB+1       ;CHECK ON THE PRIMARY OPTION
  3064.     CPI 'C'        ;RETURN IF AUTO DIALER OPTION
  3065.     RZ
  3066.         CPI 'E'         ;RETURN IF ECHO OPTION
  3067.         RZ
  3068.         CPI 'M'         ;RETURN TO MENU
  3069.         RZ
  3070.     CPI 'T'
  3071.         JZ TERMSEL
  3072.     CPI 'K'
  3073.     JZ CKFILE
  3074.         CPI 'S'
  3075.         JZ CKFILE
  3076.         CPI 'R'
  3077.         JNZ BDOPT
  3078.         LDA BATCHFLG    ;IF MULT FILE MODE, THEN..
  3079.         ORA A           ;..RECV OPT DOES NOT NEED..
  3080.         RZ              ;..NAME.
  3081.         JMP CKFILE
  3082. BDOPT:  CALL ILPRT
  3083.  
  3084.         DB CR,LF,'++ BAD OPTION ++',CR,LF,0
  3085.  
  3086.         JMP REENT
  3087. CKFILE: LDA FCB+17      ;IF OPTION THAT NEEDS FILE NAME,..
  3088.         CPI ' '         ;..THEN CHECK TO SEE IF NAME..
  3089.         RNZ             ;..EXISTS. IF NOT..
  3090. REENT:  CALL ILPRT      ;..DO EVERYTHING OVER.
  3091.  
  3092.         DB CR,LF,'++ RE-ENTER PRIMARY OPTION AND FILE NAME ONLY ',CR,LF,LF
  3093.     DB 'COMMAND >>',BELL,0
  3094.  
  3095.         LXI D,CMDBUF
  3096.         CALL INBUFF
  3097.         JMP SETFCB
  3098.  
  3099. TERMSEL:LDA FCB+17
  3100.         CPI ' '
  3101.         JNZ SAVAGN
  3102.         MVI A,FALSE
  3103.         STA SAVFLG
  3104.         MVI A,TRUE
  3105.         STA NFLFLG
  3106.         CMA
  3107.         RET
  3108. SAVAGN: MVI A,FALSE
  3109.         STA NFLFLG
  3110.         RET
  3111.  
  3112.  
  3113. ;.COMMENT \
  3114. ;CRCSUBS (Cyclic Redundancy Code Subroutines) version 1.20
  3115. ;These subroutines will compute and check a true 16-bit    
  3116. ;Cyclic Redundancy Code for a message of arbitrary length. 
  3117. ;The  use of this scheme will guarantee detection of all 
  3118. ;single and double bit errors, all  errors  with  an  odd 
  3119. ;number of error bits, all burst errors of length 16 or less, 
  3120. ;99.9969% of all 17-bit error bursts, and  99.9984% of all
  3121. ;possible longer  error bursts.  (Ref: Computer    Networks, 
  3122. ;Andrew S.Tanenbaum, Prentiss-Hall, 1981) Designed & coded by 
  3123. ;Paul Hansknecht, June 13, 1981 Copyright (c) 1981, Carpenter
  3124. ;Associates  Box 451 Bloomfield Hills, MI 48013    313/855-3074
  3125. ;This program may be freely reproduced for non-profit use.
  3126.  
  3127. ;\
  3128. ;    ENTRY    CLRCRC,UPDCRC,FINCRC,CHKCRC
  3129.  
  3130. CLRCRC    EQU    $    ; Reset CRC Accumulator for a new message.
  3131.     PUSH    H
  3132.     LXI    H,0
  3133.     SHLD    CRCVAL
  3134.     POP    H
  3135.     RET
  3136.  
  3137. UPDCRC    EQU    $   ; Update CRC Accumulator using byte in (A).
  3138.     PUSH    PSW
  3139.     PUSH    B
  3140.     PUSH    H
  3141.     MVI    B,8
  3142.     MOV    C,A
  3143.     LHLD    CRCVAL
  3144.  
  3145. UPDLOOP:MOV    A,C
  3146.     RLC
  3147.     MOV    C,A
  3148.     MOV    A,L
  3149.     RAL
  3150.     MOV    L,A
  3151.     MOV    A,H
  3152.     RAL
  3153.     MOV    H,A
  3154.     JNC    SKIPIT
  3155.     MOV    A,H    ; The generator is X^16 + X^12 + X^5 + 1
  3156.     XRI    10H    ; as recommended by CCITT.
  3157.     MOV    H,A    ; An alternate generator which is often
  3158.     MOV    A,L    ; used in synchr. transmission protocols
  3159.     XRI    21H    ; is X^16 + X^15 + X^2 + 1. This may be
  3160.     MOV    L,A    ; used by subst, XOR 80H for XOR 10H and
  3161. SKIPIT:    DCR    B      ; XOR 05H for XOR 21H in the adj, code.
  3162.     JNZ    UPDLOOP
  3163.     SHLD    CRCVAL
  3164.     POP    H
  3165.     POP    B
  3166.     POP    PSW
  3167.     RET
  3168.  
  3169. FINCRC    EQU    $      ; Finish CRC calc for outbound message.
  3170.     PUSH    PSW
  3171.     XRA    A
  3172.     CALL    UPDCRC
  3173.     CALL    UPDCRC
  3174.     PUSH    H
  3175.     LHLD    CRCVAL
  3176.     MOV    D,H
  3177.     MOV    E,L
  3178.     POP    H
  3179.     POP    PSW
  3180.     RET
  3181.  
  3182. CHKCRC    EQU    $    ; Check CRC bytes of received message.
  3183.     PUSH    H
  3184.     LHLD    CRCVAL
  3185.     MOV    A,H
  3186.     ORA    L
  3187.     POP    H
  3188.     RZ
  3189.     MVI    A,0FFH
  3190.     RET
  3191.  
  3192. CRCVAL:    DW    0
  3193.  
  3194. BADOPT: CALL ILPRT
  3195.     DB LF,'++ INVALID OPTION ++',CR,LF,BELL,0
  3196.  
  3197.     LXI B,0FFFFH
  3198. DELAY2: DCX B    
  3199.     MOV A,B
  3200.     ORA C
  3201.     JNZ DELAY2
  3202.  
  3203. MENU:   LXI H,RESTSN            ;RESTORE SECTORE NUMBERS..
  3204.         LXI D,SECTNB           ;..FOR NEW FILE TRANSFER.
  3205.         MVI B,SECTNE-SECTNB
  3206.         CALL MOVE
  3207.         LXI H,RESTROPT          ;RESTORE OPTION TABLE
  3208.         LXI D,OPTBL
  3209.         MVI B,OPTBE-OPTBL
  3210.         CALL MOVE
  3211.     XRA    A
  3212.         STA     MFFLG1         ;RESET MFACCESS ROUTINE..
  3213.     STA     LSTFLG
  3214.     STA     MACFLG
  3215.         CMA                    ;..AND MULTI TRANS IN CASE..
  3216.         STA     FSTFLG         ;..OF ABORT.
  3217.  
  3218. MENU1:  LDA XPRFLG              ;TEST IF MENU SHOULD BE SHOWN
  3219.         ORA A
  3220.         JNZ XPRT1
  3221.         CALL ILPRT
  3222.  
  3223. DB FF,CR    
  3224. DB 'COMMANDS - IN MENU MODE                   *** SMODEM3 *** ',CR,LF
  3225. DB '=======================',CR,LF
  3226. DB 'WRT  - Write informal file to disk',CR,LF
  3227. DB 'DEL  - Erase informal file from disk',CR,LF
  3228. DB 'DSC  - Disconnect phone (SMARTMODEM)',CR,LF
  3229. DB 'RET  - Return to terminal mode (no data loss)',CR,LF
  3230. DB 'CAL  - Auto dial from phone directory (SMARTMODEM)',CR,LF
  3231. DB 'XPR  - Expert mode (Toggle menu on/off)',CR,LF
  3232. DB 'DIR  - Disk directory <drive>',CR,LF
  3233. DB 'CPM  - Exit to CP/M',CR,LF
  3234. DB 'K    - Kill disk file [fn.ext]',CR,LF
  3235. DB 'S... - Send CP/M file [fn.ext]      SECONDARY OPTIONS',CR,LF
  3236. DB 'R... - Receive CP/M file [fn.ext]   =================',CR,LF
  3237. DB 'T    - Terminal mode <fn.ext>    ...B  - Batch file mode',CR,LF
  3238. DB 'E    - terminal mode with Echo   ...S  - show as Sent',CR,LF
  3239. DB '                                 ...R  - show as Received',CR,LF
  3240. DB 'COMMANDS - IN TERMINAL MODE      ...V  - View as sent/received',CR,LF
  3241. DB '===========================      ...Q  - Quiet, no messages',CR,LF
  3242. DB '^O   - Off line/return to menu   ...T  - return to Terminal mode',CR,LF
  3243. DB '^Z   - END of file               ...E  - return to Echo mode',CR,LF
  3244. DB '^S   - XOFF character            ...D  - Disconnect phone',CR,LF
  3245. DB '^Q   - XON character             ...C  - CRC check/not checksum',CR,LF
  3246. DB '^P   - Printer (toggle on/off)           (receive option only)',CR,LF
  3247. DB '^T   - Transmit informal file    ...A  - go offhk in Answer mode',CR,LF
  3248. DB '^R   - Receive informal file     ...O  - go offhk in Orig. mode',CR,LF
  3249. DB '^X   - Cancel send/receive',CR,LF
  3250. DB '^D   - Disconnect phone (SMARTMODEM)',CR,LF
  3251. DB '^E   - Terminal/Echo (toggle on/off)',CR,LF,0
  3252.  
  3253.     CALL ILPRT
  3254.     DB CR,LF,0
  3255.     JMP XPRT9
  3256.  
  3257. XPRT1:  CALL ILPRT
  3258.     DB FF,0
  3259.  
  3260. XPRT:   CALL ILPRT
  3261.         DB CR,LF,0
  3262.  
  3263. XPRT9:    MVI C,25        ;CURRENT DISK FUNCTION
  3264.         CALL BDOS
  3265.         ADI 41H         ;MAKE ASCII
  3266.         CALL TYPE
  3267.         CALL ILPRT
  3268.  
  3269.         DB ': PRIMARY OPTION >>',0
  3270.  
  3271. GETCMD: LXI D,CMDBUF            ;ENTER COMMAND
  3272.         CALL INBUFF
  3273.         CALL CRLF
  3274.         LXI D,CMDBUF+2          ;POINT TO COMMAND
  3275.  
  3276.     CALL ILCOMP
  3277.     DB 'DSC',0
  3278.     JNC DNTCB
  3279.  
  3280.         CALL ILCOMP
  3281.         DB 'CPM',0
  3282.         JNC EXIT
  3283.  
  3284.         CALL ILCOMP
  3285.         DB 'DIR',0
  3286.         JNC DIR
  3287.  
  3288.         CALL ILCOMP
  3289.         DB 'RET',0
  3290.         JC NXTOPT1              ;CARRY SET = NO MATCH
  3291.         LHLD HLSAVE             ;RETURN TO TERMINAL..
  3292.         JMP TERM                ;..MODE WITH SAVE OPTION..
  3293.                                 ;..IF PREVIOUSLY ENABLED.
  3294. NXTOPT1:CALL ILCOMP
  3295.         DB 'WRT',0
  3296.         JNC WRTFIL
  3297.  
  3298.         CALL ILCOMP
  3299.         DB 'XPR',0
  3300.         JNC XPRMODE
  3301.  
  3302.         CALL ILCOMP
  3303.         DB 'DEL',0
  3304.         JNC NEWFILE
  3305.  
  3306.     CALL ILCOMP
  3307.     DB 'CAL',0
  3308.     JNC DIALPL
  3309.  
  3310. NXTPT2: PUSH H
  3311.         LDA CMDBUF+2
  3312.         LXI H,COMPLIST
  3313.         CALL COMPARE        ;COMPARES LIST POINTED TO BY HL..
  3314.         POP H              ;..TO CHAR IN A-REG.
  3315.         JC MENU1           ;CARRY SET = NO MATCH
  3316.  
  3317. DOOPT:  PUSH H             ;LOAD ORIGINAL FCB WITH TRANSFER..
  3318.         CALL SETFCB        ;..CMDS AND GO TO BEGINNING OF..
  3319.         POP H              ;..PROGRAM. WILL FOLLOW SAME LOGIC..
  3320.         JMP RESTAR        ;..AS IF PROGRAM WERE CALLED WITH..
  3321.  
  3322. DIR:    CALL DIRLST
  3323.         JMP XPRT
  3324.  
  3325. NEWFILE:LDA FCB3+1
  3326.         CPI ' '
  3327.         JZ MENU1        ;IF NO FILE, DON'T ERASE
  3328.         LXI D,FCB3
  3329.         MVI C,ERASE
  3330.         CALL BDOSRT
  3331.         MVI A,TRUE      ;DO NOT ALLOW TERMINAL..
  3332.         STA NFLFLG     ;..SAVE SINCE NO FILE..
  3333.         CMA             ;..SPECIFIED.
  3334.         STA SAVFLG
  3335.         LXI H,FCB3
  3336.         CALL INITFCB
  3337.         JMP MENU1
  3338.  
  3339. WRTFIL: LDA NFLFLG
  3340.         CPI TRUE
  3341.         JZ MENU1
  3342.         LDA FCB3+1      ;CHECK THAT FILE WAS REQUESTED
  3343.         CPI ' '
  3344.         JZ MENU1
  3345.         LHLD HLSAVE
  3346.         CALL NMRECS    ;DISK WRITE ROUTINE AS USED IN..
  3347.         CALL WRTDSK     ;..IN THE INTDSSV ROUTINE.
  3348.         CALL CLOSE3
  3349.         MVI A,TRUE
  3350.         STA NFLFLG
  3351.         CMA
  3352.     STA MACFLG    ;RESET OBLECT FILE SAVE FLAG
  3353.         STA SAVFLG
  3354.         LXI H,FCB3
  3355.         CALL INITFCB   ;BLANK OUT FCB SO WRITTEN FILE..
  3356.         JMP MENU1       ;..CAN'T BE ERASED.
  3357.  
  3358. XPRMODE:LDA XPRFLG
  3359.         CMA
  3360.         STA XPRFLG
  3361.         JMP MENU1
  3362.  
  3363.  
  3364. COMPARE:MOV B,M         ;COMPARES A-REG WITH LIST..
  3365. COMPLP: INX H           ;..ADDRESSED BY HL. FIRST ELEMENT..
  3366.         CMP M           ;..OF LIST MUST BE NUMBER OF ELEMENTS..
  3367.         JZ VALID        ;..BEING COMPARED. RETRNS WITH..
  3368.         DCR B           ;..CARRY SET IF A-REG DOES NOT..
  3369.         JNZ COMPLP      ;.. CONTAIN AN ELEMENT IN LIST.
  3370.         STC
  3371. VALID:  RET
  3372.  
  3373. COMPLIST:DB 5, 'S', 'R', 'T', 'E', 'K' 
  3374.  
  3375.  
  3376. ILCOMP: XTHL            ;POINT HL TO 1ST CHAR.
  3377.         PUSH D
  3378. ILCMPL: MOV A,M         ;HL POINTS TO IN-LINE STRING.
  3379.         ORA A           ;END OF STRING IF ZERO.
  3380.         JZ SAME
  3381.         LDAX D
  3382.         CMP M
  3383.         JNZ NOTSAME
  3384.         INX H
  3385.         INX D
  3386.         JMP ILCMPL
  3387. NOTSAME:MVI A,0         ;IF NOT SAME, FINISH THRU..
  3388. NSLP:   INX H           ;..STRING SO RETURN WILL..
  3389.         CMP M           ;..GO TO INSTRUCTION AFTER..
  3390.         JNZ NSLP        ;..STRING AND NOT REMAINDER OF STRING.
  3391.         STC
  3392. SAME:   POP D
  3393.         INX H           ;AVOIDS A NOP INSTRUCTION..
  3394.         XTHL            ;..WHEN RETURNING.
  3395.         RET
  3396.  
  3397.  
  3398. INBUFF: PUSH PSW
  3399.         PUSH H
  3400.         PUSH B
  3401.         PUSH D          ;DE REGISTERS MUST BE PUSHED LAST
  3402. STRT:   CALL CLEAR      ;CLEAR THE BUFFER AREA
  3403.         POP D           ;GET ADDRESS OF BUFFER ON RETRIES
  3404.         PUSH D          ;RESTORE STACK
  3405.         XRA A
  3406.         INX D           ;ADDRESS COUNT FIELD
  3407.         STAX D          ;INITIALIZE WITH A ZERO IN COUNT BYTE
  3408.         INX D
  3409.         XCHG            ;ADDRESS FIRST BUFFER BYTE WITH HL
  3410.  
  3411. INBUFA: CALL CONIN
  3412.         CPI 0DH         ;IS IT A RETURN?
  3413.         JZ INBUFR       ;IF SO, THEN RETURN
  3414.         CPI 7FH         ;IS IT A DELETE?
  3415.         JZ DELETE
  3416.         CPI 8           ;CTRL-H WILL BACKSPACE..
  3417.         JZ DELETE       ;..OVER DELETED CHAR.
  3418.         CPI 'U'-40H     ;IS IT A CTRL-U
  3419.         JZ INBUFO       ;OUTPUT # CR LF AND START OVER
  3420.         CPI 'R'-40H     ;CTRL-R RETYPES LINE
  3421.         JZ RETYPE
  3422.         CPI 'E'-40H
  3423.         JZ PCRLF
  3424.         CPI 20H         ;NO CONTROL CHARACTERS OTHER..
  3425.         JC INBUFA       ;..THAN ABOVE ALLOWED.
  3426.         MOV B,A         ;SAVE INPUTTED CHARACTER
  3427.         XCHG            ;SAVE HL IN DE
  3428.         POP H           ;GET ADDRESS OF BUFFER IN HL
  3429.         PUSH H          ;RESTORE STACK
  3430.         INX H           ;ADDRESS COUNT BYTE
  3431.         INR M           ;INCREASE COUNT BYTE
  3432.         DCX H           ;ADDRESS MAXIMUM
  3433.         MOV A,M         ;PUT MAXIMUM IN A
  3434.         INX H           ;ADDRESS COUNT
  3435.         CMP M           ;COMPARE COUNT TO MAXIMUM
  3436.         JC ALERT        ;IF MAXIMUM, RING BELL AND WAIT FOR CR
  3437.         XCHG            ;RESTORE BUFFER POINTER TO HL
  3438.         MOV M,B         ;PUT INPUTTED CHARACTER IN BUFFER
  3439.         MOV A,B         ;OUTPUT IT
  3440.         CALL CONOUT
  3441.         INX H           ;BUMP POINTER
  3442.         JMP INBUFA      ;GET NEXT CHARACTER
  3443.  
  3444. DELETE: XCHG            ;SAVE BUFFER POINTER IN DE
  3445.         POP H           ;ADDRESS BEGINNING OF BUFFER
  3446.         PUSH H          ;RESTORE STACK
  3447.         INX H           ;ADDRESS COUNT FIELD
  3448.         MOV B,A         ;SAVE DELETE CHAR - 7FH OR 08H
  3449.         MOV A,M
  3450.         SUI 1           ;DECREASE COUNT
  3451.         MOV M,A
  3452.         JC NODEL        ;DON'T DELETE PAST BEGINING OF BUFFER.
  3453.         XCHG            ;RESTORE BUFFER POINTER TO HL
  3454.         DCX H           ;POINT TO LAST BYTE INPUTTED
  3455.         MOV A,B         ;GET BACK EITHER 7FH OR 08H
  3456.         MOV B,M         ;GET CHARACTER BEING DELETED
  3457.         MVI M,20H       ;RESTORE BLANK
  3458.         CPI 08H
  3459.         JZ BKSPC
  3460.         MOV A,B         ;ECHO CHAR IF 7FH
  3461.         CALL CONOUT
  3462.         JMP INBUFA      ;GET NEXT CHARACTER
  3463. NODEL:  INR M           ;DON'T LEAVE COUNT NEGATIVE
  3464.         XCHG            ;RESTORE POINTER TO HL
  3465.         JMP INBUFA
  3466. BKSPC:  CALL CONOUT     ;TRUE ERASE IF 08H
  3467.         MVI A,20H
  3468.         CALL CONOUT
  3469.         MVI A,08
  3470.         CALL CONOUT
  3471.         JMP INBUFA
  3472.  
  3473. INBUFO: MVI A,'#'
  3474.         CALL CONOUT
  3475.         MVI A,0DH
  3476.         CALL CONOUT
  3477.         MVI A,0AH
  3478.         CALL CONOUT
  3479.         JMP STRT
  3480.  
  3481. RETYPE: POP D
  3482.         PUSH D
  3483.         INX D           ;POINT TO CURRENT NUMBER..
  3484.         LDAX D          ;..OF CHARACTERS.
  3485.         MOV B,A
  3486.         MVI A,'#'
  3487.         CALL CONOUT
  3488.         MVI A,0DH
  3489.         CALL CONOUT
  3490.         MVI A,0AH
  3491.         CALL CONOUT
  3492.         MOV A,B         ;TEST IF ZERO INPUT
  3493.         ORA A
  3494.         JZ INBUFA
  3495. CTLRLP: INX D
  3496.         LDAX D
  3497.         CALL CONOUT
  3498.         DCR B
  3499.         JNZ CTLRLP
  3500.         JMP INBUFA
  3501.         
  3502. ALERT:  MVI A,7
  3503.         CALL CONOUT
  3504.         DCR M
  3505.         XCHG
  3506.         JMP INBUFA
  3507.  
  3508. PCRLF:  MVI A,0DH
  3509.         CALL CONOUT
  3510.         MVI A,0AH
  3511.         CALL CONOUT
  3512.         JMP INBUFA
  3513.  
  3514. INBUFR: MVI A,0DH
  3515.         CALL CONOUT
  3516.         MVI A,0AH
  3517.         CALL CONOUT
  3518.         POP D
  3519.         POP B
  3520.         POP H
  3521.         POP PSW
  3522.         RET
  3523.  
  3524. CLEAR:  POP D           ;ACCOUNTS FOR CALL
  3525.         POP H           ;ADDRESS BUFFER IN HL
  3526.         PUSH H          ;RESTORE..
  3527.         PUSH D          ;..STACK
  3528.         MOV B,M         ;SAVE MAXIMUM IN B
  3529.         INX H           ;POINT TO FIRST..
  3530.         INX H           ;..BUFFER BYTE.
  3531.         MVI A,20H
  3532. CLEARL: MOV M,A
  3533.         INX H
  3534.         DCR B
  3535.         JNZ CLEARL
  3536.         RET
  3537.  
  3538. CONIN:  PUSH H 
  3539.     PUSH D 
  3540.     PUSH B
  3541. CONINLP:CALL CONSTAT
  3542.         ORA A
  3543.         JZ CONINLP
  3544.     CALL CONIN1
  3545.  
  3546. ;IF YOU WISH ALL COMMANDS GOING TO THE BUFFER TO BE CONVERTED
  3547. ;TO UPPER CASE THEN RE-INITIALIZE THE FOLLOWING CODE, BUT
  3548. ;THE AUTO-DIAL ROUTINES AND PHONE DIRECTORY FORMAT WILL HAVE
  3549. ;TO BE CHANGED AS WELL.
  3550.  
  3551. ;        CPI 61H         ;CHANGE TO UPPER..
  3552. ;        JC NOUCASE      ;..CASE SINCE CP/M..
  3553. ;        CPI 7BH         ;..DOES THE SAME.
  3554. ;        JNC NOUCASE
  3555. ;        ANI 5FH
  3556.  
  3557. NOUCASE:POP B 
  3558.     POP D 
  3559.     POP H
  3560.         RET
  3561. CONIN1: LHLD 1
  3562.         LXI D,6
  3563.         DAD D
  3564.         PCHL
  3565.  
  3566. CONSTAT:PUSH H 
  3567.     PUSH D 
  3568.     PUSH B
  3569.         CALL CONST1
  3570.         POP B 
  3571.     POP D 
  3572.     POP H
  3573.         RET
  3574.  
  3575. CONST1: LHLD 1
  3576.         LXI D,3
  3577.         DAD D
  3578.         PCHL
  3579.  
  3580. CONOUT: PUSH H 
  3581.     PUSH D 
  3582.     PUSH B 
  3583.     PUSH PSW
  3584.         CALL CONOT1
  3585.         POP PSW 
  3586.     POP B 
  3587.     POP D 
  3588.     POP H
  3589.         RET
  3590.  
  3591. CONOT1: LHLD 1
  3592.         LXI D,9
  3593.         DAD D
  3594.         MOV C,A
  3595.         PCHL
  3596.  
  3597. CPMLINE:PUSH PSW
  3598.         PUSH B
  3599.         PUSH D
  3600.         PUSH H
  3601.  
  3602.         CALL INIT       ;FILLS FCBS WITH BLANKS AND NULLS
  3603.  
  3604.         XCHG            ;GET START OF COMMAND LINE IN HL.
  3605.         INX H           ;ADDRESS # BYTES IN CMD LINE.
  3606.         MOV E,M         ;LOAD DE PAIR WITH # BYTES.
  3607.         MVI D,0
  3608.         INX H
  3609.         DAD D           ;POINT TO BYTE AFTER LAST CHAR..
  3610.         MVI M,0DH       ;..IN CMD LINE AND STORE DELIMITER.
  3611.         POP H           ;RESTORE HL AND DE.
  3612.         POP D
  3613.         PUSH D
  3614.         PUSH H
  3615.         INX D           ;ADDRESS START OF COMMAND.
  3616.         INX D
  3617.  
  3618.         CALL DRIV
  3619.  
  3620. NAME1:  MVI C,8         ;TRANSFER FIRST FILENAME TO FCB.
  3621.         CALL TRANS
  3622.         CPI 0DH
  3623.         JZ DONE2
  3624.         CPI 20H         ;IF SPACE, THEN START OF..
  3625.         JZ NAME2        ;..SECOND FILENAME.
  3626.  
  3627. TYPE1:  POP H           ;FILETYPE MUST BE AFTER..
  3628.         PUSH H          ;..EIGHTH BYTE OF NAME.
  3629.         LXI B,9
  3630.         DAD B
  3631.         MVI C,3         ;TRANSFER TYPE OF FIRST FILE
  3632.         CALL TRANS
  3633.         CPI 0DH
  3634.         JZ DONE2
  3635.  
  3636. NAME2:  LDAX D          ;EAT MULTIPLE SPACES..
  3637.         CPI 20H         ;..BETWEEN NAMES.
  3638.         JNZ NAME2C
  3639.         INX D
  3640.         JMP NAME2
  3641.         LDAX D
  3642.         CPI 0DH         ;TEST IF FIRST NAME..
  3643.         JZ DONE2         ;..ONLY AND THEN SPACE.
  3644.  
  3645. NAME2C: POP H           ;SECOND NAME STARTS IN 16TH BYTE.
  3646.         PUSH H          ;POINT HL TO THIS BYTE.
  3647.         LXI B,16
  3648.         DAD B
  3649.         CALL DRIV
  3650.         MVI C,8
  3651.         CALL TRANS
  3652.         CPI 0DH
  3653.         JZ DONE2
  3654.  
  3655. TYPE2:  POP H           ;SECOND TYPE STARTS IN 25TH BYTE.
  3656.         PUSH H
  3657.         LXI B,25
  3658.         DAD B
  3659.         MVI C,3
  3660.         CALL TRANS
  3661.  
  3662. DONE2:  POP H
  3663.         PUSH H
  3664.         INX H       ;POINT TO FIRST CHAR OF FIRST NAME IN FCB.
  3665.         CALL SCANM   ;CHECK FOR * (AMBIGUOUS NAMES).
  3666.         POP H
  3667.         PUSH H
  3668.         LXI B,17    ;POINT TO FIRST CHAR OF SECOND NAME IN FCB.
  3669.         DAD B
  3670.         CALL SCANM
  3671.         POP H
  3672.         POP D
  3673.         POP B
  3674.         POP PSW
  3675.         RET
  3676.  
  3677. INIT:   PUSH H  ;INITIALIZES FCB WITH 1 NULL (FOR FIRST DRIV).
  3678.         PUSH B  ;..11 BLANKS, 4 NULLS, 1 NULL (FOR 2ND DRIV),.
  3679.         MVI M,0         ;..11 BLANKS, AND 4 NULLS.
  3680.         INX H
  3681.         MVI B,11
  3682.         MVI A,20H
  3683.         CALL INTFIL
  3684.         MVI B,5
  3685.         MVI A,0
  3686.         CALL INTFIL
  3687.         MVI B,11
  3688.         MVI A,20H
  3689.         CALL INTFIL
  3690.         MVI B,4
  3691.         MVI A,0
  3692.         CALL INTFIL
  3693.         POP B
  3694.         POP H
  3695.         RET
  3696.  
  3697. INTFIL: MOV M,A
  3698.         INX H
  3699.         DCR B
  3700.         JNZ INTFIL
  3701.         RET
  3702.  
  3703. DRIV:   INX D           ;CHECK 2ND BYTE OF FILENAME. IF IT..
  3704.         LDAX D          ;..IS A ":", THEN DRIV WAS SPECIFIED.
  3705.         DCX D
  3706.         CPI ':'
  3707.         JNZ DEFDR ;ELSE ZERO DEFAULT DRIV ('INIT' PUT ZERO)
  3708.         LDAX D
  3709.         ANI 5FH
  3710.         SUI 40H         ;CALCULATE DRIV (A=1, B=2,...)..
  3711.         MOV M,A         ;..AND PLACE IT IN FCB.
  3712.         INX D           ;ADDRESS FIRST BYTE OF..
  3713.         INX D           ;..IN CMD LINE,..
  3714. DEFDR:  INX H           ;..AND NAME FIELD IN FCB.
  3715.         RET
  3716.  
  3717. TRANS:  LDAX D          ;TRANSFER FROM CMD LINE TO FCB..
  3718.         INX D           ;..UP TO NUMBER OF CHARS SPECIFIED..
  3719.         CPI 0DH         ;..BY C-REG. KEEP SCANNING FIELD..
  3720.         RZ              ;..WITHOUT TRANSFER UNTIL DELIMITING..
  3721.         CPI '.'         ;..FIELD CHAR SUCH AS '.', BLANK, OR..
  3722.         RZ              ;..C/R (FOR END OF CMD LINE).
  3723.         CPI 20H
  3724.         RZ
  3725.         DCR C
  3726.         JM TRANS  ;ONCE C-REG IS LESS THAN ZERO, KEEP READING..
  3727.         MOV M,A         ;..CMD LINE BUT DO NOT TRANSFER TO FCB.
  3728.         INX H
  3729.         JMP TRANS
  3730.  
  3731. SCANM:  MVI B,8         ;SCAN FILE NAME ADDRESSED BY HL.
  3732. TSTNAM: MOV A,M
  3733.         CPI '*'         ;IF '*' FOUND, FILL IN REST OF FIELD..
  3734.         JZ FILL1        ;..WITH '?' FOR AMBIGUOUS NAME.
  3735.         INX H
  3736.         DCR B
  3737.         JNZ TSTNAM
  3738.         JMP TSTTYP
  3739. FILL1:  CALL FILL
  3740.  
  3741. TSTTYP: MVI B,3         ;SCAN AND FILL TYPE FIELD FOR NAME..
  3742. TSTYPL: MOV A,M         ;..SPECIFIED ABOVE.
  3743.         CPI '*'
  3744.         JZ FILL2
  3745.         INX H
  3746.         DCR B
  3747.         RZ
  3748.         JMP TSTYPL
  3749. FILL2:  CALL FILL
  3750.         RET
  3751.  
  3752. FILL:   MVI M,'?'       ;ROUTINE TRANSFERS '?'.
  3753.         INX H
  3754.         DCR B
  3755.         JNZ FILL
  3756.         RET
  3757.  
  3758.  
  3759. DIRLST: LXI D,CMDBUF    ;PUT COMMAND LINE IN FCB
  3760.         LXI H,5CH
  3761.         CALL CPMLINE
  3762.         LXI H,SRCHFCB
  3763.         CALL INITFCB
  3764.         LDA 6CH         ;GET DRIVE #
  3765.         STA SRCHFCB
  3766.         LDA 6DH
  3767.         CPI 20H         ;IF BLANK GET ALL NAMES
  3768.         PUSH PSW
  3769.         CZ QSTMARK
  3770.         POP PSW
  3771.         CNZ MVNM    ;ELSE MOVE NAME INTO FCB
  3772.         CALL DRIVE
  3773.         LXI D,80H
  3774.         MVI C,STDMA
  3775.         CALL BDOS
  3776.         XRA A
  3777.         STA NAMCT      ;CR AFTER 4 NAMES
  3778.         LXI D,SRCHFCB
  3779.         MVI C,SRCHF     ;DO FIRST SEARCH
  3780.         CALL BDOS
  3781.         CPI 0FFH
  3782.         JZ NOFILE
  3783.  
  3784. DIRLP:  CALL GETADD
  3785.         LXI D,15        ;OFFSET FOR RECORD COUNT
  3786.         DAD D
  3787.         MOV A,M
  3788.         ORA A
  3789.         JZ NEXTSR       ;NO LIST IF FILE IS ZERO LENGTH
  3790.         LXI D,-5
  3791.         DAD D           ;POINT TO $SYS ATTRIB BYTE
  3792.         MOV A,M
  3793.         ANI 80H
  3794.         JNZ NEXTSR      ;NO LIST IF $SYS FILE
  3795.         LXI D,-10
  3796.         DAD D           ;POINT TO BEGINNING OF NAME
  3797.         INX H           ;POINT TO FIRST LETTER
  3798.         LXI D,PRNTNM
  3799.         MVI B,8
  3800.         CALL MOVE
  3801.         INX D
  3802.         MVI B,3
  3803.         CALL MOVE
  3804.  
  3805.         CALL ILPRT
  3806. PRNTNM: DB '        ',' ','   ',  ' | ', 0   ;8,1,3 SPACES
  3807.  
  3808.         LDA NAMCT
  3809.         INR A
  3810.         STA NAMCT
  3811.         ANI 03H
  3812.         ORA A
  3813.         CZ CRLF
  3814. NEXTSR: LXI D,SRCHFCB
  3815.         MVI C,SRCHN     ;DO NEXT SEARCH
  3816.         CALL BDOS
  3817.         CPI 0FFH
  3818.         JZ DIRDONE
  3819.         JMP DIRLP
  3820.  
  3821. NOFILE: CALL ILPRT
  3822.         DB CR,LF,'++ FILE NOT FOUND ++',0
  3823.  
  3824. DIRDONE:CALL CRLF
  3825.         RET
  3826.  
  3827. QSTMARK:MVI A,'?'       ;IF BLANK IN FCB, PUT IN 11 ?'s
  3828.         MVI B,11
  3829.         LXI H,SRCHFCB+1
  3830. QSTLP:  MOV M,A
  3831.         INX H
  3832.         DCR B
  3833.         JNZ QSTLP
  3834.         RET
  3835.  
  3836. MVNM:   LXI H,6DH
  3837.         LXI D,SRCHFCB+1
  3838.         MVI B,11
  3839.         CALL MOVE               ;MOVE IN CP/M PROGRAM
  3840.         RET
  3841.  
  3842. GETADD: ANI 03H                 ;GET MOD4 FOR CP/M 1.4
  3843.         ADD A 
  3844.     ADD A 
  3845.     ADD A   ;ADD 32
  3846.         ADD A 
  3847.     ADD A
  3848.         MOV E,A
  3849.         MVI D,0
  3850.         LXI H,80H               ;ADD DMA OFFSET
  3851.         DAD D
  3852.         RET
  3853.  
  3854. DRIVE:  LDA SRCHFCB             ;IF NO DRIVE, CAL
  3855.         ORA A                   ;LOGGED IN DRIVE
  3856.         JZ CALCDR
  3857.         ADI 40H
  3858.         JMP PRNTHD
  3859. CALCDR: MVI C,25
  3860.         CALL BDOS
  3861.         ADI 41H
  3862. PRNTHD: STA DRNAME
  3863.  
  3864.         CALL ILPRT
  3865.         DB CR,LF,'DRIVE '
  3866. DRNAME: DB ' :',CR,LF,LF,0
  3867.         RET
  3868.  
  3869. SRCHFCB:DS 33
  3870. NAMCT:  DS 1
  3871.  
  3872.  
  3873. NFLFLG:DB FALSE      ;NORMALLY SET TO FALSE. ALLOWS WRITE TO..
  3874.                       ;..MEMORY IN TERMINAL MODE.
  3875.  
  3876. OPTION: DB 0
  3877.  
  3878. OPTBL   EQU $
  3879. ANSWFLG:DB 'A'
  3880. DISCFLG:DB 'D'
  3881. ORIGFLG:DB 'O'
  3882. QFLG:   DB 'Q'
  3883. RSEEFLG:DB 'R'
  3884. SSEEFLG:DB 'S'
  3885. VSEEFLG:DB 'V'
  3886. TERMFLG:DB 'T'
  3887. ECHOFLG:DB 'E'
  3888. CRCFLG: DB 'C'
  3889. BATCHFLG:DS 1   ;SET TO 'B' BY MENU. DOES NOT ALLOW MULTI-..
  3890. OPTBE   EQU $   ;..FILE XFER WHEN PROGRAM INITIALLY CALLED.
  3891.  
  3892. RESTROPT:       ;MUST BE IN SAME ORDER AS TABLE ABOVE
  3893.  
  3894.         DB 'A','D','O','Q','R','S','V','T','E','C','B'
  3895.  
  3896. RESTSN: DB 0,0,0,0,0,0
  3897.         DW DBUF
  3898.         DB 0,0,0,0,0,0
  3899.  
  3900. SECTNB  EQU $
  3901. RCVSNO: DB 0
  3902. SECTNO: DW 0
  3903. ERRCT:  DB 0
  3904. ERRCDE: DB 0
  3905. EOFLG:  DB 0
  3906. SECPTR: DW DBUF
  3907. SECINBF:DB 0
  3908. MAXEXT: DB 0
  3909. RCNT:    DW 0
  3910. DATAFLG:DB 0
  3911. EXACFL:    DB 0
  3912. SECTNE  EQU $
  3913.  
  3914. FSTFLG: DB TRUE
  3915.  
  3916. CMDBUF: DB 80H,0
  3917.         DS 80H
  3918.  
  3919. HLSAVE: DS 2
  3920. DISKNO: DS 1
  3921. SENDFLG:DS 1
  3922. NBSAVE: DS 2
  3923. BGNMS:  DS 2
  3924. FILECT: DS 1
  3925. NAMECT: DS 1
  3926.  
  3927.         DS 60
  3928. STACK:  DS 2
  3929. FCB3:   DS 33
  3930. FCBBUF: DS 15
  3931.  
  3932. DBUF    EQU $             ;DISK BUFFER...DBFSIZ SET AT 
  3933.                   ;BEGINNING
  3934. NAMEBUF EQU DBUF+(DBFSIZ*1024);BUFFER FOR NAMES IN BATCH MODE.
  3935.                   ;OVERFLOWS ABOVE PROGRAM CODE.
  3936. ;       BDOS EQUATES
  3937.  
  3938. RDCON   EQU 1
  3939. WRCON   EQU 2
  3940. PRINT   EQU 9
  3941. RDBUF   EQU 10
  3942. CONST   EQU 11
  3943. RESET    EQU 13
  3944. OPEN    EQU 15
  3945. CLOSE   EQU 16
  3946. SRCHF   EQU 17
  3947. SRCHN   EQU 18
  3948. ERASE   EQU 19
  3949. READ    EQU 20
  3950. WRITE   EQU 21
  3951. MAKE    EQU 22
  3952. REN     EQU 23
  3953. STDMA   EQU 26
  3954. FILSIZ    EQU 35
  3955. BDOS    EQU 5
  3956. REIPL   EQU 0
  3957. FCB     EQU 5CH
  3958. FCBEXT  EQU FCB+12
  3959. FCBSNO  EQU FCB+32
  3960. FCBRNO  EQU FCB+32
  3961. FCB2    EQU 6CH
  3962.  
  3963. END    
  3964.  
  3965.