Here is what I have done to the original ZX-Spectrum ROM. Features include: - Bug fixes as mentioned in "The complete Spectrum Rom Disassembly" by Dr Ian Logan and Dr Frank O'Hara (I think I have all of them). - An "extra cursor" which acts like the BBC Micro's and provides an extra editing facility in program-entry and INPUT modes. Press and hold both shift keys, then press the keys 5, 6, 7 and 8 (or the arrow keys) to move the cursor around the screen, or 0 to copy the character under the cursor. The machine beeps if the cursor is not on a recognisable character. Note that copying a long line in this way is faster than pressing EDIT and cursoring to the end of it. It's OK for the screen to scroll while you copy, but make sure that the line you are copying doesn't go off the top of the screen! Note: The extra cursor requires 8 system variables, which I have placed at FFF8 (which is usually occupied by the user-defined graphic "U"). This means that graphic "U" is usually corrupt and should not be used (however, it should be OK to use within a program as long as it never uses INPUT or causes an error report). Poking other values there will have no lasting effect, except perhaps to prevent the extra cursor from working correctly. To reset the extra cursor, just poke zero into each location from FFF8 to FFFF. - A tokenizer (which is needed by the above to recombine letters from the screen into keywords). When you press enter after typing in a line, all keywords which are written in capital letters will be assembled into tokens. Keywords do not need spaces before or after, except IN and AT, which need a space after (but not before). If you can't remember which token is on which key, then type a quote as the very first character of each line, which will be turned into a space (it doesn't do anything, but it makes the computer think everything is in quotes so it uses an L-cursor instead of a K-cursor), then spell out all the words in capital letters. - A non-maskable interrupt routine. When it is activated (by a debounced NMI button) you have a choice of the following: * press N, which causes a NEW with RAMTOP set at 24199. This gives you the opportunity to inspect any memory above that address, even though BASIC might have been corrupted.[$] * press space, which breaks in with the error message "NMI break", unless the routine decides that BASIC is corrupt, in which case it will behave as if you had pressed N. * press V followed by four hex digits. The routine whose address that is will be called. When the routine executes RET, the processor will return immediately to the interrupted program (which means that the program has to save registers itself if it intends to return). [$]This has, of course, been extremely useful to get into game loaders without all the hassle of stepping through 147 different decrypt algorithms. :-) - A save-all-RAM routine for use by the NMI routine (press V04B5 and make sure the tape is recording when you press the last digit). - New LIST and CONTINUE commands. * LIST only lists the line you name rather than the whole program starting at that line. Type "LIST *" instead of LIST for the old behaviour. The full syntax of LIST is LIST [x][,[y]] where x is the starting line number (default 0) and y is the ending line number (default 9999). * CONTINUE may be used to continue from NMI breaks[%], provided that the machine stack is still intact (no CLEAR and no BASIC errors). If there is no NMI break to continue from then it continues from the last BASIC error as usual. [%]Note that it doesn't always work because some memory has changed since the NMI break (for instance, the command-line now reads CONTINUE). - new start-up parameters (black screen, faster key-repeat, longer key-click). - An error routine that doesn't crash when interrupts are disabled. - GOTO and GOSUB keywords without spaces. :-) - a new character set. Here is a more detailed description of the changes. In most cases, two listings are provided; the left-hand one lists the original ROM and the right-hand one is my changed version. Page numbers (and labels where they occur) refer to the book "The Complete Spectrum Rom Disassembly" by Dr Ian Logan & Dr Frank O'Hara, published by Melbourne House Publishers, ISBN 0 86161 116 0. ------------------------------------------------------------------------ 004B CALL 02BF CALL 3B5E Call the new interrupt routine (for the extra cursor) ------------------------------------------------------------------------ The new non-maskable interrupt routine 0066 PUSH AF PUSH HL Save some registers. PUSH HL PUSH AF LD HL,(5CB0) PUSH BC LD A,H PUSH DE OR L CALL 3CD9 Get a key-press JR NZ,0070 CP +20 Is it a space? JP (HL) JP 04AA Jump to continue the routine 0070 POP HL DEFB +38,+45 (spare bytes) POP AF RETN ------------------------------------------------------------------------ 01AE 20 54 CF 47 54 CF 47 4F A new token table with the 01B2 4F 20 53 55 53 55 C2 49 spaces removed from GOTO and 01B6 C2 49 4E 50 4E 50 55 D4 GOSUB (only the last portion 01BA 55 D4 4C 4F 4C 4F 41 C4 differs). 01BE 41 C4 4C 49 4C 49 53 D4 01C2 53 D4 4C 45 4C 45 D4 50 01C6 D4 50 41 55 41 55 53 C5 01CA 53 C5 4E 45 4E 45 58 D4 01CE 58 D4 50 4F 50 4F 4B C5 01D2 4B C5 50 52 50 52 49 4E 01D6 49 4E D4 50 D4 50 4C 4F 01DA 4C 4F D4 52 D4 52 55 CE 01DE 55 CE 53 41 53 41 56 C5 01E2 56 C5 52 41 52 41 4E 44 01E6 4E 44 4F 4D 4F 4D 49 5A 01EA 49 5A C5 49 C5 49 C6 43 01EE C6 43 4C D3 4C D3 44 52 01F2 44 52 41 D7 41 D7 43 4C 01F6 43 4C 45 41 45 41 D2 52 01FA D2 52 45 54 45 54 55 52 01FE 55 52 CE 43 CE 43 4F 50 0202 4F D9 ------------------------------------------------------------------------ A continuation of the non-maskable interrupt routine. It is stored where useless ZX81 code was left, called "THE 'PROGRAM NAME' SUBROUTINE (ZX81)". 04AA CD FB 24 3A JP Z,38A0 Jump forward if the key was a space 3B 5C 87 FA CP 'N' 8A 1C E1 D0 JP Z,3929 Jump if it was 'N' E5 CD F1 2B JP 386E Jump forward to continue 62 6B 0D F8 09 CB FE C9 04B5 LD IX,+4000 This short routine is a complete RAM LD DE,+C000 save, just in case it's useful to jump LD A,+FF to on NMI (it continues straight into LD (4000),SP SA-BYTES). ------------------------------------------------------------------------ Fix bug on page 33. 0A32 LD A,+18 LD A,+19 Test against top line ------------------------------------------------------------------------ Fix bug on page 34. 0A48 CALL 0B65 CALL 0AD9 In this case, 0AD9 (PO-ABLE) is equivalent to calling 0B65 (PO-CHAR) followed by 0ADC (PO-STORE). ------------------------------------------------------------------------ Insert a hook for tokenization (which is done if the key code is 13 (carriage return). 10E6 CP +0E JP 3B51 RET C ------------------------------------------------------------------------ Changes to the initialisation. 11CC LD A,+07 LD A,+00 Make the border black (was white) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1212 LD BC,+0040 LD BC,+1414 RASP=20, PIP=20 (was 64, 0). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1265 LD A,+38 LD A,+07 Initialise the colours to: FLASH 0, LD (5C8D),A LD (5C8D),A BRIGHT 0, PAPER 0 and INK 7. LD (5C8F),A CALL 3966 Initialise the extra cursor. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1270 LD HL,+0523 LD HL,+0123 REPDEL=35, REPPER=1 (was 35, 5). ------------------------------------------------------------------------ Stop the machine from crashing if interrupts are disabled at the time when 1303 (MAIN-4, the error reporting routine) is called. 1303 HALT NOP Don't crash if interrupts disabled. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1320 LD HL,+0001 INC L HL was zero anyway so this makes it 1 EI Now enable interrupts and do the HALT HALT from earlier in case it matters. ------------------------------------------------------------------------ New initialisation message 1539 7F 20 31 39 20 41 6C 74 |c 19| | Alt| 153D 38 32 20 53 65 72 65 64 |82 S| |ered| 1541 69 6E 63 6C 20 62 79 20 |incl| | by | 1545 61 69 72 20 49 61 6E 20 |air | |Ian | 1549 52 65 73 65 43 6F 6C 6C |Rese| |Coll| 154D 61 72 63 68 69 65 72 20 |arch| |ier | 1551 20 4C 74 E4 31 39 38 B5 | Ltd| |1985| ------------------------------------------------------------------------ Changes to the syntax tables 1A49 CB CA CAT moves back one byte in the table. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1AAF F9 17 3B 3C The new address of LIST is 3C3B. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1AB9 5F 1E 3C 39 The new address of CONTINUE is 393C. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1ADD F5 17 D4 3C The new address of LLIST is 3CD4. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1B10 0A 00 93 17 00 93 17 06 For an unknown reason (probably to do with the Interface-1) I have altered the syntax of CAT so that it expects a numeric expression. For space considerations, I also removed the string expression from after ERASE. ------------------------------------------------------------------------ For some reason lost in the mist of time I altered the TEST-ROOM routine so that it uses RST 8 to generate an out-of-memory report rather than a jump to 0055 (ERROR-3). 1F15 LD L,+03 RST 0008 DEFB +03 ------------------------------------------------------------------------ Fix bug on page 129. 257D JP 2AB2 RET Return; do not store the string again. DEFW +2AB2 Spare locations. ------------------------------------------------------------------------ Fix bug on page 169. CALL 2D7F CALL 2D7F Note: the last instruction in this routine (INT-FETCH) is "LD D,A". LD B,+10 LD B,+10 2E14 LD A,D AND A Delete the unnecessary instruction "LD A,D" to make room for the fix. AND A JR NZ,2E1D(*) JR NZ,2E1E OR E OR E JR Z,2E23(#) JR Z,2E24 LD D,E LD D,E LD B,+08 LD B,+08 (*)PUSH DE 2E1E PUSH DE EXX EXX POP DE POP DE EXX EXX JR 2E7B JR 2E7B (#)RST 0028 2E24 RST 0028 DEFB +02,delete Delete the extra item on the stack. ------------------------------------------------------------------------ First half of fix for -65536 bug 3032 LD (HL),A CALL 3225 The fixed code is placed at 3225 INC HL POP DE Restore STKEND to DE. LD (HL),E RET Finished. INC HL LD (HL),D DEC HL DEC HL } DEC HL DEC HL } DEC HL DEC HL } These locations are spare. POP DE POP DE } RET RET } ------------------------------------------------------------------------ Fix bug on page 185 31FF JR Z,31E2 JR Z,31DB,DIV-34TH ------------------------------------------------------------------------ Second half of the -65536 fix. This is based on page 230 but is subtly different since that code contains an error! The old ROM has: ================= 3223 20 1A 23 23 3227 23 3E 80 A6 322B 2B B6 2B 20 322F 03 3E 80 AE 3233 2B 20 36 77 3237 23 36 FF 2B 323B 3E 18 ================= The new ROM is as follows (I typed it in earlier, which explains the different format...) 3221 T-GR-ZERO CP +91 Compare e to 91 hex, 145 decimal. 3223 JR 323F,T-SMALL Always omit the following code. This code has been changed to incorporate the fix from 3032. 3225 PUSH AF Save the sign byte in A. 3226 INC A Make any FF in A into 00. 3227 OR E Test all 3 bytes now for zero. 3228 OR D 3229 JR NZ,3233,ADD-STORE Jump if not -65536. 322B POP AF Clear the stack. 322C LD A,+80 Prepare to enter 80 hex into second byte. 322E DEC HL Point to the first byte 322F LD (HL),+91 Enter 91 hex into first byte. 3231 PUSH AF Put the 80 on the stack. Note: DE still holds zero so the third and fourth bytes will be cleared. 3232 INC HL Restore HL pointer. 3233 ADD-STORE POP AF Restore the sign byte in A. 3234 LD (HL),A Store it on the stack. 3235 INC HL Point to the next location. 3236 LD (HL),E Store the low byte of the result. 3237 INC HL Point to the next location. 3238 LD (HL),D Store the high byte of the result. 3239 DEC HL Move the pointer back to 323A DEC HL address the first byte of the 323B DEC HL result. 323C RET Return to complete the routine. 323D JR 3272,NIL-BYTES These locations are spare. ------------------------------------------------------------------------ Miscellaneous routines are stored in the area 386E-3CFF where the original ROM has FF-bytes. They are: - the rest of the NMI routine - the new LIST and CONTINUE commands - the new interrupt routine for the extra cursor - the tokenization routine. (sorry, no disassembly (yet)) 386E FE 56 C2 6A 00 21 00 00 06 04 E5 C5 3E FF 0E 64 387E 2F D3 FE 06 64 10 FE 0D 20 F6 CD EE 3C C1 E1 0E 388E 04 CB 25 CB 14 0D 20 F9 B5 6F 10 DE D1 C1 F1 E3 389E ED 45 21 A6 38 E5 ED 45 ED 57 D1 C1 F5 E1 22 E9 38AE 5B F3 F1 E1 ED 73 FE 5B 31 FE 5B FD E5 DD E5 D9 38BE C5 D5 E5 D9 08 F5 08 C5 D5 E5 F5 ED 7B FE 5B FD 38CE 21 3A 5C 2A 4B 5C ED 5B 53 5C A7 ED 52 38 4C 2A 38DE 4F 5C 01 14 00 09 EB A7 ED 52 38 3F 21 B5 5C ED 38EE 52 30 38 21 A8 61 ED 52 38 31 FD CB 36 FE ED 56 38FE FB FD 36 31 02 CD 6E 0D FD CB 02 EE 11 1F 39 AF 390E CD 0A 0C FD 36 00 FF CD 97 10 FD CB 01 9E C3 AC 391E 12 80 4E 4D 49 20 62 72 65 61 EB F3 3E FF 01 FF 392E FF 11 14 0A 21 58 FF D9 11 87 5E C3 CB 11 FD CB 393E 36 7E CA 5F 1E FD CB 36 BE F3 31 EA 5B F1 E1 D1 394E C1 D9 08 F1 E1 D1 C1 D9 08 DD E1 FD E1 ED 7B FE 395E 5B FD CB AF 56 C0 FB C9 21 72 39 11 F8 FF 01 08 396E 00 ED B0 C9 00 00 00 00 00 00 40 00 2A FD FF 7C 397E 1F 1F 1F E6 03 F6 58 67 CB 7E C8 7E 2F 77 C9 0F 398E 00 F0 00 FF 00 00 0F 0F 0F F0 0F FF 0F 00 F0 0F 399E F0 F0 F0 FF F0 00 FF 0F FF F0 FF FF FF CD 7A 39 39AE 3A F8 FF 87 C6 C5 6F 26 39 5E 23 56 EB CD 2C 16 39BE CD 7A 39 7E 2F 77 C9 93 3A E4 39 F9 39 04 3A CF 39CE 39 2A FD FF 2C 20 0B 7C C6 08 67 2F E6 18 20 02 39DE 26 40 22 FD FF C9 2A FD FF 2D 7D 3C 20 F4 7C D6 39EE 08 67 2F E6 18 20 EB 26 50 18 E7 2A FD FF 7D C6 39FE 20 6F 30 DE 18 D1 2A FD FF 7D D6 20 6F 30 D3 18 3A0E DD 21 8D 39 11 90 81 01 04 02 37 CD 39 3A 2A 36 3A1E 5C 24 11 80 20 01 01 08 B7 CD 39 3A 2A 7B 5C 11 3A2E A5 90 01 01 08 B7 CD 39 3A AF C9 08 D5 DD 2A FD 3A3E FF E5 C5 DD 7E 00 AE 28 08 3C 20 3C 08 38 38 08 3A4E 3D 5F 51 15 20 03 51 05 23 DD 24 DD 7E 00 AE AB 3A5E 20 26 15 20 F4 51 23 10 F0 3A FF FF AB 7B 32 FF 3A6E FF 28 0D 3E 14 CD 85 0F 3A FF FF E6 01 CD 85 0F 3A7E C1 E1 D1 7A A7 E1 C9 08 C1 E1 58 16 00 19 D1 14 3A8E 7A BB 20 A8 C9 DD E5 08 F5 CD 0F 3A 08 F1 08 28 3A9E 08 CD 81 0F DD E1 C3 CF 39 21 5E 01 11 5E 01 CD 3AAE B5 03 DD E1 C9 2A 59 5C 7E FE 22 20 02 36 20 2B 3ABE 23 7E FE 0D C8 FE 22 28 6C FE 0E 28 73 FE 3C 38 3ACE EF FE 5B 30 EB 22 B0 5C 16 A3 01 94 00 2A B0 5C 3ADE 03 0A FE 36 CA 45 3B CB 7F 28 03 14 18 F2 BE 20 3AEE EF 0B 0A 03 17 30 E9 1E 01 03 23 1C 0A BE 28 F9 3AFE CB 7F 20 03 0B 18 D6 14 E6 7F BE 20 D0 23 7E FE 3B0E 20 28 0B 7A FE BF 28 C5 FE AC 28 C1 1D 2B 1C 06 3B1E 00 4B A7 ED 42 7E FE 20 28 02 23 0D 72 E5 23 CD 3B2E E8 19 E1 18 8B 23 7E FE 22 28 F8 FE 80 C8 18 F5 3B3E 23 23 23 23 23 18 EC E5 ED 5B 61 5C A7 ED 52 E1 3B4E D0 18 E0 FE 0D D8 C2 E9 10 CD B3 3A 3E 0D 37 C9 3B5E CD BF 02 2A 3D 5C 5E 23 56 21 7F 10 A7 ED 52 28 3B6E 06 21 68 11 ED 52 C0 3A FA FF 5F 3A 89 5C 32 FA 3B7E FF 3A F9 FF 47 3A 6B 5C 32 F9 FF B8 28 2D 38 2B 3B8E 47 BB 30 1B 2A FD FF 7D CB 2C CB 2C CB 2C CB 2C 3B9E 1F CB 2C 1F 1F 1F 1F 2F E6 1F D6 07 B8 30 0C CD 3BAE 04 3A 3A FB FF 3C 32 FB FF 18 4C 3A FB FF A7 28 3BBE 0F 3D 32 FB FF CD 06 3C 38 3D AF 32 FB FF 18 37 3BCE CD 06 3C 21 FC FF 7E 36 00 30 2C A7 20 0A 3A 09 3BDE 5C 32 FB FF 36 01 18 08 3A 0A 5C 32 FB FF 36 02 3BEE CD AB 39 FD CB 01 AE FD 36 C8 FF FD 36 CC FF FD 3BFE 36 07 00 FD CB 02 DE C9 3E 7F DB FE 1F 1F 3F D0 3C0E 3E FE DB FE 1F 3F D0 21 F8 FF 3E F7 DB FE 36 01 3C1E CB 67 37 C8 3E EF DB FE 36 00 1F 3F D8 1F 1F 36 3C2E 04 3F D8 36 03 1F 3F D8 36 02 1F 3F C9 3E 02 F5 3C3E DF FE 2A 20 05 E7 F1 C3 FB 17 F1 FD 36 02 00 CD 3C4E 30 25 C4 01 16 DF CD 70 20 38 06 DF FE 3B 20 63 3C5E E7 DF FE 3A 28 5D FE 0D 28 59 FE 2C 28 05 CD 82 3C6E 1C 18 04 CD E6 1C DF FE 2C 20 1E E7 CD DE 1C CD 3C7E EE 1B CD 99 1E 78 B1 20 03 01 00 40 ED 43 74 5C 3C8E CD 99 1E ED 43 72 5C 18 0E CD EE 1B CD 99 1E ED 3C9E 43 72 5C ED 43 74 5C 2A 72 5C 22 49 5C CD 6E 19 3CAE 11 00 00 CD 65 18 D7 ED 4B 74 5C CD 80 19 38 F0 3CBE 28 EE C9 CD EE 1B 01 0F 27 ED 43 74 5C 01 00 00 3CCE ED 43 72 5C 18 D1 3E 03 C3 3D 3C CD 8E 02 20 FB 3CDE CD 1E 03 30 F6 F5 CD 8E 02 7A A3 3C 20 F8 F1 C9 3CEE CD D9 3C D6 30 38 F9 FE 0A D8 D6 07 FE 10 D8 18 3CFE EF 00 ------------------------------------------------------------------------ A new character set is stored in place of the old one at 3D00-3FFF. 3D00 00 00 00 00 00 00 00 00 00 18 18 18 18 00 18 00 3D10 00 24 24 00 00 00 00 00 00 14 16 1C 36 1C 34 14 3D20 00 10 3C 50 38 14 78 10 00 62 64 08 10 26 46 00 3D30 00 10 28 10 2A 44 3A 00 00 08 10 00 00 00 00 00 3D40 00 18 30 30 30 30 18 00 00 30 18 18 18 18 30 00 3D50 00 00 6C 38 FE 38 6C 00 00 00 18 18 7E 18 18 00 3D60 00 00 00 00 00 10 10 20 00 00 00 00 3E 00 00 00 3D70 00 00 00 00 00 18 18 00 00 00 06 0C 18 30 60 00 3D80 00 38 6C 6C 6C 6C 38 00 00 18 38 18 18 18 3C 00 3D90 00 3C 66 06 3C 60 7E 00 00 3C 66 0C 06 66 3C 00 3DA0 00 0C 1C 2C 4C 7E 0C 00 00 7E 60 7C 06 66 3C 00 3DB0 00 3C 60 7C 66 66 3C 00 00 7E 06 0C 18 30 30 00 3DC0 00 3C 66 3C 66 66 3C 00 00 3C 66 66 3E 06 3C 00 3DD0 00 00 00 10 00 00 10 00 00 00 10 00 00 10 10 20 3DE0 00 00 0C 18 30 18 0C 00 00 00 00 3E 00 3E 00 00 3DF0 00 00 30 18 0C 18 30 00 00 3C 66 0C 18 00 18 00 3E00 3C 42 9A AA 9E 40 3C 00 00 3C 66 66 7E 66 66 00 3E10 00 7C 66 7C 66 66 7C 00 00 3C 66 60 60 66 3C 00 3E20 00 78 6C 66 66 6C 78 00 00 7E 60 7C 60 60 7E 00 3E30 00 7E 60 7C 60 60 60 00 00 3C 66 60 6E 66 3C 00 3E40 00 66 66 7E 66 66 66 00 00 7E 18 18 18 18 7E 00 3E50 00 06 06 06 66 66 3C 00 00 66 6C 78 78 6C 66 00 3E60 00 60 60 60 60 60 7E 00 00 C6 EE FE D6 C6 C6 00 3E70 00 C6 E6 F6 DE CE C6 00 00 3C 66 66 66 66 3C 00 3E80 00 7C 66 66 7C 60 60 00 00 7C C6 C6 D6 CE 7C 02 3E90 00 7C 66 66 7C 6C 66 00 00 3C 60 3C 06 66 3C 00 3EA0 00 7E 18 18 18 18 18 00 00 66 66 66 66 66 3C 00 3EB0 00 66 66 66 66 3C 18 00 00 C6 C6 C6 D6 FE 6C 00 3EC0 00 C6 6C 38 38 6C C6 00 00 C6 6C 38 10 10 10 00 3ED0 00 7C 0C 18 30 60 7C 00 00 1E 18 18 18 18 1E 00 3EE0 00 00 60 30 18 0C 06 00 00 78 18 18 18 18 78 00 3EF0 00 18 3C 5A 18 18 18 00 00 00 00 00 00 00 00 FF 3F00 00 3C 66 60 F8 60 FE 00 00 00 3C 06 3E 66 3E 00 3F10 00 60 60 7C 66 66 7C 00 00 00 3C 60 60 60 3C 00 3F20 00 06 06 3E 66 66 3E 00 00 00 3C 66 7C 60 3E 00 3F30 00 1C 30 38 30 30 30 00 00 00 7C CC CC 7C 0C 78 3F40 00 60 60 7C 66 66 66 00 00 18 00 38 18 18 3C 00 3F50 00 0C 00 0C 0C 0C 6C 38 00 60 6C 78 70 78 6C 00 3F60 00 70 30 30 30 30 78 00 00 00 6C FE D6 C6 C6 00 3F70 00 00 7C 66 66 66 66 00 00 00 3C 66 66 66 3C 00 3F80 00 00 7C 66 66 7C 60 60 00 00 7C CC CC 7C 0C 0E 3F90 00 00 5C 76 60 60 60 00 00 00 38 60 38 0C 78 00 3FA0 00 30 78 30 30 30 1C 00 00 00 CC CC CC CC 76 00 3FB0 00 00 66 66 66 3C 18 00 00 00 C6 C6 D6 FE 6C 00 3FC0 00 00 66 3C 18 3C 66 00 00 00 CC CC CC 7C 0C 78 3FD0 00 00 7E 0C 18 30 7E 00 1C 30 30 60 30 30 1C 00 3FE0 18 18 18 18 18 18 18 00 38 0C 0C 06 0C 0C 38 00 3FF0 00 00 32 4C 00 00 00 00 3C 42 99 A1 A1 99 42 3C ------------------------------------------------------------------------