M100 Memory Map (covington)WDBNMSWDvwL7#$llwwwww>gggg[<Ux *w(?Model 100 System Map Copyright 1985 Revision Date: 09/30/85 Compiled and Researched by: Robert D. Covington Systems Information Management Consultants [Not associated with The Covington Group, N. Y., N. Y.] This document may be duplicated and distributed free of charge to any individuals who desire it. Any duplications of this document, however, must inluce all of the information contained here-in, with no deletions or changes. The author and distributors of this document make no expressed or implied warrantees as to the validity of the information contained here in. - File formatts - .BA Files: 2 bytes - Address of next line 2 bytes - Line number Up to 255 characters ending with a null EOF is 3 consecutive nulls .DO Files: Text ended with a EOF character 1AH .CO Files: 2 bytes - Address to load to 2 bytes - Number of bytes to load (-start 6) 2 bytes - Transfer address - File Descriptor Block (Address Given by VARPTR(#file)) Format - Byte: 0 - File status (0-not open, 1-open for input, 2 open for output or append) 2 & 3 - Address of file directory entry 4 - File device (248-RAM, 249-MoDeM, 250-LinePrinTer, 251-WAND, 252-COM, 253-CASsette, 254-CRT, 255-LCD) 6 - Offset from buffer start (see bytes 9) for start of next record 7 & 8 - Relative position of next 256 byte block from beginning of file 9 - Start of 256 byte buffer for data transfer - Floating Point Accumulator Format - --------------------------------------------------------------- FAC1 | FAC2 | DP | SP | Integer | SP Address | Address | Format | Format | Format | Register --------------------------------------------------------------- FC18H | FC69H | S & E | S & E | - | C FC19H | FC6AH | BCD M | BCD M | - | B FC1AH | FC6BH | BCD # | BCD # | LSB | E FC1BH | FC6CH | BCD # | BCD L | MSB | D FC1CH | FC6DH | BCD # | - | - | - FC1DH | FC6EH | BCD # | - | - | - FC1EH | FC6FH | BCD # | - | - | - FC1FH | FC70H | BCD L | - | - | - --------------------------------------------------------------- LSB = Least significant byte of intger MSB = Most significant byte of integer. Bit 7 contains the sign of the integer BCD L = Least significant BCD byte BCD H = Most significant BCD byte BCD # = Middle BCD bytes. Each digit of the number is represented by one of the values in the two nibbles in each byte S & E = Sign and exponent of each number. Bit 7 contains the sign of the floating point number. Bit 6 must be set. Bits 0-5 determine where the decimal point is to be inserted. For example, if this byte contained a 65, the sign would be positive and the decimal point would be placed between the first and second digits (#.###....) - Option ROM Important Addresses - 40H = 54H 41H = 43H - Required for ROM to be detected on BOOT 42H - 47H - Name of file associated with ROM program Code at 7E24H-7E43H executed on BOOT to handle option ROM. Code at 0365H loaded at F605H on BOOT to detect option ROM. - Model 100 Hardware Port Map - A0H - Modem control port Output: Bit: 0 - Modem telephone relay (1-Modem connected to phone line) 1 - Modem enable (1-Modem chip enabled) B0H - 8155 PIO Command/Status Register Output: Bit: 0 - Direction of Port A (0-input, 1-output) 1 - Direction of Port B (0-input, 1-output) 2 & 3 - Port C definition (00 - All input, 11 - All output, 01 - Alt 3, 10 - Alt 4 (see Intel technical sheets for more information)) 4 - Enable Port A interrupt (1 - enable) 5 - Enable Port B interrupt (1 - enable) 6 & 7 - Timer mode (00 - No effect on counter, 01 - Stop counter immediately, 10 - Stop counter after TC, 11 - Start counter) Input: Bit: 0 - Port A interrupt request 1 - Port A buffer full/empty (input/output) 2 - Port A interrupt enabled 3 - Port B interrupt request 4 - Port B buffer full/empty (input/output) 5 - Port B interrupt enabled 6 - Timer interrupt (status of TC pin) 7 - Not used B1H - 8155 PIO Port A Output: 8 bit data port for printer output, keyboard column strobe, and LCD In addition, the first 5 bits of this port is used to control the 1990 real time clock chip. The configuration of these five bits are: Bit: 0 - C0 1 - C1 2 - C2 3 - Clock 4 - Serial data into clock chip B2H - 8155 PIO Port B. Output: Bit: 0 - Column 9 select line for keyboard. This line is also used for the CS-28 line of the LCD. 1 - CS 29 line of LCD 2 - Beep toggle (1-Data from bit 5, 0-Data from 8155 timer) 3 - Serial toggle (1-Modem, 0-RS232) 4 - Software on/off switch for computer 5 - Data to beeper if bit 2 set. Set if bit 2 low. 6 - DTR (not) line for RS232 7 - RTS (not) line for RS232 B3H - 8155 PIO Port C Input: Bits: 0 - Serial data input from clock chip 1 - Busy (not) signal from printer 2 - Busy signal from printer 3 - Data from BCR 4 - CTS (not) line from RS232 5 - DSR (not) line from RS232 6-7 - Not avaiable on 8155 B4H - 8155 Timer register. LSB of timer counter B5H - 8155 Timer register. MSB of timer counter B8H - Same as port B0H B9H - Same as port B1H BAH - Same as port B2H BBH - Same as port B3H BCH - Same as port B4H BDH - Same as port B5H C0H - Bidirectional data bus for UART (6402) (C0H-CFH same) D0H - Status control register for UART, modem, and phone (6402) (D0H-DFH same) Output: Bits: 0 - Stop Bits (1-1.5, 0-2) 1 - Parity (1-even, 0-odd) 2 - Parity Enable (1-no parity, 0-parity enabled) 3 - Data length (00-5 bits, 10-6 bits, 01-7 bits, 11-8 bits) 4 - Data length (see bit 3) Input: Bits: 0 - Data on telephone line (used to detect carrier) 1 - Overrun error from UART 2 - Framing error from UART 3 - Parity error from UART 4 - Transmit buffer empty from UART 5 - Ring line on modem connector 6 - Not used 7 - Low Power signal from power supply (LPS not) E0H - Keyboard input and misc. device select (E0H-EFH same) Output: Bits: 0 - ROM select (0-Standard ROM, 1-Option ROM) 1 - STROBE (not) signal to printer 2 - STROBE for Clock chip (1990) 3 - Remote plug control signal Input: 8 bit data row from keyboard strobe F0H - LCD display data bus (F0H-FFH same) - Model 100 Keyboard Matrix - ------------------------------------------------ 7 | L K I ? * -> Ent f8 Brk Row 6 | M J U > & <- Prt f7 In 5 | N H Y < ^ Up Lbl f6 Cap 4 | B G T " % Dwn Pst f5 Num 0E0H- 3 | V F R : $ + Esc f4 Cde 0EFH 2 | C D E ] # - Tab f3 Gph (224- 1 | X S W P @ ) Del f2 Ctl 239) 0 | Z A Q O ! ( Spc f1 Sft ------------------------------------------------ bit 0 1 2 3 4 5 6 7 0 [----------- 0B1H or 0B9H -----------] [0B2H] [----------- 177 or 185 ------------] [178 ] Column Strobe Note: This table is incorrectly documented in Radio Shack's "Model 100 Technical Reference Manual" (26-3810) - Math Routine Summary - ------------------------------------------------------------- Function Single Precision Double Precision Integer ------------------------------------------------------------- + 37F4H 2B78H 3704H - 37FDH 2B69H 36F8H * 3803H 2CFFH 3725H / 380EH 2DC7H 0F0DH ^ 3D7FH 3D8EH 3DF7H Compare 3498H 34FAH 34C2H ------------------------------------------------------------- - RIM and SIM Bit Maps - SIM Bit 0: RST 5.5 mask (set mask) RIM Bit 0: RST 5.5 mask 1: RST 6.5 mask (set mask) 1: RST 6.5 mask 2: RST 7.5 mask (set mask) 2: RST 7.5 mask 3: Mask set enable 3: Int. enable 4: Reset RST 7.5 flip/flop 4: RST 5.5 pending 5: Not used 5: RST 6.5 pending 6: SOD change enable 6: RST 7.5 pending 7: SOD pin output 7: SOD pin input Note: SOD pin is used for cassette I/O on Model 100 - Model 100 Special Control Characters - -------------------------------------------------------------- Control Code | Print | Routine | Sequence | Address | Address | Description -------------------------------------------------------------- Beep (7) 4229H 7662H Beep Tab (9) - 4480H Tab cursor LF (10) 4225H 4494H Move down one line Home (11) 422DH 44A8H Home cursor CLS (12) 4231H 4548H Clear screen CR (13) - 44AAH Move cursor to beginning of next line ESC A - 4469H Move cursor up one line ESC B - 446EH Move cursor down one line ESC C - 4453H Move cursor to the right ESC D - 445CH Move cursor to the left ESC E - 4548H Clear screen ESC H - 44A8H Home cursor ESC J - 454EH ESC K 425DH 4537H Erase from the cursor to the end of the screen ESC L 4258H 44EAH Insert blank line at current line ESC M 4253H 44C4H Delete current line ESC P 4249H 44AFH Turn cursor on ESC Q 424EH 44BAH Turn cursor off ESC T 4235H 4439H Protect line 8 ESC U 423AH 4437H Unprotect line 8 ESC V 423FH 443FH Stop automatic scrolling ESC W 4244H 4440H Resume automatic scrolling ESC X 4262H 444AH ESC Y 427CH 43AFH Set cursor position. Coordinate for cursor (row and column) follow ESC Y sequence ESC j - 4548H Clear screen ESC l - 4535H Erase current line ESC p - 4431H Start inverse video mode ESC q - 4432H Cancel inverse video mode References & History This documented was created with well over 200 hours of sweating over a Model 100 ROM disassembly. I started my first research on the Model 100 ROM about 2 hours after purchasing it (Note: I had one of the first 100's off the production line. I believe I purchased my 100 in June of 1983). After I figured out how to use TELCOM, I downloaded a BASIC Z-80 disassembler that friend of mine (Mike Livorsi) wrote from my Model 3. After making a few changes to the disassembler, I was able to get it to work on the Model 100. Then, I tested my Model 100's parallel printer port by printing a disassembly of the Model 100's ROM on my old LP8 (note:the disassembly requires a 3 inch note book to fit in). A day later, I came back to my Model 100 and found what every machine language addict loves; a complete dissasembly of the ROM. At this point, I had a big problem; where to start. At the time, the only documentation for the 100 was the Instruction Manual. "Hacker reliefs" like schematics, memory maps, debuggers, etc. could only be found in the dreams of the infant portable hackers. What did I end up doing? Well, I decided to write a little BASIC program to search for specific bytes in ROM. This program was used initially for finding the text string "Ok" in ROM. Once I found out where the message was in ROM, I then searched for any ML instructions that referenced the message. Then, on a warm July night in St. Louis, I found what I was looking for; a 16 bit register load that referenced the message "Ok" followed by a CALL instruction. This was the key I needed to open the door to the Model 100's ROM. With my experience from the Model 1/3/Coco ROMs, I knew that the load/CALL sequence I found was used to print a text string on the screen. From this little information, I was able to interrogate the subroutine called and find out how the display operated. In addition, since "Ok" is only printed at BASIC ready, I was able to trace out the keyboard input routines and eventually, the entire BASIC interpreter. About 200 or so hours later, I documented most of the Model 100's ROM. At this time, I knew enough about my Model 100 to write just about any machine langauge program that I needed. When I started writing ML programs for the 100, I found one problem with my ROM documentation; it was too hard to find a particular ROM address. What I needed was an organized collection of all my notes, "chicken scratches", etc. From this came the memory map you hold in your hand right now. In this memory map, I basically included the information that I use the most when ML programming. I did not include a lot of information on how the ROM handles certain task, but I did include information that can be used by external stand alone ML programs. In creating this document, I had a little help along the way with figuring out a few things. Below is a list of sources I used to help me determine or verify what certain things in the Model 100 did: Model 100 User Manual, Radio Shack Model 100 Service Manual (26-3801), Radio Shack Microsystem Components Handbook, Volume 1, Intel (1984) MOS Microprocessors and Peripherals, Advanced Micro Devices (1983) Microsoft BASIC Decoded & other Mysteries for the TRS-80, by James Lee Farvour, IJG (December 1982) "Inside the 100", by David P. Sumner, 80 Micro (December 1983) ROM: Part I - Model 100 ROM Memory Map - 0000H - System Reset 0008H - Compare character following RST 8H with the character pointed to by HL. Entry: HL - Points to the buffer to be used for the comparison. The character after call is compared with the character pointed to by HL. Exit: If compare is successful a RST 10H is issued If compare is unsuccessful, a SYNTAX ERROR is generated 0010H - Get the next character in the buffer pointed to by HL and place it in the A register. HL is incremented prior to the load. Spaces and tabs in the buffer are skipped. Entry: HL - Points to buffer Exit: A - Character loaded from buffer HL - Incremented C flag - Set if character is a digit Z flag - Set if character is a colon or null 0018H - Compare DE and HL Entry: HL - Number to compare DE - Number to compare Exit: C flag - Set if HLFAC1 1 if BCDEFAC1 34C2H - Compare the signed integer in DE to the signed integer in HL. Entry: HL - First integer to compare DE - Second integer to compare Exit: A = 255 (-1) if DE>HL 1 if DEHL 34FAH - Compare the double precision number in FAC1 to the double precision number in FAC2. Entry: FAC1 - First double precision value to compare FAC2 - Second double precision value to compare Exit: A = 255 (-1) if FAC1>FAC2 1 if FAC1FAC2 3501H - CINT Function. Convert floating point number in FAC1 to an integer. Entry: FAC1 - Floating point number to convert Exit: HL - Converted signed integer in FAC1 FAC1 - Converted to an integer 3510H - Load the signed integer in HL into FAC1 Entry: HL - Signed integer to put in FAC1 Exit: A = 2 352AH - CSNG Function. Convert the number in FAC1 to a single precision value. Entry: FAC1 - Number to convert Exit: FAC1 - Converted single precision number 3540H - Convert the signed integer in FAC1 to single precision. Entry: FAC1 - Contains signed integer to convert Exit: FAC1 - Converted single precision number 3543H - Convert the signed integer in HL to a single precision number in FAC1. Entry: HL - Contains signed integer to convert Exit: FAC1 - Converted single precision number 35BAH - CDBL function. Convert the number in FAC1 to a double precision floating point number. Entry: FAC1 - Number to convert to double precision Exit: FAC1 - Converted double precision number 3645H - FIX Function 3654H - INT Function. Find the integer portion of the floating point number in FAC1. Entry: FAC1 - Floating point number Exit: FAC1 - Integer portion of floating point number 36F8H - Subtract the signed integer in HL from the signed integer in DE. Entry: HL - First number to subtract DE - Second number to subtract Exit: FAC1 - Result of subtract HL - Integer result of subtract 3704H - Add the signed integer in HL to the signed integer in DE. If the result is greater than 32767, the result is converted into single precision. Entry: HL - First number to add DE - Second number to add Exit: FAC1 - Result of addition HL - Integer result of addition 3725H - Multiply the signed integer in HL by the signed integer in DE. If the result is greater than 32767, the result is converted into single precision. Entry: HL - First integer to multiply DE - Second integer to multiply Exit: FAC1 - Result of multiplication HL - Integer result of multiplication 377EH - Divide the signed integer in DE by the signed integer in HL. Entry: HL - Integer Numerator DE - Integer Denominator Exit: FAC1 - Result of division 37F4H - Add the single precision numbers in FAC1 and BCDE (FAC1=FAC1+BCDE) Entry: FAC1 - First single precision number BCDE - Second single precision number Exit: FAC1 - Result of single precision addition 37F7H - Add the single precision numbers in FAC1 and FAC2 (FAC1=FAC1+FAC2). Entry: FAC1 - First single precision number FAC2 - Second single precision number Exit: FAC1 - Result of single precision addition 37FDH - Subtract the single precision numbers in FAC1 and BCDE (FAC1=FAC1-BCDE) Entry: FAC1 - First single precision number BCDE - Second single precision number Exit: FAC1 - Result of subtract 3803H - Multiply the single precision numbers in FAC1 and BCDE (FAC1=FAC1*BCDE) Entry: FAC1 - First single precision number BCDE - Second single precision number Exit: FAC1 - Result of multiply 3806H - Multiply the single precision numbers in FAC1 and FAC2 (FAC1=FAC1*FAC2) Entry: FAC1 - First single precision number FAC2 - Second single precision number Exit: FAC1 - Result of multiply 380EH - Single precision divide (FAC1=BCDE/FAC1) Entry: BCDE - Single precision numerator FAC1 - Single precision denominator Exit: FAC1 - Result of divide 3827H - Load FAC2 with the single precision number in BCDE. Entry: BCDE - Single precision number Exit: FAC2 - Copy of single precision number HL - Destroyed 3840H - Convert the ASCII number pointed to by HL to its double precision equivalent. Entry: HL - Points to buffer with ASCII number Exit: FAC1 - Value of ASCII number All registers destroyed 39D4H - Print HL in ASCII form at the current cursor position Entry: HL - Contains 16 bit binary number to print Exit: All registers destroyed 39E8H - Convert the binary number in FAC1 to ASCII Entry: HL - Points to the start of the buffer where the ASCII number will be stored FAC1 - Binary Number Exit: All registers destroyed 39ECH - Convert the binary number in FAC1 to ASCII. This routine will format the ASCII output with the same parameters offered by BASIC's PRINT USING statement. Entry: A - Bit configuration for PRINT USING options Bit: 0 - Exponential notation 1 - Not used (reset) 2 - Sign (+ or -) follows ASCII number 3 - Sign (+ or -) preceeds number 4 - Print leading '$' 5 - Asterisks fill 6 - Print commas every third digit 7 - Set, allow print using formating Reset, do no formating on number B - Number of digits to the left of the decimal point. This value is used for placeholder filling C - Number of digits to the right of the decimal point. This value is used for placeholder filling HL - Start of receiving buffer for ASCII number FAC1 - Binary number to convert Exit: All registers destroyed 3D7FH - Single precision exponential function 3D8EH - Double precision exponential function 3DF7H - Integer exponential function ROM: Part IV 3FA0H - TIME$ ON Statement 3FB2H - TIME$ OFF Statement 3FB9H - TIME$ STOP Statement 4009H - Clear all COM, TIME, and KEY interrupt definitions Exit: HL, A, and B destroyed 407FH - RESTORE Statement 409AH - STOP Statement 409FH - END Statement 40DAH - CONT Statement 40F1H - Check to see if the current character in the buffer pointed to by HL is an alpha character Entry: HL - Points to character to check Exit: A - Character pointed to by HL C flag - Reset if character is a letter 40F2H - Check to see if the character in A is a letter Entry: A - Character to check Exit: A - Preserved C flag - Reset if character is a letter 40F9H - CLEAR Statement 4174H - NEXT Statement 4222H - Send CRLF to screen or printer Exit: A = 10 4225H - Send LF to screen or printer Exit: A = 10 4229H - BEEP Statement. Beep computer. Exit: A = 7 422DH - Home cursor Exit: A = 11 4231H - CLS Statement. Clear screen Exit: A = 12 4235H - Protect line 8. An ESC T is printed. Exit: A = 84 423AH - Unprotect line 8. An ESC U is printed. Exit: A = 85 423FH - Stop automatic scrolling. An ESC V is printed. Exit: A = 86 4244H - Resume automatic scrolling. An ESC W is printed. Exit: A = 87 4249H - Turn the cursor on. An ESC P is printed. Exit: A = 80 424EH - Turn the cursor off. An ESC Q is printed. Exit: A = 81 4253H - Delete current line on screen. An ESC M is printed. Exit: A = 77 4258H - Insert line at current line. An ESC L is printed. Exit: A = 76 425DH - Erase from cursor to end of line. An ESC K is printed. Exit: A = 75 4262H - Send ESC X Exit: A = 88 4269H - Start inverse character mode. An ESC p is printed. Exit: A = 112 426EH - Cancel inverse character mode. An ESC q is printed. Exit: A = 113 4270H - Send escape sequence Entry: A - Character after escape (27) 427CH - Set the current cursor position Entry: L - Column (1-40) H - Row (1-8) Exit: A - Destroyed 428AH - Erase function key display Exit: HL & A - Destroyed 42A5H - Set and display function keys Entry: HL - Start address of function key table (see 5A7CH for the format of the table) Exit: All registers destroyed 42A8H - Display function key line Exit: All registers destroyed 4313H - Print the character in the A register to the screen. This routine is used by RST 20H to print characters on the screen. Entry: A - Character to output 4373H - Control code routine for LCD output (RST 20H) 438AH - Start of lookup table for RST 20H control characters. Each entry starts with the ASCII value of the character followed by the two byte vector address. 43A1H - End of special ASCII character lookup table 43AFH - ESC Y routine (Set cursor position) 43B2H - ESCape routine (27). This routine puts the LCD output routine into ESCape mode. The following characters processed throught the video driver will be used to determine the escape sequence. 43B8H - Start of lookup table for LCD escape sequences. Each entry starts with the one byte escape letter followed by the two byte vector address. 43F9H - End of escape vector lookup table 43FAH - ESCape sequence processor. This routine is used after the escape mode has been enabled (see 43B2H). 4431H - Escape p routine (start inverse video) 432H - Escape q routine (cancel inverse video) 4437H - Escape U routine (unprotect line 8) 4439H - Escape T routine (protect line 8) 443FH - Escape V routine (Stop automatic scrolling) 4440H - Escape W routine (Resume automatic scrolling) 444AH - Escape X routine 4453H - Escape C routine (move cursor to the right) 445CH - Escape D routine (move cursor to the left) 4461H - Backspace routine (08H) 4469H - Escape A routine (move cursor up one line) 446EH - Escape B routine (move cursor down one line) 4480H - Tab routine (09H) 4494H - Linefeed routine (0AH) 44A8H - Verticle tab (0BH) and ESC H routine (home cursor) 44AAH - Carriage return routine (0DH) 44AFH - Escape P routine (turn cursor on) 44BAH - Escape Q routine (turn cursor off) 44C4H - Escape M routine 44EAH - Escape L routine (insert line on screen) 4535H - Escape l routine (erase current cursor line) 4537H - Escape K routine (erase from cursor to the end of the screen) 4548H - Form feed (0CH), CLS, ESC E, and ESC j routine 454EH - Escape J routine 463EH - Input line and place at F685H. Print characters as they are entered. Start input with a "? ". Exit: F685H - Text input from keyboard HL - Loaded with F685H C flag - Set if input aborted by a control C 4644H - Same as 463EH but no "? " is printed. 4684H - Input routine 463EH Control C handler 4696H - Input routine 463EH ENTER handler 46A0H - Input routine 463EH backspace, left arrow, control H handler 46C3H - Input routine 463EH Control U & X handler 46CAH - Input routine 463EH Tab handler 478BH - DIM Statement 4790H - Find the address of the variable in the buffer pointed to by HL. This routine returns the same result as BASIC's VARPTR instruction. Entry: HL - Points to the buffer containing the variable name Exit: HL - Incremented past variable name DE - Address of variable descriptor table (like VARPTR) (FB65H) - Variable type 4991H - USING Function 4B44H - Vector of RST 20H. Send the character in A to the screen or printer (see RST 20H). 4B55H - Print the character in the A register on the printer. Expand tabs into spaces if nescessary. Entry: A - Character to output 4B92H - Reinitialize screen back to the LCD. This routine sends a CR to the printer if needed to empty the print buffer on the printer. 4BABH - LCD character output routine Entry: A - Character to output 4BB8H - Send a CRLF to screen if needed to end the current line. This routine assures that the next text printed on the screen will start at the beginning of a line. Exit: A - Destroyed 4BEAH - INKEY$ Function 4C84H - Get information for the file number in the A register. This routine performs the same as VARPTR(#x). If A is greater than MAXFILES, a BN error is generated. Entry: A - File number (1-maxfiles) Entry: HL - Points to file number descriptor table (see VARPTR(#x). Z flag - Set if file is not already opened 4CCBH - OPEN Statement 4D59H - LCD, CRT, and LPT file close routine 4D6EH - RUN statement with text following the RUN 4D70H - LOAD Statement 4D71H - MERGE Statement 4DCFH - SAVE Statement 4E28H - CLOSE Statement 4E8EH - INPUT$ Function 4F0AH - Zero the memory starting at HL for B number of bytes Entry: HL - Start of buffer to zero B - Number of bytes to zero Exit: HL - Incremented past last byte zeroed A = 0 B = 0 4F0BH - Fill the memory starting at HL with the byte in the A register for B number of bytes Entry: HL - Start of buffer to fill A - Character to fill buffer with B - Number of bytes to fill Exit: HL - Incremented past last byte filled B = 0 4F2EH - Routine called by the PRINT statement to initialize a PRINT #. 4F5BH - LINE INPUT # statement 504EH - Generate NM error 5051H - Generate AO error 5054H - Generate DS error 5057H - Generate FF error 505AH - Generate CF error 505DH - Generate BN error 5060H - Generate IE error 5063H - Generate EF error 5066H - Generate FL error 506BH - LOF Function 506DH - LOC Function 506FH - LFILES Function 5071H - DSKO$ Function 5073H - DSKI$ Function 50F1H - Start of device name table. Each entry starts with the text name of the device ending with a FFH. 5112H - End of device name table 5113H - Start of device control block vector addresses. Each two byte pointer corresponds to the name in the device name table at 50F1H. This pointer points to the device's DCB which contains the vectors for device open, close, output, and input. 5122H - End of device control block vector addresses ROM: Part V 5146H - Entry to TELCOM 515BH - TELCOM Ready re-entry point for TELCOM commands 5185H - Start of TELCOM instruction vector table. Each entry starts with a 4 byte instruction name followed by a 2 byte routine vector. 51A2H - End of TELCOM instruction vector table 51C0H - TELCOM STAT instruction routine 51C7H - Print current STAT (RS232 settings for TELCOM) and return to TELCOM ready 51EDH - Set STAT (RS232 settings for TELCOM) and return to TELCOM ready 522FH - TELCOM CALL instruction routine 524DH - TELCOM FIND instruction routine 52BBH - Disconect phone line and disable modem carrier Exit: A - New contents of port 0BAH 52D0H - Connect phone line and enable modem carrier Exit: A - New contents of port 0A8H C flag - Set 52E4H - Lift telephone and wait for a carrier. The carrier must be present for more than 2 seconds to qualify a carrier detect. Exit: C flag - Set if shift break pressed Z flag - Set if carrier present 5310H - Pause for about 2 seconds Exit: BC & AF - Destroyed 532DH - Execute logon sequence pointed to by HL. This routine is used to drive the Model 100 autodialer Entry: HL - Points to logon buffer 540AH - Dial the digit that is present in the A register. The ASCII equivalent of the number is printed on the screen at the current cursor position as this routine is dialing. Entry: A - Digit to dial Exit: All registers destroyed 5455H - TELCOM TERM instruction routine 550DH - Start of function key vector table for TERM commands in TELCOM. Each 2 byte vector correspondsto each function key. 551BH - End of function key vector table for TERM 5523H - TELCOM PREV function routine 553EH - TELCOM FULL/HALF function routine 5550H - TELCOM ECHO function routine 559DH - TELCOM UP function routine 567EH - TELCOM DOWN function routine 571EH - TELCOM BYE function routine 5791H - Print the buffer pointed to by HL till a null or '"' is found. Printing begins at the start of a line. If the cursor is not at the begining of the line, a CR is sent. Entry: HL - Points to the start of the buffer to be printed 5797H - MENU Statement. Go to main menu 59ADH - Convert filename from right justified extention (name padded with spaces to cause extention to be last two characters) to normal filename with "." delimeter for extention. Entry: DE - Points to right justified extention filename (8 characters) HL - Points to the start of the destination buffer for the converted filename Exit: HL - Points to end of destination buffer where the filename is stored. Filename is terminated with a null. DE - Points to end of source filename A - Destroyed 5A12H - Print time, day, and date on the first line of the screen (used on main menu). The screen is cleared prior to printing Exit: All registers destroyed 5A15H - Same 5A12H but screen is not cleared. Line is still printed on top line of screen. Exit: All registers destroyed 5A58H - Print the buffer pointed to by HL. Printing terminates with a null. Entry: HL - Points to the buffer to be printed Exit: HL - Points to the terminating null A - 0 5A62H - Move the memory pointed to by DE to the memory pointed to by HL for A number of bytes. HL and DE are incremented after each byte moved Entry: DE - Points to start of source memory HL - Points to start of destination memory A - Number of bytes to move Exit: DE & HL - Incremented past last byte moved A = 0 5A6DH - Compare the buffer pointed to by DE to the buffer pointed to by HL for C bytes or until a null is found in the buffer pointed to by DE. Entry: DE - Points to start of first buffer HL - Points to start of second buffer C - Number of bytes to compare Exit: A = 0 if the compare was ended with a null C - Number of bytes remaining until compare would have been successful. HL & DE - If compare is successful, these registers are incremented past the last byte compared. If the compare ended with a null, DE points to the null. If compare is unsuccessful, these registers point to the offending characters Z flag - Set if compare is successful 5A79H - Clear function key definition table Exit: All registers destroyed 5A7CH - Set new function key table. The table contains the function key definitions up to 16 characters for each of the 8 function keys. The last byte of each entry should have the high bit set to signify the end of the function key definition. Empty entries should contain an 80H. Entry: HL - Points to function key table Exit: All registers destroyed 5A9EH - Display function keys on 8th line if enabled Exit: All registers destroyed 5AA9H - Search directory for filename Entry: DE - Points to buffer containing filename. The buffer is terminated with a null. Exit: HL - Address of file directory entry Z flag - Set if file was not found All other registers destroyed 5AE3H - Get start address of file Entry: HL - Points to the file's directory entry Exit: HL - Points to start of file DE - Points to directory entry + 2 5B68H - Entry to ADDReSS 5B6BH - Enter ADDReSS using the filename pointed to by DE. Entry: DE - Points to the filename to use with ADDReSS terminated with a null 5B6FH - Entry to SCHEDuLe 5B72H - Enter SCHEDuLe using the filename pointed to by DE. Entry: DE - Points to the filename to use with SCHEDuLe terminated with a null 5BF5H - FIND instruction for ADDRSS/SCHEDL 5BF7H - LFND instruction for ADDRSS/SCHEDL 5C3FH - Find the text in the buffer pointed to by HL in the text file pointed to by DE. All lowercase letters are converted to uppercase prior to compare. Entry: HL - Points to string to search for. The string must end with a null DE - Points to where search is to begin in the text file Exit: BC - Points to the start of the found string in the file. DE - Points to the start of the record where the string was found C flag - Set if string found 5C6DH - Incremented DE past the next CRLF in the text file. Entry: DE - Points to a text file Exit: DE - Points to the byte following the next CRLF in the text file A - Destroyed 5C74H - Check the next byte(s) in the buffer pointed to by DE for a CRLF. Entry: DE - Points to buffer where CRLF check is to be made Exit: DE - Incrmented once if no CRLF is found or twice if a CRLF is found Z flag - Set if CRLF found 5CEFH - Start of ADDRSS/SCHEDL instruction vector table. Each entry starts with a 4 byte instruction name followed by the instruction's 2 byte vector address 5D00H - End of ADDRSS/SCHEDL instruction vector table 5D64H - Wait for character from keyboard and convert it to uppercase if nescessary. All function keys are converted into their pre-programmed text. Exit: A - Uppercase character from keyboard 5D6AH - Home Cursor Exit: HL - Destroyed 5D70H - Print time on top line of screen until a key is pressed. When a key is pressed, the cursor returns to its original position prior to the cal. 5DEEH - Entry to TEXT 5E51H - EDIT Statement 5F2FH - Wait for a space to be entered on keyboard Exit: A - Space (20H) 6018H - Start of TEXT control character vector table. Each 2 byte vector entry corresponds to the ASCII value of the control character (ex. The address at 6018H points to the routine for ^A which has an ASCII value of 1) 6055H - End of TEXT control character vector table 6056H - TEXT ESCape routine 607CH - TEXT control P routine 608AH - TEXT control I routine 60BEH - TEXT control M routine 60DEH - TEXT right arrow and control D routine 60E2H - TEXT down arrow and control X routine 610BH - TEXT control H routine 6151H - TEXT left arrow and control S routine 6155H - TEXT up arrow and control E routine 617AH - TEXT control F routine 618CH - TEXT control A routine 61C2H - TEXT control T routine 61D7H - TEXT control B routine 61FDH - TEXT control R routine 620BH - TEXT control Q routine 6210H - TEXT control W routine 621CH - TEXT control Z routine 6242H - TEXT control L routine 628FH - TEXT control C routine 6431H - TEXT control O routine 6445H - TEXT control U routine 6551H - TEXT control N routine 65C3H - Move the memory pointed to by HL to the memory pointed to by DE until a null (0) is found. Entry: HL - Points to start of source buffer DE - Points to start of destination buffer Exit: HL - Preserved DE - Points to the byte following the null A = 0 6691H - TEXT control Y routine 6713H - TEXT control G routine 6774H - TEXT control V routine 6B61H - Insert a character into a text file Entry: HL - Points to place to insert character A - Character to insert Exit: HL - Incremented past inserted character B - Character inserted C flag - Set if out of memory All other registers destroyed 6B6DH - Inset BC number of spaces in memory Entry: HL - Points to place where insertion is to begin. BC - Number of spaces to insert Exit: HL - Preserved C flag - Set if out of memory All other registers destroyed 6B9FH - Delete BC number if characters in a text file. Entry: HL - Points to place where deletion is to begin. BC - Number of characters to delete Exit: HL - Preserved All other registers destroyed 6BDBH - Move the memory poined to by HL to the memory pointed to by DE for BC bytes. HL and DE are incremented on each byte transfered (same as LDIR). Entry: HL - Points to end of source memory DE - Points to end of destination memory BC - Number of bytes to move Exit: HL & DE - Incremented past last character moved A - Destroyed 6BE6H - Move the memory pointed to by HL to the memory pointed to by DE for BC bytes. HL and DE are decremented on each byte transfered (same as LDDR). Entry: HL - Points to end of source memory DE - Points to end of destination memory BC - Number of bytes to move Exit: HL & DE - Decremented past last character moved A - Destroyed 6BF1H - Start of ROM program catalog entries 6C48H - End of ROM programs catalog entries 6C49H - Entry to BASIC 6CD6H - Re-initialize system. User files are not lost. 6CE0H - Warm Start Reset Entry ROM: Part VI 6D3FH - Send a character to the printer Entry: A - Character to send Exit: C flag - Set if break key interrupt 6D6DH - Check RS232 queue for pending characters Exit: A - Number of characters pending Z flag - Set if no characters pending 6D7EH - Get a character from the RS232 receive queue. If no character is pending, wait for a character. Exit: A - Character received Z flag - Set if no error C flag - Set if break key interrupt 6DACH - RST 6.5 (RS232 Interrupt on received character) routine 6E0BH - Send XON (Control Q) out the RS232 if enabled by FF42H. Exit: A - Destroyed 6E1EH - Send XOFF (Control S) out the RS232 if enabled by FF42H. Exit: A - Destroyed 6E32H - Send a charcter out the RS232 (routine waits for character to be transmitted). Entry: A - Character to send Exit: C flag - Set if shift break pressed 6E75H - Set the RS232 baud rate Entry: H - Baud rate code (1-9) Exit: A & DE - Destroyed 6E94H - Start of 18 byte RS232 baud rate timer values. Each 2 byte entry corresponds to the baud rates 0-9. These values are loaded into the 8155's timer to generate the baud rate for the UART. 6EA5H - End of RS232 baud rate timer table. 6EA6H - Initialize RS232 or modem Entry: H - Baud rate code for RS232 (300 baud assumed for modem). L - Configuration code Bit 0 - Number of stop bits (0=1, 1=2) 1 - Parity (0=odd, 1=even) 2 - Parity enable (0=enable) 3-4 - Word length (01=6, 10=7, 11=8) C flag - Set if RS232, reset if modem 6ECBH - Deactivate RS232 or Modem Exit: A - Destroyed 6EE5H - Click sound port if sound is enabled 6EEFH - Check for carrier detect Exit: A - 0 if carrier detect, 0FFH if no CD Z flag - Set if carrier detect 6F31H - Enable XON/XOFFs when control Ss and Qs are sent. Exit: A - Destroyed 6F46H - Write cassette header and sync byte All registers destroyed 6F5BH - Write a character to cassette without checksum. Entry: A - Character to save Exit: All registers destroyed 6F85H - Read cassette header and sync byte Exit: C flag - Set if error, reset if header verified All registers destroyed 6FDBH - Find the frequency of the cassette port. This routine measures the duration from the start to the stop of half of the wave presented on the cassette port. The result is the number of 29 t-state cycles required to find the end of the wave. The byte at FF8EH determines if the count will trigger on a high or low pulse. For example, a 1200 hz signal, which would take 416 ms to go through half of the wave, would cause this routine to exit with a value aound 35. If the sound option is turned on (see FF44H), this routine will click the beeper on each call. Note: Although this routine analyses the cassette port in 29 T-state intervals, the actual routine requires much more time to execute. Exit: C - Number of 29 T-state cycles A - Destroyed C flag - Set if the routine was canceled by a shift break 702AH - Read a character from cassette without checksum. Exit: D - Character from cassette C flag - Set if the routine was canceled by a shift break All other registers destroyed 71F7H - POP AF, BC, DE, and HL off stack, enable interrupts and return. This routine should only be used with a jump to assure stack integrety. This routine makes a good interrupt routine exit vector. 7242H - Scan keyboard for a possible character (Note: Shift Break is converted to Control C) Exit: A - Character from keyboard Z flag - Set if no key is found C flag - Set if special function key A Key ----------------------- 0-7 F1-F8 8 LABEL 9 PRINT 0AH SHIFT-PRINT 0BH PASTE 726AH - Enable interrupts as normal (nothing destroyed) 7270H - Check keyboard queue for pending characters Exit: A - Destroyed Z flag - Set if charcter pending C flag - Set if break is present 7283H - Check for break (Control C) or wait (Control S) Exit: A - Destroyed C flag - Set if Control C or S Z flag - Set if no control C or S 729FH - Check to see if SHIFT BREAK is being pressed. Exit: A - Destroyed Z flag - Set if shift break is being pressed C flag - Set if shift break is being pressed 72B1H - Scan BREAK, CAPS, NUM, CODE, GRAPH, CONTROL, and SHIFT key column of keyboard. Reset the bit in the A register that corresponds the key being pressed Exit: A - Each reset bit coresponds to a key being pressed (BREAK=bit 7, CAPS=bit 5, etc.) 72C5H - Produce a tone through the internal transducer. The RS232 cannot be used along with this routine. Entry: DE - Frequency B - Duration Exit: A - Destroyed 7329H - Load the contents of the clock chip registers into the address pointed to by HL. Entry: HL - Start of receiving buffer for the contents of the hardware clock chip 732AH - Update the clock chip internal registers with the time in the buffer pointed to by HL Entry: HL - Start of the buffer containing the new values for the clock chip 744CH - Plot point on screen Entry: D - X coordinate E - Y coordinate Exit: All registers destroyed 744DH - Reset point on screen Entry: D - X coordinate E - Y coordinate Exit: All registers destroyed 765CH - Set interrupt to 1DH Exit: A - Destroyed 7662H - Beep routine (07H) Exit: A & BC - Destroyed 7676H - Click sound port Exit: A - Destroyed 7711H - Start of LCD character generator shape table. Five bytes per character for the first 128 characters. 6 bytes per character for characters 128-255. 7BF0H - End of LCD character generator shape table. 7BF1H - Start of keyboard conversion matrix. 7D32H - End of keyboard conversion matrix. 7D33H - Boot routine 7EACH - Display the number of free memory bytes on the screen. 7FD6H - RST 38H RAM vector driver routine (see 38H). RAM - Model 100 RAM Memory Map - F5F4H - Himem (2) F5F9H - RST 5.5 RAM vector (3) Used for BCR interrupt F5FCH - RST 6.5 RAM vector (3) Used for UART interrupt (Called) F5FFH - RST 7.5 RAM vector (3) Used for Timer interrupt (Called) F602H - RAM vector for TRAP interrupt (3) (1431H) F62AH - Option ROM flag (0-no option ROM) F62BH - Dial speed (1=10pps, 2=20pps) F630H - Start of 8 byte table for each function key status (1=on, 0=off) F639H - Cursor row (1-8) F63AH - Cursor column (1-40) F63BH - Number of active rows (1-8) F63CH - Number of active columns on screen (1-40) F63DH - Label line/8th line protect status (0=off) F63EH - Scroll disable flag (0-allow scrolling) F63FH - Cursor status (0-off, 1-on) F640H - Cursor row (1-8) F641H - Cursor Column (1-40) F646H - ESCape mode flag for RST 20H (0-normal video, not zero-ESCape mode) F648H - Reverse video switch (0=off) F64EH - X coordinate of last graphic point plotted F64FH - Y coordinate of last graphic point plotted F656H - Power off exit condition switch (0-return control back to program on power up, 1-return to menu on power up) F658H - Full/half duplex switch (0-half duplex) F65AH - Auto linefeed on RS232 output switch (0-auto linefeed option off, not zero-automatically send a linefeed after every carriage return) F65BH - Start of textual RS232 parameter setting buffer. This buffer is normally used to store the STAT setting for TELCOM (5) F660H - Self modifying address called on CALL statement F661H - Address last called (2) F667H - Called on OUT statement F66AH - Called on INP function F672H - Error code of last error F674H - Line printer head position F675H - Output device for RST 20H (0=screen, 1=printer) F678H - Start of string buffer for BASIC (2) F67AH - Current executing line number, FFFFH if no program running. (2) F67CH - Start of BASIC program pointer (2) F680H - End of statement marker ':' or null F685H - Start of keyboard buffer used by the keyboard line input routine at 4644H. F788H - Current horizontal position of cursor (0-39) F789H - Function key definition area (128) F80AH - Function key definition area used by BASIC (128) F88CH - End of used RAM for permanent storage (does not include variables, paste buffer, etc.) (2) F923H - Seconds (ones) F924H - Seconds (tens) F925H - Minutes (ones) F926H - Minutes (tens) F927H - Hours (ones) F928H - Hours (tens) F929H - Date (ones) F92AH - Date (tens) F92BH - Day code (0=Sunday, 1=Monday, etc.) F92CH - Current month (1-12) F92DH - Year (ones) F92EH - Year (tens) F933H - Seconds (ones) F934H - Seconds (tens) F935H - Minutes (ones) F936H - Minutes (tens) F937H - Hours (ones) F938H - Hours (tens) F939H - Date (ones) F93AH - Date (tens) F93BH - Day (0=Sunday, 1=Monday, etc.) F93DH - Time for ON TIME interrupt (SSMMHH) (6) F944H - On Com flag (0=off, 255=on) F945H - Address of On Com routine (2) F947H - On time flag (0=off, 255=on) F948H - Address of on time routine (2) F94AH - Function key vector table (24) First byte - On/off status Next 2 bytes - Vector address F962H - Start of RAM directory Byte 1 - Directory flags. A 255 specifies the end of the directory. Bit 7 - Set if valid entry 6 - Set for .DO file 5 - Set for .CO file 4 - Set for ROM file 3 - Set for invisible file 2-3 - Address of file 4-11 - Eight byte filename. Filename must have extention right justified and filename left justified. Any gaps should be filled with spaces (ex. "ADD.DO" should be "ADD DO") F99AH - Address of current BASIC program not saved (Suzuki) (2) F9A5H - Start of Paste buffer (Hayashi) (2) FAACH - ASCII character last output to printer FAADH - Label line enable flag (0=not enabled) FAAEH - Contents of port 0A8H FAAFH - Start of IPL filename (8) FABAH - Address where last BASIC list started (2) FABEH - Storage for stack pointer on power up/down for continued program execution after a power down (2) FAC0H - Lowest RAM memory address used by system (8000H for a 32k system) (2) FAC9H - Offset of last RST 38H call FAD0H - Length of last program loaded or saved on tape FADAH - Start of RST 38H vector table (256) FAE2H - LCD character output RAM vector for 20H routine. The address at this location is called everytime a character is sent to the LCD (note:This routine is called at 4317H). (2) FAE4H - Printer output RAM vector. The 2 byte address at this location is called everytime a character is output to the printer via the routine at 1470H. (2) FB00H - EOF function RAM vector. The 2 byte address at this location is called evertime an EOF function is performed. (2) FB0CH - TERM F6 RAM vector (2) FB0EH - TERM F7 RAM vector (2) FB14H - WIDTH statement RAM vector. (2) FB1AH - CRT open routine RAM vector (2) FB1EH - CRT output file routine RAM vector (2) FB20H - WAND Open routine RAM vector (2) FB22H - WAND Close routine RAM vector (2) FB24H - WAND Get routine RAM vector (2) FB26H - WAND Special I/O routine vector (2) FB28H - LOF function routine RAM vector (2) FB2AH - LOC function routine RAM vector (2) FB2CH - LFILES statement routine RAM vector (2) FB2EH - DSKI$ routine RAM vector (2) FB30H - DSKO$ routine RAM vector (2) FB64H - Create/Locate switch for variables used in the main evaluation routine (Locate=0, Create>0). FB65H - Type of last variable used (2-Integer, 3-String, 4-Single Precision, 5-Double Precision) FB67H - Start address for file buffer area (2) FB94H - Line number of current data statement FB96H - 0 if no FOR/NEXT loop in progress FB99H - Address of last variable assigned via a LET instruction. This address points to the variable description table as with a VARPTR(variable) instruction. FB9BH - Pointer to most recent or currently running line (2). This address points to the actual text skipping the line number and spaces. FB9DH - Stack pointer value used by BASIC to reinitialize the stack. This memory pointer is updated after each instruction by the routine at 0804H. (2) FB9FH - Line number of last error (2) FBA1H - Most recent used or entered line number (2) FBA3H - Pointer of where error occured (2) FBA5H - Address of ON ERROR routine (2) FBAAH - Line where last break, END, or STOP occured (2) FBACH - Address where program stoped on last break, END, or STOP (2) FBAEH - Pointer to the start of the DO files and end of the BA files. (2) FBB0H - Pointer to the start of CO files (2) FBB2H - Pointer to the start of variable table (2) FBB4H - Pointer to the start of array table (2) FBB6H - Pointer to the start of the systems unused memory (2) FBB8H - Address where DATA search will begin on next READ statement (2) FBBAH - 26 byte table for default variable types declared by the DEF statement. Each entry corresponds to one of the letters A-Z. The contents of each entry are 2 for an integer, 3 for a string, 4 for a single precision number, and 8 for a double precision number. (26) C18H - Start of FAC1 for single (4) and double (8) precision number (8) FC1AH - Start of FAC1 for integers (2) FC69H - Start for FAC2 for single (4) and double (8) precision numbers FC6BH - Start of FAC2 for integers (2) FC82H - Maximum number of open files (Maxfiles) (1) FC83H - Pointer to the 30 byte file number description pointer table-2. Each entry of thetable points to the actual file description table (same as VARPTR(#x)). FC8CH - Pointer to the file description table for the last file used (2) FC93H - Filename of current BASIC program (6) FC9CH - Filename of last program loaded from tape (6) FCC0H - Start of alternate LCD character buffer (320) FDFFH - End of alternate LCD character buffer FE00H - Start of LCD memory (320) FF40H - End of LCD memory FF42H - XON/XOFF enable flag. If this byte is 0, XON/XOFFs are not significant for RS232 operations. If this byte is greater than 0, XON/XOFFs are treated as normal. FF43H - RS232 initialization status (0-deactivated, >0- activated) FF44H - Sound flag (0=on) (1) FF45H - Contents of port 0E8H (1) FF46H - Start of 64 character RS232 buffer (64) FF86H - Number of characters in the RS232 buffer (FF46H). When this number reaches 40, a control S is automatically sent by the system. FF8AH - Status of control S (1-Control S has been pressed, 0-no control S is active). FF8BH - 8155 UART baud rate generator baud rate timer value (2) FF8EH - High or low cassette level trigger flag for 6FDBH (1) FF97H - 8 bits for storing space, del, tab, esc, paste, label, print, and enter key recognition. F98H - 8 bits for storing function key recognition FFA2H - 8 bits for storing shift, ctrl, grph, code, num, and caps lock. FFAAH - Number of characters in keyboard buffer. FFABH - Start of keyboard typeahead buffer (32) FFECH - Start of 5 byte table describing the bit pattern currently under the cursor (5) u formatted for the Mac by Andy Diller 1994 dillera@cygnus.umd.edu A - Number of characters pending Z flag - Set if no characters pending 6D7EH - Get a character from the RS232 receive queue. If no character is pending, wait for a character. Exi  "s"%%?'_'//;;= ===7=8===O=T========>=>B>v>{>>>>? ??M?R??????@@@@@A@F@a@f@@@@@@@@AA AAAFAPAUAqAvAAAAAABB     9``YBB B%BdBiBsBxBBBBBBCCC'C,CeCjCCCCDDDMDRDDDDDDDDEEE'E,ETEYEEEEFF F"F'F1F6FPFUFFFFGG GOGTGGGGHHHIHNHHHHIIIZI_InIsIIIIJ JJ9J>JgJlJJJJJJK2K7  `K7K`KeKKKKKKLL"L_LdLLLLMM M:M?MZM_MvM{MMMMMMMMNNNN#N?NDNONTNzNNNNNNNOO!O+O0O_OdOOOOOPPBPGPPPPPPQ:Q?QJQOQQQQRR RIRNRRRRRRRRSSS^ScSSSS  `STTT\TaTmTrT}TTTTTTTUUU'U,USUXUUUUUUVV"VEVJVTVYVnVsVVVVVVVVW!W&W]WbWWWWX(X-XJXOXZX_XXXXYYY%Y*YlYqYYYYZZZWZ\ZZZZZZZ[[9[>[q[v[[[[[[\\\*\/  `\/\E\J\`\e\\\\]+]0]Q]V]a]f]]]]^ ^%^<^A^^^^^^_ __Q_V_q_v______```(`-`o`t``````a aa<aAazaaaaaaaaaabbbb-b2bubzbbbbbbbbccc2c7cLcQccchc~ccccc  `ccccccddd$d&d+dcdhdddddde2e7eye~eeeeeef&f+fhfmfffffffggBgGgogtg~ggggggghh h+h0hOhThuhzhhhhhii$i)i3i8iaifiiiiiiiiiij"j'j9j>j^jcjtjyjjjjjj  `jjjjjjkk6k;kFkKk|kkkkkkkll#l-l2lKlPl|lllllllmm mJmOmym~mmmmn nnnnAnFn{nnnnno o%oPoUoooopppXp]ppppppq$q)q3q8qmqrqqqqqqrrr'r,rlrqrrrrrr  `rrrrrsss(s-s@sEsssst ttQtVtktpt{ttttttuu%u*uaufuuuuuuv vv9v>vmvrv|vvvvvvvvww/w4wIwNw}wwwwwwwxxx!x&xIxNxxxxxxxxyy!yOyTy_ydyyyyyyyyzz  `zz'z,zVz[z{zzzzzzzz{{{{{${g{l{{{{{{|||6|;|W|\|y|~|||||||}}}"}?}D}`}e}}}}}}}}~~ ~)~.~S~X~|~~~~~~~27chsx$6;OT  `CHRW#(in#(;@z .3=Bv{38v{(-GLhm (-otLQ[`y~  ` #(:?TYqv05NSgl*/DI]blq 5:NSfk %fk}?Dmr  `/4dity "'=BW\).8=`e',BGRW AF`eDIsx MR-2DI\aw|  ` #(X]hm 27glw|AF LQCH %*Y^in 38ejuz   `:? SX -2<Abgx} +0:?afw| "'16TYjoz .3=Bjo  `:?hm GLV[~&+6;kpz @EOTw|"9>GL~ 05JOafx}  `(-in =BkpNS]b \a9>SXch$EJ ).8=mr16AF  `EJ#JOY^?DSXch GLfk */HMrw NS^c ,1MRsx%*bg  `gqv 05v{=Bns~/4?Dejty38BGy~(-_d"'Y^pu W\  `\$)KP{€ %*5:]bÆËÕÚü16rwěĠīİ DIz#-2UZƑƖƪƯƺƿ$.3glǣǨǽ27AFzȻ  `INX]ɀɅ"PU_dʇʌ$)W\fkˎ˓05?Dej̷̢̧̲!&@E͇͂ͥ͠Ͱ͵ %HM·ΌΗΜ =BMRϔϙϾ  `[`ТЧ38diёі 8=chҞңY^Ӡӥ#(?D~ԃԫ԰ԺԿBGhvx}Օ՚ճո"DI`ey~֑֖֪֯',X]glזכ  `9>HMfkؚ؟شع !BGQVinْٗ١٦ٸٽ).AFpuڄڗڜ(-7<OTۊۏۙ۞۱۶ ?DNSfkܛܠܬܱܻ#6;w|  `|݆݋ݞݣݲݷ%*>Cބމޓޘެޱ 49DIfk߄߉ߓߘ߲߷ +0;@ @E <A&+TY"7<}  ` PU>Cty27TY:?bg @E#(NS]bINuz27y~).8=kp  `p5:UZFK>CCHDIdi05JOch}=BLQ  `&+RW UZv{#:?V[rw38bgRW=B 5:|9>qv  ` %9> 38V[ej 38z */9>afGLns 38uz LQw| >CNS%*  `*49w|-2qv5:TYch(-7<jo   $ ) 4 9 h m         ) . p u         E J t y       * / m r     1 6 q v   `      NSHMX] -2TYdi"KPy~$RWmr%*AF~(-UZY^}  `-2FK"'LQ[`$)27BG%*lqW\!&@E!PU_d PU{  `16bg27SXty   : ? [ ` |     !! !+!0!;!@!p!u!!!!!!"""("-"I"N"j"o""""""###(#-#7#<#o#t######$$$)$.$j$o$$$$$$  `$$$%%"%U%Z%e%j%%%%%%&& &2&7&x&}&&&&&&' '%'X']''''''''(3(8(u(z(((((()))@)E)O)T))))))** **"*W*\*w***********+%+*+W+\+f+k++++,, ,<,A,K,P,r,w  `,w,,,,-- -I-N-X-]-w-|------./.4.H.M.X.].~.........///%/*/D/I////000&0+0T0Y0w0|000000111J1O1~111112!2&2D2I2S2X2r2w2222223 334393o3t3~3333333  `34+404;4@4a4f4p4u44444455565;5w5|55666F6K666677 7^7c777780858\8a8k8p888889999>9G9L9s9x9999:(:-:j:o::::;;;5;:;D;I;p;u;;;;;;<>>>">;>@>e>j>>>>>>>>?/?4?h?m????@@@)@.@o@t@@@@AAA)A.AGALAcAhArAwAAAAAABB BKBPBtByBBBBBBC3C8CWC\CuCzCCCCCCCCCDDD!D,D1DMDRDnDs  `DsD|DDDDDDDDDE EEE E:E?ETEYEcEhEEEEFF F3F8FiFnFFFFFFGG!GTGGGGGGGHH#HbHgHHHHHHI-I2I>ICIYI^IxI}IIIIJJ J9J>J_JdJzJJJJJJJKKKMKRKKKKLLL4L9L{L  `LLLLLMMM^McMkMpMMMMMMN NN-N2NRNWNNNNOOO OO:O?OhOmOOOOOPP*P/PePjPPPPPPQQ QQ#Q7Q<QNQSQeQjQ{QQQQQQQQQR RR#R(R<RARURZRnRsRRRRRRRRRRS#S(SISNSqSv  `SvSSSSSSTTT7T<TWT\TTTTTTUU U0U5UXU]UUUUUUV0V5VrVwVVVVW WW;W@WlWqWWWWWWX'X,XYX^XXXXXXYYY?YDYYYYZ ZZJZOZZZZZ[[C[H[d[i[[[[[[\ \\6\;\b\g\\  `\\\\\]]]H]M]o]t]]]]^^ ^J^O^r^w^^^^^__C_H______`=`B`R`W`````aa'a,a\aaaaaaaab4b9b|bbbbbbbcc$c_cdccccccd<dAdddddde0e5e=eBefekeeeefffOfT  `fTffffg ggggHgMggggggh hh(h-hnhshhhhi)i.iIiNimiriiiij+j0j<jAj~jjjjjkk$kgklkkkkll lllGlLlyl~llllllllm m m"  @  I?l;<"<o@ghi<y HdM  B } . i  T k 4 y A '\]  $2?! ! ! ! ! !=YH 0e!BO\Gp'7v"9fgh8z6_EcDE]^uvWlzXn! cAhYgu 6Cst H 1 l !!V!!!!"7"q"r"s"""##]##$$U$$%%%%?%@%{%%&.&m&&'(')']'^'_'''((S((())M)}))*%*b**+ +8+\++,,;,r,,! ! a,- -=-y--..T.../#/_/////334477889u9v::;;;;;;<<=>v>>?? ?M???@@@A@a@@@@@AAAAPAq!! !! ! ! !  ! ! ! OAqAAAABB BdBsBBBBCC'CeCCCDDLDMDDDDEE'ESETEEFFF"F1FOFPFFGGGOGGHHHIHHIIZImInIIIIJ J J8J9JfJgJJJJJJK1K2K_K`KKKKKKLLL^L_LLLLMMM9M:MYMZMuMvMMMM! cMMMMMNNNNN?NONyNzNNNOO+O^O_OOOOOPBPPPPQ:QJQQQRRIRRRRSSS^SSTTT\TmT}TTTUU'UQURUSUUUVVEVTVmVnVVVVVVVVW!W]WWX(XJXZXXXYY%YlYYYZZWZZZZ[9[p[q! c[q[[[[[[[\\\)\*\D\E\_\`\\]+]Q]a]]^^ ^;^<^^^_ _Q_q____``(`o```a a;a<ayazaaaaaaaaaabbb,b-bubbbbbbccc1c2cKcLcbccc}c~ccccccccccdd$d%d&dcddde2!! ae2eyeeef&fhffffffgBgog~gggggghhh*h+hNhOhthuhhhi$i3i`iaiiiiij!j"j8j9j]j^jsjtjjjjjjjjjjjjk6kFk|kkkkll-lKl{l|llllllmmJmymmn nnAn{nno oOoPoooppXp! cpppq$q3qmqqqqqr rr&r'rlrrrrrsss's(s?s@sst tQtkt{tttu%u`uauuuv v8v9vmv|vvvvvw.w/wHwIw|w}wwwwwwxx!xHxIxxxxxxxyyyOy_yyyyyzz'zVz{zzzzzzz{{{g{{! c{{{{|||5|6|V|W|x|y||||||||}}}>}?}_}`}}}}}}}}~~~(~)~R~S~{~|~~~~~~2cs56NOCR#i"#:;z .=v23v! c(FGgh '(oL[y "#9:STpq/0MNfg)*CD]l 45MNef f}! c?m/dt!"<=VW)8_`'BR A_`CDrs LM5w,-CD[\vw! a "#Xh12gw@A LC$%Yi23eu 9:S-<abx+:`aw"1STjz! c .=ij:gh GV}~&6kz @Ovw9G~/0IJ`awx(i=jkN]\! c9ScDE)8m1AEJY?Sc Gef*HrN^ ,Mrs%bq/0v<=n~! c/?et3Bxy(^_"XYop VW$Kz{%5]ÆÕü1rěīDyz-TUƑƪƺ.fgǣǽ2AyzȻIXɀ! cP_ʆʇ$Wfˍˎ0?de̢̲!?@͂͠Ͱ GH·Η =MϔϾ[Т3dё 8cҞYӠ#?~ԫԺABhvwxՔՕղճCD_`xy! ay֐֑֪֩'Xgז9HfؙؚسشBQhiْ١ٷٸ)@Apږڗ(7NOۊۙ۰۱ ?Nefܛܬܻ56w݆ݝݞݲ%=>ބޓޫެ 4Df! cf߄ߓ߲߱+; @;<%&ST67} P=>st12ST9:ab ?@#N]! cHItu12y)8k5TUF>CDd/0IJbc|}=L&R T! cTUuv9:UVqr3abR<= 45|89q 8923Ve23z*! a*9`aFGmn  23uKLvw>N%4w,-q5Tc(7j  $ 4 h     ( ) p     E t    * m   1 q    N! cHX,-TdKxyQRlm$%@A~'(TUY}-F"L[$2B$%lW!?@! cP_ Pz{01ab12RSst   9 : Z [ { |    !!+!;!p!!!""'"("H"I"i"j""""##(#7#o####$$)$j$$$$%%%U%e%%%&&2! c&2&x&&&' 'X'''''(3(u(((())@)O)))))****V*W*w*******+$+%+W+f+++,,<,K,r,,,---I-X-v-w----./.H.X.~.....//%/C/D//00%0&0S0T0w00011J1~112 2!2D2S2q2r! a2r22223 33343o3~333334+4;4a4p4444555565w566F6677^77808\8k8888999G9s999:(:j:::;;5;D;p;;;<>>;>e>>>>>?/?g?h??@@)@o@@@AA)AGAc! cAcArAAAABBKBsBtBBBC3CVCWCuCCCCCDD,DMDnD|DDDDDDE EE9E:ETEcEEEFF2F3FhFiFFFFFGGGRGSGTGYGZGGGGGGHHHaHbHHHHHHI-I=I>IXIYIwIxIIIIJJJ8J9J^J_JyJz!!! ]JzJJJJJKKKLKMKKKLLL3L4L{LLLMM^MjMkMMMMMMN N N,N-NQNRNNNOO O O9O:OgOhOOOOOP)P*PdPePPPPPQQQQQ6Q7QMQNQdQeQzQ{QQQQQQQQR R R"R#R;R<RTRURmRnRRRRRRRRR! cRRS"S#SHSISpSqSSSSSTT6T7TWTTTUU0UXUUUV0VrVVVVW W W:W;WkWlWWWWWWX'XXXYXXXXXYYY>Y?YYZZ ZJZZZZ[B[C[c[d[[[[[[\ \ \5\6\a\b\\\\\\]]]G]H]n]o]]]^^^J^q! c^q^r^^^^^^_C____`=`Q`R````a&a'a\aaaaaab3b4b|bbbbbbccc^c_ccccd<dddde0e<e=eeefeeeef ffOfffg gggGgHggggggh h h'h(hnhhhi(i)iHiIilimiiij+j;j<j~jj! cjjjkkkgkkkkkllllFlGlxlyllllm m"! sectionHeadingsub-Head)  :~00 $$#l@ l_&1G :T0!))/7?FFKCPT[MahjlP78)0  F - D  G F.