home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol067 / smodem36.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  82.6 KB  |  3,892 lines

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