home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug156.arc / PACKET.LBR / PACKET.AQM / PACKET.ASM
Assembly Source File  |  1979-12-31  |  53KB  |  1,725 lines

  1.  
  2. TITLE 'PACKET TRANSMISSION / RECEPTION PROGRAM'
  3. ;       11-8-80
  4. ; LAST MODIFIED 4-12-81
  5. ;
  6. ;WRITTEN BY DALE A. HEATHERINGTON, WA4DSY
  7. ;       3126 FLAMINGO DR.
  8. ;       DECATUR, GA     30033
  9. ; tel:  404-292-1499
  10. ;
  11. ;***************************************************************
  12. ;This program has not been perfected and probably has a few bugs
  13. ;in it.  It is for the 2.2 version of CP/M only.  At this time
  14. ;(4-19-81) it has been used by only 2 stations in the Atlanta Ga.
  15. ;area so I have no idea what will happen when several stations
  16. ;get into a "pile up" .  The program could become confused.  There
  17. ;are several fields in the packet which have no function now and
  18. ;may be changed later.  There are some packet types which have not
  19. ;been implemented ie: FS (file seperator).  Also beware of comments
  20. ;;which don't match the code..... 
  21.  
  22. ;Consider this version (1.8) to be in PUBLIC DOMAIN for non-commercial
  23. ;use and distribution. This might not be true for future versions.
  24.  
  25. ;********************************************************************
  26. ;THIS PROGRAM MUST BE ASSEMBLED WITH THE 
  27. ;CP/M RELOACATING MACRO ASSEMBLER (RMAC) AND THE
  28. ;MACRO LIBRARY "SEQIO.LIB" MUST BE AVALABLE.
  29. ;NOTE: SEQIO.LIB WILL NOT WORK WITH RMAC UNLESS
  30. ;MODIFICATIONS ARE MADE.
  31.  
  32.         MACLIB  SEQIO2          ;MODIFIED SEQIO.LIB
  33.  
  34.         VERSION EQU     '1'
  35.         PTVER   EQU     '8'             ;VERSION 1.8
  36.  
  37.  
  38.         ON      EQU     1
  39.         OFF     EQU     0
  40. ;
  41. ;--------------------------------------------------------;
  42. ;
  43. ;                PACKET LAYOUT
  44. ;
  45. ;  BYTE #       BYTES           DESCRIPTION
  46. ;       1       4               LEADER FF,7FH,1FH,7
  47. ;       5       1               SOH             START OF HEADER 
  48. ;       6       2               TOTAL LENGTH OF MESSAGE (STARTING AT CRC)
  49. ;       8       2               CRC BYTES (LOW BYTE FIRST)
  50. ;       10      6               DESTINATION CALL SIGN
  51. ;       16      1               DESTINATION PHYSICAL LOCATION CODE
  52. ;       17      1               DESTINATION REPEATER # (0 = DIRECT)
  53. ;       18      6               SOURCE CALL SIGN
  54. ;       24      1               SOURCE PHYSICAL LOCATION CODE
  55. ;       25      1               SOURCE REPEATER # (0= DIRECT)
  56. ;       26      1               PACKET TYPE (ENQ,ACK,NAK,FS,DTA,FRQ,EOT)
  57. ;       27      12              PACKET NAME (CP/M FILE NAME)
  58. ;       39      2               PACKET NUMBER ( 0..65535 )
  59. ;       41      0..1024         DATA BYTES
  60. ;
  61. ;NOTES:  CRC IS CRC-16 REVERSE  X^16+X^14+X+1 (SAME AS CLINK 3.0)
  62. ;
  63. ; THE PACKET NAME CONFORMS TO CP/M FILE CONTROL BLOCK FORMAT
  64. ; THE FIRST CHARACTER IS THE DRIVE INDICATOR (0=DEFAULT DRIVE)
  65. ; THE NEXT 8 ARE THE FILE NAME PADDED WITH TRAILING BLANKS.
  66. ; THE LAST 3 ARE THE FILE TYPE
  67. ;
  68. ; ALL PACKETS TYPES EXCEPT DATA HAVE A PACKET NUMBER OF ZERO.
  69. ; DATA PACKETS START WITH PACKET NUMBER 1 AND ARE TRANSMITTED
  70. ; IN SEQUENCE.
  71. ;
  72. ; FOUR RETRYS ARE ALLOWED IF PACKETS ARE "NAK'ED"
  73. ;
  74. ;       PACKET TYPES
  75. ;
  76. ;       ENQ     REQUEST TO ESTABLISH COMMUNICATION AND SEND A FILE
  77. ;       FRQ     REQUEST A FILE
  78. ;       FNF     FILE NOT FOUND
  79. ;       DTA     PACKET CONTAINS DATA
  80. ;       EOT     END OF TRANSMISSION
  81. ;       FS      FILE SEPERATOR
  82. ;       ACK     ACKNOWLEDGE RECEIVING PACKET
  83. ;       NAK     DID NOT RECEIVE PACKET
  84. ;       NAV     RECEIVED ENQ BUT NOT AVALABLE TO RECV. DATA     
  85. ;
  86. ;---------------------------------------------------------------------;
  87.  
  88.  
  89.  
  90.         SYN     EQU     255
  91.         DTA     EQU     0
  92.         SOH     EQU     1
  93.  
  94.         FRQ     EQU     3
  95.         EOT     EQU     4
  96.         ENQ     EQU     5
  97.         ACK     EQU     6
  98.         FNF     EQU     7
  99.         NAV     EQU     8
  100.         NAK     EQU     15H
  101.         FS      EQU     1CH
  102.  
  103.  
  104.         NULL    EQU     0
  105.         CR      EQU     0DH
  106.         LF      EQU     0AH
  107.         BDOS    EQU     5
  108.         FCB     EQU     5CH
  109.         CPMBOOT EQU     0
  110.  
  111.         CRCPLY  EQU     8005H
  112.         HDRLEN  SET     TDATA-TCRC      ;HEADER LENGTH
  113.                                         ; CRC TO DATA
  114.  
  115. ;ENTRY LOCATIONS IN THIS MODULE
  116.  
  117.         PUBLIC  RECVIT
  118.         PUBLIC  SENDIT
  119.  
  120. ;EXTERNAL ENTRY LOCATIONS
  121.         EXTRN   CPUCLK          ;CPU CLOCK RATE IN MHZ
  122.         EXTRN   INITX           ;INITIALIZE FOR XMITTING
  123.         EXTRN   INIRX           ;INITIALIZE FOR RECEIVING
  124.         EXTRN   SENDCHR         ;SEND A BYTE (IN REG. C )
  125.         EXTRN   RECVCHR         ;GET A BYTE (IN REG. A)
  126.         EXTRN   RXSTAT          ;RETURN NON ZERO IF BYTE READY
  127.         EXTRN   RFON            ;KEY TRANSMITTER
  128.         EXTRN   RFOFF           ;UNKEY TRANSMITTER
  129.         EXTRN   CKCD            ;RETURN NON ZERO IF CARRIER
  130.         EXTRN   TONEON          ;AUDIO SUBCARRIER ON
  131.         EXTRN   TONEOFF         ;AUDIO SUBCARRIER OFF
  132.         EXTRN   WAIT1           ;WAIT 1 MILLISECOND
  133.         EXTRN   MYCALL          ;USERS CALL SIGN
  134.         EXTRN   MYLOC           ;USERS LOCATION CODE
  135.         EXTRN   QUIT            ;PATH BACK TO CP/M
  136.  
  137. ;--------------------------------------------------------
  138. ;HERE ARE SOME STRING CONSTANTS
  139.  
  140. WHO$R$U: DB     '????????????'          ;12 QUESTION MARKS
  141.  
  142. NOFN:   DB      0,'           '         ;0+11 BLANKS (A BLANK FILE NAME)
  143.  
  144. DIRFILE:DB      0,'DIR        '         ;SPECIAL CASE FOR DIRECTORY
  145.  
  146. SYNCS:  DB      0FFH,07FH,01FH,7,SOH    ;PREAMBLE FOR PACKETS
  147.  
  148. ;----------------------------------------------------------
  149. ;CODE STARTS HERE
  150.  
  151. INIBUFFR:                               ;INITIALIZE TX BUFFER LEADER
  152.         LXI     H,SYNCS
  153.         LXI     D,TBUFFR
  154.         MVI     B,5
  155.         CALL    MOVE
  156.         RET     
  157.  
  158. CLEARBUF:                               ;CLEARS RECEIVE BUFFER HEADER
  159.         MVI     B,RDATA-RBUFFR          ;LENGTH OF HEADER
  160.         LXI     H,RBUFFR                ;RECEIVE HEADER
  161.         LXI     D,RBUFFR+1
  162.         JMP     MOVE                    ;CLEAR RECEIVE HEADER
  163.         
  164.  
  165. ;THIS IS THE FILE TRANSMITTING ROUTINE
  166.  
  167.  
  168. SENDIT: MVI     A,0
  169.         STA     ID$INH          ;DONT INHIBIT NEXT CW ID
  170. SENDIT2:CALL    INIBUFFR
  171.         LXI     H,MYCALL
  172.         MVI     B,6
  173.         CALL    PRNMEM          ;PRINT OUR CALL SIGN
  174.         CALL    PRINT
  175.         DB      ' PACKET TRANSMISSION PROGRAM VER. ',VERSION,'.',PTVER,CR
  176.         CALL    PRINT
  177.         DB      'CPU CLOCK(MHZ) = @'
  178.         LDA     CPUCLK
  179.         ADI     30H
  180.         MOV     C,A
  181.         CALL    CONOUT          ;PRINT CPU CLOCK CONSTANT
  182.         CALL    CRLF
  183.         LXI     H,HDRLEN        ;GET LENGTH OF ENQ PACKET
  184.         SHLD    TLEN            ;PUT IT IN BUFFER
  185.         MVI     A,ENQ
  186.         STA     TPTYPE          ;PUT PACKET TYPE IN BUFFER
  187.         LXI     H,FCB+17                ;GET DESTINATION CALL SIGN
  188.         LXI     D,TDSTCAL
  189.         MVI     B,6
  190.         CALL    MOVE
  191.         MVI     A,4             ;GET LOCATION CODE
  192.         STA     TDSTLOC
  193.         MVI     A,0             ;NON REPEATER
  194.         STA     TDSTRPT
  195.         LXI     H,MYCALL        ;GET OUR CALL SIGN
  196.         LXI     D,TSRCCAL
  197.         MVI     B,6
  198.         CALL    MOVE            ;PUT IT IN XMIT BUFFER
  199.         LDA     MYLOC           ;GET OUR LOCATION CODE
  200.         STA     TSRCLOC         ;PUT IT IN BUFFER
  201.         MVI     A,0
  202.         STA     TSRCRPT         ;REPEATER # IS ZERO
  203.  
  204.         LXI     H,FCB           ;GET FILE NAME
  205.         LXI     D,TTITLE
  206.         MVI     B,12
  207.         CALL    MOVE            ;PUT IT IN BUFFER
  208.         SUB     A
  209.         STA     TTITLE          ;DESTINATE IT TO DEFAULT DRIVE
  210.         LXI     H,0
  211.         SHLD    TPACNUM         ;ZERO THE PACKET NUMBER
  212.  
  213.         LXI     H,TTITLE+1      ;SEE IF DIRECTORY REQUEST "DIR"
  214.         LXI     D,DIRFILE+1
  215.         MVI     B,11
  216.         CALL    COMPARE$
  217.         JNZ     REALFILE        ;JUMP IF NOT DIRECTORY REQUEST
  218.         MVI     A,255
  219.         STA     DIRFLAG         ;SET DIRECTORY FLAG
  220.         CALL    OPEN$DIR        ;SET UP DIRECTORY ROUTINE
  221.         JMP     FIRSTID         ;START SENDING
  222.  
  223.  
  224.  
  225. REALFILE:
  226.         MVI     A,0
  227.         STA     DIRFLAG         ;CLEAR DIRECTORY FLAG
  228.  
  229.         FILE    SETFILE,CHECK,,1,,
  230.         DIRECT  CHECK           ;SEE IF THE FILE IS THERE
  231.  
  232.         JNZ     GOTIT           ;JUMP IF WE FOUND IT
  233.         CALL    PRINT
  234.         DB      'FILE NOT FOUND',CR
  235.         MVI     A,1             ;RETURN A=1 IF NOT FOUND
  236.         ORA     A
  237.         RET
  238.  
  239. GOTIT:  FILE    INFILE,SOURCE,,1,,1024,INBUFFER
  240.  
  241. FIRSTID:                
  242.         CALL    CWID            ;ID IN (YUK) MORSE CODE FOR FCC
  243.         CALL    SENDPAC         ;SEND THE BUFFER CONTENTS (ENQ PACKET)
  244.         JZ      OK2SEND
  245.         CALL    NORPLY          ;SAY HE'S NOT HOME
  246.         RET                     ;QUIT
  247.  
  248. OK2SEND:LXI     H,1             ;SET PACKET NUMBER TO 1
  249.         SHLD    TPACNUM
  250. TXLP:
  251.         LXI     H,1024          ;MAX DATA LENGTH
  252.         SHLD    DATACNT
  253.         LXI     H,TDATA         ;POINTER TO XMIT DATA BUFFER
  254.         SHLD    DATAPTR
  255.         LXI     H,HDRLEN        ;RESET LENGTH FIELD
  256.         SHLD    TLEN
  257.  
  258. FILBUF:
  259.         LDA     DIRFLAG
  260.         ORA     A               ;DIRECTORY OR FILE??
  261.         JZ      FLB1            ;JMP IF FILE
  262.                                 ;ELSE...
  263.         CALL    GETABYTE        ;GET A BYTE FROM DIRECTORY
  264.         JMP     FLB2
  265.  
  266. FLB1:   GET     SOURCE          ;GET A BYTE FROM SOURCE FILE
  267.  
  268. FLB2:   JZ      DONE
  269.         LHLD    DATAPTR
  270.         MOV     M,A             ;PUT IT IN BUFFER
  271.         INX     H               ;ADVANCE POINTER
  272.         SHLD    DATAPTR         ;SAVE IT
  273.         LHLD    TLEN
  274.         INX     H               ;ADVANCE LENGTH FIELD
  275.         SHLD    TLEN
  276.         LHLD    DATACNT
  277.         DCX     H
  278.         SHLD    DATACNT
  279.         MOV     A,L
  280.         ORA     H               ;SEE IF WE DID 1024 BYTES
  281.         JNZ     FILBUF
  282.         MVI     A,DTA
  283.         STA     TPTYPE          ;PACKET TYPE IS DATA
  284.         CALL    SENDPAC         ;NOW TRANSMIT THE PACKET
  285.         JNZ     ERRR
  286.         LHLD    TPACNUM
  287.         INX     H
  288.         SHLD    TPACNUM         ;COUNT THE PACKET
  289.         MOV     A,L
  290.         DCR     A
  291.         ANI     7               ;ID IN CW EVERY 8TH PACKET
  292.         CZ      CWID
  293.         JMP     TXLP            ;GO BACK TO DO ANOTHER PACKET
  294.  
  295. DONE:
  296.         LHLD    TLEN            ;SEE IF LENGTH IS ZERO
  297.         LXI     D,-HDRLEN
  298.         DAD     D
  299.         MOV     A,L
  300.         ORA     H
  301.         JZ      SNDEOT          ;IF ZERO LENGTH JUST DO EOT
  302.  
  303.         MVI     A,DTA           ;ELSE SEND SHORT DATA PACKET
  304.         STA     TPTYPE
  305.         CALL    SENDPAC
  306.         JNZ     ERRR            ;QUIT IF BAD OR NO RESPONSE
  307.  
  308. SNDEOT: MVI     A,EOT
  309. SND2:   STA     TPTYPE
  310.         LXI     H,HDRLEN        ;
  311.         SHLD    TLEN            ;SET LENGTH
  312.         LXI     H,0             ;CONTROL PACKETS HAVE NUMBER 0
  313.         SHLD    TPACNUM
  314.         CALL    SENDPAC         ;SEND LAST PACKET
  315.         PUSH    PSW
  316.         CALL    CWID            ;LET FCC KNOW WHO WE ARE
  317.         POP     PSW
  318.         JNZ     ERRR
  319.         CALL    PRINT
  320.         DB      'ALL PACKETS SENT',CR
  321.         XRA     A               ;RETURN ZERO IF OK
  322.         RET
  323.  
  324.  
  325. ERRR:   CALL    PRINT
  326.         DB      'TRANSMISSION ABORTED',7,CR
  327.         MVI     A,255
  328.         ORA     A
  329.         RET                     ;RETURN NON ZERO IF ERROR
  330.  
  331.  
  332.  
  333. ;THIS IS THE FILE REQUEST ROUTINE
  334. ;COME HERE IF PACKET IS REQUESTING A FILE FROM US.
  335. ;
  336. FLREQ:  CALL    CWID            ;ID IN CRUDE MORSE CODE
  337.         MVI     A,ACK
  338.         STA     TPTYPE
  339.         CALL    SENDAPAC        ;ACK HIS FILE REQUEST
  340.         LXI     H,RSRCCAL       ;GET HIS CALL SIGN
  341.         LXI     D,FCB+17
  342.         MVI     B,6
  343.         CALL    MOVE            ;MOVE IT TO FCB
  344.         MVI     A,1
  345.         STA     ID$INH          ;INHIBIT NEXT CW ID
  346.         CALL    SENDIT2         ;SEND THE FILE IF WE HAVE IT
  347.         RZ                      ;QUIT NOW IF FILE WAS SENT
  348.         CPI     1               ;SEE IF THE FILE WAS NOT IN DIR
  349.         RNZ                     ;RETURN IF JUST BAD SIGNALS
  350.         MVI     A,FNF           ;ELSE SEND FILE NOT FOUND PACKET
  351.         STA     TPTYPE
  352.         LXI     H,HDRLEN
  353.         SHLD    TLEN            ;INIT HEADER LENGTH
  354.         LXI     H,0
  355.         SHLD    TPACNUM         ;SET PACKET NUMBER TO ZERO
  356.         CALL    SENDAPAC        ;SEND THE FNF PACKET
  357.         CALL    CWID
  358.         XRA     A
  359.         RET                     ;ALL DONE
  360.  
  361.  
  362.  
  363.  
  364. ;THIS SENDS A FILE REQUEST PACKET TO THE OTHER GUY IF
  365. ;WE WANTED TO GET A FILE FROM HIM.
  366. ;
  367. SENDFRQ:
  368.         LXI     H,HDRLEN
  369.         SHLD    TLEN
  370.         MVI     A,FRQ
  371.         STA     TPTYPE
  372.         LXI     H,MYCALL
  373.         LXI     D,TSRCCAL
  374.         MVI     B,6             ;SET UP SOURCE CALL
  375.         CALL    MOVE
  376.         LXI     H,FCB+17        ;GET DESTINATION CALL
  377.         LXI     D,TDSTCAL
  378.         MVI     B,6
  379.         CALL    MOVE
  380.         MVI     A,0
  381.         STA     TSRCRPT
  382.         MVI     A,14H           ;DEST. LOCATION CODE
  383.         STA     TDSTLOC
  384.         LDA     MYLOC
  385.         STA     TSRCLOC
  386.         LXI     H,FCB
  387.         LXI     D,TTITLE        ;GET FILE NAME
  388.         MVI     B,12
  389.         CALL    MOVE
  390.         LXI     H,0
  391.         SHLD    TPACNUM         ;CLEAR PACKET NUMBER
  392.         CALL    CWID
  393.         CALL    SENDPAC         ;SEND FRQ PACKET AND GET REPLY
  394.         RET                     ;RETURN ZERO WITH PACKET TYPE IN ACC
  395.  
  396. ;-------------------------------------------------------------------
  397.  
  398. ;       TITLE 'DIRECTORY LISTER'
  399. ;THIS IS A SELF CONTAINED SUBROUTINE WHICH WILL
  400. ;RETURN THE CP/M DIRECTORY A BYTE AT A TIME BY 
  401. ;CALLING "GETABYTE".
  402. ;THE ZERO FLAG WILL BE SET AFTER THE LAST BYTE
  403. ;IS RETURNED.
  404. ;THE SUBROUTINE MUST BE INITIALIZED BY 
  405. ;CALLING "OPEN$DIR" FIRST.
  406.  
  407.         SETDMA  EQU     26
  408.         SEARCH  EQU     17
  409. SEARCH$NEXT     EQU     18
  410. GET$ALLOC       EQU     27
  411. GET$DPBLK       EQU     31
  412.  
  413.  
  414.  
  415. DIRFCB: DB      0       ;DR
  416.         DB      '???????????',0
  417.         DS      20
  418. PWR10:  DW      -1000
  419.         DW      -100
  420.         DW      -10
  421.         DW      -1
  422.  
  423.         DSEG                            ;DATA SEGMENT
  424.  
  425. N1:     DS      0
  426. SWITCH: DS      1
  427. KLEFT:  DS      2                       ;K BYTES LEFT ON DISK
  428. ENCNT:  DS      1
  429. COUNTER:DS      1
  430. DPBADR: DS      2                       ;ADDRESS OF DISK PARAMETER BLOCK
  431. POINTER:DS      2
  432. ENTBUF: DS      16                      ;BUFFER FOR 1 DIR. ENTRY
  433.  
  434. BUFFER: DS      128
  435.  
  436. ;-------------------------------------------------------------
  437.         CSEG                    ;CODE SEGMENT
  438.  
  439.  
  440.  
  441. ;RETURNS HL POINTING TO NEXT DIRECTORY ENTRY
  442.  
  443. ;A=ZERO IF OK OR 255 IF NO MORE ENTRYS
  444.  
  445. GET$ENTRY:
  446.         LDA     SWITCH
  447.         ORA     A
  448.         JZ      SNXT            ;DO SEARCH NEXT IF ZERO
  449.         MVI     C,SETDMA
  450.         LXI     D,BUFFER
  451.         CALL    BDOS            ;SET UP DIRECTORY BUFFER
  452.         LXI     D,DIRFCB
  453.         MVI     C,SEARCH        ;SEARCH FOR FIRST ENTRY
  454.         CALL    BDOS
  455.         JMP     GE2
  456.  
  457. SNXT:   LXI     D,DIRFCB
  458.         MVI     C,SEARCH$NEXT
  459.         CALL    BDOS            ;SEARCH FOR NEXT ENTRY
  460.  
  461. GE2:    CPI     255             ;DONE?
  462.         RZ
  463.         ADD     A               ;MPY BY 32
  464.         ADD     A
  465.         ADD     A
  466.         ADD     A
  467.         ADD     A
  468.         MOV     E,A
  469.         MVI     D,0
  470.         LXI     H,BUFFER
  471.         DAD     D
  472.         XRA     A
  473.         STA     SWITCH          ;CLEAR THE SWITCH
  474.         RET                     ;A=0  HL->ENTRY
  475.  
  476. ;-------------------------------------------------------------
  477.  
  478. OPEN$DIR:                       ;INITIALIZE DIRECTORY LISTER
  479.         MVI     A,255
  480.         STA     SWITCH
  481.         MVI     A,4             ;INIT ENTRY COUNTER
  482.         STA     ENCNT
  483.         MVI     A,1
  484.         STA     COUNTER
  485.         LXI     H,ENTBUF
  486.         SHLD    POINTER
  487.  
  488. ;AT NO EXTRA CHARGE WE NOW GIVE YOU THE NUMBER OF K BYTES
  489. ;LEFT ON THE DISK... RETURNED IN HL
  490.  
  491.         MVI     C,GET$DPBLK     ;GET DISK PRAM. BLOCK ADDRESS
  492.         CALL    BDOS
  493.         SHLD    DPBADR          ;SAVE IT
  494.         LXI     D,5
  495.         DAD     D               ;POINT TO DISK CAPACITY
  496.         MOV     E,M             ;GET IT
  497.         INX     H
  498.         MOV     D,M
  499.         PUSH    D               ;SAVE IT
  500.         MVI     C,GET$ALLOC
  501.         CALL    BDOS            ;GET ADDRESS OF ALLOCATION MAP
  502.         POP     B
  503.         PUSH    B               ;GET AND SAVE DISK CAPACITY
  504.         LXI     D,0             ; BLOCK COUNTER
  505. CNTK:   MOV     A,M             ;GET 8 ALLOCATION UNIT BITS
  506.         PUSH    H               ;SAVE POINTER
  507.         MVI     L,8
  508.         MOV     H,A             ;BITS OF ALLOCATION TO H
  509. CBITS:  MOV     A,H
  510.         ADD     A               ;SHIFT OVER A BIT
  511.         MOV     H,A
  512.         JNC     ZEROB
  513.         INX     D               ;COUNT THE ONE'S
  514. ZEROB:  DCX     B               ;COUNT A BLOCK
  515.         MOV     A,C
  516.         ORA     B
  517.         JZ      NOMORE
  518.         DCR     L               ;COUNT BITS
  519.         JNZ     CBITS           ;LOOP 8 TIMES
  520.         POP     H               ;GET POINTER BACK
  521.         INX     H
  522.         JMP     CNTK            ;LOOP 
  523.  
  524. NOMORE: POP     H
  525.         MOV     A,E             ;TWOS COMPLIMENT BLOCKS USED
  526.         CMA
  527.         MOV     E,A
  528.         MOV     A,D
  529.         CMA
  530.         MOV     D,A
  531.         INX     D
  532.         POP     H               ;GET MAX DISK CAPACITY
  533.         DAD     D               ;ADD THE -KBYTES USED
  534.         INX     H               ;CORRECTION
  535.         PUSH    H               ;PUSH BLOCKS USED ON STACK
  536.         LHLD    DPBADR          ;GET ADDRESS OF DISK PARAMETER BLOCK
  537.         LXI     D,2
  538.         DAD     D               ;POINT TO BLOCK SHIFT FACTOR
  539.         MOV     A,M             ;GET IT
  540.         SUI     3               ;REMOVE BIAS
  541.         POP     H               ;GET BLOCKS LEFT
  542. KLOOP:  ORA     A               ;TEST FOR ZERO
  543.         JZ      KDONE
  544.         DAD     H               ;SHIFT HL
  545.         DCR     A
  546.         JMP     KLOOP   
  547. KDONE:  SHLD    KLEFT           ;SAVE THE NUMBER
  548.         RET
  549.  
  550. ;-------------------------------------------------------------
  551.  
  552. GETABYTE:                       ;GET 1 CHARACTER OF DIRECTORY
  553.  
  554.         LXI     H,COUNTER
  555.         DCR     M
  556.         JZ      ANOTHER
  557.         LHLD    POINTER
  558.         MOV     A,M
  559.         INX     H
  560.         SHLD    POINTER
  561.         ORA     A               ;RETURN NON ZERO IF NOT DONE
  562.         RET
  563.  
  564. ANOTHER:
  565.         LXI     H,ENTBUF        ;CLEAR ENTRY BUFFER POINTER
  566.         SHLD    POINTER
  567.         CALL    GET$ENTRY
  568.         CPI     255
  569.         JZ      PUTK            ;DONE, SAY HOW MANY BYTES LEFT NOW
  570.         MVI     B,8
  571.         LXI     D,ENTBUF
  572. AN1:    INX     H
  573.         MOV     A,M             ;MOVE FILE NAME TO BUFFER
  574.         STAX    D
  575.         INX     D
  576.         DCR     B
  577.         JNZ     AN1
  578.         MVI     A,' '
  579.         MVI     B,4
  580. AN2:    STAX    D
  581.         INX     D
  582.         INX     H
  583.         MOV     A,M
  584.         DCR     B
  585.         JNZ     AN2
  586.         XCHG
  587.         LDA     ENCNT           ;GET ENTRY COUNT
  588.         DCR     A
  589.         JNZ     AN3             ;END OF LINE IF ZERO
  590.         CALL    EOL
  591.         JMP     GETABYTE
  592. AN3:    STA     ENCNT
  593.         MVI     M,' '           ;ELSE PUT UP FENCE
  594.         INX     H
  595.         MVI     M,':'
  596.         INX     H
  597.         MVI     M,' '
  598.         MVI     A,16
  599.         STA     COUNTER
  600.         JMP     GETABYTE
  601.  
  602. EOL:    MVI     M,0DH
  603.         INX     H
  604.         MVI     M,0AH
  605.         INX     H
  606.         MVI     A,15
  607.         STA     COUNTER
  608.         MVI     A,4
  609.         STA     ENCNT
  610.         RET
  611.  
  612.  
  613. PUTK:
  614.         LXI     H,ENTBUF        ;PUTS "XXXX K LEFT" IN BUFF
  615.         CALL    EOL
  616.         SHLD    POINTER
  617.         LHLD    KLEFT
  618.         CALL    DECONV          ;CONVERT K TO DECIMAL & PUT IN BUFFER
  619.         LHLD    POINTER
  620.         LXI     D,KMSG
  621.         MVI     B,11
  622. PKLP:   LDAX    D               ;PUT IN " K LEFT <CR> <LF>"
  623.         MOV     M,A
  624.         INX     D
  625.         INX     H
  626.         DCR     B
  627.         JNZ     PKLP
  628.         LXI     H,ENTBUF
  629.         SHLD    POINTER
  630.         MVI     A,17
  631.         STA     COUNTER
  632.         JMP     GETABYTE
  633.  
  634. KMSG:   DB      ' K LEFT',0DH,0AH,0
  635.                 
  636.  
  637.                 
  638. ;--------------------------------------------------------------
  639. ;CONVERT NUMBER IN HL TO DECIMAL STRING AND PUT IN BUFFER
  640. ;USING "POINTER"
  641.  
  642. DECONV:
  643.         SHLD    N1
  644.         LXI     H,PWR10
  645. DECV0:  MOV     E,M
  646.         INX     H
  647.         MOV     D,M             ;GET POWER OF 10
  648.         INX     H
  649.         PUSH    H
  650.         LHLD    N1
  651.         MVI     C,'0'
  652. DECV1:  DAD     D               ;SUB POWER OF 10 FROM N1
  653.         JNC     DECV2
  654.         INR     C
  655.         JMP     DECV1           ;LOOP TIL IT GOES NEG.
  656. DECV2:  MOV     A,E
  657.         CMA
  658.         MOV     E,A             ;TWOS COMPLIMENT
  659.         MOV     A,D
  660.         CMA
  661.         MOV     D,A
  662.         INX     D
  663.         DAD     D               ;RESTORE TO +
  664.         SHLD    N1
  665.         LHLD    POINTER
  666.         MOV     M,C             ;OUTPUT DIGIT TO BUFFER
  667.         INX     H
  668.         SHLD    POINTER
  669.         POP     H
  670.         MVI     A,1
  671.         CMP     E               ;DONE YET?
  672.         JNZ     DECV0
  673.         RET
  674.  
  675.  
  676.  
  677. ;END OF DIRECTORY LISTER
  678.  
  679.  
  680. ;--------------------------------------------------------------------
  681. ;
  682. ;THIS IS THE FILE RECEIVE ROUTINE
  683. ;
  684. ;
  685. RECVIT:
  686.         MVI     A,0
  687.         STA     ID$INH          ;DONT INHIBIT NEXT CW ID
  688.         CALL    INIBUFFR
  689.         LXI     H,MYCALL
  690.         MVI     B,6
  691.         CALL    PRNMEM          ;PRINT OUR CALL SIGN
  692.         CALL    PRINT
  693.         DB      ' PACKET RECEPTION PROGRAM VER. ',VERSION,'.',PTVER,CR
  694.         CALL    PRINT
  695.         DB      'CPU CLOCK(MHZ)= @'
  696.         LDA     CPUCLK
  697.         ADI     30H
  698.         MOV     C,A
  699.         CALL    CONOUT
  700.         CALL    CRLF
  701.         LDA     80H             ;SEE IF FILE NAME WAS ENTERED
  702.         ORA     A
  703.         JZ      RCV0            ;JUMP IF NORMAL RECEIVE
  704.  
  705.         CALL    SENDFRQ         ;DO FILE REQUEST IF LENGTH NON ZERO     
  706.         RNZ                     ;RETURN IF BAD 
  707.         CPI     ACK             ;SEE IF HE HAD THE FILE
  708.         RNZ                     ;RETURN AND QUIT IF NOT
  709.         MVI     A,1
  710.         STA     ID$INH          ;ALL OK, INHIBIT NEXT CW ID
  711.  
  712. RCV0:   LXI     H,HDRLEN        ;INIT THE TRANSMIT HEADER
  713.         SHLD    TLEN
  714.         MVI     A,ACK
  715.         STA     TPTYPE          ;BE OPTIMISTIC
  716.  
  717.         LXI     H,MYCALL
  718.         LXI     D,TSRCCAL       ;PUT IN OUR CALL
  719.         MVI     B,6
  720.         CALL    MOVE
  721.  
  722.         LDA     MYLOC           ;GET LOCATION CODE
  723.         STA     TSRCLOC
  724.         MVI     A,0
  725.         STA     TSRCRPT         ;WE ARE NOT A REPEATER (YET)
  726.         STA     TDSTLOC         ;CLEAR THE DEST. LOC. CODE
  727.  
  728.         LXI     H,WHO$R$U       ;INIT. THE DEST. CALL WITH ??????
  729.         LXI     D,TDSTCAL
  730.         MVI     B,6
  731.         CALL    MOVE
  732.  
  733.         LXI     H,NOFN          ;CLEAR THE FILE NAME FIELD
  734.         LXI     D,TTITLE
  735.         MVI     B,12
  736.         CALL    MOVE
  737.  
  738.         CALL    PRINT
  739.         DB      'WAITING FOR ENQ PACKET',CR
  740.  
  741.         LXI     H,0
  742.         SHLD    80H             ;CLEAR CP/M DEFAULT BUFFER
  743.         SHLD    TPACNUM         ;CLEAR PACKET NUMBER
  744.         LXI     D,0             ;ZERO TELLS IT TO WAIT FOREVER
  745.         CALL    RECVPAC         ;GET A PACKET
  746.         JNZ     RECVIT          ;JUMP IF BAD
  747.         CPI     FRQ             ;REQUEST FOR FILE?
  748.         JZ      RCV1            ;YES, THEN JUMP
  749.         CPI     ENQ
  750.         JNZ     RECVIT          ;JUMP IF NOT ENQ
  751. RCV1:   LXI     H,RSRCCAL       ;POINT TO SOURCE CALL SIGN
  752.         LXI     D,TDSTCAL       ;MOVE IT TO DESTINATION
  753.         MVI     B,6
  754.         CALL    MOVE
  755.         CALL    CKCALL          ;SEE IF PACKET IS FOR US
  756.         JNZ     RECVIT          ;NO, GO BACK
  757.         
  758.         LXI     H,RTITLE        ;GET FILE NAME TO FCB
  759.         LXI     D,FCB
  760.         MVI     B,12
  761.         CALL    MOVE
  762.         LDA     RPTYPE          ;CHECK PACKET TYPE AGAIN
  763.         CPI     FRQ             ;FILE REQUEST?
  764.         JNZ     RXD3            ;YUP, PROCESS THAT INSTEAD
  765.         CALL    FLREQ
  766.         LXI     H,80H           ;POINT TO CP/M DEFAULT BUFFER
  767.         MVI     M,0             ;CLEAR LENGTH BYTE
  768.         JMP     RECVIT          ;AND GO BACK AND WAIT FOR ENQ
  769.  
  770. RXD3:   FILE    OUTFILE,TEMP,,1,$$$,1024,OUTBUFFER  ;OPEN THE TEMP. FILE
  771.         FILE    SETFILE,DEST,,1,,               ;SET UP FOR REAL FILE
  772.  
  773.         LXI     H,1             ;INIT THE SEQUENCE NUMBER
  774.         SHLD    SEQNUM          ;FOR THE FIRST PACKET
  775.  
  776. RXDLP2: CALL    CWID            ;WASTE TIME WITH PRIMITIVE MORSE CODE
  777.                 
  778. RXDLP1: MVI     A,ACK           ;NOW DO MODERN ASCII STUFF
  779.         STA     TPTYPE
  780.         CALL    SENDAPAC        ;SEND ACK PACK
  781.  
  782. RECVDATA:
  783.         LXI     D,15000         ;SET FOR 15 SEC TIMEOUT
  784.         CALL    RECVPAC         ;GO GET A PACKET
  785.         JNZ     BADPAC
  786.         CPI     FS              ;FS NOT REALLY IMPLIMENTED YET
  787.         JZ      CLOSEIT         ;BUT CLOSE  FILE ANYWAY
  788.         CPI     EOT
  789.         JZ      CLOSEIT
  790.         CPI     ENQ
  791.         JZ      RXDLP1          ;ACK THE EXTRA ENQ
  792.         CPI     DTA             ;DATA?
  793.         RNZ
  794.  
  795.         LHLD    RLEN            ;CHECK FOR ZERO LENGTH
  796.         LXI     D,-HDRLEN
  797.         DAD     D
  798.         MOV     A,L
  799.         ORA     H
  800.         JZ      RXDLP1          ;DISCARD ZERO LENGTH DATA PACKET
  801.  
  802.         LHLD    SEQNUM          ;CHECK FOR DUPLICATE PACKET
  803.         LDA     RPACNUM 
  804.         CMP     L
  805.         JNZ     DISCARD         ;DISCARD IF OUT OF SEQUENCE
  806.         LDA     RPACNUM+1
  807.         CMP     H
  808.         JNZ     DISCARD
  809.         INX     H               ;COUNT THIS PACKET
  810.         SHLD    SEQNUM          ;UPDATE SEQUENCE NUMBER
  811.         LXI     D,-HDRLEN
  812.         LHLD    RLEN            ;GET LENGTH
  813.         DAD     D               ;DATA LENGTH=TOTAL-HEADER
  814.         SHLD    DATACNT         ;SAVE DATA COUNT
  815.         LXI     H,RDATA         ;DATA BUFFER POINTER
  816.         SHLD    DATAPTR         ;SAVE IT
  817. RXDLP:  LHLD    DATAPTR
  818.         MOV     A,M             ;PUT BUFFER CONTENTS ON DISK
  819.         INX     H
  820.         SHLD    DATAPTR
  821.         PUT     TEMP            ;WRITE TO TEMPORARY FILE
  822.         LHLD    DATACNT
  823.         DCX     H
  824.         SHLD    DATACNT         ;COUNT BYTES
  825.         MOV     A,L
  826.         ORA     H
  827.         JNZ     RXDLP           ;LOOP TILL ZERO
  828.         LDA     SEQNUM          ;GET LOW BYTE OF SEQUENCE NUMBER
  829.         ANI     7
  830.         JZ      RXDLP2          ;DO CW ID EVERY 8TH ACK
  831.         JMP     RXDLP1          ;SEND ACK AND DO IT AGAIN
  832.  
  833. DISCARD: CALL   PRINT
  834.         DB      'EXTRA PACKET DISCARDED',CR
  835.         JMP     RXDLP1
  836.  
  837.  
  838. CLOSEIT:
  839.         FINIS   TEMP
  840.         ERASE   DEST
  841.         RENAME  DEST,TEMP
  842.         MVI     A,ACK
  843.         STA     TPTYPE          ;SEND FINAL ACK
  844.         CALL    SENDAPAC
  845.         CALL    CWID            ;FINAL CW ID
  846.         CALL    PRINT
  847.         DB      'FILE RECEIVED',CR
  848.         LXI     H,80H
  849.         MVI     M,0
  850.         JMP     RECVIT          ;GO WAIT FOR ENQ AGAIN
  851.  
  852.  
  853. BADPAC: FINIS   TEMP
  854.         ERASE   TEMP
  855.         CALL    PRINT
  856.         DB      'TOO MANY ERRORS, RECEPTION ABORTED',7,CR
  857.         LXI     H,80H
  858.         MVI     M,0
  859.         JMP     RECVIT
  860.  
  861.                 
  862.  
  863. ;WAIT FOR A SYNC STREAM FOLOWED BY SOH 
  864. ;"TIME" HAS TIMEOUT VALUE IN MS
  865. ;"TIME"= ZERO MEANS WAIT FOREVER
  866. ;
  867. WAITSOH:
  868.         CALL    RFOFF           ;BE SURE WE DONT TRANSMIT
  869.         CALL    INIRX           ;INIT MODEM FOR RECEIVE
  870.         LHLD    TIME
  871.         SHLD    TEMPTIME        ;GET TIMEOUT VALUE
  872. WSOH3:  CALL    CKCRLC          ;CHECK FOR CONTROL C
  873.         CALL    COUNTDOWN       ;DO TIMEOUT TEST
  874.         RZ                      ;RETURN ZERO IF TIMEOUT
  875.         CALL    RXSTAT          ;CHECK FOR A CHARACTER
  876.         ORA     A
  877.         JZ      WSOH3           ;LOOP BACK IF WE DONT HAVE ONE
  878.  
  879.         LXI     H,LEADBB+1      ;LEADIN BUFFER END POINTER
  880.         LXI     D,LEADBB        ;LEADIN START POINTER
  881.         MVI     B,4             ;NUMBER OF BYTES TO SHIFT
  882.         CALL    MOVE            ;SHIFT BYTES OVER
  883.  
  884.         LXI     D,1             ;1 MS TIMEOUT (CHAR. THERE ALREADY)
  885.         CALL    RECVCHR         ;GET THE CHARACTER
  886.         STA     LEADBE          ;STORE AT END OF BUFFER
  887.         LXI     H,LEADBB        ;ADDRESS OF UNKNOWN STRING
  888.         LXI     D,SYNCS         ;THIS IS WHAT WERE LOOKING FOR
  889.         MVI     B,5             ;WE WANT TO CHECK 5 CHARACTERS
  890.         CALL    COMPARE$        ;NOW COMPARE SYNCS WITH UNKNOWN
  891.         JNZ     WSOH3           ;NO MATCH, LOOP BACK
  892.         MVI     A,SOH           ;RETURN WITH SOH MEANS WE GOT IT
  893.         RET
  894.  
  895.  
  896.  
  897.  
  898. COUNTDOWN:
  899.         LHLD    TEMPTIME        ;GET TIMEOUT VALUE
  900.         MOV     A,L
  901.         ORA     H               ;PRETEST FOR ZERO
  902.         JZ      NEVERMIND       ;ZERO MEANS WAIT FOREVER
  903.         DCX     H               ;COUNT 1 MS
  904.         SHLD    TEMPTIME        ;SAVE NEW VALUE
  905.         CALL    WAIT1           ;WAIT 1 MS
  906.         MOV     A,L
  907.         ORA     H
  908.         RET                     ;RET ZERO IF TIMED OUT
  909.  
  910. NEVERMIND:
  911.         MVI     A,255
  912.         ORA     A
  913.         RET                     ;PRETEND WE DIDN'T TIMEOUT
  914.  
  915.         
  916.  
  917. ;CHECKS CONSOLE FOR CONTROL C TO ABORT
  918.  
  919. CKCRLC: CALL    CONST           ;CHECK CONSOLE
  920.         ORA     A
  921.         RZ
  922.         CALL    CONIN           ;GET CONSOLE CHAR
  923.         CPI     3               ;CONTROL C?
  924.         RNZ
  925.         JMP     QUIT
  926. ;---------------------------------------------------------
  927. ;
  928. ;RECEIVES 1 PACKET OF ANY TYPE TO ANY DESTINATION
  929. ;ENTER WITH DE CONTAINING THE TIMEOUT VALUE IN MILLISECONDS.
  930. ;IF DE=0 THE TIMEOUT IS FOREVER
  931. ;IT WILL TRY 4 TIMES TO HEAR THE PACKET BEFORE GIVING UP.
  932. ;RETURNS WITH PACKET TYPE IN REG. A WITH ZERO FLAG SET.
  933. ;RETURNS NON-ZERO IF ERROR.
  934. ;
  935. RECVPAC:
  936.         XCHG
  937.         SHLD    TIME            ;SET TIMEOUT VALUE
  938.         MVI     A,4             ;SET RETRY COUNTER
  939.         STA     RETRYS
  940. RP1:    CALL    RECVAPAC        ;GET 1 PACKET
  941.         JNZ     RP4             ;JUMP IF ERROR
  942.         XRA     A
  943.         LDA     RPTYPE          ;A HAS PACKET TYPE
  944.         RET                     ;EXIT
  945.  
  946. RP4:
  947.         LDA     RETRYS          ;COUNT THE RETRYS
  948.         DCR     A
  949.         STA     RETRYS
  950.         JNZ     RP3
  951.         INR     A
  952.         RET                     ;RETURN NON ZERO IF ERROR
  953.  
  954. RP3:    CALL    CKCALL          ;SEE IF IT WAS FOR US
  955.         JNZ     RP1             ;DONT NAK IF NOT FOR US
  956.         MVI     A,NAK
  957.         STA     TPTYPE
  958.         CALL    SENDAPAC        ;SEND NAK PAC
  959.         JMP     RP1             ;GO BACK AND TRY AGAIN
  960.  
  961.  
  962.  
  963.  
  964. ;GETS 1 PACKET (NO RETRYS, SEE RECVPAC ABOVE)
  965. ;RETURNS ZERO FLAG SET WITH PACKET TYPE IN REG. A
  966. ;IF NO ERRORS
  967. ;"TIME" HAS TIMEOUT VALUE... 0=FOREVER
  968.  
  969.  
  970. RECVAPAC:
  971.         CALL    CLEARBUF        ;CLEAR RECEIVE HEADER
  972.         CALL    WAITSOH         ;WAIT FOR NEW LEADER
  973.         CPI     SOH
  974.         JNZ     TOOLONG         ;MUST BE TIMEOUT IF NO SOH
  975.         LXI     H,HDRLEN+2      ;TOTAL LENGTH OF HEADER
  976.         SHLD    RLEN            ;INITIAL LENGTH
  977.         LXI     H,RCRC          ;SET UP BUFFER POINTER
  978.         SHLD    DATAPTR
  979.         LXI     D,100           ;100 MS TIMEOUT
  980.         CALL    RECVCHR         ;TRY TO GET A CHAR
  981.         JC      TOOLONG
  982.         STA     RLEN            ;GET LOW LENGTH BYTE
  983.         CALL    RECVCHR
  984.         JC      TOOLONG
  985.         STA     RLEN+1          ;HIGH LENGTH BYTE
  986.         LHLD    RLEN            ;GET COUNT
  987.         SHLD    DATACNT         ;SAVE IT
  988.         CPI     5               ;SEE IF LENGTH TOO BIG
  989.         JNC     TOOBIG
  990. RCVLP:  CALL    RECVCHR         ;START GETTING REST OF DATA NOW
  991.         JC      TOOLONG
  992.         LHLD    DATAPTR
  993.         MOV     M,A             ;PUT A BYTE IN PACKET BUFFER
  994.         INX     H
  995.         SHLD    DATAPTR
  996.         LHLD    DATACNT         ;COUNT THE BYTES
  997.         DCX     H
  998.         SHLD    DATACNT
  999.         MOV     A,L
  1000.         ORA     H
  1001.         JNZ     RCVLP           ;LOOP FOR MORE BYTES
  1002.         CALL    RXCRC           ;CHECK RECEIVED CRC
  1003.         JNZ     CRCERR          ;JUMP IF ERROR
  1004.         CALL    PRNRXHEADER     ;PRINT WHAT WE RECEIVED
  1005.         LDA     RPTYPE          ;GET PACKET TYPE
  1006.         CMP     A               ;SET ZERO FLAG
  1007.         RET
  1008.  
  1009. CRCERR: CALL    PRINT
  1010.         DB      '** CRC ERROR **',7,CR
  1011.         XRA     A
  1012.         INR     A
  1013.         RET                     ;RETURN NON ZERO DUE TO ERROR
  1014.  
  1015.  
  1016.                                 
  1017. ;COME HERE AFTER TIMEOUT ERROR
  1018. ;
  1019. TOOLONG:
  1020.         CALL    PRINT
  1021.         DB      '** TIMEOUT ERROR **',7,CR
  1022.         XRA     A
  1023.         INR     A               ;RETURN NON ZERO
  1024.         RET
  1025.  
  1026.  
  1027. TOOBIG:
  1028.         CALL    PRINT
  1029.         DB      '** PACKET TOO BIG FOR BUFFER **',7,CR
  1030.         XRA     A
  1031.         INR     A
  1032.         RET
  1033.  
  1034. ;
  1035. ;
  1036. ;
  1037. ;
  1038. ;----------------------------------------------------------
  1039. ;THIS IS THE PACKET TRANSMISSION SECTION
  1040.  
  1041. ;SEND 1 PACKET AND WAIT FOR REPLY
  1042. ;AND DO IT UP TO 4 TIMES IF IT GETS A NAK BACK
  1043. ;OR A TIMEOUT
  1044.  
  1045. SENDPAC:MVI     A,4             ;RETRY COUNTER
  1046.         STA     RETRYS
  1047. AGAIN:  CALL    SENDAPAC        ;SEND THE PACKET
  1048.         CALL    INIRX           ;SET UP FOR RECEIVE
  1049.         LXI     H,23000         ;23 SEC TIMEOUT
  1050.         SHLD    TIME
  1051.         CALL    RECVAPAC        ;GET REPLY PACKET
  1052.         JNZ     SNDP1           ;ERROR IF NON ZERO
  1053.         CPI     NAK
  1054.         JZ      SNDP1           ;TRY AGAIN IF NAK
  1055.         CMP     A               ;SET ZERO FLAG
  1056.         RET                     ;RETURN PACKET TYPE IN ACC
  1057. SNDP1:  LDA     RETRYS
  1058.         DCR     A
  1059.         STA     RETRYS
  1060.         JZ      SP2
  1061.         CALL    PRINT
  1062.         DB      'RETRANSMITTING',CR
  1063.         JMP     AGAIN           ;TRY AGAIN
  1064.  
  1065. SP2:    MVI     A,1             ;1=ERROR
  1066.         ORA     A
  1067.         RET
  1068. ;
  1069. ;
  1070. ;THIS SENDS 1 PACKET
  1071. ;
  1072. SENDAPAC:
  1073.         CALL    INITX           ;SET UP FOR TRANSMIT
  1074.         LXI     D,3000          ;3 SEC WAIT AFTER KEYDOWN
  1075.         CALL    RFON            ;KEY TRANSMITTER
  1076.         CALL    TXCRC           ;COMPUTE TRANSMIT CRC
  1077.         CALL    PRNTXHEADER     ;TELL USER WHAT WERE SENDING
  1078.         LHLD    TLEN            ;GET PACKET LENGTH
  1079.         INX     H
  1080.         INX     H
  1081.         INX     H
  1082.         INX     H
  1083.         INX     H               ;ADD 7 FOR LEADER AND LENGTH BYTES
  1084.         INX     H
  1085.         INX     H
  1086.         XCHG                    ;TRUE LENGTH IN DE
  1087.         LXI     H,TBUFFR        ;POINT TO START OF BUFFER
  1088. SP1:    MOV     C,M             ;GET A BYTE
  1089.         CALL    SENDCHR         ;SEND IT
  1090.         CALL    CKCRLC          ;ABORT IF CONTROL C TYPED
  1091.         INX     H
  1092.         DCX     D
  1093.         MOV     A,E
  1094.         ORA     D
  1095.         JNZ     SP1             ;LOOP TIL ALL BYTES SENT
  1096.         LXI     D,100
  1097.         CALL    DELAY           ;100 MS TRAILER
  1098.         CALL    RFOFF           ;KILL TRANSMITTER
  1099.         RET
  1100.  
  1101. ;
  1102. ;
  1103. ;
  1104. ;---------------------------------------------------
  1105. ;THIS MESS PRINTS THE HEADER INFORMATION TO THE CONSOLE
  1106. ;FOR PACKETS TO BE SENT OR PACKETS WHICH HAVE BEEN RECEIVED.
  1107.  
  1108. PRNTXHEADER:
  1109.         LXI     H,TBUFFR
  1110.         LXI     D,BUFFR
  1111.         MVI     B,TDATA-TBUFFR
  1112.         CALL    MOVE                    ;GET TRANSMIT HEADER
  1113.  
  1114.         CALL    PRINT
  1115.         DB      'TX-@'
  1116.         CALL    PRINFO
  1117.         RET
  1118.  
  1119. PRNRXHEADER:
  1120.         LXI     H,RBUFFR
  1121.         LXI     D,BUFFR
  1122.         MVI     B,RDATA-RBUFFR
  1123.         CALL    MOVE                    ;GET RECEIVER HEADER
  1124.         CALL    PRINT
  1125.         DB      'RX-@'
  1126. ;
  1127. PRINFO: 
  1128.         LHLD    LEN
  1129.         CALL    BXDEC                   ;PRINT LENGTH
  1130.         CALL    PRINT
  1131.         DB      ' BYTES #@'
  1132.         LHLD    PACNUM
  1133.         CALL    BXDEC                   ;PRINT PACKET NUMBER
  1134.         CALL    PRINT
  1135.         DB      ' @'
  1136.         LXI     H,SRCCAL
  1137.         MVI     B,6
  1138.         CALL    PRNMEM                  ;PRINT SOURCE CALL
  1139.         CALL    PRINT
  1140.         DB      ' -> @'
  1141.         LXI     H,DSTCAL
  1142.         MVI     B,6
  1143.         CALL    PRNMEM                  ;PRINT DESTINATION CALL
  1144.         CALL    PRINT
  1145.         DB      ', @'
  1146.         LXI     H,STITLE+1
  1147.         MVI     B,11
  1148.         CALL    PRNMEM                  ;PRINT FILE NAME
  1149.         CALL    PRINT
  1150.         DB      ' = @'
  1151.         CALL    PRTYPE
  1152.         JMP     CRLF
  1153.         
  1154.  
  1155. PRTYPE: LDA     PTYPE
  1156.         CPI     DTA
  1157.         JZ      TPDTA
  1158.         CPI     ENQ
  1159.         JZ      TPENQ
  1160.         CPI     ACK
  1161.         JZ      TPACK
  1162.         CPI     NAK
  1163.         JZ      TPNAK
  1164.         CPI     FS
  1165.         JZ      TPFS
  1166.         CPI     EOT
  1167.         JZ      TPEOT
  1168.         CPI     FRQ
  1169.         JZ      TPFRQ
  1170.         CPI     FNF
  1171.         JZ      TPFNF
  1172.         CALL    PRINT
  1173.         DB      'UNKNOWN @'
  1174.         RET
  1175.  
  1176. TPDTA:  CALL    PRINT
  1177.         DB      'DATA @'
  1178.         RET
  1179.  
  1180. TPENQ:  CALL    PRINT
  1181.         DB      'ENQ @'
  1182.         RET
  1183.  
  1184. TPACK:  CALL    PRINT
  1185.         DB      'ACK @'
  1186.         RET
  1187.  
  1188. TPNAK:  CALL    PRINT
  1189.         DB      'NAK @'
  1190.         RET
  1191.  
  1192. TPFS:   CALL    PRINT
  1193.         DB      'FS @'
  1194.         RET
  1195.  
  1196. TPEOT:  CALL    PRINT
  1197.         DB      'EOT @'
  1198.         RET
  1199. TPFRQ:  CALL    PRINT
  1200.         DB      'FRQ @'
  1201.         RET
  1202.  
  1203. TPDRQ:  CALL    PRINT
  1204.         DB      'DRQ @'
  1205.         RET
  1206.  
  1207. TPFNF:  CALL    PRINT
  1208.         DB      'FNF @'
  1209.         RET
  1210.  
  1211. ;-----------------------------------------------------
  1212.  
  1213.  
  1214. CRLF:   CALL    PRINT
  1215.         DB      CR
  1216.         RET
  1217.  
  1218.  
  1219. ;COMPARES 2 STRINGS
  1220. ;POINTED TO BY HL & DE (B HAS LENGTH)
  1221. ;RETURNS ZERO FLAG SET IF EQUAL
  1222. ;
  1223. COMPARE$:
  1224.         LDAX    D
  1225.         CMP     M
  1226.         RNZ
  1227.         INX     H
  1228.         INX     D
  1229.         DCR     B
  1230.         JNZ     COMPARE$
  1231.         XRA     A
  1232.         RET
  1233.  
  1234. ;CHECKS THE RECEIVED CALL SIGN AGAINST OUR OWN
  1235. ;RETURNS ZERO IF MATCHED.
  1236.  
  1237. CKCALL: LXI     H,MYCALL
  1238.         LXI     D,RDSTCAL
  1239.         MVI     B,6
  1240.         JMP     COMPARE$
  1241.  
  1242.  
  1243. ;
  1244. ;PRINTS A STRING IN MEMORY POINTED TO BY HL
  1245. ;B HAS LENGTH.
  1246.  
  1247. PRNMEM: MOV     C,M
  1248.         CALL    CONOUT
  1249.         INX     H
  1250.         DCR     B
  1251.         JNZ     PRNMEM
  1252.         RET
  1253.  
  1254.  
  1255. ;
  1256. ;SENDS A CHARACTER IN REG C TO CONSOLE
  1257. ;
  1258.  
  1259. CONOUT: PUSH    PSW
  1260.         PUSH    B
  1261.         PUSH    D
  1262.         PUSH    H
  1263.         MOV     E,C
  1264.         MVI     C,2
  1265.         CALL    BDOS
  1266.         POP     H
  1267.         POP     D
  1268.         POP     B
  1269.         POP     PSW
  1270.         RET
  1271.  
  1272. ;CHECK CONSOLE STATUS
  1273. ;RETURN A=ZERO IF NO KEY PRESSED
  1274. ;
  1275. CONST:  PUSH    B
  1276.         PUSH    D
  1277.         PUSH    H
  1278.         MVI     C,11            ;CP/M CONSOLE STATUS CODE
  1279.         CALL    BDOS
  1280.         POP     H
  1281.         POP     D
  1282.         POP     B
  1283.         RET                     ;A=FF IF KEY PRESSED
  1284. ;
  1285. ;
  1286. ;GETS A CHARACTER FROM CONSOLE
  1287. ;A=CHAR.
  1288. ;
  1289. CONIN:  PUSH    B
  1290.         PUSH    D
  1291.         PUSH    H
  1292.         MVI     C,1             ;READ CONSOLE CPM COMMAND
  1293.         CALL    BDOS
  1294.         POP     H
  1295.         POP     D
  1296.         POP     B
  1297.         RET                     ;A=CHAR
  1298. ;
  1299. ;
  1300. ;PRINT A STRING POINTED TO BY THE CONTENTS OF THE
  1301. ;TOP OF STACK. <CR> OR @ TERMINATES THE STRING.
  1302.  
  1303. PRINT:  XTHL
  1304.         PUSH    PSW
  1305.         PUSH    B
  1306. PRN1:   MOV     A,M
  1307.         INX     H
  1308.         CPI     '@'
  1309.         JZ      PRN2
  1310.         MOV     C,A
  1311.         CALL    CONOUT
  1312.         CPI     CR
  1313.         JNZ     PRN1
  1314.         CALL    PRINT
  1315.         DB      LF,'@'
  1316. PRN2:   POP     B
  1317.         POP     PSW
  1318.         XTHL
  1319.         RET
  1320.  
  1321.  
  1322. ;CONVERTS BINARY NUMBER IN HL TO DECIMAL ASCII
  1323. ;AND SENDS IT TO CONSOLE
  1324.  
  1325. BXDEC:  SHLD    N               ;SAVE NUMBER
  1326.         LXI     H,P10TAB        ;POINT TO POWER OF 10 TABLE
  1327. BX0:    MOV     E,M
  1328.         INX     H
  1329.         MOV     D,M             ;POWER OF 10
  1330.         INX     H
  1331.         PUSH    H
  1332.         LHLD    N
  1333.         MVI     C,'0'
  1334. BX1:    DAD     D               ;SUBTRACT POWER OF TEN
  1335.         JNC     BX2
  1336.         INR     C
  1337.         JMP     BX1             ;LOOP TILL IT GOES NEG.
  1338. BX2:    MOV     A,E
  1339.         CMA                     ;TWOS COMPLIMENT
  1340.         MOV     E,A
  1341.         MOV     A,D
  1342.         CMA
  1343.         MOV     D,A
  1344.         INX     D
  1345.         DAD     D               ;RESTORE TO +
  1346.         SHLD    N               ;SAVE IT
  1347.         CALL    CONOUT
  1348.         POP     H
  1349.         MVI     A,1
  1350.         CMP     E               ;SEE IF WE ARE DONE
  1351.         JNZ     BX0             ;NO, DO AGAIN
  1352.         RET
  1353. ;
  1354. ;
  1355. P10TAB: DW      -10000
  1356.         DW      -1000
  1357.         DW      -100
  1358.         DW      -10
  1359.         DW      -1
  1360.  
  1361. ;
  1362. ;
  1363.         
  1364.  
  1365. ;THIS TELLS THE USER THAT THERE WAS NO RESPONSE
  1366.  
  1367. NORPLY: LXI     D,NOTHOME+2
  1368.         LXI     H,TDSTCAL
  1369.         MVI     B,6
  1370.         CALL    MOVE
  1371.         LXI     D,NOTHOME
  1372.         MVI     C,9
  1373.         CALL    BDOS
  1374.         RET
  1375.  
  1376. NOTHOME:
  1377.         DB      CR,LF,'       DOES NOT RESPOND',CR,LF,'$'
  1378.  
  1379. ;GENERAL PURPOSE MEMORY TO MEMORY MOVE SUBROUTINE
  1380. ;ENTER WITH HL POINTING TO SOURCE, DE POINTING TO
  1381. ;DESTINATION AND B HAS THE LENGTH (0..255, 0=256 BYTES)
  1382.         
  1383. MOVE:   MOV     A,M
  1384.         STAX    D
  1385.         INX     H
  1386.         INX     D
  1387.         DCR     B
  1388.         JNZ     MOVE
  1389.         RET
  1390. ;
  1391. ;ENTER THIS DELAY ROUTINE WITH DE CONTAINING
  1392. ;THE DELAY VALUE IN MILLISECONDS.
  1393.  
  1394. DELAY:  CALL    WAIT1           ;WAIT 1MS * DE
  1395.         DCX     D
  1396.         MOV     A,E
  1397.         ORA     D
  1398.         JNZ     DELAY
  1399.         RET
  1400.  
  1401.  
  1402. ;THIS COMPUTES THE CRC FOR TRANSMISSION
  1403.  
  1404. TXCRC:  LXI     H,0
  1405.         SHLD    CRCREG          ;CLEAR CRC
  1406.         LDA     TLEN
  1407.         MOV     C,A
  1408.         CALL    CALCRC          ;COMPUTE CRC FOR LENGTH FIELD
  1409.         LDA     TLEN+1
  1410.         MOV     B,A             ;BC HAS LENGTH NOW
  1411.         CALL    CALCRC
  1412.         LXI     H,TDSTCAL       ;SKIP OVER CRC FIELD
  1413.         DCX     B
  1414.         DCX     B               ;ADJUST LENGTH
  1415. TXCRC1: MOV     A,M             ;GET A BYTE FROM BUFFER
  1416.         CALL    CALCRC          ;COMPUTE CRC ON IT
  1417.         INX     H               ;ADVANCE BUFFER POINTER
  1418.         DCX     B               ;COUNT THE BYTES
  1419.         MOV     A,C
  1420.         ORA     B
  1421.         JNZ     TXCRC1          ;LOOP UNTIL COUNTER IS ZERO
  1422.         LHLD    CRCREG          ;GET COMPLETE CRC
  1423.         SHLD    TCRC            ;PUT IT IN THE BUFFER
  1424.         RET
  1425.  
  1426. ;COMPUTE CRC ON RECEIVE BUFFER CONTENTS
  1427. ;RETURNS A=0 IF OK
  1428.  
  1429. RXCRC:  LHLD    RLEN            ;GET LENGTH
  1430.         MOV     C,L
  1431.         MOV     B,H             ;BC IS COUNTER
  1432.         LXI     H,0
  1433.         SHLD    CRCREG          ;CLEAR CRC
  1434.         MOV     A,C             ;COMPUTE CRC ON LENGTH WORD
  1435.         CALL    CALCRC
  1436.         MOV     A,B
  1437.         CALL    CALCRC
  1438.         LXI     H,RDSTCAL       ;HL POINT TO BUFFER & SKIP CRC FIELD
  1439.         DCX     B
  1440.         DCX     B               ;ADJUST COUNT
  1441. RXCRC1: MOV     A,M             ;GET A BYTE
  1442.         CALL    CALCRC          ;DO CRC CALC.
  1443.         INX     H
  1444.         DCX     B
  1445.         MOV     A,C
  1446.         ORA     B
  1447.         JNZ     RXCRC1          ;LOOP UNTIL DONE
  1448.         LHLD    CRCREG          ;GET COMPLETE CRC
  1449.         XCHG                    ;TO DE
  1450.         LHLD    RCRC            ;GET RECEIVED CRC
  1451.         MOV     A,E
  1452.         SUB     L
  1453.         RNZ                     ;RETURN NON ZERO IF BAD CRC
  1454.         MOV     A,D
  1455.         SUB     H
  1456.         RET
  1457.  
  1458. ;
  1459. ;THIS COMPUTES THE CRC FROM VALUES IN REGISTER A AND
  1460. ;MEMORY LOCATION "CRCREG".
  1461.  
  1462. CALCRC: PUSH    B
  1463.         PUSH    H
  1464.         MOV     B,A             ;SAVE BYTE
  1465.         MVI     C,8             ;BIT COUNTER
  1466. CALC1:  ANI     80H             ;KEEP MSB
  1467.         LHLD    CRCREG          ;GET CRC
  1468.         XRA     H
  1469.         MOV     H,A             ;XOR CRC INTO DATA
  1470.         DAD     H               ;SHIFT CRC LEFT
  1471.         JNC     CALC2
  1472.         MOV     A,H
  1473.         XRI     CRCPLY SHR 8    ; HL = HL XOR CRC POLYNOMIAL
  1474.         MOV     H,A
  1475.         MOV     A,L
  1476.         XRI     CRCPLY AND 255
  1477.         MOV     L,A
  1478. CALC2:  SHLD    CRCREG          ;SAVE RESULT
  1479.         DCR     C
  1480.         JZ      CALC3
  1481.         MOV     A,B             ;GET DATA
  1482.         ADD     A               ;SHIFT IT LEFT 1 BIT
  1483.         MOV     B,A
  1484.         JMP     CALC1           ;DO IT AGAIN
  1485. CALC3:  POP     H
  1486.         POP     B
  1487.         RET
  1488. ;
  1489. ;------------------------------------------------------------;
  1490. ;
  1491. ;THIS IS A CW ID SUBROUTINE PACKAGE
  1492.  
  1493.  
  1494. ;HERE IS THE ASCII TO CW TRANSLATE TABLE
  1495.  
  1496. ASCII$CW:
  1497.         DB      5+10010000B             ; / -..-.
  1498.         DB      5+11111000B             ;ZERO
  1499.         DB      5+01111000B     ;1
  1500.         DB      5+00111000B     ;2
  1501.         DB      5+00011000B     ;3
  1502.         DB      5+00001000B     ;4
  1503.         DB      5+00000000B     ;5
  1504.         DB      5+10000000B     ;6
  1505.         DB      5+11000000B     ;7
  1506.         DB      5+11100000B     ;8
  1507.         DB      5+11110000B     ;9
  1508.         DB      0               ;:  NOT USED
  1509.         DB      0               ; ; NOT USED
  1510.         DB      0               ; < NOT USED
  1511.         DB      0               ; = NOT USED
  1512.         DB      0               ; > NOT USED
  1513.         DB      0               ; ? NOT USED
  1514.         DB      0               ; @ NOT USED
  1515.         DB      2+01000000B     ; A  .-
  1516.         DB      4+10000000B     ;B -...
  1517.         DB      4+10100000B     ; C -.-.
  1518.         DB      3+10000000B     ; D -..
  1519.         DB      1+00000000B     ; E .
  1520.         DB      4+00100000B     ; F ..-.
  1521.         DB      3+11000000B     ;G --.
  1522.         DB      4+00000000B     ;H
  1523.         DB      2+00000000B     ; I ..
  1524.         DB      4+01110000B     ; J .---
  1525.         DB      3+10100000B     ; K -.-
  1526.         DB      4+01000000B     ; L .-..
  1527.         DB      2+11000000B     ; M --
  1528.         DB      2+10000000B     ; N -.
  1529.         DB      3+11100000B     ; O ---
  1530.         DB      4+01100000B     ; P .--.
  1531.         DB      4+11010000B     ; Q --.-
  1532.         DB      3+01000000B     ; R .-.
  1533.         DB      3+00000000B     ; S ...
  1534.         DB      1+10000000B     ; T -
  1535.         DB      3+00100000B     ; U ..-
  1536.         DB      4+00010000B     ; V ...-
  1537.         DB      3+01100000B     ; W .--
  1538.         DB      4+10010000B     ; X -..-
  1539.         DB      4+10110000B     ; Y -.--
  1540.         DB      4+11000000B     ; Z --..
  1541.  
  1542.  
  1543.  
  1544.         ;THIS IS THE END OF THE TABLE
  1545.  
  1546.  
  1547. ID$STRING:      DS      20      ;RESERVE 20 BYTES FOR ID STRING
  1548. DE$STR:         DB      ' DE '
  1549.  
  1550. CWID:
  1551.         LXI     H,ID$INH        ;ID INHIBIT FLAG
  1552.         MOV     A,M
  1553.         MVI     M,0             ;CLEAR IT
  1554.         ORA     A               ;TEST IT
  1555.         RNZ                     ;DONT ID THIS TIME IF TRUE
  1556.         LXI     H,TDSTCAL       ;GET DESTINATION CALL
  1557.         LXI     D,ID$STRING
  1558.         MVI     B,6
  1559.         CALL    MOVE
  1560.  
  1561.         LXI     H,DE$STR        ;POINT TO "DE" STRING
  1562.         MVI     B,4
  1563.         CALL    MOVE
  1564.  
  1565.         LXI     H,MYCALL        ;PUT OUR CALL IN
  1566.         MVI     B,6
  1567.         CALL    MOVE
  1568.         XCHG
  1569.         MVI     M,' '           ;TRAILING SPACE
  1570.         INX     H
  1571.         MVI     M,0             ;NULL TERMINATES STRING
  1572.  
  1573.         CALL    INITX           ;INIT. FOR TRANSMITTING
  1574.         CALL    TONEOFF
  1575.         LXI     D,200           ;DELAY 200 MS AFTER KEY DOWN
  1576.         CALL    RFON            ;KEY TRANSMITTER
  1577.  
  1578.         LXI     H,ID$STRING
  1579. CWID1:  MOV     A,M             ;GET A ASCII CHAR.
  1580.         ORA     A               ;NULL?
  1581.         JZ      RFOFF           ;QUIT IF NULL
  1582.         CPI     '0'
  1583.         JC      CWID2           ;IGNORE INVALID CHAR
  1584.         PUSH    H
  1585.         MOV     C,A
  1586.         CALL    SEND$CW$CHAR    ;CONVERT TO CW AND SEND
  1587.         POP     H
  1588. CWID2:  INX     H
  1589.         JMP     CWID1           ;LOOP TILL DONE
  1590.  
  1591.  
  1592.  
  1593. SEND$CW$CHAR:
  1594.         PUSH    B
  1595.         CALL    TONEOFF
  1596.         MVI     C,2
  1597.         CALL    DELAYX          ;WAIT 2 DOT TIMES
  1598.         POP     B               ;GET ASCII CHARACTER BACK
  1599.         LXI     H,ASCII$CW-2FH  ;POINT TO CONVERSION TABLE
  1600.         MOV     A,C
  1601.         CPI     20H             ;TEST FOR SPACE
  1602.         JNZ     CW1
  1603.         MVI     C,7             ;7 DOT TIMES FOR SPACE
  1604.         JMP     DELAYX
  1605. CW1:    MVI     B,0
  1606.         DAD     B               ;INDEX INTO TABLE
  1607.         MOV     A,M             ;GET CW CODE
  1608.         ANI     7               ;KEEP COUNT
  1609.         RZ                      ;RETURN IF ZERO COUNT
  1610.         MOV     B,A             ;PUT COUNT IN REG. B
  1611.         MOV     A,M             ;GET CODE AGAIN
  1612. CW2:    ADD     A               ;SHIFT MSB INTO CARRY
  1613.         MVI     E,1             ;ASSUME A DOT
  1614.         JNC     CW3             ;JUMP IF DOT
  1615.         MVI     E,3             ;ELSE SET FOR DASH
  1616. CW3:    PUSH    B               ;SAVE COUNT
  1617.         PUSH    PSW             ;SAVE CODE
  1618.         CALL    TONEON          ;TURN ON TONE
  1619.         MOV     C,E             ;GET TIME
  1620.         CALL    DELAYX
  1621.         CALL    TONEOFF         ; TONE OFF
  1622.         MVI     C,1
  1623.         CALL    DELAYX          ;WAIT 1 DOT TIME
  1624.         POP     PSW             ;RESTORE CODE
  1625.         POP     B               ;RESTORE COUNT
  1626.         DCR     B               ;COUNT DOWN
  1627.         JNZ     CW2             ;LOOP TILL FINISHED
  1628.         RET
  1629.  
  1630. ;THIS TIMES 1 DIT.
  1631.  
  1632. DELAYX: MOV     A,C
  1633.         ORA     A
  1634.         RZ
  1635.         PUSH    B
  1636.         PUSH    D
  1637. DLY1:   LXI     D,50            ;50 MS DELAY
  1638.         CALL    DELAY
  1639.         DCR     C
  1640.         JNZ     DLY1
  1641.         POP     D
  1642.         POP     B
  1643.         RET
  1644.  
  1645. ;END OF CW ID ROUTINES
  1646. ;--------------------------------------------------------;
  1647. ;
  1648. ;
  1649.         DSEG                    ;BEGIN DATA SEGMENT
  1650.  
  1651. ;
  1652. ;THIS IS THE VARIABLE STORAGE AREA
  1653.  
  1654.  
  1655.  
  1656.  
  1657. CRCREG: DS      2               ;USED BY CRC ROUTINE
  1658. N:      DS      2               ;USED BY BXDEC ROUTINE
  1659. DATAPTR:DS      2
  1660. DATACNT:DS      2
  1661. RETRYS: DS      1               ;RETRY COUNTER
  1662. SEQNUM: DS      2               ;LOCAL COUNT OF RECEIVED PACKETS
  1663. DIRFLAG:DS      1               ;1=DIRECTORY 0=NORMAL FILE
  1664. ID$INH: DS      1               ;1=INHIBIT NEXT ID
  1665. LEADBB: DS      4               ;LEADER BUFFER BEGINNING
  1666. LEADBE: DS      1               ;LEADER BUFFER END
  1667. TIME:   DS      2               ;USED FOR TIMEOUTS
  1668. TEMPTIME: DS    2
  1669.  
  1670. ;SCRATCH PAD PACKET HEADER
  1671.  
  1672. BUFFR:  DS      5               ;LEADER
  1673. LEN:    DS      2               ;TOTAL LENGTH OF MESSAGE
  1674. CRC:    DS      2               ;CRC BYTES
  1675. DSTCAL: DS      6               ;DESTINATION CALL SIGN
  1676. DSTLOC: DS      1               ;DESTINATION LOCATION CODE
  1677. DSTRPT: DS      1               ;DESTINATION REPEATER (0=DIRECT)
  1678. SRCCAL: DS      6               ;SOURCE CALL SIGN
  1679. SRCLOC: DS      1               ;SOURCE LOCATION CODE
  1680. SRCRPT: DS      1               ;SOURCE REPEATER (0=DIRECT)
  1681. PTYPE:  DS      1               ; PACKET TYPE
  1682. STITLE: DS      12              ;NAME OF PACKET GROUP (CP/M FILE NAME)
  1683. PACNUM: DS      2               ;PACKET NUMBER
  1684.  
  1685. ;TRANSMIT PACKET BUFFER
  1686.  
  1687. TBUFFR: DS      5               ;LEADER
  1688. TLEN:   DS      2               ;TOTAL LENGTH OF MESSAGE
  1689. TCRC:   DS      2               ;CRC BYTES
  1690. TDSTCAL:DS      6               ;DESTINATION CALL SIGN
  1691. TDSTLOC:DS      1               ;DESTINATION LOCATION CODE
  1692. TDSTRPT:DS      1               ;DESTINATION REPEATER (0=DIRECT)
  1693. TSRCCAL:DS      6               ;SOURCE CALL SIGN
  1694. TSRCLOC:DS      1               ;SOURCE LOCATION CODE
  1695. TSRCRPT:DS      1               ;SOURCE REPEATER (0=DIRECT)
  1696. TPTYPE: DS      1               ; PACKET TYPE
  1697. TTITLE: DS      12              ;NAME OF PACKET GROUP (CP/M FILE NAME)
  1698. TPACNUM:DS      2               ;PACKET NUMBER
  1699. TDATA:  DS      1024            ;THIS IS THE DATA
  1700.  
  1701.  
  1702. ;RECEIVE PACKET BUFFER
  1703. ;
  1704. RBUFFR: DS      5               ;LEADER
  1705. RLEN:   DS      2               ;LENGTH OF RECEIVED PACKET
  1706. RCRC:   DS      2               ;RECEIVED CRC BYTES
  1707. RDSTCAL:DS      6               ;DESTINATION CALL SIGN
  1708. RDSTLOC:DS      1               ;DESTINATION LOCATION CODE
  1709. RDSTRPT:DS      1               ;DESTINATION REPEATER (0=DIRECT)
  1710. RSRCCAL:DS      6               ;SOURCE CALL SIGN
  1711. RSCRLOC:DS      1               ;SOURCE LOCATION CODE
  1712. RSCRRPT:DS      1               ;SOURCE REPEATER (0=DIRECT)
  1713. RPTYPE: DS      1               ;PACKET  TYPE
  1714. RTITLE: DS      12              ;NAME OF PACKET GROUP (FILE NAME)
  1715. RPACNUM:DS      2               ;PACKET NUMBER
  1716. RDATA:  DS      1024            ;RECEIVED DATA
  1717. ;
  1718. ;
  1719. ;
  1720. ;
  1721. INBUFFER:       DS      1024    ;FILE READ BUFFER
  1722. OUTBUFFER:      DS      1024    ;FILE OUTPUT BUFFER
  1723.  
  1724.         END
  1725.