[comp.sys.apple] Capturing DOS 3.3 files names in an array

SEWALL@UCONNVM.BITNET (05/17/87)

This is in answer to Chris's request for a program to capture DOS 3.3 CATALOG
into memory -- two Applesoft programs which are quite similar (the second was
written by  "cannabalizing" the first).  Both read the DOS 3.3 CATALOG into
memory.  The first is a MENU (I rather like this one because it only takes 7
sectors on a disk) which can be used as a HELLO program.  The second prints
two column output of the CATALOG onto a printer in slot 1.  It's set up for
an Epson printer and 1.5 inch by 4 inch labels; it should be pretty easy to
adapt to other printers and different label sizes.

The "trick" is that the HEX code at the end of the APPLESOFT stores a machine
language program in the space occupied by the statement 0 REM (don't mess
with that REM statement either before or after EXEC'ing or you'll mess up the
program).  After EXECing, if you list the program you'll find that the 0 REM
statement is apparently senseless; actually is is what "reads" the CATALOG.
The file names are stored in NAME$

The SAVE commands are included - the program names are MENU and LABELS
------------------------Cut Here---------------------------------------------
NEW
0   REM******************************************************
10  TEXT : HOME : VTAB 12: HTAB 12: PRINT "ALIGNING MEMORY": GOTO 63000
20  FOR Y = 1 TO 40: PRINT "=";: NEXT : RETURN
30  INVERSE : PRINT X;: NORMAL : HTAB 5: PRINT A$(X): RETURN
40  PRINT " ";: INVERSE : PRINT X;: NORMAL : PRINT "  ";: HTAB 6
50  PRINT  LEFT$(A$(X),15): RETURN
60  VTAB 1: HTAB 9: PRINT "COMPUTER LEARNING CENTER": GOSUB 20: VTAB 22
70  GOSUB 20: POKE 34,2: VTAB 3: RETURN
80  POKE 33,21: POKE 32,19: VTAB 2: HTAB 1: PRINT : RETURN
85  POKE 33,40: POKE 32,0: VTAB 23: HTAB 1: PRINT : RETURN
90  GOSUB 85: VTAB 23: PRINT "IS YOUR PROGRAM LISTED HERE? Y/";: INVERSE
95  PRINT "N";: NORMAL : PRINT " ";: GET A$: PRINT
100  IF A$ = "Y" THEN MAX = N - 1:N = 105: POP : GOTO 2000
110  VTAB 23: CALL  - 958: POKE 34,2: POKE 35,21: HOME : POKE 35,24: RETURN
1000  GOSUB 60:X = 0
1010  FOR N = 1 TO 105
1015  IF  MID$ (NA$(N),8,1) = "=" THEN N = 105: GOTO 2000
1020  IF  ASC ( MID$ (NA$(N),8,1)) < 65 THEN 2000
1023  IF  ASC ( MID$ (NA$(N),8,1)) = 94 THEN 2000
1025 X = X + 1
1027 A$(X) =  MID$ (NA$(N),8,30)
1028 T(X) =  ASC ( MID$ (NA$(N),2,1))
1030  IF X < 20 THEN  GOSUB 30: GOTO 2000
1040  IF X = 20 OR X = 58 OR X = 96 THEN  GOSUB 80
1050  IF X < 39 THEN  GOSUB 40: GOTO 2000
1060  IF X = 39 OR X = 77 THEN  GOSUB 90
1070  IF X < 58 THEN  GOSUB 30: GOTO 2000
1080  IF X < 77 THEN  GOSUB 40: GOTO 2000
1090  IF X < 96 THEN  GOSUB 30: GOTO 2000
1100  GOSUB 40
2000  NEXT
2001  MAX = X
2005  GOSUB 85: POKE 34,22
2010  VTAB 23: CALL  - 958
2020  INPUT "SELECT A FILE BY NUMBER (X TO END->";A$
2021  IF A$ = "X" THEN  TEXT :HOME : END
2022  A =  VAL (A$): IF A > MAX THEN 2010
2025  IF A < 1 THEN  RUN
2040  IF T(A) = 66 THEN T$ = "BRUN "
2050  IF T(A) = 84 THEN T$ = "EXEC "
2060  IF T(A) = 65 OR T(A) = 73 THEN T$ = "RUN "
2062  TEXT
2065  VTAB 23: PRINT T$A$(A)
2070  VTAB 23: PRINT D$T$A$(A)
62999  END
63000  DIM NAME$(105),A$(105),T(105)
63010  FOR X = 1 TO 38:B$ = B$ + "=": NEXT
63020  FOR X = 105 TO 1 STEP  - 1:NAME$(X) = B$: NEXT
63030 NAME$(0) =  LEFT$ (B$,19)
63040 D$ =  CHR$ (4)
63045  VTAB 12: HTAB 12: INVERSE : PRINT "READING CATALOG": NORMAL
63050  VTAB 12:HTAB 29
63065  ONERR  GOTO 63075
63070  CALL 2054: PRINT D$"CATALOG"
63075  POKE 216,0: PRINT D$"PR#0": PRINT D$"IN#0": PRINT
63080  IF  LEFT$ (NA$(0),1) = " " THEN  VTAB 12: CALL  - 868
63090  IF  LEFT$ (NA$(0),1) = " " THEN ?"!!! ERROR - ";
63095  IF  LEFT$ (NA$(0),1) = " " THEN ?"UNABLE TO READ DIRECTORY !!!": END
63100  HOME : GOTO 1000
63999  PR# 1: PRINT "    80N": LIST 0,63998: PR# 0
CALL -151
806: A9 28
808: 8D 53 AA A9 08 8D 54 AA
810: A9 3B 8D 55 AA A9 08 8D
818: 56 AA A0 08 B1 6B 8D 31
820: 08 C8 B1 6B 8D 32 08 60
828: 29 7F C9 20 10 02 09 40
830: 8D F9 87 EE 31 08 D0 03
838: EE 32 08 60
3D0G
SAVE MENU
NEW
0   REM******************************************************
10  TEXT : HOME : VTAB 12: HTAB 4: PRINT "<PUT IN YOUR DISK & HIT A KEY>";
15  GET K$: PRINT : HOME : GOTO 63000
900  REM  P$ IN STMT 1000 CONTAINS PRINTER CONTROLS FOR EPSON
905  REM  ASCII 15 = COMPRESSED MODE, 27,83,1 = SUBSCRIPT ON,
910  REM  27,51,18 = 12 LINES PER INCH, 27,71 = DOUBLE STRIKE
1000 P$ =  CHR$ (15) +  CHR$ (27) +  CHR$ (83) +  CHR$ (1)
1005 P$ =  P$ + CHR$ (27) + CHR$ (51) +  CHR$ (18) +  CHR$ (27) +  CHR$ (71)
1010 C = 0: FOR X = 1 TO 105: IF NA$(X) = B$ THEN 1030
1020 C = C + 1:NA$(X) =  LEFT$ (NA$(X),32): NEXT X
1030  IF C = 0 THEN 3000
1040  VTAB 5: HTAB 4: PRINT "ENTER DESCRIPTION (NO , OR :)": VTAB 7
1042  INPUT ">";DI$
1045 CC = 1:DI$ =  LEFT$ (DI$,32):Z$ =  LEFT$ (NA$(0),17)
1050  VTAB 15: HTAB 5: PRINT "PRINTER READY (Y/N)?";: GET K$
1055  PRINT K$: PRINT: IF K$ = "Y" THEN  HOME : GOTO 1090
1060  HTAB 5: PRINT "EXIT (Y/N)?";: GET K$: PRINT K$: PRINT
1065  IF K$ = "Y" THEN 62999
1070  HOME : GOTO 1050
1090  PRINT  CHR$ (4);"PR#1": PRINT P$;: PRINT Z$; TAB( 34);DI$
1100 LINE = 2
1110  FOR X = CC TO C STEP 2
1120  PRINT NA$(X);
1130 LINE = LINE + 1: IF X + 1 > C THEN 1200
1140  PRINT NA$(X + 1): IF LINE = 17 THEN 1400
1150  NEXT X
1160  GOTO 1210
1200  PRINT
1210 LINE = LINE + 1: IF LINE < 17 THEN  FOR X = LINE TO 17: PRINT : NEXT X
1220  GOTO 2990
1400 CC = X + 2: IF CC < C + 1 THEN  PRINT  CHR$ (4);"PR#0": HOME : VTAB 10
1405 IF CC < C + 1 THEN PRINT "CATALOG REQUIRES ANOTHER LABEL": GOTO 1050
1410  GOTO 2990
2990  PRINT  CHR$ (4);"PR#0": PRINT : HOME : GOTO 3010
3000  HOME : VTAB 5: PRINT "NO FILES FOUND"
3010  VTAB 10: PRINT "ANOTHER DISK (Y/N) ?";
3020  GET A$: PRINT A$: IF A$ = "N" THEN  END
3030  IF A$ = "Y" THEN  CLEAR : HOME : GOTO 10
3040  PRINT  CHR$ (7); CHR$ (8);A$;: GOTO 3020
62999  END
63000  DIM NAME$(105),A$(105),T(105)
63010  FOR X = 1 TO 38:B$ = B$ + "=": NEXT
63020  FOR X = 105 TO 1 STEP  - 1:NAME$(X) = B$: NEXT
63030 NAME$(0) =  LEFT$ (B$,19)
63040 D$ =  CHR$ (4)
63045  VTAB 12: HTAB 12: INVERSE : PRINT "READING CATALOG": NORMAL
63050  VTAB 12: HTAB 29
63065  ONERR  GOTO 63075
63070  CALL 2054: PRINT D$"CATALOG"
63075  POKE 216,0: PRINT D$"PR#0": PRINT D$"IN#0": PRINT
63080  IF  LEFT$ (NA$(0),1) = " " THEN  VTAB 12: CALL  - 868: ? "!!! ERROR ";
63090  IF  LEFT$ (NA$(0),1) = " " THEN ? "- UNABLE TO READ DIRECTORY !!!"
63095  IF  LEFT$ (NA$(0),1) = " " THEN  GOTO 3010
63100  HOME : GOTO 1000
63999  PR# 1: PRINT "    80N": LIST 0,63998: PR# 0
CALL -151
806: A9 28
808: 8D 53 AA A9 08 8D 54 AA
810: A9 3B 8D 55 AA A9 08 8D
818: 56 AA A0 08 B1 6B 8D 31
820: 08 C8 B1 6B 8D 32 08 60
828: 29 7F C9 20 10 02 09 40
830: 8D F9 87 EE 31 08 D0 03
838: EE 32 08 60
3D0G
SAVE LABELS