IMD 1.16: 1/06/2007 9:58:28 FOGCPM.166 --FOGCPM166DATASCR INCDISPLSCRINCEDITSCR INC4 EXTRACT PAS_FILECARDNOTR !"#$GETCARD INC%HELPSCR INC &'INITVAR INC(INPSCR INC)INPUT INC*+,-INPUTSCRINC.INSTALL PAS/01IOERR INC 23MAINBODYPAS4567MENU PAS%89:;<NEWFILE PAS =>PRINTER PASH?@ABCDEFGPRINTRECINCHREAD0 INCIREADKEY INC JKRETRIEVEPAS=LMNOPQRSSETCARD INCTSORTFILEPAS#UVWXYTEMPLATEPASZUNDELETEPAS [\]^VARIABLEINC _`WRITREC INCaWRTCARD INCbWRTTAG INCcCHOOSE COMhdefghijklmnopCHOOSE DOCqrsCHOOSE PQS4tuvwxyzMAIL COM{|}~MAIL COM-03-00 87 MAIL NOT MAIL PQSL-CPM166 DOCThis is the disk name. SCRPH14 FON:k *8SCRPH16 FONk =SCRPH18 FONkl "^SCRPH20 FON m iSCRPH24 FONzo SCRPH30 FONp ZSCRPH36 FONq =CLAS3 FONS - CLAS4 FONS CLAS5 FONS CLAS7 FON6CLASB3 FON[7 Y Procedure DisplayScr; Begin Clrscr; GotoXY(32,1); Write('FILE CARD DATABASE'); GotoXY(11,2); Write('___________________________________________________________'); GotoXY(11,3); Write('|| ||'); GotoXY(11,4); Write('||-------------------------------------------------------||'); GotoXY(11,5); Write('|| ||'); GotoXY(11,6); Write('|| ||'); GotoXY(11,7); Write('|| ||'); GotoXY(11,8); Write('|| ||'); GotoXY(11,9); Write('|| ||'); GotoXY(11,10); Write('|| ||'); GotoXY(11,11); Write('|| ||'); GotoXY(11,12); Write('|| ||'); GotoXY(11,13); Write('|| ||'); GotoXY(11,14); Write('|| ||'); GotoXY(11,15); Write('|| ||'); GotoXY(11,16); Write('|| ||'); GotoXY(11,17); Write('|| ||'); GotoXY(11,18); Write('|| ||'); GotoXY(11,19); Write('|| ||'); GotoXY(11,20); Write('|| ||'); GotoXY(11,21); Write('-----------------------------------------------------------'); GotoXY(11,22); Write('| | | |'); GotoXY(11,23); Write('-----------------------------------------------------------'); End; AIL PQS `&AINBODYPAS jENU PAS nEWFILE PAS sRINTER PAS u$RINTRECINC ~EAD0 INC EADKEY INC ETRIEVEPAS ETCARD INC ORTFILEPAS EMPLATEPAS ͏ ?x P , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨ xx(ͼ ?}ٽÏ }ց; <(; 7D = |٤g{٣_z٢Wy١Ox٠GD u J }x>uu}ƀ/ƀo; -J }0W-J W,}l˸ͨ 8 ; ` x( -ͨ 8J -ͨ 8,J }l8;*!` ! >u` ` u--- J ,,,-xGg?+2n*8t z~,->uxu{File: DISPLSCR.LIB} Procedure DisplayRec; Begin Gotoxy(55,3); Write('Record# ',FilePointer:4); Gotoxy(13,3); Write(TagArray[1]); Gotoxy(12,22); Write(TagArray[2]); Gotoxy(31,22); Write(TagArray[3]); Gotoxy(50,22); Write(TagArray[4]); For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin Gotoxy((Column+XOffset),(Row+YOffset)); Write(CardArray[Column,Row]); End; End; End;u` ` 77 ` = O nf^VNF!DLT\I!!53!r1!\!> x #-= o˸xO(- }(x>8(C ,C `iM!>u|; |J>| )=|(DMbo˸ͦ88ͦx(0 8> Mx(>-Ͳ{(ay(Ͱͦ \z(>.Ͳ (Ͱ ~ͦ{>EͲ>+|(|Dg>-Ͳ|/ 0:p# ~# +>0w#,-  60#J˸}րogM| .Procedure EditScr; Var Num, Numm, XNum: Integer; Flag1, Flag2, GraphicsFlag: Boolean; Procedure Quit; Begin Flag1 := true; Flag2 := true; End; Procedure CursorUp; Begin Flag2 := true; Y := (Y-1); If Y < 1 then Y := 1; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure CursorDown; Begin Flag2 := true; Y := (Y+1); If Y > MaxRows then Y := MaxRows; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure CarriageReturn; Begin Flag2 := true; Y := (Y+1); X :=1; If Y > MaxRows then Y := 1; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure CursorLeft; Begin Flag2 := true; X := (X-1); If X < 1 then Begin X := MaxColumns; Y := (Y-1); If Y < 1 then Begin X := 1; Y := 1; End; End; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure CursorRight; Begin Flag2 := true; If Y = MaxRows then Begin X := (X+1); If X > MaxColumns then Begin X := MaxColumns; Y := MaxRows; End; End; If Y < MaxRows then Begin X := (X+1); If X > MaxColumns then Begin X := 1; Y := (Y+1); End; End; If X = (MaxColumns-5) then write(chr(7)); Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure LeftEnd; Begin Flag2 := true; X := 1; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure RightEnd; Begin Flag2 := true; X := MaxColumns; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure BeginningOfField; Begin Flag2 := true; X :=1; Y :=1; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure EndOfField; Begin Flag2 := true; X := MaxColumns; Y := MaxRows; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure EraseField; Begin Flag2 := true; For Y := 1 to MaxRows do Begin For X := 1 to MaxColumns do Begin CardArray[X,Y] := (' '); Gotoxy((X+XOffset),(Y+YOffset)); Write(CardArray[X,Y]); End; End; X :=1; Y:= 1; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure InsertCharacter; Var I: Integer; Begin Flag2 := true; For I := MaxColumns downto (X+1) do Begin CardArray[I,Y] := CardArray[(I-1),Y]; Gotoxy((I+XOffset),(Y+YOffset)); Write(CardArray[I,Y]); End; CardArray[X,Y] := (' '); Gotoxy((X+XOffset),(Y+YOffset)); Write(CardArray[X,Y]); Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure DeleteCharacter; Var I: Integer; Begin Flag2 := true; X := (X-1); If X <1 then Begin Write(chr(7)); X := 1; Gotoxy((X+XOffset),(Y+YOffset)); Exit; End; If X < (MaxColumns-1) then Begin For I := X to (MaxColumns-1) do CardArray[I,Y] := CardArray[(I+1),Y]; I := MaxColumns; CardArray[I,Y] := ' '; For I := X to MaxColumns do Begin Gotoxy((I+XOffset),(Y+YOffset)); Write(CardArray[I,Y]); End; End Else Begin I := X; CardArray[I,Y] := CardArray[(I+1),Y]; Gotoxy((I+XOffset),(Y+YOffset)); Write(CardArray[I,Y]); CardArray[MaxColumns,Y] := ' '; Gotoxy((MaxColumns+XOffset),(Y+YOffset)); Write(CardArray[MaxColumns,Y]); End; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure DeleteToEndOfLine; Var I: Integer; Begin Flag2 := true; For I := X to MaxColumns do Begin CardArray[I,Y] := (' '); Gotoxy((I+XOffset),(Y+YOffset)); Write(CardArray[I,Y]); End; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure InsertLine; Var I, R: Integer; Begin Flag2 := true; For R := MaxRows downto (Y+1) do Begin For I := 1 to MaxColumns do Begin CardArray[I,R] := CardArray[I,(R-1)]; Gotoxy((I+XOffset),(R+YOffset)); Write(CardArray[I,R]); End; End; For I := 1 to MaxColumns do Begin CardArray[I,Y] := (' '); Gotoxy((I+XOffset),(Y+YOffset)); Write(CardArray[I,Y]); End; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure DeleteLine; Var I, R: Integer; Begin Flag2 := true; For R := Y to (MaxRows-1) do Begin For I := 1 to MaxColumns do Begin CardArray[I,R] := CardArray[I,(R+1)]; Gotoxy((I+XOffset),(R+YOffset)); Write(CardArray[I,R]); End; End; For I := 1 to MaxColumns do Begin CardArray[I,MaxRows] := ' '; Gotoxy((I+XOffset),(MaxRows+YOffset)); Write(CardArray[I,MaxRows]); End; Gotoxy((X+XOffset),(Y+YOffset)); End; Procedure PrintText; Begin Gotoxy((X+XOffset),(Y+YOffset)); If X < 67 then Begin CardArray[X,Y] := Key; Write(CardArray[X,Y]); End; X := (X+1); If X = (MaxColumns-5) then Write(chr(7)); If X > MaxColumns then X := MaxColumns; Gotoxy((X+XOffset),(Y+YOffset)); End; Begin Flag1 := false; Flag2 := false; X := 1; Y := 1; Gotoxy((X+XOffset),(Y+YOffset)); Repeat Flag2 := false; Repeat Read(Kbd,Key); Numm := ord(Key); Case Numm of 1: LeftEnd; 3: EndOfField; 4: CursorRight; 5: CursorUp; 6: RightEnd; 8: CursorLeft; 9: InsertCharacter; 10: CursorDown; 11: CursorUp; 12: CursorRight; 13: CarriageReturn; 14: InsertLine; 17: DeleteToEndOfLine; 18: BeginningOfField; 19: CursorLeft; 22: Help; 24: CursorDown; 25: DeleteLine; 26: EraseField; 27: Quit; 127: DeleteCharacter; End; If Numm in[31..126] then PrintText; Until Flag2; Until Flag1; End; R͐b!! ŔEnter the number : b!4+b*4Q!a!aE +*4!NEʎ+!*2+)!*2+)^#V!s#r*4!NE+!*0+)!*0+)^#V!s#r!*2+)))))*0+)!s#r*!"ò)c!*:5zy,"2!~*2+)!*2+)^#Vs#r!*2+))))!2*2+)))) *2# ,!!Ŕ& Here are the weights of the values : ͐bR͐b*:ͩ(R͐bR͐bŔ$ Press any key to continue.Program EXTRACT; Type XKeyrec = Record XTagArray: Array[1..4] of String[40]; XUsed: Boolean; End; XCardrec = Record XCardArray: Array[1..55,1..16] of Char; End; Const MaxColumns: Integer = 55; MaxRows: Integer = 16; MaxKeys: Integer = 4; PrimaryKeyLen: Integer = 40; SecondaryKeyLen: Integer = 18; XOffset: Integer = 12; YOffset: Integer = 4; Var Disk: File; Disk1: File of XKeyrec; Disk3: File of XKeyrec; Disk2: File of XCardrec; Disk4: File of XCardrec; Keyrec: XKeyrec; Cardrec: XCardrec; TagArray: Array[1..4] of String[40]; CardArray: Array[1..55,1..16] of Char; Drive: String[2]; Filename: String[10]; Temp: String[80]; X, Y, Row, Column, Error, Keypointer, DFilePointer, DFileEndPointer, FileEndPointer, FilePointer: Integer; Key: Char; PrintInit, ExitFlag, Used: Boolean; Procedure Help; Forward; Procedure IOError; Var Disk: File; Num: Integer; IOErr: Boolean; Key: Char; Begin Num := 0; IOErr := false; Num := IOresult; IOErr := (Num <> 0); If IOErr then Begin Write(chr(7)); Clrscr; Gotoxy(20,12); Case Num of $01: Write('File does not exist'); $02: Write('File not open for input'); $03: Write('File not open for output'); $04: Write('File not open'); $05: Write('Can''t read from this file'); $06: Write('Can''t write to this file'); $10: Write('Error in numeric format'); $20: Write('Operation not allowed on a logical device'); $21: Write('Not allowed in the direct mode'); $22: Write('Assign to standard files not allowed'); $90: Write('Record length mismatch'); $91: Write('Seek beyond end of file'); $99: Write('Unexpected end of file'); $F0: Write('Disk write error'); $F1: Write('Directory is full'); $F2: Write('File size overflow'); $FF: Write('File dissappeared!'); Else Write('Unknown I/O Error: ',Num:3); End; Gotoxy(20,14); Write('Type any key to continue... '); Read(Kbd,Key); Clrscr; Halt; End; End; Procedure Screen; Begin Clrscr; GotoXY(30,1); Write('FILE CARD DATABASE 4.6'); GotoXY(28,3); Write('Record Extraction Program'); GotoXY(1,4); Write('--------------------------------------------------------------------------------'); GotoXY(6,6); Write('This program EXTRACTs records from one database, deleting them from the'); GotoXY(1,7); Write('original, and puts them into another. It allows you to free up space in one'); GotoXY(1,8); Write('database without losing your valuble data. EXTRACT.COM must be on the diskette'); GotoXY(1,9); Write('you are copying TO, and it must be run from the CURRENTLY LOGGED DRIVE.'); GotoXY(6,11); Write('You will then be asked for the drive which contains the data files you are'); GotoXY(1,12); Write('copying FROM. Enter A:, B:, or whatever drive is appropriate.'); GotoXY(6,14); Write('You then enter ONE, or TWO key words to search on, from the original file.'); GotoXY(1,15); Write('The program will extract the records which match the search pattern.'); GotoXY(6,17); Write('If the database you are copying TO does not exist, it will be created anew.'); GotoXY(1,18); Write('If it already exists, the records will be ADDED to the existing file. This way,'); GotoXY(1,19); Write('you can make several passes through the old file, adding each pass to the new'); GotoXY(1,20); Write('file.'); GotoXY(1,22); Write('Enter the drive containing the old files: __'); End; Procedure GetDrive; Var Done: Boolean; Begin Done := false; Repeat Gotoxy(43,22); Read(Drive); If (length(Drive) = 2) AND (Drive[2] = ':') then Begin Done := true; End Else Begin Write(chr(7)); Gotoxy(52,22); Write('Bad Drive designator! '); Read(Kbd,Key); Gotoxy(43,22); Write('__'); ClrEOL; End; Until Done; Drive[1] := upcase(Drive[1]); Gotoxy(43,22); Write(Drive); Gotoxy(1,24); Write('Now, enter an asterisk to continue...any other key to abort: '); Read(Kbd,Key); If Key <> '*' then Begin Clrscr; Halt; End; Clrscr; End; Procedure GetCardRecord; Begin {$I-} Seek(Disk2,FilePointer); IOError; With Cardrec do Begin Read(Disk2,Cardrec); IOError; For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin CardArray[Column,Row] := XCardArray[Column,Row]; End; End; End; {$I+} End; Procedure SearchFiles; Var FirstArray, SecondArray: Array[1..4] of String[40]; FirstKey, SecondKey, XCopies: String[40]; Count, Copies, Code, FirstLen, SecondLen: Integer; HaltPrinter, KeyEntered, FirstFound, SecondFound: Boolean; Procedure WriteRecord; Begin {$I-} Gotoxy(1,24); Write('Copying from Old Record# ',FilePointer:4,' '); Write('to New Record# ',DFilePointer:4); Seek(Disk3,DFilePointer); IOError; With Keyrec do Begin Write(Disk3,Keyrec); IOError; End; Seek(Disk4,DFilePointer); IOError; With Cardrec do Begin Write(Disk4,Cardrec); IOError; End; Used := false; For Row := 1 to MaxKeys do Begin Temp := ''; For Column := 1 to MaxColumns do Begin Temp[Column] := ' ';  End; TagArray[Row] := Temp; End; For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin CardArray[Column,Row] := ' '; End; End; Seek(Disk1,FilePointer); IOError; With Keyrec do Begin For Row := 1 to MaxKeys do Begin XTagArray[Row] := TagArray[Row]; End; XUsed := Used; Write(Disk1,Keyrec); IOError; End; Seek(Disk2,FilePointer); IOError; With Cardrec do Begin For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin XCardArray[Column,Row] := CardArray[Column,Row]; End; End; Write(Disk2,Cardrec); IOError; End; DFilePointer := (DFilePointer + 1); {$I+} If DFilePointer > 250 then Begin Clrscr; Writeln('This database is full. Try EXTRACTing to another.'); Halt; End; End; Procedure GetKeyWord; Var Temp: String[40]; I: Integer; Begin KeyEntered := true; Copies := 1; Clrscr; Writeln; Writeln('Enter first key word for search'); Writeln; Write('#1: '); Read(Temp); For I := 1 to length(Temp) do Temp[I] := upcase(Temp[I]); FirstLen := length(Temp); FirstKey := Temp; Writeln; Writeln; Writeln('Enter second key word for search ( to ignore )'); Writeln; Write('#2: '); Read(Temp); If Temp <> '' then Begin For I := 1 to length(Temp) do Temp[I] := upcase(Temp[I]); SecondLen := length(Temp); SecondKey := Temp; End Else Begin SecondKey := FirstKey; SecondLen := FirstLen; End; If (length(FirstKey) = 0) AND (length(SecondKey) = 0) then Begin  Clrscr; Writeln('You didn`t enter a key word. Rerun the program, and try again.'); Halt; End; Writeln; Writeln; Writeln('First key: ',FirstKey); Writeln('Second key: ',SecondKey); Writeln; Writeln; Writeln('Searching... '); End; Procedure CheckRecord; Var Count: Integer; Begin FirstFound := false; SecondFound := false; {$I-} Seek(Disk1,FilePointer); IOError; With Keyrec do Begin Read(Disk1,Keyrec); IOError; For Count := 1 to 4 do Begin FirstArray[Count] := XTagArray[Count]; SecondArray[Count] := XTagArray[Count]; TagArray[Count] := XTagArray[Count]; If Count > 1 then TagArray[Count] := copy(TagArray[Count],1,SecondaryKeyLen); FirstArray[Count] := copy(FirstArray[Count],1,FirstLen); SecondArray[Count] := copy(SecondArray[Count],1,SecondLen); If FirstArray[Count] = FirstKey then Begin FirstFound := true; End; End; Used := XUsed; End; If FirstFound then Begin For Count := 1 to 4 do Begin If SecondArray[Count] = SecondKey then SecondFound := true; End; End; End; Begin Repeat GetKeyWord; For FilePointer := 1 to (FileEndPointer-1) do Begin CheckRecord; If Used then Begin If SecondFound then Begin GetCardRecord; WriteRecord; End; End; End; Clrscr; Write(chr(7)); If SecondFound then Begin Writeln; Writeln('That`s All Folks...'); End Else Begin Writeln; Writeln('No such key match found... '); End; Writeln; Writeln('Enter "*" for another search, any other key to exit. '); Read(Kbd,Key); Until Key <> '*'; Clrscr; End; Procedure MakeNewFiles; Begin Assign(Disk3,'KEYLIST'); Rewrite(Disk3); IOError; With Keyrec do Begin For Row := 1 to MaxKeys do XTagArray[Row] := TagArray[Row]; XUsed := Used; Write(Disk3,Keyrec); IOError; End; IOError; Close(Disk3); Assign(Disk4,'CARDFILE'); Rewrite(Disk4); IOError; With Cardrec do Begin For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin XCardArray[Column,Row] := CardArray[Column,Row]; End; End; Write(Disk4,Cardrec); IOError; End; Close(Disk4); IOError; Error := 0; End; Procedure InitFiles; Begin {$I-} Filename := concat(Drive,'KEYLIST'); Assign(Disk1,Filename); Reset(Disk1); IOError; Filename := concat(Drive,'CARDFILE'); Assign(Disk2,Filename); Reset(Disk2); IOError; FileEndPointer := filesize(Disk2); Assign(Disk3,'KEYLIST'); Reset(Disk3); Error := IOResult; Close(Disk3); If Error = 1 then MakeNewFiles; If Error <> 0 then Begin Clrscr; Write('Disk file problems'); Close(Disk1); Close(Disk2); Close(Disk3); Halt; End; Assign(Disk3,'KEYLIST'); Reset(Disk3); IOError; DFileEndPointer := filesize(Disk3); DFilePointer := DFileEndPointer; If DFilePointer > 249 then Begin Clrscr; Writeln('This database is full. Try EXTRACTing to another.'); Halt; End; Assign(Disk4,'CARDFILE'); Reset(Disk4); IOError; {$I+} End; Procedure Help; Begin End; Begin Screen; GetDrive; InitFiles; SearchFiles; Close(Disk1); Close(Disk2); Close(Disk3); Close(Disk4); Clrscr; End. otoxy((Column+XOffset),(Row+YOffset)); Write(CardArray[Column,Row]); End; End; End; FILE CARD DATABASE by Thomas R. Mierau 454 Carver N.W. Massillon, Ohio 44646 Copyright Thomas Mierau January 1985 Object Code Compiled With Turbo-Pascal (tm) Documentation by Rebecca Mierau This READ.ME file accompanied the origional version of the program. It may or may not reflect the the 1986 revision. INTRODUCTION File Card Database (FCD) combines the convenience of a text editor, a data base and hard copy on 4-by-6 file cards. It's perfect for storing recipes, quotes, and notes. The user has the choice of flipping through his file box for a card or retrieving the information from any of four tags (key words or headings) stored in his computer. Want to find Aunt Jane's recipe for tuna noodle? Call up tuna, noodle, casserole or Jane. Want any old casserole? Type in the word, and you have your choice of tuna noodle or goulash. Perhaps you're self-employed, a fix-it person. You want to know when you repaired Mr. Smith's drive but can't remember how you filed the information. You may have filed it under Jones, drive, concrete or patch. With FCD you can file it under all four tags and type any of these to recall the data. from the main menu prints an alphabetized list of key words to the screen or printer. FCD is a free-form data base. Instead of questions with space for 10-character answers, a "file card" is displayed on the screen. There are four lines for your key words and 10 for your text. Each line is 55 characters long. You enter and edit your data with a simple text editor. You'll find many applications for FCD. Because the program is on one disk and your data on another, you can  maintain a separate disk for each project. This allows for maximum storage space. Use and enjoy -- T.R.M. DOCUMENTATION (1.) Using PIP or your favorite file-transfer program, copy the following programs from your master disk to your working disk: (a.) MENU.COM (b.) NEWFILE.CHN (c.) MAINBODY.CHN (d.) RETRIEVE.CHN (e.) SORTFILE.CHN Label this disk, "File Card Database," and insert in the A: drive. (2.) Label a blank, formatted disk with the name of your data, place in the B: drive. (2.a.) Code used in this documentation: ^ = control <> = when typing a command or making an entry, type characters given between brackets. = return = escape (3.) Type to start program. (4.) The following menu should appear on your screen: : Create a new database : Add records to database : Access existing records : Display key words :Quit (5.) To initialize your disk, type option . This erases all previous data and creates a new data base. IMPORTANT If you use this once you have begun to collect data, you will lose your data. (6.) Type to enter new data. On the screen is a replica of a file card. Your cursor is on the first key word. You must work your way through the key words before writing text. It's a good idea to fill in all four key words for quick retrieval. (a.) Type key words (up to 55 characters) (b.) Backspace erases to the left (c.) When the word or phrase is as you want it, type (d.) Type the next word. You cannot back up to the previous key word, but there is an option at the end of editing that allows you to make corrections. (7.) When you have reach ed the rectangular "card," you have 10 lines of 55 characters for your text. You can write anywhere on the "card" that you desire by using the following commands: (a.) Arrow Keys: moves cursor in direction of arrow (b.) ^S: moves cursor left. (c.) ^D: moves cursor right (d.) ^E: moves cursor up (e.) ^X: moves cursor down (f.) ^A: moves cursor to left end of line (g.) ^F: moves cursor to right end of line (h.) ^R: moves cursor to beginning of file card (i.) ^C: moves cursor to end of file card (j.) ^I: or inserts a character (a blank space that moves all text to right one space). This allows you to insert letters and words. (k.) ^N: Insert a line at cursor and move text down one line. Cursor remains in original position. (If you have text on the bottom line of the card, it will be shoved off the "card" and deleted.) (8.) You can delete text by typing over it or using the following commands: (a.) : Deletes character to the left of cursor. Characters to right of cursor move left one space. (b.) ^Q: Deletes from cursor to end of line, leaving a blank line to right of cursor. (c.) ^Y: Deletes entire line, right and left of cursor. Cursor moves to left of line, and all text below moves up one line. A blank line is inserted at the bottom of the "card". (d.) ^Z: Wipe Out! This command erases card. (e.) < >, a blank space followed by , erases a keyword and leaves line blank (9.) When you are done making entries, type . In the lower right corner of the screen is the question, "Correct? (Y/N)" If you wish to correct key words or text type . (a.) Retype the ENTIRE key word that you wish to correct. (b.) Type return at any key word you don't want corrected. (c.) Correct text with commands given above. (10.) When your entries are correct type followed by a in response to "Correct?" (11.) On your screen is the question, "Enter another record? (Y/N)." For now, answer and enter the following exercise: (a.) Enter these four phrases on the four tag lines: File Card Database, Text Editor, Commands, Write (b.) Now on the "card" enter the editing commands listed above. (When printed this will be a handy reference card.) (c.) When all is entered type (d.) If correct, type . (If not follow instructions in item (9.)) (e.) Answer to "Enter another record?" (12.) You should be back at the main menu. We will continue this exercise by demonstrating reediting and printing. (13.) Type . The program will ask that you "Enter keyword for search." Type and your File Card Database card should appear on the screen. (Before continuing, the following facts about option should be noted. You can retrieve a record by typing anything from the first character to every character of a key word(s). The number of characters isn't a factor, nor is upper or lower case. Placing your characters in the right order is. For instance, if you type or or you'll find your record. But if you type or or you'll read the message, "No keyword found.") (14.) You'll note that when your "card" came to the screen this time, your cursor wasn't positioned at the first keyword. (a.) Type <^W> (b.) Move through the keywords by typing until your cursor is in the "card." (c.) To complete your command card, find a space and enter: ^W: write ^P: print : quit (d.) Type and if you are satisfied. (e.) If you have another record with the same keyword, this will be displayed on the screen. Type to return to the main menu. (f.) If you have no other records with the same keyword, you'll read the message, "That's all folks. Type any key to continue." Do so and you'll return to the menu. (15.) A few words about records sharing the same keyword: (a.) Typing any character, except , moves you from record to record. (b.) Typing returns you to the main menu. (16.) To print your FCD command card, type option from the main menu. (a.) Type in one of your four keywords. (b.) If you retrieve another record with the same keyword, type any character until your find "File Ca rd Database." (c.) When you have the correct record, load your printer with paper or a 4-by-6 card. (d.) Type <^P> and your commands will be printed. (e.) You'll either be returned to the main menu or given another record with the same keyword. (17.) If you are unhappy with the positioning of the record on your file card, reposition the card and try again. Margins have been figured into the print program, but where you place the card determines the results. (18.) As mentioned in the introduction, option on the main menu displays a list of keywords. You may have these listed to the screen or printer. When listing to the screen, you may stop and start the printing by typing <^S>. As always, returns you to the main menu, and a final returns you to C.P.M. # If you have any questions or problems, feel free to write. A self-addressed, stamped envelope for return mail is appreciated. T.R.M./R.M. for return mail is appreciated. RINTER PAS u$RINTRECINC ~EAD0 INC EADKEY INC ETRIEVEPAS ETCARD INC ORTFILEPAS EMPLATEPAS  Procedure GetCardRecord; Begin (* {$I-} *) Assign(Disk2,'B:CARDFILE'); Reset(Disk2); IOError; Seek(Disk2,FilePointer); IOError; With Cardrec do Begin Read(Disk2,Cardrec); IOError; For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin CardArray[Column,Row] := XCardArray[Column,Row]; End; End; End; Close(Disk2); IOError; {$I+} End; AIL PQS `&AINBODYPAS jENU PAS nEWFILE PAS sRINTER PAS u$RINTRECINC ~EAD0 INC EADKEY INC ETRIEVEPAS ETCARD INC ORTFILEPAS EMPLATEPAS Procedure Help; Var KKey: Char; Begin Clrscr; GotoXY(32,1); Write('FILE CARD DATABASE'); GotoXY(33,3); Write('Editing Commands'); GotoXY(1,4); Write('--------------------------------------------------------------------------------'); GotoXY(1,5); Write('^S or ^H = Cursor Left * ^Y = Delete Line'); GotoXY(1,7); Write('^D or ^L = Cursor Right * ^Q = Delete to End of Line *'); GotoXY(1,9); Write('^E or ^K = Cursor up * ^Z = Delete Entire Field'); GotoXY(1,11); Write('^X or ^J = Cursor Down ^N = Insert Line'); GotoXY(1,13); Write('^A = Left End of Line ^R = Beginning of field'); GotoXY(1,15); Write('^F = Right End of Line ^C = End of Field'); GotoXY(1,17); Write('^I or = Insert Space at Cursor * = Quit *'); GotoXY(1,19); Write('Items marked with an asterisk (*) are available when entering key words'); GotoXY(1,20); Write('--------------------------------------------------------------------------------'); GotoXY(1,22); Write('Type any key to continue... '); Read(Kbd,KKey); Clrscr; DisplayScr; DisplayRec; Gotoxy((X+XOffset),(Y+YOffset)); End; ETRIEVEPAS ETCARD INC ORTFILEPAS EMPLATEPAS ,1); Write('FILE CARD DATABASE 4.6'); GotoXY(28,3); Write('Record Extraction Program'); GotoXY(1,4); Write('--------------------------------------------------------------------------------'); GotoXY(6,6); Write('This program EXTRACTs records from one database, deleting them from the'); GotoXY(1,7); Write('original, and puts them into another. It allows you to free up space in one'); GotoXY(1,8); Write('database without losing your valuble data. EXTRACT.COM must be Procedure Initvar; Begin Used := false; For Row := 1 to MaxKeys do Begin TagArray[Row] := ''; For Column := 1 to PrimaryKeyLen do Begin TagArray[Row] := concat(TagArray[Row],' '); End; End; For Row := 2 to 4 do TagArray[Row] := copy(TagArray[Row],1,18); For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin CardArray[Column,Row] := ' '; End; End; End;  search pattern.'); GotoXY(6,17); Write('If the database you are copying TO does not exist, it will be created anew.'); GotoXY(1,18); Write('If it already exists, the records will be ADDED to the existing file. This way,'); GotoXY(1,19); Write('you can make several passes through the old file, adding each pass to the new'); GotoXY(1,20); Write('file.'); GotoXY(1,22); Write('Enter the drive containing the old files: __'); End; Procedure GetDrive; Var Done: BProcedure Inputscr; Var Chrnum: Integer; TempKey: String[18]; Quit,Flag1, Flag2: Boolean; Begin DisplayScr; DisplayRec; Gotoxy(16,24); Write(FilePointer:4); Repeat ReadKey; EditScr; Gotoxy(60,24); Write('(^P to print)'); Gotoxy(28,24); Write('Is the above correct? (Y/N) '); Repeat Read(Kbd,Key); Key := upcase(Key); If Key = chr(16) then Begin Gotoxy(60,24); Write('Please wait...'); Write(chr(7)); PrintRecord; end; Until Key in['Y','N']; Write(Key); Delay(100); Gotoxy(28,24); ClrEOL; If Key = 'Y' then Begin Clrscr; End Else Begin Write(chr(7)); End; Until Key = 'Y'; End; olumns do Begin CardArray[Column,Row] := ' '; End; End; End; {File: INPUT.LIB} Procedure Input(PositionPtr, Y, Len: Integer); Var Line: Array[1..80] of Char; I, ArrayPtr, Marker: Integer; Ch: Char; Done: Boolean; Procedure Quit; Begin ExitFlag := true; Done := true; Exit; End; Procedure Left; Begin ArrayPtr := (ArrayPtr-1); If ArrayPtr < 1 THEN Begin ArrayPtr := 1; Write(chr(7)); End Else PositionPtr := (PositionPtr-1); Gotoxy(PositionPtr,Y); End; Procedure Right; Begin If ArrayPtr > (Len+1) then Begin Write(chr(7)); Exit; End; ArrayPtr := (ArrayPtr+1); If ArrayPtr > (Len+1) THEN Begin ArrayPtr := (Len+1); Write(chr(7)); End Else PositionPtr := (PositionPtr+1); If PositionPtr > 80 then Begin Write(chr(7)); ArrayPtr := (ArrayPtr-1); PositionPtr := 80; Write(chr(7)); End;  Gotoxy(PositionPtr,Y); End; Procedure Insert; Begin For I := Len Downto (ArrayPtr+1) do Line[I] := Line[(I-1)]; Line[ArrayPtr] := ' '; Marker := PositionPtr; For I := ArrayPtr to Len do Begin Gotoxy(Marker,Y); Write(Line[I]); Marker := (Marker+1); End; Gotoxy(PositionPtr,Y); End; Procedure Delete; Begin ArrayPtr := (ArrayPtr-1); If ArrayPtr < 1 THEN Begin ArrayPtr := 1; Write(chr(7)); Exit; End Else Begin PositionPtr := (PositionPtr-1); For I := ArrayPtr to (Len-1) do Line[I] := Line[(I+1)]; Line[Len] := ' '; End; Marker := PositionPtr; For I := ArrayPtr to (Len) do Begin Gotoxy(Marker,Y); Write(Line[I]); Marker := (Marker+1); End; Gotoxy(PositionPtr,Y); End; Procedure DeleteToEndOfLine; Begin Marker := PositionPtr; For I := ArrayPtr to (Len) do Begin Line[I] := ' '; Gotoxy(Marker,Y); Write(Line[I]); Marker := (Marker+1); End; Gotoxy(PositionPtr,Y); End; Procedure Copy; Begin If ArrayPtr > Len then Begin Write(chr(7)); Exit; End; If ord(Ch) < 32 then Exit; Line[ArrayPtr] := Ch; Gotoxy(PositionPtr,Y); Write(Line[ArrayPtr]); ArrayPtr := (ArrayPtr+1); If ArrayPtr > (Len+1) THEN Begin ArrayPtr := Len; Write(chr(7)); End Else PositionPtr := (PositionPtr+1); If PositionPtr > 80 then Begin ArrayPtr := (ArrayPtr-1); PositionPtr := 80; Write(chr(7)); End; Gotoxy(PositionPtr,Y); End; Begin Done := false; ArrayPtr := 1; If Len > 80 then Len := 80; For I := 1 to 80 do Line[I] := chr(32); For I := 1 to Length(Temporary) do Line[I] := Temporar y[I]; Repeat Gotoxy(PositionPtr,Y); Read(Kbd,Ch); Case Ch of #4: Right; #8: Left; #9: Insert; #12: Right; #13: Done := true; #17: DeleteToEndOfLine; #19: Left; #27: Quit; #127: Delete Else Copy; End; Until Done; Temporary := ''; For I := 1 to Len do Temporary := (Temporary + Line[I]); End; th Keyrec do Begin Read(Disk1,Keyrec); IOError; For Count := 1 to 4 do Begin FirstArray[Count] := XTagArray[Count]; SecondArray[Count] := XTagArray[Count]; TagArray[Count] := XTagArray[Count]; If Count > 1 then TagArray[Count] := copy(TagArray[Count],1,SecondaryKeyLen); FirstArray[Count] := copy(FirstArray[Count],1,FirstLen); SecondArray[Count] := copy(SecondArray[Count],1,SecondL Procedure Inputscr; Var Chrnum: Integer; TempKey: String[18]; Quit,Flag1, Flag2: Boolean; Begin Repeat ReadKey; EditScr; Gotoxy(60,24); Write('(^P to print)'); Gotoxy(28,24); Write('Is the above correct? (Y/N) '); Repeat Read(Kbd,Key); Key := upcase(Key); If Key = chr(16) then Begin Gotoxy(60,24); Write('Please wait...'); Write(chr(7)); PrintRecord; end; Until Key in['Y','N']; Gotoxy(28,24); ClrEOL; If Key = 'Y' then Begin Clrscr; End Else Begin Write(chr(7)); End; Until Key = 'Y'; End; FNPLOT CAL  FNZPM CAL  GROWTH CAL  iGSA15A20CAL  #Program INSTALL; { Installation Program for FILE CARD DATABASE 4.6 . This program selects the drive where the data files will be found. } Type XInstallRecord = Record XDrive: String[2]; End; Var Disk: File; DDisk: File of XInstallRecord; InstallRecord: XInstallRecord; Drive: String[2]; Key: Char; Procedure Screen; Begin Clrscr; GotoXY(30,1); Write('FILE CARD DATABASE 4.6'); GotoXY(31,3); Write('Installation Program'); GotoXY(1,4); Write('--------------------------------------------------------------------------------'); GotoXY(6,5); Write('Installation is simple. The only consideration is to select the disk drive'); GotoXY(1,6); Write('where the data files KEYLIST and CARDFILE may be found. Some situations may'); GotoXY(1,7); Write('require that the data files and the program set reside on the same disk. Others'); GotoXY(1,8); Write('may be better suited with the program set on one disk, and the data on another.'); GotoXY(1,9); Write('Single sided KAYPRO II computers will definately benefit from putting the data'); GotoXY(1,10); Write('on a diskette by itself.'); GotoXY(6,12); Write('User areas are not considered. The programs run from the logged drive/user'); GotoXY(1,13); Write('area and the data is put on the drive specified by this program. If, on a KAYPRO'); GotoXY(1,14); Write('10, you have the program set on the A7: portion of the hard disk, and you'); GotoXY(1,15); Write('specify the C: (floppy) drive for the data, it will be put onto the floppy disk'); GotoXY(1,16); Write('in user area 7. You must, of course be at the A7> prompt to run the program.'); GotoXY(6,18); Write('Enter below, the drive where you wish to keep the data files. Typical'); GotoXY(1,19); Write('examples would be B: or C: . Be sure to enter the colon! Entering only,'); GotoXY(1,20); Write('puts the data on the logged drive, along with the program set.'); GotoXY(1,22); Write('Enter data drive: __'); End; Procedure Install; Begin Drive := ''; Screen; Gotoxy(19,22); Read(Drive); Gotoxy(1,24); Write('Enter a n asterisk (*) to continue...any other key to abort: '); Read(Kbd,Key); If Key <> '*' then Begin Clrscr; Halt; End; Assign(DDisk,'INSTALL.DAT'); Rewrite(DDisk); With InstallRecord do Begin XDrive := Drive; Write(DDisk,InstallRecord); End; Close(DDisk); Writeln; Writeln; Writeln; Writeln; If Drive = '' then Begin Writeln('Data files will be on the LOGGED DRIVE...'); End Else Begin Writeln('Data files will be on the ',Drive,' DRIVE...'); End; Delay(4000); Clrscr; End; Begin Install; End.ETRIEVEPAS ETCARD INC ORTFILEPAS EMPLATEPAS  {File: IOERR.LIB} Procedure IOError; Var Disk: File; Num: Integer; IOErr: Boolean; Key: Char; Begin Num := 0; IOErr := false; Num := IOresult; IOErr := (Num <> 0); If IOErr then Begin Write(chr(7)); Clrscr; Gotoxy(20,12); Case Num of $01: Write('File does not exist'); $02: Write('File not open for input'); $03: Write('File not open for output'); $04: Write('File not open'); $05: Write('Can''t read from this file'); $06: Write('Can''t write to this file'); $10: Write('Error in numeric format'); $20: Write('Operation not allowed on a logical device'); $21: Write('Not allowed in the direct mode'); $22: Write('Assign to standard files not allowed'); $90: Write('Record length mismatch'); $91: Write('Seek beyond end of file'); $99: Write('Unexpected end of file'); $F0: Write('Disk write error'); $F1: Write('Directory is full'); $F2: Write('File size overflow'); $FF: Write('File dissappeared!'); Else Write('Unknown I/O Error: ',Num:3); End; Gotoxy(20,14); Write('Type any key to continue... '); Read(Kbd,Key); Assign(Disk,'MENU.COM'); Execute(Disk); End; End; ETRIEVEPAS ETCARD INC ORTFILEPAS EMPLATEPAS  insert in the A: drive. (2.) Label a blank, formatted disk with the name of your data, place in the B: drive. (2.a.) Code used in this documentation: ^ = control <> = when typing a command or making an entry, type characters given between brackets. = return = escape (3.) Type to start program. (4.) The following menu should appear on your screen: : Create a new datProgram MAINBODY; {$I VARIABLE.INC} (* Golbal variables for all programs *) {$I IOERR.INC} (* IOError *) {$I INITVAR.INC} (* Initvar *) {$I PRINTREC.INC} (* PrintRecord *) {$I DATASCR.INC} (* Displayscr *) {$I DISPLSCR.INC} (* Displayrec *) {$I INPUT.INC} (* Input(PositinPtr,Y,Len) *) {$I EDITSCR.INC} (* Editscr *) {$I READKEY.INC} (* ReadKey *) {$I HELPSCR.INC} (* Help *) Procedure Screen2; Begin Clrscr; Write(chr(7)); Writeln('DATABASE is FULL. Try deleting some records, or EXTRACTing some records to a'); Writeln('new database to make more room.'); Writeln; Writeln; Write('Type any key to continue... '); Read(Kbd,Key); Clrscr; Close(Disk1); IOError; Close(Disk2); IOError; Assign(Disk,'MENU.COM'); {$I+} Execute(Disk); End; Procedure ReadRecord0; Begin {$I-} Seek(Disk2,0); IOError; With CardRec do Begin Read(Disk2,CardRec); IOError; For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin CardArray[Column,Row] := XCardArray[Column,Row]; End; End; End; {$I+} End; Procedure WriteTagFile; Begin Used := true; {$I-} Seek(Disk1,FilePointer); IOError; With KeyRec do Begin For Row := 1 to MaxKeys do Begin XTagArray[Row] := TagArray[Row]; End; XUsed := Used; Write(Disk1,Keyrec); IOError; End; {$I+} End; Procedure WriteCardFile; Begin {$I-} Seek(Disk2,FilePointer); IOError; With CardRec do Begin For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin XCardArray[Column,Row] := CardArray[Column,Row]; End; End; Write(Disk2,CardRec); IOError; End; {$I+} End; Procedure Addrecords; Var YCardArray: Array[1..55,1..16] of Char; MaxFiles: Integer; Procedure CopyData; Begin For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin YCardArray[Column,Row] := CardArray[Column,Row]; End; End; End; Procedure RetrieveData; Begin For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin CardArray[Column,Row] := YCardArray[Column,Row]; End; End; End; Procedure HandleData; Var Flag, KeyFlag: Boolean; {$I INPUTSCR.INC} Begin Flag := false; Repeat InitVar; RetrieveData; DisplayScr; DisplayRec; Inputscr; WriteTagFile; WriteCardFile; FilePointer := (FilePointer+1); If FilePointer > 250 then Screen2; Clrscr; Write('Enter another record? (Y/N) '); Keyflag := false; Repeat Read(Kbd,Key); Key := upcase(Key); If Key = ('N') then Begin Keyflag := true; Flag := true;  End; If Key = ('Y') then Keyflag := true; Until Keyflag; Until flag; End; Begin PrintInit := false; MaxFiles := 250; ReadRecord0; CopyData; HandleData; Clrscr; Close(Disk1); Close(Disk2); Assign(Disk,'MENU.COM'); Execute(Disk); End; Begin {$I-} Filename := concat(Drive,'KEYLIST'); Assign(Disk1,Filename); Reset(Disk1); IOError; Filename := concat(Drive,'CARDFILE'); Assign(Disk2,Filename); Reset(Disk2); IOError; FileEndPointer := filesize(Disk2); FilePointer := FileEndPointer; If FilePointer > 250 then Screen2; AddRecords; Close(Disk1); IOError; Close(Disk2); IOError; Assign(Disk,'MENU.COM'); IOError; {$I+} Execute(Disk); End. ETRIEVEPAS ETCARD INC ORTFILEPAS EMPLATEPAS Program MENU; {This menu is written for the File Card Database.} {$I VARIABLE.INC} Procedure MainMenu; Var Disk: File; Inkey: Char; A, B, X, Y: Integer; Line: String[80]; Flag, LFlag: Boolean; Procedure DrawMainMenu; Forward; {$I IOERR.INC} Procedure CenterText; Begin A := length(Line); B := 80 - A; X := B div 2; Gotoxy(X,Y); Write(Line); End; Procedure GetDrive; Begin {$I-} Assign(DDisk,'INSTALL.DAT'); Reset(DDisk); IOError; With InstallRecord do Begin Read(DDisk,InstallRecord); IOError; Drive := XDrive; End; Close(DDisk); IOError; {$I+} End; Procedure DrawAltMenu; Begin Clrscr; Y := 2; Line := ('FILE CARD DATABASE'); CenterText; Y := 6; Line := ('Options Menu'); CenterText; Writeln; For A := 1 to 80 do Begin Write('-'); End; Y := 12; Line := ('<1> Display Key Words'); CenterText; Y := 14; Gotoxy(X,Y); Write('<2> Reuse Deleted Records'); Y := 16; Gotoxy(X,Y); Write('<3> Create a Template'); Y := 18; Gotoxy(X,Y); Write('<4> Erase the Entire Database'); Y := 20; Gotoxy(X,Y); Write(' Return to the Main Menu'); Gotoxy(60,22); Write('Please select: '); End; Procedure AlternateMenu; Procedure SecondChoice; Begin LFlag := false; Repeat Gotoxy(75,22); Read(Kbd,Inkey); Inkey := upcase(Inkey); If Inkey = chr(27) then Begin DrawMainMenu; LFlag := true; End; If Inkey = '1' then Begin Clrscr; {$I-} Assign(Disk,'SORTFILE.CHN'); Chain(Disk); IOError; {$I+} End; If Inkey = '2' then Begin Clrscr; {$I-} Assign(Disk,'UNDELETE.CHN'); Chain(Disk); IOError; {$I+} End; If Inkey = '3' then Begin Clrscr; {$I-} Assign(Disk,'TEMPLATE.CHN'); Chain(Disk); IOError; {$I+} End; If Inkey = '4' then Begin Clrscr; Writeln('WARNING: This subprogram erases all existing data from the database.'); Writeln('use only if you wish to start a new database.'); Writeln; Writeln; Write('Type "*" to continue...any other key to abort: '); Read(Kbd,Inkey); If Inkey = '*' then Begin {$I-} Assign(Disk,'NEWFILE.CHN'); Chain(Disk); IOError; {$I+} End; Inkey := chr(0); DrawAltMenu; End; Until LFlag; End; Begin DrawAltMenu; SecondChoice; End; Procedure DrawMainMenu; Begin Clrscr; Y := 2; Line := ('FILE CARD DATABASE ver 4.6'); CenterText; Y := 4; Line := ('(c) 1986 by'); CenterText; Y := 6; Line := ('Thomas R. Mierau'); Centertext; Y := 8; Line := ('*** MAIN MENU ***'); CenterText; Writeln; For A := 1 to 80 do Begin Write('-'); End; Y := 12; Line := (' Add Records to the Database'); CenterText; Y := 14; Gotoxy(X,Y); Write(' Retrieve Existing Records'); Y := 16; Gotoxy(X,Y); Write(' Print Cards'); Y := 18; Gotoxy(X,Y); Write(' Other Options'); Y := 20; Gotoxy(X,Y); Write(' Quit'); Gotoxy(60,22); Write('Please select: '); End; Procedure FirstChoice; Begin Flag := false; Repeat Gotoxy(75,22); Read(Kbd,Inkey); Inkey := upcase(Inkey); If Inkey = chr(27) then Flag := true; If Inkey = 'A' then Begin Clrscr; {$I-} Assign(Disk,'MAINBODY.CHN'); Chain(Disk); IOError; {$I+} End; If Inkey = 'B' then Begin  Clrscr; {$I-} Assign(Disk,'RETRIEVE.CHN'); Chain(Disk); IOError; {$I+} End; If Inkey = 'C' then Begin Clrscr; {$I-} Assign(Disk,'PRINTER.CHN'); Chain(Disk); IOError; {$I+} End; If Inkey = 'D' then Begin AlternateMenu; End; Until Flag; Clrscr; End; Begin GetDrive; DrawMainmenu; FirstChoice; End; Procedure Help; Begin End; Begin MainMenu; End.AIL PQS `&AINBODYPAS jENU PAS nEWFILE PAS sRINTER PAS u$RINTRECINC ~EAD0 INC EADKEY INC ETRIEVEPAS ETCARD INC ORTFILEPAS EMPLATEPAS Program NEWFILE; {$I VARIABLE.INC} {$I IOERR.INC} {$I INITVAR.INC} Procedure CreateKeyFile; Begin {$I-} Filename := concat(Drive,'KEYLIST'); Assign(Disk1,Filename); Rewrite(Disk1); IOError; With Keyrec do Begin For Row := 1 to MaxKeys do XTagArray[Row] := TagArray[Row]; XUsed := Used; Write(Disk1,Keyrec); IOError; End; Close(Disk1); IOError; {$I+} End; Procedure CreateCardfile; Begin {$I-} Filename := concat(Drive,'CARDFILE'); Assign(Disk2,Filename); Rewrite(Disk2); IOError; With Cardrec do Begin For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin XCardArray[Column,Row] := CardArray[Column,Row]; End; End; Write(Disk2,Cardrec); IOError; End; Close(Disk2); IOError; {$I+} End; Procedure Help; Begin End; Begin Clrscr; InitVar; Writeln; Writeln('Creating: KEYLIST...'); CreateKeyFile; Writeln; Writeln('Creating: CARDFILE...'); CreateCardFile; Write(chr(7)); Writeln; Writeln('Done...Returning to the Main Menu.'); {$I-} Assign(Disk,'MENU.COM'); IOError; {$I+} Execute(Disk); End.ETRIEVEPAS ETCARD INC ORTFILEPAS EMPLATEPAS Program PRINTER; {$I VARIABLE.INC} (* Golbal variables for all programs *) {$I IOERR.INC} (* IOError *) {$I INITVAR.INC} (* Initvar *) {$I DATASCR.INC} (* Displayscr *) {$I DISPLSCR.INC} (* Displayrec *) Procedure Finish; Begin Clrscr; Close(Disk1); Close(Disk2); Assign(Disk,'MENU.COM'); Execute(Disk); End; Procedure Test; Var Num: Byte; Begin Num := Port[05]; If Num = 27 then Finish; End; Procedure GetCardRecord; Begin {$I-} Seek(Disk2,FilePointer); IOError; With Cardrec do Begin Read(Disk2,Cardrec); IOError; For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin CardArray[Column,Row] := XCardArray[Column,Row]; End; End; End; {$I+} If Keypressed then Test; End; Procedure SearchFiles; Var FirstArray, SecondArray: Array[1..4] of String[40]; FirstKey, SecondKey, XCopies: String[40]; Count, Copies, Code, FirstLen, SecondLen: Integer; HaltPrinter, KeyEntered, FirstFound, SecondFound: Boolean; Procedure Screen1; Begin Clrscr; GotoXY(32,1); Write('FILE CARD DATABASE'); GotoXY(31,3); Write('Card Printing Option'); GotoXY(1,4); Write('--------------------------------------------------------------------------------'); GotoXY(6,6); Write('This option will print either the entire database, or cards selected by key'); GotoXY(1,7); Write('words. You will be asked for key words to search on. If you respond to the first'); GotoXY(1,8); Write('prompt only, you will print all cards which contain at least one key that'); GotoXY(1,9); Write('matches your entry. If you respond to both prompts, you will print only the'); GotoXY(1,10); Write('records that contain both keywords. You may enter two key words in either order.'); GotoXY(1,11); Write('If you skip both prompts with you will print the entire file.'); GotoXY(6,13); Write('Additionally, you will be asked how many copies of each card you wish to'); GotoXY(1,14); Write('have printed. Enter the number followed by . If you enter only, the'); GotoXY(1,15); Write('program will assume one (1) copy of each card.'); GotoXY(5,17); Write('Finally, you will be asked whether or not you wish to halt the printer after'); GotoXY(1,18); Write('each card, so that you can manually insert file cards into your printer as the'); GotoXY(1,19); Write('file is printed. Enter a "Y" or "N". Upper or lower case will do. If you enter'); GotoXY(1,20); Write('"N", your printer must be filled with continuous-form cards, as the printer will'); GotoXY(1,21); Write('not stop. Even if you answer "Y" to this question, you MUST have a card in the'); GotoXY(1,22); Write('printer, ready to go, before you respond with your "Y" or "N".'); GotoXY(1,23); Write('( will interrupt the print option)'); GotoXY(52,24); Write('Type any key to continue...'); Read(Kbd,Key); If Key = #27 then Finish; Clrscr; End; Procedure PrintRec; Var A: Integer; Begin If HaltPrinter then Begin Write(chr(7)); Gotoxy(1,24); Write('Type any key... '); Read(Kbd,Key); If key = #27 then Finish; End; Gotoxy(60,24); Write('PRINTING '); Writeln(Lst); If Keypressed then Test; Writeln(Lst); If Keypressed then Test; Write(Lst,' '); If Keypressed then Test; Writeln(Lst,TagArray[1]); If Keypressed then Test; Write(Lst,' '); If Keypressed then Test; For A := 1 to MaxColumns do Begin Write(Lst,'='); If Keypressed then Test; End; Writeln(Lst); If Keypressed then Test; For Row := 1 to MaxRows do Begin Write(Lst,' '); For Column := 1 to MaxColumns do Begin Write(Lst,CardArray[Column,Row]); End; Writeln(Lst); If Keypressed then Test; End; Write(Lst,' '); If Keypressed then Test; For A := 1 to (MaxColumns + 1) do Write(Lst,'-'); If Keypressed then Test; Writeln(Lst); If Keypressed then Test; Write(Lst,' '); If Keypressed then Test; Write(Lst,TagArray[2]); If Keypressed then Test; Write(lst,' |'); If Keypressed then Test; Write(Lst,TagArray[3]); If Keypressed then Test; Write(Lst,' |'); If Keypressed then Test; Writeln(Lst,TagArray[4]); If Keypressed then Test; Writeln(Lst); If Keypressed then Test; Writeln(Lst); If Keypressed then Test; Gotoxy(1,24); ClrEOL; End; Procedure GetKeyWord; Var Temp: String[40]; I: Integer; Begin KeyEntered := true; Copies := 1; Clrscr; Writeln; Writeln('Enter first key word for search'); Writeln; Write('#1: '); Read(Temp); For I := 1 to length(Temp) do Temp[I] := upcase(Temp[I]); FirstLen := length(Temp); FirstKey := Temp; Writeln; Writeln; Writeln('Enter second key word for search ( to ignore )'); Writeln; Write('#2: '); Read(Temp); If Temp <> '' then Begin For I := 1 to length(Temp) do Temp[I] := upcase(Temp[I]); SecondLen := length(Temp); SecondKey := Temp; End Else Begin SecondKey := FirstKey; SecondLen := FirstLen; End; If (length(FirstKey) = 0) AND (length(SecondKey) = 0) then KeyEntered := false; Writeln; Writeln; Writeln('First key: ',FirstKey); Writeln('Second key: ',SecondKey); Writeln; Write('How many copies of each card? ( = 1 ) '); Read(XCopies); val(XCopies,Copies,Code); Writeln; Writeln; Write('Halt the printer after each card? (Y/N) '); Repeat Read(Kbd,Key); Key := upcase(Key); Until Key in['Y','N']; If Key = 'Y' then HaltPrinter := true Else HaltPrinter := false; Writeln; Writeln; Writeln('Searching... '); End; Procedure CheckRecord; Var Count: Integer; Begin FirstFound := false; SecondFound := false; {$I-} Seek(Disk1,FilePointer); IOError; With Keyrec do Begin Read(Disk1,Keyrec); IOError; For Count := 1 to 4 do Begin FirstArray[Count] := XTagArray[Count]; SecondArray[Count] := XTagArray[Count]; TagArray[Count] := XTagArray[Count]; If Count > 1 then TagArray[Count] := copy(TagArray[Count],1,SecondaryKeyLen); FirstArray[Count] := copy(FirstArray[Count],1,FirstLen); SecondArray[Count] := copy(SecondArray[Count],1,SecondLen); If FirstArray[Count] = FirstKey then Begin FirstFound := true; End; End; Used := XUsed; End; If FirstFound then Begin For Count := 1 to 4 do Begin If SecondArray[Count] = SecondKey then SecondFound := true; End; End; If Keypressed then Test; End; Begin Screen1; Repeat GetKeyWord; Displayscr; For FilePointer := 1 to (FileEndPointer-1) do Begin CheckRecord; If Used then Begin If SecondFound then Begin If Keypressed then Test; GetCardRecord; If Keypressed then Test; DisplayRec; For Count := 1 to copies do  Begin If Keypressed then Test; Printrec; End; End; End; End; Clrscr; Write(chr(7)); If SecondFound then Begin Writeln; Writeln('That`s All Folks...'); End Else Begin Writeln; Writeln('No such key match found... '); End; Writeln; Writeln('Enter "*" for another search, any other key to exit. '); Read(Kbd,Key); Until Key <> '*'; Clrscr; End; Procedure Help; Begin End; Begin {$I-} Filename := concat(Drive,'KEYLIST'); Assign(Disk1,Filename); Reset(Disk1); IOError; Filename := concat(Drive,'CARDFILE'); Assign(Disk2,Filename); Reset(Disk2); IOError; FileEndPointer := filesize(Disk2); {$I+} SearchFiles; Close(Disk1); Close(Disk2); Assign(Disk,'MENU.COM'); Execute(Disk); End. Procedure PrintRecord; Var A: Integer; Begin Write(chr(7)); Gotoxy(60,24); Write('PRINTING '); Writeln(Lst); Writeln(Lst); Write(Lst,' '); Writeln(Lst,TagArray[1]); Write(Lst,' '); For A := 1 to MaxColumns do Write(Lst,'='); Writeln(Lst); For Row := 1 to MaxRows do Begin Write(Lst,' '); For Column := 1 to MaxColumns do Begin Write(Lst,CardArray[Column,Row]); End; Writeln(Lst); End; Write(Lst,' '); For A := 1 to (MaxColumns + 1) do Write(Lst,'-'); Writeln(Lst); Write(Lst,' '); Write(Lst,TagArray[2]); Write(lst,' |'); Write(Lst,TagArray[3]); Write(Lst,' |'); Writeln(Lst,TagArray[4]); Writeln(Lst); Writeln(Lst); Gotoxy(60,24); ClrEOL; End; Procedure ReadRecord0; Begin {$I-} Seek(Disk2,0); IOError; With CardRec do Begin Read(Disk2,CardRec); IOError; For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin CardArray[Column,Row] := XCardArray[Column,Row]; End; End; End; IOError; {$I+} End;INSTALL PAS / IOERR INC 2MAINBODYPAS 4MENU PAS 805: Write('Can''t read from this file'); $06: Write('Can''t write to this file'); $10: Write('Error in numeric format'); $20: Write('Operation not allowed on a logical device'); $21: Write('Not allowed in the direct mode'); $22: Write('Assign to standard files not allowed'); $90: Write('Record length mismatch'); $91: Write('Seek beyond end of file'); $99: Write('Unexpected end of file'); $F0: Write('Disk writProcedure ReadKey; Var I: Integer; Begin ExitFlag := false; Temporary := (TagArray[1]); Input(13,3,40); For I := 1 to 80 do Temporary[I] := upcase(Temporary[I]); TagArray[1] := Temporary; Gotoxy(13,3); Write(TagArray[1]); ExitFlag := false; Temporary := (TagArray[2]); Input(12,22,SecondaryKeyLen); If ExitFlag then Begin Gotoxy(12,22); Write(TagArray[2]); Exit; End; For I := 1 to 80 do Temporary[I] := upcase(Temporary[I]); TagArray[2] := Temporary; TagArray[2] := copy(TagArray[2],1,SecondaryKeyLen); Gotoxy(12,22); Write(TagArray[2]); Temporary := (TagArray[3]); Input(31,22,SecondaryKeyLen); If ExitFlag then Begin Gotoxy(31,22); Write(TagArray[3]); Exit; End; For I := 1 to 80 do Temporary[I] := upcase(Temporary[I]); TagArray[3] := Temporary; TagArray[3] := copy(TagArray[3],1,SecondaryKeyLen); Gotoxy(31,22); Write(TagArray[3]); Temporary := (TagArray[4]); Input(50,22,SecondaryKeyLen); If ExitFlag then Begin Gotoxy(50,22); Write(TagArray[4]); Exit; End; For I := 1 to 80 do Temporary[I] := upcase(Temporary[I]); TagArray[4] := Temporary; TagArray[4] := copy(TagArray[4],1,SecondaryKeyLen); Gotoxy(50,22); Write(TagArray[4]); End; INSTALL PAS / IOERR INC 2MAINBODYPAS 4MENU PAS 8( d!k6!{6``o&  :(͠|(  *"x2y( >28!"9!! og2"">~22!:05+:!Co&ͦͣ} [ (!e|ͧA8Q0G: x@!\w# (̓ ?(*( .( x_. _!h6# (?( *( ̓( w#>?> w#ͧ 8 !ɿ .,;:=?*[]<>{}a{ |͵};Ɛ'@'7||}>2Ͱ*Bک  "og"2>2!Program RETRIEVE; {$I VARIABLE.INC} (* Golbal variables for all programs *) {$I IOERR.INC} (* IOError *) {$I INITVAR.INC} (* Initvar *) {$I PRINTREC.INC} (* PrintRecord *) {$I DATASCR.INC} (* Displayscr *) {$I DISPLSCR.INC} (* Displayrec *) {$I INPUT.INC} (* Input(PositinPtr,Y,Len) *) {$I EDITSCR.INC} (* Editscr *) {$I READKEY.INC} (* ReadKey *) {$I HELPSCR.INC} (* Help *) Procedure GetCardRecord; Begin {$I-} Seek(Disk2,FilePointer); IOError; With Cardrec do Begin Read(Disk2,Cardrec); IOError; For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin CardArray[Column,Row] := XCardArray[Column,Row]; End; End; End; {$I+} End; Procedure WriteTagFile; Begin Used := true; {$I-} Seek(Disk1,FilePointer); IOError; With KeyRec do Begin For Row := 1 to MaxKeys do Begin XTagArray[Row] := TagArray[Row]; End; XUsed := Used; Write(Disk1,Keyrec); IOError; End; {$I+} End; Procedure WriteCardFile; Begin {$I-} Seek(Disk2,FilePointer); IOError; With CardRec do Begin For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin XCardArray[Column,Row] := CardArray[Column,Row]; End; End; Write(Disk2,CardRec); IOError; End; {$I+} End; Procedure Inputscr; Var Chrnum: Integer; TempKey: String[18]; Quit,Flag1, Flag2: Boolean; Begin Repeat ReadKey; EditScr; Gotoxy(28,24); Write('Is the above correct? (Y/N) '); Repeat Read(Kbd,Key); Key := upcase(Key); Until Key in['Y','N']; Until Key = 'Y'; End; Procedure SearchFiles; Var FirstArray, SecondArray: Array[1..4] of String[40]; FirstKey, SecondKey: String[40]; FirstLen, SecondLen:  Integer; KeyEntered, FirstFound, SecondFound: Boolean; Procedure GetKeyWord; Var Temp: String[40]; I: Integer; Begin KeyEntered := true; Clrscr; Writeln; Writeln('Enter first key word for search'); Writeln; Write('#1: '); Read(Temp); For I := 1 to length(Temp) do Temp[I] := upcase(Temp[I]); FirstLen := length(Temp); FirstKey := Temp; Writeln; Writeln; Writeln('Enter second key word for search ( to ignore )'); Writeln; Write('#2: '); Read(Temp); If Temp <> '' then Begin For I := 1 to length(Temp) do Temp[I] := upcase(Temp[I]); SecondLen := length(Temp); SecondKey := Temp; End Else Begin SecondKey := FirstKey; SecondLen := FirstLen; End; If (length(FirstKey) = 0) AND (length(SecondKey) = 0) then KeyEntered := false; Writeln; Writeln;  Writeln; Writeln; Writeln('First key: ',FirstKey); Writeln('Second key: ',SecondKey); Writeln; Writeln; Writeln; Writeln('Searching... '); End; Procedure CheckRecord; Var Count: Integer; Begin FirstFound := false; SecondFound := false; {$I-} Seek(Disk1,FilePointer); IOError; {$I+} With Keyrec do Begin {$I-} Read(Disk1,Keyrec); IOError; {$I+} For Count := 1 to 4 do Begin FirstArray[Count] := XTagArray[Count]; SecondArray[Count] := XTagArray[Count]; TagArray[Count] := XTagArray[Count]; If Count > 1 then TagArray[Count] := copy(TagArray[Count],1,SecondaryKeyLen); FirstArray[Count] := copy(FirstArray[Count],1,FirstLen); SecondArray[Count] := copy(SecondArray[Count],1,SecondLen); If FirstArray[Count] = FirstKey then  Begin FirstFound := true; End; End; Used := XUsed; End; If FirstFound then Begin For Count := 1 to 4 do Begin If SecondArray[Count] = SecondKey then SecondFound := true; End; End; End; Procedure DeleteRecord; Begin Initvar; Clrscr; Gotoxy(34,12); Write('DELETING... '); Used := false; {$I-} Seek(Disk1,FilePointer); IOError; With KeyRec do Begin For Row := 1 to MaxKeys do Begin XTagArray[Row] := TagArray[Row]; End; XUsed := Used; Write(Disk1,Keyrec); IOError; End; {$I+} Used := true; WriteCardFile; Displayscr; Displayrec; End; Begin Repeat GetKeyWord; If KeyEntered then Begin For FilePointer := 1 to (FileEndPointer-1) do Begin CheckRecord;  If Used then Begin If SecondFound then Begin GetCardRecord; DisplayScr; DisplayRec; Repeat Gotoxy(1,24); Write('^D=Delete ^P=Print ^W=Write =Next =Quit '); Read(Kbd,Key); Case Key of #4: Begin Write(Chr(7)); Gotoxy(60,24); Write('Delete? (Y/N) '); Repeat Read(Kbd,Key); Key := upcase(Key); Until Key in['Y','N']; If Key = 'Y' then DeleteRecord; Gotoxy(60,24); ClrEOL; End;  #16: Begin PrintRecord; End; #23: Begin Gotoxy(1,24); ClrEOL; InputScr; WriteTagFile; WriteCardFile; End; #27: Begin Clrscr; Close(Disk1); Close(Disk2); Assign(Disk,'MENU.COM'); Execute(Disk); End; End; Until (Key = #13) OR (Key = #32); Clrscr; End; End; End; End; Write(chr(7)); If SecondFound then Begin Writeln('That`s All Folks...'); End;  If NOT KeyEntered then Begin Writeln('No Key word entered...'); End; Writeln; Write('Enter "*" for another search, any other key to quit. '); Read(Kbd,Key); Until Key <> '*'; Clrscr; End; Begin {$I-} Filename := concat(Drive,'KEYLIST'); Assign(Disk1,Filename); Reset(Disk1); IOError; Filename := concat(Drive,'CARDFILE'); Assign(Disk2,Filename); Reset(Disk2); IOError; FileEndPointer := filesize(Disk2); {$I+} SearchFiles; Close(Disk1); Close(Disk2); Assign(Disk,'MENU.COM'); Execute(Disk); End.EXTRACT PAS /FILECARDNOT )GETCARD INC %HELPSCR INC &INITVAR INC (INPSCR INC )INPUT INC *INPUTSCRINC .INSTALL PAS / IOERR INC 2MAINBODYPAS 4MENU PAS 8Procedure SetCardFile; Begin {$I-} Filename := concat(Drive,'CARDFILE'); Assign(Disk2,Filename); Reset(Disk2); IOError; FileEndpointer := Filesize(Disk2); {$I+} End; INITVAR INC (INPSCR INC )INPUT INC *INPUTSCRINC .INSTALL PAS / IOERR INC 2MAINBODYPAS 4MENU PAS 8!ͫ !ͻ!;!ͫ !ͻ!;!ͫ !ͻ ͜ ͜!#!p#ͻ How many copies do you require ?!#!q# !dO !*dgz'"fd&*f#ë'?!jN MAILFILE.DATq!j= K&!jJE'!j{ ͜ ͜ͻ !#!p#ͻHit CARRIAGE RETURN....!#!q# !E ?͜ͻ5This program will print standard 102mm * 36mm labels  ͜ ͜ͻ4The print out is spaced for a printer setting of ͜ͻ46 lineProgram Sortfile; (* This program sorts and displays all of the keywords in the file KEYLIST. *) {$I VARIABLE.INC} {$I IOERR.INC} Procedure PrintKeys; Var Keylist: Array[0..1000] of String[18]; Keyword: Array[1..4] of String[40]; KeyWord1, Tempword, Testword: String[40]; PrimeCount, Pointer, FilePointer, EndOfFile, EndOfArray, SubPointer, I, X, Y, Z: Integer; Check, Key: Char; Used, Flag1, Flag2, Flag3: Boolean; Procedure Init; Begin PrimeCount := 0; FilePointer := 1; EndOfFile := 0; EndOfArray := 0; Pointer := 0; SubPointer := 0; I := 0; Clrscr; End; Procedure ReadFile; Begin {$I-} Write('Reading in key list file... '); Filename := concat(Drive,'KEYLIST'); Assign(Disk1,Filename); Reset(Disk1); IOError; EndOfFile := Filesize(Disk1); For FilePointer := 1 to (EndOfFile-1) do Begin Seek(Disk1,FilePointer); IOError; With Keyrec do Begin Read(Disk1,Keyrec); IOError; For Z := 1 to 4 do Begin KeyWord[Z] := XTagArray[Z]; End; Used := XUsed; End; If Used then Begin For Z := 1 to 4 do Begin EndOfArray := (EndOfArray+1); Keylist[EndOfArray] := KeyWord[Z]; End; End; End; Close(Disk1); {$I+} Writeln(EndOfArray,' Key words.'); End; Procedure MakeSpace; Begin For I := Pointer downto (Subpointer+1) do Begin Keylist[I] := Keylist[(I-1)]; End; Keylist[SubPointer] := Tempword; End; Procedure PurgeWord; Begin EndOfArray := (EndOfArray-1); For I := Pointer to EndOfArray do Begin Keylist[I] := KeyList[(I+1)]; End; Pointer := (Pointer-1); End; Procedure SortFile; Begin Writeln; Write('Sorting list and purging duplicates... '); Keylist[0] := Keylist[1]; Pointer := 1; Flag1 := false; Repeat SubPointer := 0; Pointer := (Pointer+1); Tempword := Keylist[Pointer]; Check := copy(Tempword,1,1); Repeat Flag2 := false; Testword := Keylist[Subpointer]; If not Flag2 then Begin If Tempword < Testword then Begin Flag1 := true; Flag2 := true; MakeSpace; End; End; If not Flag2 then Begin If Tempword = Testword then Begin Flag1 := true; Flag2 := true; PurgeWord; End; End; If not Flag2 then Begin If Check = (' ') then Begin Flag1 := true; Flag2 := true; PurgeWord; End; End; If not Flag2 then Begin SubPointer := (SubPointer+1); If SubPointer = (Pointer-1) then Begin Flag1 := true; Keylist[Subpointer] := Tempword; SubPointer := 0; End; End; Until Flag1; Flag1 := false; Until Pointer = EndOfArray; End; Procedure ShiftOut; Begin Writeln(EndOfArray,' Sorted words'); For I := EndOfArray downto 1 do Begin Keylist[I] := Keylist[(I-1)]; End; End; Procedure PrintList; Var C, P: Integer; Begin C := ConOutPtr; P := LstOutPtr; Flag3 := false; Repeat Gotoxy(1,5); Write('Output to Screen or Printer? '); Read(Kbd,Key); Key := upcase(Key); If Key = 'S' then Begin Flag3 := true; End; If Key = 'P' then Begin Flag3 := true; ConOutPtr := P; End; Until Flag3; Writeln; Writeln; For I := 1 to EndOfArray do Begin Writeln(Keylist[I]); End; Write(chr(12)); ConOutPtr := C; Writeln; Writeln; Repeat Gotoxy(1,24); Write('Type to continue... '); Read(Kbd,Key); Until Key = (chr(27)); Clrscr; Assign(Disk,'MENU.COM'); Execute(Disk); End; Begin Init; Readfile; Sortfile; ShiftOut; PrintList; End; Procedure Help; Begin End; Begin PrintKeys; End. INSTALL PAS / IOERR INC 2MAINBODYPAS 4MENU PAS 8 ? ͜ ͜ͻ+2. DO YOU WISH TO ACCESS AN EXISTING FILE ? ͜ ͜ ͜!#!p#ͻ9YOU MUST ANSWER AS QUESTION 1 ON YOUR FIRST ATTEMPT !!!!!!#!q# ͜ ͜ ͜!#!p#ͻ OPTION >> !#!q# !ͪ!E *&}2*&!1̀E,<6*&!2̀EA<ͮ%!"h!}2"h*h!͓}2*&E=͜!# ?! ! *hR = Quit } '); Repeat Read(Kbd,ZKey); ZKey := upcase(ZKey); If ZKey = #27 then Begin Clrscr; Writeln; Writeln; Writeln('Returning to the Main Menu... '); Close(Disk1);  Close(Disk2); Assign(Disk,'MENU.COM'); Execute(Disk); End; Until ZKey in['Y','N']; If ZKey = 'Y' then Begin Gotoxy(1,24); ClrEOL; Inputscr; End; End; Clrscr; End; If NOT Found then Begin Writeln; Writeln; Writeln('No Deleted Records Available.'); Writeln; Writeln; Write('Type any key to continue... '); Read(Kbd,Key); Clrscr; End; End; Begin {$I-} Filename := concat(Drive,'KEYLIST'); Assign(Disk1,Filename); Reset(Disk1); IOError; Filename := concat(Drive,'CARDFILE'); Assign(Disk2,Filename); Reset(Disk2); IOError; FileEndPointer := filesize(Disk2); {$I+} SearchFiles; Writeln; Writeln; Writeln('Returning to the Main Menu... '); Close(Disk1); Close(Disk2); Assign(Disk,'MENU.COM'); Execute(Disk); End.{File: VARIABLE.LIB} Type XInstallRecord = Record XDrive: String[2]; End; XKeyrec = Record XTagArray: Array[1..4] of String[40]; XUsed: Boolean; End; XCardrec = Record XCardArray: Array[1..55,1..16] of Char; End; Const MaxColumns: Integer = 55; MaxRows: Integer = 16; MaxKeys: Integer = 4; PrimaryKeyLen: Integer = 40; SecondaryKeyLen: Integer = 18; XOffset: Integer = 12; YOffset: Integer = 4; Var Disk: File; Disk1: File of XKeyrec; Disk2: File of XCardrec; DDisk: File of XInstallRecord; InstallRecord: XInstallRecord; Keyrec: XKeyrec; Cardrec: XCardrec; TagArray: Array[1..4] of String[40]; CardArray: Array[1..55,1..16] of Char; Drive: String[2]; Filename: String[10]; Temporary: String[80]; X, Y, Row, Column, Keypointer, FileEndPointer, FilePointer: Integer; Key: Char; PrintInit, ExitFlag, Used: Boolean; Procedure Help; Forward;+ &FG2P ;eseU썆^V+ P P 帺P *P  >% P >q}nF6uFPFVP7FVPK FvBVF t=F F v t0^ 0;uF F ۃ~ tmF붃>q~XMGXBq <FjFxjgFx?gL2z֔iUGiO0X>CqjRc_/T]r˰z<6$g-f9y\AMsOޟ_(H'Sᄾ'ΰ9y~~_AxX>y'''ΰ=y쭂t 0p,),1_%.q)g'+H:ô,08 }es0Te݆? GlnCbo3<ba:rYvSXb黩C~fv?<'ǓV#4H{2=Desz|aZ6[\n^gqg{1_и슎p^ 8tЖ)_gMɏ{File: WRITREC.LIB} Procedure WriteRecord; Begin Used := true; {$I-} Filename := concat(Drive,'KEYLIST'); Assign(Disk1,Filename); Reset(Disk1); IOError; Seek(Disk1,FilePointer); IOError; With Keyrec do Begin For Row := 1 to MaxKeys do Begin XTagArray[Row] := TagArray[Row]; End; XUsed := Used; Write(Disk1,Keyrec); IOError; End; Close(Disk1); IOError; Filename := concat(Drive,'CARDFILE'); Assign(Disk,Filename); Reset(Disk2); IOError; Seek(Disk2,FilePointer); IOError; With Cardrec do Begin For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin XCardArray[Column,Row] := CardArray[Column.Row]; End; End; Write(Disk2,Cardrec); IOError; End; Close(Disk2); IOError; {$I+} End; Procedure WriteCardFile; Begin {$I-} IOError; Seek(Disk2,FilePointer); IOError; With CardRec do Begin For Row := 1 to MaxRows do Begin For Column := 1 to MaxColumns do Begin XCardArray[Column,Row] := CardArray[Column,Row]; End; End; Write(Disk2,CardRec); IOError; End; {$I+} End; 5#pV KbYa:C̊3HW mɛ"0Ү]{wⶵB^hcI g1+ ]%%oX5Pv daO X]Xo\Yq*-ySQv$X|m0L+ļ"^j=SbVAJhKni#ޓWVsn%DkzYq*-y8tЖ)"_cu\f,'0-;L=6}7]@ԛ8tћb8t /PAο=-/Yq*-yS4u DK0D'.Ǻ7YqaGS̚28kʴ*S86S̊3H'h [̚2LОZ[3HW mJhK( ^hcgkcwŬ)ӪL!+ *fMVe YqFfTqg|AZ^U]Q^ 8tЖQAJhK/,tv32:fM!P[<|Procedure WriteTagFile; Begin Used := true; {$I-} Seek(Disk1,FilePointer); IOError; With KeyRec do Begin For Row := 1 to MaxKeys do Begin XTagArray[Row] := TagArray[Row]; End; XUsed := Used; Write(Disk1,Keyrec); IOError; End; {$I+} End; CLASS24 FONφ 2CLASS28 FON COMP12 FONAh /COMP20 FON8h VP0< V786AV( ]%%o ?غAgZ Qq^4a37#F -28!?"9!!>2 :D]SXN]D [ (!e}̈́A8Q0G: x@!\w# (   yV. V!h6# (*(.(!8}(*(̈́w#>?> w#a{ |͒}͛Ɛ'@'7||}>"C"6# ""͐ͩ*B"[R5*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#E͊w}8uRB0 >R@RR!+ͨ z R!+ͨ z <!+ͨ z <!+ͨ z <!#ͨ z <!+ͨ z T]KB!z> S>))0 = |JJDMgo>jB0 7?= H\<z5+)+<z {0Gɯgo||H}||/g}/o#}o&K[xAJSJDM!b"!6J"DM'ͬͬdͬ ͬ} wͦWͧ _}8(8J`9{T]=o`9y w >uJ u` }>(; xQ }} ˸T}ٕ(0D=C ,= ( [ 0%D , 7 ͏ ?(8u x O - ; 8˸x X ,-xG}; }م 9; .>#n0[ D = - nx P ,-(-˸G,-; }ٕ? 9.>͏ 8u ?= u+-(>O 0u O 8͏ ?x P , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨ xx(ͼ ?}ٽÏ }ց; <(; 7D = |٤g{٣_z٢Wy١Ox٠GD u J }x>uu}ƀ/ƀo; -J }0W-J W,}l˸ͨ 8 ; ` x( -ͨ 8J -ͨ 8,J }l8;*!` ! >u` ` u--- J ,,,-xGg?+2n*8t z~,->uxua}.; OJ , ; !U >,k- o&0%,` }g; }؉}颋.:}8c~I$I~L*kٷx˸; }0G,͙<},-(-J ! >0 a` o8 Oþ >um.`1pF,t6|!wS<.z}[|%FXc~ur1}Oٯx(<˸ͨ 8; !~Jͨ 0O!><ͨ 8 =  7 <` O ; 7 0 W-J OT0 j oD,:j !I}袋.}8c~I$I~L!>u` ` 77 ` = O nf^VNF!DLT\I!!53!r1!\!> x #-= o˸xO(- }(x>8(C ,C `iM!>u|; |J>| )=|(DMbo˸ͦ88ͦx(0 8> Mx(>-Ͳ{(ay(Ͱͦ \z(>.Ͳ (Ͱ ~ͦ{>EͲ>+|(|Dg>-Ͳ|/ 0:p# ~# +>0w#,-  60#J˸}րogM| .(C = ~> x0w#xG%P %P ZJDM%P = _~65i+~hìx-Sx9?+{Η@}|C C gZJDM0D ,7}o˸  #yO!@9i&   # w# /w# w#!9! E9!!9~(+F͊!"9!(#>2*Ͳ"|>" :( ͆ *6#w*6#6 !\$![ (̈́( #:~CONTRMKBDLSTAUXUSR>2$*#~ Ͷ$*:> >w###6  #6++p>2S-$Ͷ:*6###ww#w$w#w: ##N#F*B> w#w#[s#r>2S$Ͷ$*6 #-Nw#Fwq#p#6#w#w#w* :( ͒: *^ F* < >26"~͟*-w#ww#͟"~ <@*Ͳ!\  <ʮ!\$> >2*|>! * \$\<(!: [1Á\!(f"> 2:!<"F( #~#6e>!["N>!~8>O6*"w (=(&("( :(N 8y(~#x+% (6*#~[*#~ *~(h#"b=  8 J= B== ͯ}8= ͵}/ͭ !*###~-_~(4Q6*>2>*##w:>*##~*#~(E[ ( ( ( !][ ( ( ((w#(6!]~-#8~>7  [>OkͼMs #rkͼpX á[ [ (( #w(q*#~[ (  *##~6͜O$*#~(08ʦ=ʦ==ʩ=ʬò+###~-_q46͡> *:4^q}Ò*|(M|( M6-#͐ͦ[R8 (G> ͒C~͒#*ͦC!h !lTRUEFALSEͦ!9^#(~#(G~͒#> ͒> Ò "F![(#RR0*4#4> RR *4 #4(>>2$*V(/˖:(#~+ x y2!͵( =( X:(R*:(###~-_-͌X> :("͟"*^˞*V˖0 SRѷR8A* N#F#s#r$ 0})jS\*###w* N#FB ͟r+s> !T]>)j)0 0= UR!#U*^#V#N#F#^#V>">!2DM"~x(L* :O(o:" C}=( ?*-N#Fp+qq#p! * F+N+++V+^Bq#p>>> SRѷR* s#r$ s#r"S"! N#FB(^x * 6#[<(H*! Kq#p##K[! *! 4 #4! x *$ *>w""{_!"*nf}(HR0nf" ^VMDnfutqp*s#r*s#r"* 5KB!>u~#fo{_"*R0RnfR0KqputsrNF( ^VNF^V*SutKqp R*R(~w~wnf ut"6# * *!""*NFy(* "*B0Cnf* [R*"*RS[s#r^#VS>O"w2x2!"" @*>2"!"""!\Ͳ*: !~6go(\R*s#r_2x( s x(T]DMR0 -a%}̈́o*!~6o&͠|ͣ}%^C User break1:% I/O% Run-time% error ͒%, PC=[R"͍% Program aborted*1!͍!4Ͳ2c!!Ŕ0 Complex Decision Assistance͐bR͐bŔ* by Glenn Brooke͐bŔ, Last Update 4/27/85͐b!!Ŕ= Based upon a program by John Kasunich and Glenn Brooke.͐bŔEThe concept is simple : a complex decision can be reduced to a series͐bŔDof simpler decisions, the simplest being a decision between 2 items.͐bŔCSuppose you are attempting to decide between 4 cars, and you have a͐bŔAlist of 24 characteristics by which to distinguish them (mileage,͐bŔEleg room, looks, maintenance costs, etc.). This program reduces this͐bŔBcomplex decision to a series of randomly presented choices between͐bŔ2two characteristics for each car. Try it and see!͐b"*!"*!! 5z#" !! 5z#" !!5z#"!* +)))))))))* +)))))*+)!s#r*#n#* #Z#* #F#!!5z7$" !!5z.$" !* +)))))* +)!s#r* ##* ##!!5z$" !~* +)!s#r!* +))))!2* +))))!* +)!s#r* #B$!! 5z%" !<* +))))!r* +)!s#r* #$!!ŔPress any key to continue...b͠EI%ccŔC Now let's get the choices and values for these choices:͐bR͐b!!Ŕ) How many choices are there (Max = ! !́) ? b!8+bR͐b*8Q!! kEʱ%!!Ŕ8 How many values will you base your choice upon (Max = !!́) ? b!:+bR͐b*:Q!!kE.&c!!Ŕ Ok, so you have *:!́ values for *8!́ choices.͐bR͐bŔ0Let's begin by getting a list of your choices :͐bR͐b!*85z'"ŔChoice number *!́ is : b!<*+))))+.bR͐b*#p'c!!Ŕ! Next enter the list of values : ͐bR͐b!*:5zʖ("Ŕ Value number *!́ is : b!2*+))))+.bR͐b*#+(R͐bR͐b"!*5zu)"!"!*5z)"*!~*+)^#VͯE)!~*+)^#V"*"*#(!*+)))) R!q́ *!͐b!~*+)!s#r*#ü(*:"-*-"+*:*:!R! !#͡!"*!#͸E+*- #"2*+ #"0!*2+)))))*0+)^#V!N*2*0ͯ}oE)c!!Ŕ3 What is more important to you : ͐bŔ 1) !2*2+)))) !q͐bŔ 2) !2*0+)))) !q͐bR͐b!! ŔEnter the number : b!4+b*4Q!a!aE +*4!NEʎ+!*2+)!*2+)^#V!s#r*4!NE+!*0+)!*0+)^#V!s#r!*2+)))))*0+)!s#r*!"ò)c!*:5zy,"2!~*2+)!*2+)^#Vs#r!*2+))))!2*2+)))) *2# ,!!Ŕ& Here are the weights of the values : ͐bR͐b*:ͩ(R͐bR͐bŔ$ Press any key to continue....b͠E-cå-c!*:5zʡ-"Ŕ What weight do you assign !2*+)))) !q́ : b!*+)+bR͐b*##-c*8*8!R! *: !͡c!!Ŕ% 1) Use current weighting͐bŔ$ 2) Enter new weighting ͐bR͐b!!Ŕ, Enter the number of your selection b!+bR͐b*!N*!N}oEX.*!NE.-!"*!͸E1*: #"4*8 #"2*8 #"0!*2+)))))))))*0+)))))*4+)^#V!N*2*0ͯ}oE.c!!Ŕ3 Which choice is better with regard to <>͐bR͐bŔ 1) !<*2+)))) !q͐bŔ 2) !<*0+)))) !q͐bR͐b!! Ŕ$Enter the number of better choice : b!+bR͐b*Q!a!aEʅ0*!NE/1!r*2+)!r*2+)^#V!*4+)^#Vs#r*!NEq1!r*0+)!r*0+)^#V!*4+)^#Vs#r!*2+)))))))))*0+)))))*4+)!s#r*!".c!*85z?2"2!~*2+)!r*2+)^#Vs#r!*2+))))!<*2+)))) *2#1!!Ŕ@ Here are the scores of your choices given the weighted values :͐bR͐b*8ͩ(R͐bR͐bŔ' Press any key to continue .... b͠E2c;#U%v)-!! Ŕ3 (1) New Choices and New Weights͐bŔ( (2) New Weights Only͐bŔ( (3) New Choices Only͐bŔ0 (4) EXIT to operating system͐bR͐bŔ4 What do you want to do (1,2,3, or 4) ?b!+b*Q!a!a!a!aE3*R‡4U%v)34Rš4v)34R­4U%34R4!!*Q!a!a!a!aE3*RU%v Documentation for CHOOSE.PAS By Glenn Brooke Last Update 4/25/85 Our decisions are quite often complex. There are many variables (values) to consider when evaluating a new or used car, which college to attend or job to take, what to plant in the garden this year, etc. Most of the time there are even more than 2 choices to evaluate with respect to each of these values! Aha, you say, my computer should be able to make my decision. Well, computers are only tools (at this point in time), and human judgement is still required. CHOOSE was written to make the decision a little easier, however, and certainly helps to clarify why you make decisions. The original program was written in M-Basic by John Kasunich and subsequently modified by Glenn Brooke in 1984. John and I were roommates at Case Western Reserve University at the time. John used the program to help decide between several job offers (he's doing nicely now, making big bucks), while I used to it to compare offers from graduate schools (I'm well too, but poorer). I have recently been purchasing spectrophotometers, fraction col- lectors, and other big-ticket items for my lab at Northwestern, and rewrote the program in Turbo Pascal, spiffing it up a bit. This is version 1.03, flexible for multiple comparisons of the same values on different choices, or different values using the same choices, etc. The .COM file is included here for folks who want to use the program but lack a Turbo compiler. The source is available also, in the interest of future improved versions. (I'd like to see hard copy and disk access included.) Run the program as any .COM file. You'll first be asked for the number of choices and values, then input these at the keyboard. Next the program will help you assign weights to these values. (Manual weighting can also be used.) Using these weighted values, the program will present each choice in light of each value, asking you which is better. A tabulation of these simple decisions will be shown, and then you are free to try new choices, new values, or any combination. It sounds hard, but it's very easy. Just try it! The nice thing about the program is that it has a random selection pattern which reduces your overall bias in evaluating choices. Go for it! Glenn Brooke 1025 Garnett Place Evanston, IL 60201 (312)864-2963 evenings or (312)649-1730 Z-Node RCPM vCHOOSE.PASl o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkKeF8VzJ<KI,pW[XqIP־$>Dw?~}̓3B-:]~s>>8ooO>!|xt|}qwW ooOͫ pNN8rǧ3Xhs=޾9=q PTEhGLFEnrA()g+BZ8xRL^{mgtV6݃GxIah) WG9 Nv4"!hK^{=^\p%gB!JR+eD;Zr&i9^`ϙfJ{_p|{{:oB`kx*\-nM \^\InynM \^\a;t+fu*iP%e1m~$֣! Ybe9%.䱷 "OHk B+EV$'A+d<]̞IW,i"1rbXYAV 7 MH~ !iP+rTXY䇄^,6u!$gb+ˑfu*iP7Vx=6uXRi"ABcrA!iP%eAVѭhrArM m.{ŒA5)3nf-أC;$E^\Iny7$m.{ŒH \(6uXR bIY$mH I+ˑQ^\6,T3MGRCqf/=l!7dVVY'̝d6FRI0rXHjH%m԰ᗽU[aiQzVkjXhq&VxH |[1GiAݚ  ~Sj + |[SBo#7ASj6FnR[aAFL DA+)5>M]M Gx;rrnw GeU<цDflPkM%}ripXZ9)%!ѲT'n*ѳ0rp$bOA;FRI55,A1STI[ai!O+4mBI&)I!V#C;$m>)rEԐ+E. R`bvK ԼX)H V#be9a;\\a;%mjރEVH V#be9a;].谝6u,Gl<ЭH 1 nX$mjeLOAYJ {0ABXYQZm.԰)5NvVHdAtJOr;١[!V#vK \(6ucfχ B+Ŵ{R"hy=ƶPH I@V$\GIW,) B3Mr$?$m^,zŒH ԽbI[EÉ1^"Z!YM퐴A-IBrK/yOe>fu*iCLx"{bDZVq;$m%e1m~=}>{tiadQ;$m%eAx+4m~r蝐t1}*<vH\9e+5$mBrX)v1}=%mE ,b` |ZÚ |&y,GDyrA>i)'5qSIAXi|w>\ݠÚ |&AIzMT'm>7VZ:ߝ6HIOaM m>_ '' then Begin For I := 1 to length(Temp) do Temp[I] := upcase(Temp[I]); SecondLen := length(Temp); SecondKey := Temp; End Else Begin SecondKey := FirstKey; SecondLen := FirstLen; End; If (length(FirstKey) = 0) AND (length(SecondKey) = 0) then KeyEntered := false; Writeln; Writeln; Writeln('First key: ',FirstKey); Writeln('Second ke ͫCopyright (C) 1985 BORLAND IncBAmstrad PCW 8256ctedZEyEH1Y EHHLMKqp~7#~=  oͦlԅ!!"~#(}:$= +*!6!*!!:(2!6:(>2!!!:O::O:!*! !45(! +/ 0y0( d!k6!{6``o&  :(͠|(  *"x2y( >28!"9!! og2"">~22!:05+:!Co&ͦͣ} [ (!e|ͧA8Q0G: x@!\w# (̓ ?(*( .( x_. _!h6# (?( *( ̓( w#>?> w#ͧ 8 !ɿ .,;:=?*[]<>{}a{ |͵};Ɛ'@'7||}>2Ͱ*Bک  "og"2>2! ""*B"[Rv*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#Eͻw}8( RB0 >( RrRR!+ ͱ R!+ ͱ s!+ ͱ s!+ ͱ s!# ͱ s!+ ͱ T]KB!z> S>))0 = | |́́DMgo>jB0 7?= H͓<z5b)b<z {0Gɯgo||}||/g}/o#}o&K[xAJSJDM!b"!6J"DM'd } * W _}8(8J`9{T]=o`9y *  >( ͂ ͭ͘ }>( x‰ }} ˸T}ٕ(0D={ ,= ( ͓ 0%| , 7 ?(8ͭ x ͇ - s 8˸x ͐  ,-xG}s }مN 9s .>#n0͓ | = - nx ͈ ,-(-˸G,-s }ٕ?N 9.> 8ͭ ?= u+-(>͇ 0ͭ ͇ 8 ?x ͈ , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨ xx( ?}ٽ }ցs <(s 7| = |٤g{٣_z٢Wy١Ox٠G| ͭ ͂ }x>( ͭ}ƀ/ƀo  -͂ }0͏-͂ ͏,}l˸ 8 5 ͘ x( - 8͂ - 8,͂ }l8;*!͘ ! >5ͭ͘ ͘ ͭ---  ,,,-xGg?+2n*8t z~,->( x( ͙}. ͇͂ , ! >5,ͣ- o&0% ,͘  }gs }؉}颋.:}8c~I$I~L*ͣٷx˸ }0G,<} ,-(-͂ !>J0 ͙͘ o8 ͇ >( m.`1pF,t6|!wS<.z}[|%FXc~ur1}͇ٯx(<˸ 8 !~J 0/O!>t 8 =  o t͘ ͇ /o 0 ͏-͂ OT0 j oD,:j !I}袋.}8c~I$I~L! >ͭ͘ JØ oo ͘ = ͇ nf^VNF!DLT\I!!53!r1!͓!> x #-= o˸x͇(- }(x>8({ ,{ `iÄ!>( |s |́>)=|(DMbo˸88x(0 8> ́x(>-{(ay( z(>. ( {>E>+|(|Dg>-|/ 0:p# ~# +>0w#,-  60#~˸}րogM| .({ = ~> x0w#xG%͈ %͈ ZJDM%͈ = _~65+~hìx-Sx9?+{Η@}|{ { gZJDM0| ,7}o˸@ #yO!@9i&@  #@w#@/w#@w#!9! E9!!9~(+Fͻ!"9!(#>2*"| >"2:( ͷ *w*6 !\$![ (ͧ( #:~CONTRMKBDLSTCAUXUSR>2j:*ˮ~1:*:(@q##p[* :(  ~* < >26"!"""~>2""v>2>"!"ˮ(!~8>~O6~*"w(6(2(-()(6 (8 0 :(* y(~#+ (( 66 #6 #"*: y~o p .##~ͻ(.6w4._~ =*##55= *[R8*~#"= ͣ}== ͯ}͵}*#w+#~+>*~('l!0(ˮ]l!8ˮ!]~-#8~>27lˮw>O%7̄s #r%ͤ7̐ l ( (ˮ ql(ˮ ( l ˮ*O:~ ##~._q4((=ʦ==ʩ=ʬò*:4^q*##~6ͻ>2}*|(̈́|( ̈́6-#[RM8( G> A~#*(C! !TRUEFALSE!9N#Z~#( G~#> >    "~(lѻ(( !0 (ˮ!!>2S{:1:*6##ww#w$w#w:  ##N#F*B>2w#w#[s#r> "~ͯ*-w#ww##> ͯÂ""~>2:[R0 *4#4>2:[R> *4 #4(> >22*f(/˦:G(##~++ :O x yD!ͻ Q*:G(##~._.͛g<]=<͛*##w ͯ +4 #4x>>2:G("ͯ"*nˮ*0 S[ѷR8@* N#F#s#r- 0})jS\*##w+ N#FB ͯr+s>2!T]>)j)0 0= ^R!#^*^#V#N#F#^#V>2ͱ:1:*6 #-Nw#Fwq#p#6#w#w#w"~Â>">!DM!":*B:!>(>2>">!"2"~ʱ*w#wx(9* :O *-4 #4!*4 #4 *-N#Fq#pV+^Bq#pS[ѷR'* s#r$ s#rM <?*M!\  <( !\$>2>2M:>!(* \$\<(!4: [1ð\!(7"~> 2"S"Ns#FrB(Z#\: \<(?*"}K\! !*}#"}! x \* *>* 2""{_!"*nf}(HR0nf" ^VMDnfutqp*s#r*s#r"* vKB!1>( ~#fo{_"*R0RnfR0KqputsrNF( ^VNF^V*SutKqp R*R(~w~wnf ut"6#L*L*!""*NFy(* "*B0Cnf* [R*"*RS[s#r^#V""6#>O"w2x2*"!G"" 'z*"*>2"*"!G"""!\*: Os!~6go(\R*s#r_2x( s x(T]DMx(R0 U(͞O/o&9q# (!>F0#( ~ ( #]( ~ ( (#}(  i&T-a%ã}ͧo*!~6o&|:2!2}:__{ѯ2*|KB " z ^C User break+=  I/O Run-time error {͵, PC=*ͰNot enough memory Program aborted :m'1!e!FKB>çJ?͜ͻ4____________________MAILING_LABELS__________________ ͜ͻ4 version 3.2 ͜ͻ5 8th Jan 1987 ͜ͻ4 Mailing Label Program ͜ ͜ ͜ ͜ ͜ ͜ ͜ ͜ ͜ͻ4 1986 ͜ͻ4 by ͜ ͜ ͜ ͜ͻ4 J.FRANCIS & Co. ͜ͻ4 52 Chester Square ͜ͻ4 London, England ͜ͻ+ SW1W 9EA ͜ ͜ͻ !#!p#ͻHit > RETURN RETURN < to go Menu, ͜ͻ* Hit > Q < to Quit to C/PM, ͜ ͜!#!p#ͻ OPTION >> !#!q# !ͪ!E ?!ͻ ͜ ͜ ͜ ͜ ͜ ͜ͻ C return to C/PM ͜ͻ& Any other key to return to Menu ͜!#!p#ͻ OPTION >> !#!q# !ͪ!E *&}2*&!C̀E,D+*&!CE-!ͻ!#!@#ͻLine 1. This is a  !ͻͻLine 2. Test to  !ͻͻLine 3. Line up  !ͻͻLine 4. Your paper !ͻͻLine 5. Ready for !ͻͻLine 6. Your final !ͻͻLine 7. Printout !! -!ͻ!#!G# +-!ͻ!#!# +-!ͻ!#!W#!# +-!ͻ!#!@# +?͜ ͜ ͜ ͜ͻ1 C = Clear printer buffer ͜ͻ) X = eXit to C/PM ͜ͻ. Q = Quit to Main Menu ͜ͻ) B = douBlestrike ͜ͻ& O = cOndensed ͜ͻ% E = Enlarged ͜ͻ" D = Draft ͜ ͜ ͜ ͜!#!p#ͻ OPTION >> !#!q# !ͪ!E *&}2*&!C̀Eʎ0-*&!X̀Eʣ0D+*&!B̀Eʸ0-*&!ÒE0.*&!ÈE0<.*&!D̀E0a.*&!Q̀E 1D+?͜ͻ Only Type !#!p#ͻ"Y"!#!q#ͻ to the next question if  ͜ͻ the data is !#!p#ͻ CORRECT !!!!!!!!#!q# ͜ ͜ͻ !#!p#ͻSave data to disk (Y/N) ?!#!q# ͜ ͜ ͜!#!p#ͻ OPTION >> !#!q# !ͪ!E *&}2*&!ỲEu2H$?͜ͻ%ENTER NAME AND ADDRESS, LINE BY LINE. ͜ͻ or  ͜ͻTYPE !#!p#ͻ"END"!#!q#ͻ in First Line TO FINISH ENTRY ͜ ͜ ͜ͻEnter First Line........?  !8<͏ !8;NEND͎!8;Nend͎}oEʛ3D+!8;NEND͡Eʌ6!8;Nend͡Eʌ6͜ͻEnter Second Line........?  !<͏ ͜ͻEnter Third Line........?  !<͏ ͜ͻEnter Fourth Line........?  !<͏ ͜ͻEnter Fifth Line........?  !D<͏ ͜ͻEnter Sixth Line........?  !<͏ ͜ͻEnter Seventh Line........?  !<͏ ?͜ ͜ ͜!#!p#ͻNAME AND ADDRESS IS.....!#!q# ͜ !8;͜!ͫ !;͜!ͫ !;͜!ͫ !;͜!ͫ !D;͜!ͫ !;͜!ͫ !;͜!ͫ ͜ ͜!#!p#ͻ+IF NAME AND ADDRESS ARE CORRECT PRESS!#!q# ͜ͻ, > RETURN < To enter  !E 1?!jN MAILFILE.DATq!j= !j{ v2?͜ ͜ ͜ ͜ͻ4NN NN OOOOOOO TTTTTTTTTT EEEEEEEE  ͜ͻ4NNN NN OOOOOOOOO TTTTTTTTTT EEEEEEEE  ͜ͻ4NNNN NN OO OO TT EE  ͜ͻ4NN NN NN OO OO TT EEEEEEEE  ͜ͻ4NN NNNNN OO OO TT EE  ͜ͻ4NN NNNN OOOOOOOOO TT EEEEEEEE  ͜ͻ4NN NNN OOOOOOO TT EEEEEEEE  ͜ ͜ ͜ͻ.THE INITIALISATION OF THE DATA FILE WILL ERASE ͜ͻ  ALL EXISTING DATA ͜ ͜ ͜ͻ DO YOU WISH TO CONTINUE Y/N ? ͜!#!p#ͻ OPTION >> !#!q# !ͪ!E *&}2*&!ỲEʴ9͍6*&!Y͓E9!??͜ ͜ ͜ͻ2THIS PROGRAM IS TO CREATE AND MAINTAIN A NAME AND  ͜ ͜ͻ2ADDRESS FILE AND TO PRINT THE CONTENTS OF THE FILE ͜ ͜ͻ) IN A FORMAT SUITABLE FOR LABELS !  ͜ ͜ ͜ ͜ ͜ ͜ͻ+1. DO YOU WISH TO CREATE A NEW FILE ? ͜ ͜ͻ+2. DO YOU WISH TO ACCESS AN EXISTING FILE ? ͜ ͜ ͜!#!p#ͻ9YOU MUST ANSWER AS QUESTION 1 ON YOUR FIRST ATTEMPT !!!!!!#!q# ͜ ͜ ͜!#!p#ͻ OPTION >> !#!q# !ͪ!E *&}2*&!1̀E,<6*&!2̀EA<ͮ%!"h!}2"h*h!͓}2*&E=͜!# ?! ! *hR?͜͜͜!#!p#ͻNAME AND ADDRESS SELECTED:-!#!q#͜͜!8;͜!ͫ!;͜!ͫ!;͜!ͫ!;͜!ͫ!D;͜!ͫ!;͜!ͫ!;͜!ͫ͜͜͜ͻENTER OPTION REQUIRED͜͜ͻ 1. PRINT LABEL͜ͻ 2. SELECT NEW NAME͜ͻ! 3. RETURN TO MAIN MENU͜͜!#!p#ͻ OPTION >> !#!q#!ͪ!E*&}2*&!1̀EAI'*&!2̀E1A=*&!3̀ECA!ͥ!8 !ͥ! !ͥ! !ͥ! !ͥ!D !ͥ! !ͥ! !}2!jN MAILFILE.DATq!j=?K&!jJEA!j{͜͜͜!#!p#ͻInput FIRST LINE to Recognize:!#!q#͜͜ͻ0"FIRST LINE " data MUST be exactly as seen !!!!!͜ͻ ^^^^ ͜!u<͏!jN MAILFILE.DATq!j=B> !#!q#!ͪ!E*&}2*&!1̀EE!}2*&EE!jN MAILFILE.DATq!j=!N mailfile.tmpq!=!jͥ!8ͷ!jͥ!ͷ!jͥ!ͷ!jͥ!ͷ!jͥ!Dͷ!jͥ!ͷ!jͥ!ͷ!!^!u;!8;͡EEDA!jJEKE!j{!{!j͔!N mailfile.datͦ?͜ͻ3____________________MAILING_LABELS_________________ ͜ͻ3 version 3.2 ͜ ͜ ͜ ͜ ͜ ͜ͻDO YOU WISH TO  ͜ͻ% 1. INPUT MORE NAMES ? !#!p#ͻEDITORS!#!q# ͜ͻ3 2. PRINT OUT ALL LABELS ? Walter Francis ͜ͻ3 3. PRINT OUT ONE LABEL ? Jules Francis ͜ͻ 4. DISPLAY ALL DATA ? ͜ͻ 5. CHANGE FONT ? ͜ͻ% 6. ERASE ALL DATA ? !#!p#ͻ PROGRAMMER!#!q# ͜ͻ2 7. EXIT TO C/PM ? Jules Francis ͜ͻ 8. DELETE a RECORD ? ͜ ͜ͻ% !#!p#ͻ ENHANCER &!#!q# ͜ͻ% !#!p#ͻDEBUGGER!#!q# ͜ͻ3 Walter Francis ͜!#!p#ͻ OPTION >> !#!q# !ͪ!E *&}2͜ *&!1̀EJv2*&!2̀E(Jd(*&!3̀E=J=*&!4̀ERJ'*&!5̀EgJ̀.*&!6̀E|J6*&!7̀EʑJD+*&!8̀EʦJͮA!9E*&͂!Q͒PEʭJ?!!͜ͻGExiting.............................................BYE For Now Folks!. !ͻ!#!@# EʭJ?!!͜ͻGExiting........................... MAIL32.LBR is an enhanced version of Mail1.LBR (Turbo Pascal) written Program for the creation of Labels . Facilities offered:- 1.Input of names 2.Print out of all labels 3.Print out of one label 4.Display all labels 5.Change of printer font 6.Erasure of all label data 7.Save label data to disk 8.Multiple copies of labels 9.Menu driven 10.Single key operation 11.Error trapping included 12.Deletion of incorrect data records This version is written for the Amstrad PCW 8512. The source file is included as well as the COM file. Below is listed address within the program where changes can be made to convert it for use on other machines running C/PM by using DDT ,ZAP35 or any other disc editor. ADDRESS OSBORNE01 AMSTRAD'S HEX CODES DESCRIPTION ++++++++++ ++++++++ +++++++++++++++++++ +++++++++++ 168 50 5A NUMBER OF COLUMNS ON SCREEN 169 18 1F NUMBER OF ROWS ON SCREEN 16B 02 1B 29 04 1B 45 1B 79 SEND AN INITIALIZATION TO THE TERMINAL. 17B 02 1B 28 06 1B 45 1B 48 1B 31 SEND A RESET STRING TO THE TERMINAL 18B 02 1B 3D 04 1B 59 00 00 CURSOR LEAD_IN STRING 1A2 01 1A 02 1B 45 1B 48 CLEAR SCREEN + HOME CURSOR 1A8 02 1B 48 HOME CURSOR 1AE 02 1B 4C 02 1A 4C INSERT LINE 1B4 02 1B 4D 02 1B 4D DELETE LINE 1BC 02 1B 4B 02 1B 4B ERASE TO END OF LINE 1C2 02 1B 28 02 1B 71 START HIGHLIGHTING 1C8 02 1B 29 02 1B 70 END HIGHLIGHTING W.T.FRANCIS LONDON,ENGLAND  02 1B 28 02 1v}MAIL.PASm o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl([ܶ$=7?Bqg_[g<( #\Z8cw}ͬ2XMGXBq <FjFxjgFx?gL2z֔iUGiO0X>CqjRc_/T]r˰z<6$g-f9y\AMsOޟ_(H'Sᄾ'ΰ9y~~_AxX>y'''ΰ=y쭂t 0p,),1_%.q)g'+H:ô,08 }es0Te݆? GlnCbo3<ba:rYvSXb黩C~fv?<'ǓV#4H{2=Desz|aZ6[\n^gqg{1_и슎p^ 8tЖ)_gMɏ gڒ7E_I znp"fM!m ẙ3HW mɛ"B߬^#R{Eb~m̊3HW mJhK(TB[Fڒ7 ЖQB%%o*-y8tЖ)"x UB[򦈐WOcVAJhK(TB[Fڒ73HW mɛ"Bgem Y̊3HW mɛ"By) nŬ8tЖ)"479֌1+ ]%%o5~M̊3HW mM!5P[<2Lw_bݠdԎ0eQqg|AZЖgWtԆ3HbXkAM1kʴ*S)ӪLlL1+ l1kʴ*SȊ3HW mɛ.=u-S aL>uSo DoYSUBҞg*fMVe 9+ ]%b֔iUPgR1kʴ*SEʊ3HW m5eZ)~ʊ3HW m5eZ)mʊ3HW m5eZ)eʊ3HW m5eZ)Yʊ3HW m5eZ)yʊ3HYSUBV̨8㌳/h\ ’P]Q v,fMVe u8OYqc1kʴ*SEʊ3H'YSUB8tڱ5eZ)mʊ3H'YSUB^8tڱ5eZ)Yʊ3H'YSUB8#3*8l/ ׂq=)ή gnŰ3HwCVAJhKn:.C-'6Sղa[6g^zg}4Ŭ)ӪLL2m3Ŭ8tŬ)ӪL!+ =3H' [=h+fMVe Yq~>P1kʴ*SȊ323bq-[=gWtԆ3H' MSVgqkAX UB[HzU7ocVAJhKiu8OYq*-yS"eM[)+ ]%%o4:MYq*-ySeʊ3HW mɛ" RVAJhKiux UB[H͊32⌳/h\ f4(ή gڒ73HW m@S_mkb1k0tZkAx7Y-)6Ӭ8t/NaO19t{UgqkAaۧ+:j[x1, ҵà5eZ)q֔iUpmgN@5eZ)dř=3H\q6V{|W̚2 -| L28tЖQAJhKnP_ŦY.I2LwLuzgNP;zS,ÔgdFg|AZ.6^qvEGm8t /PAJhKq:b~-*=Bflň=?oYq*-y8tЖ)tJ^hcBF-XZm| UB[ൡؓY5#pV KbYa:C̊3HW mɛ"0Ү]{wⶵB^hcI g1+ ]%%oX5Pv daO X]Xo\Yq*-ySQv$X|m0L+ļ"^j=SbVAJhKni#ޓWVsn%DkzYq*-y8tЖ)"_cu\f,'0-;L=6}7]@ԛ8tћb8t /PAο=-/Yq*-yS4u DK0D'.Ǻ7YqaGS̚28kʴ*S86S̊3H'h [̚2LОZ[3HW mJhK( ^hcgkcwŬ)ӪL!+ *fMVe YqFfTqg|AZ^U]Q^ 8tЖQAJhK/,tv32:fM!P[<| 9^cY UB[Fq*-M}]r* M ڱxs50eQqg|AZ^P]Q ‹a!gڒ7lVAJhK( ]%%o*-yP mJhK( ]%%o_@] ;7gڒ7EטSxCOa vů3HW mhP_T<@ԛ 7Wcevb3ˊ3Hwpdj 63|yd8#3*8l/ ׂ  UB[1iC8?t-bVAJhK~5佘!\aĬ8tЖ)`k{1iC aG UB[!Ť nk}' UB[!Ť ԎO8tЖ)`k{1iCxvZ`McVAJhKl 8&mp)1+Ȍ38l/ ׂ< V786AV( ]%%o ?غAgZ Qq^4a37#F -žfnF23z'1DS2ƷH IFS2؊vgg7N{J*Ȍ38l/ ׂph슎p^ 8tЖ)"zbz'ĺOnM;=%fOkbVAJhK=%mĺM\̈́WnMVAJhK( ]%"BX7uWvQoPxd䍪 UB[*רc9}&+jXtYqn:<:zh*n8tz'7 ЖgpȌ323bq-~OfT]Q ‹a!gڒ7E Y@mlp8Hep}Tv,fM!y. 9fMˀX7u X7+- SUٕݴYq*-yP mT`, , /v)+ ޡ 'ƌ@NɌ ^UA:C8O1t{JWtԆ3Hw _ #)\Q ]%"cI@ /v)+ ]%"cI`:b3bVԎ~ʊ3HW mXXžI:_ fAMަ8tЖ%SI:_ fAM^8tЖ%fO$mL>~7Ex UB[*b0=E҆YAP;zS)+ ‹a!gڒ7 ЖQAJhKM}]Ǯ4v ÙtnMVAJhK( ]%%op UB[)+ ]%%op?eMަ8tЖ)˔gڒ7Ex UB[SVAJhK( ]%%ocfv ,˰e8bԛ8tЖ)"<2Lw_Ls$ jGoe WRA:2 ґgdFg{1_и a-HqvEGm8t /PAvL2:Κ2ζ T̚2 -|b֔iUgɌ323bq-U;IqvEGm8t /PAJhK(TB[Fڒ73HW mɛ"v:{I2HcĬ8tЖ)bu3$tA>F̊3HW mɛ"vt}4A~W1+ ]%%ou: ]CF̊3HW mJhK( ]%%o8= (r*T;+L`UeJbVAJhK/MJ`LM̊3HW mB%%omCL=6}7]o:Yq*- kԱʾÃuzcjo8t7`_7]VA:Mě{JAZ n:|yxaO`Ff8t /PgqkAYW]Q ‹a!gڒ7 ЖQAJhKqzXp,ehb֔Ԕt,鶈Yq*-y8tЖ)b.Un&L6}7n:_az*SYq*-y8tЖ)"+;4XY3pWNu XK:Yq*-yP mJhK(TB[Fڒ73HW mɛ"a㦿S24S@.ƪLW/bVAJhK( ]%%oxqmCL=&h:_TvO*Sgڒ7 ЖQAJhKM}]ǛÄ;K4 ;p-* 4!7Yq*-y*-y8tЖ5_NeĺA ڱxs5}gzh*ϊ3Hw' :vړ  E=%ޏ;IqFfTq^4s86AַN>( ߕ}Nk@3wNP3we_CVA;} gWtԆ3{Жũ(8bXο=-? ޢg~ϏP mXM/uS_ױDKaE D z,DSzg 3* UB[FUB[Fqyڒ7Ed75A&mX] C#9S¬);BwǬ8W mɛ"BtOhSs,j3bVAԎś#=͊3{0)fMVe u5e:g-֖YSUBVA#3*Ȍ38ۋƵ \ mܐ슎pw>qaGS̚28kʴ*S86S̊3H'h [̚2 -Bq&hO m?W4L28t ?5eZ)dB%%ogڒ7Eu,~m* KZ̏FźAɊ3HW mMZÄTv?alma 럢0|.fM!bVAJhK( vXMVAvL2:Κ2ζ L28rVa엊3H'YSUBSVA:AX̚2p jb֔iUP)+ v,fMVe ux jb֔iUP)+ v,fMVe ux jb֔iUP)+ΰ6V{,'<)ΰbXB%%ogڒ7ES_ױkfME.CHa3?ĺ7Yq*-yP mMSVAJhK"eM8tЖ)۔gڒ7Ex UB[RVAJhKyʊ3HW mJhK( ]%%o),_Nea^ݕ˰Yq*-y8tЖ)"$;?.e7!5!Ŭ8tЖ)"$8!̈́.FB̊3HW mɛ"Bg2LwSYSv.f UB[*רc9}&+jX]gG'X@EYq}<žf4@q}"ž ) ޡz ޏd8?qFfTq^4ᵰ+:jTܶﴧ:8tЖVtQgRqjӞ.p?eTܶﴧ:MYq*-;/SVAJhKmN{ógRqjӞ.b֔iUPYSUٶbVA:Ab֔iUgZ ]!Bqc1kʴ*Syʊ3H'YSUB.RVA:AX̚2p?eԎŬ)ӪLoSVA:AX̚22eԎŬ)ӪLRVA:AX̚2~=]~=}̊3H'RqjӞ.LОZԎŬ)ӪL)+ v,fMVe uHYqc1kʴ*SgNP;L2:MYqc1kʴ*S˔gNP;L2:+ ]NE;Pw}VAJhK( ޡz GS2h{2  E=%KmWA:C8AaORhcgNw=NFS2aۧ3Hw'/#)Ȭ* ޡz >dQӞgNw=NGS2xVq}{JK%Qqg]Q ݌ZqfdgZȬ/gkczh*a?8t /PA;>gڒ7E ߴx&p} t 3|?Yq*-ySM͊32JL`UeJbVAJhK/MJ`LM̊3HW m This is the release date of the disk. !K"K$K%K&K'K(K)K+K,K-K.K/K2K3K4K5K6K7K8K9K:K;KK?K@KAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK[K\K]K^K_K`KaKbKcKdKeKfKgKhKiKjKkKlKmKnKoKpKqKrKsKtKuKvKwKxKyKzK{K|K}K~KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLINPUT .INC 9E B7 3584 28 INPUTSCR.INC 93 02 896 7 INSTALL .PAS 53 F1 2944 23 IOERR .INC 5F 6E 1408 11 MAINBODY.PAS A0 B2 3968 31 MENU .PAS 89 2B 4736 37 NEWFILE .PAS 4A DE 1408 11 PRINTER .PAS B5 12 9216 72 PRINTREC.INC 87 CA 896 7 READ0 .INC AE 47 384 3 READKEY .INC 6D 02 1408 11 RETRIEVE.PAS 36 3E 7808 61 SETCARD " Fog Library Disk FOG-CPM.166 Copyright (1987) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Disk 2 of 2. Conclusion of Cardfile as well as two other small menu-driven programs. Filename Description -03-00 .87 This is the release date of the disk. -CPM166 .DOC This is the description of the disk contents. DATASCR .INC F6E3 3K [Cardfile 16 of 44] DISPLSCR.INC 9E03 1K [Cardfile 17 of 44] EDITSCR .INC D54B 7K [Cardfile 18 of 44] EXTRACT .PAS 47C5 12K [Cardfile 19 of 44] FILECARD.NOT D34A 11K [Cardfile 20 of 44] GETCARD .INC 8DF9 1K [Cardfile 21 of 44] HELPSCR .INC FB6F 2K [Cardfile 22 of 44] INITVAR .INC EDC2 1K [Cardfile 23 of 44] INPSCR .INC 498C 1K [Cardfile 24 of 44] INPUT .INC 9EB7 4K [Cardfile 25 of 44] INPUTSCR.INC 9302 1K [Cardfile 26 of 44] INSTALL .PAS 53F1 3K [Cardfile 27 of 44] IOERR .INC 5F6E 2K [Cardfile 28 of 44] MAINBODY.PAS A0B2 4K [Cardfile 29 of 44] MENU .PAS 892B 5K [Cardfile 30 of 44] NEWFILE .PAS 4ADE 2K [Cardfile 31 of 44] PRINTER .PAS B512 9K [Cardfile 32 of 44] PRINTREC.INC 87CA 1K [Cardfile 33 of 44] READ0 .INC AE47 1K [Cardfile 34 of 44] READKEY .INC 6D02 2K [Cardfile 35 of 44] RETRIEVE.PAS 363E 8K [Cardfile 36 of 44] SETCARD .INC 3957 1K [Cardfile 37 of 44] SORTFILE.PAS A4C0 5K [Cardfile 38 of 44] TEMPLATE.PAS 1008 1K [Cardfile 39 of 44] UNDELETE.PAS F5F6 4K [Cardfile 40 of 44] VARIABLE.INC 7BFA 2K [Cardfile 41 of 44] WRITREC .INC 7C37 1K [Cardfile 42 of 44] WRTCARD .INC E9D4 1K [Cardfile 43 of 44] WRTTAG .INC D327 1K [Cardfile 44 of 44] CHOOSE .COM 8D4C 13K [Choose 1 of 3] Choose helps you make your decisions by assigning weights to your priorities and calculating your best alternatives. Pascal source code is included (Squeezed). CHOOSE .DOC 9172 3K  [Choose 2 of 3] CHOOSE .PQS D193 7K [Choose 3 of 3] MAIL .COM F22E 19K ver. 3.2 [MAIL 1 of 3] Menu driven program to create mailing labels. Includes documentation and patch points for terminal installation. Comes complete with Turbo Source code (squeezed). MAIL .NOT DA92 2K ver. 3.2 [MAIL 2 of 3] MAIL .PQS F372 10K ver. 3.2 [MAIL 3 of 3]  Pascal source code is included (Squeezed). CHOOSE .DOC 9172 3K #$%&'