Home of the original IBM PC emulator for browsers.
[PCjs Machine "ibm5150"]
Waiting for machine "ibm5150" to load....
This version of ROFF, based on the formatter in Kernighan and
Plauger's book SOFTWARE TOOLS, is written in BDS C, and employs
the directed i/o functions that go along with that package.
Using ROFF, you can make nice printouts of a file, with as little
or as much help from the program as you want. There are default
values for all parameters, so if you don't put any commands in at
all, your file will come out with filled, right-justified lines.
The default line-length is 80 characters; the default page-length
is 66 lines per page. "Filled lines" means that as many input
words as possible are packed onto a line before it is printed;
"non-filled" lines go through the formatter w/o rearrangement.
"Right-justified" simply means that spaces are added between
words to make all the right margins line up nicely.
Filling out the disk are a group of solid utilities like SDIR and
REBOOT and some useful BASIC programs.
How to Start: Consult ROFF.DOC for directions and
documentation. Type ROFF <ENTER> to run. For the BASIC programs,
consult the directions in Getting Started for your configuration.
File Descriptions:
COLOR COM Allows switch to and from mono screen
MUSICBOX BAS A few tunes to while away the moment
MONO COM Allows switch to and from mono screen
FILEIO C File redirection utility
DEPREC BAS Simple depreciation
REBOOT ASM Assembly code for REBOOT
ROFF EXE ROFF text formatter
ROFF HE ROFF subprogram ROFF1
ROFF H ROFF subprogram
SDIR ASM Assembly code
SDIR COM Compiled version of directory shell
REBOOT COM Utility for special warm boots
ROFF DOC Directions on using ROFF
REBOOT EXE Executable version of REBOOT
TABLET BAS One for Moses, one for you
TICCLOCK BAS Time keeper for your PC
ROFF? C Uncompiled version of ROFF.EXE to modify.
ADDCRS BAS Adds carriage returns to downloaded files
ASCFILTR BAS Filter non-ASCII characters from files
2 INPUT"INPUT THE FILENAME THAT WAS DOWNLOADED WITHOUT CR (d:filename) ",A$
4 INPUT"INPUT THE NEW NAME FOR THE DOWNLOADED FILE (d:filename) ",B$
5 ' CHANGE THE INPUT AND OUTPUT NAMES TO THE NAMES OF THE FILES YOU WANT AS
6 ' INPUT AND OUTPUT PRIMARILY USED TO COPY FILES WITH NO CARRIAGE RETURNS
7 ' IN THEM SO THAT YOU CAN EDLIN THEM CONTRIBUTED BY DON WITHROW
10 OPEN A$ FOR INPUT AS #1
20 OPEN B$ FOR OUTPUT AS #2
30 IF EOF(1) THEN 100 ELSE LINE INPUT #1, THELIN$
40 PRINT #2, THELIN$
50 GOTO 30
100 CLOSE:END
120 'This program will add Carriage Returns to a downloaded file that does
130 'not appear to have them when you try to list it using the DOS TYPE
140 'command. The file has to be a basic program, patch or subroutine.
150 'After adding CRs to the file you can then use EDLIN to remove direct
160 'statements from the file.
10 ' FILTERS NON-ASCII CHARACTERS FROM A FILE
20 ' USEFUL FOR CLEANING UP NULLS AND CONTROL CHARACTERS FROM A
30 ' TRANSMITTED FILE.
40 ' RICHARD STECK 820511
50 '
60 '
70 CLOSE
80 DEFINT A-Z
90 ON ERR GOTO 470
100 KEY OFF
110 CLS:WIDTH 80: LOCATE 12,,1
120 INPUT " ENTER NAME OF FILE TO BE FILTERED "; F1$
130 PRINT
140 INPUT " ENTER DESTINATION FILE NAME "; F2$
150 IF F1$ = F2$ THEN GOTO 110
160 PRINT: PRINT
170 PRINT TAB(10), "Source file name is: "; TAB(33); F1$
180 PRINT
190 PRINT TAB(10), "Destination file name is: ";TAB(33); F2$
200 PRINT
210 INPUT " Is that correct(Y/N/Q)? "; ANS$
220 IF (LEFT$(ANS$,1) = "Q") OR (LEFT$(ANS$,1) = "q" ) THEN STOP
230 IF NOT ((LEFT$(ANS$,1) = "Y") OR (LEFT$(ANS$,1) = "y") ) THEN GOTO 160
240 OPEN F1$ FOR INPUT AS #1
250 OPEN F2$ FOR OUTPUT AS #2
260 '
270 WHILE NOT EOF(1)
280 LINE INPUT #1,A$
290 '
300 PRINT A$ : ' DISPLAY STRING
310 GOSUB 370
320 PRINT #2,A$
330 WEND
340 CLOSE 1,2
350 STOP
360 '
370 ' FILTER OUT NULLS FROM A$
380 AA$= STRING$(255," ")
390 J = 1
400 FOR I = 1 TO LEN(A$)
410 TEST = ASC(MID$(A$,I,1))
420 IF TEST < 32 AND (TEST < 7 OR TEST > 13) THEN GOTO 430 ELSE MID$(AA$,J,1) = MID$(A$,I,1) : J = J + 1
430 NEXT I
440 A$ = LEFT$(AA$,J-1)
450 RETURN
460 '
470 PRINT : PRINT "ERROR CONDITION "; ERR; " IN LINE NO. "; ERL: PRINT : STOP
PC-SIG Disk No. #50, version v1
The following is a list of the file checksums which should be produced by
the CRCK4 program on disk #9 (and others). If the CRC numbers do not match
you may have a bad file. To use type: CRCK4 <filespec>
CRCK4 output for this disk:
CRCK ver 4.2B (MS DOS VERSION )
CTL-S pauses, CTL-C aborts
--> FILE: ROFF .EXE CRC = 72 EB
--> FILE: ROFF .DOC CRC = F4 E8
--> FILE: ROFF .H CRC = C1 12
--> FILE: ROFF .HE CRC = EF 38
--> FILE: ROFF1 .C CRC = E4 0C
--> FILE: ROFF2 .C CRC = BA 80
--> FILE: ROFF3 .C CRC = 02 BC
--> FILE: FILEIO .C CRC = 24 39
--> FILE: REBOOT .ASM CRC = 27 DE
--> FILE: REBOOT .EXE CRC = 8C F1
--> FILE: REBOOT .COM CRC = 00 00
--> FILE: SDIR .ASM CRC = DB D8
--> FILE: SDIR .COM CRC = FC 14
--> FILE: MUSICBOX.BAS CRC = 75 20
--> FILE: DEPREC .BAS CRC = 18 47
--> FILE: TABLET .BAS CRC = 8C 37
--> FILE: TICCLOCK.BAS CRC = 89 0C
--> FILE: ADDCRS .BAS CRC = 96 B2
--> FILE: ASCFILTR.BAS CRC = B9 5B
--> FILE: COLOR .COM CRC = 8C 78
--> FILE: MONO .COM CRC = A5 59
---------------------> SUM OF CRCS = 8E E1
DONE
These and other Public Domain and user-supported programs from:
PC Software Interest Group
1125 Stewart Ct Suite G
Sunnyvale, CA 94086
(408) 730-9291
10 REM ******************** DEPRECIATION PROGRAM ******************************
20 REM ************ REVISED FOR ECONOMIC RECOVERY ACT OF 1981 *****************
30 REM **** BY A.P GITT; POPULAR COMPUTING ,DEC. 1982, PAGE 59 **************
40 REM **** REVISED: 01/09/82 ********
50 REM **** DISK FILE NAME: DEPREC.BAS ********
60 REM **** FURTHER REVISED BY C.F. MITASIK ON 11-16-82 TO INCLUDE ********
70 REM **** 10 YEAR ACRS AND THE 15 YEAR, 175% DEPRECIATION OPTION ********
80 REM **** FOR REAL PROPERTY ********
90 REM ************************************************************************
100 REM *** NOTE: HOME COMPUTERS WOULD USUALLY BE WRITTEN OFF USING ********
110 REM *** 5 YEAR ACRS; UNLESS IT IS BEING USED FOR RESEARCH ********
120 REM *** AND DEVELOPMENT WORK IN WHICH CASE THE 3 YEAR ACRS ********
130 REM *** METHOD MAY BE USED. ********
140 REM ***********************************************************************
150 REM *** WARNING: NO GUARENTEES ARE GIVEN OR IMPLIED REGARDING ********
160 REM *** YOUR USE OF THIS PROGRAM. I ALSO TAKE NO RESPONSIBILITY ********
170 REM *** FOR THE DEPRECIATION METHOD(S) YOU CHOOSE TO USE OR FOR ********
180 REM *** WHETHER OR NOT YOUR PROPERTY IS IN FACT DEPRECIABLE. ********
190 REM *** PLEASE CONSULT A KNOWLEDGEABLE TAX SPECIALIAST FOR ********
200 REM *** ASSISTANCE ALONG THESE LINES. ********
210 REM ***********************************************************************
220 REM
230 CLEAR 2000:KEY OFF
240 DIM D(40)
250 COLOR 2,0,0:CLS:LOCATE 10,32:PRINT "TAX DEPRECIATION"
260 FOR I = 1 TO 1500:NEXT I:CLS
270 REM ****************** INPUT DATA *****************************************
280 LOCATE 2,1:INPUT "NAME OF ITEM";I$
290 A = 0:B = 0:F = 0:F1 = 0:D(1) = 0:A9$ = ""
300 DP$ = DATE$
310 PRINT "TODAYS DATE = ";DP$
320 INPUT "PURCHASE DATE (MM/DD/YY)";D$
330 INPUT "COST OF ITEM";C
340 PRINT "DO YOU WISH TO USE THE ACCELERATED COST"
350 INPUT "RECOVERY SYSTEM (ACRS)? (Y)ES OR (N)O";A9$
360 GOTO 530
370 IF YY < 81 THEN A = 1
380 INPUT "USEFUL LIFE";L
390 INPUT "DEPRECIATION RATE (NEW = 200% : USED = 150%)";R
400 R$ = STR$(R)+"%"
410 REM ******************* CALCULATE YEARLY RATE ****************************
420 YR = R/(100*L)
430 REM ****************** CALCULATE EXTRA 1ST YEAR DEPRECIATION *************
440 IF L > 6 AND YY < 81 THEN ED = 0.2*C ELSE ED = 0
450 CV = C - ED
460 REM ****************** CALCULATE INVESTMENT CREDIT ************************
470 IF L < 3 THEN IC = 0
480 IF L >= 3 THEN IC = C/30
490 IF L >= 5 THEN IC = C/15
500 IF L >= 7 THEN IC = C/10
510 GOTO 610
520 REM ***************** DETERMINE YEAR/DAY/MONTH ****************************
530 MM = VAL (LEFT$(D$,2))
540 DD = VAL (MID$(D$,4,2))
550 YY = VAL (RIGHT$(D$,2))
560 IF DD >< 15 THEN FY = 13 - MM ELSE FY = 12 - MM
570 LY = 12 - FY
580 IF YY < 81 AND A9$ = "Y" OR A9$ = "YES" THEN PRINT:PRINT "ACRS ONLY VALID "; "FOR PROPRETY PURCHASED AFTER 1980. PLEASE START AGAIN.":GOTO 280
590 IF YY < 81 OR A9$ = "N" THEN 370 ELSE 1570
600 REM ******************* FIRST YEAR DEPRECIATION **************************
610 CY = 1
620 D(CY) = CV*YR*(FY/12)
630 CV = CV - D(CY)
640 REM ******************* MIDDLE YEARS DEPRECIATION *************************
650 FOR CY = 2 TO L
660 D(CY) = YR*CV
670 CV = CV - D(CY)
680 NEXT
690 REM ******************* LAST YEAR DEPRECIATION ****************************
700 IF CY = 0 THEN 730 ELSE CY = L + 1
710 D(CY) = YR*CV*(LY/12)
720 CV = CV - D(CY)
730 REM ******************* OUTPUT TO VIDIO ***********************************
740 CLS
750 LOCATE 3,15:PRINT "DEPRECIATION ANALYSIS FOR ";I$
760 LOCATE 4,15:PRINT "DATE PREPARED: ";DP$
770 REM
780 LOCATE 6,1:PRINT "ITEM NAME: ";TAB(31);I$
790 PRINT "DATE OF PURCHASE: ";TAB(31);D$
800 PRINT "COST: ";TAB(30);C
810 PRINT "USEFULL LIFE: ";TAB(30);L
820 PRINT "DEPRECIATION RATE: ";TAB(30);R$
830 PRINT
840 CY = 1
850 Y = 1899 + YY
860 INPUT "PRESS ENTER TO CONTINUE",Z$:CLS
870 PRINT
880 IF B = 1 THEN 940
890 PRINT :PRINT " YEAR";TAB(10);"INVESTMENT CREDIT";
900 IF A = 1 AND ED >< 0 THEN PRINT TAB(35);"EXTRA FIRST YEAR DEPRECIATION"
910 IF A = 0 THEN PRINT
920 PRINT TAB(2);TY+CY;TAB(12);IC;
930 IF A = 1 AND ED >< 0 THEN PRINT TAB(39);ED ELSE PRINT CHR$(10)
940 PRINT:PRINT " YEAR";TAB(10)"DEPRECIATION":PRINT
950 IF R1 = 1 THEN 1060
960 IF F1 = 1 THEN 1000
970 IF F = 1 THEN 990
980 IF A = 1 THEN 990 ELSE 1000
990 IF LY = 0 THEN 1000 ELSE 1010
1000 LOOP = L:GOTO 1020
1010 LOOP = L + 1
1020 FOR CY = 1 TO LOOP
1030 PRINT TAB(2);TY+CY;TAB(11);:PRINT USING "######.##";D(CY)
1040 IF CY = 10 OR CY = 20 OR CY = 30 THEN PRINT:PRINT "PLEASE PRESS ENTER TO"; " CONTINUE";:INPUT " ",Z$ ELSE 1070
1050 CLS:R1 = 1:PRINT :GOTO 940
1060 R1 = 0
1070 NEXT
1080 IF CV <= 0 THEN 1120
1090 PRINT
1100 IF A = 1 THEN 1110 ELSE 1120
1110 PRINT "SALVAGE VALUE AT END OF";CY +Y-1;" IS ";CV
1120 REM ******************* PRINTOUT ROUTINE **********************************
1130 PRINT:PRINT:INPUT "DO YOU WANT A PRINTOUT";Z$
1140 IF LEFT$(Z$,1) = "Y" THEN 1150 ELSE 10
1150 POKE 16424,65:POKE 16425,0:LPRINT :LPRINT :LPRINT
1160 T = 40 - (12+((LEN(I$))/2))
1170 LPRINT TAB(T);"DEPRECIATION ANALYSIS FOR ";I$
1180 LPRINT :LPRINT TAB(32);"DATE PREPARED: ";DP$
1190 LPRINT :LPRINT TAB(6);"INPUT DATA"
1200 LPRINT TAB(6);"----------"
1210 LPRINT :LPRINT TAB(6);"DATE OF PURCHASE: ";TAB(32);D$
1220 LPRINT TAB(6);"COST OF ITEM: ";TAB(32);"$";C
1230 LPRINT TAB(6);"USEFULL LIFE: ";TAB(32);L;"YEARS"
1240 LPRINT TAB(6);"DEPRECIATION RATE: ";TAB(31);R$
1250 LPRINT
1260 LPRINT TAB(6);"DEPRECIATION CALCULATIONS"
1270 LPRINT TAB(6);"-------------------------"
1280 LPRINT
1290 Y = 1899+YY
1300 IF B = 1 THEN 1410
1310 IF A = 1 THEN LPRINT TAB(6);" YEAR";TAB(16);"INVESTMENT CREDIT";
1320 IF A = 1 AND ED >< 0 THEN LPRINT TAB(37);"EXTRA FIRST YEAR DEPRECIATION"
1330 IF F = 1 THEN LPRINT TAB(6);" YEAR";TAB(16);"INVESTMENT CREDIT"
1340 IF A = 1 THEN LPRINT TAB(6);" ----";TAB(16);"-----------------";
1350 IF A = 1 AND ED >< 0 THEN LPRINT TAB(37);"-----------------------------"
1360 IF F = 1 THEN LPRINT TAB(6);" ----";TAB(16);"-----------------"
1370 CY = 1
1380 IF A = 1 THEN LPRINT TAB(6);Y+CY;:LPRINT TAB(16)USING"$$######.##";IC;
1390 IF A = 1 AND ED >< 0 THEN LPRINT TAB(37)USING "$$######.##";ED
1400 IF F = 1 THEN LPRINT TAB(6);Y+CY;:LPRINT TAB(16)USING "$$######.##";IC
1410 LPRINT:LPRINT TAB(6);" YEAR";TAB(16);"DEPRECIATION"
1420 LPRINT TAB(6);" ----";TAB(16);"------------"
1430 IF F = 1 THEN 1470
1440 IF F = 1 THEN 1480
1450 IF A = 1 THEN 1460 ELSE 1470
1460 IF LY = 0 THEN 1470 ELSE 1480
1470 LOOP = L:GOTO 1490
1480 LOOP = L+1
1490 FOR CY = 1 TO LOOP
1500 LPRINT TAB(6);Y+CY;:LPRINT TAB(16)USING "$$######.##";D(CY)
1510 NEXT CY
1520 IF CV <= 0 THEN 1540
1530 LPRINT :LPRINT TAB(6);"SALVAGE VALUE AT END OF";CY+Y-1; " IS ";:LPRINT USING"$$######.##";CV
1540 POKE 14312,12
1550 INPUT "DO YOU WANT ANOTHER PRINTOUT ";Z$
1560 IF Z$ = "Y" THEN 1120 ELSE 10
1570 REM ****************** DETERMINE YEAR/TYPE DEPRECIATION ******************
1580 CLS:PRINT:PRINT "PLEASE SELECT TYPE OF DEDUCTION/DEPRECIATION THAT YOU "; "WANT":PRINT:PRINT
1590 PRINT TAB(10);"1 MAXIMUM SHORT TERM DEDUCTIONS/DEPRECIATION"
1600 PRINT
1610 PRINT TAB(10);"2 LONG TERM DEPRECIATION"
1620 PRINT:PRINT
1630 INPUT "PLEASE ENTER THE NUMBER OF YOUR SELECTION: ",Z7
1640 IF YY = 81 THEN 1690
1650 IF YY = 82 OR YY = 83 THEN 1720
1660 IF YY = 84 OR YY = 85 THEN 1820
1670 IF YY > 85 THEN 1930
1680 REM ********************* 1981 DEPRECIATION ******************************
1690 ED = 0:C1 = C
1700 IF Z7 = 1 THEN 2170 ELSE 2580
1710 ************************* 1982/83#EPRECIATION ***************************
1720 ED = 0:C1 = 0
1730 IF Z7 = 1 THEN 1740 ELSE 2580
1740 IF C > 5000 THEN D(1) = 5000 ELSE 1780
1750 IF C > 5000 THEN C1 = C
1760 IF C > 5000 THEN C = C - 5000
1770 GOTO 2170
1780 R$ = " 100% WRITE OFF"
1790 IF C < 5001 THEN D(1) = C
1800 B = 1
1810 GOTO 730
1820 REM ********************* 1984/85 DEPRECIATION ***************************
1830 ED = 0:C1 = C
1840 IF Z7 = 1 THEN 1850 ELSE 2580
1850 IF C > 7500 THEN D(1) = 7500 ELSE 1890
1860 IF C > 7500 THEN C1 = C
1870 IF C > 7500 THEN C = C - 7500
1880 B = 1:GOTO 2170
1890 IF C < 7501 THEN D(1) = C ELSE 2170
1900 R$ = " 100$ WRITE OFF"
1910 B = 1
1920 GOTO 730
1930 REM ********************** 1986 AND BEYOND DEPRECIATION ******************
1940 ED = 0:C1 = C
1950 IF Z7 = 1 THEN 1960 ELSE 2580
1960 IF C > 10000 THEN D(1) = 10000 ELSE 2000
1970 IF C > 10000 THEN C1 = C
1980 IF C > 10000 THEN C = C - 10000
1990 B = 1:GOTO 2170
2000 IF C < 10001 THEN D1 = C ELSE 2170
2010 R$ = " 100% WRITE OFF"
2020 B = 1
2030 GOTO 730
2040 REM ********************** 5 YEAR ASSET COST RECOVERY SYSTEM *************
2050 CY = 1:F1 = 1
2060 D(CY) = D(1) + C*0.15
2070 CY = 2
2080 D(CY) = 0.22*C
2090 FOR CY = 3 TO 5
2100 D(CY) = 0.21*C
2110 NEXT CY
2120 CV = 0
2130 IC = 0.1*C
2140 F = 1:C = C1
2150 R$ = " ASSET RECOVERY SYSTEM"
2160 GOTO 730
2170 REM ******************** ACCELERATED USEFULL LIFE SELECTION **************
2180 CLS:PRINT :PRINT "PLEASE SELECT TYPE OF LIFE/USE FROM THE FOLLOWING LIST"
2190 PRINT :PRINT
2200 PRINT TAB(10);"1) 3 YEAR CLASS PROPERTY (AUTO'S,LIGHT TRUCKS,MACHINERY,"; "R&D EQUIPMENT)"
2210 PRINT
2220 PRINT TAB(10);"2) 5 YEAR CLASS PROPERTY (COMPUTERS, MOST OFFICE FURNITURE," ;" HEAVY DUTY",TAB(19);"TRUCKS & MACHINERY,AGRICULTURAL STRUCTURES)"
2230 PRINT
2240 PRINT TAB(10);"3) 10 YEAR CLASS PROPERTY (PUBLIC UTILITY & RAILROAD "; "PROPERTY",TAB(19);"AND SOME REAL PROPERTY)"
2250 PRINT
2260 PRINT TAB(10);"4) 15 YEAR CLASS PROPERTY (MOSTLY PUBLIC UTILITIES)"
2270 PRINT
2280 PRINT TAB(10);"5) 15 YEAR, 175% DEP. RATE FOR REAL PROPERTY"
2290 PRINT :PRINT
2300 INPUT "PLEASE ENTER THE NUMBER OF YOUR SELECTION: ",Z
2310 IF Z = 1 THEN L = 3:GOTO 2490
2320 IF Z = 2 THEN L = 5:GOTO 2040
2330 IF Z = 3 THEN L = 10:GOTO 2690
2340 IF Z = 4 THEN L = 15:GOTO 3130
2350 IF Z = 5 THEN L = 15:GOTO 2870
2360 IF Z > 5 THEN 2170
2370 REM ******************* STRAIGHT LINE DEPRECIATION ***********************
2380 IC = 0.1*C:ED = 0
2390 F = 1
2400 CY = 1
2410 D(CY) = C/L*(FY/12)
2420 FOR CY = 2 TO L
2430 D(CY) = C/L
2440 NEXT CY
2450 CY = L+1
2460 D(CY) = C/L*(LY/12)
2470 R$ = " STRAIGHT LINE"
2480 GOTO 730
2490 REM ****************** 3 YEAR ACRS ***************************************
2500 F1 = 1
2510 D(1) = D(1) + 0.25*C
2520 D(2) = 0.38*C
2530 D(3) = 0.37*C
2540 CV = 0:IC = 0.06*C:F = 1:R$ = " ASSET COST RECOVERY SYSTEM"
2550 C = C1
2560 GOTO 730
2570 END
2580 REM ************ LONG TERM USEFUL LIFE SELECTION *************************
2590 CLS:PRINT:PRINT "PLEASE SELECT TYPE OF USEFULL LIFE FROM THE FOLLOWING "; "LIST"
2600 PRINT TAB(10);"1 LONG TERM - 12 YEARS"
2610 PRINT TAB(10);"2 LONG TERM - 25 YEARS"
2620 PRINT "PLEASE ENTER NUMBER OF YOUR SELECTION"
2630 INPUT Z
2640 IF Z = 1 THEN L = 12:GOTO 2370
2650 IF Z = 2 THEN L = 25:GOTO 2370
2660 IF Z > 2 THEN 2580
2670 GOTO 2580
2680 REM ****************** 10 YEAR ACRS **************************************
2690 F1 = 1:CY = 1
2700 D(CY) = D(1) + 0.08*C
2710 CY = 2
2720 D(CY) = 0.14*C
2730 CY = 3
2740 D(CY) = 0.12*C
2750 FOR CY = 4 TO 6
2760 D(CY) = 0.09999999*C
2770 NEXT
2780 FOR CY = 7 TO 10
2790 D(CY) = 0.09*C
2800 NEXT
2810 CV = C
2820 IC = C/10
2830 F = 1:C = C1
2840 R$ = "ASSET RECOVERY SYSYEM"
2850 GOTO 730
2860 REM ********************* 15 YEAR, 175% REAL PROPERTY *******************
2870 FY = 13 - MM
2880 LY = 12 - FY
2890 R$ = " 175% ACRS FOR REAL PROPERTY"
2900 A = 1:ED = 0
2910 CV = 0
2920 C = C1:IC = 0
2930 RESTORE
2940 FOR J = 1 TO MM
2950 FOR I = 1 TO 16:READ D(I):NEXT I
2960 NEXT J
2970 FOR I = 1 TO 16
2980 D(I) = C*D(I)/100
2990 NEXT I
3000 GOTO 700
3010 DATA 12,10,9,8,7,6,6,6,6,5,5,5,5,5,5,0
3020 DATA 11,10,9,8,7,6,6,6,6,6,5,5,5,5,5,0
3030 DATA 10,11,9,8,7,6,6,6,6,5,5,5,5,5,5,1
3040 DATA 9,11,9,8,7,6,6,6,6,6,5,5,5,5,5,1
3050 DATA 8,11,10,8,7,7,6,6,5,5,5,5,5,5,5,2
3060 DATA 7,11,10,8,7,7,6,6,6,5,5,5,5,5,5,2
3070 DATA 6,11,10,9,8,7,6,5,5,5,5,5,5,5,5,3
3080 DATA 5,11,10,9,8,7,6,6,5,5,5,5,5,5,5,3
3090 DATA 4,11,10,9,8,7,6,6,5,5,5,5,5,5,5,4
3100 DATA 3,11,10,9,8,7,6,6,6,5,5,5,5,5,5,4
3110 DATA 2,11,10,9,8,7,6,6,6,6,5,5,5,5,5,4
3120 DATA 1,12,10,9,8,7,6,6,6,5,5,5,5,5,5,5
3130 REM *********************** 15 YEAR ACRS *********************************
3140 CY = 1
3150 F1 = 1
3160 D(CY) = D(1) + 0.05*C
3170 CY = 2
3180 D(CY) = 0.09999999*C
3190 CY = 3
3200 D(CY) = 0.09*C
3210 CY = 4
3220 D(CY) = 0.08*C
3230 FOR CY = 5 TO 6
3240 D(CY) = 0.07*C
3250 NEXT
3260 FOR CY = 7 TO 15
3270 D(CY) = 0.06*C
3280 NEXT
3290 CV = 0
3300 IC = 0.1*C
3310 F = 1:C = C1
3320 R$ = "ASSET RECOVERY SYSTEM"
3330 GOTO 730
100 REM ----- BLUES -----
101 ' TYPED IN WITH MODIFICATIONS BY D.G. PATTERSON
102 ' SEE SOFTSIDE MAGAZINE FOR INSTRUCTIONS
106 ' PROGRAM TO WRITE MUSIC.---TAKEN FROM SOFTSIDE #34 NOV 1982
107 ' SOME FUNCTIONS NOT ACTIVATED - THEY WILL BE ADDED IN FUTURE
108 ' ISSUES OF SOFTSIDE AND POSTED TO PCanada....
116 CLS:KEY OFF:DEFINT A-Z:MAX=2000:DIM NCURS(38),SHARP(38),FLAT(38),STAFF(1884),NOTE1(38),NOTE2(38),NOTE4(38),NOTE8(38),NOTE16(38),NOTE32(38),NOTE64(38),BLOCK(99,2),M$(2000),PCL(154),PCC(154),PCR(154)
118 DIM FU$(10)
120 DIM REST1(38),REST2(38),REST4(38),REST8(38),REST16(38),REST32(38),REST64(38),PIANOL(104),PIANOR(104),PIANOC(104),DOT(38),NDY(35),BK(5):DEF FNU$(A$)=CHR$(ASC(LEFT$(A$,1))+32*(LEFT$(A$,1)>"Z"))
124 DEF FNL2!(X)=LOG(X)/LOG(2):DEF FNS$(N$)=RIGHT$(N$,LEN(N$)-1):TRUE=-1:FALSE=0:FLAT=FALSE:SHARP=FALSE:OC=3:CN$="C":SCALE$="CDEFGAB":NN=7*OC-6
128 STAFFX=5:STAFFY=55:PTN$="":X$="C C#D E-E F F#G A-A B-B ":FOR X=1 TO 5:PTN$=PTN$+X$:NEXT:PSCALE$="C.D.EF.G.A.B":PTNPTR=(12*(OC-1)+INSTR(PSCALE$,CN$)-SHARP+FLAT)*2-1
132 KBX=123:KBY=6:NX=6:NY=160:RX=6:RY=180:MIDC=30:NDX=STAFFX+49:RDX=NDX-2:RDY=STAFFY
135 NCOUNT=0:TEMPO=100:BCOUNT=0:DOTTED=FALSE:NOTE=TRUE:PREVNOTE=NOTE:TIME=4:PREVTIME=TIME:PREVDOT=DOTTED:PREVPTR=PTNPTR:BCOUNT=0:BPOS=0:NCOUNT=1:NPOS=1:INSERTING=FALSE:GOSUB 13000:CLS:X$="Just a moment...":LOCATE 12,20-LEN(X$)/2:PRINT X$
140 GOSUB 16170:GOSUB 2000:GOSUB 15000:GOSUB 14000
141 '
142 ' ***** MAIN INPUT LOOP:ACCEPT VALID CHARACTERS;REJECT *****
143 ' ***** INVALID ONES;BRANCH TO APPROPRIATE SUBROUTINES. *****
144 '
1000 IN$=INKEY$:IF IN$="" THEN 1000
1010 IF FNU$(IN$)="S" THEN GOSUB 18000:GOTO 1150
1020 IF FNU$(IN$)="L" THEN GOSUB 17000:GOTO 1150
1030 IF FNU$(IN$)="P" THEN GOSUB 19000:GOTO 1150
1040 IF FNU$(IN$)="T" THEN GOSUB 20000:GOTO 1150
1045 IF FNU$(IN$)=" " THEN GOSUB 11000:NOTE=NOT NOTE:GOTO 1150
1050 IF FNU$(IN$)="N" THEN GOSUB 21000:GOTO 1150
1055 IF FNU$(IN$)="C" THEN GOSUB 22000:GOTO 1150
1060 IF FNU$(IN$)=CHR$(13) THEN GOSUB 16000:GOTO 1150
1065 IF FNU$(IN$)=CHR$(3) THEN GOSUB 23000:GOTO 1150
1067 IF FNU$(IN$)="M" THEN RUN "MENU"
1070 IF ASC(LEFT$(IN$,1))<>0 THEN 1000 ELSE IN=ASC(RIGHT$(IN$,1))
1080 IF IN<59 OR (IN>68 AND IN<72) OR IN=73 OR IN=79 OR IN>80 THEN 1000
1090 IF IN=72 THEN GOSUB 3000:GOTO 1150
1100 IF IN=75 THEN GOSUB 6000:GOTO 1150
1110 IF IN=77 THEN GOSUB 5000:GOTO 1150
1120 IF IN=80 THEN GOSUB 4000:GOTO 1150
1140 ON IN-58 GOSUB 8000,7000,50000,50000,50000,50000,50000,50000,9000,10000
1150 GOSUB 2000
1160 GOSUB 12000:GOTO 1000
1989 END
1990 '
1992 ' ***** CALCULATIONS OF NEW VALUES FOR OC *****
1993 ' ***** SHARP,FLAT,NN,N$, AND AC$. THE *****
1994 ' ***** VALUE OF PTNPTR IS THE SOLE PARAMETER *****
1995 ' ***** OF THIS ROUTINE. *****
1998 '
2000 N$=MID$(PTN$,PTNPTR,2):CN$=LEFT$(N$,1):AC$=RIGHT$(N$,1):IF AC$=" " THEN SHARP=FALSE:FLAT=FALSE
2030 IF AC$="#" THEN SHARP=TRUE:FLAT=FALSE
2040 IF AC$="-" THEN SHARP=FALSE:FLAT=TRUE
2060 OC=((PTNPTR-1)/2-INSTR(PSCALE$,CN$))/12+1:NN=7*OC+INSTR(SCALE$,CN$)-7:RETURN
2990 '
2992 ' ***** INCREMENT PITCH OF NOTE ONE HALF-STEP *****
2998 '
3000 GOSUB 11000:PTNPTR=PTNPTR+2:IF PTNPTR>119 THEN PTNPTR=1
3010 RETURN
3990 '
3992 ' ***** DECREMENT PITCH ONE HALF-STEP. *****
3998 '
4000 GOSUB 11000:PTNPTR=PTNPTR-2:IF PTNPTR<1 THEN PTNPTR=119
4010 RETURN
4990 '
4992 ' ***** MOVE TIME INDICATOR TO THE RIGHT. THIS *****
4994 ' ***** SHORTENS THE LENGTH OF THE NOTE OR REST. *****
5000 GOSUB 11000:IF NOTE THEN 5050
5020 IF TIME=64 THEN TIME=1 ELSE TIME=TIME*2
5030 RETURN
5050 IF DOTTED THEN DOTTED=FALSE:RETURN
5060 DOTTED=TRUE:IF TIME=64 THEN TIME=1 ELSE TIME=TIME*2
5070 RETURN
5990 '
5992 ' ***** MOVE TIME INDICATOR TO THE LEFT. *****
5998 '
6000 GOSUB 11000:IF NOTE THEN 6040
6010 IF TIME=1 THEN TIME=64 ELSE TIME=TIME/2
6020 RETURN
6040 IF NOT DOTTED THEN DOTTED=TRUE:RETURN
6050 DOTTED=FALSE:IF TIME=1 THEN TIME=64 ELSE TIME=TIME/2
6060 RETURN
6990 '
6992 ' ***** MOVE UP AN OCTAVE *****
6998 '
7000 GOSUB 11000:PTNPTR=PTNPTR+24:IF PTNPTR>119 THEN PTNPTR=PTNPTR-120
7010 RETURN
7990 '
7992 ' ***** MOVE DOWN AN OCTAVE. *****
7998 '
8000 GOSUB 11000:PTNPTR=PTNPTR-24:IF PTNPTR<1 THEN PTNPTR=PTNPTR+120
8010 RETURN:GOSUB 11000 :IF NPOS=1 THEN RETURN
8990 '
8992 ' ***** MOVE TO THE PREVIOUS NOTE IN THE BUFFER *****
8998 '
9000 GOSUB 11000:IF NPOS=1 THEN RETURN
9010 NPOS=NPOS-1:IF BPOS>1 THEN IF NPOS=BLOCK(BPOS-1,2) THEN BPOS=BPOS-1
9020 C7$=MID$(M$(NPOS),10,2):N7$=LEFT$(C7$,1):TEMPO=VAL(MID$(M$(NPOS),2,3)):OC7=VAL(MID$(M$(NPOS),6,1)):DOTTED=(RIGHT$(M$(NPOS),1)="."):TIME=VAL(MID$(M$(NPOS),8,2)):NOTE=NOT (ASC(N7$)=80)
9060 SH7=(RIGHT$(C7$,1)="#"):FL7=(RIGHT$(C7$,1)="-"):IF NOTE THEN PTNPTR=(12*(OC7-1)+INSTR(PSCALE$,N7$)-SH7+FL7)*2-1:RETURN ELSE PTNPTR=49:RETURN
9990 '
9992 ' ***** MOVE TO THE NEXT NOTE IN THE BUFFER. *****
9998 '
10000 GOSUB 11000:IF NPOS>=NCOUNT-1 THEN NPOS=NCOUNT:PTNPTR=49:TIME=4:DOTTED=FALSE:NOTE=TRUE:RETURN
10010 NPOS=NPOS+1:IF NPOS=BLOCK(BPOS+1,1) THEN BPOS=BPOS+1
10020 C7$=MID$(M$(NPOS),10,2):N7$=LEFT$(C7$,1):TEMPO=VAL(MID$(M$(NPOS),2,3)):OC7=VAL(MID$(M$(NPOS),6,1)):DOTTED=(RIGHT$(M$(NPOS),1)="."):TIME=VAL(MID$(M$(NPOS),8,2)):NOTE=NOT (ASC(N7$)=80)
10060 SH7=(RIGHT$(C7$,1)="#"):FL7=(RIGHT$(C7$,1)="-"):IF NOTE THEN PTNPTR=(12*(OC7-1)+INSTR(PSCALE$,N7$)-SH7+FL7)*2-1:RETURN ELSE PTNPTR=49:RETURN
10090 '
10092 ' ***** SAVE THE PREVIOUS STATE OF THE SCREEN FOR *****
10094 ' ***** PROPER ERASURE OF SYMBOLS. *****
11000 PREVTIME=TIME:PREVDOT=DOTTED:PREVNOTE=NOTE:PREVPTR=PTNPTR:RETURN
11990 '
11992 ' ***** DISPLAY ROUTINE.RE-CREATE THE DATA OF *****
11993 ' ***** THE PREVIOUS NOTE,USING THE INFORMATION *****
11994 ' ***** PRESERVED IN LINE 11000. *****
11995 '
12000 PREVN$=MID$(PTN$,PREVPTR,2):PREVAC$=RIGHT$(PREVN$,1):PREVOC=((PREVPTR-1)/2-INSTR(PSCALE$,LEFT$(PREVN$,1)))/12+1:PREVNN=7*PREVOC+INSTR(SCALE$,LEFT$(PREVN$,1))-7:N2$=N$:IF AC$="-" THEN MID$(N2$,2,1)="b"
12040 '
12042 ' ***** UPDATE THE INFORMATION SQUARE. *****
12048 '
12050 LOCATE 3,31:IF DOTTED THEN PRINT USING "Tone \ \";N2$+"." ELSE PRINT USING "Tone \\";N2$
12060 LOCATE 2,31:PRINT USING "Octave #";OC:LOCATE 6,31:PRINT USING "Note ####";NPOS:LOCATE 5,31:PRINT USING "Tempo ###";TEMPO:LOCATE 7,31:PRINT USING "Blocks ##";BCOUNT:LOCATE 4,31:PRINT USING "Length ##";TIME
12090 '
12092 ' ***** UPDATE THE TIME INDICATOR. *****
12098 '
12100 OLDTX=FNL2!(PREVTIME)*15+RX:IF PREVNOTE AND PREVDOT THEN PUT (OLDTX,NY),DOT
12110 PUT (OLDTX,RY+20*PREVNOTE),NCURS:TX=RX+15*FNL2!(TIME):PUT (TX,RY+20*NOTE),NCURS:IF NOTE AND DOTTED THEN PUT (TX,RY+20*NOTE),DOT
12150 '
12152 ' ***** UPDATE THE PIANO KEYS *****
12158 '
12160 X=INSTR(SCALE$,LEFT$(PREVN$,1)):XQ=INT(X-X/3+.5):IF PREVAC$<>" " THEN PAINT (KBX+BK(XQ),KBY+5),0,2 ELSE IF X=2 OR X=5 OR X=6 THEN PUT (KBX+15*(X-1),KBY),PCC ELSE IF X=1 OR X=4 THEN PUT (KBX+15*(X-1),KBY),PCL ELSE PUT (KBX+15*(X-1),KBY),PCR
12180 X=INSTR(SCALE$,LEFT$(N$,1)):XQ=INT(X-X/3+.5):IF AC$<>" " THEN PAINT (KBX+BK(XQ),KBY+5),1,2 ELSE IF X=2 OR X=5 OR X=6 THEN PUT (KBX+15*(X-1),KBY),PCC ELSE IF X=1 OR X=4 THEN PUT (KBX+15*(X-1),KBY),PCL ELSE PUT (KBX+15*(X-1),KBY),PCR
12190 LINE (0,0)-(319,199),3,B
12200 '
12202 ' ***** UPDATE THE STAFF *****
12208 '
12210 IF NOT PREVNOTE THEN 12440
12220 ON FNL2!(PREVTIME)+1 GOTO 12230,12240,12250,12260,12270,12280,12290
12230 PUT (NDX,NDY(PREVNN)),NOTE1:GOTO 12300
12240 PUT (NDX,NDY(PREVNN)),NOTE2:GOTO 12300
12250 PUT (NDX,NDY(PREVNN)),NOTE4:GOTO 12300
12260 PUT (NDX,NDY(PREVNN)),NOTE8:GOTO 12300
12270 PUT (NDX,NDY(PREVNN)),NOTE16:GOTO 12300
12280 PUT (NDX,NDY(PREVNN)),NOTE32:GOTO 12300
12290 PUT (NDX,NDY(PREVNN)),NOTE64
12300 IF PREVDOT THEN PUT (NDX,NDY(PREVNN)),DOT
12310 IF PREVAC$="-" THEN PUT (NDX-2,NDY(PREVNN)),FLAT ELSE IF PREVAC$="#" THEN PUT (NDX-2,NDY(PREVNN)),SHARP
12320 IF NOT NOTE THEN 12520 ELSE ON FNL2!(TIME)+1 GOTO 12330,12340,12350,12360,12370,12380,12390
12330 PUT (NDX,NDY(NN)),NOTE1:GOTO 12400
12340 PUT (NDX,NDY(NN)),NOTE2:GOTO 12400
12350 PUT (NDX,NDY(NN)),NOTE4:GOTO 12400
12360 PUT (NDX,NDY(NN)),NOTE8:GOTO 12400
12370 PUT (NDX,NDY(NN)),NOTE16:GOTO 12400
12380 PUT (NDX,NDY(NN)),NOTE32:GOTO 12400
12390 PUT (NDX,NDY(NN)),NOTE64
12400 IF DOTTED THEN PUT (NDX,NDY(NN)),DOT
12410 IF AC$="-" THEN PUT (NDX-2,NDY(NN)),FLAT ELSE IF AC$="#" THEN PUT (NDX-2,NDY(NN)),SHARP
12420 RETURN
12440 IF PREVNOTE THEN 12320 ELSE ON FNL2!(PREVTIME)+1 GOTO 12450,12460,12470,12480,12490,12500,12510
12450 PUT (RDX,RDY),REST1:GOTO 12320
12460 PUT (RDX,RDY),REST2:GOTO 12320
12470 PUT (RDX,RDY),REST4:GOTO 12320
12480 PUT (RDX,RDY),REST8:GOTO 12320
12490 PUT (RDX,RDY),REST16:GOTO 12320
12500 PUT (RDX,RDY),REST32:GOTO 12320
12510 PUT (RDX,RDY),REST64:GOTO 12320
12520 ON FNL2!(TIME)+1 GOTO 12530,12540,12550,12560,12570,12580,12590
12530 PUT (RDX,RDY),REST1:RETURN
12540 PUT (RDX,RDY),REST2:RETURN
12550 PUT (RDX,RDY),REST4:RETURN
12560 PUT (RDX,RDY),REST8:RETURN
12570 PUT (RDX,RDY),REST16:RETURN
12580 PUT (RDX,RDY),REST32:RETURN
12590 PUT (RDX,RDY),REST64:RETURN
12997 '
12998 ' ***** SET UP THE SHAPE TABLES *****
12999 '
13000 SCREEN 1:CLS:COLOR 0,1:STAFF$="S10 A000 BM000,000 C1 D8 R1 U8 L1 R1 BR40 D8 R1 U8 L1 L40 D2 R40 D2 L40 D2 R40 D2 L40":STAFF$=STAFF$+" L1 D16 R1 U8 L1 R1 BR40 D8 R1 U8 L1 L40 D2 R40 D2 L40 D2 R40 D2 L40":DRAW STAFF$:STAFF$=""
13030 GET (0,0)-(104,70),STAFF:CLS
13050 CIRCLE (4,13),3,2,,,.55:GET (0,0)-(13,17),NOTE1:LINE (7,13)-(7,1),2:GET (0,0)-(13,17),NOTE2:PAINT (4,13),2,2:GET (0,0)-(13,17),NOTE4:LINE (7,1)-(12,3),2:GET (0,0)-(13,17),NOTE8:LINE (7,3)-(12,5),2:GET (0,0)-(13,17),NOTE16
13060 LINE (7,5)-(12,7),2:GET (0,0)-(13,17),NOTE32:LINE (7,7)-(12,9),2:GET (0,0)-(13,17),NOTE64:CLS
13080 LINE(2,0)-(2,6),2:LINE (4,0)-(4,6),2:LINE (1,2)-(5,2),2:LINE (1,4)-(5,4),2:GET (0,0)-(13,17),SHARP:CLS:LINE (2,0)-(2,6),2:LINE (2,6)-(6,4),2:LINE (6,4)-(2,2),2:GET (0,0)-(13,17),FLAT
13100 CLS:LINE (3,11)-(9,13),2,BF:GET (0,0)-(13,17),REST1:CLS:LINE (3,9)-(9,7),2,BF:GET (0,0)-(13,17),REST2:CLS:LINE (6,3)-(8,5),2:LINE (8,5)-(6,8),2:LINE (6,8)-(8,10),2:LINE (8,10)-(5,13),2:LINE (5,13)-(6,15),2:GET (0,0)-(13,17),REST4
13110 CLS:LINE (6,14)-(9,3),2:LINE (9,4)-(3,6),2:GET (0,0)-(13,17),REST8:LINE (9,6)-(3,8),2:GET (0,0)-(13,17),REST16:LINE (7,8)-(3,10),2:GET (0,0)-(8,16),REST32:LINE (7,10)-(3,12),2:GET (0,0)-(13,17),REST64
13130 CLS:LINE (0,0)-(9,30),3,BF:LINE (0,30)-(12,50),3,BF:GET (0,0)-(12,50),PIANOL
13131 PAINT (5,5),2,0:GET (0,0)-(12,50),PCL
13132 CLS:LINE (4,0)-(9,30),3,BF:LINE(0,30)-(12,50),3,BF:GET (0,0)-(12,50),PIANOC
13133 PAINT (5,5),2,0:GET (0,0)-(12,50),PCC
13134 CLS:LINE (4,0)-(12,30),3,BF:LINE (0,30)-(12,50),3,BF:GET (0,0)-(12,50),PIANOR
13135 PAINT (5,5),2,0:GET (0,0)-(12,50),PCR
13140 CLS:LINE (0,0)-(13,17),2,BF:GET (0,0)-(13,17),NCURS:CLS:PSET (10,14),2:PSET (10,15),2:PSET (11,14),2:PSET (11,15),2:GET (0,0)-(13,17),DOT:RETURN
13990 '
13992 ' ***** DRAW THE INITIAL SCREEN *****
14000 CLS:LINE (0,0)-(319,199),3,B:LINE (115,0)-(115,199),3:LINE (115,63)-(319,199),3,B:LINE (234,0)-(234,63),3
14030 PUT (KBX,KBY),PIANOL:PUT (KBX+15,KBY),PIANOC:PUT (KBX+30,KBY),PIANOR:PUT (KBX+45,KBY),PIANOL:PUT (KBX+60,KBY),PIANOC:PUT (KBX+75,KBY),PIANOC:PUT (KBX+90,KBY),PIANOR:LINE (KBX-3,KBY-2)-(KBX+105,KBY+52),3,B:PAINT (KBX+11,KBY+1),2,3
14050 FOR X=KBX+10 TO KBX+25 STEP 15:LINE (X+1,KBY)-(X+7,KBY+28),0,BF:NEXT X:FOR X=KBX+55 TO KBX+55+30 STEP 15:LINE (X+1,KBY)-(X+7,KBY+28),0,BF:NEXT X
14060 PUT (KBX,KBY),PCL
14070 LINE (0,NY-2)-(115,NY-2),3:PUT (NX,NY),NOTE1:PUT (NX+15,NY),NOTE2:PUT (NX+30,NY),NOTE4:PUT (NX+45,NY),NOTE8:PUT (NX+60,NY),NOTE16:PUT (NX+75,NY),NOTE32:PUT (NX+90,NY),NOTE64:TX=RX+15*FNL2!(TIME):PUT (TX,NY),NCURS
14090 LINE (0,RY-2)-(115,RY-2),3:PUT (RX,RY),REST1:PUT (RX+15,RY),REST2:PUT (RX+30,RY),REST4:PUT (RX+45,RY),REST8:PUT (RX+60,RY),REST16:PUT (RX+75,RY),REST32:PUT (RX+90,RY),REST64:PUT (STAFFX,STAFFY),STAFF
14120 FOR X=1 TO 5:LINE (STAFFX+46,STAFFY-X*5)-(STAFFX+60,STAFFY-X*5),1:LINE (STAFFX+46,STAFFY+X*5+45)-(STAFFX+60,STAFFY+X*5+45),1:NEXT X:LINE (STAFFX+46,STAFFY+MIDC)-(STAFFX+60,STAFFY+MIDC),1:PUT (NDX,NDY(NN)),NOTE4
14160 GOSUB 12000:LOCATE 12,22:DEF SEG:POKE 78,1:PRINT"PC Blues Box":LOCATE 14,21:DEF SEG:POKE 78,2:PRINT "A Music Editor":LOCATE 15,21:PRINT "For The IBM PC"
14165 X$="CDEFGAB":FOR X=0 TO 6:PLAY "MB O="+VARPTR$(X)+"T100 L32 X" +VARPTR$(X$)+"X"+VARPTR$(X$):NEXT :FOR X=18 TO 12 STEP -1:LOCATE X,16:PRINT STRING$(24,32):NEXT
14170 LOCATE 10,16:PRINT "F1 DOWN Octave UP F2"
14190 LOCATE 11,16:PRINT "F3 START Block END F4"
14200 LOCATE 12,16:PRINT "F5 INSRT Block DEL F6"
14210 LOCATE 13,16:PRINT "F7 PREV. Block NEXT F8"
14220 LOCATE 14,16:PRINT "F9 PREV. Note NEXT F0"
14230 LOCATE 15,16:PRINT "S SAVE File LOAD L"
14240 LOCATE 16,16:PRINT "C CLEAR Music PLAY P"
14250 LOCATE 17,16:PRINT "N NOTE Edit TEMPO T"
14260 LOCATE 18,16:PRINT "[Esc] Stop Play [Esc]"
14265 LOCATE 19,16:PRINT "Ctrl-C Quit Menu M"
14270 RETURN
14990 '
14992 ' ***** SET UP Y COORDINATES FOR DRAWING *****
14993 ' ***** NOTES AND THE X COORDINATES FOR DRAWING *****
14994 ' ***** PIANO KEYS. *****
15000 RESTORE:FOR X=1 TO 35:READ NDY(X):NDY(X)=NDY(X)+STAFFY:NEXT:FOR X=1 TO 5:READ BK(X):NEXT:RETURN
15010 DATA 57,55,52,50,47,45,42,40,37,35,32,30,27,25,17,10,7,5,2,0,-3,-5,-8,-10,-13,-15,-18,-20,-23,-25,-28,-30,-33,-35,-38,15,30,60,75,90
15990 '
15992 ' ***** ACCEPT A NOTE INTO THE BUFFER. *****
15998 '
16000 GOSUB 11000:M$="T000O0L00Na ":LZ=-((TEMPO<10)+(TEMPO<100)):MID$(M$,2+LZ)=FNS$(STR$(TEMPO)):MID$(M$,6)=FNS$(STR$(OC)):LZ=-(TIME<10):MID$(M$,8+LZ)=FNS$(STR$(TIME))
16060 IF NOT NOTE THEN MID$(M$,10)="P"+FNS$(STR$(TIME)) ELSE MID$(M$,10)=N$:IF DOTTED THEN MID$(M$,12)="."
16070 M$(NPOS)=M$:IF NOTE THEN PLAY M$
16090 NPOS=NPOS+1:IF NPOS>NCOUNT THEN NCOUNT=NCOUNT+1
16110 IF NPOS=NCOUNT THEN RETURN
16120 C7$=MID$(M$(NPOS),10,2):N7$=LEFT$(C7$,1):OC7=VAL(MID$(M$(NPOS),6,1)):DOTTED=(RIGHT$(M$(NPOS),1)="."):TIME=VAL(MID$(M$(NPOS),8,2)):NOTE=NOT (ASC(N7$)=80)
16160 SH7=(RIGHT$(C7$,1)="#"):FL7=(RIGHT$(C7$,1)="-"):IF NOTE THEN PTNPTR=(12*(OC7-1)+INSTR(PSCALE$,N7$)-SH7+FL7)*2-1:RETURN ELSE PTNPTR=49:RETURN
16167 '
16168 ' ***** UN-DEFINE THE FUNCTION KEYS *****
16169 '
16170 FOR X=1 TO 10:KEY X, "":NEXT X
16171 RETURN
16990 '
16992 ' ***** FILE OPERATIONS(LOAD AND SAVE). *****
16998 '
17000 ON ERROR GOTO 17500
17010 GOSUB 11000:LOCATE 22,16:LINE INPUT "File >";F$:LOCATE 22,16:PRINT STRING$(24,32):OPEN F$ FOR INPUT AS #1:INPUT #1,BCOUNT:INPUT #1,NCOUNT:IF BCOUNT<>0 THEN FOR X=1 TO BCOUNT:INPUT #1,BLOCK(X,1):INPUT #1,BLOCK(X,2):NEXT X
17060 BPOS=BCOUNT:FOR X=1 TO NCOUNT-1:INPUT #1,M$(X):NEXT X:CLOSE #1:NPOS=NCOUNT:TIME=4:DOTTED=FALSE:NOTE=TRUE:PTNPTR=49:TEMPO=VAL(MID$(M$(1),2,3))
17065 RETURN
17070 ON ERROR GOTO 0
17490 '
17492 ' ***** RETURN IF NO DATA FILE *****
17498 '
17500 IF ERR=53 THEN LOCATE 22,16:PRINT STRING$(24,32):LOCATE 22,16:PRINT "NO FILE CALLED ";F$:FOR X=1 TO 5000:NEXT X:LOCATE 22,16:PRINT STRING$(24,32):GOSUB 22030:RESUME 17065
17520 END
18000 GOSUB 11000:LOCATE 22,16:LINE INPUT "FILE >";F$:LOCATE 22,16:PRINT STRING$(24,32):OPEN F$ FOR OUTPUT AS #1:PRINT #1,BCOUNT:PRINT #1,NCOUNT:IF BCOUNT<>0 THEN FOR X=1 TO BCOUNT:PRINT #1,BLOCK(X,1):PRINT #1,BLOCK(X,2):NEXT X
18060 BPOS=BCOUNT:FOR X=1 TO NCOUNT-1:PRINT #1,M$(X):NEXT X:CLOSE #1:NPOS=NCOUNT:TIME=4:DOTTED=FALSE:NOTE=TRUE:PTNPTR=49:RETURN
18990 '
18992 ' ***** PLAY THE MUSIC *****
18998 '
19000 GOSUB 11000:PLAY "MB":FOR X=1 TO NCOUNT-1:IF INKEY$=CHR$(27) THEN RETURN ELSE PLAY M$(X)
19020 NEXT :RETURN
19990 '
19992 ' ***** SET TEMPO *****
19998 '
20000 GOSUB 11000:LOCATE 22,16:LINE INPUT "Tempo (32-255) >";X$:TEMPO=VAL(X$):IF TEMPO<32 OR TEMPO>255 THEN TEMPO=100
20010 LOCATE 22,16:PRINT STRING$(24,32):RETURN
20990 '
20992 ' ***** MOVE NOTE TO EDIT *****
20998 '
21000 GOSUB 11000:LOCATE 22,16:LINE INPUT "Edit Which Note # >";X$:LOCATE 22,16:PRINT STRING$(24,32):IF VAL(X$)<1 OR VAL(X$)>=NCOUNT THEN RETURN
21010 NPOS=VAL(X$):C7$=MID$(M$(NPOS),10,2):N7$=LEFT$(C7$,1):OC7=VAL(MID$(M$(NPOS),6,1)):DOTTED=(RIGHT$(M$(NPOS),1)="."):TIME=VAL(MID$(M$(NPOS),8,2)):NOTE=NOT (ASC(N7$)=80)
21020 TEMPO=VAL(MID$(M$(NPOS),2,3))
21060 SH7=(RIGHT$(C7$,1)="#"):FL7=(RIGHT$(C7$,1)="-"):IF NOTE THEN PTNPTR=(12*(OC7-1)+INSTR(PSCALE$,N7$)-SH7+FL7)*2-1:RETURN ELSE PTNPTR=49:RETURN
21990 '
21992 ' ***** CLEAR THE MUSIC BUFFER *****
21998 '
22000 GOSUB 11000:LOCATE 22,16:LINE INPUT "Are You Sure >";X$:LOCATE 22,16:PRINT STRING$(24,32)
22010 IF X$="" THEN RETURN
22020 IF FNU$(X$)<>"Y" THEN RETURN
22030 BCOUNT=0:NCOUNT=1:NPOS=1:TIME=4:NOTE=TRUE:DOTTED=FAFSE:PTNPTR=49:TIME=4:TEMPO=100:RETURN
22990 '
22992 ' ***** QUIT *****
22998 '
23000 GOTO 51000
49990 '
49992 ' ***** TEMPORARY LINE TO HANDLE UNIMPLEMENTED COMMANDS *****
49998 '
50000 GOSUB 11000:LOCATE 22,16:PRINT "Not yet implemented.":FOR X=1 TO 1000:NEXT X:LOCATE 22,16:PRINT STRING$(24,32):RETURN
51000 CLS:FU$(1)=CHR$(12)+"LIST "
51010 FU$(2)="RUN"+CHR$(13)
51020 FU$(3)="LOAD"+CHR$(34)
51030 FU$(4)="SAVE"+CHR$(34)
51040 FU$(5)="RUN"+CHR$(34)+"MENU"+CHR$(13)
51050 FU$(6)=","+CHR$(34)+"LPT1:"+CHR$(34)+CHR$(13)
51060 FU$(7)="TRON"+CHR$(13)
51070 FU$(8)="WIDTH 80"+CHR$(13)+"CLS"+CHR$(13)
51080 FU$(9)="COLOR 2,0,0"+CHR$(13)
51090 FU$(10)="SCREEN 0,0,0"+CHR$(13)
51110 FOR X=1 TO 10:KEY X,FU$(X):NEXT X
51120 SCREEN 0,0,0:CLS:COLOR 2,0,0:WIDTH 80
TITLE REBOOT DOS
;
DSEG SEGMENT AT 0
ORG 01EH*4
DISK_POINTER LABEL DWORD
FIRST DW ?
SECOND DW ?
DSEG ENDS
;
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
ORG 100H
START: MOV AX,DSEG
MOV DS,AX
MOV SECOND,0F000H
MOV FIRST,0EFC7H
INT 19H
CSEG ENDS
END START
August 28, 1982 /* Modified for IBM PC by MSZachmann */
May 7, 1981
ROFF
This version of ROFF, based on the formatter in Kernighan
and Plauger's book SOFTWARE TOOLS, is written in BDS C, and employs
the directed i/o functions that go along with that package. Well,
half of the directed I/O anyway - it doesn't use redirected input
because I wanted to be able to format more than one file at a run.
Please ignore any "odd" comments to myself in ROFF1.C and ROFF2.C;
I tried to find them all but there may be a few extra silly remarks
around.
For more details on the directed I/O (NDIO in our version)
see NDIO.C
Sample calls:
A> roff filename
This will send the formatted output to the Console (display)
A> roff >filename2 filename
This will send the formatted output to filename2
A> roff >PRN: filename
This will send the formatted output to the printer.
Using ROFF, you can make nice printouts of a file, with as
little or as much help from the program as you want, depending on the
commands. There are default values for all parameters, so if you
don't put any commands in at all, your file will come out with filled,
right-justified lines. The default line-length is 80 characters;
the default page-length is 66 lines per page. "Filled lines" means
that as many input words as possible are packed onto a line before it
is printed; "non-filled" lines go through the formatter w/o
rearrangement. "Right-justified" simply means that spaces are added
between words to make all the right margins line up nicely.
To set a parameter, use the appropriate commands below. All
commands have the form of a period followed by two letters. A command
line should have nothing on it but the command and its arguments (if
any); any text would be lost.
A command argument can be either ABSOLUTE or RELATIVE :
.in 5 sets the indent value to 5 spaces
.in +5 sets the indent value to the CURRENT value plus 5
.ls -1 sets the line spacing value to the current value
minus one
Also, all commands have a minimum and maximum value that will
weed out any odd command settings (like setting the line spacing to
zero, for example. It won't let you do that, but it could be changed
if you REALLY have a burning desire to do so).
Some commands cause a "break", which is noted in the table
below. Before such a command goes into effect, the current line of
text is put out, whether it is completely filled or not. (this is
what happens at the end of a paragraph, for example.) A line
beginning with spaces or a tab will cause a break, and will be
indented by that many spaces (or tabs) regardless of the indent value
at that time (this is a "temporary indent", which can also be set
explicitly). An all blank line also causes a break. If you find that
seem to have some lines that are indented strangely, and it's not
obvious WHY, look at which commands are causing a break, and which
aren't. For instance:
.fi
.ti 0
this is a line of text
.in 8
<- blank line
more text for the machine to play with
At first glance it seems obvious that the line "this is a line of text"
will be indented zero spaces, but it won't - it will be indented 8.
The indent command does NOT cause a break (although the .ti does)
so it will not cause the line to be put out before setting the indent
value to 8. Then, when the blank line is encountered, it will cause
a break - and "this is a line of text" will be indented incorrectly.
*********************** Table of Commands *****************************
Command Break? Default Function
------- ------ ------- ---------
.bp n yes n = +1 begin page numbered n
.br yes cause a break
.ce n yes n = 1 center next n lines
.fi yes start filling lines
.fo string no empty sets footer to string
.he string no empty sets header to string
.in n no n = 0 sets indent value to n
.ls n no n = 1 sets line spacing to n
.m1 no n = 2 sets topmost margin to n
.m2 no n = 2 sets 2nd top margin to n lines
.m3 no n = 2 1st bottom margin to n lines
.m4 no n = 2 bottom-most margin to n lines
.nf yes stop filling lines
.pl n no n = 66 sets page length to n
.rm n no n = 80 sets right margin to n
.sp n yes n = 1 space down n lines
.ti n yes n = 0 sets temporary indent of n
.ul n no n = 1 underline next n lines
----------------------------------------------------------------------
Here's what the page parameters look like:
_ _________________________________________________
| | top margin - (includes header) |
| |-----------------------------------------------|
| | top margin 2 |
| |-----------------------------------------------|
P | : : |
A | :<-indent : |
G | : : |
E | :lots and lots of silly text and: |
L | :other garbage. Get the picture?: |
E | :This is a temp. indentation: |
N | : : |
G | : right margin -> : |
T | : : |
H | : : |
| |-----------------------------------------------|
| | margin 3 |
| |-----------------------------------------------|
| | margin 4 - (includes footer) |
- -------------------------------------------------
To change the default for any parameter, simply alter ROFFGLOB
recompile ROFF1.c and ROFF2.c, and re-clink them with NDIO.CRL
(you can use DIO.CRL, but it doesn't have all the features of
NDIO )
************************************************************
A Few Extra Comments on Some of the Commands:
************************************************************
If you want to center lots of lines, but don't
want to count them, do something like this:
.ce 1000
lots and
lots of words to
be centered
.ce 0
--------------------------------------
To underline a few words on a line:
.fi
.ul
Some
of the words in
.ul
this
sentence are
.ul
underlined
.nf
WOULD PRODUCE:
Some of the words in this sentence are underlined.
---- ---- -----------
(obviously you don't have to turn the fill on and off if it's
already on )
------------------------------------
A new paragrah may be caused by using the temporary indent
command, like
.ti +5
or by simply beginning the paragraph with a tab, as you would if
you were just typing.
------------------------------------
Headers and Footers.
A page number can be incorporated into any header or
footer by putting a "#" in the title where you want the number
to go:
.he This is a witty header title for page #
Each time this is printed at the top of a page, the current
page number will be substituted for the "#".
------------------------------------
If you want to send the output to a file, and don't want the page
breaks in there ( that's what I did for this ) set margins 1-4 to
zero.
TITLE SDIR - SORTED DIRECTORY COMMAND, Version 2.1
PAGE 64,101 ; JAN 1983
COMMENT |
SDIR [d:][filename[.ext]] [options]
[filespec] same as for DIR command
[options] * /A - List hidden files.
* /E - Without screen erase.
* /P - Pause when screen full.
/X - Sort by extension.
/S - Sort by size.
/D - Sort by date/time.
/N - Do not sort, original order.
Default = *.* sorted by name.ext with screen erase.
* - Option may be combined with other options.
This source file was created from an object file obtained
from Gene Plantz's BBS in Chicago. The original file name
was SD.HEX. I then used DEBUG and CAPTURE to get the first
dis-assembly which was then edited with WORDSTAR to create
a source that when assembled using MASM would duplicate the
original object file.
Comments have been added and I do hope they are helpful.
I have made several modifications to the first version and
am continuing to add comments. This source file is an
excellent example for anyone wishing to learn 8086/8088
assembly language. Use at your own risk and feel free to
share this file with your friends.
I certainly wish that John Chapman would publish his
source file. His comments are sure to be more meaningful
than mine could ever be. Some of the conversion routines
are very elegant, but difficult to understand. As far as
I'm concerned, PRINTDD is magic.
Several modifications have been made. They are:
1. Filespecs are processed like DIR does.
2. No sort option was added. /N
3. Pause when screen full option added. /P
4. Number of files found is printed.
Ted Reuss
Houston, TX
|
SUBTTL EQUATES & STRUCTURES
PAGE
IF1
DOSCALL MACRO FUNC,PARM1
.xcref
F_C = FUNC
IFNB <PARM1>
IF F_C EQ 2 OR (F_C GE 4 AND F_C LE 6) OR F_C EQ 14 OR F_C EQ 46
MOV DL,PARM1
ELSE
MOV DX,OFFSET PARM1
ENDIF
ENDIF
MOV AH,FUNC
INT 21H
.cref
ENDM
ENDIF
.SALL ;supress all macro expansions
; PC-DOS INTERRUPT 21H FUNCTION CODES
;
@CHROUT EQU 2 ;display char in DL
@KEYIN EQU 8 ;kybd input w/o echo
@STROUT EQU 9 ;print string terminated with $
@CKEYIN EQU 12 ;clr kybd bufr & do inp.func in AL
@SRCH1 EQU 17 ;search for first dir entry
@SRCH2 EQU 18 ;search for next dir entry
@GETDSK EQU 25 ;get default disk drive
@SETDTA EQU 26 ;set disk transfer addr
@FATAD2 EQU 28 ;get FAT of drive # in DL
@PARSEF EQU 41 ;parse filename
@GETDTE EQU 42 ;get system date
@GETTME EQU 44 ;get system time
CR EQU 0DH ;carriage return
LF EQU 0AH ;line feed
FCB_1 EQU 5CH ;fcb for parameter 1
PARAM_L EQU 80H ;# characters in PARAM_B
PARAM_B EQU 81H ;DOS cmd parameter buffer.
; PC-DOS packed date <yyyyyyym mmmddddd>
P_DTE RECORD P_YR:7,P_MO:4,P_DY:5
; PC-DOS packed time <hhhhhmmm mmmsssss>
P_TME RECORD P_HR:5,P_MI:6,P_2S:5
DIRNTRY STRUC ;directory entry structure
LNK DW 0 ;ptr to next entry
NAM DB 8 DUP(0),'.' ;filename
EXT DB 3 DUP(0) ;extension
TME DW 0 ;time
DTE DW 0 ;date
SZL DW 0 ;low word of size
SZH DW 0 ;high word of size
DIRNTRY ENDS
SUBTTL DATA AREA & INITIALIZATION
PAGE
SDIR SEGMENT PUBLIC 'CODE'
ASSUME CS:SDIR,DS:SDIR,ES:SDIR
ORG 100H
MAIN PROC FAR
JMP STARTS
DIRLNK DW DIRBUF ;ptr to next opening in DIRBUF
C1LNK DW 0 ;ptr to row 1, column 1
C2LNK DW 0 ;ptr to row 1, column 2
NBRFILS DW 0 ;# of files or detail lines
SRTFLG DB 0 ;if = 0 then sort else no sort
CLSFLG DB 0 ;if = 0 then clear screen
EXTFLG DB 0 ;if <> 0 then sort by ext
SIZFLG DB 0 ;if <> 0 then sort by size
DTEFLG DB 0 ;if <> 0 then sort by date/time
PSEFLG DB 0 ;if <> 0 then pause if screen full
LPERSCR EQU 25 ;Lines per screen
LINCNT DB LPERSCR-4 ;Number of lines left
PSEMSG DB 'Strike a key when ready . . . $'
HDNG1 DB 'Sorted Disk Directory Version 2.02 '
DB 'DRIVE '
HDRVE DB '@: Date '
D_MM DW '00' ;Month
DB '/'
D_DD DW '00' ;Day
DB '/'
D_YY DW '00' ;Year
DB ' Time '
T_HH DW '00' ;Hours
DB ':'
T_MM DW '00' ;Minutes
DB CR,LF
CRLF DB CR,LF,'$'
HDNG2 DB '--FILENAME-- -SIZE- --LAST CHANGE--$'
DB 8 DUP(' ')
SPACES DB '$'
HDNG3 DB ' File(s)',CR,LF,'$'
SUBTTL DISK TRANSFER AREA & FREE SPACE ENTRY DEFS
PAGE
XFCB DB -1,7 DUP(0),11 DUP('?'),25 DUP(0)
ATTRIB EQU XFCB+6 ;file attribute
DRVNBR EQU ATTRIB+1 ;drive # (1=A, 2=B, etc.)
DTA DB 40 DUP(0) ;Disk Transfer Area used
FILNAME EQU DTA+8 ;by SRCHDIR for the
FILTIME EQU DTA+30 ;directory search.
FILSIZE EQU DTA+36
FREESPC DW 0 ;Free space entry.
DB '*FREE SPACE*',4 DUP(0)
LOSIZE DW 0 ;of free space
HISIZE DW 0 ;of free space
SUBTTL MAIN PROGRAM SECTION
PAGE
STARTS:
PUSH DS ;Set up the
XOR AX,AX ; stack for a
PUSH AX ; return to DOS.
CALL GETARGS ;Process arguments
CALL SRCHDIR ;Search directory
CMP SRTFLG,0 ;Check if any sort
JZ A1 ; option selected.
CALL LNKDIRB ;Leave in original
JMP SHORT A2 ; directory order.
A1: CALL SRTDIRB ;Sort by major key
A2: CALL GETFREE ;Get free space
CALL SPLTLST ;Set up for 2 columns
CALL PRTHDNG ;Print headings
CALL PRTDRVR ;Print detail lines
CALL PRTNFLS ;Print # of files
RET ;Return to DOS
MAIN ENDP
SUBTTL GETARGS - PROCESS ARGUMENTS
PAGE
GETARGS PROC NEAR
MOV SI,PARAM_B ;point to cmd buffer
MOV DI,OFFSET DRVNBR ;point to FCB
MOV AL, 1111B ;Select parse options
DOSCALL @PARSEF ;Parse filename
CMP BYTE PTR [DI],0 ;If <> 0 then
JNZ B1 ; not default drive
DOSCALL @GETDSK ;AL <- default disk
INC AL ;Increment drive #
STOSB ;Save drive #
B1: MOV SI,PARAM_L ;SI <- ptr cmd length
MOV CH,0
MOV CL,[SI] ;CL <- # chars in cmd
JCXZ B10
B2: INC SI ;Point to next char
CMP BYTE PTR [SI],'/'
JNZ B8 ;If not a slash
MOV AL,[SI+1] ;AL <- option letter
AND AL,0DFH ;Force to upper-case
CMP AL,'A' ;Hidden & system files?
JNZ B3 ;Nope, try next one.
MOV BYTE PTR ATTRIB,2+4 ;Hidden & system
B3: CMP AL,'E' ;Without screen erase?
JNZ B4 ;Nope, try next one.
MOV CLSFLG,AL
B4: CMP AL,'S' ;Sort by size?
JNZ B5 ;Nope, try next one.
MOV SIZFLG,AL
B5: CMP AL,'D' ;Sort by date/time?
JNZ B6 ;Nope, try next one.
MOV DTEFLG,AL
B6: CMP AL,'X' ;Sort by extension?
JNZ B7 ;Nope, try next one.
MOV EXTFLG,AL
B7: CMP AL,'N' ;Original order?
JNZ B8 ;Nope, try next one.
MOV SRTFLG,AL
B8: CMP AL,'P' ;Pause when screen full?
JNZ B9 ;Nope, try next one.
MOV PSEFLG,AL
B9: LOOP B2 ;Test for another param.
B10: RET
GETARGS ENDP
SUBTTL SRCHDIR - SEARCH DIRECTORY
PAGE
SRCHDIR PROC NEAR
DOSCALL @SETDTA,DTA ;Set DTA for dir. search
DOSCALL @SRCH1,XFCB ;First call to search dir.
C1: OR AL,AL
JNZ C2 ;Not found, quit looking.
MOV BX,DIRLNK ;BX <- base of DIRBUF
LEA DI,[BX].NAM
MOV SI,OFFSET FILNAME
MOV CX,SIZE NAM
CLD
REPZ MOVSB ;Move filename to DIRBUF
MOV BYTE PTR [DI],'.' ; Store a period
INC DI
MOV CX,SIZE EXT
REPZ MOVSB ;Move ext to DIRBUF
MOV SI,OFFSET FILTIME
MOVSW ;Move time to DIRBUF
MOVSW ;Move date to DIRBUF
MOV SI,OFFSET FILSIZE
MOVSW ;Move size to DIRBUF
MOVSW
ADD BX,SIZE DIRNTRY ;Point to next entry
MOV DIRLNK,BX ;Save ptr
INC NBRFILS ;Increment file count
DOSCALL @SRCH2,XFCB ;Search for next file
JMP C1 ;Loop for next one
C2: RET
SRCHDIR ENDP
SUBTTL SRTDIRB - SORTS ENTRIES IN DIRBUF
PAGE
SRTDIRB PROC NEAR ;Sorts directory entries in DIRBUF
MOV DI,OFFSET DIRBUF ;Point to DIRBUF
D1: CMP DI,DIRLNK ;Are there anymore?
JNC D8 ;NO, exit
MOV SI,OFFSET C1LNK ;Start with column 1 ptr
D2: MOV BX,SI
MOV SI,[BX] ;SI<-ptr to next entry
OR SI,SI
JZ D7 ;if link=0
MOV AX,SI
MOV DX,DI
XOR CL,CL ;CL <- 0
CMP CL,SIZFLG
JNZ D5 ;If sort by size
CMP CL,DTEFLG
JNZ D4 ;If sort by date/time
CMP CL,EXTFLG
JNZ D3 ;If sort by ext
LEA SI,[SI].NAM
LEA DI,[DI].NAM
MOV CX,1+SIZE NAM+SIZE EXT ;# of bytes
JMP SHORT D6
D3: LEA SI,[SI].EXT ;Sort by extension
LEA DI,[DI].EXT
MOV CX,SIZE EXT ;# of bytes
JMP SHORT D6
D4: LEA SI,[SI].DTE ;Sort by date/time
LEA DI,[DI].DTE
MOV CX,2 ;# of words
STD
REPZ CMPSW
MOV DI,DX
MOV SI,AX
JBE D2
JMP SHORT D7
D5: LEA SI,[SI].SZH ;Sort by size
LEA DI,[DI].SZH
MOV CX,2 ;# of words
STD
REPZ CMPSW
MOV DI,DX
MOV SI,AX
JBE D2
JMP SHORT D7
D6: CLD ;Sort by name.ext
REPZ CMPSB
MOV DI,DX
MOV SI,AX
JBE D2
D7: MOV [DI],SI
MOV [BX],DI
ADD DI,SIZE DIRNTRY ;Point to next entry
JMP D1
D8: RET
SRTDIRB ENDP
SUBTTL
PAGE
; LNKDIRB - LINKS ENTRIES IN DIRBUF
LNKDIRB PROC NEAR ;LINK ENTRIES IN DIRBUF
MOV DI,OFFSET DIRBUF
MOV C1LNK,DI ;Point to 1st entry
MOV CX,NBRFILS ;Set loop counter
DEC CX
LNK1: MOV BX,DI
ADD DI,SIZE DIRNTRY ;Offset to next entry
MOV [BX],DI ;Store ptr
LOOP LNK1 ;Link next entry
MOV [DI],CX ;Last ptr <- null
RET
LNKDIRB ENDP
; SPLTLST - SPLITS LINKED LIST IN HALF
SPLTLST PROC NEAR
MOV CX,NBRFILS ;Get # of entries
SAR CX,1 ; and divide by 2
JZ F2 ;if NBRFILS < 2
ADC CL,0 ;Account for odd #
MOV BX,OFFSET C1LNK
F1: MOV BX,[BX] ;Chain thru list to
LOOP F1 ; last row of column 1.
MOV AX,[BX] ;Get ptr to 1st row of col 2
MOV C2LNK,AX ; C2LNK <- R1,C2 ptr
MOV [BX],CX ;Last row of col 1 <- null
F2: RET
SPLTLST ENDP
SUBTTL GETFREE - GET DISK FREE SPACE
PAGE
GETFREE PROC NEAR ;cluster = allocation unit
MOV DL,DRVNBR ;Get drive #
PUSH DS ;Save DS
DOSCALL @FATAD2 ;Get FAT info from DOS
MOV AH,0 ;AL = sector size
XCHG CX,DX ;Sector size times the
MUL DX ; # sectors/cluster
PUSH AX ;Save cluster size
XOR AX,AX ;Unused clusters = 0
MOV SI,2 ;Skip first 3 clusters
E1: MOV DI,SI ;DI <- cluster #
SHR DI,1 ;Divide cluster number
ADD DI,SI ; by 1.5
MOV DI,[BX+DI] ;Fetch from FAT
TEST SI,1 ;Test if even or odd
JZ E2 ;If even then skip
SHR DI,1 ; else if odd
SHR DI,1 ; right justify the
SHR DI,1 ; cluster number.
SHR DI,1
E2: AND DI,0FFFH ;Mask the low 12 bits
JNZ E3 ;If not 0 then skip, else
INC AX ; increment counter.
E3: INC SI ;Point to next cluster
LOOP E1 ; and go check it.
POP CX ;Get cluster size, times
MUL CX ; # of free clusters
POP DS ;Restore DS
MOV LOSIZE,AX ;Save the 32 bit
MOV HISIZE,DX ; binary free space
MOV BX,C1LNK ;Insert FREESPC in
MOV DI,OFFSET FREESPC ;first position
MOV [DI],BX ; of linked list of
MOV C1LNK,DI ; directory entries.
INC NBRFILS ;Bump # of entries
RET
GETFREE ENDP
SUBTTL PRTHDNG - PRINT HEADINGS
PAGE
PRTHDNG PROC NEAR
MOV AL,CLSFLG
OR AL,AL
JNZ G1 ;If not erase screen
SUB CX,CX
MOV DX,24*256+79 ;row=24 col=79
MOV BH,7 ;Video mode
MOV AX,0600H
INT 10H ;BIOS video call
SUB DX,DX
MOV AH,2 ;Clear screen
MOV BH,0
INT 10H ;BIOS video call
G1: MOV AL,DRVNBR ;Get drive #
ADD HDRVE,AL ;Convert to ascii
DOSCALL @GETDTE ; CX<-year, DH<-month, DL<-day
MOV AL,DH
AAM
XCHG AL,AH
OR D_MM,AX ;Fold into month
MOV AL,DL
AAM
XCHG AL,AH
OR D_DD,AX ;Fold into day
MOV AX,CX
SUB AX,1900
AAM
XCHG AL,AH
OR D_YY,AX ;Fold into year
DOSCALL @GETTME ; CH<-hours, CL<-minutes
MOV AL,CH ;AL<-binary hours
AAM ;Convert AL to two
XCHG AL,AH ; BCD digits in AX.
OR T_HH,AX ;Fold into hours
MOV AL,CL ;AL<-binary minutes
AAM ;Convert AL to two
XCHG AL,AH ; BCD digits in AX.
OR T_MM,AX ;Fold into minutes
DOSCALL @STROUT,HDNG1 ;Print main heading
DOSCALL @STROUT,HDNG2 ;Print column 1 heading
CMP WORD PTR C2LNK,0
JZ G2 ;If not 2 columns
DOSCALL @STROUT,SPACES-5 ;Print 5 spaces
DOSCALL @STROUT,HDNG2 ;Print column 2 heading
G2: DOSCALL @STROUT,CRLF ;Start a new line
RET
PRTHDNG ENDP
SUBTTL PRINT DETAIL LINES
PAGE
PRTDRVR PROC NEAR ;Driver routine
MOV BX,C1LNK
OR BX,BX ;more to print?
JZ H2 ; no, return
MOV AX,[BX]
MOV C1LNK,AX
CALL PRTDTL ;print column one
MOV BX,C2LNK
OR BX,BX
JZ H1 ;If no column 2 entry
DOSCALL @STROUT,SPACES-5 ;print 5 spaces
MOV AX,[BX]
MOV C2LNK,AX
CALL PRTDTL ;print column two
H1: DOSCALL @STROUT,CRLF
CMP PSEFLG,0 ;Check for pause option
JZ PRTDRVR ;Nope, continue
DEC LINCNT ;Decrement line counter
JNZ PRTDRVR ;If page not full?
MOV LINCNT,LPERSCR-2 ;Reset to # lines/screen
DOSCALL @STROUT,PSEMSG ;Display pause message.
MOV AL,@KEYIN ;Specify input function
DOSCALL @CKEYIN ;Wait for key press
DOSCALL @STROUT,CRLF ;Set to new line
JMP PRTDRVR ;Go do the next line
H2: RET
PRTDRVR ENDP
PRTDTL PROC NEAR ;Prints file.ext, size, date & time
MOV CX,1+SIZE NAM+SIZE EXT
SUB DI,DI ;DI <- 0
I1: DOSCALL @CHROUT,[BX+DI].NAM
INC DI ;point to next char.
LOOP I1 ;go do next char.
PUSH BX ;save entry base
MOV SI,[BX].SZL ;SI <- low size
MOV DI,[BX].SZH ;DI <- high size
CALL PRINTDD ;Print size
POP BX ;restore entry base
DOSCALL @STROUT,SPACES-2 ;print 2 spaces
MOV AX,[BX].DTE ;AX <- packed date
CALL PRTDTE
DOSCALL @STROUT,SPACES-2 ;print 2 spaces
MOV AX,[BX].TME ;AX <- packed time
CALL PRTTME
RET
PRTDTL ENDP
SUBTTL PRINTDD - PRINT A DOUBLE WORD IN DI:SI
PAGE
PRINTDD PROC NEAR ;Prints a 32 bit integer in DI:SI
XOR AX,AX ;Zero out the
MOV BX,AX ; working
MOV BP,AX ; registers.
MOV CX,32 ;# bits of precision
J1: SHL SI,1
RCL DI,1
XCHG BP,AX
CALL J6
XCHG BP,AX
XCHG BX,AX
CALL J6
XCHG BX,AX
ADC AL,0
LOOP J1
MOV CX,1710H ;5904 ?
MOV AX,BX
CALL J2
MOV AX,BP
J2: PUSH AX
MOV DL,AH
CALL J3
POP DX
J3: MOV DH,DL
SHR DL,1 ;Move high
SHR DL,1 ; nibble to
SHR DL,1 ; the low
SHR DL,1 ; position.
CALL J4
MOV DL,DH
J4: AND DL,0FH ;Mask low nibble
JZ J5 ;If not zero
MOV CL,0
J5: DEC CH
AND CL,CH
OR DL,'0' ;Fold in ASCII zero
SUB DL,CL
DOSCALL @CHROUT ;Print next digit
RET ;Exit to caller
PRINTDD ENDP
J6 PROC NEAR
ADC AL,AL
DAA
XCHG AL,AH
ADC AL,AL
DAA
XCHG AL,AH
RET
J6 ENDP
SUBTTL PRINT DATE, TIME & # FILES ROUTINES
PAGE
PRTDTE PROC NEAR ;Print packed date in AX as MM/DD/YY
OR AX,AX
JNZ K1 ;If date <> 0
DOSCALL @STROUT,SPACES-8 ;Print 8 spaces
RET
K1: PUSH AX
AND AX,MASK P_MO ;Mask the month,
MOV CL,P_MO ; set shift count,
SHR AX,CL ; right justify, &
CALL PRTBCD ; print it.
DOSCALL @CHROUT,'/'
POP AX
PUSH AX
AND AX,MASK P_DY ;Mask the day &
CALL PRTBCD ; print it.
DOSCALL @CHROUT,'/'
POP AX
AND AX,MASK P_YR ;Mask the year,
MOV CL,P_YR ; set shift count,
SHR AX,CL ; right justify,
ADD AX,80 ; add in year bias, &
; print it.
PRTBCD: AAM ;Convert AL to BCD
OR AX,'00' ;Convert to ASCII
PUSH AX
DOSCALL @CHROUT,AH ;High order digit
POP AX
DOSCALL @CHROUT,AL ;Low order digit
RET
PRTDTE ENDP
PRTTME PROC NEAR ;Print packed time in AX as HH:MM
OR AX,AX
JNZ L1
DOSCALL @STROUT,SPACES-5 ;Print 5 spaces
RET
L1: PUSH AX
AND AX,MASK P_HR ;Mask the hours,
MOV CL,P_HR ; set shift count,
SHR AX,CL ; right justify, &
CALL PRTBCD ; print it.
DOSCALL @CHROUT,':'
POP AX
AND AX,MASK P_MI ;Mask the minutes,
MOV CL,P_MI ; set shift count,
SHR AX,CL ; right justify, &
CALL PRTBCD ; print it.
RET
PRTTME ENDP
PRTNFLS PROC NEAR ;print number of files
MOV SI,NBRFILS ;get # of files
DEC SI ;-1 for free space
XOR DI,DI ;zero high order
CALL PRINTDD ;Print # of files
DOSCALL @STROUT,HDNG3
RET
PRTNFLS ENDP
EVEN
DIRBUF DIRNTRY <> ;Buffer for directory entr
;
;
;SOMETHING IS MISSING AFTER THIS!!
; I'VE FILLED IN THE TWO STATEMENTS BELOW.
;THERE MAY STILL BE BUGS.
;
;
SDIR ENDS
END MAIN
1 ' This program was uploaded to the Capital PC Users Group Software Exchange
2 ' Host system by Alex Hobbs of Raleigh NC on 11-12-82 at 17:20
50 KEY OFF
1000 GOTO 5000
1010 C$=INKEY$:IF C$="" THEN GOTO 1010
1020 C=ASC(RIGHT$(C$,1)):IF LEN(C$)=1 AND (C<48 OR C>57) AND C <> 32 AND C <> 13 THEN GOTO 1010
1030 RETURN
1040 GET (CX-10,CY-8)-(CX+10,CY+8),UCUR:PUT(CX-10,CY-8),CUR,>=:RETURN
1050 PUT (CX-10,CY-8),UCUR,PSET:ECOL=POINT(CX,CY):RETURN
1060 GOSUB 1050:T=C-71
1070 CX=CX+RX*DX(T)
1080 IF CX<10 THEN CX=10:BEEP ELSE IF CX>299 THEN CX=299:BEEP
1090 CY=CY+RY*DY(T)
1100 IF CY<8 THEN CY=8:BEEP ELSE IF CY>183 THEN CY=183:BEEP
1110 ON SKETCH GOTO 1345, 1390,1355, 1365, 1415, 1375, 1040, 1040, 1480, 1040
1120 T=C-48:IF T=0 THEN RX=PIC(0)/2:RY=PIC(1):RETURN
1130 RX=(8*(T)-4)/3:RY=2*(T)-1:RETURN
1140 COLOR BACK:GOSUB 1010:IF C<>32 THEN RETURN 5020
1150 BACK=BACK+1:IF BACK>15 THEN BACK=0
1160 GOTO 1140
1170 GET (124,90)-(195,107),HOLD
1180 COLOR,PAL
1190 LINE (124,90)-(147,107),1,BF:LINE(148,90)-(171,107),2,BF:LINE(172,90)-(195,107),3,BF
1200 GOSUB 1010:IF C<>32 THEN PUT (124,90),HOLD,PSET:RETURN 5020
1210 PAL=1-PAL:GOTO 1180
1220 GET (124,90)-(195,107),HOLD
1230 LINE (124,90)-(195,107),COL,BF
1240 GOSUB 1010:IF C<>32 THEN PUT (124,90),HOLD,PSET:RETURN 5020
1250 COL=COL+1:IF COL>3 THEN COL=0
1260 GOTO 1230
1270 GET (124,90)-(195,107),PIC
1280 LINE(124,90)-(195,107),BND,BF
1290 GOSUB 1010:IF C<>32 THEN PUT (124,90),PIC,PSET:RETURN 5020
1300 BND=BND+1:IF BND>3 THEN BND=0
1310 GOTO 1280
1320 COL=BND:RETURN
1330 ON C-58 GOTO 1340, 1380,1350,1362,1410,1370,1220,1270,1470,1560
1340 GOSUB 1050
1345 LX=CX:LY=CY:PSET(CX,CY),BND:GOSUB 1040:RETURN
1350 GOSUB 1050
1355 LINE (LX,LY)-(CX,CY),BND:GOSUB 1040
1360 OX=LX:OY=LY:LX=CX:LY=CY:RETURN
1362 GOSUB 1050
1365 LINE (LX,LY)-(CX,CY),BND:GOTO 1040
1370 GOSUB 1050
1375 LINE (LX,LY)-(CX,CY),BND,B:GOSUB 1040:RETURN
1380 GOSUB 1050
1390 TX=ABS(CX-LX):TY=6*ABS(CY-LY)/5:CIRCLE(LX,LY),SQR(TX*TX+TY*TY),BND:GOTO 1040
1410 GOSUB 1050
1415 PAINT (CX,CY),COL,BND:GOSUB 1040:RETURN
1430 ON C-103 GOTO 1670,1630,8000,1820,1440,1440,1140,1170,1570,1850
1440 BEEP:RETURN
1470 GOSUB 1050
1480 IF CX+PIC(0)/2>320 THEN BEEP:GOTO 1040
1490 TY=PIC(1):IF CY+PIC(1)>200 THEN PIC(1)=200-CY
1500 ON PMODE GOSUB 1520,1530,1540,1550
1510 PIC(1)=TY:GOTO 1040
1520 PUT(CX,CY),PIC,PSET:RETURN
1530 PUT(CX,CY),PIC,>=:RETURN
1540 PUT(CX,CY),PIC,OR:RETURN
1550 PUT(CX,CY),PIC,AND:RETURN
1560 GOSUB 1050:GET(LX,LY)-(CX,CY),PIC:GOSUB 1040:RETURN
1570 GET(124,90)-(195,107),HOLD
1580 T$="PSETXOR OR AND "
1590 LOCATE 13,19:PRINT " ";MID$(T$,4*PMODE-3,4);" ";
1600 GOSUB 1010:IF C<>32 THEN PUT (124,90),HOLD,PSET:RETURN 5020
1610 PMODE=PMODE+1:IF PMODE>4 THEN PMODE=1
1620 GOTO 1590
1621 SKETCH=C-83:RETURN
1630 TYPE$="loaded":GOSUB 1710
1640 IF NAMEF$="" THEN RETURN
1650 DEF SEG=&HB800:BLOAD DRIVE$+":"+NAMEF$+".PIC",0
1660 GOTO 1040
1670 TYPE$="saved":GOSUB 1710
1680 IF NAMEF$="" THEN RETURN ELSE ON ERROR GOTO 1700
1690 GOSUB 1050:DEF SEG=&HB800:BSAVE DRIVE$+":"+NAMEF$+".PIC",0,&H4000:GOTO 1040
1700 LOCATE 1,1:PRINT "Unable to save picture ";:GOSUB 1010:PUT(0,0),HOLD,PSET:GOSUB 1040:RETURN 5020
1710 GET (0,0)-(319,7),HOLD
1720 LOCATE 1,1:PRINT SPACE$(39);:LOCATE 1,1
1730 PRINT"name of picture to be ";TYPE$;
1740 LINE INPUT": ";NAMEF$
1750 IF NAMEF$="" GOTO 1810
1760 NAMEF$=LEFT$(NAMEF$,8)
1770 LOCATE 1,1:PRINT SPACE$(39);:LOCATE 1,1
1780 LINE INPUT;" Drive picture is on (default=A): ";DRIVE$
1790 IF DRIVE$="" THEN DRIVE$="A"
1800 IF DRIVE$="a" OR DRIVE$="A" OR DRIVE$="B" OR DRIVE$="b" OR DRIVE$="D" OR DRIVE$= "d" GOTO 1810 ELSE GOTO 1770
1810 PUT (0,0),HOLD,PSET:RETURN
1820 GET (0,0)-(319,31),HOLD:GOSUB 1770
1825 ON ERROR GOTO 1835
1830 LOCATE 1,1:FILES DRIVE$+":*.PIC":GOTO 1840
1835 LOCATE 1,1:PRINT "Picture not found ";
1840 GOSUB 1010:PUT(0,0),HOLD,PSET:RETURN 5020
1850 GOSUB 1050:LOCATE (CY+4)/8,(CX+4)/8:LINE INPUT "";T$:GOTO 1040
2000 ON C-93 GOTO 2100,2200,2300,2400,1440,2500,1440,2600,1440,2700
2100 T=BND:BND=ECOL:GOSUB 1340:BND=T:RETURN
2200 T=BND:BND=ECOL:GOSUB 1380:BND=T:RETURN
2300 T=BND:BND=ECOL:LX=OX:LY=OY:GOSUB 1362:BND=T:RETURN
2400 T=BND:BND=ECOL:GOSUB 1362:BND=T:RETURN
2500 T=BND:BND=ECOL:GOSUB 1370:BND=T:RETURN
2600 GOSUB 1050:LINE (LX,LY)-(CX,CY),COL,BF:GOSUB 1040:RETURN
2700 CLS:GOSUB 1040:RETURN
5000 GOSUB 5070
5010 GOSUB 1010
5020 IF C>=48 AND C<=57 THEN GOSUB 1120
5030 IF C>=59 AND C<=68 THEN GOSUB 1330
5040 IF C>=71 AND C<=81 THEN GOSUB 1060
5045 IF C>=84 AND C<=93 THEN GOSUB 1621
5047 IF C>=94 AND C<=103 THEN GOSUB 2000
5050 IF C>=104 AND C<=113 THEN GOSUB 1430
5060 GOTO 5010
5070 DEFINT A-Z
5080 DIM HLPD(8001),PIC(8001),CUR(52),UCUR(52),DX(10),DY(10),HOLD(1281)
5100 BACK=0:PAL=1:COL=3:BND=3:PMODE=2:SKETCH=10
5105 GOSUB 6000
5110 KEY OFF:SCREEN 1,0:COLOR BACK,PAL
5130 CLS:GET (0,0)-(0,0),PIC
5140 LINE (0,8)-(6,8):LINE(14,8)-(20,8)
5150 LINE(10,0)-(10,4):LINE(10,12)-(10,16)
5160 GET (0,0)-(20,16),CUR
5180 CLS:CX=159:CY=99:GOSUB 1040:GOSUB 1340:C=57:GOSUB 1120
5190 DATA -1,-1,0,-1,1,-1,0,0,-1,0,0,0,1,0,0,0,-1,1,0,1,1,1
5200 FOR I=0 TO 10:READ DX(I),DY(I):NEXT
5210 FOR I=1 TO 10:KEY I,"":NEXT
5220 RETURN
6000 CLS:PRINT " TABLET"
6001 PRINT
6002 PRINT
6003 PRINT "This program can be used with the IBM Color Graphics Adapter"
6004 PRINT "and Advanced Basic, to produce picture (.PIC) files, in color"
6005 PRINT
6006 PRINT "To get instructions, press ALT-F3 any time"
6007 LOCATE 25,1:PRINT "(Press any key) to start the program";
6008 GOTO 1010
7000 CLS:WIDTH 80:PRINT " TABLET: INSTRUCTIONS:":PRINT:PRINT"- Use numeric keypad to move graphics cursor."
7001 PRINT :PRINT"- Press number to set distance of cursor move."
7002 PRINT :PRINT "- Use 'F' Keys to perform graphics functions."
7003 PRINT
7004 PRINT:PRINT " F KEYS MAY BE USED IN 4 MODES:":PRINT
7005 PRINT " - Alone: perform basic graphics functions."
7006 PRINT " - Shift: causes basic function to perform each"
7007 PRINT " time cursor is moved."
7008 PRINT " - Ctrl : same as basic function, but erase."
7009 PRINT " - Alt : perform over-all screen and system"
7010 PRINT " functions."
7020 LOCATE 25,1:PRINT "press any key to see next page.";
7021 C$=INKEY$:IF C$="" THEN 7021
7030 CLS:PRINT " TABLET: ";
7031 PRINT " BASIC GRAPHICS FUNCTIONS: (F key functions)"
7033 PRINT:PRINT " 1 POINT - etches a point and sets the reference point"
7034 PRINT " 2 CIRCLE - draws a circle around the reference point"
7035 PRINT " 3 CONNECT - draws a line to reference point,"
7036 PRINT " and resets the reference point."
7037 PRINT " 4 LINE - draws a line to reference point."
7038 PRINT " 5 PAINT - paints the area at cursor with color"
7039 PRINT " defined in F7. Boundaries of paint "
7040 PRINT " are defined by the color from F8."
7041 PRINT " 6 BOX - draws a box from reference point corner"
7042 PRINT " to cursor point corner."
7043 PRINT " 7 PCOLOR - color to use for paint in F5."
7044 PRINT " 8 LCOLOR - color of lines and points drawn."
7045 PRINT " Also, color of boundary for F5."
7046 PRINT " 9 FIGURE - Place copy from F10 in space whose"
7047 PRINT " upper left corner is cursor position."
7048 PRINT " 10 COPY - Take a copy of screen portion whose "
7049 PRINT " upper left corner is reference point"
7050 PRINT " and lower left corner is cursor point."
7051 PRINT " This copy may be placed anywhere on "
7052 PRINT " screen with F9."
7053 LOCATE 25,1:PRINT "press any key to see next page...";
7054 C$=INKEY$:IF C$="" THEN 7054
7060 CLS:PRINT " TABLET: SCREEN AND SYSTEM FUNCTIONS: (ALT Fkeys)"
7061 PRINT:PRINT " 1 SAVE - saves the screen on disk (.PIC file)"
7062 PRINT:PRINT " 2 LOAD - loads a .PIC file from disk to screen."
7063 PRINT:PRINT " 3 HELP - displays this explanation"
7064 PRINT:PRINT " 4 FILES- displays all .PIC file names on a given disk."
7065 PRINT:PRINT " 7 BACKGRND- select screen background color"
7066 PRINT:PRINT " 8 PALETTE - select color choice."
7067 PRINT:PRINT " 9 PMODE - select action to use with 'PUT' for F9"
7068 PRINT " (see page 4-200 of BASIC manual)."
7069 PRINT:PRINT " 10 TEXT - print text on screen in color from F8"
7070 PRINT:PRINT:PRINT"(For 7,8, and 9 - present setting is displayed"
7071 PRINT " on screen. Roll past choices by pressing "
7072 PRINT " space bar, then ENTER to set new choice.)"
7079 LOCATE 25,1:PRINT "press any key to go back to graphics...";
7080 C$=INKEY$:IF C$="" THEN 7080
7090 CLS:SCREEN 1,0:COLOR BACK,PAL
7100 PUT (0,0),HLPD:RETURN
8000 GET (0,0)-(319,199),HLPD
8001 GOTO 7000
0 '************************************************************
1 '* *
2 '* Author: Mike J. Sullivan , Houston, Tx. *
3 '* 12402 Campos Dr. ,Houston, Tx. 77065 *
4 '* Date: 09/05/82 *
5 '* Purpose: Display your Basic Programs *
6 '* Title: Digital Clock *
7 '* Comment(s): enjoy *
8 '* *
9 '************************************************************
10 KEY OFF
11 ODD = 0
12 Q15$ = "MbMLP14O4EO4CDO3G"
13 Q30$ = "MbMLP14O3GO4DEC"
15 CHIME = 0
20 LOCATE ,,0
21 '
22 ' Day of week / Date rollover for Mike Sullivan's digital clock
23 ' This code was merged into the original program already..
24 ' Day of week will be displayed;
25 ' day and date will change following 23:59:59.
26 ' You can also use the perpetual calendar routine in other programs.
27 ' Clayton Gaskill, Charlotte, NC
28 ' BASICA required!!!!!!!!!!
30 CLS
31 ' Tick and Tock for Mike Sullivan's Digital Clock. This merge was placed
32 ' into his clock to add tick,tock and Big Ben's chimes
33 ' Willis Frick, 8359 Amber Rose Lane, Rosemead, Ca. 91770,213 572 2738
35 ' The tick, tock and chimes will work with/without Clayton Gaskill
36 ' I have added all the enhancements to sullivans clock from these sources
37 ' Rich Schinnell Capital PC Software Exchange, 1982 November 21
40 LOCATE 2,19:PRINT "M I K E S U L L I V A N ' S --- I B M ---"
50 LOCATE 4,19:PRINT " DIGITAL CLOCK 1 . 1 0 "
60 GOSUB 4060
240 DIM ONE$(7),TWO$(7),THR$(7),FOU$(7),FIV$(7)
250 DIM SIX$(7),SEV$(7),EIG$(7),NIN$(7),ZER$(7),TEMP$(7)
260 XH1=0.1:XH2=0.1:XM1=0.1:XM2=0.2:XS1=0.1:XS2=0.1
270 COL$(1)=" "
280 COL$(2)=" "
290 COL$(3)=STRING$(2,CHR$(219))
300 COL$(4)=" "
310 COL$(5)=STRING$(2,CHR$(219))
320 COL$(6)=" "
330 COL$(7)=" "
340 ONE$(1)=" "+STRING$(3,CHR$(219))+" "
350 ONE$(2)=" "+CHR$(219)+CHR$(219)+" "
360 ONE$(3)=" "+CHR$(219)+CHR$(219)+" "
370 ONE$(4)=" "+CHR$(219)+CHR$(219)+" "
380 ONE$(5)=" "+CHR$(219)+CHR$(219)+" "
390 ONE$(6)=" "+CHR$(219)+CHR$(219)+" "
400 ONE$(7)=" "+STRING$(6,CHR$(219))+" "
410 TWO$(1)=STRING$(8,CHR$(219))
420 TWO$(2)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
430 TWO$(3)=" "+CHR$(219)+CHR$(219)
440 TWO$(4)=STRING$(8,CHR$(219))
450 TWO$(6)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
460 TWO$(5)=CHR$(219)+CHR$(219)+" "
470 TWO$(7)=STRING$(8,CHR$(219))
480 THR$(1)=STRING$(8,CHR$(219))
490 THR$(2)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
500 THR$(3)=" "+CHR$(219)+CHR$(219)
510 THR$(4)=STRING$(8,CHR$(219))
520 THR$(5)=" "+CHR$(219)+CHR$(219)
530 THR$(6)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
540 THR$(7)=STRING$(8,CHR$(219))
550 FOU$(1)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
560 FOU$(2)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
570 FOU$(3)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
580 FOU$(4)=STRING$(8,CHR$(219))
590 FOU$(6)=" "+CHR$(219)+CHR$(219)
600 FOU$(5)=" "+CHR$(219)+CHR$(219)
610 FOU$(7)=" "+CHR$(219)+CHR$(219)
620 FIV$(1)=STRING$(8,CHR$(219))
630 FIV$(2)=CHR$(219)+CHR$(219)+" "
640 FIV$(3)=CHR$(219)+CHR$(219)+" "
650 FIV$(4)=STRING$(8,CHR$(219))
660 FIV$(6)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
670 FIV$(5)=" "+CHR$(219)+CHR$(219)
680 FIV$(7)=STRING$(8,CHR$(219))
690 SIX$(1)=STRING$(8,CHR$(219))
700 SIX$(2)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
710 SIX$(3)=CHR$(219)+CHR$(219)+" "
720 SIX$(4)=STRING$(8,CHR$(219))
730 SIX$(6)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
740 SIX$(5)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
750 SIX$(7)=STRING$(8,CHR$(219))
760 SEV$(1)=STRING$(8,CHR$(219))
770 SEV$(2)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
780 SEV$(3)=" "+CHR$(219)+CHR$(219)
790 SEV$(4)=" "+CHR$(219)+CHR$(219)
800 SEV$(5)=" "+CHR$(219)+CHR$(219)
810 SEV$(6)=" "+CHR$(219)+CHR$(219)
820 SEV$(7)=" "+CHR$(219)+CHR$(219)
830 EIG$(1)=STRING$(8,CHR$(219))
840 EIG$(2)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
850 EIG$(3)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
860 EIG$(4)=STRING$(8,CHR$(219))
870 EIG$(5)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
880 EIG$(6)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
890 EIG$(7)=STRING$(8,CHR$(219))
900 NIN$(1)=STRING$(8,CHR$(219))
910 NIN$(2)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
920 NIN$(3)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
930 NIN$(4)=CHR$(219)+STRING$(7,CHR$(219))
940 NIN$(6)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
950 NIN$(5)=" "+CHR$(219)+CHR$(219)
960 NIN$(7)=STRING$(8,CHR$(219))
970 ZER$(1)=STRING$(8,CHR$(219))
980 ZER$(2)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
990 ZER$(3)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
1000 ZER$(4)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
1010 ZER$(5)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
1020 ZER$(6)=CHR$(219)+CHR$(219)+" "+CHR$(219)+CHR$(219)
1030 ZER$(7)=CHR$(219)+STRING$(7,CHR$(219))
1040 H1=VAL(MID$(TIME$,1,1))
1050 H2=VAL(MID$(TIME$,2,1))
1060 M1=VAL(MID$(TIME$,4,1))
1070 M2=VAL(MID$(TIME$,5,1))
1080 S1=VAL(MID$(TIME$,7,1))
1090 S2=VAL(MID$(TIME$,8,1))
1095 XDA$=MID$(DATE$,4,2)
1100 Z$=INKEY$:IF Z$="" THEN 1101 ELSE END
1101 MIN = VAL(MID$(TIME$,4,2))
1102 HOUR = VAL(MID$(TIME$,1,2))
1103 IF HOUR = 0 THEN HOUR = 12
1104 IF CHIME = 1 AND MIN = 0 THEN GOSUB 10090
1105 IF CHIME = 1 AND MIN = 15 THEN GOSUB 10090
1106 IF CHIME = 1 AND MIN = 30 THEN GOSUB 10090
1107 IF CHIME = 1 AND MIN = 45 THEN GOSUB 10090
1108 IF (MIN = 14) OR (MIN = 29) OR (MIN = 44) OR (MIN = 59) OR (MIN = 16) OR (MIN = 31) OR (MIN = 46) OR (MIN = 1) THEN CHIME = 1
1110 IF S2=XS2 THEN 1040
1111 GOSUB 10000
1115 IF DA$<>XDA$ THEN GOSUB 4060
1120 IF H1=0 THEN 1130 ELSE 1170
1130 IF H1=XH1 THEN 1450 ELSE XH1=H1
1140 FOR I=1 TO 7
1150 TEMP$(I)=ZER$(I):NEXT I
1160 GOSUB 3100:GOTO 1450
1170 IF H1=XH1 THEN 1450 ELSE XH1=H1
1180 ON H1 GOTO 1190,1220,1250,1280,1310,1340,1370,1400,1430
1190 FOR I=1 TO 7
1200 TEMP$(I)=ONE$(I):NEXT I:GOSUB 3100
1210 GOTO 1450
1220 FOR I=1 TO 7
1230 TEMP$(I)=TWO$(I):NEXT I:GOSUB 3100
1240 GOTO 1450
1250 FOR I=1 TO 7
1260 TEMP$(I)=THR$(I):NEXT I:GOSUB 3100
1270 GOTO 1450
1280 FOR I=1 TO 7
1290 TEMP$(I)=FOU$(I):NEXT I:GOSUB 3100
1300 GOTO 1450
1310 FOR I=1 TO 7
1320 TEMP$(I)=FIV$(I):NEXT I:GOSUB 3100
1330 GOTO 1450
1340 FOR I=1 TO 7
1350 TEMP$(I)=SIX$(I):NEXT I:GOSUB 3100
1360 GOTO 1450
1370 FOR I=1 TO 7
1380 TEMP$(I)=SEV$(I):NEXT I:GOSUB 3100
1390 GOTO 1450
1400 FOR I=1 TO 7
1410 TEMP$(I)=EIG$(I):NEXT I:GOSUB 3100
1420 GOTO 1450
1430 FOR I=1 TO 7
1440 TEMP$(I)=NIN$(I):NEXT I:GOSUB 3100
1450 IF H2=0 THEN 1460 ELSE 1500
1460 IF H2=XH2 THEN 1790 ELSE XH2=H2
1470 FOR I=1 TO 7
1480 TEMP$(I)=ZER$(I):NEXT I
1490 GOSUB 3140:GOTO 1790
1500 IF H2=XH2 THEN 1790 ELSE XH2=H2
1510 ON H2 GOTO 1520,1550,1580,1610,1640,1670,1700,1730,1760
1520 FOR I=1 TO 7
1530 TEMP$(I)=ONE$(I):NEXT I:GOSUB 3140
1540 GOTO 1790
1550 FOR I=1 TO 7
1560 TEMP$(I)=TWO$(I):NEXT I:GOSUB 3140
1570 GOTO 1790
1580 FOR I=1 TO 7
1590 TEMP$(I)=THR$(I):NEXT I:GOSUB 3140
1600 GOTO 1790
1610 FOR I=1 TO 7
1620 TEMP$(I)=FOU$(I):NEXT I:GOSUB 3140
1630 GOTO 1790
1640 FOR I=1 TO 7
1650 TEMP$(I)=FIV$(I):NEXT I:GOSUB 3140
1660 GOTO 1790
1670 FOR I=1 TO 7
1680 TEMP$(I)=SIX$(I):NEXT I:GOSUB 3140
1690 GOTO 1790
1700 FOR I=1 TO 7
1710 TEMP$(I)=SEV$(I):NEXT I:GOSUB 3140
1720 GOTO 1790
1730 FOR I=1 TO 7
1740 TEMP$(I)=EIG$(I):NEXT I:GOSUB 3140
1750 GOTO 1790
1760 FOR I=1 TO 7
1770 TEMP$(I)=NIN$(I):NEXT I:GOSUB 3140
1780 GOTO 3090
1790 IF M1=0 THEN 1800 ELSE 1840
1800 IF M1=XM1 THEN 2120 ELSE XM1=M1
1810 FOR I=1 TO 7
1820 TEMP$(I)=ZER$(I):NEXT I
1830 GOSUB 3210:GOTO 2120
1840 IF M1=XM1 THEN 2120 ELSE XM1=M1
1850 ON M1 GOTO 1860,1890,1920,1950,1980,2010,2040,2070,2100
1860 FOR I=1 TO 7
1870 TEMP$(I)=ONE$(I):NEXT I:GOSUB 3210
1880 GOTO 2120
1890 FOR I=1 TO 7
1900 TEMP$(I)=TWO$(I):NEXT I:GOSUB 3210
1910 GOTO 2120
1920 FOR I=1 TO 7
1930 TEMP$(I)=THR$(I):NEXT I:GOSUB 3210
1940 GOTO 2120
1950 FOR I=1 TO 7
1960 TEMP$(I)=FOU$(I):NEXT I:GOSUB 3210
1970 GOTO 2120
1980 FOR I=1 TO 7
1990 TEMP$(I)=FIV$(I):NEXT I:GOSUB 3210
2000 GOTO 2120
2010 FOR I=1 TO 7
2020 TEMP$(I)=SIX$(I):NEXT I:GOSUB 3210
2030 GOTO 2120
2040 FOR I=1 TO 7
2050 TEMP$(I)=SEV$(I):NEXT I:GOSUB 3210
2060 GOTO 2120
2070 FOR I=1 TO 7
2080 TEMP$(I)=EIG$(I):NEXT I:GOSUB 3210
2090 GOTO 2120
2100 FOR I=1 TO 7
2110 TEMP$(I)=NIN$(I):NEXT I:GOSUB 3210
2120 IF M2=0 THEN 2130 ELSE 2170
2130 IF M2=XM2 THEN 2450 ELSE XM2=M2
2140 FOR I=1 TO 7
2150 TEMP$(I)=ZER$(I):NEXT I
2160 GOSUB 3250:GOTO 2450
2170 IF M2=XM2 THEN 2450 ELSE XM2=M2
2180 ON M2 GOTO 2190,2220,2250,2280,2310,2340,2370,2400,2430
2190 FOR I=1 TO 7
2200 TEMP$(I)=ONE$(I):NEXT I:GOSUB 3250
2210 GOTO 2450
2220 FOR I=1 TO 7
2230 TEMP$(I)=TWO$(I):NEXT I:GOSUB 3250
2240 GOTO 2450
2250 FOR I=1 TO 7
2260 TEMP$(I)=THR$(I):NEXT I:GOSUB 3250
2270 GOTO 2450
2280 FOR I=1 TO 7
2290 TEMP$(I)=FOU$(I):NEXT I:GOSUB 3250
2300 GOTO 2450
2310 FOR I=1 TO 7
2320 TEMP$(I)=FIV$(I):NEXT I:GOSUB 3250
2330 GOTO 2450
2340 FOR I=1 TO 7
2350 TEMP$(I)=SIX$(I):NEXT I:GOSUB 3250
2360 GOTO 2450
2370 FOR I=1 TO 7
2380 TEMP$(I)=SEV$(I):NEXT I:GOSUB 3250
2390 GOTO 2450
2400 FOR I=1 TO 7
2410 TEMP$(I)=EIG$(I):NEXT I:GOSUB 3250
2420 GOTO 2450
2430 FOR I=1 TO 7
2440 TEMP$(I)=NIN$(I):NEXT I:GOSUB 3250
2450 IF S1=0 THEN 2460 ELSE 2500
2460 IF S1=XS1 THEN 2780 ELSE XS1=S1
2470 FOR I=1 TO 7
2480 TEMP$(I)=ZER$(I):NEXT I
2490 GOSUB 3320:GOTO 2780
2500 IF S1=XS1 THEN 2780 ELSE XS1=S1
2510 ON S1 GOTO 2520,2550,2580,2610,2640,2670,2700,2730,2760
2520 FOR I=1 TO 7
2530 TEMP$(I)=ONE$(I):NEXT I:GOSUB 3320
2540 GOTO 2780
2550 FOR I=1 TO 7
2560 TEMP$(I)=TWO$(I):NEXT I:GOSUB 3320
2570 GOTO 2780
2580 FOR I=1 TO 7
2590 TEMP$(I)=THR$(I):NEXT I:GOSUB 3320
2600 GOTO 2780
2610 FOR I=1 TO 7
2620 TEMP$(I)=FOU$(I):NEXT I:GOSUB 3320
2630 GOTO 2780
2640 FOR I=1 TO 7
2650 TEMP$(I)=FIV$(I):NEXT I:GOSUB 3320
2660 GOTO 2780
2670 FOR I=1 TO 7
2680 TEMP$(I)=SIX$(I):NEXT I:GOSUB 3320
2690 GOTO 2780
2700 FOR I=1 TO 7
2710 TEMP$(I)=SEV$(I):NEXT I:GOSUB 3320
2720 GOTO 2780
2730 FOR I=1 TO 7
2740 TEMP$(I)=EIG$(I):NEXT I:GOSUB 3320
2750 GOTO 2780
2760 FOR I=1 TO 7
2770 TEMP$(I)=NIN$(I):NEXT I:GOSUB 3320
2780 IF S2=0 THEN 2790 ELSE 2820
2790 FOR I=1 TO 7
2800 TEMP$(I)=ZER$(I):NEXT I
2810 GOSUB 3360:GOTO 3090
2820 XS2=S2:ON S2 GOTO 2830,2860,2890,2920,2950,2980,3010,3040,3070
2830 FOR I=1 TO 7
2840 TEMP$(I)=ONE$(I):NEXT I:GOSUB 3360
2850 GOTO 3090
2860 FOR I=1 TO 7
2870 TEMP$(I)=TWO$(I):NEXT I:GOSUB 3360
2880 GOTO 3090
2890 FOR I=1 TO 7
2900 TEMP$(I)=THR$(I):NEXT I:GOSUB 3360
2910 GOTO 3090
2920 FOR I=1 TO 7
2930 TEMP$(I)=FOU$(I):NEXT I:GOSUB 3360
2940 GOTO 3090
2950 FOR I=1 TO 7
2960 TEMP$(I)=FIV$(I):NEXT I:GOSUB 3360
2970 GOTO 3090
2980 FOR I=1 TO 7
2990 TEMP$(I)=SIX$(I):NEXT I:GOSUB 3360
3000 GOTO 3090
3010 FOR I=1 TO 7
3020 TEMP$(I)=SEV$(I):NEXT I:GOSUB 3360
3030 GOTO 3090
3040 FOR I=1 TO 7
3050 TEMP$(I)=EIG$(I):NEXT I:GOSUB 3360
3060 GOTO 3090
3070 FOR I=1 TO 7
3080 TEMP$(I)=NIN$(I):NEXT I:GOSUB 3360
3090 XS2=S2:GOTO 1040
3100 FOR I=1 TO 7
3110 LOCATE 9+I,5:PRINT TEMP$(I)
3120 NEXT I
3130 RETURN
3140 FOR I=1 TO 7
3150 LOCATE 9+I,14:PRINT TEMP$(I)
3160 NEXT I
3170 FOR I=1 TO 7
3180 LOCATE 9+I,26:PRINT COL$(I)
3190 NEXT I
3200 RETURN
3210 FOR I=1 TO 7
3220 LOCATE 9+I,32:PRINT TEMP$(I)
3230 NEXT I
3240 RETURN
3250 FOR I=1 TO 7
3260 LOCATE 9+I,42:PRINT TEMP$(I)
3270 NEXT I
3280 FOR I=1 TO 7
3290 LOCATE 9+I,54:PRINT COL$(I)
3300 NEXT I
3310 RETURN
3320 FOR I=1 TO 7
3330 LOCATE 9+I,60:PRINT TEMP$(I)
3340 NEXT I
3350 RETURN
3360 FOR I=1 TO 7
3370 LOCATE 9+I,70:PRINT TEMP$(I)
3380 NEXT I
3390 RETURN
4060 MO$=MID$(DATE$,1,2)
4070 DA$=MID$(DATE$,4,2)
4080 YR$=MID$(DATE$,9,2)
4081 YR4$=MID$(DATE$,7,4)
4090 MO=VAL(MO$)
4091 YR=VAL(YR$)
4092 YR4=VAL(YR4$)
4100 ON MO GOTO 4110,4120,4130,4140,4150,4160,4170,4180,4190,4200,4210,4220
4110 MO$="JANUARY":GOTO 4230
4120 MO$="FEBRUARY":GOTO 4230
4130 MO$="MARCH":GOTO 4230
4140 MO$="APRIL":GOTO 4230
4150 MO$="MAY":GOTO 4230
4160 MO$="JUNE":GOTO 4230
4170 MO$="JULY":GOTO 4230
4180 MO$="AUGUST":GOTO 4230
4190 MO$="SEPTEMBER":GOTO 4230
4200 MO$="OCTOBER":GOTO 4230
4210 MO$="NOVEMBER":GOTO 4230
4220 MO$="DECEMBER":GOTO 4230
4230 YEAR%=YR4
4233 MONTH%=MO
4235 DAY%=VAL(DA$)
4240 IF MONTH%=1 OR MONTH%=2 THEN 4250 ELSE 4270
4250 YEAR%=YEAR%-1
4260 MONTH%=MONTH%+12
4270 DOW.K%=DAY%+YEAR%+MONTH%*2+YEAR%\4+YEAR%\400+(MONTH%+1)*3\5+2-YEAR%\100
4330 DOW%=DOW.K% MOD 7
4360 IF DOW%=0 OR DOW%=1 THEN DOW%=DOW%+7
4370 DOW%=DOW%-1
4500 ON DOW% GOTO 4510,4520,4530,4540,4550,4560,4570
4510 DOW$="MONDAY":GOTO 4580
4520 DOW$="TUESDAY":GOTO 4580
4530 DOW$="WEDNESDAY":GOTO 4580
4540 DOW$="THURSDAY":GOTO 4580
4550 DOW$="FRIDAY":GOTO 4580
4560 DOW$="SATURDAY":GOTO 4580
4570 DOW$="SUNDAY":GOTO 4580
4580 LOCATE 22,29:PRINT DOW$;", ";MO$;" ";DA$;", ";YR4$;" "
4590 RETURN
10000 IF TICKOFF < 0 THEN TICKOFF = TICKOFF + 1:RETURN
10003 IF ODD = 1 THEN SOUND 2000,1:ODD = 0:RETURN
10010 SOUND 5000,1:ODD = 1:RETURN
10090 CHIME = 0
10095 ODD = 0
10100 IF MIN = 15 THEN PLAY Q15$:TICKOFF = -2:RETURN
10110 IF MIN = 30 THEN PLAY Q15$+Q30$:TICKOFF = -5:RETURN
10120 IF MIN = 45 THEN PLAY Q15$+Q30$+Q15$:TICKOFF = -7:RETURN
10130 IF MIN = 0 THEN PLAY Q15$+Q30$+Q15$+Q30$:TICKOFF = -9 + -1*HOUR
10135 PLAY "mbP2"
10140 FOR II = 1 TO HOUR
10150 PLAY"MBO3CN0"
10160 NEXT II
10170 RETURN
Volume in drive A has no label
Directory of A:\
ADDCRS BAS 858 8-24-82 9:37a
ASCFILTR BAS 1430 8-24-82 9:38a
COLOR COM 128 7-07-83 10:52a
CRC TXT 1545 11-09-84 10:46a
CRCK4 COM 1536 10-21-82 7:54p
DEPREC BAS 11264 11-30-82 10:26p
FILEIO C 235 9-01-82 6:06p
MONO COM 128 7-07-83 10:52a
MUSICBOX BAS 17920 2-01-83 7:26p
REBOOT ASM 384 2-08-83 12:25a
REBOOT COM 19 2-08-83 12:26a
REBOOT EXE 640 8-29-82 1:05a
ROFF DOC 7176 9-01-82 6:02p
ROFF EXE 18688 9-01-82 6:14p
ROFF H 3134 9-01-82 6:10p
ROFF HE 3456 9-01-82 5:05p
ROFF1 C 11192 9-01-82 6:13p
ROFF2 C 9422 9-01-82 5:21p
ROFF3 C 302 9-01-82 5:22p
SDIR ASM 15872 2-14-83 7:41a
SDIR COM 1292 2-14-83 7:38a
TABLET BAS 7424 11-24-82 8:52p
TICCLOCK BAS 11008 11-28-82 9:48a
23 file(s) 125053 bytes
29696 bytes free