home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / trs80model1and3.zip / trsxfer.src < prev   
Text File  |  1984-05-28  |  24KB  |  752 lines

  1. ;    FILE ROUTINES
  2. ;    OUTPUT THE CHARS IN A PACKET.
  3. PTCHR:    LD     (TEMP1),A    ; SAVE THE SIZE.
  4.     LD     HL,DATA    ; BEGINNING OF RECEIVED PACKET DATA.
  5.     LD     (OUTPNT),HL    ; REMEMBER WHERE WE ARE.
  6.     LD     A,(RQUOTE)
  7.     LD     B,A        ; KEEP THE QUOTE CHAR IN B.
  8. PTCHR1:    LD     HL,TEMP1
  9.     DEC    (HL)        ; DECREMENT # OF CHARS IN PACKET.
  10.     JP     M,RSKP        ; RETURN SUCCESSFULLY IF DONE.
  11. PTCHR2:    LD     HL,(OUTPNT)    ; GET POSITION IN OUTPUT BUFFER.
  12.     LD     A,(HL)        ; GRAB A CHAR.
  13.     INC    HL
  14.     LD     (OUTPNT),HL    ; AND BUMP POINTER.
  15.     CP     B        ; IS IT THE QUOTE CHAR?
  16.     JP     NZ,PTCHR4    ; IF NOT PROCEED.
  17.     LD     A,(HL)        ; GET THE QUOTED CHARACTER
  18.     INC    HL
  19.     LD     (OUTPNT),HL    ; AND BUMP POINTER.
  20.     LD     HL,TEMP1
  21.     DEC    (HL)        ; DECREMENT # OF CHARS IN PACKET.
  22.     LD     D,A        ; SAVE THE CHAR.
  23.     AND    80H        ; TURN OFF ALL BUT THE PARITY BIT.
  24.     LD     E,A        ; SAVE THE PARITY BIT.
  25.     LD     A,D        ; GET THE CHAR.
  26.     AND    7FH        ; TURN OFF THE PARITY BIT.
  27.     CP     B        ; IS IT THE QUOTE CHAR?
  28.     JP     Z,PTCHR3    ; IF SO JUST GO WRITE IT OUT.
  29.     LD     A,D        ; GET THE CHAR.
  30.     ADD    A,40H        ; MAKE THE CHARACTER A CONTROL CHAR AGAIN.
  31.     AND    7FH        ; MODULO 128.
  32. PTCHR3:    OR     E        ; OR IN THE PARITY BIT.
  33.     LD    E,A        ;SAVE IT
  34.     LD    A,(CPMFLG)    ;FILE TYPE?
  35.     CP    1        ;ASCII?
  36.     JR    NZ,PTCR3B
  37.     LD    A,E
  38.     CP    LF        ;LINE FEED?
  39.     JR    NZ,PTCR3B
  40.     LD    A,(LSTCHR)
  41.     CP    CR
  42.     JP    Z,PTCHR1    ;SKIP IT
  43.     LD    E,CR        ;CONVERT IT
  44. PTCR3B:    LD    A,E
  45.     LD    (LSTCHR),A
  46. PTCHR4:    LD    DE,FCB
  47.     CALL    @PUT        ;output character to file
  48.     JP    NZ,QUIT        ;bad write
  49.     JP    PTCHR1
  50. ;    GET THE CHARS FROM THE FILE.
  51. GTCHR:    LD     A,(SQUOTE)    ; GET THE QUOTE CHAR.
  52.     LD     C,A        ; KEEP QUOTE CHAR IN C.
  53.     LD    A,(EOFLAG)
  54.     OR    A
  55.     RET    NZ
  56.     LD     A,(FILFLG)    ; GET THE FILE FLAG.
  57.     OR     A        ; IS THERE ANYTHING IN THE DMA?
  58.     JR     Z,GTCHR0    ; YUP, PROCEED.
  59.     LD     B,0        ; NO CHARS YET.
  60. GTCHR0:    LD     A,(CURCHK)    ; GET CURRENT BLOCK CHECK TYPE
  61.     SUB    '1'        ; GET THE EXTRA OVERHEAD
  62.     LD     B,A        ; GET A COPY
  63.     LD     A,(SPSIZ)    ; GET THE MAXIMUM PACKET SIZE.
  64.     SUB    5        ; SUBTRACT THE OVERHEAD.
  65.     SUB    B        ; DETERMINE MAX PACKET LENGTH
  66.     LD     (TEMP1),A    ; THIS IS THE NUMBER OF CHARS WE ARE TO GET.
  67.     LD     HL,FILBUF    ; WHERE TO PUT THE DATA.
  68.     LD     (CBFPTR),HL    ; REMEMBER WHERE WE ARE.
  69.     LD     B,0        ; NO CHARS.
  70. GTCHR1:    LD     A,(TEMP1)
  71.     DEC    A        ; DECREMENT THE NUMBER OF CHARS LEFT.
  72.     JP     P,GTCHR2    ; GO ON IF THERE IS MORE THAN ONE LEFT.
  73.     LD     A,B        ; RETURN THE COUNT IN A.
  74.     JP    RSKP
  75. GTCHR2:    LD     (TEMP1),A
  76.     LD    A,(CPMFLG)    ;GET THE FILE TYPE FLAG
  77.     CP    1        ;ASCII
  78.     JR    NZ,GTCHR4    ;NOPE
  79.     LD    A,(LSTCHR)    ;GET LAST CHARACTER
  80.     CP    CR        ;CARRIAGE RETURN?
  81.     JR    NZ,GTCHR4    ;NOPE
  82.     LD    A,LF        ;ADD A LINE FEED
  83.     JR    GTCR4A
  84. GTCHR4:    LD    DE,FCB
  85.     CALL    @GET        ;get a character
  86.     JP    NZ,GTCHR9
  87. GTCR4A:    LD     D,A        ; SAVE THE CHAR.
  88.     LD    A,(CPMFLG)
  89.     CP    1
  90.     JR    NZ,GTCR4B
  91.     LD    A,D        ;make sure it is a
  92.     AND    7FH        ;legal ASCII character
  93.     LD    D,A
  94. GTCR4B:    AND    80H        ; TURN OFF ALL BUT PARITY.
  95.     LD     E,A        ; SAVE THE PARITY BIT.
  96.     LD     A,D        ; RESTORE THE CHAR.
  97.     AND    7FH        ; TURN OFF THE PARITY.
  98.     LD    (LSTCHR),A    ;SAVE THIS CHARACTER
  99.     CP     ' '            ; COMPARE TO A SPACE.
  100.     JP     M,GTCHR7    ; IF LESS THEN ITS A CONTROL CHAR, HANDLE IT.
  101.     CP     DEL        ; IS THE CHAR A DELETE?
  102.     JP    Z,GTCHR7
  103.     CP     C        ; IS IT THE QUOTE CHAR?
  104.     JP     NZ,GTCHR8    ; IF NOT PROCEED.
  105.     LD     HL,TEMP1    ; POINT TO THE CHAR TOTAL REMAINING.
  106.     DEC    (HL)        ; DECREMENT IT.
  107.     LD     HL,(CBFPTR)    ; POSITION IN CHARACTER BUFFER.
  108.     LD     (HL),A        ; PUT THE CHAR IN THE BUFFER.
  109.     INC    HL
  110.     LD     (CBFPTR),HL
  111.     INC    B        ; INCREMENT THE CHAR COUNT.
  112.     JP     GTCHR8
  113. GTCHR7:    LD     (TEMP2),A    ; SAVE THE CHAR.
  114.     LD     HL,TEMP1    ; POINT TO THE CHAR TOTAL REMAINING.
  115.     DEC    (HL)        ; DECREMENT IT.
  116.     LD     HL,(CBFPTR)    ; POSITION IN CHARACTER BUFFER.
  117.     LD     (HL),C        ; PUT THE QUOTE IN THE BUFFER.
  118.     INC    HL
  119.     LD     (CBFPTR),HL
  120.     INC    B        ; INCREMENT THE CHAR COUNT.
  121.     LD     A,(TEMP2)    ; GET THE CONTROL CHAR BACK.
  122.     ADD    A,40H        ; MAKE THE NON-CONTROL.
  123.     AND    7FH        ; MODULO 200 OCTAL.
  124. GTCHR8:    LD     HL,(CBFPTR)    ; POSITION IN CHARACTER BUFFER.
  125.     OR     E        ; OR IN THE PARITY BIT.
  126.     LD     (HL),A        ; PUT THE CHAR IN THE BUFFER.
  127.     INC    HL
  128.     LD     (CBFPTR),HL
  129.     INC    B        ; INCREMENT THE CHAR COUNT.
  130.     JP    GTCHR1
  131. GTCHR9:    LD    A,0FFH
  132.     LD    (EOFLAG),A
  133.     LD    A,B
  134.     JP    RSKP
  135. ;MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING OF MULTIPLE FILES
  136. ;(I.E., *.ASM) FROM DISK.  THIS ROUTINE BUILDS THE PROPER NAME IN THE
  137. ;FCB EACH TIME IT IS CALLED.  THIS COMMAND WOULD BE USED IN SUCH PRO-
  138. ;GRAMS SUCH AS MODEM TRANSFER, TAPE SAVE, ETC. IN WHICH YOU WANT TO
  139. ;PROCESS SINGLE OR MULTIPLE FILES.
  140. ;
  141. ;THE FCB WILL BE SET UP WITH THE NEXT NAME, READY TO DO NORMAL PROCES-
  142. ;SING (OPEN, READ, ETC.) WHEN ROUTINE IS CALLED.
  143. ;
  144. ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  145. ;
  146. ; MFFLG1 IS COUNT/SWITCH [0 FOR FIRST TIME THRU, POS FOR ALL OTHERS]
  147. ; MFFLG2 IS COUNTED DOWN FOR EACH SUCCESSIVE GETNEXT FILE CALL
  148. MFNAME:    JP     NC,MFN00
  149.     CCF                ;CLEAR CARRY
  150. MFN00:    PUSH   BC    ;SAVE REGISTERS
  151.     PUSH   DE
  152.     PUSH   HL
  153.     LD    B,50
  154.     LD    HL,FCB
  155. MFN0A:    LD    (HL),20H
  156.     INC    HL
  157.     DJNZ    MFN0A
  158.     LD    B,32
  159.     LD    HL,MFREQ
  160. MFN0B:    LD    (HL),20H
  161.     INC    HL
  162.     DJNZ    MFN0B
  163.     LD     HL,(MFNPTR)
  164.     LD     DE,MFREQ
  165.     CALL    @FSPEC
  166.     LD    (MFNPTR),HL
  167.     JR    NZ,MFFIX2
  168. MFN01:    LD     HL,MFREQ    ;SFIRST REQ NAME
  169.     LD     DE,FCB
  170.     CALL    @FSPEC    ;MOVE TO FCB
  171. MFFIX1:    POP    HL    ; RESTORE REGISTERS
  172.     POP    DE
  173.     POP    BC
  174.     RET                ;AND RETURN
  175. MFFIX2:    SCF                ;SET CARRY
  176.     JR     MFFIX1    ;RETURN WITH CARRY SET
  177. GETFIL:    LD     A,0FFH
  178.     LD     (FILFLG),A    ; NOTHING IN THE DMA.
  179.     XOR    A
  180.     LD     (EOFLAG),A    ; NOT THE END OF FILE.
  181.     LD    (LSTCHR),A
  182.     PUSH    HL
  183.     LD     DE,FCB
  184.     LD    HL,BUFF
  185.     CALL    @OPEN
  186.     POP    HL
  187.     JP    NZ,ERRORD
  188.     JP    RSKP
  189. GOFIL:    LD     HL,DATA    ; GET THE ADDRESS OF THE FILE NAME.
  190.     LD     (DATPTR),HL    ; STORE THE ADDRESS.
  191.     LD     HL,FCB    ; ADDRESS OF THE FCB.
  192.     LD     (FCBPTR),HL    ; SAVE IT.
  193.     XOR    A
  194.     LD     (TEMP1),A    ; INITIALIZE THE CHAR COUNT.
  195.     LD     (TEMP2),A
  196.     LD    B,50
  197. GOFIL1:    LD     (HL),20H        ; BLANK THE FCB.
  198.     INC    HL
  199.     DJNZ    GOFIL1
  200. GOFIL2:    LD     HL,(DATPTR)    ; GET THE NAME FIELD.
  201.     LD     A,(HL)
  202.     INC    HL
  203.     LD     (DATPTR),HL
  204.     CP     '.'        ; SEPERATOR?
  205.     JP     NZ,GOFIL3
  206.     LD     A,(TEMP1)
  207.     LD     (TEMP2),A
  208.     XOR    A
  209.     LD    (TEMP1),A
  210.     JP     GOFIL5
  211. GOFIL3:    OR     A        ; TRAILING NULL?
  212.     JP     Z,GOFIL7    ; THEN WE'RE DONE.
  213.     LD     HL,(FCBPTR)
  214.     LD     (HL),A
  215.     INC    HL
  216.     LD     (FCBPTR),HL
  217.     LD     A,(TEMP1)    ; GET THE CHAR COUNT.
  218.     INC    A
  219.     LD     (TEMP1),A
  220.     CP     8H        ; ARE WE FINISHED WITH THIS FIELD?
  221.     JP     M,GOFIL2
  222. GOFIL4:    LD     (TEMP2),A
  223.     XOR    A
  224.     LD    (TEMP1),A
  225.     LD     HL,(DATPTR)
  226.     LD     A,(HL)
  227.     INC    HL
  228.     LD     (DATPTR),HL
  229.     OR     A
  230.     JP     Z,GOFIL7
  231.     CP     '.'        ; IS THIS THE TERMINATOR?
  232.     JP     NZ,GOFIL4    ; GO UNTIL WE FIND IT.
  233. GOFIL5    LD    HL,(FCBPTR)
  234.     LD    (HL),'/'    ;PUT IN A SLASH
  235.     INC    HL
  236.     LD    (FCBPTR),HL
  237. GOFIL6:    LD     HL,(DATPTR)    ; GET THE TYPE FIELD.
  238.     LD     A,(HL)
  239.     INC    HL
  240.     LD     (DATPTR),HL
  241.     OR     A        ; TRAILING NULL?
  242.     JP     Z,GOFIL7    ; THEN WE'RE DONE.
  243.     LD     HL,(FCBPTR)
  244.     LD     (HL),A
  245.     INC    HL
  246.     LD     (FCBPTR),HL
  247.     LD     A,(TEMP1)    ; GET THE CHAR COUNT.
  248.     INC    A
  249.     LD     (TEMP1),A
  250.     CP     03H        ; ARE WE FINISHED WITH THIS FIELD?
  251.     JP     M,GOFIL6
  252. GOFIL7:    LD     HL,(DATPTR)
  253.     LD     (HL),'$'    ; PUT IN A DOLLAR SIGN FOR PRINTING.
  254.     LD     DE,SCRFLN    ; POSITION CURSOR
  255.     CALL   PRTSTR
  256.     LD     DE,DATA    ; PRINT THE FILE NAME
  257.     CALL   PRTSTR
  258.     LD    HL,(FCBPTR)
  259.     LD    (HL),3        ;PUT TERMINATOR IN FCB
  260.     LD    A,(FLWFLG)    ;IS FILE WARNING ON?
  261.     OR     A
  262.     JP     Z,GOFIL9    ; IF NOT, JUST PROCEED.
  263.     LD     DE,FCB
  264.     LD    HL,BUFF
  265.     CALL    @OPEN
  266.     JP     NZ,GOFIL9    ; IF NOT CREATE IT.
  267.     LD     DE,INFMS5
  268.     CALL   ERROR3
  269.     LD    DE,FCB
  270.     CALL    @CLOSE        ;close opened file
  271. GOFIL8:    LD     HL,(FCBPTR)    ;make a new filename
  272. GOFL8A    DEC    HL
  273. GOFL8B    LD    A,(HL)
  274.     CP    'B'
  275.     JR    C,GOFL8A    ;TOO SMALL
  276.     DEC    (HL)        ;DECREMENT CHARACTER
  277.     LD    (FCBPTR),HL
  278.     LD     DE,FCB        ;new file name ok?
  279.     LD    HL,BUFF
  280.     CALL      @OPEN
  281.     JP     NZ,GOFL89    ; yes!
  282.     LD    DE,FCB
  283.     CALL    @CLOSE
  284.     LD    HL,(FCBPTR)
  285.     OR    A
  286.     SBC    HL,DE
  287.     JR    NZ,GOFIL8        ;TRY AGAIN
  288. GOFL88:    LD     DE,ERMS16    ; TELL USER THAT WE CAN'T RENAME IT.
  289.     CALL   PRTSTR
  290.     RET
  291. GOFL89:    LD     HL,FCB    ;move it for usage by other routines
  292.     LD    DE,MFREQ
  293.     CALL    @FSPEC
  294.     LD    A,':'
  295.     LD    BC,14
  296.     LD    HL,MFREQ
  297.     CPIR
  298.     INC    HL
  299.     LD    (HL),'$'
  300.     LD    DE,MFREQ
  301.     CALL   PRTSTR
  302. GOFIL9:    XOR    A
  303.     LD    (LSTCHR),A
  304.     LD     DE,FCB
  305.     LD    HL,BUFF
  306.     CALL    @INIT
  307.     JP     Z,RSKP
  308.     PUSH    AF
  309.     LD     DE,ERMS11
  310.     CALL   ERROR3
  311.     POP    AF
  312.     JP    ERRORD
  313. ;    PACKET ROUTINES
  314. ; SEND_PACKET
  315. ; THIS ROUTINE ASSEMBLES A PACKET FROM THE ARGUMENTS GIVEN AND SENDS IT
  316. ; TO THE HOST.
  317. ;
  318. ; EXPECTS THE FOLLOWING:
  319. ;    A        - TYPE OF PACKET (D,Y,N,S,R,E,F,Z,T)
  320. ;    ARGBLK   - PACKET SEQUENCE NUMBER
  321. ;    ARGBLK+1 - NUMBER OF DATA CHARACTERS
  322. ; RETURNS: +1 ON FAILURE
  323. ;       +2 ON SUCCESS
  324. SPACK:    LD     (ARGBLK+2),A
  325.     LD     HL,PACKET    ; GET ADDRESS OF THE SEND PACKET.
  326.     LD     A,SOH    ; GET THE START OF HEADER CHAR.
  327.     LD     (HL),A        ; PUT IN THE PACKET.
  328.     INC    HL        ; POINT TO NEXT CHAR.
  329.     LD     A,(CURCHK)    ; GET CURRENT CHECKSUM TYPE
  330.     SUB    '1'        ; DETERMINE EXTRA LENGTH OF CHECKSUM
  331.     LD     B,A        ; COPY LENGTH
  332.     LD     A,(ARGBLK+1)    ; GET THE NUMBER OF DATA CHARS.
  333.     ADD    A,' '+3        ; REAL PACKET CHARACTER COUNT MADE PRINTABLE.
  334.     ADD    A,B        ; DETERMINE OVERALL LENGTH
  335.     LD     (HL),A        ; PUT IN THE PACKET.
  336.     INC    HL        ; POINT TO NEXT CHAR.
  337.     LD     BC,0        ; ZERO THE CHECKSUM AC.
  338.     LD     C,A        ; START THE CHECKSUM.
  339.     LD     A,(ARGBLK)    ; GET THE PACKET NUMBER.
  340.     ADD    A,' '            ; ADD A SPACE SO THE NUMBER IS PRINTABLE.
  341.     LD     (HL),A        ; PUT IN THE PACKET.
  342.     INC    HL        ; POINT TO NEXT CHAR.
  343.     ADD    A,C
  344.     LD     C,A        ; ADD THE PACKET NUMBER TO THE CHECKSUM.
  345.     LD     A,0        ; CLEAR A (CANNOT BE XRA A, SINCE WE CAN'T TOUCH CARRY FLAG)
  346.     ADC    A,B        ; GET HIGH ORDER PORTION OF CHECKSUM
  347.     LD     B,A        ; COPY BACK TO B
  348.     LD     A,(ARGBLK+2)    ; GET THE PACKET TYPE.
  349.     LD     (HL),A        ; PUT IN THE PACKET.
  350.     INC    HL        ; POINT TO NEXT CHAR.
  351.     ADD    A,C
  352.     LD     C,A        ; ADD THE PACKET NUMBER TO THE CHECKSUM.
  353.     LD     A,0        ; CLEAR A
  354.     ADC    A,B        ; GET HIGH ORDER PORTION OF CHECKSUM
  355.     LD     B,A        ; COPY BACK TO B
  356. SPACK2:    LD     A,(ARGBLK+1)    ; GET THE PACKET SIZE.
  357.     OR     A        ; ARE THERE ANY CHARS OF DATA?
  358.     JP     Z,SPACK3    ;  NO, FINISH UP.
  359.     DEC    A        ; DECREMENT THE CHAR COUNT.
  360.     LD     (ARGBLK+1),A    ; PUT IT BACK.
  361.     LD     A,(HL)        ; GET THE NEXT CHAR.
  362.     INC    HL        ; POINT TO NEXT CHAR.
  363.     ADD    A,C
  364.     LD     C,A        ; ADD THE PACKET NUMBER TO THE CHECKSUM.
  365.     LD     A,0        ; CLEAR A
  366.     ADC    A,B        ; GET HIGH ORDER PORTION OF CHECKSUM
  367.     LD     B,A        ; COPY BACK TO B
  368.     JP     SPACK2    ; GO TRY AGAIN.
  369. SPACK3:    LD     A,(CURCHK)    ; GET THE CURRENT CHECKSUM TYPE
  370.     CP     '2'        ; TWO CHARACTER?
  371.     JP     Z,SPACK4    ; YES, GO HANDLE IT
  372.     JP     NC,SPACK5    ; NO, GO HANDLE CRC IF '3'
  373.     LD     A,C        ; GET THE CHARACTER TOTAL.
  374.     AND    0C0H    ; TURN OFF ALL BUT THE TWO HIGH ORDER BITS.
  375. ;    RRC
  376. ;    RRC
  377. ;    RRC
  378. ;    RRC
  379. ;    RRC
  380. ;    RRC            ; SHIFT THEM INTO THE LOW ORDER POSITION.
  381.     RLCA               ; TWO LEFT ROTATES SAME AS 6 RIGHTS
  382.     RLCA               ;  .  .  .
  383.     ADD    A,C        ; ADD IT TO THE OLD BITS.
  384.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.  (MOD 64)
  385.     ADD    A,' '            ; ADD A SPACE SO THE NUMBER IS PRINTABLE.
  386.     LD     (HL),A        ; PUT IN THE PACKET.
  387.     INC    HL        ; POINT TO NEXT CHAR.
  388.     JP     SPACK7    ; GO STORE EOL CHARACTER
  389. ; HERE FOR 3 CHARACTER CRC-CCITT
  390. SPACK5:    LD     (HL),0        ; STORE A NULL FOR CURRENT END
  391.     PUSH   HL        ; SAVE H
  392.     LD     HL,PACKET+1    ; POINT TO FIRST CHECKSUMED CHARACTER
  393.     CALL   CRCCLC    ; CALCULATE THE CRC
  394.     POP    HL        ; RESTORE THE POINTER
  395.     LD     C,E        ; GET LOW ORDER HALF FOR LATER
  396.     LD     B,D        ; COPY THE HIGH ORDER
  397.     LD     A,D        ; GET THE HIGH ORDER PORTION
  398.     RLCA               ; SHIFT OFF LOW 4 BITS
  399.     RLCA               ;  .  .  .
  400.     RLCA               ;  .  .  .
  401.     RLCA               ;  .  .  .
  402.     AND    0FH        ; KEEP ONLY LOW 4 BITS
  403.     ADD    A,' '            ; PUT INTO PRINTING RANGE
  404.     LD     (HL),A        ; STORE THE CHARACTER
  405.     INC    HL        ; POINT TO NEXT POSITION
  406. ; HERE FOR TWO CHARACTER CHECKSUM
  407. SPACK4:    LD     A,B        ; GET HIGH ORDER PORTION
  408.     AND    0FH        ; ONLY KEEP LAST FOUR BITS
  409.     RLCA               ; SHIFT UP TWO BITS
  410.     RLCA               ;  . .  .
  411.     LD     B,A        ; COPY BACK INTO SAFE PLACE
  412.     LD     A,C        ; GET LOW ORDER HALF
  413.     RLCA               ; SHIFT HIGH TWO BITS
  414.     RLCA               ; TO LOW TWO BITS
  415.     AND    03H        ; KEEP ONLY TWO LOW BITS
  416.     OR     B        ; GET HIGH ORDER PORTION IN
  417.     ADD    A,' '            ; CONVERT TO PRINTING CHARACTER RANGE
  418.     LD     (HL),A        ; STORE THE CHARACTER
  419.     INC    HL        ; POINT TO NEXT CHARACTER
  420.     LD     A,C        ; GET LOW ORDER PORTION
  421.     AND    3FH        ; KEEP ONLY SIX BITS
  422.     ADD    A,' '            ; CONVERT TO PRINTING RANGE
  423.     LD     (HL),A        ; STORE IT
  424.     INC    HL        ; BUMP THE POINTER
  425. SPACK7:    LD     A,(SEOL)    ; GET THE EOL THE OTHER HOST WANTS.
  426.     LD     (HL),A        ; PUT IN THE PACKET.
  427.     INC    HL        ; POINT TO NEXT CHAR.
  428.     XOR    A        ; GET A NULL.
  429.     LD     (HL),A        ; PUT IN THE PACKET.
  430.     LD    A,(DBFLG)
  431.     OR    A
  432.     JR    Z,SPACK8    ;debug is off
  433.     INC    HL        ; POINT TO NEXT CHAR.
  434.     LD     A,'$'    ; GET A DOLLAR SIGN.
  435.     LD     (HL),A        ; PUT IN THE PACKET.
  436. SPACK8:    CALL   OUTPKT    ; CALL THE SYSTEM DEPENDENT ROUTINE.
  437.     JP    QUIT
  438.     JP    RSKP
  439. ;    WRITE OUT A PACKET.
  440. OUTPKT    LD     A,(SPAD)    ; GET THE NUMBER OF PADDING CHARS.
  441.     LD     (TEMP1),A
  442. OUTPK2:    LD     A,(TEMP1)    ; GET THE COUNT.
  443.     DEC    A
  444.     OR     A
  445.     JP     M,OUTPK6    ; IF NONE LEFT PROCEED.
  446.     LD     (TEMP1),A
  447.     LD     A,(SPADCH)    ; GET THE PADDING CHAR.
  448.     LD     E,A        ; PUT THE CHAR IN RIGHT AC.
  449.     CALL   OUTCHR    ; OUTPUT IT.
  450.     JP     OUTPK2
  451. OUTPK6:    LD     A,(IBMFLG)    ; IS THIS THE (DUMB) IBM.
  452.     OR     A
  453.     JP     Z,OUTPK8    ; IF NOT THEN PROCEED.
  454.     LD     A,(STATE)    ; CHECK IF THIS IS THE SEND-INIT PACKET.
  455.     CP     'S'
  456. ;* THIS WILL ALSO HAVE TO BE TAKEN CARE FOR 'R' (RECEIVE), 'G' (GENERIC)
  457. ;* AND 'C' (COMMAND) PACKETS IF THE IBM BECOMES A SERVER.
  458.     JP     Z,OUTPK8    ; IF SO DON'T WAIT FOR THE XON.
  459. OUTPK7:    CALL   INCHR    ; WAIT FOR THE TURN AROUND CHAR.
  460.     JP     OUTPK8
  461.     CP     XON        ; IS IT THE IBM TURN AROUND CHARACTER?
  462.     JP     NZ,OUTPK7    ; IF NOT, GO UNTIL IT IS.
  463. OUTPK8:    LD    A,(DBFLG)
  464.     OR    A
  465.     JR    Z,OUTPK9
  466.     LD     DE,SPPOS    ; PRINT THE PACKET
  467.     CALL   PRTSTR
  468.     LD     DE,PACKET+1
  469.     CALL   PRTSTR
  470. OUTPK9:    LD     HL,PACKET    ; POINT TO THE PACKET.
  471. OUTLUP:    LD     A,(HL)        ; GET THE NEXT CHARACTER.
  472.     OR     A        ; IS IT A NULL?
  473.     JP     Z,OUTLUD    ; IF SO RETURN SUCCESS.
  474.     LD     E,A        ; PUT THE CHAR IN RIGHT AC.
  475.     CALL   OUTCHR    ; OUTPUT THE CHARACTER.
  476.     INC    HL        ; INCREMENT THE CHAR POINTER.
  477.     JP     OUTLUP
  478. OUTLUD:    JP    RSKP    ; JUST RETURN
  479. ; THIS ROUTINE WAITS FOR A PACKET TO ARRIVE FROM THE HOST.  IT READS
  480. ; CHARACTERS UNTIL IT FINDS A SOH.  IT THEN READS THE PACKET INTO PACKET.
  481. ;
  482. ; RETURNS:  +1 FAILURE (IF THE CHECKSUM IS WRONG OR THE PACKET TRASHED)
  483. ;        +2 SUCCESS WITH A        - MESSAGE TYPE
  484. ;                ARGBLK   - MESSAGE NUMBER
  485. ;                           ARGBLK+1 - LENGTH OF DATA
  486. RPACK:    CALL   INPKT    ; READ UP TO A CARRIAGE RETURN.
  487.     JP     QUIT        ;  RETURN BAD.
  488. RPACK0:    CALL   GETCHR    ; GET A CHARACTER.
  489.     JP     RPACK    ;  HIT A CR; NULL LINE; JUST START OVER.
  490.     CP     SOH        ; IS THE CHAR THE START OF HEADER CHAR?
  491.     JR     NZ,RPACK0    ;  NO, GO UNTIL IT IS.
  492. RPACK1:    CALL   GETCHR    ; GET A CHARACTER.
  493.     JP     QUIT        ;  HIT THE CARRIAGE RETURN, RETURN BAD.
  494.     CP     SOH        ; IS THE CHAR THE START OF HEADER CHAR?
  495.     JR     Z,RPACK1    ;  YES, THEN GO START OVER.
  496.     LD     (PACKET+1),A    ; STORE IN PACKET ALSO
  497.     LD     C,A        ; START THE CHECKSUM.
  498.     LD     A,(CURCHK)    ; GET BLOCK CHECK TYPE
  499.     SUB    '1'        ; DETERMINE EXTRA LENGTH OF BLOCK CHECK
  500.     LD     B,A        ; GET A COPY
  501.     LD     A,C        ; GET BACK LENGTH CHARACTER
  502.     SUB    ' '+3        ; GET THE REAL DATA COUNT.
  503.     SUB    B        ; GET TOTAL LENGTH
  504.     LD     (ARGBLK+1),A
  505.     LD     B,0        ; CLEAR HIGH ORDER HALF OF CHECKSUM
  506.     CALL   GETCHR    ; GET A CHARACTER.
  507.     JP     QUIT        ;  HIT THE CARRIAGE RETURN, RETURN BAD.
  508.     CP     SOH        ; IS THE CHAR THE START OF HEADER CHAR?
  509.     JR     Z,RPACK1    ;  YES, THEN GO START OVER.
  510.     LD     (ARGBLK),A
  511.     LD     (PACKET+2),A    ; SAVE ALSO IN PACKET
  512.     ADD    A,C
  513.     LD     C,A        ; ADD THE CHARACTER TO THE CHECKSUM.
  514.     LD     A,0        ; CLEAR A
  515.     ADC    A,B        ; GET HIGH ORDER PORTION OF CHECKSUM
  516.     LD     B,A        ; COPY BACK TO B
  517.     LD     A,(ARGBLK)
  518.     SUB    ' '            ; GET THE REAL PACKET NUMBER.
  519.     LD     (ARGBLK),A
  520.     CALL   GETCHR    ; GET A CHARACTER.
  521.     JP     QUIT        ;  HIT THE CARRIAGE RETURN, RETURN BAD.
  522.     CP     SOH        ; IS THE CHAR THE START OF HEADER CHAR?
  523.     JP     Z,RPACK1    ;  YES, THEN GO START OVER.
  524.     LD     (TEMP1),A    ; SAVE THE MESSAGE TYPE.
  525.     LD     (PACKET+3),A    ; SAVE IN PACKET
  526.     ADD    A,C
  527.     LD     C,A        ; ADD THE CHARACTER TO THE CHECKSUM.
  528.     LD     A,0        ; CLEAR A
  529.     ADC    A,B        ; GET HIGH ORDER PORTION OF CHECKSUM
  530.     LD     B,A        ; COPY BACK TO B
  531.     LD     A,(ARGBLK+1)    ; GET THE NUMBER OF DATA CHARACTERS.
  532.     LD     (TEMP2),A
  533.     LD     HL,DATA    ; POINT TO THE DATA BUFFER.
  534.     LD     (DATPTR),HL
  535. RPACK2:    LD     A,(TEMP2)
  536.     SUB    1        ; ANY DATA CHARACTERS?
  537.     JP     M,RPACK3    ;  IF NOT GO GET THE CHECKSUM.
  538.     LD     (TEMP2),A
  539.     CALL   GETCHR    ; GET A CHARACTER.
  540.     JP     QUIT        ;  HIT THE CARRIAGE RETURN, RETURN BAD.
  541.     CP     SOH        ; IS THE CHAR THE START OF HEADER CHAR?
  542.     JP     Z,RPACK1    ;  YES, THEN GO START OVER.
  543.     LD     HL,(DATPTR)
  544.     LD     (HL),A        ; PUT THE CHAR INTO THE PACKET.
  545.     INC    HL        ; POINT TO THE NEXT CHARACTER.
  546.     LD     (DATPTR),HL
  547.     ADD    A,C
  548.     LD     C,A        ; ADD THE CHARACTER TO THE CHECKSUM.
  549.     LD     A,0        ; CLEAR A
  550.     ADC    A,B        ; GET HIGH ORDER PORTION OF CHECKSUM
  551.     LD     B,A        ; COPY BACK TO B
  552.     JR     RPACK2    ; GO GET ANOTHER.
  553. RPACK3:    CALL   GETCHR    ; GET A CHARACTER.
  554.     JP     QUIT        ;  HIT THE CARRIAGE RETURN, RETURN BAD.
  555.     CP     SOH        ; IS THE CHAR THE START OF HEADER CHAR?
  556.     JP     Z,RPACK1    ;  YES, THEN GO START OVER.
  557.     SUB    ' '            ; TURN THE CHAR BACK INTO A NUMBER.
  558.     LD     (TEMP3),A
  559. ; DETERMINE TYPE OF CHECKSUM
  560.     LD     A,(CURCHK)    ; GET THE CURRENT CHECKSUM TYPE
  561.     CP     '2'        ; 1, 2 OR 3 CHARACTER?
  562.     JP     Z,RPACK4    ; IF ZERO, 2 CHARACTER
  563.     JP     NC,RPACK5    ; GO HANDLE 3 CHARACTER
  564.     LD     A,C        ; GET THE CHARACTER TOTAL.
  565.     AND    0C0H    ; TURN OFF ALL BUT THE TWO HIGH ORDER BITS.
  566. ;    RRC
  567. ;    RRC
  568. ;    RRC
  569. ;    RRC
  570. ;    RRC
  571. ;    RRC            ; SHIFT THEM INTO THE LOW ORDER POSITION.
  572.     RLCA               ; TWO LEFT ROTATES SAME AS SIX RIGHTS
  573.     RLCA               ;  .  .  .
  574.     ADD    A,C        ; ADD IT TO THE OLD BITS.
  575.     AND    3FH        ; TURN OFF THE TWO HIGH ORDER BITS.  (MOD 64)
  576.     LD     B,A
  577.     LD     A,(TEMP3)    ; GET THE REAL RECEIVED CHECKSUM.
  578.     CP     B        ; ARE THEY EQUAL?
  579.     JP     Z,RPACK7    ; IF SO, PROCEED.
  580. RPACK9:    CALL   UPDRTR    ; IF NOT, UPDATE THE NUMBER OF RETRIES.
  581.     RET                ; RETURN ERROR.
  582. ; HERE FOR THREE CHARACTER CRC-CCITT
  583. RPACK5:    LD     HL,(DATPTR)    ; GET THE ADDRESS OF THE DATA
  584.     LD     (HL),0        ; STORE A ZERO IN THE BUFFER TO TERMINATE PACKET
  585.     LD     HL,PACKET+1    ; POINT AT START OF CHECKSUMMED REGION
  586.     CALL   CRCCLC    ; CALCULATE THE CRC
  587.     LD     C,E        ; SAVE LOW ORDER HALF FOR LATER
  588.     LD     B,D        ; ALSO COPY HIGH ORDER
  589.     LD     A,D        ; GET HIGH BYTE
  590.     RLCA               ; WANT HIGH FOUR BITS
  591.     RLCA               ;  .  .  .
  592.     RLCA               ; AND SHIFT TWO MORE
  593.     RLCA               ;  .  .  .
  594.     AND    0FH        ; KEEP ONLY 4 BITS
  595.     LD     D,A        ; BACK INTO D
  596.     LD     A,(TEMP3)    ; GET FIRST VALUE BACK
  597.     CP     D        ; CORRECT?
  598.     JR     NZ,RPACK9    ; NO, PUNT
  599.     CALL   GETCHR    ; GET A CHARACTER.
  600.     JP     QUIT        ;  HIT THE CARRIAGE RETURN, RETURN BAD.
  601.     CP     SOH        ; IS THE CHAR THE START OF HEADER CHAR?
  602.     JP     Z,RPACK1    ;  YES, THEN GO START OVER.
  603.     SUB    ' '            ; REMOVE SPACE OFFSET
  604.     LD     (TEMP3),A    ; STORE FOR LATER CHECK
  605. ; HERE FOR A TWO CHARACTER CHECKSUM AND LAST TWO CHARACTERS OF CRC
  606. RPACK4:    LD     A,B        ; GET HIGH ORDER PORTION
  607.     AND    0FH        ; ONLY FOUR BITS
  608.     RLCA               ; SHIFT UP TWO BITS
  609.     RLCA               ;  .  .  .
  610.     LD     B,A        ; SAVE BACK IN B
  611.     LD     A,C        ; GET LOW ORDER
  612.     RLCA               ; MOVE TWO HIGH BITS TO LOW BITS
  613.     RLCA               ;  .  .  .
  614.     AND    03H        ; SAVE ONLY LOW TWO BITS
  615.     OR     B        ; GET OTHER 4 BITS
  616.     LD     B,A        ; SAVE BACK IN B
  617.     LD     A,(TEMP3)    ; GET THIS PORTION OF CHECKSUM
  618.     CP     B        ; CHECK FIRST HALF
  619.     JP     NZ,RPACK9    ; IF BAD, GO GIVE UP
  620.     CALL   GETCHR    ; GET A CHARACTER.
  621.     JP     QUIT        ;  HIT THE CARRIAGE RETURN, RETURN BAD.
  622.     CP     SOH        ; IS THE CHAR THE START OF HEADER CHAR?
  623.     JP     Z,RPACK1    ;  YES, THEN GO START OVER.
  624.     SUB    ' '            ; REMOVE SPACE OFFSET
  625.     LD     B,A        ; SAVE IN SAFE PLACE
  626.     LD     A,C        ; GET LOW 8 BITS OF CHECKSUM
  627.     AND    3FH        ; KEEP ONLY 6 BITS
  628.     CP     B        ; CORRECT VALUE
  629.     JP     NZ,RPACK9    ; BAD, GIVE UP
  630. RPACK7:    LD     HL,(DATPTR)
  631.     LD     (HL),0        ; PUT A NULL AT THE END OF THE DATA.
  632.     LD     A,(TEMP1)    ; GET THE TYPE.
  633.     JP     RSKP
  634. INPKT:    LD     HL,RECPKT    ; POINT TO THE BEGINNING OF THE PACKET.
  635.     LD     (PKTPTR),HL
  636. INPKT2:    CALL   INCHR    ; GET A CHARACTER.
  637.     JP     QUIT        ;  RETURN FAILURE.
  638.     LD     HL,(PKTPTR)
  639.     LD     (HL),A        ; PUT THE CHAR IN THE PACKET.
  640.     INC    HL
  641.     LD     (PKTPTR),HL
  642.     LD     B,A
  643.     LD     A,(REOL)    ; GET THE EOL CHAR.
  644.     CP     B
  645.     JR    NZ,INPKT2
  646.     LD    A,(DBFLG)
  647.     OR    A
  648.     JR    Z,INPKT3    ;DEBUG MODE IS OFF
  649.     LD     A,'$'    ; GET A DOLLAR SIGN.
  650.     LD     (HL),A        ; PUT IN THE PACKET.
  651.     INC    HL        ; POINT TO NEXT CHAR.
  652.     LD     DE,RPPOS    ; PRINT THE PACKET
  653.     CALL   PRTSTR
  654.     LD     DE,RECPKT+1
  655.     CALL   PRTSTR
  656. INPKT3:    LD     HL,RECPKT
  657.     LD     (PKTPTR),HL    ; SAVE THE PACKET POINTER.
  658.     JP     RSKP    ; IF SO WE ARE DONE.
  659. GETCHR:    LD     HL,(PKTPTR)    ; GET THE PACKET POINTER.
  660.     LD     A,(HL)        ; GET THE CHAR.
  661.     INC    HL
  662.     LD     (PKTPTR),HL
  663.     CP     CR        ; IS IT THE CARRIAGE RETURN?
  664.     JP     NZ,RSKP    ; IF NOT RETURN RETSKP.
  665.     RET                ; IF SO RETURN FAILURE.
  666. ;
  667. ; THIS ROUTINE WILL CALCULATE A CRC USING THE CCITT POLYNOMIAL FOR
  668. ;A STRING.
  669. ;
  670. ; USAGE:
  671. ;    HL/ ADDRESS OF STRING
  672. ;    A/  LENGTH OF STRING
  673. ;    CALL CRCCLC
  674. ;
  675. ; 16-BIT CRC VALUE IS RETURNED IN DE.
  676. ;
  677. ; REGISTERS BC AND HL ARE PRESERVED.
  678. ;
  679. CRCCLC:    PUSH   HL    ; SAVE HL
  680.     PUSH   BC    ; AND BC
  681.     LD     DE,0    ; INITIAL CRC VALUE IS 0
  682. CRCCL0:    LD     A,(HL)    ; GET A CHARACTER
  683.     OR     A    ; CHECK IF ZERO
  684.     JP     Z,CRCCL1    ; IF SO, ALL DONE
  685.     PUSH   HL    ; SAVE THE POINTER
  686.     XOR    E    ; ADD IN WITH PREVIOUS VALUE
  687.     LD     E,A    ; GET A COPY
  688.     AND    0FH    ; GET LAST 4 BITS OF COMBINED VALUE
  689.     LD     C,A    ; GET INTO C
  690.     LD     B,0    ; AND MAKE HIGH ORDER ZERO
  691.     LD     HL,CRCTB2; POINT AT LOW ORDER TABLE
  692.     ADD    HL,BC    ; POINT TO CORRECT ENTRY
  693.     ADD    HL,BC    ;  .  .  .
  694.     PUSH   HL    ; SAVE THE ADDRESS
  695.     LD     A,E    ; GET COMBINED VALUE BACK AGAIN
  696.     RRCA               ; SHIFT OVER TO MAKE INDEX
  697.     RRCA               ;  .  .  .
  698.     RRCA               ;  .  .  .
  699.     AND    1EH    ; KEEP ONLY 4 BITS
  700.     LD     C,A    ; SET UP TO OFFSET TABLE
  701.     LD     HL,CRCTAB; POINT AT HIGH ORDER TABLE
  702.     ADD    HL,BC    ; CORRECT ENTRY
  703.     LD     A,(HL)    ; GET LOW ORDER PORTION OF ENTRY
  704.     XOR    D    ;XOR             US HIGH ORDER HALF
  705.     INC    HL    ; POINT TO HIGH ORDER BYTE
  706.     LD     D,(HL)    ; GET INTO D
  707.     POP    HL    ; GET BACK POINTER TO OTHER TABLE ENTRY
  708.     XOR    (HL)    ; INCLUDE WITH NEW HIGH ORDER HALF
  709.     LD     E,A    ; COPY NEW LOW ORDER PORTION
  710.     INC    HL    ; POINT TO OTHER PORTION
  711.     LD     A,(HL)    ; GET THE OTHER PORTION OF THE TABLE ENTRY
  712.     XOR    D    ; INCLUDE WITH OTHER HIGH ORDER PORTION
  713.     LD     D,A    ; MOVE BACK INTO D
  714.     POP    HL    ; AND H
  715.     INC    HL    ; POINT TO NEXT CHARACTER
  716.     JP     CRCCL0    ; GO GET NEXT CHARACTER
  717. CRCCL1:    POP    BC    ; RESTORE B
  718.     POP    HL    ; AND HL
  719.     RET                ; AND RETURN, DE=CRC-CCITT
  720. CRCTAB:    DW    00000H
  721.     DW    01081H
  722.     DW    02102H
  723.     DW    03183H
  724.     DW    04204H
  725.     DW    05285H
  726.     DW    06306H
  727.     DW    07387H
  728.     DW    08408H
  729.     DW    09489H
  730.     DW    0A50AH
  731.     DW    0B58BH
  732.     DW    0C60CH
  733.     DW    0D68DH
  734.     DW    0E70EH
  735.     DW    0F78FH
  736. CRCTB2:    DW    00000H
  737.     DW    01189H
  738.     DW    02312H
  739.     DW    0329BH
  740.     DW    04624H
  741.     DW    057ADH
  742.     DW    06536H
  743.     DW    074BFH
  744.     DW    08C48H
  745.     DW    09DC1H
  746.     DW    0AF5AH
  747.     DW    0BED3H
  748.     DW    0CA6CH
  749.     DW    0DBE5H
  750.     DW    0E97EH
  751.     DW    0F8F7H
  752.