home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug033.arc / SMODEMK.MAC < prev    next >
Text File  |  1979-12-31  |  84KB  |  3,883 lines

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