s  DESK-DM.BAS3 ********************************************3( ********* DESK MASTER Main Program *********32 ************* by Leon LJ Starr *************3< ********************************************2F Copyright 1982, Personal Computing Magazine3P ********************************************Zd nx *** CONSTANTS ***LC()(E)()(H)R( )B()B(): clear screen,return,backspace,and backup characters1E()B() ESC and BELL keys9U"_"B" "N"" Underscore,blank,nullLSPFF screen,printer, and disk device codesBPBTSF page size,top margin,screen widthM"DESK MASTER"IN()(p)OF()(q) /OS Output to the screen default  ?   Bypass GET LINE routine. GET LINE HERE FOR SPEED. *** GET LINE ***" IMPORT: LN,FC,LC,WR$,TI$, EXPORT: T$,EC$6K@ENW Start line out with word wrap (null at first)8JFB Field character (blank or underline)1T W"WRAP"  L U;=^ W"WRAP"  L B;FU7h W; Wrapped word from previous line, if anyr(W)WN|v() B B@ R T"TIME" BTN & E E"ESC"  R  L ((()F)(()L)) B  |" B  r  ;- B  N rA B  x(,) |I L T"TIME" TN 7 L W"WRAP"  ) L B  ; L B  &  |WN& *** WORD WRAP ***0 IMPORT: T$,LN: EXPORT: T$,WW$DNLLXLWN$b(,,)l B;B;B;Tv B F;BW|(,L)x(,)   b- ()L x(,L), *************************************% *** TRANSLATE TO UPPERCASE ***% IMPORT: LW$ (lowercase string)% EXPORT: UP$ (UPPERCASE STRING)UN  (L) (L,,)) "Z" (() ) UU4  *** DECLARATIONS, continued from line 650 ***! *** ARRAY DECLARATIONS ***  *B2F(/4 (B), L(B) text buffers&> F(F) file index table*H --- Calendar Array Declarations ---"R () calendar numbers\ M( ) month sizesf M( ) month namesp D() day names5z F(),L(),F() date input fields. ***************************************. ********** MAIN PROCESS ***************. *************************************** *** MAIN MENU *** /NO 6 MENU GENERATOR C"W" $  C"F"   C"A" T \ C"C" C    ();"Getting calculator..." "CALC-DM.BAS"# C"I" "DDISK-DM.BAS"& C"Q" CE #M"Choice not on the menu"  End with ESC C;. **************************************$ *** MEMO MENU ***.P"memo"T".MEM"%8O 6 MENU GENERATOR-B C"E" N"NUMBER" & 8L C"C"  8V C"P"   8` C"S"   8j C"R" < 8$t C"L" J  p  8~ C"D" T 8& C"Q" CE #M"Choice not on the menu" 8 End with ESC'   if buffer empty  C 4 "In case you haven't already, would you like"4 "to save your memo in a disk file before the"" "buffer is erased? (Y/N) ";!Lv() U" "N" C"S" `!M"Buffer erased". *************************************** . ********* CARD FILE MENU **************T".CDX"$(O 6 MENU GENERATOR2P"file"< C"C" & (FP"card"P C"A"  ( Z C"F"  (dP"file"n C"D" T ($x C"L" J  p  (& C"Q" CE #M"Choice not on the menu"$ ( End loop with ESC/Q/q . ***************************************" *** CARD FILE FIND MENU ***ON option$O 6  MENU GENERATOR" C"D" O"DISPLAY"! C"E" O"DELETE"  C"P" O"PRINT"6 C"D" C"E" C"P"  & C"Q" CE %M"Choice not on menu" /" ****************************************,6 *** MENU GENERATOR ***@ IMPORT: ME$,DATA J EXPORT: CH$,EC$T &^ C Error or status message(h MN M"DESK MASTER"Mr MN " *** ";IN;M;OF;" ***"| MN MN ( for each menu number O+  O for each option ( O ();  * O  if wrong menu& "Select one of the above: "; "Lv() CU. ***************************************& *** INPUT TEXT *** 0 IMPORT: PR$,TI$,NM$,TY$,T: EXPORT: L$(),T,ME$D$N  T".MEM" vAX  "Okay to erase current contents of buffer? (Y/N) ";$b Lv() U+l "Y" M"Canceled" *+vENWN wrapped word  C  "Enter your ";P;":"3 "Hit the key when you are finished."LSW T"TIME" "Enter a valid time such as 7:30 AM." "Time (HH:MM AM/PM): "; & for each input line1 N"NUMBER" H NUMBER MARGIN  W"WRAP"LS, T"TIME" WNL* F L  GET LINE () E"ESC"  B ,  B M"Text buffer full" NN*-4 **************************************>H *** NUMBER MARGIN ***R IMPORT: L\ EXPORT: MA$fMB"()B$p  M"()B z M;, ************************************* *** CHANGE LINE ***$ "Number of line to change: ";EN.G"NN"F()L()  E"ESC"  &(F())?   "No line with that number!"  1 "Hit (ESC) or (RETURN) when finished:" H NUMBER MARGIN8 LSF L () . ***************************************$ . *** PUT TEXT BUFFER ***8 IMPORT: L$(),T,OUB EXPORT: ME$ L MN CLEAR MARGIN0V OF OF O,` MN  j   t N"NUMBER" H9~ OF OF O,() MN  $ OS ()1 OP () ()9 (()) OS p   OSNN , ************************************* *** PRINT TEXT BUFFER *** IMPORT: L$(),T,TY$ C.  M"Nothing to print" F    L ( );"Make sure the printer is ON. Press any key when ready." v()*( T".MEM"  T!2 OP .  PUT TEXT8< IF TY$=".MEM" THEN FOR N=1 TO PS-T-TM:LPRINT:NEXTF /P ****************************************Z d *** PUT INDEX ***n IMPORT: FI$,FT(),FL,ME$x EXPORT: ME$ "O",#F,F  F F,F()  #F . ***************************************  *** ADD TO INDEX *** IMPORT: FT$(),L3,EX,F$ EXPORT: FT$(),L3,ME$  E ,  F(L)( LF F(L)"0L" LL" d  PUT INDEX, .6 ***************************************@ J *** GET INDEX ***T IMPORT: TY$#^ EXPORT: FI$,L3,FT$(),FL,ME$h r EN&| T".MEM" F"MEMINDEX"& T".CDX" F"CDXINDEX"& T".APT" F"APTINDEX"0 T".APT" C;P;"s on disk:"  "I",#F,F/ LF default for last element  F F,F()L F()"0N" F()"0L" T".APT" F()' F()"0L" L = L T".APT" "No ";P;"s";" yet." #F . *************************************** & *** DOES FILE EXIST ***0 IMPORT: FT$(),L3: EXPORT: EXD 3N E Default 0 for non-existence of fileX  L&b F() El v , ************************************* *** GET FILE NAME *** IMPORT: CF$ EXPORT: F$,EC$,ME$  ENMN J  GET INDEX MN R i N  "Do you want the ";;" ";P;"? (Y/N) "; Lv() U% E E"ESC" R $ "N" N * &  "Enter a ";P;" name: "; WN/ LF L  GET LINE3 E"ESC" N E"ESC" R 0 L Ux(,)i "A" "Z" "(First character must be a letter)." B;"Please try again...";  * &  FILE EXISTS 4 O> (C"SHOULD BE" C"NO MATTER") E M"No such file"H (C"SHOULDN'T BE" C"NO MATTER") E (); "Still want to delete ";;"? (Y/N) ";Lv() U "Y" M"Canceled"R 0\ *****************************************f p *** WAIT FOR RESPONSE *** z $ "Hit any key to continue..."; v() . ***************************************  *** WAIT MESSAGE *** C;    ();"Please wait..." , *************************************  *** SAVE FILE ***EN.  M"Nothing to save" /C"SHOULDN'T BE"   GET FILE NAMEI$ LF E M"No more "P"s allowed" +. E"ESC" M"Canceled" 8 MN B   WAIT MESSAGEL ();"Writing..."V "O",#F,T%` MN #F !jOF .  PUT TEXTt #F~ MN  M"Saved as: "   ADD TO INDEX+ ************************************ *** GET TEXT *** IMPORT: OU  EXPORT: L$(),T,ED$EN& (O) E"EOF"  O,    O,()  OS,( *************************************2< *** LOAD FILE ***FEN-PC"SHOULD BE"   GET FILE NAME+Z E"ESC" M"Canceled" d   WAIT MESSAGEn ();"Reading..."x "I",#F,T"OF  GET TEXT #FM" retrieved."- **************************************  *** DELETE FROM INDEX *** IMPORT: EX,FT$(),L3$ EXPORT: ME$ (from PUT INDEX)EN- EF F(F)"0L" " E F! F()F()D F(F)"0L" F(F)"0N" F(F)"0N"F F(F)"0L" F(F) "0N" F(F)"0L""LL, d  PUT INDEX6.@ ***************************************JT *** DELETE FILE ***^ENhC"NO MATTER"r T".APT" |   GET FILE NAME, E"ESC" M"Canceled"  MN    WAIT MESSAGE" () ();"Deleting..." T  DELETE INDEX MN  C   T".APT" & P;": ";;" deleted."= "Delete another? (Y/N) ";Lv() U "Y" r$ E M"Canceled". ***************************************& *** CREATE FILE ***0 IMPORT: F$,TY$: EXPORT: ME$DEN/NC"SHOULDN'T BE"   GET FILE NAMEIX LF E M"No more "P"s allowed" +b E"ESC" M"Canceled" )l "O",#F,T #Fv MN    ADD TO INDEX MN M"Created "& E M"Cleared "- **************************************$ *** APPEND BUFFER TO FILE *** IMPORT: F$,L$(),T,TY$ EXPORT: ME$ENT  L()()T Save buffer for appending "O",#F,"TEMP" "I",#F,T$  OF  GET TEXT E"EOF" 4*  OF .    PUT TEXT * MN  p94  T()L()T&>OF .  append bufferH #F,#FR MN p'\ T "TEMP" T&fM"Appended to "" file"p-z ************************************** *** KEY/ORDER MATCH *** IMPORT: KE$,L$(),T,FU$ EXPORT: GI$GN' K"*" G"GOT IT" 9 F"ORDER" KK G"GOT IT" * F"ORDER" KK  1 ()K G"GOT IT"   FN- ************************************** *** FIND CARDS ***$EN.F"NOT FOUND"8P"file"=BC"SHOULD BE" T".APT"   GET FILE NAMEL T".APT" `+V E"ESC" M"Canceled" n` MN nj "I",#F,T-t O"DELETE" "O",#F,"TEMP"~ MN  n T".APT"  C  / "Enter a key line below to search for: "1 "(To match ALL cards, just type an '*')"(LSF L 6 E"ESC" M"Canceled" #F nK!OF  GET TEXT E"EOF" 2  MATCH@ G"GOT IT" O"DELETE" OF .   MN  n G"GOT IT"  F"FOUND". O"DISPLAY"  .  PUT TEXT. O"PRINT"    PRINT TEXT(  END WITH EOF(F1),2 F"NOT FOUND" M"Not found"E< F"FOUND" T".APT" O"DISPLAY" p  PAUSEF #F"P O"DELETE" #F:Z O"DELETE" T "TEMP" TEd T".APT" O"DELETE" M"Matching cards deleted"nOS+x ************************************ *** GET DATE FIELDS *** IMPORT: GD$,FV(),LV() EXPORT: FE()EN(G) U;U;(  "/"; $  (G) B; 3 WNLF0L9  E"ESC" ,& &()F()+ () F()"0"S F() L()  "Bad value; try again..." : (((G)((G)))) "/"; 6" |(G,)"YY" F()"19"F(),/6 ****************************************#@ *** APPOINTMENT CALENDAR ***!J *** READ CALENDAR DATA *** T C;^h Skip past menusr  | O !  O , Now read the calendar data statements.   () Calendars0    M() Month sizes0    M() Month names.   D() Day names1ENP"appointment"T".APT" DELETE OLD APPOINTMENTS   1 "So that PAST appointments can be erased,") "please enter the CURRENT date: ";G"MM/DD/YY"&F()F()F()=9L() L()L()c  GET DATE& E"ESC" R/0F"C"|(F(),)F()F(): J  GET INDEXD MN R(N For each appointment file/X L  No appts anyway6b Delete appointment if older than current date =l FF() F() &  T Nv X C   " "Display or Print (D/P)? ";8Lv() CU CE RC"DISPLAY", C"P" C"PRINT"OP *** MAKE CALENDAR *** C   ( "Enter Month and Year to view: ";)G"MM/YY"F()L() -F()=L()c  GET DATE E"ESC" R*M&(F())Y&(F())"MF()YF() C  (  ();"Getting Calendar..."  *** CALCULATE INDEXES ***  Find calendar*YY&4 Y YY 4>C(Y)H Find the month nameRMM(M)\ Is it a leap year?f C M()$pFC first day of yearz C FC/WF week day counter, (modulo 7)! count up to selected month ! for each month M  M * MM for each month-day, WW and each week-day0 W W start week over  MM()  M  *** DISPLAY CALENDAR ***,DW save for fast re-display C; OP A ();IN;"<<< ";M(M);" ";Y;" >>>";OFC$ OP (!);"<<< ";M(M);" ";Y;" >>>"%.   ();D();+8 OP ();D();BL OP V (O,"-")#` OP (O,"-")>j ( (W)); OP ( (W));tME~MMCNCONCONCPN0M"(M)M|(M,(M))! M M"0"M9"C"|(Y,)MM &  FILE EXISTS M  M  G E OS C( )INCOOF] E OP C( )INCOOFCO"["CP"]" W  M ();+ M OP (); M  4 (); OP ();  W B M C" "|("(M),("(M)))CO;Q M OP CO" "|("(M),("(M)))CP;( M <q2 C|("(M),("(M)))CO; OP CO|("(M),("(M)))CP;&<  OP (); F  E PWW7Z W W OP  d MM() ~n OP x (O,"-")! OP (O,"-"). ***************************************) *** MAKE OR DELETE APPOINTMENT ***  GET DAY FILE NAMED E"ESC" OSC"DISPLAY"  ANOTHER DAY LF E C   "No more appointment days allowed..." "Either use another data disk, or erase" "some old appointments." p WD "  DISPLAY APPOINTMENTS; "(M)ake or (D)elete appointment or (ESC) to quit? ";"Lv() CU C"M"   C"D" v 2 CE WDCN ( "Bad choice. Try again..." / ****************************************! *** DETERMINE DAY FILE *** IMPORT: MM,YY5" "To View, Make, or Delete appointments, enter"1, "the appropriate DAY. Hit (ESC) to quit."6 "Which day? ";@@G"DD"F()L()M()  GET DATEJ E"ESC" |TD&(F())(^"C"|(Y,)MF()h J  GET INDEXr &  FILE EXISTS|/ ****************************************# *** DISPLAY APPOINTMENTS ***  C &  FILE EXISTS[ E "No appointments for: ";M();" ";"(D);", ";Y b "I",#F,T" C"PRINT" OP@ "Appointments for: ";M();" ";"(D);", ";Y (O,"-")P OP "Appointments for: ";M();" ";"(D);", ";Y! OP (O,"-")!OF  GET TEXT E"EOF" 0" C"PRINT" OP OP  .  PUT TEXT MN b&  end with EOF(F1)"0 C"PRINT" OP: (O,"=")%D OP (O,"=")NOSX #Fb/l ****************************************!v *** DELETE APPOINTMENT ***\ "Enter appointment TIME: ";LF L  E"ESC" 2KO"DELETE"  DELETE CARD MN M F"NOT FOUND" "Appointment ";MMN     DELETE EMPTY DAY+ ************************************ *** MAKE APPOINTMENT ***$T"TIME" & INPUT TEXT ()"" R3 "Would you like to change this? (Y/N) ";6Lv() U E R% "Y"  CHANGE TEXT> x((),)B ()|((),(()))Kx((),)$  (K) K"0"K0 x(K,)"12" K"00"|(K,)" K|(K,)x(K,)%* transfer text to insert buffer84  L()()T> p INSERT CARD3H E MN   ADD TO INDEXR+\ ************************************f$p *** INSERT CARD INTO FILE ***&z IMPORT: L$(),T,L2$(),T2,F$,TY$ EXPORT: ME$ENNNF"NOT FOUND" "I",#F,T "O",#F,"TEMP" MN  * N"NOFILE" NN j !OF  GET TEXT E"EOF" jKx((),)$ (K) K"0"K0 x(K,)"12" K"00"|(K,)"K|(K,)x(K,)*F"ORDER"  KEY MATCH/ORDER1 G"GOT IT" F"NOT FOUND" V F"FOUND".$ F,T MN  C.  TF,L() MN 8 OF . "B MN  L  0VOF .  MN   `  j F"NOT FOUND" .t F,T MN  E~  TF,L() MN     #F,#F' T "TEMP" T0 ***************************************** *** CHANGE TEXT ***EN/  M"Nothing to change"   C* MN "*** ";M;" ***" MN MN $N"NUMBER" .  PUT TEXT<( "(C)hange, (I)nsert, (D)elete, (A)ppend, or (ESC) ?";"2Lv() CU<IF C"I" B M"No more space in the buffer" P C"C"  Z C"I"  d C"D" h n C"A" D  &x CE CN M"Choice not on menu"  end with ESC. ***************************************  *** INSERT A LINE ***- B M"Buffer full" J* "Line number at which to insert: ";MG"NN"F()L()  GET LINE NUMBER (DATE FIELD) E"ESC" J&(F()):   ()() H NUMBER MARGIN5W"WRAP"LSF L  ()", E"ESC" J6 B ,@ B M"Text buffer full"J-T **************************************^h *** DELETE LINE ***!r "Line number to delete: ";.|G"NN"F()L()  E"ESC" &(F())3  ()(), *************************************  *** ADD CARD TO FILE ***N"NUMBER" &8 "Would you like to change this card? (Y/N) ";!Lv() U& "Y"  CHANGE TEXT* E M"Canceled" & 6 C"SHOULD BE"P"file"  P"card"+ E"ESC" M"Canceled" &   APPEND TEXT& .0 ***************************************: D *** APPEND LINE ***2N B M"Text buffer full"  X b H NUMBER INDENT5l W"WRAP"LSF L v () E"ESC" N  + ************************************  *** DELETE EMPTY DAY *** "I",#F,T7 (F) #F T Delete day file #F- ************************************** # ****** ERROR HANDLING ******7 5 N"NOFILE"  File does not exist # = M"Disk Full" ! 9 "Unrecoverable disk error encountered. Re-start program." "Once Desk Master is running again, do not switch" "when you are instructed to do so."@ ! @ "Bad character in file name. See CP/M manual." 4! 5 "Check disk; file not found on it."  ! *! .4! ***************************************.>! ********* INTERNAL PROGRAM DATA *******.H! ***************************************R!\! *** MENU DATA ***f! --- MAIN MENU ---+p! 6,"Write MEMO (W)" *z! "CARD File (F)"*! "Appointment CALENDAR (A)"*! "CALCULATOR (C)"*! "Create INDEX Files (I)"+! "Quit DESK MASTER Program (ESC)"! --- MEMO MENU ---*! 8,"Enter MEMO (E)"*! "Change OR View MEMO (C)"*! "Print MEMO (P)"*! "Save MEMO on Disk (S)"*! "Retrieve MEMO from Disk (R)"*! "Delete MEMO from Disk (D)"*! "List MEMO Names on Disk (L)"+! "Return to MAIN MENU (ESC)"" --- CARD FILE MENU ---*" 6,"Create CARD File (C)"*" "Add CARD to File (A)"*$" "Find CARD(S) in File (F)"*." "Delete FILE from Disk (D)"*8" "List CARD files on Disk (L)"+B" "Return to MAIN MENU (ESC)""L" --- CARD FILE FIND MENU ---*V" 4,"DISPLAY Matching Cards (D)"*`" "ERASE Matching Cards (E)"*j" "PRINT Matching Cards (P)"+t" "Return to CARD FILE MENU (ESC)"+~" ------------------------------------" --- CALENDAR DATA ---," CALENDARS (INDEXES), from phone bookC" 13,1,2,3,11,6,7,1,9,4,5,6,14,2,3,4,12,7,1,2,10,5,6,7,8,3,4,5" MONTH SIZES*" 31,28,31,30,31,30,31,31,30,31,30,31" MONTH NAMES1" "JANUARY","FEBRUARY","MARCH","APRIL","MAY"3" "JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER"" "NOVEMBER","DECEMBER"." "Sunday","Monday","Tuesday","Wednesday"%" "Thursday","Friday","Saturday"." ***************************************)# and they lived happily ever after.%" "Thursday","Friday","Saturday"." ******************