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