LnSOS BOOT 1.1 SOS.KERNEL SOS KRNLI/O ERRORFILE 'SOS.KERNEL' NOT FOUND%INVALID KERNEL FILE: xةw,@  ȱlmi8#)!)O^±±*SOS.INTERP 4ke6! *SOS.KERNEL ,V6!a.SOS.STATE.TEXT8 ! -STR2REAL.CODE1 !2 -STR2REAL.TEXT)P!0 %SEG.T j'Ÿ/ {/MUSIC.TEST.CODEf))/MUSIC.TEST.TEXTb((*MUSIC.TEXTE8..)DISK.INFOj+(@, 68*SOS.DRIVER 4'Z.SOS.HEART.TEXT ! III.PCL.13u' DISKNAME.DAT66FLASHNAME.DAT G66HELLO 6/ *HELLO.TEXT6*MENU.MAKER  }&>*MUSIC.CODEA >dLԡm#i㰼m#iЕOLԡȱfg hi !dLԡ憦  Ljmkm l y`2 Lԡ8(Je稽)ʈ@L  !"#$%&'()*+,-./---------------------------------- | Routine : kill_character | Purpose : Remove all occurences of a character from a string | Input : a_string - String to remove characters from | char_to_kill - Character to remove | Output : a_{ ===================================================================== ||| UTILITY ROUTINES ||| ===================================================================== } { ----------------------------------- g_UserIsDone : BOOLEAN; { User termination flag } g_NumericString : t_String; { User's numeric string } g_FPValue : t_FPNumber; { Conversion result } g_FPError : t_FPError; { Conversion error } { A floating point number } t_FPError = (fp_None, { Error - None } fp_NullString, { Error - Empty string } fp_BadCharacter); { Error - Invalid string character } VAR *************************************************************** } PROGRAM Convert_String_to_REAL; {$I-} CONST k_Debug = TRUE; { Enable or disable debugger } TYPE t_String = STRING[63]; { A string } t_FPNumber = REAL; * * 12e+9 * * .12345 * * * ****** * * * <+|-> <.> [<+|->] * * * * Examples: -123.456E-7 t value. * * An error is returned if the string is invalid. * * * * String format: * omputer....: Apple /// * * * * Purpose.....: Convert a string representing a floating point * * number into a floating poin * * Author......: David T. Craig [736 Edgewater, Wichita KS 67230] * * Date........: 1985 * * Language....: Apple /// Pascal 1.1 * * C  { ********************************************************************* * * * Program.....: Convert_String_to_REAL * * string - String with specified character removed --------------------------------------------------------------------- } PROCEDURE kill_character(VAR a_string : t_String; char_to_kill : CHAR); VAR char_string : STRING[1]; { A character string } BEGIN { kill_character } IF (LENGTH(a_string) > 0) THEN BEGIN char_string := '?'; { Setup kill character string } char_string[1] := char_to_kill; WHIs } tail : t_String; { Tail (fraction) digits } exp_sign : t_Sign; { Sign of exponent digits } exponent : t_String; { Exponent digits } { --------------------------------------------------------------------- positive); VAR result_number : t_FPNumber; { Result of conversion } c_index : INTEGER; { String character index } head_sign : t_Sign; { Sign of head digits } head : t_String; { Head digit VAR error : t_FPError) : t_FPNumber; { String format: <+|-><.><+|-> } TYPE t_Sign = (negative, { Number sign } the | converted value, else the converted value is unspecified. --------------------------------------------------------------------- } FUNCTION string_to_number( num_string : t_String; r | Purpose : Convert a numeric string to a floating point value | Input : num_string - Numeric string to convert | Output : error - Conversion error result (fp_NoError --> ok) | If no error occures, then string_to_number returns ======= ||| STRING TO NUMBER CONVERSION ROUTINE ||| ===================================================================== } { --------------------------------------------------------------------- | Routine : string_to_numbe fp_BadCharacter : e_phrase := 'Invalid character in string'; END; IF (LENGTH(e_phrase) > 0) THEN WRITELN('*** ERROR : ',e_phrase); END; { show_FP_error } { ==============================================================Error phrase } BEGIN { show_FP_error } CASE fp_error OF fp_None : e_phrase := ''; { All is well } fp_NullString : e_phrase := 'String is empty'; rsion error | Input : fp_error - Error which occured | Output : Error phrase displayed --------------------------------------------------------------------- } PROCEDURE show_FP_error(fp_error : t_FPError); VAR e_phrase : t_String; { c_index - 1; END; UNTIL (c_index = 0); END; END; { uppercase_string } { --------------------------------------------------------------------- | Routine : show_FP_error | Purpose : Display floating point string conve IF ((a_string[c_index] >= 'a') AND (a_string[c_index] <= 'z')) THEN a_string[c_index] := CHR(ORD(a_string[c_index]) - ORD('a') + ORD('A')); c_index :=_string(VAR a_string : t_String); VAR c_index : 0..255; { String character index } BEGIN { uppercase_string } IF (LENGTH(a_string) > 0) THEN BEGIN c_index := LENGTH(a_string); REPEAT BEGIN Uppercase all lower case letters in a string | Input : a_string - String to uppercase | Output : a_string - String with all lowercase letters uppercased --------------------------------------------------------------------- } PROCEDURE uppercaseLE (POS(char_string,a_string) > 0) DO DELETE(a_string,POS(char_string,a_string),1); END; END; { kill_character } { --------------------------------------------------------------------- | Routine : uppercase_string | Purpose : } PROCEDURE bump_char_index; BEGIN { bump_char_index } c_index := c_index + 1; END; { bump_char_index } { --------------------------------------------------------------------- } FUNCTION get_character : CHAR; BEGIN { get_character } get_character := num_string[c_index]; END; { get_character } { --------------------------------------------------------------------- } FUNCTION valid_character(VAR fp_error : t_FPError) : BOOLEAN; B { Point at the next character } terminator_found := FALSE; IF NOT(end_of_string) THEN { Parse the following digits } REPEAT BEGIN IF NOT(valid_character(fp_error)) THEN terminator_foundng); VAR terminator_found : BOOLEAN; BEGIN { get_digits } fp_error := fp_None; { Initialize return error } a_string := '?'; { Parse the 1st digit } a_string[1] := get_character; bump_char_index; get_sign := positive; bump_char_index; END; { get_sign } { --------------------------------------------------------------------- } PROCEDURE get_digits(VAR fp_error : t_FPError; VAR a_string : t_Stri; { e_found } { --------------------------------------------------------------------- } FUNCTION get_sign : t_Sign; BEGIN { get_sign } IF (get_character = '-') THEN get_sign := negative ELSE IF NOT(end_of_string) THEN BEGIN IF valid_character(fp_error) THEN e_found := (get_character = 'E') ELSE e_found := FALSE; END ELSE e_found := FALSE; ENDLSE period_found := FALSE; END; { period_found } { --------------------------------------------------------------------- } FUNCTION e_found(VAR fp_error : t_FPError) : BOOLEAN; BEGIN { e_found } fp_error := fp_None; fp_error := fp_None; IF NOT(end_of_string) THEN BEGIN IF valid_character(fp_error) THEN period_found := (get_character = '.') ELSE period_found := FALSE; END E ELSE digit_found := FALSE; END; { digit_found } { --------------------------------------------------------------------- } FUNCTION period_found(VAR fp_error : t_FPError) : BOOLEAN; BEGIN { period_found } } fp_error := fp_None; IF NOT(end_of_string) THEN BEGIN IF valid_character(fp_error) THEN digit_found := (get_character IN ['0'..'9']) ELSE digit_found := FALSE; END FALSE; END ELSE sign_found := FALSE; END; { sign_found } { --------------------------------------------------------------------- } FUNCTION digit_found(VAR fp_error : t_FPError) : BOOLEAN; BEGIN { digit_found BEGIN { sign_found } fp_error := fp_None; IF NOT(end_of_string) THEN BEGIN IF valid_character(fp_error) THEN sign_found := (get_character IN ['-','+']) ELSE sign_found := nd_of_string } end_of_string := (c_index > LENGTH(num_string)); END; { end_of_string } { --------------------------------------------------------------------- } FUNCTION sign_found(VAR fp_error : t_FPError) : BOOLEAN; valid_character := FALSE; fp_error := fp_BadCharacter; END; END; { valid_character } { --------------------------------------------------------------------- } FUNCTION end_of_string : BOOLEAN; BEGIN { eEGIN { valid_character } IF get_character IN ['+','-','0'..'9','.','E'] THEN BEGIN valid_character := TRUE; fp_error := fp_None; END ELSE BEGIN := TRUE ELSE BEGIN IF NOT(digit_found(fp_error)) THEN terminator_found := TRUE ELSE BEGIN a_string := CONCAT(a_string,'?'); a_string[LENGTH(a_string)] := get_character; bump_char_index; END; END; END; UN; WRITELN('DEBUG: tail = "',tail,'"'); WRITE ('DEBUG: exp_sign = '); show_sign(exp_sign); WRITELN('DEBUG: exponent = "',exponent,'"'); END; { bug_show_number_parts } { ------------------------------------------------ositive THEN WRITELN('+') ELSE WRITELN('-'); END; { show_sign } BEGIN { bug_show_number_parts } WRITE ('DEBUG: head_sign = '); show_sign(head_sign); WRITELN('DEBUG: head = "',head,'"') END; { compute_number_from_parts } { --------------------------------------------------------------------- } PROCEDURE bug_show_number_parts; PROCEDURE show_sign(the_sign : t_Sign); BEGIN { show_sign } IF the_sign = p0 THEN compute_number_from_parts := (head_number + tail_number) * (PWROFTEN(TRUNC(exp_number))) (ELSE *compute_number_from_parts := ,(head_number + tail_number) / (PWROFTEN(-TRUNC(exp_number))); xp_sign = negative) THEN exp_number := -exp_number; IF k_Debug THEN WRITELN('DEBUG: exp_number (FP) = ',exp_number:15:7); { Combine the head, tail, and exponent parts into a single number } (IF TRUNC(exp_number) >= := digit_power - 1; num_digit := ORD(exponent[digit]) - ORD('0'); exp_number := exp_number + num_digit*(PWROFTEN(digit_power)); digit := digit + 1; END; UNTIL (digit_power = 0); IF (e WRITELN('DEBUG: tail_number (FP) = ',tail_number:15:7); { Compute the exponent part } exp_number := 0.0; digit_power := LENGTH(exponent); digit := 1; REPEAT BEGIN digit_powergit + 1; digit_power := digit_power + 1; END; UNTIL (digit_power > LENGTH(tail)); IF (head_sign = negative) THEN tail_number := -tail_number; IF k_Debug THEN er := 0.0; digit_power := 1; digit := 1; REPEAT BEGIN num_digit := ORD(tail[digit]) - ORD('0'); tail_number := tail_number + num_digit/(PWROFTEN(digit_power)); digit := diIL (digit_power = 0); IF (head_sign = negative) THEN head_number := -head_number; IF k_Debug THEN WRITELN('DEBUG: head number (FP) = ',head_number:15:7); { Compute the tail (fraction) part } tail_numb BEGIN digit_power := digit_power - 1; num_digit := ORD(head[digit]) - ORD('0'); head_number := head_number + num_digit*(PWROFTEN(digit_power)); digit := digit + 1; END; UNT num_digit : INTEGER; { Numeric value of a digit } BEGIN { compute_number_from_parts } { Compute the head part } head_number := 0.0; digit_power := LENGTH(head); digit := 1; REPEAT FP number } tail_number : t_FPNumber; { Tail part FP number } exp_number : t_FPNumber; { Exponent part FP number } digit_power : INTEGER; { Digit power value } digit : INTEGER; { Digit index in string } TIL end_of_string OR terminator_found; END; { get_digits } { --------------------------------------------------------------------- } FUNCTION compute_number_from_parts : t_FPNumber; VAR head_number : t_FPNumber; { Head part --------------------- } BEGIN { string_to_number } error := fp_NullString; { Initialize return parameters } result_number := 0.0; kill_character(num_string,' '); { Remove all Spaces } IF (LENGTH(num_string) > 0) THEN BEGIN error := fp_None; { All is well, so far } { Initialize numeric string parts (+0.0E+0 = 0)} head_sign := positive; head := '0'; tail := '0'; END. { Convert_String_to_REAL } { ===================================================================== ||| FINIS ||| ===================================================================== } show_FP_error(g_FPError) ELSE WRITELN('g_NumericString = ',g_FPValue:15:7); END; END; UNTIL g_UserIsDone; { Aufwiedersehen } WRITELN; WRITELN('That''s all, Folks...'); READLN(g_NumericString); g_UserIsDone := (LENGTH(g_NumericString) = 0); IF NOT(g_UserIsDone) THEN BEGIN g_FPValue := string_to_number(g_NumericString,g_FPError); IF (g_FPError <> fp_None) THEN END; { Fetch user strings until the user is done, and convert each fetched } { string to a floating point value. } REPEAT BEGIN WRITE('Enter a numeric string [Press to Quit] ? '); { Introduce yourself to the user } WRITELN('String to REAL number converter [David Craig - 1985]'); WRITELN; IF k_Debug THEN { Introduce the debugger (if he's present) } BEGIN WRITELN('Debugger installed'); WRITELN; =========================================================== ||| THE MAIN EVENT ||| ===================================================================== } BEGIN { Convert_String_to_REAL } IF k_Debug THEN bug_show_number_parts; result_number := compute_number_from_parts; END; END; string_to_number := result_number; { Return result to caller } END; { string_to_number } { ========== IF (error = fp_None) THEN IF digit_found(error) THEN get_digits(error,exponent); END; { Compute floating point value from parsed parts } IF (error = fp_None) THEN BEGIN IF (error = fp_None) THEN { Extract 'E' <+|-> } IF e_found(error) THEN BEGIN bump_char_index; IF sign_found(error) THEN exp_sign := get_sign; _None) THEN { Extract head/tail period } IF period_found(error) THEN bump_char_index; IF (error = fp_None) THEN { Extract tail digits } IF digit_found(error) THEN get_digits(error,tail); IF sign_found(error) THEN { Extract head sign } head_sign := get_sign; IF (error = fp_None) THEN { Extract head digits } IF digit_found(error) THEN get_digits(error,head); IF (error = fp exp_sign := positive; exponent := '0'; { Parse string into the appropriate parts } uppercase_string(num_string); { Handle only majuscule letters } c_index := 1; { Start at the first string character } >CONVERTS O^C(צDebugger installedצ2Enter a numeric string [Press to Quit] ? ?ëꓡF$&&ˡ&.g_NumericString = $צThat's all, Folks...L HZ(8\:0lz $)á á Iá( ! iá já %%  4String to REAL number converter [David Craig - 1985](צDebugger installedצ2Enter a numeric string [Press to Quit] ? ?ëꓡF$&&ˡ&.g_NumericString = $צThat's all, Folks...š()0?I0?ij0?' (á )á á Iá( ! iá já %%  4String to REAL number converter [David Craig - 1985]ad_sign = (DEBUG: head = ")"DEBUG: tail = "I"DEBUG: exp_sign = iDEBUG: exponent = "j"۪?%    j᛾0 $ áiá 6צDEBUG: exp_number (FP) = ġ$$8 á+-,DEBUG: he)᛾0 $ á(á 6צDEBUG: head number (FP) =   I᛾0 $  Iš(á 6צDEBUG: tail_number (FP) = j .,   E, -á?? G2 %?צ?@? ڍIDl)   @''' h*'  (4  !6  š&?ؿš 8š4ٛaٛzȄ ٛٛaAá- FعEת?JצString is empty?2צInvalid character in string?MF0š% *** ERROR : 023456L79:;<=>?pascal_return ; that's all, folks ... 0 Exit RTS ; ---------------------------------------------------------------------  0.END 0 ; That's all, Folks ... onment register 0LDA SOS_eReg 0STA @state_ptr,Y 0 0INY ; get bank register 0LDA SOS_bReg 0STA @state_ptr,Y 0 0INY ; get max ram bank 0LDA pas_max_bank 0STA @state_ptr,Y 0 0Push Entry Pop pascal_return ; get return address and 0Pop state_ptr ; sos state record address 0 0LDY #0 ; get zero-page register 0LDA SOS_zReg 0STA @state_ptr,Y 0 0INY ; get envir pascal_return .EQU 0 ; pascal return address state_ptr .EQU 0E0 ; sos state record address ; ---------------------------------------------------------------------  ; Apple /// SOS special registers  SOS_zReg .EQU 0FFD0 ; Zero-page  SOS_eReg .EQU 0FFDF ; Environment SOS_bReg .EQU 0FFEF ; Bank pas_max_bank .EQU 016FE ; Maximum system RAM bank ; Routine parameter storage e stack ; ---------------------------------------------------------------------  0.MACRO Push 0 0LDA %1+1 0PHA 0LDA %1 0PHA 0 0.ENDM  ; ---------------------------------------------------------------------  0.PROC Get_SOS_State,1  ; ---------------------------------------------------------------------  0.MACRO Pop 0 0PLA 0STA %1 0PLA 0STA %1+1 0 0.ENDM 0 ; --------------------------------------------------------------------- ; Macro PUSH - Push two bytes onto th END; ; ; ---------------------------------------------------------------------  ; ---------------------------------------------------------------------  ; Macro POP - Pops two bytes from the stack into two zero page bytes Zero-page register } ; e_Reg : 0..255; { Environment register } ; b_Reg : 0..255; { Bank register } ; max_bank : 0..255; { Maximum memory bank } ; d T. Craig using the Apple /// 6502 Assembler 1.1 ; ; Apple /// Pascal interface: ; ; PROCEDURE Get_SOS_State (VAR sos_state : state_record);  ; ; where state_record = PACKED RECORD { 4 bytes total } ; z_Reg : 0..255; { ; FILE: SOS.STATE.TEXT  ; ---------------------------------------------------------------------  ; ; Sample Apple /// 6502 assembly file which returns the current ; state of the various SOS registers and the Apple /// memory size.  ; ; Written by Davi@ MUSICMAK  ; [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] ; [] [] ; [] ---------------------------- [] ; [] APPLE /// MUDFGHIJKLMNOPQRSTUVWXYZ[\]^_`O^#ŰMUSICMAK MUSICMAK  8hhhhhhhh Li HH` 0  L%LELK0  L%LaLg JF8 ȹe8 ЗL  L%Lø{{ttmnghab\\WWRRMNIIEEAA=>::673401..+,))&'$%"# !@BCA3/1.1SIC SUBROUTINE [] ; [] ---------------------------- [] ; [] [] ; [] Music note playing routine for the Apple /// "borrowed" [] ; [] from the Apple // Programmer's Aid # 1 ROM. [] ; [] [] ; [] Rewritten for Apple /// Pascal 1.1 by [] ; [] Davifor_A3 .EQU 1 ; Apple /// assembly flag (1 --> A///) 0.IF for_A3 SOS_EReg .EQU 0FFDF ; Apple /// SOS Environment register 0.ENDC  ; ***********************************************************************  pascal_retu| .PROC MusicMaker,3 ; Hello ... ; *********************************************************************** 0 debug .EQU 0 ; Debugging flag (1 --> debug) ; put the lsb .ENDM 0 ; ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ; | M U S I C M A K E R ; ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||onto the stack ; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| .MACRO Push LDA %1+1 PHA ; put the msb LDA %1 PHA STA %1 PLA ; get the msb STA %1+1 .ENDM ; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ; | Routine : Push ; | Purpose : Push an integer |||||||||||||||||||||| ; | Routine : Pop ; | Purpose : Pop an integer from the stack ; |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| .MACRO Pop PLA ; get the lsb s well, but it lacks any volume control. Note that this ; routine has had many good musical pieces written for it in the ; good old Apple ][ world. 0.PATCHLIST ; make certain all bytes are shown  ; |||||||||||||||||||||||||||||||||||||||||||||||| Interface: PROCEDURE MusicMaker (pitch : 0..50; ; duration : 1..255; ; timbre : 2..64); ; When compared to the Apple ///'s .AUDIO sound driver, this routine ; perform; Timbre - Quality of the sound that allows you to ; distinguish one instrument from another. There ; are five timbres numbered 2, 8, 16, 32, and 64. ; A value of 32 is excellent for the Apple ///. ; ; PASCAL of 170 gives ; a note that is approximately one second long. ; To get notes at a metronome marking of MM use a ; duration of 10,200/MM. Duration has a range of 1-255. ; pitch by a semitone. For example, a pitch of 33 ; produces the note C sharp. A pitch of 0 indicates ; a rest, not a note sound. Pitch has a range of 0-50. ; ; Duration - How long a time a note plays. A choicethru the Apple /// speaker given ; three note parameters: ; ; Pitch - How high or low a note is played. A pitch of 32 ; produces (approximately) the note middle C. ; Increasing the pitch parameter by 1 increases the ; ; [] Manual, pp.36-37 [A2L0011] [] ; [] [] ; [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] ; ; This program plays a single note d Craig [] ; [] 736 Edgewater, Wichita KS 67230 [] ; [] [] ; [] Reference: Programmer's Aid # 1 Installation and Operating [] rn .EQU 0. ; [Word] pascal return address pitch .EQU 2. ; [Word] pitch parameter duration .EQU 4. ; [Word] duration parameter timbre .EQU 6. ; [Word] timbre parameter ; ***********************************************************************  downtime .EQU 8. ; [Byte] duty cycle down time uptime .EQU 9. ; [Byte] duty cycle up time length .EQU 10. ; [Word] duty cycle duration 0.IF for_A3 Path2 DEY ; decrement width BEQ Down ; width expired ? JMP Path3 ; if not, use up ; Down half of cycle  Path3 BNE Play2 ; same # of cyc 0JMP Exit ; duration expired Path1 NOP ; dummy opcode for timing JMP Path2 ; time adjustments 0 get positive pulse width LDA ioSpeaker ; toggle speaker Play2 INC length ; duration expired ? BNE Path1 ; not expired INC length+1 BNE Path2---------------------------------  Play: ; ----------------------------------------------------------------------- ; Play one note with the duty cycle data in 'uptime' and 'downtime' ; and duration in 'length'  LDY uptime ;0LDA my_e_reg ; restore original environment 0STA SOS_EReg ; for the /// 0 0.ENDC 0 0Push pascal_return ; Return to Pascal 0 0RTS ; That's all, Folks ... 0 ; --------------------------------------n exit back to Pascal ; the machine state MUST be identical to the original machine state. ; If the before and after state differ, then extreme hardship could ; result from this routine.  0.IF for_A3  0.ENDC 0JMP LookUp ; go for it ... ; -----------------------------------------------------------------------  Exit: ; ----------------------------------------------------------------------- ; For the Apple ///, before this routine ca0 ; Note: $C0 = 1100 0000 --> bits 6 & 7 will be set to 1 in OR operation  0ORA #0C0 ; set environment to slow speed 0STA SOS_EReg ; and I/O space enabled ; Now SOS_EReg contains 11xx xxxx where an 'x' means value unaltered; enables the /// I/O space. On exit from the music routine ; the ///'s environment is restored to its original value. 0.IF for_A3 ; do any special /// stuff 0 0LDA SOS_EReg ; save SOS environmnet 0STA my_e_reg  ; I/O addresses of the form $C0xx reside) is disabled. ; ; The following code saves the original environment register ; value and sets the environment for slow speed (1MHz) and ; handle any debugging stuff 0.ENDC ; NOTE: When the Apple /// executes this code the machine environment is ; set to $1C [0001 1100] which indicates that the clock speed is ; set at full (i.e., 2MHz) and the /// I/O space (the place wherend the routine parameters from the stack  0Pop pascal_return ; get return address Pop timbre ; get music parameters Pop duration Pop pitch 0 0.IF debug ; NOTE: Speaker I/O location is the same for both the /// and //  ; ----------------------------------------------------------------------- Entry: ; -----------------------------------------------------------------------  ; Extract the return address amy_e_reg .EQU 12. ; [Byte] private SOS e-register 0.ENDC  ; ***********************************************************************  ioSpeaker .EQU 0C030 ; speaker control location les Down LDY downtime ; get negative pulse width LDA ioSpeaker ; toggle speaker Play3 INC length ; duration expired ? BNE Path4 ; not yet INC length+1 BNE Path5 0JMP Exit ; duration expired 0 Path4 NOP ; dummy opcode for timing JMP Path5 ; time adjustments Path5 DEY 0.BYTE 024,025,022,023 .BYTE 020,021,01E,01F 0.BYTE 01D,01D,01B,01C .BYTE 01A,01A,018,019 0.BYTE 017,017,015,016 .BYTE 014,015,013,014 0.BYTE 012,012,011,011 .BYTE 010,010,00F,010 0.B05C,057,057 .BYTE 052,052,04D,04E 0.BYTE 049,049,045,045 .BYTE 041,041,03D,03E 0.BYTE 03A,03A,036,037 .BYTE 033,034,030,031 0.BYTE 02E,02E,02B,02C .BYTE 029,029,026,027 0E8,0E8,0DB,0DB .BYTE 0CF,0CF,0C3,0C3 0.BYTE 0B8,0B8,0AE,0AE .BYTE 0A4,0A4,09B,09B 0.BYTE 092,092,08A,08A .BYTE 082,082,07B,07B 0.BYTE 074,074,06D,06E .BYTE 067,068,061,062 0.BYTE 05C,-----------------------------------------------------  Notes: ; ----------------------------------------------------------------------- ; Note table used to compute uptime and downtime for different notes  .BYTE 000,000,0F6,0F6 0.BYTE BNE Rest4 ; duration expired ? no 0 0JMP Exit 3 Rest3 NOP ; use up remaining cycles JMP Rest4 Rest4 BNE Rest ; always taken ; ------------------regular note NOP ; dummy opcodes for timing NOP JMP Rest2 ; adjust time Rest2 INC length BNE Rest3 INC length+1 it ; -----------------------------------------------------------------------  Rest: ; ----------------------------------------------------------------------- 0 ; Subroutine to play a rest (note # 0) silently for the same duration ; as a SBC duration ; get complement of duration STA length+1 ; save msb LDA #0 STA length LDA uptime BNE Play ; if not note # 0, play INY ; next entry LDA Notes,Y ; get down time ADC downtime ; add difference STA downtime LDA #0 SEC BNE Shift Done LDA Notes,Y ; get original SEC SBC downtime ; compute difference STA uptime ; save it STA downtime ; save it LDA timbre ; get duty cycle Shift LSR A BEQ Done ; shift width count LSR downtime ; according to voice according to duty cycle called for by 'timbre'  LDA pitch ; get note number ASL A ; double it for table lookup TAY LDA Notes,Y ; get up time ; -----------------------------------------------------------------------  LookUp: ; ----------------------------------------------------------------------- ; Note table lookup subroutine ; ; Given note number and duration find 'uptime' and 'downtime' ; ; decrement width BEQ Play ; back to up-side JMP Path6 ; use up some cycles Path6 BNE Play3 ; repeat YTE 00E,00F .END ; That's all, Folks ... ; [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] ; [] [] ; [] F I N I S [] ; [] [] ; [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] ׶Apple /// MusicMaker testerצ Playing scale with a timbre of 21ȡ  Playing scale with a timbre of 81ȡ צ!Playing scale with a timbre of 16egm6PLAYMUSI N; $WRITELN('Apple /// MusicMaker tester'); $WRITELN; $ $WRITELN('Playing scale with a timbre of 2'); $ $FOR P := 1 TO 49 DO MUSICMAKER(P,20,2); $ $WRITELN('Playing scale with a timbre of 8'); $ $FOR P := 1 TO 49 DO MUSICMAKER(P,20,8); $ $WRITE { Apple /// Pascal 1.1 program to test the Music routine as } { coded in 6502 assembly }  PROGRAM PLAY_MUSIC; "VAR P : INTEGER;  "PROCEDURE MUSICMAKER (Pitch,Duration,Timbre:INTEGER); EXTERNAL;  "BEGIN $WRITELacdhO^3Ű1ȡ צ!Playing scale with a timbre of 321ȡ  צ!Playing scale with a timbre of 641ȡ @צThe End6 mhhhhLN('Playing scale with a timbre of 16'); $ $FOR P := 1 TO 49 DO MUSICMAKER(P,20,16); $ $WRITELN('Playing scale with a timbre of 32'); $ $FOR P := 1 TO 49 DO MUSICMAKER(P,20,32); $ $WRITELN('Playing scale with a timbre of 64'); $ $FOR P := 1 TO 49her programs for the /// which I am writing and as soon as I finish them up I will mail them to A3GI. For your benefit a description of the major files follows: MUSIC Music playing code from the Apple ][ Programmer's Aid # 1 collection MUSIC.TEST Tests attering of assembly here and there. The best program, in my opinion, is PPrint (PrettyPrint), a pretty printer aimed at producing professional listings of Pascal programs. For A3GI's Pascal enthusiasts this program can be very useful. I have several otal sophisticated software and hardware can be produced without the need to spend a long time "hacking" a machine like the Lisa. I hope the files that I have sent can be of some use to other members of A3GI. Most of the files are Pascal programs with a sm 8@8hhhh Li HH` 0  L%LELK0  L%LaLg JF8 ȹe8 ЗL  L%Lø{{ttmnghab\\WWRRMNIIEEAA=>::673401..+,))&'$%"# !ever released for this machine. As such it is VERY difficult for anyone to produce software or hardware for the Lisa. But, as you know, the /// is in a totally different arena. With the publication of the SOS Reference Manual and SOS Driver Writers Manuitten on the /// using Apple Writer). If you think that user enthusiasm for the /// is lacking, you should try and find any Lisa user groups. Apple produced about 70-80,000 Lisa's over its brief 1.5 year lifespan, but no useful technical information was ple /// and a Lisa. Both machines provide me with a lot of software power for my various school programming projects. The /// is used exclusively for programming, while the Lisa is used mainly for document preparation (except for this letter which was wrup to remain alive is thru user submissions. All the programs on these disks have been placed into the Public Domain so you may do with them whatever you like. I am currently a senior at Texas A & M University majoring in Computing Science who owns an Apiklnopqrstuvwxyz{|}~like to submit to you six (6) disks of Apple /// Pascal and 6502 assembler files. The programmers in your group should find these interesting. I wrote these over the past several years and am submitting them since the only way for any Apple /// users gro READ.ME Edited By Dave Ottalini September 22, 1991 MAY 12, 1988 To : Mr. Joseph Dobrowolski From : David T. Craig 3922-A Olive Bryan, TX 77801 Dear Mr. Dobrowolski, As a member of the Apple Users Group International I would DO MUSICMAKER(P,20,64); $ $WRITELN; $WRITELN('The End'); $ "END.  A{ The End }  the MUSIC routine by playing several scales SOS.STATE Returns SOS's internal status SOS.HEART Tests SOS.STATE STR2REAL Simple program for converting string numbers to REAL values and is very good at testing the string for validity ASMFORMAT Formats assembler listing files so that all back-patches are correctly patched. Nice utility for the /// assembly people. FILEDIV Divides large Pascal text files into smaller files. NINE2ONE Interesting number game whose purpose is to arrange a sequence of the fire File type Eof Phys PPRINT.0.TEXT 26 12-May-88 16:32 Textfile 512 27 PPRINT.1.TEXT 60 12-May-88 16:48 Textfile 512 61 PPRINT.2.TEXT 36 12-May-88 16:50 Textfile 512 12 files listed, 1 blocks available --------------------------------------------------------------------------- DISK # 2 --------------------------------------------------------------------------- /III.PCL.14 Size Modified Tim512 8 TIMER.TEXT 28 11-May-88 0:19 Textfile 512 29 WEEKDAY.CODE 4 2-Apr-88 9:38 Codefile 512 5 WEEKDAY.TEXT 12 1-Jan-80 21:14 Textfile 512 13 Textfile 512 57 PPKEYWORDS.TEXT 14 12-May-88 17:52 Textfile 512 15 PPRINT.CODE 40 12-May-88 17:05 Codefile 512 41 TIMER.CODE 7 12-May-88 19:49 Codefile -May-88 0:42 Textfile 512 61 NINE2ONE.CODE 9 1-Jan-80 23:03 Codefile 512 10 NINE2ONE.EXEC 1 1-Jan-80 22:26 Asciifile 36 1 NINE2ONE.TEXT 56 1-Jan-80 23:01 Size Modified Time File type Eof Phys ASMFORMAT.CODE 21 12-May-88 20:12 Codefile 512 22 FILEDIV.CODE 9 1-Jan-80 12:26 Codefile 512 10 FILEDIV.TEXT 60 11file 512 41 8 files listed, 165 blocks available --------------------------------------------------------------------------- DISK # 1 - Side 2 --------------------------------------------------------------------------- /III.PCL.13 0 14:09 Textfile 512 9 SOS.STATE.TEXT 8 1-Jan-80 13:25 Textfile 512 9 STR2REAL.CODE 6 1-Jan-80 12:50 Codefile 512 7 STR2REAL.TEXT 40 1-Jan-80 12:48 Text 3 12-May-88 20:41 Codefile 512 4 MUSIC.TEST.TEXT 4 12-May-88 20:40 Textfile 512 5 MUSIC.TEXT 28 12-May-88 20:46 Textfile 512 29 SOS.HEART.TEXT 8 1-Jan-8------------------------------------------------------------------------ /III.PCL.13 Size Modified Time File type Eof Phys MUSIC.CODE 3 27-Mar-88 0:06 Codefile 512 4 MUSIC.TEST.CODE rely write a program which runs correctly the first time. USINCOS Nice Pascal unit for generating the sine and cosine values very quickly. The disk catalogs follow: --------------------------------------------------------------------------- DISK # 1 ---ce code listing for the Apple ][ Emulation ROM for the ///. SAVAGE Floating point benchmark program which tests the accuracy of the transcendental functions. UDEBUG Runtime debugger which uses an external terminal. Used by most of my programs since I ra. UTS Pascal token search unit which is used by PPRINT. Useful for parsing any Pascal program. TIMER Digital clock for the ///. Great for the /// owner whose watch has broken. WEEKDAY Day of the week calculator given any date. EMUL.ROM Dissambled sourst 9 digits (1 to 9) into a pattern which when processed generates a desired value. PPRINT Pascal source code pretty printer utility that supports hilighting of Pascal's reserved words. Allows the user the ability to define words which are also hilighted37 PPRINT.3.TEXT 14 12-May-88 16:54 Textfile 512 15 PPRINT.4.TEXT 60 12-May-88 1:54 Textfile 512 61 PPRINT.5.TEXT 58 12-May-88 13:49 Textfile 512 59 6 files listed, 13 blocks available --------------------------------------------------------------------------- DISK # 2 - Side 2 --------------------------------------------------------------------------- /III.PCL-14 Size Modified you would like copies please contact me. contact me. can find the Fortran manual chapters that are missing I would like very much to get copies. Sincerely, _______________ David T. Craig P.S.: I have two documents covering the /// which you might bethe ///. As far as I can tell it was written as an internal engineering manual for Apple's engineers. The second document is Apple's patent for the ///. It has some nice schematics, a lot of legal jargon, and a complete listing of the ///'s boot ROM. Ifilable Sincerely, David T. Craig P.S.: I have two documents covering the /// which you might be interested in having copies. The first is called the "Apple /// Theory of Operation" and details the hardware and software architecture of T 50 1-Jan-80 0:19 Textfile 512 51 ASMFORMAT4.TEXT 62 1-Jan-80 0:22 Textfile 512 63 ASMFORMAT5.TEXT 46 1-Jan-80 0:24 Textfile 512 47 6 files listed, 17 blocks avaASMFORMAT0.TEXT 28 1-Jan-80 9:08 Textfile 512 29 ASMFORMAT1.TEXT 38 8-May-88 11:59 Textfile 512 39 ASMFORMAT2.TEXT 26 1-Jan-80 0:16 Textfile 512 27 ASMFORMAT3.TEXble --------------------------------------------------------------------------- DISK # 3 - Side 2 --------------------------------------------------------------------------- /III.PCL.15 Size Modified Time File type Eof Phys 22 7-Apr-88 10:08 Textfile 512 23 USINCOS.CODE 9 3-Apr-88 10:06 Codefile 512 10 USINCOS.TEXT 24 1-Jan-80 13:15 Textfile 512 25 11 files listed, 12 blocks availaE.TEXT 16 11-May-88 0:32 Textfile 512 17 UDEBUG.CODE 12 7-Apr-88 10:10 Codefile 512 13 UDEBUG.EXEC 1 1-Mar-88 18:41 Asciifile 42 1 UDEBUG.TEXT EMUL.ROM.2.TEXT 42 8-May-88 11:39 Textfile 512 43 EMUL.ROM.3.TEXT 64 12-Mar-88 15:00 Textfile 512 65 SAVAGE.CODE 3 11-May-88 0:34 Codefile 512 4 SAVAG-------------------- /III.PCL.15 Size Modified Time File type Eof Phys EMUL.ROM.0.TEXT 30 12-May-88 19:47 Textfile 512 31 EMUL.ROM.1.TEXT 28 12-Mar-88 15:43 Textfile 512 29 TS.TEXT 56 11-May-88 17:43 Textfile 512 57 10 files listed, 11 blocks available --------------------------------------------------------------------------- DISK # 3 ------------------------------------------------------- UTS.TEST.CODE 19 11-May-88 17:15 Codefile 512 20 UTS.TEST.EXEC 1 11-May-88 17:06 Asciifile 108 1 UTS.TEST.TEXT 20 1-Jan-80 9:30 Textfile 512 21 U2 41 UTS.CODE 51 11-May-88 16:54 Codefile 512 52 UTS.EXEC 1 1-Jan-80 17:58 Asciifile 33 1 UTS.SAMPLE.TEXT 4 1-Jan-80 23:52 Textfile 512 5 Time File type Eof Phys UTS.1.TEXT 6 1-Jan-80 22:06 Textfile 512 7 UTS.2.TEXT 56 1-Jan-80 19:14 Textfile 512 57 UTS.3.TEXT 40 1-Jan-80 19:38 Textfile 51 interested in having copies. The first is called the "Apple /// Theory of Operation" and details the hardware and software architecture of the ///. As far as I can tell it was written as an internal engineering manual for Apple's engineers. The second dPASCAL PROGRAMS BY DAVID CRAIG ̠Ώ h:gpOn[n٧s]ds3issssssss0b>&dsjs|T}|s[ŭ᭭򭭪𭭠򠭠頭퀠Šӳ頠𠠀𠠠堠젭ӠΠSOS NTRPRHeLZĠР쁭堠堠ՠP򠭠έ魭HER SUBROUTINEnSLOW=110xFLASH/2=FLASH/2):۴ =11:=07 FLASH$ SLOW FLASH:".d1/Menu.Maker"5 WAP /// SIG HELLO PROGRAM. UPDATED 4/12/89 DGO :#1,".D1/hello.text" ž#170 (#1;ERIN$ 2ERIN$<40F#1/P=23:=25:"PRESS ANY KEY TO CONTINUE.":G$U-Z#2,".D1/FLASHNAME.DAT":#2;FLASH$:#2%dFLASH=110: FLAS3 under a "Read.Me" file. You will need Pascal to assemble and run these programs (and thus, a working knowledge of Pascal as well!) We hope you enjoy these disks and will submit your own programs as well. s well. ll. are full of Pascal programs as placed into the PD by David Craig. David was a Senior at Texas A&M University in 1988 when he submitted these programs to Joe Dobrowolski of Apple Users Group International. They are all documented on disk III.PCL.10 WELCOME! WAP /// SIG Public Domain Library Disk Category/Number: Pascal/III.PCL.13 Disk Format: Self-booting Side One Disks 3PCL-13, 14 and 15 /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// SIG, Washington Apple Pi 12022 Parklawn Drive Rockville, MD. 20852 (301)-984-030ssssssssss\3!z~IssssssssssssIG%ӓ,ssևwn7}|tttUUZ{fzxxˆU膅[L<^ENFONEXINPUOUTPUDIREAWRITOPECLOSATEXABYAAAAAWINDOINVOKPERFORAAFRHPOVPOERRLIERKBEOTIMEDATEPREFIXEXFNEXFN%OUTREINDENAAAAAAAPOHOMA SUB$OFTRACNOTRACNORMAINVERSSCALERESUMALEGOTIRESTORSWAGOSURETURRESTOOALOASAVDELETRURENAMLOCUNLOCCREATEXECHAIAAACATALOAADATIMAGCADEAPRIL<^gHhHhH , - b j$% @ag5h6h6hhhhh8g5h6h 悅`6 "]La ud `L  d.CONSOLE[[ TdSdddddd0 ddddd`dd A 6 s e 9c()' 9cKHLI jLdj89弅:彬: 悅`H hɝɞɜ)`dd  6芅 e ()'` e'()HKIL 9cL>hL<^) i!Ls j @aLK$L% :: 悅 lc!)` +b` +b` sL :b#`L,H s h ऊL(,L8f` A KL jLdjOPPKLL h AKL` Ѽ   (`H shLs Aji!S)Lt`SSS`L` z :0.`9::hhgg.%g& $gegަhH逪hhʰ` ҥ [ aLT ҥIJJABB=>>;<<?@@T ě hhhHH  `89$ 0~!L`!sm?iٰcL`S )!a{)Qi ڐ߽S) -ai) -aɢ ɣɍж$HS -ahʥ0SSȩ5%"/װ&hԐɈf0ɔĐ 8,f 8f L_ʅSS=ȄL`ȱi8eiidHddhd) _ ƢLh _L>h jhP _S @a-Qggeg5hih 6i6 "]S" ]$%SSSg a aL^ S S`La8 SiUjjS):,$f 0$ p fHhH_HcH uhch_hhhfhi0hhhB B A` ֥'( )&񦕤LNKM$Lb ě $m wl "m6X6+5 56ɀ56H $mhɀ(Z)& mL k~ wlL ͝dL Nsd# wl^_ ꂅ__hg^`8 悕`gHhHhH5?6@6@*5g5666gҦhhhhhhhhg:e:;e; ;m;`@c@c?be^@e@ _m__^ \Lx] i6g55``BY BSAMHH H] LPL(\)&P ěj9ȑ9ȑ99i=:i: >i>`Ɂ7XWWXjnXWi` ]?@@bgchch )^ ]b ]b^b^L\b8g+H__^8_ABB 9::)ѭ [ I[ aυ婶ZeLLL^$%Lae LGidFddddddd.ddddddddd ɕdˏd`Ls  Apple Business BASIC v1.23 - Copyright Apple Computer, 1980-83 CTERESOURCE UNAVAILABLDIRECTORY FULDUPLICATE VOLUM ERROR Please Press SPACE BAR IN PROGRAM INTERRUPTED%&'(%+.@C$DE FG!H"I'MN#PQRTW(X潭`: 808`:dd@՚H Z#IJJCSTRING TOO LONFORMULA TOO COMPLECAN'T CONTINUUNDEF'D FUNCTIOVARIABLSOS CALFILES BUSNOT SOI/FILE TOO LARGWRITE PROTECDISK SWITCHEBAD PATFILE NOT FOUNPATH NOT FOUNVOLUME NOT FOUNDUPLICATE FILDISK FULFILE LOCKEFILE NOT OPEDEVICE DISCONNECONV&CONV$CONV%LEFT$RIGHT$MID$INSTR>=<^/*-+NEXT WITHOUT FOSYNTARETURN WITHOUT GOSUOUT OF DATILLEGAL QUANTITOVERFLOOUT OF MEMORUNDEF'D STATEMENBAD SUBSCRIPRANGINVOKSTACK OVERFLOREDIM'D ARRADIVISION BY ZERILLEGAL DIRECTYPE MISMATNDEELSCONLISCLEAGENETABTSPCUSINTHEAMOSTEANOEXTENSIODIAFNOAAAAAAAAAAAAAASGNINTABSATYPRECAAAAAAAAAAPDLBUTTONSQRRNDLOGEXPCOSSINTANATNAAAAAAAAAAAASTR$HEX$CHR$LENVALASCTENAACONV,@dd )e dʙdH &eh(dL ddک,ddLd:e``eLeHELLO ue 5eLse6e:7ee8ee:e`EAd j @a(% -, bLs j {ghhh$PLh wlȱȱ%$LWH mh x~  m#W", mȱ28eLeji`Lwl mȱ"Ɂɂ ȱ :, iTjj ȱiVjj8逪XW0 Vf0WHW$ 0X: h eg : t_Environ); 2END; % %t_Hex = STRING[2]; "VAR $sos_state : t_SOS_State; $trix : t_Trix; $z_Hex : t_Hex; $e_Hex : t_Hex; $b_Hex : t_Hex; $m_Hex : t_Hex;  "PROCEDURE Get_SOS_State (VAR sos_state : t_SOS_State); EXT : 0..1; 4io_space : 0..1; 4screen : 0..1; 4reset : 0..1; 4wr_protect : 0..1; 4stack : 0..1; 4rom_2 : 0..1; 4rom_1 : 0..1; 2END; % %t_Trix = PACKED RECORD CASE BOOLEAN OF 4FALSE : (byte : t_Byte ); 4TRUE : (e_R PROGRAM Examine_Apple_3_SOS_State; "TYPE $t_Byte = 0..255; $t_SOS_State = PACKED RECORD { 4 byte structure } 4z_Reg : t_Byte; 4e_Reg : t_Byte; 4b_Reg : t_Byte; 4max_bank : t_Byte; 1 END; $ $t_Environ = PACKED RECORD 4clock O^CSh`L^bLb$%/%5$ &5 &5e$$5e%%$&%$e$% Lk ׫ sHH ~qLPkHHh$0'ph | ZlWȥmW`L$|hXWXL-hm lmmLkl VYZZ{|| w ᐥlmmYZZ LxWXX ox ExYW# kXX 4=^W^0A, 9:: Ga.ghh 悅` A` \\ɾ,L<^hhZkKhLhhhe9e:: mLg jei `Ls j:,"hhhhLgɜEɝDɞLb Hɾɺдmhɾ Qp aj pi `p j` jLi j,d wlOZL^L^-L(dPL<^OPMNKLhhLg` Ls ҥ?ieCiLa,  aFL s a iLg ]hhh5h689H: H:HLHKHH6H5HHH` ui` pi` Qp j pi `p i` j jK$L%8eȢЅ iLOPP$pX0S&ȱhȱKȱLe潥ɂ逅$L# $mKL x~ m khLgLsLc h5逢)&a TH THLgL6k8:9: STT`)ɀLK$Lb8gLOPPKLMNhhm Vf0 mLf) mWA 0 -a mL8fW;8<< 悕` 6kLU*i kXX 4XLy \\'_ch_chbi^g \ihh ] Qp aj ih `p b iq bqn %jjg56Ly { b bq | XHWHHHֺERNAL; "FUNCTION Nibble_2_Char (nibble : t_Byte) : CHAR; " $VAR &nib : CHAR; " $BEGIN &CASE nibble OF )0 : nib := '0'; )1 : nib := '1'; )2 : nib := '2'; )3 : nib := '3'; )4 : nib := '4'; )5 : nib := '5'; )6 : nib := '6'; )7 : nib := '7'; )8 : nib := '8'; )9 : nib := '9'; (10 : nib := 'A'; (11 : nib := 'B'; (12 : nib := 'C'; (13 : nib := 'D'; (14 : nib := 'E'; (15 : nib := 'F'; &END; & &Nibble_2_Char := nib; $END; " "PROCEDURE Dec_2_Hex (byte : t_Byte; VAR hex : t_Hex); " $B?TUJ)TU  ' Lsi imLqLsh E0`H ty ))ELyq  8 $0!PizEn{dUeUi hLqLs `wLr !L2 {}$ 0`QɀX zLs.+"2mXm tL qXXW zzEn{i x }H$ ]kh8 )KLe9e:: }Lgi , p s$8$0p`PL<^Յ H s r ɀ ȱX Hih0 & ?<I?iE W Lq s )L<^ȱQȱȅR dj sLHoUVV$ LhU Lp$ LL<^opL^```?EXTRA IGNORED?REENTER $0pL,`LgXW ׫ k*iXX 4X \\L<^Xii7 { n k$ |WlXVVE$ P% eT{||Hd ̐h p IkLo00$0 L>o "m nV dj$D$ P 膼Lo$0",i [ kLoHSHhp< {}$ p0H 07h ]k ,LmUVV `p F sLn 2 ukLoF вLm jȪЖ LL<^~p l nhhLgOPP` Add# 6d s S SS@Ln A " r ,; s lLn#f  ;П ⭩,SLn "mʆ,S _S% nLh "mL_T ST#L(, U VV ׫$ 0  QpU= d hkddhe##5ddˏdd?Ll ,?#$04dHHd = d hkddˡddhhd`LsL#&F  ; s b 0` L+l$ Nsd#Lzm566ȱ5Ll H# wl m#͉LchL$m QRKLLsh$0LU$^`=8WW>X> 悅XXXL:^ g`L<^ l Jj bx bp,_;Ll  ~q$0P oՅ5R66R l ~ L%l $m0 =k $m#`$L#i)8#Ll  s s( L7bʊ# L-l m hxd5d$0H bytes'); &END; { WITH sos_state } "END. " "{ -------------------------- FINIS ------------------------- }  _Reg.stack); (WRITELN(' ROM 2 select = ',trix.e_Reg.rom_2); (WRITELN(' ROM 1 select = ',trix.e_Reg.rom_1); (WRITELN; (WRITELN('Highest bank number = ',max_bank:3,'/',m_Hex); (WRITELN; (WRITELN('Apple /// memory size: ',64+32*max_bank,' K(WRITELN(' I/O space = ',trix.e_Reg.io_space); (WRITELN(' Screen state = ',trix.e_Reg.screen); (WRITELN(' Reset enable = ',trix.e_Reg.reset); (WRITELN(' Write protect = ',trix.e_Reg.wr_protect); (WRITELN(' Stack used = ',trix.eister = ',z_Reg:3,'/',z_Hex); (WRITELN('SOS Bank Register = ',b_Reg:3,'/',b_Hex); (WRITELN; (WRITELN('SOS Environment Register: [',e_Reg:3,']/',e_Hex); (WRITELN; (WRITELN(' System clock = ',trix.e_Reg.clock); sos_state); $ $trix.byte := sos_state.e_Reg; $ $Dec_2_Hex(sos_state.z_Reg,z_Hex); $Dec_2_Hex(sos_state.e_Reg,e_Hex); $Dec_2_Hex(sos_state.b_Reg,b_Hex); $Dec_2_Hex(sos_state.max_bank,m_Hex); $ $WITH sos_state DO &BEGIN (WRITELN('SOS Zero-page RegEGIN &hex := '??'; & &hex[1] := Nibble_2_Char (byte DIV 16); &hex[2] := Nibble_2_Char (byte MOD 16); $END;  "BEGIN $writeln('size of t_sos_state = ',sizeof(t_sos_state)); $writeln('size of t_trix = ',sizeof(t_trix )); $ $Get_SOS_State(i L[ s r$PLsi,L3-hLs L*tɘcɭ_ TTLdd`jk8L|L3L3TL3,L3i LL r$PLLBLsș Ȅ ( qƚƚ` s s),;,=,#,(,,ѼLL<^L<^ llmm$P$`LćHƽ Ƽh`$ lȱlLL{ɝɍLɎСL s HI s shmHmHlHHɦ# shmHmHlHH , hHLt  ,, shTTLui ui,L3$0 |Lu xijk6kxyy xxy6+|] {n LU{HLʁIڢIڢ-(h#5ᆥ](IڢʥnH BiHɁy U{y рhɁ xhLB` vy{| g|S}dpL}Qz}c0~~D:~L̑56gh6hegehh `iɇoȘ戅 aziȅ xdo`Abi$nFn) i  j g g ^ ܇.Laz͠Lć ^ ׄ& ć ׄ ć ͠L- x |z K{ | T}{ x xnH yxn0 I B xh B Lр |  ZuL.y +|z% T}uH }h{ ~|H !z az ~hJ inIn`L~8;)q4X>Vt~w/z*|cYX ~uƀ1rP aziP | |iɈ { T}i8Huiiu x BU 瀩{h z` |] az 뀩]Laz | i8fe.șR0șRmymlylkykjyj00ڊIi i/ȄȪ)Re.șRI)ЪR0.ȩ+f.8f-RER/8 i:RRRRRR`y`'d |Ģ { &{f o0`LB ` H$ge &{h 80 '~L}H |h |zEn{iLxf d$h0Ly ef q80fL}COt#t$JZ mLKjk8 | ~Lm ^|-$nșRnȩ0iL f~ azea~ } \~ } &{e B{e yx %}ei0nihoi8傐IL|`7 z!L|iD8$n yiLyn)FjjjLyiɠ %}nnI*imLyjklm` s e-o+ smo..IE)2s S -+fh r$h8fL}fg s$gPf8ef B{f65m5l5k5n j5i`d,]WXX566 |m5 ^|l5k5n %j5i5` |m l)m |m`znth` |ht`i  y my`i n*` |jkjI*mlinLyFn`nEz0ʢiH xv5ui`uei0,iiL0y{n`nI0hhL,yLy |i{ xi` |={{ {LZ{ zL{ |8ii zivjwk xlym* 蕁24(y&x&w&v0⨥ymyxlxwkwvjvL{@jjj)(L{L<^~jklmL y56y^Vy dv88; 54541r |LiHi z xz U{y xy рz xh '~z zLz z~ zm zl zk zj zL{LyJ eyexew~ev~f~ffffJ`5665y5x5w5zEn{z lkj |yjJkjlkmlmi in`emeymlexlkewkjevjLkyi&m&l&k&j8iIiii9fjfkflfmf`nIngjIjgIm lkj`L<^}i0vvvvvj`L656 wh H5Gh`lmm566 Lx5Hȱ5ȱ5 F665 w56h(` x("LH)&h`( '&'`lmm566LxĠLx znInEz{iLx y? zL||uu`8i$iznIii0ĨV y${Wiuu8Iem_B_B`)&N> ȱI8gJJ hhge ghh f feLH>H= x\L|F )XHABB8 __^hHI8e^ @1 @+?%GHHHIJJih BABGHh`$  ě u Дs IJJ^__Lveȱeȱe 8` `H Jh(L悈`H逨h` Hh8 Hɀjhji` HihJi(`  ~q$L ɺ b$P i pi$ȱLdjɻƟ dj 柰ީ Lihh sLg  s ! b   s "!!!" ऩ थ (! ( ऩ थ (" ( द!LGb8Lऩ@iu +-ELj) e | ^ .' "5 1 p) iIii i)Lm` ?i $0 ׄ $0 $0 ^`Hhth`^Qb ^^ 78ߠȘH yxy hL3 j kqHHHH s H , ,H s s ~qhh 1 lhhXhXhWWȱW7ȱW8 eLNLXZWX ` GGH HlHmHmH khmhmhlh hk8j7k8Lޒ e7788IjJkJk )lmm'&`UR{R||L̐: / cRRȹRRȥ Rл s `Lsh sh5lh6mh6mhxhyhy x x Qȱx7ȱx88 Ƃ 7e7888ł75 楽HHȱȱ6H6H5H s =к bqhhh Lshhhh` ~R/mZlmYZ PujHkki^^`H"h{||kjkȱ{ "ie{||  V{|56|6 w&5L<^i8e` ě u8A?pB@B@ )onL܇jkL| Nsdȩ8 NsdL2Lа,L<^ A s ׫ g iq s= sXHXHWHHHH ajL? b rLiq HHH s iqhhh5ȱ6ȱLI65 g5H6 2|Hgȑgʆ5a g5ȑgȥg <^^^__ɂ逅____<;إy6 hlhm^Ȋ^LL:^ȥ5^H^h ͎el5emȆ6п  ͎e^e__ iLZe *& eegggegȱgehh Ľ ,L<^  8` ^LQ ŠhhL6 $P 訽5 ͎56ۥ 8ee L:^?be^@ce@c __^_ \__^;<<6  $Phihi^Ȋ^6h656H |mHlHkHjHiHl5 8eeghh^__` HHH H bqh hhhn0iɐ1 }L yxL%}\i FHHHHH 6hhhHHlm ,҄ shh)>=>hgh<<;[a{p ;<<ccb? @c@ube.a{bb,\(eb cc`ebcA[8饰 a{8`8\e@@He? ]@@?hbbb0 ea ȑbc8L@ @@h5H ?5^6_6_hhXhXhWLk ? % ?Џ`5566` xe5566ɂ66` s p `  zLseff z.!'$ iߪ$ 0 H8eAi\h$ P8 (Lt$ 0}5}} ,kk} , kklm Lٓ[ 80@ 6 2`  dkH) ojhJJJJ ojL 0:i`L<^ jHHHHHH s jhLyqhhh6h6h555_ȱ5VHHHH %L/5H6H6Ht $mlmkljkij8ihn`L,$0DpA q enHi80 @Lyu \ % @u ćh `&m&l&k&j`2L0 և yxLT}$0pLI oբRLi `u LLi u Lui0 ܆ چ,,% п 擩lm0u 1eL5665`iɀ*iH i  @8 ei $ tutt tj ȡhn` t` 0RN0R 0R$n-RRR`i` p`5665i`$0BP?iH i hLbe55f5f6e}Lme6u5u }`6ʈ`v`jip` ? #  ue }~ %u $ چ 0 u}` L uu  ) }Li <i@L{i$i0 p $ 1`ui` LL Lbb `}i~ei^~0] e e^`}`566i5`_cf_cfi^eub` ?^qbep`L<^ ?8b^e` rp`I` ? ㄩp^|be #^b ebbu|beiee^^iL56^f8 hx57 xLCx8I77JJ8 88` H dhjL YYHH dYZZ oxhhe5566ɂ逅66 wZZY L YIL=m ) s  ʊHYImm shhhhYhZhZHHE` 3YZZ xLCxl5Ym6Zm6Z x` Lj5 3LٓL bq VlmL{} ӓ0566 `sL{ bq Zm*elLmLiɑL %}lm$%`L:^fCDDEFUVFVX L; d  seRթR`yiɀjjn*8miɝ d L .q$uL$)JJ8偅8傪 u Tf$i0Ł!y0GLqL~䁰< 0$H ,GhGթ $u$n 0GЫ-Gv)' $G uJ-$n0+G $G0)`u vphh` Ljk ,hh`Sj9-k L9j ekekk|z)ekk |j[ ٢  L`j 9kkj"j"kеAX"+-&$.ECR/#Z*! DBA0 k$JJJJ) vvyLj L ʟ,-uukv kv@vvyL5Lj ʟA80멀uukeqqtt$uA)*t L; $uЫkЦuuj ysLq,kl$uhuuj XkkNuuj k 4%v. #  1$u tAvʘtDթ q(~th`pvquts~y fp$pp8j/;XAx=|8ez{{ ghh "o `L x  wwghhoؠKkqvj L`$uZuukvN kGv@  pJ LUL-LG -$p0`pog $mkڥrok8o,koLdjAaCcoJ mko 5 $mkk mLw L L HG56H6LExh  (`|||}z,A[ :808Ш`,ޞ@`y Gy`LHq,;' L Pu  pLLwl`|H}HzH{HHH ɶ# xhH s  ~q s,; Ls  ~q$ hxrL iLpnH ~hɀ8(*iR.-:/ RRhhh{hzh}h| Pu p 0|8cJcm J_mm嚍J_AgBhBh \^A_B_B` ^"( zM jF566 x}z{6{LҜ #z{{"} GLsL<^ jHHH i dj ٥z{{ j}hhh ;в| |膆  RRRRH uhA?B@7B@87F8f7877878L:^7 8*JA5gB6B68 悅h圍h?H@H@HI?J@J@ "]h@h@h?gAhBhBJJ8 悅J圍J7ߚ8BܚLs`䚌B L:^`Ib^J sL͙ɚʚ `pAƚЙϚŚњ˚ ̚8 悅DDF͚ Κ8 DiFEC CD)ӚDmӚDԚCBКLěŚAݚ⚠IȌ 8 ꂍ  8 ꂅJJ` !7Ri88 pi UŦLUUU HHHHL 2hh LW iL 2hlhkhn jhimhHɗ8 Ls`LIŚ1CUDVDVU Lŧ 0 7U L`L:^֩ ŚEĚ L| Qp QeeRee8 1 V` 痠U` hh R LsL  z (L[ Rީ  @Y%(&:$LU s և ^|iHn %jHkHlHK s n ZlHmH5 s iH jHH楩e ) ,LsLR eՅ7V8U #   785U6VLΔU7e778ҥU^V_bcF_hcCgDhebbc \^__`U8傅UV` |UȱU` L<^ |UUƜ0ƛ ӗWqeWȱWqei W` |8UUWȥVUX`UeUUVUO / +'L U)łiV VL LI 8U 7ȱ7 UU ЯUVULU7V8 p L LZ U qUU qUH85h688V77U U 5qUWȥ6qUX7qWWȥ8qWW ٥IiV) V LVU?e8V je?e>e8U>e5V?e665e=e@eeehi?e ueL5e qrL,op ɩ`et?ek;e`hZ L<^hZL<^L=ee>e ?e`opqrst !e5ehe?eLje LjeR=89R>:>:iR:RiRRiRL`8(RR(`EeFe  s bq Vml0L dMeL` bՍe :RRRiRȐȰRe9Re: J 2IHJh*=>> 95:6:6R L1 1Lԫ`L:^  aFL^R, ue 5eLڭR7>e?e5e?eJeKeLje֩ u>e?eՍ "] a a$% iLg֢   sLj$%`8f  a e ; ` s ɩ` YLILcopL7 z0xH ׫$0_ ;h8fH`aai shH2 h zJJJJf Ik ɩ` ̬ t os YLA ևLLק jWXX` ׫$`pd8isŠt`dyoopd8ip`J uv`&&&8孪孪宐橈`! @ uA?B@B 悅@=g>h>h ]=i>j>k a=g8i>hj>h 悅ki=5j>6k6k;el)@7Me0u(> ƬƫHH ,hohp` ɩCe0R`ȹR`ee?e@e ue 5e T L=e;e`Lso`n}pm aa`dyo ɃɄ b`" lJJJJYe s ˰L8Ls LԫN l@u=ekPe tMe )llNesOet NeOetMeCOeNeȌ=e>e;e,i-i8, ȱ,%,W,pp ڠ %p`l  " ) i SOS KRNLb.D1/SOS.INTERPŠ̠Š.D1/SOS.DRIVERР頞 0 ) (lH'&3&'&#e'#%e'%'&"$"$#%'#%h`$eh`L)i   HH `TH..TH..TH..THATS ALL, FOLKS!R`RT RT`#RT RRRRR`0R`RR 㵩:RRL㵆  ~ RR`BLOCKS FREE: BLOCKS USED: TOTAL BLOCKS: sj]"]\AjiGa@aI[5x<^sě xCxEx5eҥV{}g}gkj̐kIk~^hT}27uejewsHH st\hh H PASCODPASTXTTEXT PASDTABINARYFONT FOTO BASIC DATA WPTEXTSYSTEMRESERVRESERVCAT RPSDATRPSIDXAFDISCASMOD AFRPT SCNLIBk;eo $'>ed?e ɩE` eĐL Ȑ 15WL QL5WW{5 ې'`,55 ې'` ݠ B1 ȩȑ Lɦ8`5  @ R㥶i ` İG8`F`X8``éۅĩ >` T֩xxMH]@ Kۅ5H ɐE$ eİ Ȱ h`h`8`W h8`hR`hLҿ i x +ۅ5ۅ6 ǰ `E8<W`­ `0XLۅ5` ռ``ߤeI`IiţO`Ȯʆ/ )󘑡`()0zq 滅ѺY Ueۅ5Ѻ Ѻ  Qܐ'`i ҩ *C8/y.i/ ȑ  © $ E7<3W`ȽLֽȄ @8`R ) [)_[AͰ")[)_[A:0/.ЩȑΘ8e * ȩ`Loü 7)?۽۩ W٠Յ<ōōř ռV7 uM78 V榠=ü#)@5 ɐ /ݐE ) .) @L `lqhٯ޿=ϓTXIֲ̛̐~ؠIJK,-NOPQ0vt `` LLɠ8`ΛLL渠`0 `8`HiHiH ihhȱh`86)IH)heuQɸ` ` W` ] %饚0` W` ߰4`)|E8LLLRLLLLL*LLLLLhh`LLL`SOS 1.3 01-NOV-82(C) 1980, 1982 BY APPLE COMPUTER INC. ) `G`î** }*`o^`on 8 JJAj@` *?($`ΠņɠŠ堠РѠ͠஠әƆH v?c,,,,h߈ߢ~))`3PLLP*%(i&`Ѕ񩏍E H pph`Xۅ ۩ۍۅ Lɰ ʰۅۄÍÍۙ'Ù ۍ*ۨ  Ѝ۹ۙ8v- ðJ ¥ ð, ðLO ʰƥLT`'  mې浰``8 8 Wٍۭۅ5ۅƭۅ X̰ ìۈۑ T̰ۅƭۅ X̰ۙ%ۍ" T`K8`)` İ ۱ۈ` ưW/ۈęۈЍ۩@` 8 MƐ  5 Q8`LŅ ͱ ͰU..++,,IJ/ ӥ-.?Цե,J+jѲ4Ƴǥ4聠 H hH kh8`8-ȥ.L 8*Ʊ )8 0*-`.G.ʱ*+,EP'.E.LұE0+,,ӄ*p-e  )LBѠٳ )8`i (` )N8`*eȱ+eȱ,i۠Ѻ*ȱ+L - ť.Lkҥ. ՅL ͐Ld ~ pа.J/)@߅4N8`) ))УJ8` ۑȭۑǠۑۑȭۑ($S8`O8` "` / 򑺠+* ͐H h8` ΰi `()  *ǵ յý5Ņ4gȩυɩč5 iψ }.8` iϙLIѠ ˢ L΢ ΰ LϠ ˢ ΰ1` Đ@ АP8`B8`ۑJJJJ -ѥ +jѲ84ƳJJ 2ΐ3泑ƳLTΩ潑ƽ`ƱƳ ΰ( {Π۵*+)e`8`)` J J + ΰ" 0 ΰ 🱼ѼL8`ǩ Ϡ` ϰ ƑȥǑ` Ѻе*`)ȥ+8ۍې  ,ѺLTΠ"LΠ5 խ ɐ /ݐE`C8`)@ ϰa)ۥ,8ېu+J,\ ȱLJΠ) ϰ'#,J(] { ΰ ƑȥǑ.8` { ΰ,JѲ ƳL΅ƱƳ ΰҥ,J0`#$"0#`!qȱi 5H5Ƶ ǽ jh5`L2̩ƍv̥Ǎw̩ÎL%ϠƄǥLj̩۬L~̠HHh` ̐`*ѺG0?M`)J"u-- M8`۬` # ː`  = O̰)= I`JJJJѶQi Lˢ  0 ̐ `"L˦ `H8`8$$"$= O̰=`$0`#$"0`$` H hQ)fʅ F jF jF jF &!  eװ*  ̰F湥 ƹ`Z8`@  ʰ泭ۑƳ ʐ` ʐ` ˰ ƹ Wː`ۘ . . .۪8*JۦȱѶ"` ɰ Ȑ`E`Ɔ X̐8`>>5Ѷ Qܩ<`>`\ʊJJJJ ۍ۩  ˰Fȱ X̰6 0 Lɠ 0ۑۑ8ȱ`H8` ɹ $  8JJJJ8 ` ۠ǽi `< Ȱ+<#5 ې'` ɐ /ݐE`W8`R` 5&i ` Ȱ 0i `<8> ȐT eİF cȰB)Hh5 ˭)*ȑƑȥǑ'(ȑ`L)ɭ)Ѷ*e`M) `ۅH)Ѱ%}ʈh Qܐ'``hi ` p6۽ʹZ5 HȐ/i i `гW8`0( ɐ Ȱ ʮ6E`5 խ ɐ ޢ ȰLȍ۱Ǎ X̰% & !J8` *LĢ `8 iۥƍۥǍ`ۅ %  6 )Ѱ Ѱ` 𝭧e ǐ bǰL*ۈ5ȱ۠ƍȱǍ X̐ H h1  /ݐE`ۈۅ ۅ 8ƭ X̐`LLŠǠ  ݭv̅w̅ ðzv̍ŭw̍ŭƭ ­ōō T̰]ŅƮņ X̠8iȱiiȱi ṰŅǭŅ XLōۭ۩ۅ ȱ8D`F`8eYƍťǍŠ)͠(` L Ͱ2 ~ P kҐ#L8 T 2ΠHHȑhhȑ`Ld )N8` xհ*eȱ+eȱ,i۠Ѻ۹ۑ񥤅- ť.Lcԥ.La Ͱ$)rJ Lɰ )# Ԑ)Hۑۑh8`P) հ Wհҥ,J+j泭۪ƳۑȊ ) ~ fPL ͊.>.ʱ+,EP!.E.Lw+,,ӄ*- P*e (` հB հ5 Wհ0,J۪泭ۑƳ s߭lߩ * xLx @h hhh ,0)ߨ)Ah&'0HHHH xhhhh ,0)ߍLLhhh@)&&&(&('+*H)H(h)H@x )HH30.0\-JM-, J3,e$,d,,  * *l߅߅H ߅ \xi ߅LHHH *ح)0 D) HHHH,, ߩ0  xLߍ󠠩à٠΀ƉŠŠӠҠȠHHH *ح)0 D) HHHH,, ߘ)@ *)X  xI)}h)L, L )ڠ) w߭)Ů􅮈 ߠ'x)) J,QJ,SJ,U,P,W(`)(()  8)j`J j߅`0X ٠͠堘ӠȠŠ=`Insert volume: Τ in device: 蠠ɠ then press the ALPHA LOCK key twicex)_ @,P,R,T,V) )) `)8( ߠ',@ ߠ0  '葺 ݰL`5`i 祻(8`2ޝ51©ޅéąŅƍ >ϩ 1ޠ== f ɰ`ޭ`5=(5= i Х(`=H hDC5 L3ܵ ɐ /ݐ 8`5 ˥JJJJ8 H h ` ܠ825H h5 ɐ /ݐ 8`Hh ܥ5 `ɥܥܥܥܥ5`܅܅܅܅܅5`( ݰ)Ѻ ݰL ݰ泱Ƴ ʰȭۮ ʰͩΪΩۦ eװqȭqLJ  ˰Aۅƭۅ X̰2%&N  ʰƭ X̐`Ӏ堁ӠҠՈ՘̠ƠŠӠ̠ɤӮȪŅ͠Ϊ ܆5 HȰۈ)ۅƭۅ X̰ 3ڰLÍLT̥L㼠  ʰ` İK ХP8` LɐH80)N  հ)@LO ˰)0 ̐` M ­۠泭ۑƳѲƱƳ X̰ RڰäJۑĥ` İo!)N8`WپX0 ĥLä X0 ĥLà !"#$ Đ2@H AڰCŰrP` 3ڰ(` AڰѶ? İG8`Fە1 ռ İ ЩP߭)@N8`1@8` Aڰ񈱴 ˦,+* ʈJj =ؠ yiȩ`y4泱ƳHhz ʠiȱizLA`L;ؠ"  `1` Đ7@8V۩ Lɠ۪8ۊ۠X)JJJƄ X Ġȱ۠ ȍ۱۠ ۭ) ۍ ð*)#  O̰``)(`N8` ) xհۈ ̰آ*գ  Ͱ ݢգ LvL{ؠ;i ڥ(8` ְ( ȱ5 HȦ)`Lxץ: ש ְ⥺i ꥻ(8`Lx Lxש u )۠0)p խ.8`)@ ϰ) ϰۈۅƭۅǭۅ5 X̰ *ƭ۬͵̶L  ΐ` Wհ> H۪ȱHۑhƳh sϰq ` ʰiȱi `)5©éՅĩ5 }JJ+`.`8`ɂ )`@ ש ְO ֤Fȑȱȱȱ008 8hhh H(`x )HH'Ƚ!88x , ,,(`," , *)` `   `x )HH8(=&(+ʈ&ਹ''&&hh(` * @ HH` 2``ӠР    0) ) $p10LYeieLVȱ d0L`Hȱ hh` WɸSI I.ȩ8A 8ɸ4ɠ(H)h h8   `    i Ȣ d` $,)?P^ GL㢮 5L}P.)(Ơ L`ޠ LR  稱 I)0JJJJѤ  БĈ` H`)à`֩ нѽ>`]PU]]UPPX0 0 PPXPP  į󠠩ҙ̙ɠΠɊՐӠӢ̢ՠҠŠԠҚРĠ鱃ԠȠࠠLQ  * WHHH>%H H @`)h8`  HШБˆeЅА SYSTEM FAILURE = $hh8`hhhxآY_Z@tPRVT,p S JJJJ ) ʍL@ i0i6`îӉ͠堧ǥӥ``HhHy)(h`H` 0L?i `h` `` `x)( 8 `jjJJԥ)եӬɂ )Ӆ҅`  `H0Xh`Π'à̠ȈL` 8`څ  Lk%  Lk8Lu텚8嚅 L L Ld V ``  h` ک V `ۅץ  VLFx) ( :` H ) L  .P'pб0 &L:L5'8+8`0Fܢ` ř,Ř 0 8f)J ӭƅХDžѥL1LUȑ  i ߩLL )  札)  ҩLL` **éL0;` H ) 4 )ߍ) hjjjjۥ0CF = -$(L !LLL&L L-LJ٥eƦ ,L  # ` (L.L…ҥÅ,] Xx,f (I0јIFjFjFji```x@gŽPy+wLwԠ͠ŠԹ.D1 .D2 .D3 .D`HJJJJh)y` (2>< (&20 *, **>> "2*&" " >>  ">> "8""> """"""< SOS DRVR"CUSTOM.3 )((8*,;((*,((+)((9/(p((>3  =9 :9 .(~|L|LNqooGoDDDcc0ccpc]]c"QM"|@@pAATT**|  )* i LiHh`PQPQ>P Q,PQ"PɀQ@PAQ`8`nɀ<)nopoLpp` 0h8蘠fȊf` ab 1abo)abaݰb L9c`` a N0Ioa0H ha`pLopna n`  3ɠ/8 L %iLɠ8逨J Hh $`b >_-%^%p_^^_ab"08^c_L8^c_L8^c_L8^c_ȑcc\] ab^_ ``aV R0M bba dda `Q8STRQ ST`c\ȱc]a  b 5DU e\^e]_ ^_ ^_LH8\^]_?Je\^e]_,78\^]_ ^ݰ_ ^_LH^_ $bL@A^_aoQ*@A RQL@A `T8`RLSJTKQHIQiHiIKNJ)M8逅OPOPHMIN'a MHNILHOIPaOHPI8JHFKIGFGaHMINNMʆSTL8HSITQQSTde0f`   cCȱcD C Ea  UV 1 ELUFVG FUUCVDեYCWZDXWXCUDV[ v`b0WXYZiUcȥVcWX eeYZ ggE` @SATRDžŠƠŚ̮ÎȠ Ӡ̠Ӡ` LL#L/LL'Lgab `abBcd cdBrcadbho:ab.cݰdDcݰd8abҊ v+abcabRcdTefVghXijSdfhj RR`^0U ` 0 ʠ0 8 `ůàՠԠàࠝӢӠ ȠDž̖͌͊頀ϐωŠŠӠҠȠγ`%!^0 ^)@`a R =` *^)ـooL]^)?i |TU QTU]qUoqTITsUsprRprqs]ToUXa` RL=Xa` R` *R`X`U T  *\AX[ @F\B9ɏ5\o*Ɂo)[[ @^`U V  *C?^0: ݳ ٢ ^)?i` *)@o `p^ XiH 1h `)X0 8~X 1`C X`)X0`C РǠ𠠐ŠŠӠҠȠƠŮƠҢâӠUAQY @?ZY 9ZYY^TU QZo>> ""*:<"">""""""""""""">>><2"<""">""" ""  ">"6**"""""&*2""""""""""""*,"" "" ">""""""""""""""**6"""""""> >>>xrL ==L: ,lCL <=L: <,n)LL8 L8 u:L8 ;)ߍ;j`; ;j`uBL8 uCL8 u)u;) u;L8    x) `(,  LuL-upp<`uqq=L: vuL L L #1:CY` 9C<m><=m@=>@?AL8 >m<>@m=@<=L8 <m>?=m@AL8 C9L8 ; ;k`;);k`,@`<,m p<L<`<p<`,ms<L=q=L: ,lXґȥӑ,10 h0  `,g0L  ҅ӥĥŰ+,0p 4 Ls  Ls i )"|tȌs|st HH` MjH,: <J h̰ <rh,oL`%CYgu9 Ln90$0%,7 ҥ L$0T,8OK50P;ҥ,8 L%\   8҅¥Ӆé҅L,5,6  & @jIH,5 p  He҅Ґhe…å逅h,23Lhʩd8,h)ec efeede`,5 H  h 4  `5!    4(P 4 4  `,g0L,10kH0 ԥ f0)ĭ9)9҅xh(ĥŐL i,1HȊ©L,52,9-P" a{) b) )ab)a a,h0& &+%a0 +hcefd(c,@cfabdf`cnx  (,4h`dd,9P"<:J H) +̰ H) +ʭcP h̰BTVSPLH   5"ʘ HH` (# (=  0`)aI88  >!SHOLES 1!1!2@23#3#4$4$5%5%6^67&7&8*8*9(9(0)0)-_-=+=+\|QWERTYUI OP[{]}`~`~ASDFGHJ K L ;:;:'"'"ZXCVBNM ,<,<.>.>/?/?d0hp00000>0# #0~$ <"<"""<< <"""<"><$""< """"  "" 6***""""""""""<""< :< $"""2,"""""**6"""""< >>> <Le Le ,g0L HH`! ( 9EKQWbmz`(" ((è%È`2ȭ3`1`d`c`+È`&È` & IMk`4`5`6`7`8`9`<ȭ=` & @jI`:ȭpȭqé,i0L È`,g HH`LL! l      5  Hdcefh&+si  M0   h) `(" (  (È& 8  `)2ȱÍ3`)1`Ɂ" (cefd`Hc HH`! (`ɖ" (èÈ``,t0L4 HH`L  d!  `ɖ" ( dÈ  ``,t0L4 d0Cս30. , V  @„ȄL5/((((PPPP @``` @@@@`xp<@ @ :H9H` (# ( -l..PcJt`,t$ ( t`tL4`,t0L4www """"""""33333333DDDDDDDDUUUUUUUUffffffffwwwwwwww(C) 1980 Apple Computer (+@EIR[ty} NQ9Copyright (C) 1983 Apple Computer, Inc. Graphics Driver..GRAFIX b """"""""33333333DDDDDDDDUUUUUUUUffffffffwwwww     ! ( 0 7 I N S _  . G R Y f {    ! $ 4 9 F I P S V \ a h m p s x |     ' + < ? D G N U f k p x ?BEJMRUX]`h  2;AGMS[fot|              . 3 6 9 < ? B E H N S V \ _ b w  KORY\aelpu !$(+.147<?BFILORUX]`finsw| !%*/369<+;CNU\eh "*-036<BLORX_fj &+38;?DGLTot <?BGLQgjox',/25:BG̑ʈ0 Ցʭr̈A萠L: ֦ڱΑ0Б֤ h L  p,:0 JfiΥiώJe΅Хiю@ B $p̑бʑΈ0 Б̱ΑʈeمΐeمАA萿 :  `ʝ"`t  !#%')L: 8p,:Jf׮@$PA B $P@/A'ʤ˅΄ϥ̤ͅЄ B $̑бʑΈ0Ƞ h L: $)טɀIim>ٮ@8pذ `$0"8,:Jک@ׅפ؈۩MjL,:08*Ȅ B ,:J}΅н(I I $0;P̑бʑΈ,:JՐrx 0, )ߍ:) J)*PR,T,V( : `,k<,: JI`I`<,:J̰`=m@>,:J}ʅ̽(I I `<Mj,:0pJՐ̑ʈ`pJհ0`ՑʭrpȐ`=m@< B h A$g " x) (,`% (gL,}0, `gé ĩ `:) j:;jN;~j;O,:0'???>>8?>p<<AAA@@8A@q==C)CB)B C}0 x) `(`hh% ( ΍ ύ逅Ñ}`` " ( ĩ~Íĩϭ & &υΠÑΈ~ F ~ҰةeÅÐн},,P,`,g$ ( efh) `xÙ+(`xÙ&(`)4`)5`)6`)7`)8`)9`,i0!M:0p ȱq L `" (~)y ~JJ* I `x|x|,,}P-X~ F }~L } `,`ʝ`))ժuvЭ H ʊJyjhz|ֆ׆ح)JfJf$PIJfש ʈ8 @ש wx LVخ ʊJJJ莟mwwxix 0ޤՐڢ,P<0 )ߍL- J,P,QJ,R,SJ,T,U,W`,t0L40 ( dȅɥŐ ĐL sic; +Q Quits."r12);::"80C";a$;:+w#9,"DISKNAME.DAT":#9;DISKNAME$:#9|d$=DISKNAME$$=23:=0::"80C";d$;::12)201M=3:=14:"This /// SIG Disk is \^ 19";Р,2)", Washington Apple `, Ltd."=4:B$(1)="":B$(2)=""A$=16,B) THEN 240 #1, d$="":=10:"80C";d$ ž#1300I=0"I=I+1:#1;A$(I):290,#1 6L=I-1@j=1:same=0 J:SEG=0 Tœ2030^CT<1CT=1cCT>13000Zha$="{,|,~,}; selects; to new disk; J/2)=4:=+1:ۙ=44B$(J);:J=J+1I:1,180,22:2,280,21:2,2380,23:8A$(1000),B$(1000),C%(511),C$(20),name$(20):=10:=0UCA=128:LCA=UCA+32CT=15 IF PREFIX$= PREFIX$+MID$(B$(I), VOLUME NAME (/DISKNAME) OR DEVICE NAME (.Dx)"P12);::"80C";a$;:Zb$="CHANGING DISKS"$d=23:=0::"80C";b$;::12).n=12:=20:"MAKE A NEW MENU FOR DISK: ";N$xN$)<2110=N$ :210 I=1L(A$(I),A$))200B$0 WAP /// SIG MENU.MAKER PROGRAM (v. 6.2) =".D1"210: Coldstart (320: Warmstart &*X=11000: TEXT SLOW-DOWN LOOP ,X.1 CHANGE DISK SUBROUTINE23œ202:2200<RFa$=" YOU MAY SELECT YOUR DISK BY ,$0F y բӅLx  mӥmԐL] h `  )`%)8`)    H   ʥ)Ģ    H Ģ L E% %) L 8`ۅ&ۥe륅eٍeڍ808٥8٥ 8مڅ H , V Εm٭mڭ))njnjnjfjfjfj+mӥmԐ8L( Ӣ й` m j`Hآ Hӭԭ h h`8٭028ٍڍ0Z$eٍeڍm٥m8٥08ٍڍ`8٥058ٍڍ0ԭ V 8fxL@ ] I)!) g 80 J8}L y L 0yʽz0 y L7  Lh `*f*&*)` ϭPh0 йPL)`)L` L``  `L` H , 8 V ТΕLϦI ] +)J* g I`LL) @L) L8``Lթ`~L8L)  =H 'HH N M))Mhh0 }LO}~~Șݻ~`}}~L< L }ީ~` ɠɀ)ӮԮmwӥmxԐ mi` HHGH`  &"BASIC 0":150A$="TEXT 0":150A$="CAT 0":150A$="FONT 0":150A$="FOTO 0":150A$(L),"BLOCKS")510*=27:=19:"FREE MEMORY AVAILABLE: ";=7:=20:"80C";A$(L);$:=5:THPOS=4:I=1:IBOTM=J-1:620Q=:=26:=21:1600 =Q:WW=0A=:A=21A=9&oldprefix$=40A=31410: Control C "aborts" program to Basic(:A=13770: Return Selects a file *DA=27:50: Escape to change disks/FA=324000: back out one directory level 3GA=(80+UCA)A=(80+Lepɀjff&ݥeepɀjffݠ %)  %)`%  0.)      0  ` ` @ ``8٨JJJ ) u˘ vͽʅ̆`8Hi #ia$,1)="/"5060:s=s-1 5030=a$240 MENU.MAKER 6.2 * Thanks to C.M.Davidson for his help!THE WAP OFFICE LIBRARY HAS A NUMBER OF APPLE /// BOOKS AND MAGAZINES. el; G$:::320H: Error Routine 202:U=11:"79C";"BAD PATH ERROR (NO DISK IN DISK DRIVE OR DESIRED FILE NOT FOUND.)"X=11000:X:::210Z a$="{,|,~,}; selects; back 1 lev 1600 &:WW=1:0 :SEG=1;".D1/S EG.F" SEG=1".D1/SEG.G"diskname$=3802  CATCH PASCAL TEXT FILES 202 :F*=08:"78C";"SORRY BUT MENU.MAKER CAN'T READ PASCAL TEXT FILES."04=10:"M$="NOVEMBER":1750M$="DECEMBER":1750826);"-";M$;" ";Ѡ,2));", ";"19";Р,2);" ";/П,2))=>13П,2))-12;џ,6);:1780$П,2))=0"12";џ,6);:ٟ;$П,2))=>12" PM-":" AM-" 1830WW=1530 =26:=211660,1670,1680,1690,1700,1710,1720,1730,1740^M$="JANUARY":1750hM$="FEBRUARY":1750rM$="MARCH":1750|M$="APRIL":1750M$="MAY":1750M$="JUNE":1750M$="JULY":1750M$="AUGUST":1750M$="SEPTEMBER":1750M$="OCTOBER":1750T 0")2070H540R\A$="RUNNING "+B$(I),16,B)f"79C";A$;:=0pB$(I),16,B) z::SEG=1".D1/SEG.T"t=+B$(I),16,B) yCT=CT+1~240:=24:=0:"@ ..... "DATE.TIME.LINE" ....JM=Ҡ,4,2))BTM1630,1640,1650,0=+IBOTM/2-.5):I=IBOTM:I/2=I/2)I=I-1 œ2120B=B$(I),16)," ")-1 B$(I),"BASIC 0")850B$(I),"TEXT 0")890 B$(I),"CAT 0")1140*B$(I),"FONT 0")18504B$(I),"FOTO 0")1930>B$(I),"PASTXB$(I);v:520: 500THPOS=4:I/2=I/2)I=I-1I=IBOTM THPOS=44:I/2<>I/2)I=I+1I2=-1:I=I-2:IBOTM<30THPOS=44I=IBOTM/2)*2:=+IBOTM/2)-1:CA)"PRINT.ALL": OA+P 3HA=(81+UCA)A=(81+LCA):::: OA+Q Quits 3IA=(83+LCA)A=(83+UCA)"PRINT.SHOW": OA+S 2JA=(68+LCA)A=(68+UCA)/Screen.Savers/HELLON=THPOS:B$(I);XA<8A>11540bA-7640,660,690,720l:=THPOS:لϤҐ мφi`Jf`<,&ʰ,i8i#Hiihifʦʆi) v`i,ʐi,iPIIʥ)ifʦʆ̐pLj/Fϐ&Ȅ`'@τ`Fϐ@ E҅F8ئȢΆѽϽ`/(L%τ`ϩE҅0Ȅ(fL% ('Άѽн`8Hٰ hIiHمh8Iif٤Φݰ>Jj8ۅe݅eޅ $  m`!J8݅ eۅ$  m` , V $צ!R",220(204::"79A";""; 2D=1:F=1 <#4;a$ FD=D+1 P#5;a$ZD=60#5;12)dD=60D=1nF=F+1::d$;::Y=1100:Y x13402  CATCH PASCAL TEXT FILES 202 :F*=08:"78C";"SORRY BUT MENU.MAKER CAN'T R".D1/MENU.MAKER",220 d$="" A$="PRINTING "+B$(I),16,B)=01:=0::"80C";A$;:#3,B$(I),16,B)Z=1#3;b$:"78A";b$Z=Z+1:Z=18:1290 1260 #4,B$(I),16,B)#5,".PRINTER"+ž#4#5;12):::".D1/MENU.MAKE30C$="N"C$="n"1160;:=23:=0::"79C";"PRESS ANY KEY TO HALT LISTING": $1020.202 8::Z=1B::=23:=0::"79C";"WOULD YOU LIKE A PRINTED COPY?":1C$:C$<>"Y"C$<>"y"C$<>"N"C$<>"n"1170*C$="N"C$="n"79C";"PRESS ANY KEY TO HALT LISTING"::202 1020#2,B$(I),16,B)ž#242:::1160Z=1#2;A$:"78A";A$Z=Z+1:Z>1842:::Z=1980*:=23:=0::"79C";"CONTINUE...?":1C$:C$<>"Y"C$<>"y"C$<>"N"C$<>"n"10 MENU.MAKER TEXT MODULESEG=0"MENU.MAKER"890&*X=11000: TEXT SLOW-DOWN LOOP ,X.1,180,22:2,280,21:2,2380,23:z:A$="LISTING "+B$(I),16,B)$=01:=0::"80C";A$;::12)>=23:=0::"    ) . 6 = J P S X [    $ 3 : = F d  > B H M s `e|&+.QVYcjuy~':{%(-47=FMUX\_jmz  .169DWfy   % * > A H K Z v z }      % , 1 5 : = B K R Z _ b g n s x ~ /47=G\x{~'+.149?CGIKMOQSUWY[]_acegikmoqsuwy{}J) ܭL FܪJJJJ)`'+9;=?ACEGINR\aejns~  #&).369<ADGJMP^g $*-06=HLORWcfloruzp Q%Q̑`pPIE1pΦ#$01ʐ1`JJJJ)`%υߥ`1(ȦJJJ`&&*`JJ` **&*&ߥ`J` ***`` ` Jjjߊ` ߊ`JfJfFߪ߆` `JfJfJfF`ߩ`$011̰JJJ LP \LD$7߭$PH8 nߩ nh ߍϭ - k, ϥ- kϱϮEϑʩ`P z  HH` k(h`$0#$E$0p Q%Qʑ`pPIE1p$E$0EAD PASCAL TEXT FILES."04=10:"78C";"ANY KEY RETURNS TO THE MENU."!>G$:::".D1/MENU.MAKER",320