home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol175 / sendrecv.a86 < prev    next >
Encoding:
Text File  |  1984-07-15  |  23.4 KB  |  1,345 lines

  1. ;
  2. ;        SENDRECV.A86
  3. ;
  4. ;Christensen protocol routines for MODEM9.xx.
  5. ;
  6. ;SEND A CP/M FILE
  7. ;
  8. SENDFIL:
  9.     MOV    CKSUMFLG,TRUE    ;ALWAYS FORCE CHECKSUM MODE INITIALLY ON SEND
  10.     CALL    CKMODM        ;REMOVE GARBAGE FROM LINE
  11. SENDFIL1:
  12.     TEST    BATCHFLG,0FFH    ;CHECK IF MULTIPLE FILE..
  13.     JNZ    SENDC1
  14.     CALL    ILPRT
  15.     DB    'Ready to send in the batch mode',CR,LF,0
  16.     MOV    SENDFLG,TRUE    ;INDICATE SEND FOR BATCH MODE
  17.     MOV    AL,FSTFLG    ;IF FIRST TIME THRU..
  18.     OR    AL,AL        ;..SCAN THE COMMAND LINE..
  19.     JZ    SENDFIL2
  20.     CALL    TNMBUF        ;..FOR MULTIPLE NAMES.
  21. SENDFIL2:
  22.     CALL    SENDFN        ;SENDS FILE NAME TO RECEIVER
  23.     JNC    SENDC2        ;CARRY SET MEANS NO MORE FILES.
  24.     MOV    BATCHFLG,'B'     ;STOP BATCH ....MODE OPTION.
  25.     MOV    AL,EOT        ;FINAL XFER END
  26.     CALL    SEND
  27.     JMP    DONE
  28. ;
  29. SENDC1:
  30.     CMP    BYTE PTR .FCB+1,' '
  31.     JNZ    SENDC2
  32.     JMP    BLKFILE
  33.  
  34. SENDC2:
  35.     CALL    CNREC        ;GET NUMBER OF RECORDS
  36.     CALL    OPENFIL
  37.     MOV    DL,80
  38.     CALL    WAITNAK
  39.  
  40. SENDLP:
  41.     CALL    CKABORT        ;WANT TO TERMINATE WHLE SENDING FILE?
  42.     CALL    RDSECT
  43.     JC    SENDEOF
  44.     CALL    INCRSNO
  45.     MOV    ERRCT,1
  46. SENDRPT:
  47.     CALL    CKABORT        ;WANT TO TERMINATE WHILE SENDING FILE?
  48.     CALL    SENDHDR
  49.     CALL    SENDSEC
  50.     MOV    AL,CKSUMFLG
  51.     OR    AL,AL
  52.     JNZ    SENDRPT1
  53.     CALL    SENDCRC
  54.     JMPS    SENDRPT2
  55.  
  56. SENDRPT1:
  57.     CALL    SENDCKS
  58. SENDRPT2:
  59.     CALL    GETACK
  60.     JC    SENDRPT
  61.     JMP    SENDLP
  62. ;
  63. SENDEOF:
  64.     MOV    AL,EOT
  65.     CALL    SEND
  66.     CALL    GETACK
  67.     JC    SENDEOF
  68.     JMP    DONE
  69. ;
  70. ;RECEIVE A FILE
  71. ;
  72. RCVFIL:
  73.     MOV    AL,CKSUMDFLT    ;GET MODE REQUESTED BY OPERATOR
  74.     MOV    CKSUMFLG,AL    ;STORE IT
  75.     CALL    CKMODM        ;CATCH ANY GARBAGE CHARACTERS
  76. RCVFIL1:
  77.     MOV    AL,BATCHFLG    ;CHECK IF MULT..
  78.     OR    AL,AL        ;..FILE MODE.
  79.     JNZ    RCVC1
  80.     MOV    AL,FALSE    ;FLAG WHERE TO RETURN..
  81.     MOV    SENDFLG,AL    ;..FOR NEXT FILE TRANS.
  82.     CALL    GETFN        ;GET THE FILE NAME.
  83.     JNC    RCVC2        ;CARRY SET MEANS NO MORE FILES.
  84.     MOV    AL,'B'        ;STOP BATCH..
  85.     MOV    BATCHFLG,AL     ;..MODE OPTION.
  86.     JMP    DONE
  87. ;
  88. RCVC1:
  89.     MOV    AL,BYTE PTR .FCB+1    ;MAKE SURE FILE IS NAMED
  90.     CMP    AL,' '
  91.     JNZ    RECV1A
  92.     JMP    BLKFILE
  93.  
  94. RECV1A:
  95.     JMP    RCVC3
  96. ;
  97. RCVC2:
  98.     CALL    CKCPM2
  99.     CALL    CKBAKUP
  100. RCVC3:
  101.     CALL    ERASFIL
  102.     CALL    MAKEFIL
  103.     MOV    AL,BATCHFLG    ;DON'T PRINT MSG IF IN BATCH
  104.     OR    AL,AL
  105.     JZ    RCVFST
  106.     CALL    ILPRTQ
  107.     DB    'File open, ready to receive',CR,LF,0
  108. RCVFST:
  109.     MOV    AL,CKSUMFLG
  110.     OR    AL,AL
  111.     MOV    AL,NAK
  112.     JNZ    RCVFIL2
  113.     MOV    AL,CRC
  114. RCVFIL2:
  115.     CALL    SEND
  116.     MOV    AL,CKSUMFLG
  117.     OR    AL,AL
  118.     JNZ    RCVNAKM        ;IF IN CRC MODE
  119.     CALL    ILPRTQ        ;THEN SAY SO
  120.     DB    'CRC in effect',CR,LF,0
  121.     JMP    RCVLP
  122.  
  123. RCVNAKM:
  124.     CALL    ILPRTQ        ;ELSE SAY CHECKSUM MODE
  125.     DB    'Checksum in effect',CR,LF,0
  126. RCVLP:
  127.     CALL    RCVSECT
  128.     JC    RCVEOT
  129.     CALL    WRSECT
  130.     CALL    INCRSNO
  131.     CALL    SENDACK
  132.     JMP    RCVLP
  133. ;
  134. RCVEOT:
  135.     CALL    WRBLOCK
  136.     CALL    SENDACK
  137.     CALL    CLOSFIL
  138.     JMP    DONE
  139. ;    
  140. ;SUBROUTINES
  141. ;
  142. SENDFN:
  143.     CALL    ILPRTQ
  144.     DB    'Awaiting name NAK',CR,LF,0
  145.     MOV    DL,80
  146.     CALL    WAITNLP
  147.     MOV    AL,ACK        ;GOT NAK, SEND ACK
  148.     CALL    SEND
  149.     MOV    BX,OFFSET FILECT
  150.     DEC    BYTE PTR [BX]
  151.     JS    NOMRNM
  152.     MOV    BX,NBSAVE    ;GET FILE NAME..
  153.     MOV    DX,OFFSET FCB    ;..IN FCB
  154.     MOV    CH,12
  155.     CALL    MOVE
  156.     MOV    NBSAVE,BX
  157.     CALL    SENDNM        ;SEND IT
  158.     OR    AL,AL        ;CLEAR CARRY
  159.     RET
  160. ;
  161. NOMRNM:
  162.     MOV    AL,EOT
  163.     CALL    SEND
  164.     STC
  165.     RET
  166. ;
  167. SENDNM:
  168.     PUSH    BX
  169. SENDNM1:
  170.     MOV    DH,11        ;COUNT CHARS IN NAME
  171.     MOV    CL,0        ;INIT CHECKSUM
  172.     MOV    AL,CL
  173.     MOV    FTYCNT,AL    ;INITIATE FILE TYPE COUNT
  174.     MOV    BX,OFFSET FCB+1    ;ADDRESS NAME
  175. NAMLPS:
  176.     MOV    AL,BYTE PTR [BX]    ;SEND NAME
  177.     AND    AL,07FH        ;STRIP HIGH ORDER BIT SO CP/M 2..
  178.     CALL    SEND        ;..WON'T SEND R/O FILE DESIGNATION.
  179.     MOV    AL,QFLG        ;SHOW NAME IF..
  180.     OR    AL,AL        ;..QFLG NOT SET.
  181.     MOV    AL,BYTE PTR [BX]
  182.     JZ    ACKLP
  183.     CALL    FTYTST        ;TYPE CHARACTER ETC.
  184. ACKLP:
  185.     PUSH    CX        ;SAVE CKSUM
  186.     MOV    CH,1        ;WAIT FOR RECEIVER..
  187.     CALL    RECV        ;..TO ACKNOWLEDGE..
  188.     POP    CX        ;..GETTING LETTER.
  189.     JC    SCKSER
  190.     CMP    AL,ACK
  191.     JNZ    ACKLP
  192.     INC    BX        ;NEXT CHAR
  193.     DEC    DH
  194.     JNZ    NAMLPS
  195.     MOV    AL,EOFCHAR    ;TELL RECEIVER END OF NAME
  196.     CALL    SEND
  197.     MOV    AL,QFLG
  198.     OR    AL,AL
  199.     JZ    ACKLP1
  200.     CALL    CRLF
  201. ACKLP1:
  202.     MOV    DH,CL        ;SAVE CHECKSUM
  203.     MOV    CH,1
  204.     CALL    RECV        ;GET CHECKSUM..
  205.     CMP    AL,DH        ;..FROM RECEIVER.
  206.     JZ    NAMEOK
  207. SCKSER:    MOV    AL,BDNMCH    ;BAD NAME-TELL RECEIVER
  208.     CALL    SEND
  209.     CALL    ILPRTQ
  210.     DB    'Checksum error',CR,LF,0
  211.     MOV    DL,80        ;DO HANDSHAKING OVER
  212.     CALL    WAITNLP        ;DON'T PRINT "AWAITING NAK" MSG
  213.     MOV    AL,ACK
  214.     CALL    SEND
  215.     JMP    SENDNM1
  216. ;
  217. NAMEOK:
  218.     MOV    AL,OKNMCH    ;GOOD NAME, TELL RECEIVER
  219.     CALL    SEND
  220.     POP    BX
  221.     RET    
  222. ;
  223. GETFN:    MOV    BX,OFFSET FCB
  224.     CALL    INITFCBS+2    ;DOES NOT INITIALIZE DRIVE
  225.     CALL    ILPRTQ
  226.     DB    'Awaiting file name',CR,LF,0
  227. GNAMELP:
  228.     CALL    HSNAK
  229.     CALL    GETNM        ;GET THE NAME
  230.     CMP    AL,EOT        ;IF EOT, THEN NO MORE FILES
  231.     JZ    NOMRNMG
  232.     OR    AL,AL        ;CLEAR CARRY
  233.     RET
  234. ;
  235. NOMRNMG:
  236.     STC
  237.     RET
  238. ;
  239. GETNM:
  240.     PUSH    BX
  241. GETNM1:
  242.     MOV    CL,0        ;INIT CHECKSUM
  243.     MOV    AL,CL
  244.     MOV    FTYCNT,AL    ;INITIATE COUNT FOR FILE TYPE
  245.     MOV    BX,OFFSET FCB+1
  246. NAMELPG:
  247.     MOV    CH,5
  248.     CALL    RECV        ;GET CHAR
  249.     JNC    GETNM3
  250.     CALL    ILPRTQ
  251.     DB    'Time out receiving filename',CR,LF,0
  252.     JMP    GCKSER
  253. ;
  254. GETNM3:
  255.     CMP    AL,EOT        ;IF EOT, THEN NO MORE FILES
  256.     JNZ    GETNM4
  257.     JMP    GNRET
  258.  
  259. GETNM4:
  260.     CMP    AL,EOFCHAR    ;GOT END OF NAME
  261.     JZ    ENDNAME
  262.     MOV    BYTE PTR [BX],AL    ;PUT NAME IN FCB
  263.     MOV    AL,QFLG        ;CAN TYPE IT IF NO QFLG
  264.     OR    AL,AL
  265.     JZ    SKPTYP
  266.     CALL    FTYTST
  267. SKPTYP:
  268.     PUSH    CX        ;SAVE CKSUM
  269.     MOV    AL,ACK        ;ACK GETTING LETTER
  270.     CALL    SEND
  271.     POP    CX
  272.     INC    BX        ;GET NEXT CHAR
  273.     MOV    AL,BL        ;DON'T LET NOISE...
  274.     CMP    AL,7FH        ;..CAUSE OVERFLOW..
  275.     JZ    GCKSER        ;..INTO PROGRAM AREA.
  276.     JMP    NAMELPG
  277. ;
  278. FTYTST:
  279.     INC    FTYCNT
  280.     CMP    FTYCNT,9    ; ARE WE AT THE FILE TYPE?
  281.     JZ    SPCTST        ;GO IF SO
  282. ENDSPT:
  283.     MOV    AL,BYTE PTR [BX]
  284.     CMP    AL,' '        ;TEST FOR SPACE
  285.     JZ    ENDSPT1
  286.     CALL    TIPE        ;TYPE IF NOT
  287. ENDSPT1:
  288.     RET
  289. ;
  290. SPCTST:
  291.     MOV    AL,BYTE PTR [BX]
  292.     CMP    AL,' '        ;TEST FOR SPACE IN FIRST FILE TYPE BYTE
  293.     JZ    ENDSPT1        ;DON'T OUTPUT PERIOD IF SPACE
  294.                 ; MJM 9.01.05 WAS JMPS
  295.     MOV    AL,'.'    
  296.     CALL    TIPE
  297.     JMP    ENDSPT        ;OUTPUT FIRST FILE TYPE BYTE
  298. ;
  299. ENDNAME:
  300.     MOV    AL,QFLG
  301.     OR    AL,AL
  302.     JZ    ENDNAME1
  303.     CALL    CRLF
  304. ENDNAME1:
  305.     MOV    AL,CL        ;SEND CHECKSUM
  306.     CALL    SEND
  307.     MOV    CH,1
  308.     CALL    RECV        ;CHECKSUM GOOD?
  309.     CMP    AL,OKNMCH    ;YES IF OKNMCH SENT..
  310.     JZ    GNRET        ;..ELSE DO OVER.
  311. GCKSER:
  312.     MOV    BX,OFFSET FCB    ;CLEAR FCB (EXCEPT DRIVE)..
  313.     CALL    INITFCBS+2     ;..SINCE IT MIGHT BE DAMAGED..
  314.     CALL    ILPRTQ
  315.     DB    CR,LF,'++ Checksum error ++',CR,LF,0
  316.     CALL    HSNAK        ;DO HANDSHAKING OVER
  317.     JMP    GETNM1
  318. ;
  319. GNRET:
  320.     POP    BX
  321.     RET
  322. ;
  323. HSNAK:
  324.     MOV    DL,180        ;3-MINUTE MAXIMUM WAIT FOR A FILE NAME
  325. HSNAK1:
  326.     CALL    CKABORT        ;WANT TO ABORT?
  327.     MOV    AL,NAK        ;SEND NAK UNTIL RECEIVING ACK
  328.     CALL    SEND
  329.     MOV    CH,1        ;WAIT UP TO 1 SECOND FOR A CHARACTER
  330.     CALL    RECV
  331.     CMP    AL,ACK        ;'ACK' IS WHAT WE WERE WAITING FOR
  332.     JNZ    HSNAK2
  333.     RET
  334.  
  335. HSNAK2:
  336.     DEC    DL        ;ONE LESS TO TRY
  337.     JNZ    HSNAK1
  338.     JMP    ABORT        ;TIMED OUT, ABORT BACK TO COMMAND LINE
  339. ;
  340. TNMBUF:
  341.     MOV    AL,FALSE    ;CALL FROM SENDFIL ONLY ONCE.
  342.     MOV    FSTFLG,AL
  343.     MOV    FILECT,AL
  344.     CALL    SCAN
  345.     MOV    BX,OFFSET NAMEBUF
  346.     MOV    NBSAVE,BX    ;SAVE ADDR OF 1ST NAME
  347. TNLP1:
  348.     CALL    TRTOBUF
  349.     MOV    BX,OFFSET FCB
  350.     MOV    DX,OFFSET FCBBUF
  351.     CALL    CPMLINE        ;PARSE NAME TO CP/M FORMAT
  352. TNLP2:
  353.     CALL    MFNAME        ;SEARCH FOR NAMES (* FORMAT)
  354.     JC    NEXTNM
  355.     MOV    AL,BYTE PTR .FCB+10    ;IF CP/M 2 $SYS FILE..
  356.     AND    AL,80H        ;..DON'T SEND
  357.     JNZ    TNLP2
  358.     MOV    BX,NBSAVE    ;GET NAME
  359.     MOV    DX,OFFSET FCB    ;MOVE IT TO FCB
  360.     XCHG    BX,DX
  361.     MOV    CH,12
  362.     CALL    MOVE
  363.     XCHG    BX,DX
  364.     MOV    NBSAVE,BX    ;ADDR OF NEXT NAME
  365.     MOV    BX,OFFSET FILECT    ;COUNT FILES FOUND
  366.     INC    BYTE PTR [BX]
  367.     JMP    TNLP2
  368. ;
  369. NEXTNM:
  370.     MOV    BX,OFFSET SNAMECT ;COUNT NAMES FOUND
  371.     DEC    BYTE PTR [BX]
  372.     JNZ    TNLP1
  373.     MOV    BX,OFFSET NAMEBUF  ;SAVE START OF BUFFER
  374.     MOV    NBSAVE,BX
  375.     MOV    AL,FILECT
  376.     CMP    AL,65        ;NO MORE THAN 64 TRANSFERS
  377.     JNC    NEXTNM1
  378.     RET
  379.  
  380. NEXTNM1:
  381.     MOV    AL,64    ;ONLY X'FER FIRST 64
  382.     MOV    FILECT,AL
  383.     RET
  384. ;
  385. ;SCANS CMDBUF COUNTING NAMES AND PUTTING DELIMITER (SPACE)
  386. ;AFTER LAST NAME
  387. ;
  388. SCAN:
  389.     PUSH    BX
  390.     MOV    BX,OFFSET SNAMECT
  391.     MOV    BYTE PTR [BX],0
  392.     MOV    BX,OFFSET CMDBUF+1  ;FIND END OF CMD LINE..
  393.     MOV    CL,BYTE PTR [BX]  ;..AND PUT SPACE THERE.
  394.     MOV    CH,0
  395.     MOV    BX,OFFSET CMDBUF+2
  396.     ADD    BX,CX
  397.     MOV    BYTE PTR [BX],20H
  398.     MOV    BX,OFFSET CMDBUF+1
  399.     MOV    CH,BYTE PTR [BX]
  400.     INC    CH
  401.     INC    CH
  402. SCANLP1:
  403.     INC    BX
  404.     DEC    CH
  405.     JZ    DNSCAN
  406.     MOV    AL,BYTE PTR [BX]
  407.     CMP    AL,20H
  408.     JNZ    SCANLP1
  409. SCANLP2:
  410.     INC    BX        ;EAT EXTRA SPACES
  411.     DEC    CH
  412.     JZ    DNSCAN
  413.     MOV    AL,BYTE PTR [BX]
  414.     CMP    AL,20H
  415.     JZ    SCANLP2
  416.     MOV    BGNMS,BX    ;SAVE START OF NAMES IN CMDBUF
  417.     INC    CH
  418.     DEC    BX
  419. SCANLP3:
  420.     INC    BX
  421.     DEC    CH
  422.     JZ    DNSCAN
  423.     MOV    AL,BYTE PTR [BX]
  424.     CMP    AL,20H
  425.     JNZ    SCANLP3
  426.     MOV    AL,SNAMECT    ;COUNTS NAMES
  427.     INC    AL
  428.     MOV    SNAMECT,AL
  429. SCANLP4:
  430.     INC    BX        ;EAT SPACES
  431.     DEC    CH
  432.     JZ    DNSCAN
  433.     MOV    AL,BYTE PTR [BX]
  434.     CMP    AL,20H
  435.     JZ    SCANLP4
  436.     JMP    SCANLP3
  437. ;
  438. DNSCAN:
  439.     MOV    BYTE PTR [BX],20H    ;SPACE AFTER LAST CHAR
  440.     POP    BX
  441.     RET
  442. ;
  443. ;PLACES NEXT NAME IN BUFFER SO 'CPMLINE' MAY PARSE IT
  444. ;
  445. TRTOBUF:
  446.     MOV    BX,BGNMS
  447.     MOV    CH,0
  448.     MOV    DX,OFFSET FCBBUF+2
  449. TBLP:
  450.     MOV    AL,BYTE PTR [BX]
  451.     CMP    AL,20H
  452.     JZ    TRBFEND
  453.     XCHG    BX,DX
  454.     MOV    BYTE PTR [BX],AL
  455.     XCHG    BX,DX
  456.     INC    BX
  457.     INC    DX
  458.     INC    CH        ;COUNT CHARS IN NAME
  459.     JMP    TBLP
  460. ;
  461. TRBFEND:
  462.     INC    BX
  463.     MOV    AL,BYTE PTR [BX]    ;EAT EXTRA SPACES
  464.     CMP    AL,20H
  465.     JZ    TRBFEND
  466.     MOV    BGNMS,BX
  467.     MOV    BX,OFFSET FCBBUF+1     ;PUT # CHARS BEFORE NAME
  468.     MOV    BYTE PTR [BX],CH
  469.     RET
  470. ;
  471. RCVSECT:
  472.     MOV    AL,1
  473.     MOV    ERRCT,AL
  474. RCVRPT:
  475.     CALL    CKABORT        ;WANT TO STOP RECEIVING FILE?
  476.     MOV    AL,QFLG
  477.     OR    AL,AL
  478.     JZ    RCVSQ
  479.     CALL    ILPRT
  480.     DB    CR,'Awaiting # ',0
  481.     PUSH    BX        ;SAVE IT
  482.     MOV    BX,SECTNO    ;GET SECTOR NUMBER
  483.     INC    BX        ;BUMP IT
  484.     CALL    DECOUT        ;PRINT SECTOR NUMBER IN DECIMAL
  485.     CALL    ILPRT
  486.     DB    ' (', 0
  487.     CALL    DHXOUT        ;16 BIT HEX CONVERSION & OUTPUT
  488.     CALL    ILPRT
  489.     DB    'H)',0
  490.     MOV    AL,BL        ;ONLY LOW BYTE USED BY PROGRAM
  491.     POP    BX        ;RESTORE IT
  492. RCVSQ:                ;WAIT FOR SOH OR EOT
  493.     MOV    CH,10        ;10 SECONDS
  494.     CALL    RECV
  495.     JNC    RCVSQ1
  496.     JMP    RCVSTOT
  497.  
  498. RCVSQ1:
  499.     CMP    AL,SOH
  500.     JNZ    RCVSQ2
  501.     JMP    RCVSOH
  502.  
  503. RCVSQ2:
  504.     OR    AL,AL
  505.     JZ    RCVSQ
  506.     CMP    AL,EOT
  507.     STC
  508.     JNZ    RCVSQ3
  509.     RET
  510.  
  511. RCVSQ3:
  512.     MOV    CH,AL
  513.     MOV    AL,QFLG
  514.     OR    AL,AL
  515.     JZ    RCVSERR
  516. RCVSEH:
  517.     MOV    AL,CH
  518.     CALL    CRLF
  519.     CALL    HEXO
  520.     CALL    ILPRT
  521.     DB    'H received not SOH - ',0
  522. RCVPRN:
  523.     CALL    SHOWERR        ;DISPLAY ERROR COUNT
  524. RCVSERR:
  525.     MOV    CH,1        ;WAIT FOR 1 SEC..
  526.     CALL    RECV        ;..WITH NO CHARS
  527.     JNC    RCVSERR     ;LOOP UNTIL SENDER DONE
  528.     CALL    CKABORT        ;WANT TO STOP RECEIVING NOW?
  529.     MOV    AL,CKSUMFLG    ;GET CHECKSUM FLAG
  530.     OR    AL,AL        ;CRC IN EFFECT?
  531.     MOV    AL,NAK        ;PUT NAK IN ACCUM
  532.     JNZ    RCVSER2        ;NO, SEND THE NAK
  533.     MOV    AL,FIRSTME     ;GET FIRST TIME SWITCH
  534.     OR    AL,AL        ;HAS FIRST SOH BEEN RECEIVED?
  535.     MOV    AL,NAK        ;PUT NAK IN ACCUM
  536.     JZ    RCVSER2        ;YES, THEN SEND NAK
  537.     MOV    AL,CRC        ;TELL SENDER CRC IS IN EFFECT
  538. RCVSER2:
  539.     CALL    SEND        ;..THE NAK or CRC request
  540.     MOV    AL,ERRCT    ;ABORT IF..
  541.     INC    AL        ;..WE HAVE REACHED..
  542.     MOV    ERRCT,AL    ;..THE ERROR..
  543.     CMP    AL,ERRLIM    ;..LIMIT?
  544.     JNC    RCVSER3
  545.     JMP    RCVRPT        ;..NO, TRY AGAIN
  546.  
  547. RCVSER3:
  548.     MOV    AL,QFLG
  549.     OR    AL,AL
  550.     JZ    RCVSABT
  551. RCVCKQ:
  552.     CALL    CKQUIT
  553.     JNZ    RCVSABT
  554.     JMP    RCVSECT
  555.  
  556. RCVSABT:
  557.     CALL    CLOSFIL        ;CLOSE THE PARTIAL FILE
  558.     CALL    NOASK        ;DELETE PARTIAL FILE
  559.     CALL    ILPRT
  560.     DB    CR,LF,LF
  561.     DB    '++ File receive cancelled and unfinished file deleted ++'
  562.     DB    BELL,CR,LF,0
  563.     JMP    DONETCA
  564. ;
  565. RCVSTOT:
  566.     MOV    AL,QFLG
  567.     OR    AL,AL
  568. RCVSPT:    CALL    ILPRT
  569.     DB    CR,LF,'++ Timeout ',0
  570.     CALL    SHOWERR
  571. RCVSCRC:
  572.     CALL    RCVSCRC2
  573.     JMP    RCVSERR
  574. ;
  575. ;ROUTINE WILL SWITCH FROM CRC TO CHECKSUM IF ERCNT REACHES ERRCRC
  576. ;AND FIRSTME IS TRUE
  577. ;
  578. RCVSCRC2:
  579.     MOV    AL,ERRCT
  580.     CMP    AL,ERRCRC
  581.     JNZ    RCVSCRC3
  582.     MOV    AL,FIRSTME
  583.     OR    AL,AL
  584.     JZ    RCVSCRC3
  585.     MOV    AL,CKSUMFLG
  586.     OR    AL,AL
  587.     JNZ    RCVSCRC3
  588.     NOT    AL
  589.     MOV    CKSUMFLG,AL
  590.     MOV    CKSUMDFLT,AL
  591.     CALL    ILPRTQ
  592.     DB    '++ Switching to Checksum mode ++',CR,LF
  593.     DB    '++ Sender may not be CRC capable ++',CR,LF,BELL,0
  594. RCVSCRC3:
  595.     RET
  596. ;
  597. ;Got SOH - get block #, block # complemented
  598. ;
  599. RCVSOH:
  600.     XOR    AL,AL        ;ZERO ACCUM
  601.     MOV    FIRSTME,AL    ;INDICATE FIRST SOH RECV'D
  602.     MOV    CH,1        ;TIMEOUT = 1 SEC
  603.     CALL    RECV        ;GET SECTOR
  604.     JNC    RCVSOH1
  605.     JMP    RCVSTOT        ;GOT TIMEOUT
  606.  
  607. RCVSOH1:
  608.     MOV    DH,AL
  609.     MOV    CH,1
  610.     CALL    RECV
  611.     JNC    RCVSOH2
  612.     JMP    RCVSTOT
  613.  
  614. RCVSOH2:
  615.     NOT    AL
  616.     CMP    AL,DH
  617.     JZ    RCVDATA
  618.     MOV    AL,QFLG
  619.     OR    AL,AL
  620.     JNZ    RCVBSE
  621.     JMP    RCVSERR
  622.  
  623. RCVBSE:
  624.     CALL    ILPRT
  625.     DB    CR,LF,'++ Bad sector # in Header ',0
  626.     JMP    RCVPRN
  627. ;
  628. RCVDATA:
  629.     MOV    AL,DH
  630.     MOV    RCVSNO,AL
  631.     MOV    AL,1
  632.     MOV    DATAFLG,AL
  633.     MOV    CL,0
  634.     CALL    CLRCRC        ;CLEAR CRC COUNTER
  635.     MOV    BX,OFFSET 80H
  636. RCVCHR:
  637.     MOV    CH,1
  638.     CALL    RECV
  639.     JNC    RCVCHR1
  640.     JMP    RCVSTOT
  641.  
  642. RCVCHR1:
  643.     MOV    BYTE PTR [BX],AL
  644.     INC    BL
  645.     JNZ    RCVCHR
  646.     MOV    AL,CKSUMFLG
  647.     OR    AL,AL
  648.     JZ    RCVCRC
  649.     MOV    DH,CL        ; 9.01.02 MJM 7/8/83
  650.     XOR    AL,AL
  651.     MOV    DATAFLG,AL
  652.     MOV    CH,1
  653.     CALL    RECV
  654.     JNC    RCVCHR2
  655.     JMP    RCVSTOT
  656.  
  657. RCVCHR2:
  658.     CMP    AL,DH
  659.     JNZ    RCVCERR
  660. CHKSNUM:
  661.     MOV    AL,RCVSNO
  662.     MOV    CH,AL
  663.     MOV    AX,SECTNO
  664.     CMP    AL,CH
  665.     JZ    RECVACK
  666.     INC    AL
  667.     CMP    AL,CH
  668.     JZ    CHKSNUM1
  669.     JMP    ABORT
  670.  
  671. CHKSNUM1:
  672.     RET
  673. ;
  674. RCVCRC:
  675.     MOV    DL,2        ;NUMBER OF CRC BYTES
  676. RCVCRC2:
  677.     MOV    CH,1
  678.     CALL    RECV
  679.     JNC    RCVCRC3
  680.     JMP    RCVSTOT
  681.  
  682. RCVCRC3:
  683.     DEC    DL
  684.     JNZ    RCVCRC2
  685.     CALL    CHKCRC
  686.     OR    AL,AL
  687.     JZ    CHKSNUM
  688.     MOV    AL,QFLG
  689.     OR    AL,AL
  690.     JNZ    RCVCRER
  691.     JMP    RCVSERR
  692.  
  693. RCVCRER:
  694.     CALL    ILPRT
  695.     DB    CR,LF,'++ CRC error ',0
  696.     JMP    RCVPRN
  697. ;
  698. RCVCERR:
  699.     MOV    AL,QFLG
  700.     OR    AL,AL
  701.     JNZ    RCVCPR
  702.     JMP    RCVSERR
  703.  
  704. RCVCPR:
  705.     CALL    ILPRT
  706.     DB    CR,LF,'++ Checksum error ',0
  707.     JMP    RCVPRN
  708. ;
  709. RECVACK:
  710.     CALL    SENDACK
  711.     JMP    RCVSECT
  712. ;
  713. SENDACK:
  714.     MOV    AL,ACK
  715.     CALL    SEND
  716.     RET
  717. ;
  718. SENDHDR:
  719.     MOV    AL,QFLG
  720.     OR    AL,AL
  721.     JZ    SENDHNM
  722.     CALL    ILPRT
  723.     DB    CR,'Sending # ',0
  724.     PUSH    BX
  725.     MOV    BX,SECTNO    ;GET SECTOR NUMBER
  726.     CALL    DECOUT        ;PRINT IT IN DECIMAL
  727.     CALL    ILPRT
  728.     DB    ' (',0
  729.     CALL    DHXOUT        ;16 BIT HEX CONVERSION & OUTPUT
  730.     CALL    ILPRT
  731.     DB    'H)',0
  732.     POP    BX
  733. SENDHNM:
  734.     MOV    AL,SOH
  735.     CALL    SEND
  736.     MOV    AX,SECTNO
  737.     CALL    SEND
  738.     MOV    AX,SECTNO
  739.     NOT    AL
  740.     CALL    SEND
  741.     RET
  742. ;
  743. SENDSEC:
  744.     MOV    AL,1
  745.     MOV    DATAFLG,AL
  746.     MOV    CL,0
  747.     CALL    CLRCRC
  748.     MOV    BX,OFFSET 80H
  749. SENDC:
  750.     MOV    AL,BYTE PTR [BX]
  751.     CALL    SEND
  752.     INC    BL
  753.     JNZ    SENDC
  754.     XOR    AL,AL
  755.     MOV    DATAFLG,AL
  756.     RET
  757. ;
  758. SENDCKS:
  759.     MOV    AL,CL
  760.     CALL    SEND
  761.     RET
  762. ;
  763. SENDCRC:
  764.     CALL    FINCRC
  765.     MOV    AL,DH
  766.     CALL    SEND
  767.     MOV    AL,DL
  768.     CALL    SEND
  769.     XOR    AL,AL
  770.     RET
  771. ;
  772. ;
  773. ;After a record is sent, a character is returned telling if it was re-
  774. ;ceived properly or not.  An ACK allows the next record to be sent.  A
  775. ;NAK sends an error message and the current record is again repeated.
  776. ;This occurs until the error limit has been reached.  If the first NAK
  777. ;is missed, it waits up to 12 seconds before declaring a 2nd error.
  778. ;This insures there is no collision with the station attempting to send
  779. ;the NAK, since it waits only 10 seconds.
  780. ;
  781. GETACK:
  782.     MOV    CH,12        ;12 SECONDS
  783.     CALL    RECVDG        ;WAIT FOR ACK OR NAK
  784.     JNC    GETACK1
  785.     JMP    GETATOT        ;NO CHARACTER, TIMED OUT
  786.  
  787. GETACK1:
  788.     CMP    AL,ACK
  789.     JNZ    NOTACK
  790.     RET            ;IF ACK RETURN AND SEND NEXT RECORD
  791.  
  792. NOTACK:
  793. ;
  794. ;If the ACKNAK option is FALSE it will resend the sector when any char-
  795. ;acter other than ACK is received (including NAK).
  796. ;
  797.     MOV    CH,AL
  798.     MOV    AL,NAKONLY
  799.     OR    AL,AL
  800.     JZ    ALLOTH
  801.     CMP    AL,NAK        ;WAS IT AN AUTHENTIC 'NAK'?
  802.     JNZ    GETACK        ;IGNORE IF NEITHER 'ACK' NOR 'NAK'
  803.                 ;WILL EVENTUALLY TIME OUT
  804. ALLOTH:
  805.     MOV    AL,QFLG
  806.     OR    AL,AL
  807.     JZ    ACKERR
  808.     CALL    ILPRT
  809.     DB    CR,LF,'++ ',0
  810.     MOV    AL,CH
  811.     CMP    AL,NAK        ;IS IT A 'NAK'?
  812.     JZ    GETACK2        ;SHOW 'NAK' IN THAT CASE
  813.     CALL    HEXO
  814.     MOV    AL,'H'
  815.     CALL    TIPE
  816.     JMP    GETACK3
  817. GETACK2:
  818.     CALL    ILPRT
  819.     DB    'NAK',0    
  820. GETACK3:
  821.     CALL    ILPRT        ;PRINT THE ERROR MESSAGE
  822.     DB    ' received not ACK - ',0
  823.     CALL    SHOWERR        ;SHOW THE ERROR NUMBER
  824. ACKERR:
  825.     MOV    AL,ERRCT
  826.     INC    AL
  827.     MOV    ERRCT,AL
  828.     DEC    AL
  829.     CMP    AL,ERRLIM
  830.     JNC    ACKERR1
  831.     RET
  832.  
  833. ACKERR1:
  834.     MOV    AL,QFLG
  835.     OR    AL,AL
  836.     JZ    CSABORT
  837. GACKV:
  838.     CALL    CKQUIT
  839.     STC
  840.     JNZ    CSABORT
  841.     RET
  842. CSABORT:
  843.     CALL    ERXIT
  844.     DB    CR,LF,'Can''t send sector -- Aborting',CR,LF,'$'
  845. GETATOT:
  846.     MOV    AL,QFLG
  847.     OR    AL,AL
  848.     JZ    ACKERR
  849.     CALL    ILPRT
  850.     DB    CR,LF,'++ Timeout on ACK - ',0
  851.     CALL    SHOWERR        ;DISPLAY ERROR COUNT
  852.     JMP    ACKERR
  853. ;
  854. CKABORT:
  855.     MOV    AL,QFLG
  856.     OR    AL,AL
  857.     JNZ    CKABGO
  858.     RET
  859.  
  860. CKABGO:
  861.     CALL    STAT
  862.     JNZ    CKABGO1
  863.     RET
  864.  
  865. CKABGO1:
  866.     CALL    KEYIN
  867.     CMP    AL,CAN
  868.     JZ    ABORT
  869.     RET
  870.  
  871. ABORT:    
  872.     MOV    CH,1
  873.     CALL    RECV
  874.     JNC    ABORT
  875.     MOV    AL,CAN
  876.     CALL    SEND
  877. ABORTW:
  878.     MOV    CH,1
  879.     CALL    RECV
  880.     JNC    ABORTW
  881.     MOV    AL,' '
  882.     CALL    SEND
  883.     MOV    AL,'B'         ;TURN MULTI-FILE MODE..
  884.     MOV    BATCHFLG,AL    ;..OFF SO ROUTINE ENDS.
  885.     MOV    AL,OPTION    ;RECEIVING A FILE NOW?
  886.     CMP    AL,'R'
  887.     JNZ    ABORTW1
  888.     JMP    RCVSABT        ;IF YES, CANCEL THE UNFINISHED FILE
  889.  
  890. ABORTW1:
  891.     CALL    ILPRT
  892.      DB    CR,LF,LF,'++ File send cancelled ++',CR,LF,BELL,0
  893.     JMP    DONETCA
  894. ;
  895. INCRSNO:
  896.     INC    SECTNO        ; INCREMENT SECTOR NUMBER
  897.     MOV    AX,SECTNO    ; NEED IT IN LOW BYTE, DON'T CARE ABOUT HIGH
  898.     RET
  899. ;
  900. ;---->    RECV: Receive a character
  901. ;
  902. ;Timeout time is in B, in seconds. Entry via 'RECVDG' deletes garbage
  903. ;characters on the line. For example, having just sent a sector, calling
  904. ;RECVDG will delete any line noise induced characters LONG before the
  905. ;ACK/NAK would be received.
  906. ;
  907. RECVDG:
  908.     CALL    CKMODM        ;CATCH ANY GARBAGE CHARACTERS
  909. RECV:
  910.     PUSH    DX
  911. MSEC:
  912.     PUSH    BX
  913.     MOV    BX,OFFSET 5000
  914.     CALL    FIXCNT
  915.     PUSH    BX
  916.     POP    DX
  917.     POP    BX
  918.     CALL    CKABORT
  919. MWTI:
  920.     CALL    RCVREADY
  921.     JZ    MCHAR
  922.     DEC    DL
  923.     JNZ    MWTI
  924.     DEC    DH
  925.     JNZ    MWTI
  926.     DEC    CH
  927.     JNZ    MSEC
  928.     POP    DX
  929.     STC
  930.     RET
  931. ;
  932. MCHAR:
  933.     CALL    INMODDATP
  934.     POP    DX
  935.     PUSH    AX
  936.     CALL    UPDCRC          ;CALCULATE CRC
  937.     ADD    CL,AL
  938.     MOV    AL,RSEEFLG
  939.     OR    AL,AL
  940.     JZ    MONIN
  941.     MOV    AL,VSEEFLG
  942.     OR    AL,AL
  943.     JNZ    NOMONIN
  944.     MOV    AL,DATAFLG
  945.     OR    AL,AL
  946.     JZ    NOMONIN
  947. MONIN:
  948.     POP    AX
  949.     PUSH    AX
  950.     CALL    SHOW
  951. NOMONIN:
  952.     POP    AX
  953.     OR    AL,AL
  954.     RET
  955. ;
  956. SEND:
  957.     PUSH    AX
  958.     MOV    AL,SSEEFLG
  959.     OR    AL,AL
  960.     JZ    MONOUT
  961.     MOV    AL,VSEEFLG
  962.     OR    AL,AL
  963.     JNZ    NOMONOT
  964.     MOV    AL,DATAFLG
  965.     OR    AL,AL
  966.     JZ    NOMONOT
  967. MONOUT:
  968.     POP    AX
  969.     PUSH    AX
  970.     CALL    SHOW
  971. NOMONOT:
  972.     POP    AX
  973.     PUSH    AX
  974.     CALL    UPDCRC        ;CALCULATE CRC
  975.     ADD    CL,AL
  976. SENDW:
  977.     CALL    SENDREADY
  978.     JNZ    SENDW
  979.     POP    AX
  980.     CALL    OUTMODDATP
  981.     RET
  982. ;
  983. WAITNAK:
  984.     CALL    ILPRTQ
  985.     DB    'Awaiting initial NAK',CR,LF,0
  986. WAITNLP:
  987.     CALL    CKABORT
  988.     MOV    CH,1
  989.     CALL    RECV
  990.     CMP    AL,NAK
  991.     JNZ    WAITNLP1
  992.     RET
  993.  
  994. WAITNLP1:
  995.     CMP    AL,CRC        ;CRC REQUEST?
  996.     JZ    WAITCRC        ;YES, GO SET CRC FLAG
  997.     CMP    AL,CAN
  998.     JNZ    WAITNLP2
  999.     JMP    ABORT
  1000.  
  1001. WAITNLP2:
  1002.     DEC    DL
  1003.     JNZ    WAITNLP
  1004.     JMP    ABORT
  1005. ;
  1006. WAITCRC:
  1007.     CALL    ILPRTQ
  1008.     DB    'CRC request received',CR,LF,0
  1009.     XOR    AL,AL
  1010.     MOV    CKSUMFLG,AL
  1011.     RET
  1012. ;
  1013. ;RETURNS W/ ZERO SET IF RETRY ASKED. IF MULTI-FILE MODE, THEN
  1014. ;NO QUESTIONS ASKED, JUST QUIT
  1015. ;
  1016. CKQUIT:
  1017.     MOV    AL,BATCHFLG
  1018.     OR    AL,AL
  1019.     JNZ    CKQTASK        ;ASK FOR RETRY
  1020.     INC    AL        ;RESET ZERO FLG
  1021.     RET
  1022. ;
  1023. CKQTASK:
  1024.     MOV    ERRCT,1
  1025.     CALL    ILPRT
  1026.     DB    CR,LF,'Multiple errors encountered.',CR,LF
  1027.     DB    'Type Q to quit, R to retry:  ',BELL,0
  1028.     CALL    KEYIN
  1029.     CALL    CRLF
  1030.     CALL    UCASE        ;INSTEAD OF "ANI 5FH"
  1031.     CMP    AL,'R'
  1032.     JZ    CKQTASK1
  1033.     CMP    AL,'Q'
  1034.     JNZ    CKQUIT
  1035.     OR    AL,AL
  1036. CKQTASK1:
  1037.     RET
  1038. ;
  1039. ;Get the error count and display on CRT
  1040. ;
  1041. SHOWERR:
  1042.     PUSH    BX        ;SAVE THE CURRENT ADDRESS
  1043.     MOV    BL,ERRCT    ;GET THE CURRENT ERROR NUMBER
  1044.     MOV    BH,0        ;ONLY A 8-BIT NUMBER, NOW IN 'L' REG.
  1045.     CALL    DECOUT        ;DISPLAY THE ERROR IN DECIMAL
  1046.     POP    BX        ;RESTORE THE CURRENT ADDRESS
  1047.     CALL    ILPRT
  1048.     DB    ' ++',CR,LF,0    ;FINISH THE ERROR MESSAGE
  1049.     RET
  1050. ;
  1051. ERXIT:
  1052.     POP    DX
  1053.     CALL    PRTMSG
  1054.     MOV    AL,BELL
  1055.     CALL    TIPE
  1056.     MOV    AL,BATCHFLG
  1057.     OR    AL,AL
  1058.     JZ    ERXIT1
  1059.     JMP    DONETCA
  1060.  
  1061. ERXIT1:
  1062.     MOV    AL,'Q'        ;RESET QFLG
  1063.     MOV    QFLG,AL
  1064.     JMP    ABORT        ;ABORT OTHER COMPUTER
  1065. ;
  1066. DONE:
  1067.     MOV    AL,BATCHFLG
  1068.     OR    AL,AL
  1069.     JZ    DONE1
  1070.     JMP    DONETC
  1071.  
  1072. DONE1:
  1073.     MOV    AL,QFLG
  1074.     OR    AL,AL
  1075.     JZ    NMSTRNS
  1076.     MOV    CH,12        ;ZERO OUT FTRNMSG
  1077.     MOV    BX,OFFSET FTRNMSG
  1078. ZEROLP:
  1079.     MOV    BYTE PTR [BX],' ' ; mjm 9.01.05 FIX BATCH NAME REPORT
  1080.     INC    BX
  1081.     DEC    CH
  1082.     JNZ    ZEROLP
  1083.     MOV    CH,12        ;PUT FILE NAME IN FTRNMSG
  1084.     MOV    BX,OFFSET FCB+1        
  1085.     MOV    DX,OFFSET FTRNMSG
  1086. LOADMSG:
  1087.     MOV    AL,4    ;START OF FILE TYPE?
  1088.     CMP    AL,CH
  1089.     JZ    PERIOD        ;PUT IN PERIOD IF SO
  1090.     MOV    AL,BYTE PTR [BX]    
  1091.     CMP    AL,' '        ;DON'T PUT IN SPACE
  1092.     JZ    SKPSP    
  1093.     XCHG    BX,DX
  1094.     MOV    BYTE PTR [BX],AL    ;STORE IN FTRNMSG
  1095.     XCHG    BX,DX
  1096.     INC    DX
  1097. SKPSP:
  1098.     INC    BX
  1099.     DEC    CH
  1100.     MOV    AL,CH
  1101.     OR    AL,AL        ;END OF FILE NAME?
  1102.     JZ    FTRNMSG0    ;DISPLAY FILE NAME
  1103.     JMP    LOADMSG        ;LOOP FOR ANOTHER CHARACTER
  1104. ;
  1105. PERIOD:
  1106.     MOV    AL,BYTE PTR [BX]
  1107.     CMP    AL,' '        ;IS FILE TYPE EMPTY?
  1108.     JZ    FTRNMSG0    ;GO IF SO
  1109.     MOV    AL,'.'        ;ELSE PUT PERIOD IN MESSAGE
  1110.     XCHG    BX,DX
  1111.     MOV    BYTE PTR [BX],AL
  1112.     XCHG    BX,DX
  1113.     INC    DX
  1114.     DEC    CH
  1115.     JMP    LOADMSG    
  1116. ;
  1117. FTRNMSG0:
  1118.     CALL    ILPRT
  1119.     DB    CR,LF
  1120. FTRNMSG    RB    12
  1121.     DB    0
  1122.     CALL    ILPRT
  1123.     DB    ' Transferred',CR,LF,LF,0
  1124. NMSTRNS:
  1125.     MOV    AL,BYTE PTR .FCB    ;SAVE DRIVE NO.
  1126.     MOV    DISKNO,AL
  1127.     MOV    BX,OFFSET FCB    ;BLANK OUT FILE CONTROL BLOCKS
  1128.     CALL    INITFCBS
  1129.     MOV    AL,DISKNO    ;PUT DRIVE NUMBER BACK
  1130.     MOV    BYTE PTR .FCB,AL
  1131.     MOV    BX,OFFSET RESTSN ;RESTORE SECTORE NUMBERS..
  1132.     MOV    DX,OFFSET SECTNOB ;..FOR NEW FILE TRANSFER.
  1133.     MOV    CH,OFFSET SECTNOE-OFFSET SECTNOB ;ROUTINE ALSO DONE IN MENU.
  1134.     CALL    MOVE
  1135.     CALL    CKMODM        ;CATCH ANY GARBAGE CHARACTERS
  1136.     MOV    AL,SENDFLG    ;GOES TO EITHER SEND OR..
  1137.     OR    AL,AL        ;..RECEIVE FILE, DEPENDING..
  1138.     JZ    NMSTRNS1
  1139.     JMP    SENDFIL1    ;..UPON WHICH ROUTINE SET..
  1140.  
  1141. NMSTRNS1:
  1142.     JMP    RCVFIL1        ;..THE FLAG IN MULTI-FILE MODE.
  1143. ;
  1144. DONETC:
  1145.     CALL    CKABORT        ;SLIGHT DELAY FOR NEXT MESSAGE
  1146.     CALL    ILPRT
  1147.     DB    CR,LF,'All transfers completed',CR,LF,BELL,0
  1148. DONETCA:
  1149.     MOV    AL,TRUE
  1150.     MOV    FIRSTME,AL    ;SET FIRST-TIME FLAG
  1151.     MOV    FSTFLG,AL    ;RESET MULTIFILE TRANS
  1152.     MOV    NFILFLG,AL    ;..USED IN TERMINAL ROUTINE
  1153.     NOT    AL
  1154.     MOV    SAVEFLG,AL    ;STOP MEMORY SAVE IN TERM ROUTINE
  1155.     MOV    LISTMOR,AL    ;STOP ANY BUFFERED OUTPUT TO PRINTER
  1156.     MOV    BX,OFFSET BOTTRAM    ;RESET PRINTER BUFFER POINTERS
  1157.     MOV    HLSAVE1,BX
  1158.     MOV    HLSAVE2,BX
  1159.     MOV    AL,TERMFLG    ;SEE IF RETURN TO..
  1160.     OR    AL,AL        ;..TERMINAL MODE..
  1161.     JNZ    DONETCA1    ;..AFTER X'FER.
  1162.     CALL    ILPRT
  1163.     DB    CR,LF,'** Entering terminal mode **',CR,LF,LF,BELL,0
  1164.     JMP    TERM
  1165.  
  1166. DONETCA1:
  1167.     JMP    MENU
  1168. ;
  1169. ;Shows the time to transfer a file at various baud rates
  1170. ;
  1171. SENDTIM:
  1172.     CALL    ILPRT            ;PRINT:
  1173.     DB    'File open:  ',0
  1174.     MOV    BX,RCNT        ;GET RECORD COUNT.
  1175.     CALL    DECOUT        ;PRINT DECIMAL NUMBER OF RECORDS
  1176.     CALL    ILPRT
  1177.     DB    ' (',0
  1178.     CALL    DHXOUT        ;NOW PRINT SIZE IN HEX.
  1179.     CALL    ILPRT
  1180.     DB    ' Hex) Records',CR,LF
  1181.     DB    'Send time:  ',0
  1182.     MOV    AL,MSPEED        ;GET THE SPEED INDICATOR
  1183.     MOV    DH,0
  1184.     MOV    DL,AL        ;SET UP FOR TABLE ACCESS
  1185.     MOV    BX,OFFSET BTABLE    ;POINT TO BAUD FACTOR TABLE
  1186.     ADD    BX,DX        ;INDEX TO PROPER FACTOR
  1187.     ADD    BX,DX
  1188.     MOV    DL,BYTE PTR [BX];FACTOR IN DE
  1189.     INC    BX
  1190.     MOV    DH,BYTE PTR [BX]
  1191.     MOV    BX,RCNT        ;GET # OF RECORDS
  1192.     CALL    DIVHLDE        ;DIVIDE HL BY VALUE IN A (RECORDS/MIN)    
  1193.     PUSH    BX
  1194.     MOV    BX,CX
  1195.     CALL    DECOUT        ;PRINT THE MINUTES PORTION
  1196.     CALL    ILPRT
  1197.     DB    ' mins, ',0
  1198.     MOV    BX,OFFSET SECTBL ;POINT TO DIVISORS FOR SECONDS
  1199.     MOV    DX,0        ;   CALCULATION
  1200.     MOV    AL,MSPEED    ;GET INDEX FOR BAUD RATE
  1201.     MOV    DL,AL
  1202.     ADD    BX,DX        ;INDEX INTO TABLE
  1203.     MOV    AL,BYTE PTR [BX];GET MULTIPLIER = (SEC/REC) x 16
  1204.     POP    BX        ;GET REMAINDER
  1205.     CALL    MULHLA        ;MULTIPLY THE 'HL' x 'A'
  1206.     CALL    SHFTHL        ;DIVIDE BY 16
  1207.     CALL    SHFTHL
  1208.     CALL    SHFTHL
  1209.     CALL    SHFTHL    
  1210.     MOV    BH,0
  1211.     CALL    DECOUT        ;PRINT THE SECONDS PORTION
  1212.     CALL    ILPRT
  1213.     DB    ' secs at ',0
  1214.     CALL    BAUDPRT
  1215.     CALL    ILPRT
  1216.         DB    'To cancel use ctrl-X',CR,LF,0
  1217.     RET
  1218. ;
  1219. ; CORRECTED BY M.J. MELLINGER FOR 9.01.05 11/25/83
  1220. BTABLE    DW    5,13,25,48,96,192,384,0    ;RECORDS/MIN FOR 110-9600 BAUD
  1221. SECTBL    DB    192,74,38,20,11,5,3,0
  1222. ;
  1223. ;    
  1224. ;---->  DIVHLDE: DIVIDES 'HL' BY VALUE IN 'DE', 
  1225. ;    UPON EXIT: 'BC'=QUOTIENT,'L'=REMAINDER
  1226. ;
  1227. DIVHLDE:
  1228.     PUSH    DX        ;SAVE DIVISOR
  1229. ;    MOV    AL,DL
  1230. ;    NOT    AL        ;NEGATE DIVISOR
  1231. ;    MOV    DL,AL
  1232. ;    MOV    AL,DH
  1233. ;    NOT    AL
  1234. ;    MOV    DH,AL
  1235. ;    INC    DX        ;DE IS NOW TWOS COMPLEMENTED
  1236.     NEG    DX
  1237.     MOV    CX,0        ;INITIATE QUOTIENT
  1238. DIVL1:
  1239.     ADD    BX,DX        ;SUBTRACT DIVISOR FROM DIVIDEND
  1240.     INC    CX        ;INCREASE QUOTIENT
  1241.     JC    DIVL1        ;LOOP UNTIL SIGN CHANGES
  1242.     DEC    CX        ;ADJUST QUOTIENT
  1243.     POP    DX        ;RETRIEVE DIVISOR
  1244.     ADD    BX,DX        ;ADJUST REMAINDER
  1245.     RET
  1246.  
  1247. ;
  1248. ;---->  MULHLA:  MULTIPLY THE VALUE IN 'HL' BY THE VALUE IN 'A'
  1249. ;            RETURN WITH ANSWER IN 'HL'
  1250. ;
  1251. MULHLA:
  1252.     XCHG    BX,DX        ;MULTIPLICAND TO DE
  1253.     MOV    BX,OFFSET 0    ;INITIALIZE PRODUCT
  1254.     INC    AL        ;ADJUST MULTIPLIER
  1255. MULLP:
  1256.     DEC    AL
  1257.     JNZ    MULLP1
  1258.     RET
  1259.  
  1260. MULLP1:
  1261.     ADD    BX,DX
  1262.     JMPS    MULLP
  1263. ;
  1264. ;  SHIFT 'HL' REGISTER PAIR ONE BIT TO THE RIGHT
  1265. ;
  1266. SHFTHL:
  1267.     CLC        ;CLEAR THE CARRY
  1268.     RCR    BX,1
  1269.     RET
  1270. ;
  1271. ;****************************************************************
  1272. ;*                                *
  1273. ;*   CRCSUBS (Cyclic Redundancy Code Subroutines) version 1.20    *
  1274. ;*   8080 Mnemonics                        *
  1275. ;*                                *
  1276. ;*     These subroutines will compute and check a true 16-bit    *
  1277. ;*   Cyclic Redundancy Code for a message of arbitrary length.    *
  1278. ;*                                *
  1279. ;*     The use of this scheme will guarantee detection of all    *
  1280. ;*   single and double bit errors, all  errors  with  an  odd    *
  1281. ;*   number  of  error bits, all burst errors of length 16 or    *
  1282. ;*   less, 99.9969% of all 17-bit error bursts, and  99.9984%    *
  1283. ;*   of  all  possible  longer  error bursts.  (Ref: Computer    *
  1284. ;*   Networks, Andrew S.  Tanenbaum, Prentiss-Hall, 1981)    *
  1285. ;*                                *
  1286. ;*   Designed & coded by Paul Hansknecht, June 13, 1981        *
  1287. ;*                                *
  1288. ;*   Copyright (c) 1981, Carpenter Associates            *
  1289. ;*            Box 451                    *
  1290. ;*            Bloomfield Hills, MI 48013            *
  1291. ;*            313/855-3074                *
  1292. ;*                                *
  1293. ;*   This program may be freely reproduced for non-profit use.    *
  1294. ;*                                *
  1295. ;****************************************************************
  1296. ;
  1297. ;
  1298. CLRCRC:            ;RESET CRC ACCUMULATOR FOR A NEW MESSAGE.
  1299.     MOV    CRCVAL,0
  1300.     RET
  1301. ;
  1302. UPDCRC:            ;UPDATE CRC ACCUMULATOR USING BYTE IN (A).
  1303.     PUSH    AX
  1304.     PUSH    CX
  1305.     PUSH    BX
  1306.     MOV    CH,8
  1307.     MOV    CL,AL
  1308.     MOV    BX,CRCVAL
  1309. UPDLOOP:
  1310.     ROL    CL,1
  1311. ;    MOV    AL,CL
  1312. ;    ROL    AL,1
  1313. ;    MOV    CL,AL
  1314.     RCL    BX,1
  1315.     JNC    SKIPIT
  1316.     XOR    BX,1021H
  1317. SKIPIT:
  1318.     DEC    CH        ;AND XOR 05H FOR XOR 21H IN THE ADJACENT CODE
  1319.     JNZ    UPDLOOP
  1320.     MOV    CRCVAL,BX
  1321.     POP    BX
  1322.     POP    CX
  1323.     POP    AX
  1324.     RET
  1325. ;
  1326. FINCRC:                ;FINISH CRC CALCULATION FOR OUTPUT MESSAGE
  1327.     PUSH    AX
  1328.     XOR    AL,AL
  1329.     CALL    UPDCRC
  1330.     CALL    UPDCRC
  1331.     MOV    DX,CRCVAL
  1332.     POP    AX
  1333.     RET
  1334. ;
  1335. CHKCRC:                ;CHECK CRC BYTES OF RECEIVED MESSAGE
  1336.     MOV    AX,CRCVAL
  1337.     OR    AL,AH
  1338.     JZ    CHKCRCRT
  1339.     MOV    AL,0FFH
  1340. CHKCRCRT:
  1341.     RET
  1342. ;
  1343. CRCVAL    DW    0
  1344. ;
  1345.