home *** CD-ROM | disk | FTP | other *** search
/ ftp.whtech.com / ftp.whtech.com.tar / ftp.whtech.com / Geneve / 9640news / CAT14 / SPRCRT.ARK < prev    next >
Text File  |  2006-10-19  |  20KB  |  461 lines

  1. ?
  2. * The following source code is intended to be a support routine for
  3. * SUPER-CART programmers who need stand-alone support for their programs
  4. * which reside in the >6000 to >7FFF cartridge space. It definitely
  5. * supports KSCAN, VSBW, VMBW, VSBR, VMBR, VWTR, DSRLNK, XMLLNK and
  6. * GPLLNK and these have been proven to work. It also has a CIF routine
  7. * which I haven't had an opportunity to test. Probably much of it could
  8. * be weeded out to conserve space. The bulk of the routines were kindly
  9. * sent me by David Romer and consist of the UTILEQU, UTILRAM, and UTILROM
  10. * files which I understand to be part of the (public domain) TI-FORTH
  11. * source code. I also note that these same files were incorporated into
  12. * Tom Knight's TK-WRITER source code. My contributions to this routine
  13. * consist of the blocks whose comments are mainly written in upper case
  14. * and this entire file is meant to be released to public domain for use
  15. * and redistribution by anyone who wishes it. I had trouble getting the
  16. * GPLLNK routine to work and with the kind permission of Paul Charlton,
  17. * have incorporated his GPLLNK routines from his Fast-Term program which
  18. * do work in this environment. See program comments for more details.
  19. * I would certainly appreciate any feedback or corrections anyone finds and
  20. * I hope this is helpful. Enjoy!  Jim McCulloch, 9505 Drake Avenue,
  21. * Evanston, IL 60203-1107  (CIS 74766,500)
  22. * ***********************************************************************
  23. * SUPER-CART SKELETON ROUTINE: for SUPER-CART programmers to hang their
  24. * routines on and flesh it out more. This version done 14 December 1985.
  25. * ***********************************************************************
  26.        DEF  PROG3,PROG4,PROG5,PROG6,PROG7,PROG8,PROG9
  27. *                        THERE ARE SPACES FOR 9 MENU SELECTIONS WITH TI-BASIC
  28. *                        AND E/A TAKING UP THE FIRST TWO. PROGRAMS 3-9 ARE
  29. *                        YOURS.
  30.        AORG >6000        THIS IS THE BEGINNING OF THE SUPER-CART SPACE IN MEMORY
  31. SCNKEY EQU  >000E
  32. XMLTAB EQU  >0CFA        XML tables (base)
  33. PAB    EQU  >1000        PERIPHERAL ACCESS BLOCK
  34. FLAG2  EQU  >8349
  35. FAC    EQU  >834A        USED BY THE CIF ROUTINE AS WELL AS GPLLNK, ETC.
  36. SCLEN  EQU  >8355
  37. SCNAME EQU  >8356
  38. SUBSTK EQU  >8373
  39. STATUS EQU  >837C        GPL STATUS REGISTER
  40. CRULST EQU  >83D0
  41. SADDR  EQU  >83D2
  42. GPLWS  EQU  >83E0        GPL/EXTENDED BASIC workspace
  43. PAD    EQU  >8300
  44. VDPRD  EQU  >8800        VDP read data address
  45. VDPSTA EQU  >8802        VDP RAM status
  46. VDPWD  EQU  >8C00        VDP write data address
  47. VDPWA  EQU  >8C02        VDP write address address
  48. R0LB   EQU  >83E1
  49. R1LB   EQU  >83E3
  50. R3LB   EQU  >83E7
  51. GRMWD  EQU  >9C00        GROM/GRAM write data
  52. GRMWA  EQU  >9C02        GROM/GRAM write address
  53. GRMRD  EQU  >9800        GROM/GRAM read data
  54. GRMRA  EQU  >9802        GROM/GRAM read address
  55.        DATA >AA01        VALIDATES THIS TO BE A VALID CARTRIDGE HEADER
  56.        DATA 0
  57.        DATA 0
  58.        DATA CHAIN        POINTER TO DATA CHAIN WHICH SHOWS THAT THERE ARE MENU
  59. *                        SELECTIONS TO BE DISPLAYED AND MADE
  60.        DATA 0
  61.        DATA 0
  62. CHAIN  DATA LINKA        POINTER TO NEXT DATA LINK
  63.        DATA P9           LABEL POINTS TO BRANCH TO PROGRAM. NOTE THAT THE BOTTOM
  64. *                        PROGRAM ON THE MENU DISPLAY IS PLACED FIRST AND THAT
  65. *                        THEY THEN WORK UPWARD.
  66.        BYTE >04          NUMBER OF CHARACTERS TO BE DISPLAYED IN THE MENU LIST
  67.        TEXT 'EXIT'       TITLE TO BE DISPLAYED IN THE MENU
  68. P9     B    @PROG9       BRANCH TO PROGRAM 9
  69. LINKA  DATA LINKB        POINTER TO NEXT DATA LINK
  70.        DATA P8           POINTER TO PROGRAM BRANCH
  71.        BYTE >15          NUMBER OF CHARACTERS TO DISPLAY IN MENU LISTING
  72.        TEXT 'WIPE CARTRIDGE MEMORY'    PROGRAM TITLE FOR MENU
  73. P8     B    @PROG8       BRANCH TO PROGRAM 8
  74. LINKB  DATA LINKC        POINTER TO NEXT DATA LINK
  75.        DATA P7           POINTER TO PROGRAM BRANCH
  76.        BYTE >09          NUMBER OF CHARACTERS TO DISPLAY IN MENU LISTING
  77.        TEXT 'PROGRAM 7'  TITLE TO BE DISPLAYED IN MENU
  78. P7     B    @PROG7       BRANCH TO PROGRAM 7
  79. LINKC  DATA LINKD        POINTER TO NEXT DATA LINK
  80.        DATA P6           POINTER TO PROGRAM BRANCH
  81.        BYTE >09          NUMBER OF CHARACTERS TO DISPLAY IN MENU LISTING
  82.        TEXT 'PROGRAM 6'  TITLE TO BE DISPLAYED IN MENU
  83. P6     B    @PROG6       BRANCH TO PROGRAM 6
  84. LINKD  DATA LINKE        POINTER TO NEXT DATA LINK
  85.        DATA P5           POINTER TO PROGRAM BRANCH
  86.        BYTE >09          NUMBER OF CHARACTERS TO DISPLAY IN MENU LISTING
  87.        TEXT 'PROGRAM 5'  TITLE TO BE DISPLAYED IN MENU
  88. P5     B    @PROG5       BRANCH TO PROGRAM 5
  89. LINKE  DATA LINKF        POINTER TO NEXT DATA LINK
  90.        DATA P4           POINTER TO PROGRAM BRANCH
  91.        BYTE >09          NUMBER OF CHARACTERS TO DISPLAY IN MENU LISTING
  92.        TEXT 'PROGRAM 4'  TITLE TO BE DISPLAYED IN MENU
  93. P4     B    @PROG4       BRANCH TO PROGRAM 4
  94. LINKF  DATA 0            NO MORE PROGRAMS IN THE CHAIN!
  95.        DATA P3           POINTER TO PROGRAM BRANCH
  96.        BYTE >09          NUMBER OF CHARACTERS TO DISPLAY IN MENU LISTING
  97.        TEXT 'PROGRAM 3'  TITLE TO BE DISPLAYED IN MENU
  98. P3     B    @PROG3       BRANCH TO PROGRAM 3
  99. WS     BSS  32           WORKSPACE REGISTERS FOR MY PROGRAMS
  100. SVGPRT DATA 0            Save GPL return address
  101. SAVCRU DATA 0            CRU address of peripheral
  102. SAVENT DATA 0            Entry address of DSR
  103. SAVLEN DATA 0            Save device name length
  104. SAVPAB DATA 0            Ptr into device name in PAB
  105. SAVVER DATA 0            Version number of DSR
  106. GRMSAV DATA 0            USED BY THE PREGPL AND GPLLNK ROUTINES
  107. NAMBUF DATA 0,0,0,0
  108. *
  109. *** General utility workspace registers (Overlaps next WS)
  110. UTILWS DATA 0,0
  111.        BYTE 0
  112. R2LB   BYTE 0
  113. *
  114. *** DSR link routine workspace registers (Overlaps prev. WS)
  115. DLNKWS DATA 0,0,0,0,0
  116. TYPE   DATA 0,0,0,0,0,0,0,0,0,0,0
  117. *
  118. C100   DATA 100
  119. H20    BYTE >20
  120.        EVEN
  121. H2000  DATA >2000
  122. DECMAL TEXT '.'
  123. HAA    BYTE >AA
  124. CL     BYTE >00          BYTE USED TO CLEAR @STATUS
  125.        EVEN
  126. *
  127. * Utility Vectors
  128. *
  129. GPLLNK DATA UTILWS,GLENTR     Link to GROM routines
  130. XMLLNK DATA UTILWS,XMLENT     Link to ROM routines
  131. KSCAN  DATA UTILWS,KSENTR     Keyboard scan
  132. VSBW   DATA UTILWS,VSBWEN     VDP single byte write
  133. VMBW   DATA UTILWS,VMBWEN     VDP multiple byte write
  134. VSBR   DATA UTILWS,VSBREN     VDP single byte read
  135. VMBR   DATA UTILWS,VMBREN     VDP multiple byte read
  136. VWTR   DATA UTILWS,VWTREN     VDP write to register
  137. DSRLNK DATA DLNKWS,DLENTR     Link to device service routine
  138. *
  139. *===========================================================
  140. * PRE-GPLLNK ROUTINE: THIS INITIALLIZES A POINTER USED BY THE
  141. * GPLLNK ROUTINE. IF YOU INTEND ON USING GPLLNK IN YOUR PROGRAM,
  142. * MAKE SURE YOU INCLUDE A "BL  @PREGPL" STATEMENT SOMETIME BEFORE
  143. * INVOKING GPLLNK. (ONLY NEEDS TO BE DONE ONCE.) THIS CODE WAS
  144. * TAKEN WITH PERMISSION FROM PAUL CHARLTON'S FAST-TERM SOURCE CODE
  145. * AND IS ALSO CONSIDERED BY THE AUTHOR TO BE PUBLIC DOMAIN.
  146. *
  147. PREGPL CLR  R0           START AT THE BEGINNING
  148.        LI   R8,>0F00     R8h=GROM XMLLNK op-code
  149.        LI   R9,>F000     R9h=acceptable XMLLNK parameter
  150. AGAIN  MOVB R0,@GRMWA    get GROM byte
  151.        SWPB R0
  152.        MOVB R0,@GRMWA
  153.        SWPB R0
  154.        MOVB @GRMRD,R1
  155.        NOP
  156. AGAIN1 CB   R1,R8        is it XMLLNK op-code?
  157.        JEQ  FNDLNK       yes, check its parameter
  158.        INC  R0           no,
  159.        JNO  AGAIN        check next byte
  160.        BLWP @>0000       return to system monitor
  161. *
  162. FNDLNK INC  R0           found XMLLNK op-code
  163.        MOVB @GRMRD,R1    get next byte
  164.        CB   R1,R9        is it the right XML vector?
  165.        JNE  AGAIN1       no - jump back to see if current byte is opcode too
  166. *
  167.        DEC  R0           found whole XMLLNK call
  168.        MOV  R0,@GRMSAV   put address where GPLLNK can find it
  169.        RT
  170. *
  171. *==========================================================
  172. *      LINK TO SYSTEM XML UTILITIES
  173. *
  174. XMLENT MOV  *R14+,@GPLWS+2    Get argument
  175.        LWPI GPLWS             Select GPL workspace
  176.        MOV  R11,@UTILWS+22    Save GPL return address
  177.        MOV  R1,R2             Make a copy of argument
  178.        CI   R1,>8000          Direct address in ALC?
  179.        JH   XML30             We have the address
  180.        SRL  R1,12
  181.        SLA  R1,1
  182.        SLA  R2,4
  183.        SRL  R2,11
  184.        A    @XMLTAB(R1),R2
  185.        MOV  *R2,R2
  186. XML30  BL   *R2
  187.        LWPI UTILWS            GET BACK TO RIGHT WS
  188.        MOV  R11,@GPLWS+22     Restore GPL return address
  189.        RTWP
  190. *
  191. *===========================================================
  192. *** Link to GPL utilities
  193. *
  194. * THIS GPLLNK CODE WAS TAKEN WITH PERMISSION FROM PAUL CHARLTON'S
  195. * FAST-TERM SOURCE CODE AND IS CONSIDERED BY THE AUTHOR TO BE PUBLIC
  196. * DOMAIN. BEFORE YOU INVOKE GPLLNK IN YOUR PROGRAM ("BLWP @GPLLNK"),
  197. * BE SURE YOU INCLUDE A "BL @PREGPL" IN YOUR PROGRAM TO ESTABLISH AN
  198. * ADDRESS WHICH THE GPLLNK ROUTINE USES.
  199. *
  200. GLENTR MOVB @SUBSTK,R1        Fetch GPL subroutine stack pointer
  201.        SRL  R1,8              Make it an index
  202.        AI   R1,>8302
  203.        MOV  @GRMSAV,*R1       Push XML address for return
  204.        SWPB R1
  205.        MOVB R1,@SUBSTK        adjust stack pointer
  206.        MOVB *R14+,@GRMWA      Set up address to call
  207.        NOP
  208.        MOVB *R14+,@GRMWA      and second byte, adjusting return
  209.        NOP
  210.        LI   R0,RTFGPL
  211.        MOV  R0,@PAD
  212.        LWPI GPLWS
  213.        B    @>006A
  214. *
  215. *** Return to assembly language from GPL
  216. *
  217. RTFGPL LWPI UTILWS       Select utility workspace
  218.        RTWP              Return to calling AL routine
  219. *
  220. *==============================================================
  221. *      KEYBOARD SCAN
  222. *
  223. KSENTR LWPI GPLWS
  224.        MOV  R11,@UTILWS+22   Save GPL return address
  225.        BL   @SCNKEY
  226.        LWPI UTILWS
  227.        MOV  R11,@GPLWS+22    Restore GPL return address
  228.        RTWP
  229. *
  230. *==============================================================
  231. *      VDP UTILITIES
  232. *
  233. ** VDP single byte write
  234. *
  235. VSBWEN BL   @WVDPWA          Write out address
  236.        MOVB @2(R13),@VDPWD   Write data
  237.        RTWP                  Return to calling program
  238. *
  239. ** VDP multiple byte write
  240. *
  241. VMBWEN BL   @WVDPWA          Write out address
  242. VWTMOR MOVB *R1+,@VDPWD      Write a byte
  243.        DEC  R2               Decrement byte count
  244.        JNE  VWTMOR           More to write?
  245.        RTWP                  Return to calling Program
  246. *
  247. ** VDP single byte read
  248. *
  249. VSBREN BL   @WVDPRA          Write out address
  250.        MOVB @VDPRD,@2(R13)   Read data
  251.        RTWP                  Return to calling program
  252. *
  253. ** VDP multiple byte read
  254. *
  255. VMBREN BL   @WVDPRA          Write out address
  256. VRDMOR MOVB @VDPRD,*R1+      Read a byte
  257.        DEC  R2               Decrement byte count
  258.        JNE  VRDMOR           More to read?
  259.        RTWP                  Return to calling program
  260. *
  261. ** VDP write to register
  262. *
  263. VWTREN MOV  *R13,R1          Get register number and value
  264.        MOVB @1(R13),@VDPWA   Write out value
  265.        ORI  R1,>8000         Set for register write
  266.        MOVB R1,@VDPWA        Write out register number
  267.        RTWP                  Return to calling program
  268. *
  269. ** Set up to write to VDP
  270. *
  271. WVDPWA LI   R1,>4000
  272.        JMP  WVDPAD
  273. *
  274. ** Set up to read VDP
  275. *
  276. WVDPRA CLR  R1
  277. *
  278. ** Write VDP address
  279. *
  280. WVDPAD MOV  *R13,R2          Get VDP address
  281.        MOVB @R2LB,@VDPWA     Write low byte of address
  282.        SOC  R1,R2            Properly adjust VDP write bit
  283.        MOVB R2,@VDPWA        Write high byte of address
  284.        MOV  @2(R13),R1       Get CPU RAM address
  285.        MOV  @4(R13),R2       Get byte count
  286.        RT                    Return to calling routine
  287. *
  288. *===========================================================
  289. *      CIF - Convert integer to floating                   *
  290. *
  291. CIF    LI   R4,FAC            Will convert into the FAC
  292.        MOV  *R4,R0            Get integer into register
  293.        MOV  R4,R6             Copy ptr to FAC to clear it
  294.        CLR  *R6+              Clear FAC,FAC+1
  295.        CLR  *R6+              in case had a string in FAC
  296.        MOV  R0,R5             is integer equal to zero?
  297.        JEQ  CIFRT             yes - zero result and return
  298.        ABS  R0                get ABS value of arg
  299.        LI   R3,>40            get exponent bias
  300.        CLR  *R6+              clear words in result that
  301.        CLR  *R6                 might not get a value
  302.        CI   R0,100            is integer < 100?
  303.        JL   CIF02             yes-just put in 1st fraction
  304. *                                part
  305.        CI   R0,10000          no-is arg < 100,2?
  306.        JL   CIF01             yes-just 1 division necessary
  307. *                             no - 2 divisions are necessary
  308.        INC  R3                add 1 to exponent for 1st div
  309.        MOV  R0,R1             put # in low order word for
  310. *                               the divide
  311.        CLR  R0                clear high order word for the
  312. *                                divide
  313.        DIV  @C100,R0          divide by the radix
  314.        MOVB @R1LB,@3(R4)      move the radix digit in
  315. CIF01
  316.        INC  R3                add 1 to exponent for divide
  317.        MOV  R0,R1             put in low order for divide
  318.        CLR  R0                clear high order for divide
  319.        DIV  @C100,R0          divide by the radix
  320.        MOVB @R1LB,@2(R4)      put next radix digit in
  321. CIF02
  322.        MOVB @R0LB,@1(R4)      put highest order radix digit
  323. *                             in
  324.        MOVB @R3LB,*R4         put exponent in
  325.        INV  R5                is result positive?
  326.        JLT  CIFRT             yes - sign is correct
  327.        NEG  *R4               no - make it negative
  328. CIFRT  RT
  329. *
  330. *===========================================================
  331. *** Link to device service routine
  332. *
  333. DLENTR MOV  *R14+,R5          Fetch program type for link
  334.        SZCB @H20,R15          Reset equal bit
  335.        MOV  @SCNAME,R0        Fetch pointer into PAB
  336.        MOV  R0,R9             Save pointer
  337.        AI   R9,-8             Adjust pointer to flag byte
  338.        BLWP @VSBR             Read device name length
  339.        MOVB R1,R3             Store it elsewhere
  340.        SRL  R3,8              Make it a word value
  341.        SETO R4                Initialize a counter
  342.        LI   R2,NAMBUF         Point to NAMBUF
  343. LNK$LP INC  R0                Point to next char of name
  344.        INC  R4                Increment character counter
  345.        C    R4,R3             End of name?
  346.        JEQ  LNK$LN            Yes
  347.        BLWP @VSBR             Read current character
  348.        MOVB R1,*R2+           Move it to NAMBUF
  349.        CB   R1,@DECMAL        Is it a decimal point?
  350.        JNE  LNK$LP            No
  351. LNK$LN MOV  R4,R4             Is name length zero?
  352.        JEQ  LNKERR            Yes, error
  353.        CI   R4,7              Is name length > 7?
  354.        JGT  LNKERR            Yes, error
  355.        CLR  @CRULST
  356.        MOV  R4,@SCLEN-1       Store name length for search
  357.        MOV  R4,@SAVLEN        Save device name length
  358.        INC  R4                Adjust it
  359.        A    R4,@SCNAME        Point to position after name
  360.        MOV  @SCNAME,@SAVPAB   Save pointer into device name
  361. *
  362. *** Search ROM CROM GROM for DSR
  363. *
  364. SROM   LWPI GPLWS             Use GPL workspace to search
  365.        CLR  R1                Version found of DSR etc.
  366.        LI   R12,>0F00         Start over again
  367. NOROM  MOV  R12,R12           Anything to turn off
  368.        JEQ  NOOFF             No
  369.        SBZ  0                 Yes, turn it off
  370. NOOFF  AI   R12,>0100         Next ROM'S turn on
  371.        CLR  @CRULST           Clear in case we're finished
  372.        CI   R12,>2000         At the end
  373.        JEQ  NODSR             No more ROMs to turn on
  374.        MOV  R12,@CRULST       Save address of next CRU
  375.        SBO  0                 Turn on ROM
  376.        LI   R2,>4000          Start at beginning
  377.        CB   *R2,@HAA          Is it a valid ROM?
  378.        JNE  NOROM             No
  379.        A    @TYPE,R2          Go to first pointer
  380.        JMP SGO2
  381. SGO    MOV  @SADDR,R2         Continue where we left off
  382.        SBO  0                 Turn ROM back on
  383. SGO2   MOV  *R2,R2            Is address a zero
  384.        JEQ  NOROM             Yes, no program to look at
  385.        MOV  R2,@SADDR         Remember where we go next
  386.        INCT R2                Go to entry point
  387.        MOV  *R2+,R9           Get entry address
  388. *
  389. *** See if name matches
  390. *
  391.        MOVB @SCLEN,R5         Get length as counter
  392.        JEQ  NAME2             Zero length, don't do match
  393.        CB   R5,*R2+           Does length match?
  394.        JNE  SGO               No
  395.        SRL  R5,8              Move to right place
  396.        LI   R6,NAMBUF         Point to NAMBUF
  397. NAME1  CB   *R6+,*R2+         Is character correct?
  398.        JNE  SGO               No
  399.        DEC  R5                More to look at?
  400.        JNE  NAME1             Yes
  401. NAME2  INC  R1                Next version found
  402.        MOV  R1,@SAVVER        Save version number
  403.        MOV  R9,@SAVENT        Save entry address
  404.        MOV  R12,@SAVCRU       Save CRU address
  405.        BL   *R9               Match, call subroutine
  406.        JMP  SGO               Not right version
  407.        SBZ  0                 Turn off ROM
  408.        LWPI DLNKWS            Select DSRLNK workspace
  409.        MOV  R9,R0             Point to flag byte in PAB
  410.        BLWP @VSBR             Read flag byte
  411.        SRL  R1,13             Just want the error flags
  412.        JNE  IOERR             Error!
  413.        RTWP
  414. *
  415. *** Error handling
  416. *
  417. NODSR  LWPI DLNKWS       Select DSRLNK workspace
  418. LNKERR CLR  R1           Clear the error flags
  419. IOERR  SWPB R1
  420.        MOVB R1,*R13      Store error flags in calling R0
  421.        SOCB @H20,R15     Indicate an error occured
  422.        RTWP              Return to caller
  423. *
  424. **========================================================================
  425. ****USER-AVAILABLE PROGRAM SPACE***(WITH 2 OF MY UTILITIES TOSSED IN)
  426. *
  427. PROG8  LWPI WS           PROG8 IS MY VERSION OF A UTILITY TO WIPE THE 8K RAM
  428. *                        SPACE AND PLACE ZEROS AT >6000->7FFF.
  429. WIPED  DATA >02E0,>A000,>0201,>6000    THIS IS THE ACTUAL OBJECT CODE FOR A
  430.        DATA >0202,>2000,>0203,>0000    PROGRAM (AT AORG >A000) TO PLACE ZEROS
  431.        DATA >CC43,>0642,>16FD,>04E0    AT ADDRESSES >6000 TO >7FFF AND THEN
  432.        DATA >837C,>02E0,>83E0,>0420    BRANCH TO THE POWER UP ROUTINE. IF YOU
  433.        DATA >0000                      DON'T HAVE 32K, I GUESS IT WON'T WORK.
  434.        LI   R1,WIPED     LOAD STARTING ADDRESS OF ROUTINE IN R1
  435.        LI   R3,>A020     ADDRESS TO BE WRITTEN TO
  436.        LI   R5,>11       NUMBER OF WORDS TO MOVE
  437. LOOPF  MOV  *R1+,*R3+    WRITE A WORD
  438.        DEC  R5           SUBTRACT A WORD FROM THE COUNTER
  439.        JNE  LOOPF        ARE WE DONE? IF NOT, KEEP ON GOING
  440.        BLWP @XMLLNK      I KNOW, I KNOW... THIS WOULD BE MORE SIMPLY DONE BY A
  441.        DATA >A020        "B @>A020" BUT I WANTED TO DEMONSTRATE THAT THE XMLLNK
  442. *                        ROUTINE WORKS. THIS EXECUTES THE WIPE OF CARTRIDGE RAM.
  443. PROG9  CLR  @STATUS      PROG9 IS MY VERSION OF "OOPS, I DIDN'T MEAN TO BE HERE"
  444.        LWPI GPLWS        GO TO GPL
  445.        BLWP @>0000       AND START OVER
  446. *        1         2         3         4         5         6         7         8
  447. *2345678901234567890123456789012345678901234567890123456789012345678901234567890
  448. PROG3  B    @PROG9       FOR YOUR PROGRAM, REPLACE THE "PROG3  B   @" PHRASE
  449. *                        WITH "COPY  DSKn.PROGRAMx" (NOTHING IN LABEL FIELD)
  450. *                        WHERE "PROGRAMx" HAS "PROG3" AS ITS STARTING POINT.
  451. PROG4  B    @PROG9       DITTO FOR THE REST, USING DIFFERENT "PROGx" AS START.
  452. PROG5  B    @PROG9         "    "   "   "     "        "        "     "   "
  453. PROG6  B    @PROG9         "    "   "   "     "        "        "     "   "
  454. PROG7  B    @PROG9         "    "   "   "     "        "        "     "   "
  455.        END
  456.  
  457.  
  458. Download complete.  Turn off Capture File.
  459.  
  460.  
  461.