'SCHIP_DEV BY NATHANIEL BABIAK, 2021-12-14. REPEAT 'NUMPAD KEY HANDLING (N). GLOBAL N_K$, N_KEY_TIME, N_LAST$, N_CX1, N_CY1 'ARCHITECTURE (A). DIM GLOBAL A_V(15), A_STACK(15) GLOBAL A_PC, A_PC_WORD, A_PC_QWORD, A_SP, A_VI, A_DT, A_ST, A_INS_ACC, A_IPS, A_IS_HIGH 'MISC EMULATOR (E) STUFF. GLOBAL E_PAUSE_FIRST, E_INKEY$, E_INS_TRAP$, E_IS_PLAY, E_VBL_TIME, E_TRAP_TIME GLOBAL E_ROM, E_FILE, E_MENU_ROW, E_MENU_LD_ROM, E_MENU_LD_FILE, E_MENU_SV_FILE DIM GLOBAL E_INS$($F,$F), E_TEXT$(52), E_WIDTH(52), E_PAL(52) 'DISPLAY (D). DIM GLOBAL D_XY2RAM(127,63), D_XY2DEV(127,63), D_B2H(255), D_B2L(255) DIM GLOBAL D_XTEMP(127), D_MTEMP(127), D_YTEMP($3F) DIM GLOBAL D_NUMPAD_CELL(3,3), D_POS2X($10), D_POS2Y($10) GLOBAL D_CLR_HI, D_CH_HI$, D_ROW_HIT 'COMPATIBILITY (C). GLOBAL C_PRE,C_QUIRKS, C_8XY6,C_FX55,C_BNNN,C_DXYN0,C_DXYN1,C_DXYN2,C_DXYN3,C_FX1E, C_FONT 'DEVELOPER (DEV) VIEW STUFF. DIM GLOBAL DEV_C0(255), DEV_30(255), DEV_0C(255), DEV_03(255) GLOBAL DEV_BLEED, DEV_MODE, DEV_DRAW, DEV_CX, DEV_CY, DEV_X_LAST, DEV_Y_LAST, DEV_USE_RUN GLOBAL DEV_PAUSE_FIRST, DEV_IS_FAST 'TEXT (T) STUFF. GLOBAL T_SN 'DO IT! GLOBAL RTN$ CALL MAIN UNTIL 1 SUB MAIN RTN$ = CHR$(10) 'EITHER WORD ($FFFE) OR BYTE ($FFFF) ALIGNMENT. A_PC_WORD = $FFFF 'EITHER QWORD ($FFF8) OR BYTE ($FFFF) ALIGNMENT. A_PC_QWORD = $FFF8 MAIN0: DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 MAIN1: DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 FONT 0 CALL MAIN_MENU_INIT CALL STR_RAM2INS_INIT K$ = "" A_IPS = 1800 E_MENU_LD_ROM = 8 CALL CHIP8_INIT( "ROM " + HEX$( E_MENU_LD_ROM, 2 ) ) CALL DISP_INIT( 0, D_CLR_HI ) DEV_PAUSE_FIRST = 1 DO CALL MAIN_DEV( K$ ) IF K$ = "M" THEN CALL MAIN_MENU LOOP END SUB SUB VBL_INTERRUPT CALL NUMPAD_POLL CALL CHIP8_TIMER END SUB SUB DISP_INIT( NEW_IS_PLAY, NEW_CLR_HI ) 'CALL TO MODIFY E_IS_PLAY OR D_CLR_HI, ASSUMES NO OTHER MODS (DO NOT MOD DIRECTLY). IF D_XY2RAM( 0, 0 ) = 0 THEN E_IS_PLAY = NEW_IS_PLAY D_CLR_HI = NEW_CLR_HI IF E_IS_PLAY THEN DST = $8800 ELSE DST = $9C00 IF D_CLR_HI = 2 THEN ADD DST, 8 FOR Y0 = 0 TO 63 STEP 8 FOR X0 = 0 TO 127 STEP 8 FOR Y1 = Y0 TO Y0 + 7 FOR X1 = X0 TO X0 + 7 D_XY2RAM( X1, Y1 ) = DST NEXT X1 INC DST NEXT Y1 ADD DST, 8 NEXT X0 NEXT Y0 DST = $8800 FOR Y0 = 0 TO 63 STEP 16 FOR X0 = 0 TO 127 STEP 16 FOR Y1 = Y0 TO Y0 + 15 FOR X1 = X0 TO X0 + 15 D_XY2DEV( X1, Y1 ) = DST NEXT X1 IF Y1 AND 1 THEN INC DST NEXT Y1 ADD DST, 8 NEXT X0 NEXT Y0 FOR BYTE = $00 TO $FF WORD = (BYTE AND $80)*$180+(BYTE AND $40)*$C0+(BYTE AND $20)*$60+(BYTE AND $10)*$30 ADD WORD,(BYTE AND $08)* $18+(BYTE AND $04)*$0C+(BYTE AND $02)*$06+(BYTE AND $01)*$03 D_B2H( BYTE ) = WORD \ $100 D_B2L( BYTE ) = WORD AND $FF IF BYTE AND $80 THEN INC DEV_C0( BYTE ) IF BYTE AND $40 THEN INC DEV_C0( BYTE ) IF BYTE AND $20 THEN INC DEV_30( BYTE ) IF BYTE AND $10 THEN INC DEV_30( BYTE ) IF BYTE AND $08 THEN INC DEV_0C( BYTE ) IF BYTE AND $04 THEN INC DEV_0C( BYTE ) IF BYTE AND $02 THEN INC DEV_03( BYTE ) IF BYTE AND $01 THEN INC DEV_03( BYTE ) NEXT BYTE END IF IF E_IS_PLAY THEN SRC = $8800 ELSE SRC = $9C00 IF NEW_IS_PLAY THEN DST = $8800 ELSE DST = $9C00 IF D_CLR_HI = 2 THEN ADD SRC, 8 IF NEW_CLR_HI = 2 THEN ADD DST, 8 DELTA = DST - SRC IF DELTA < 0 THEN T$ = "$-" ELSE T$ = "$" IF DELTA THEN COPY SRC, 2040 TO DST IF DST AND $0008 THEN OFFSET = -8 ELSE OFFSET = 2040 FILL DST + OFFSET, 8 FOR Y1 = 0 TO 63 FOR X1 = 0 TO 127 ADD D_XY2RAM( X1, Y1 ), DELTA NEXT X1 NEXT Y1 E_IS_PLAY = NEW_IS_PLAY D_CLR_HI = NEW_CLR_HI END IF END SUB SUB DISP_SHOW( CX1, CY1, WIDTH, HEIGHT ) BG 1 PAL 1 BG FILL 0, 0 TO 19, 15 CHAR 32 PAL 0 CH = 128 FOR CY = CY1 TO CY1 + HEIGHT - 1 FOR CX = CX1 TO CX1 + WIDTH - 1 CELL CX, CY, CH INC CH NEXT CX NEXT CY BG 0 CLS 0 END SUB SUB DISP_DEV( X0, Y0, X2, Y2 ) Y2HI = Y2 OR $01 X0LO = X0 AND $70 X2HI = X2 OR $0F FOR Y1 = Y0 AND $3E TO Y2HI STEP 2 FOR X1 = X0LO TO X2HI STEP 16 Q2 = PEEK( D_XY2RAM( X1 , Y1 ) ) Q3 = PEEK( D_XY2RAM( X1 , Y1 + 1 ) ) Q1 = PEEK( D_XY2RAM( X1 + 8, Y1 ) ) Q4 = PEEK( D_XY2RAM( X1 + 8, Y1 + 1 ) ) B7 = DEV_C0( Q2 ) + DEV_C0( Q3 ) B6 = DEV_30( Q2 ) + DEV_30( Q3 ) B5 = DEV_0C( Q2 ) + DEV_0C( Q3 ) B4 = DEV_03( Q2 ) + DEV_03( Q3 ) B3 = DEV_C0( Q1 ) + DEV_C0( Q4 ) B2 = DEV_30( Q1 ) + DEV_30( Q4 ) B1 = DEV_0C( Q1 ) + DEV_0C( Q4 ) B0 = DEV_03( Q1 ) + DEV_03( Q4 ) 'ONE COLOR WILL BLEED (I.E. REPRESENT MORE THAN ONE INPUT), RANGE FROM [0,4] TO [0,3]. ADD B7, B7 > DEV_BLEED ADD B6, B6 > DEV_BLEED ADD B5, B5 > DEV_BLEED ADD B4, B4 > DEV_BLEED ADD B3, B3 > DEV_BLEED ADD B2, B2 > DEV_BLEED ADD B1, B1 > DEV_BLEED ADD B0, B0 > DEV_BLEED LO = $80*(B7 AND 1)+$40*(B6 AND 1)+$20*(B5 AND 1)+$10*(B4 AND 1) POKE D_XY2DEV(X1,Y1) ,LO+8*(B3 AND 1)+ 4*(B2 AND 1)+ 2*(B1 AND 1)+ (B0 AND 1) HI = $40*(B7 AND 2)+$20*(B6 AND 2)+$10*(B5 AND 2)+$08*(B4 AND 2) POKE D_XY2DEV(X1,Y1)+8,HI+4*(B3 AND 2)+ 2*(B2 AND 2)+ (B1 AND 2)+ SGN(B0 AND 2) NEXT X1 NEXT Y1 END SUB SUB MAIN_DEV( K$ ) K$ = "" CALL DISP_SHOW( 5, 1, 8, 4 ) CALL DISP_DEV( 0, 0, 127, 63 ) DEV_USE_RUN = 1 IF DEV_PAUSE_FIRST THEN CALL MAIN_DEV_SHOW( "PAUSE" ) CALL NUMPAD_ALL( 0, 1, 2 ) ON VBL OFF DEV_IS_FAST = 0 REPEAT CALL MAIN_DEV_SHOW( "INFO" ) CALL INKEY_WAIT( K$ ) CALL MAIN_DEV_EDIT( K$ ) UNTIL K$ = RTN$ OR K$ = "M" END IF DEV_PAUSE_FIRST = 1 WHILE K$ <> "M" CALL MAIN_DEV_SHOW( "PLAY" ) CALL NUMPAD_ALL( 0, 1, 1 ) ON VBL CALL VBL_INTERRUPT DEV_IS_FAST = -1 CALL CHIP8_READY REPEAT 'CALL MAIN_DEV_SHOW( "INFO" ) CALL CHIP8_INS UNTIL N_K$ = RTN$ DEV_IS_FAST = 0 CALL MAIN_DEV_SHOW( "PAUSE" ) CALL NUMPAD_ALL( 0, 1, 2 ) ON VBL OFF REPEAT CALL MAIN_DEV_SHOW( "INFO" ) CALL INKEY_WAIT( K$ ) CALL MAIN_DEV_EDIT( K$ ) UNTIL K$ = RTN$ OR K$ = "M" WEND CALL MAIN_DEV_SHOW( "CLEANUP" ) END SUB SUB MAIN_DEV_SHOW( STATE$ ) IF STATE$ = "INFO" THEN REPEAT STATE$ = MID$( "INS/ASC/BYT/WRD", 4 * DEV_MODE + 1, 3 ) PAL 5 TEXT 4, 5, STATE$ FOR ROW = 0 TO 15 PAL 4 TEXT 14, ROW, HEX$( A_V( ROW ), 2 ) PAL 6 TEXT 17, ROW, HEX$( A_STACK( ROW ), 3 ) NEXT ROW TEXT 1, 15, HEX$( A_VI, 4 ) PAL 4 TEXT 7, 15, HEX$( A_ST, 2 ) TEXT 11, 15, HEX$( A_DT, 2 ) UNTIL 1 IF DEV_MODE = 3 THEN REPEAT IF DEV_DRAW THEN CH = 15 + DEV_DRAW ELSE CH = 14 PY = 8 * ( 6 + DEV_CY ) IF DEV_DRAW=0 THEN ADD PY, -2 SPRITE 0, 8 * ( 4 + DEV_CX ), PY, CH SPRITE 0 PAL 4 A_PC = MIN( A_PC AND A_PC_WORD, $DFF0 ) SRC = A_PC FOR ROW = 0 TO 7 IF SRC < $B400 THEN T$ = HEX$(SRC-$A400,3)+" " ELSE T$ = HEX$(SRC-$A400,4) PAL 6 TEXT 0, 6 + ROW, T$ CALL STR_RAM2WRD( SRC, T$ ) PAL 0 TEXT 4, 6 + ROW, T$ ADD SRC, 2 NEXT ROW TINT 6, 0 PAL 2 PAL 2 UNTIL 1 ELSE IF DEV_MODE = 2 THEN REPEAT IF DEV_DRAW THEN CH = 15 + DEV_DRAW ELSE CH = 14 PY = 8 * ( 6 + DEV_CY ) IF DEV_DRAW=0 THEN ADD PY, -2 SPRITE 0, 8 * ( 4 + DEV_CX ), PY, CH SPRITE 0 PAL 4 A_PC = MIN( A_PC, $DFF8 ) SRC = A_PC FOR ROW = 0 TO 7 IF SRC < $B400 THEN T$ = HEX$(SRC-$A400,3)+" " ELSE T$ = HEX$(SRC-$A400,4) PAL 6 TEXT 0, 6 + ROW, T$ CALL STR_RAM2BYT( SRC, T$ ) PAL 0 TEXT 4, 6 + ROW, T$ INC SRC NEXT ROW TINT 6, 0 PAL 2 PAL 2 UNTIL 1 ELSE IF DEV_MODE THEN REPEAT BG 1 TINT 4 + DEV_X_LAST, 6 + DEV_Y_LAST PAL 1 TINT 4 + DEV_CX, 6 + DEV_CY PAL 4 BG 0 A_PC = MIN( A_PC AND A_PC_QWORD, $DFC0 ) SRC = A_PC FOR ROW = 0 TO 7 IF SRC < $B400 THEN T$ = HEX$(SRC-$A400,3)+" " ELSE T$ = HEX$(SRC-$A400,4) PAL 6 TEXT 0, 6 + ROW, T$ CALL STR_RAM2CARET( SRC, T$ ) PAL 1 CALL TEXT_ASC( 4, 6 + ROW, T$ ) ADD SRC, 8 NEXT ROW TINT 6, 0 PAL 2 PAL 2 UNTIL 1 ELSE REPEAT BG 1 TINT 16, A_SP + 15 AND $F PAL 1 TINT 16, A_SP PAL 4 TINT 16, A_SP + 1 AND $F PAL 1 TINT 9 + DEV_X_LAST, 6 + DEV_Y_LAST PAL 1 TINT 9 + DEV_CX, 6 + DEV_CY PAL 4 BG 0 A_PC = MIN( A_PC AND A_PC_WORD, $DFF0 ) SRC = A_PC FOR ROW = 0 TO 7 IF SRC < $B400 THEN T$ = HEX$(SRC-$A400,3)+" " ELSE T$ = HEX$(SRC-$A400,4) PAL 6 TEXT 0, 6 + ROW, T$ CALL STR_RAM2INS( SRC, T$ ) PAL 1 CALL TEXT_ARG( 4, 6 + ROW, T$ ) PAL 4 TEXT 9, 6 + ROW, HEX$( $100*PEEK(SRC)+PEEK(SRC+1), 4 ) ADD SRC, 2 NEXT ROW TINT 7, 0 PAL 2 - DEV_USE_RUN IF A_PC < $DFF0 THEN PAL 1 ELSE PAL 2 UNTIL 1 END IF CELL 3, 6, ASC( " " ) + 32 ELSE IF STATE$ = "PLAY" THEN REPEAT BG 1 TINT 16, A_SP + 15 AND $F PAL 1 TINT 16, A_SP PAL 1 TINT 16, A_SP + 1 AND $F PAL 1 IF DEV_MODE THEN X0 = 4 ELSE X0 = 9 IF DEV_MODE <= 1 THEN TINT X0 + DEV_CX, 6 + DEV_CY PAL 1 TINT DEV_X_LAST, DEV_Y_LAST PAL 1 BG 0 BG FILL 0, 0 TO 12, 0 CHAR 0 BG FILL 0, 5 TO 12, 15 CHAR 0 BG FILL 13, 0 TO 19, 15 CHAR 0 CALL TEXT_OFF UNTIL 1 ELSE IF STATE$ = "PAUSE" THEN REPEAT CALL CHIP8_TRAP( "" ) CALL TEXT_OFF IF DEV_MODE = 0 OR DEV_MODE = 1 THEN CALL TEXT_ON BG 1 TINT 16, A_SP + 15 AND $F PAL 1 TINT 16, A_SP PAL 4 TINT 16, A_SP + 1 AND $F PAL 1 PAL 1 IF DEV_MODE = 3 THEN BG FILL 4, 6 TO 19, 13 CHAR 0 PAL 5 ELSE IF DEV_MODE = 2 THEN BG FILL 4, 6 TO 11, 13 CHAR 0 BG FILL 12, 6 TO 19, 13 CHAR 32 PAL 5 ELSE IF DEV_MODE THEN BG FILL 4, 6 TO 19, 13 CHAR 32 PAL 1 ELSE BG FILL 4, 6 TO 19, 13 CHAR 32 PAL 5 END IF BG 0 TEXT 0, 0, "MENU" PAL 1 TEXT 8, 0, "PLAY" PAL 5 TEXT 0, 5, "ADR VAL" TEXT 0, 15, "I ST DT" FOR DIGIT = 0 TO 15 TEXT 13, DIGIT, HEX$( DIGIT ) + " " + HEX$( DIGIT ) NEXT DIGIT DEV_CX = 0 DEV_CY = 0 FONT 64 IF DEV_MODE = 1 THEN PAL 2 TEXT 0, 0, "M" PAL 1 TEXT 7, 5, "," IF DEV_MODE = 1 THEN PAL 2 TEXT 0, 14, "[" TEXT 12, 14, "]" FONT 0 IF DEV_MODE = 0 AND DEV_USE_RUN THEN PAL 1 ELSE PAL 2 TEXT 7, 0, ";" UNTIL 1 ELSE IF STATE$ = "CLEANUP" THEN REPEAT PAL 1 BG FILL 0, 0 TO 19, 15 CHAR 32 CALL TEXT_OFF UNTIL 1 END IF END SUB SUB MAIN_DEV_EDIT( K$ ) DEV_X_LAST = DEV_CX DEV_Y_LAST = DEV_CY CALL CHIP8_TRAP( "" ) CALL CHIP8_TIMER IF K$ = "," THEN REPEAT DEV_DRAW = 0 DEV_MODE = VAL( MID$( "2031", DEV_MODE + 1, 1 ) ) DEV_USE_RUN = 0 CALL MAIN_DEV_SHOW( "PAUSE" ) UNTIL 1 ELSE IF DEV_MODE = 3 THEN REPEAT SRC = A_PC + 2 * DEV_CY + DEV_CX \ 8 MSK = 2 ^ ( 7 - ( DEV_CX AND 7 ) ) IF INSTR( "3456789ABCDEF", K$ ) THEN DEV_DRAW = 0 POKE SRC, PEEK( SRC ) XOR MSK ELSE IF INSTR( "012", K$ ) THEN DEV_DRAW = VAL( K$ ) + 1 ELSE IF K$ = CHR$(8) THEN CALL MAIN_DEV_NAV( CHR$(18), 2, 15, 1 ) IF PEEK( SRC ) AND MSK THEN POKE SRC, PEEK( SRC ) XOR MSK ELSE IF K$ = RTN$ THEN K$ = "" DEV_CX = 0 CALL MAIN_DEV_NAV( CHR$(19), 2, 15, 1 ) END IF CALL MAIN_DEV_NAV( K$, 2, 15, 1 ) SRC = A_PC + 2 * DEV_CY + DEV_CX \ 8 MSK = 2 ^ ( 7 - ( DEV_CX AND 7 ) ) IF DEV_DRAW = 3 THEN POKE SRC, PEEK( SRC ) XOR MSK ELSE IF DEV_DRAW = 2 THEN POKE SRC, PEEK( SRC ) OR MSK ELSE IF DEV_DRAW = 1 AND PEEK( SRC ) AND MSK THEN POKE SRC, PEEK( SRC ) XOR MSK END IF UNTIL 1 ELSE IF DEV_MODE = 2 THEN REPEAT SRC = A_PC + 1 * DEV_CY MSK = 2 ^ ( 7 - DEV_CX ) IF INSTR( "3456789ABCDEF", K$ ) THEN DEV_DRAW = 0 POKE SRC, PEEK( SRC ) XOR MSK ELSE IF INSTR( "012", K$ ) THEN DEV_DRAW = VAL( K$ ) + 1 ELSE IF K$ = CHR$(8) THEN CALL MAIN_DEV_NAV( CHR$(18), 1, 7, 1 ) IF PEEK( SRC ) AND MSK THEN POKE SRC, PEEK( SRC ) XOR MSK ELSE IF K$ = RTN$ THEN K$ = "" DEV_CX = 0 CALL MAIN_DEV_NAV( CHR$(19), 1, 7, 1 ) END IF CALL MAIN_DEV_NAV( K$, 1, 7, 1 ) SRC = A_PC + 1 * DEV_CY MSK = 2 ^ ( 7 - DEV_CX ) IF DEV_DRAW = 3 THEN POKE SRC, PEEK( SRC ) XOR MSK ELSE IF DEV_DRAW = 2 THEN POKE SRC, PEEK( SRC ) OR MSK ELSE IF DEV_DRAW = 1 AND PEEK( SRC ) AND MSK THEN POKE SRC, PEEK( SRC ) XOR MSK END IF UNTIL 1 ELSE IF DEV_MODE THEN REPEAT IF ASC( K$ ) >= 32 AND ASC( K$ ) <= 127 THEN KEY = ASC( K$ ) ELSE KEY = 0 IF KEY THEN POKE A_PC + 8 * DEV_CY + DEV_CX, KEY CALL MAIN_DEV_NAV( CHR$(17), 8, 7, 1 ) K$ = "" ELSE IF K$ = CHR$(8) THEN CALL MAIN_DEV_NAV( CHR$(18), 8, 7, 1 ) POKE A_PC + 8 * DEV_CY + DEV_CX, 0 ELSE IF K$ = RTN$ THEN K$ = "" DEV_CX = 0 CALL MAIN_DEV_NAV( CHR$(19), 8, 7, 1 ) ELSE CALL MAIN_DEV_NAV( K$, 8, 7, 1 ) END IF UNTIL 1 ELSE REPEAT IF INSTR( "0123456789ABCDEF", K$ ) THEN SRC = A_PC + 2 * DEV_CY - (DEV_CX>=2) IF DEV_CX AND 1 THEN MLT = 1 ELSE MLT = $10 IF DEV_CX AND 1 THEN MSK = $F0 ELSE MSK = $0F POKE SRC, PEEK( SRC ) AND MSK OR (INSTR( "0123456789ABCDEF",K$)-1) * MLT CALL MAIN_DEV_NAV( CHR$(17), 2, 3, 1 ) DEV_USE_RUN = 0 ELSE IF K$ = CHR$(8) THEN CALL MAIN_DEV_NAV( CHR$(18), 2, 3, 1 ) SRC = A_PC + 2 * DEV_CY - (DEV_CX>=2) IF DEV_CX AND 1 THEN MSK = $F0 ELSE MSK = $0F POKE SRC, PEEK( SRC ) AND MSK DEV_USE_RUN = 0 ELSE IF K$ = RTN$ AND DEV_USE_RUN = 0 THEN K$ = "" DEV_CX = 0 CALL MAIN_DEV_NAV( CHR$(19), 2, 3, 1 ) ELSE IF K$ = " " AND A_PC < $DFF0 THEN CALL CHIP8_READY CALL CHIP8_INS DEV_USE_RUN = 1 DEV_CX = 0 DEV_CY = 0 ELSE CALL MAIN_DEV_NAV( K$, 2, 3, 1 ) END IF UNTIL 1 END IF END SUB SUB MAIN_DEV_NAV( K$, ROW2BYTE, X2, USE_WRAP ) IF K$ = "[" THEN A_PC = MAX( $A400, A_PC - ROW2BYTE * 8 ) ELSE IF K$ = "]" THEN A_PC = MIN( A_PC + ROW2BYTE * 8, $E000 - 8 * ROW2BYTE ) ELSE IF K$ = CHR$(20) THEN IF DEV_CY THEN DEC DEV_CY ELSE A_PC = MAX( $A400, A_PC - ROW2BYTE ) ELSE IF K$ = CHR$(19) THEN IF DEV_CY < 7 THEN INC DEV_CY ELSE A_PC = MIN( A_PC + ROW2BYTE, $E000 - 8 * ROW2BYTE ) ELSE IF USE_WRAP THEN IF K$ = CHR$(18) AND ( A_PC > $A400 OR DEV_CX OR DEV_CY ) THEN ADD DEV_CX, -1, 0 TO X2 IF DEV_CX = X2 THEN CALL MAIN_DEV_NAV( CHR$(20), ROW2BYTE, X2, USE_WRAP ) ELSE IF K$ = CHR$(17) AND ( A_PC < $E000-8*ROW2BYTE OR DEV_CX < X2 OR DEV_CY < 7 ) THEN ADD DEV_CX, 1, 0 TO X2 IF DEV_CX = 0 THEN CALL MAIN_DEV_NAV( CHR$(19), ROW2BYTE, X2, USE_WRAP ) END IF ELSE IF K$=CHR$(18) AND DEV_CX THEN DEC DEV_CX ELSE IF K$=CHR$(17) AND DEV_CX= 9 AND ROW0 <= 12 THEN CALL MAIN_MENU_SHOW( 6, 3 ) IF ROW0 >= 16 AND ROW0 <= 24 THEN CALL MAIN_MENU_SHOW( 13, 3 ) IF ROW0 >= 28 AND ROW0 <= 32 THEN CALL MAIN_MENU_SHOW( 25, 3 ) IF ROW0 >= 36 AND ROW0 <= 45 THEN CALL MAIN_MENU_SHOW( 33, 3 ) TRACE ROW0 K$ = "" CALL INKEY_WAIT( K$ ) KEY = ASC( K$ ) IF KEY = 20 AND ROW0 > 8 THEN DEC ROW0 IF KEY = 19 AND ROW0 < 43 THEN INC ROW0 IF KEY = 18 OR KEY = 17 OR K$ = RTN$ THEN CALL MAIN_MENU_EDIT( ROW0, KEY ) UNTIL K$ = "M" E_MENU_ROW = ROW0 END SUB SUB MAIN_MENU_SHOW( ROW, CY ) PAL E_PAL( ROW ) T$ = E_TEXT$( ROW ) TEXT 0, CY, T$ IF RIGHT$(T$,1) = "-" OR RIGHT$(T$,1) = "+" OR RIGHT$(T$,1) = "*" THEN PAL 7 TEXT 19, CY, RIGHT$(T$,1) END IF IF CY = 6 THEN BG 1 BG TINT 0, CY TO E_WIDTH( ROW ) - 1, CY PAL 4 BG TINT E_WIDTH( ROW ), CY TO 19, CY PAL 1 BG 0 ELSE IF MID$(T$,8,1) = "[" THEN TINT 7, CY PAL 2 TINT 19, CY PAL 2 END IF IF ROW = 0 THEN PAL 5 CELL 0, CY, ASC( "M" ) + 32 ELSE IF ROW = 17 THEN BG 1 PAL 1 TEXT 8, CY, "@@@@@@@@@@@" BG 0 ELSE IF ROW = 18 THEN BG 1 PAL 1 TEXT 8, CY, " @@@@@@@ " BG 0 ELSE IF ROW = 19 THEN BG 1 PAL 1 TEXT 8, CY, "@@@@@@@@@@@" BG 0 PAL 0 TEXT 8, CY, "@@" TEXT 17, CY, "@@" ELSE IF ROW = 20 THEN PAL 0 TEXT 8, CY, CHR$(34)+CHR$(34) TEXT 17, CY, CHR$(34)+CHR$(34) ELSE IF ROW = 21 THEN PAL 0 TEXT 8, CY, "##" TEXT 17, CY, "##" ELSE IF ROW >= 27 AND ROW <= 30 THEN CALL NUMPAD_ROW( 11, CY, 2, ROW - 27 ) END IF END SUB SUB MAIN_MENU_EDIT( ROW, KEY ) IF KEY = 18 THEN DIR = -1 ELSE IF KEY = 17 THEN DIR = 1 ELSE DIR = 0 RTN = KEY = 10 R$ = E_TEXT$( ROW ) IF ROW = 8 THEN 'GAMES - LD ROM. E_MENU_LD_ROM = MIN( MAX( 4, E_MENU_LD_ROM + DIR ), 14 ) IF RTN THEN PLAY 0, 50, 25 CALL CHIP8_INIT( "ROM " + HEX$( E_MENU_LD_ROM, 2 ) ) END IF T$ = MID$(" 4:PONG 5:ALIEN 6:ANT 7:BLINKY 8:TETRIS 9:H. PIPER10:JOUST 11:LOOPZ 12:SOKOBAN 13:SPCFIGHT14:RUSHHOUR",11*E_MENU_LD_ROM-43,11) MID$( R$, 9, 11 ) = T$ ELSE IF ROW = 9 THEN 'GAMES - LD FILE. E_MENU_LD_FILE = MIN( MAX( 0, E_MENU_LD_FILE + DIR ), 15 ) T$ = "" IF RTN THEN PLAY 0, 50, 25 CALL CHIP8_INIT( "FILE " + HEX$( E_MENU_LD_FILE, 2 ) ) END IF CALL STR_FILE2COMMENT( T$, E_MENU_LD_FILE ) MID$( R$, 9, 11 ) = T$ ELSE IF ROW = 10 THEN 'GAMES - SV FILE. E_MENU_SV_FILE = MIN( MAX( 0, E_MENU_SV_FILE + DIR ), 15 ) T$ = "" IF RTN THEN PLAY 0, 50, 10 CALL STR_FILE2COMMENT( T$, E_MENU_SV_FILE ) IF RIGHT$( T$, 8 ) = "(EMPTY) " THEN T$ = "CH8 GAME" FOR SRC_HI = $DFFF TO $A610 STEP -1 IF PEEK( SRC_HI ) THEN EXIT NEXT SRC_HI SAVE E_MENU_SV_FILE, T$, $A600, SRC_HI - $A600 + 1 CALL MAIN_MENU_EDIT( 9, 0 ) END IF CALL STR_FILE2COMMENT( T$, E_MENU_SV_FILE ) MID$( R$, 9, 11 ) = T$ ELSE IF ROW = 15 THEN 'GENERAL - INS/SEC. ADD A_IPS, 10 * DIR, 300 TO 10000 Q$ = " " CALL STR_CENTER( Q$, STR$( A_IPS ) ) MID$( R$, 9, 11 ) = Q$ ELSE IF ROW = 16 THEN 'GENERAL - PLAY COLOR. D_CH_HI$ = CHR$(34) MID$( R$, 9, 11 ) = " N/A " ELSE IF ROW = 17 THEN 'GENERAL - DEV BLEED COLOR. IF KEY = 0 THEN DEV_BLEED = 1 IF DEV_BLEED + DIR >= 0 AND DEV_BLEED + DIR <= 3 THEN ADD DEV_BLEED, DIR MID$( R$, 17, 1 ) = STR$( DEV_BLEED ) ELSE IF ROW >= 18 AND ROW <= 21 THEN '(FOUR ROWS.) GENERAL - COLOR. (0/1/2/3.) NN = ROW - 18 CLR = MIN( MAX( 0, COLOR( 0, NN ) + DIR ), 63 ) POKE $FF00 + NN, CLR MID$( R$, 12, 1 ) = STR$( CLR \ 16 ) MID$( R$, 14, 1 ) = STR$( CLR \ 4 AND 3 ) MID$( R$, 16, 1 ) = STR$( CLR AND 3 ) ELSE IF ROW = 22 THEN 'GENERAL - FONT. C_FONT = MIN( MAX( 0, C_FONT + DIR ), 5 ) T$ = MID$( "COSMAC VIP DREAM 6800 ETI 660 SCHIP FISH'N'CHIP OCTO ", 11 * C_FONT + 1, 11 ) MID$( R$, 9, 11 ) = T$ IF C_FONT<=3 THEN SRC=$100*C_FONT ELSE IF C_FONT<=5 THEN SRC=$300*C_FONT-$600 FOR DIGIT = 0 TO $F COPY ROM( 0 ) + $10 * DIGIT + SRC , 5 TO $A404 + 5 * DIGIT COPY ROM( 0 ) + $10 * DIGIT + SRC + $100, 8 TO $A454 + 10 * DIGIT COPY ROM( 0 ) + $10 * DIGIT + SRC + $200, 2 TO $A45C + 10 * DIGIT NEXT DIGIT ELSE IF ROW = 27 AND RTN THEN 'NUMPAD - EDIT. REPEAT CALL NUMPAD_ALL( 11, 6, 4 ) FOR POS1 = 1 TO 15 FOR POS2 = POS1 + 1 TO 16 KEY1$ = MID$( E_INKEY$, POS1, 1 ) KEY2$ = MID$( E_INKEY$, POS2, 1 ) IF KEY1$ = KEY2$ THEN CALL NUMPAD_KEY( 6, KEY1$, POS1 ) IF KEY1$ = KEY2$ THEN CALL NUMPAD_KEY( 6, KEY2$, POS2 ) NEXT POS2 NEXT POS1 REPEAT K$ = INKEY$ POS = INSTR( E_INKEY$, K$ ) WAIT VBL UNTIL POS OR K$ = RTN$ IF K$ <> RTN$ THEN CALL NUMPAD_ALL( 11, 6, 2 ) CALL NUMPAD_KEY( 4, K$, 1 ) REPEAT CALL INKEY_WAIT( K$ ) KEY = ASC( K$ ) UNTIL KEY = 8 OR KEY >= 15 AND KEY <= 20 OR KEY >= 32 AND KEY <= 95 OR K$ = RTN$ IF K$ <> RTN$ AND MID$(E_INKEY$,POS,1) <> K$ THEN CALL MAIN_MENU_EDIT( 30, 0 ) PAL 7 TEXT 19, 7, "-" TEXT 19, 8, "-" TEXT 19, 9, "*" MID$( E_INKEY$, POS, 1 ) = K$ CALL NUMPAD_INIT( E_INKEY$, -1, -1, -1, -1, -1, -1 ) ELSE IF K$ = RTN$ THEN K$ = "" END IF END IF UNTIL K$ = RTN$ ELSE IF ROW = 28 AND RTN THEN 'NUMPAD - DEFAULT. RIGHT$( R$, 1 ) = "*" RIGHT$( E_TEXT$( 29 ), 1 ) = "-" RIGHT$( E_TEXT$( 30 ), 1 ) = "-" CALL NUMPAD_INIT( "X123QWEASDZC4RFV", -1, -1, -1, -1, -1, -1 ) ELSE IF ROW = 29 AND RTN THEN 'NUMPAD - CLASSIC. RIGHT$( E_TEXT$( 28 ), 1 ) = "-" RIGHT$( R$, 1 ) = "*" RIGHT$( E_TEXT$( 30 ), 1 ) = "-" CALL NUMPAD_INIT( "0123456789ABCDEF", -1, -1, -1, -1, -1, -1 ) ELSE IF ROW = 30 AND KEY = 0 THEN 'NUMPAD - CUSTOM. RIGHT$( E_TEXT$( 28 ), 1 ) = "-" RIGHT$( E_TEXT$( 29 ), 1 ) = "-" RIGHT$( R$, 1 ) = "*" ELSE IF ROW = 35 THEN 'QUIRKS - PRESET. IF DIR THEN C_PRE = MIN( MAX( -1, C_PRE + DIR ), 4 ) IF C_PRE <> -1 THEN C_QUIRKS = VAL( "0X" + MID$("0C0 05F 45F 1F0 3F0",4*C_PRE+1,3) ) END IF C_8XY6 = ( C_QUIRKS AND $001 ) <> 0 C_FX55 = ( C_QUIRKS AND $002 ) <> 0 C_BNNN = ( C_QUIRKS AND $004 ) <> 0 C_DXYN0 = ( C_QUIRKS AND $008 ) <> 0 C_DXYN1 = ( C_QUIRKS AND $030 ) \ $010 C_DXYN2 = ( C_QUIRKS AND $0C0 ) \ $040 C_DXYN3 = ( C_QUIRKS AND $300 ) \ $100 C_FX1E = ( C_QUIRKS AND $400 ) <> 0 IF C_DXYN1 > 1 THEN ADD C_DXYN1, -4 IF C_DXYN2 > 1 THEN ADD C_DXYN2, -4 IF C_DXYN3 > 1 THEN ADD C_DXYN3, -4 FOR R = 36 TO 43 CALL MAIN_MENU_EDIT( R, 0 ) NEXT R CALL STR_RAM2INS_INIT CALL MAIN_MENU_EDIT( 35.5, 0 ) R$ = E_TEXT$( ROW ) ELSE IF ROW = 35.5 THEN POS = INSTR( "0C0 05F 45F 1F0 3F0", HEX$( C_QUIRKS, 3 ) ) IF POS THEN C_PRE = ( POS - 1 ) \ 4 ELSE C_PRE = -1 MID$( R$, 9, 11 ) = MID$(" CUSTOM NO QUIRKS SCHIP ?AMIGA? VIP -FLICKR VIP ",11*C_PRE+12,11) ELSE IF ROW = 36 THEN 'QUIRKS - SHL/SHR. IF RTN THEN C_8XY6 = NOT C_8XY6 IF C_8XY6 THEN RIGHT$( R$, 3 ) = "X *" ELSE RIGHT$( R$, 3 ) = "Y -" C_QUIRKS = C_QUIRKS AND NOT $001 OR -$001 * C_8XY6 CALL MAIN_MENU_EDIT( 35.5, 0 ) ELSE IF ROW = 37 THEN 'QUIRKS - LD. IF RTN THEN C_FX55 = NOT C_FX55 IF C_FX55 THEN RIGHT$( R$, 9 ) = " I+=0 *" ELSE RIGHT$( R$, 9 ) = "I+=VX+1 -" C_QUIRKS = C_QUIRKS AND NOT $002 OR -$002 * C_FX55 CALL MAIN_MENU_EDIT( 35.5, 0 ) ELSE IF ROW = 38 THEN 'QUIRKS - JP. IF RTN THEN C_BNNN = NOT C_BNNN IF C_BNNN THEN RIGHT$( R$, 3 ) = "X *" ELSE RIGHT$( R$, 3 ) = "0 -" C_QUIRKS = C_QUIRKS AND NOT $004 OR -$004 * C_BNNN CALL MAIN_MENU_EDIT( 35.5, 0 ) ELSE IF ROW = 39 THEN 'QUIRKS - DXYN HIGH HIT. IF RTN THEN C_DXYN0 = NOT C_DXYN0 IF C_DXYN0 THEN RIGHT$( R$, 4 ) = "!0 *" ELSE RIGHT$( R$, 4 ) = "=1 -" C_QUIRKS = C_QUIRKS AND NOT $008 OR -$008 * C_DXYN0 CALL MAIN_MENU_EDIT( 35.5, 0 ) ELSE IF ROW = 40 THEN 'QUIRKS - DXY N=0 LOW. IF RTN THEN ADD C_DXYN1, 1, -1 TO 1 RIGHT$( R$, 7 ) = MID$( " SKIP *16X16 - 8X16 +", 7 * C_DXYN1 + 8, 7 ) C_QUIRKS = C_QUIRKS AND NOT $030 OR $010 * ( C_DXYN1 - 4 * ( C_DXYN1 < 0 ) ) CALL MAIN_MENU_EDIT( 35.5, 0 ) ELSE IF ROW = 41 THEN 'QUIRKS - DXYN EDGE. IF RTN THEN ADD C_DXYN2, 1, -1 TO 1 RIGHT$( R$, 10 ) = MID$( " XY WRAP *BIT WRAP - CLIP +", 10 * C_DXYN2 + 11, 10 ) 'IGNORE C_DXYN2=0. IF C_DXYN2 = 0 THEN E_PAL( ROW ) = 6 ELSE E_PAL( ROW ) = 1 C_QUIRKS = C_QUIRKS AND NOT $0C0 OR $040 * ( C_DXYN2 - 4 * ( C_DXYN2 < 0 ) ) CALL MAIN_MENU_EDIT( 35.5, 0 ) ELSE IF ROW = 42 THEN 'QUIRKS - DXYN TIME. IF RTN THEN ADD C_DXYN3, 1, -1 TO 1 RIGHT$( R$, 10 ) = MID$( "WAIT VBL * INSTANT -VBL -HIT +", 10 * C_DXYN3 + 11, 10 ) C_QUIRKS = C_QUIRKS AND NOT $300 OR $100 * ( C_DXYN3 - 4 * ( C_DXYN3 < 0 ) ) CALL MAIN_MENU_EDIT( 35.5, 0 ) ELSE IF ROW = 43 THEN 'QUIRKS - ADD I,VX. IF RTN THEN C_FX1E = NOT C_FX1E IF C_FX1E THEN RIGHT$( R$, 10 ) = "VF=I>FFF *" ELSE RIGHT$( R$, 10 ) = " VF=VF -" C_QUIRKS = C_QUIRKS AND NOT $400 OR -$400 * C_FX1E CALL MAIN_MENU_EDIT( 35.5, 0 ) END IF E_TEXT$( ROW ) = R$ END SUB SUB STR_FILE2COMMENT( RET$, FILENUM ) FILES IF FSIZE( FILENUM ) = 0 THEN RET$ = "(EMPTY)" ELSE RET$ = LEFT$( FILE$( FILENUM ), 8 ) END IF RET$ = RET$ + LEFT$( " ", 8 - LEN( RET$ ) ) RET$ = HEX$( FILENUM, 2 ) + ":" + RET$ END SUB SUB TEXT_ON COPY ROM( 3 ), $600 TO $8A00 FOR SN = 0 TO 63 SPRITE SN PAL 1 NEXT SN END SUB SUB TEXT_OFF SPRITE OFF END SUB SUB TEXT_ARG( CX, CY, S$ ) S$ = S$ + LEFT$( " ", 10 - LEN( S$ ) ) CELL CX , CY, ASC( LEFT$( S$, 1 ) ) + 128 CELL CX + 1, CY, ASC( MID$( S$, 3, 1 ) ) + 128 CELL CX + 2, CY, ASC( MID$( S$, 5, 1 ) ) + 128 CELL CX + 3, CY, ASC( MID$( S$, 7, 1 ) ) + 128 CELL CX + 4, CY, ASC( MID$( S$, 9, 1 ) ) + 128 PX = 8 * CX + 4 PY = 8 * CY SPRITE T_SN , PX , PY, ASC( MID$( S$, 2, 1 ) ) + 128 SPRITE T_SN + 1, PX + 8, PY, ASC( MID$( S$, 4, 1 ) ) + 128 SPRITE T_SN + 2, PX + 16, PY, ASC( MID$( S$, 6, 1 ) ) + 128 SPRITE T_SN + 3, PX + 24, PY, ASC( MID$( S$, 8, 1 ) ) + 128 SPRITE T_SN + 4, PX + 32, PY, ASC( RIGHT$( S$, 1 ) ) + 128 ADD T_SN, 8, 0 TO 63 END SUB SUB TEXT_ASC( CX, CY, S$ ) S$ = S$ + LEFT$( " ", 16 - LEN( S$ ) ) CELL CX , CY, ASC( LEFT$( S$, 1 ) ) + 128 CELL CX + 1, CY, ASC( MID$( S$, 3, 1 ) ) + 128 CELL CX + 2, CY, ASC( MID$( S$, 5, 1 ) ) + 128 CELL CX + 3, CY, ASC( MID$( S$, 7, 1 ) ) + 128 CELL CX + 4, CY, ASC( MID$( S$, 9, 1 ) ) + 128 CELL CX + 5, CY, ASC( MID$( S$, 11, 1 ) ) + 128 CELL CX + 6, CY, ASC( MID$( S$, 13, 1 ) ) + 128 CELL CX + 7, CY, ASC( MID$( S$, 15, 1 ) ) + 128 CELL CX + 8, CY, 0 PX = 8 * CX + 4 PY = 8 * CY SPRITE T_SN , PX , PY, ASC( MID$( S$, 2, 1 ) ) + 128 SPRITE T_SN + 1, PX + 8, PY, ASC( MID$( S$, 4, 1 ) ) + 128 SPRITE T_SN + 2, PX + 16, PY, ASC( MID$( S$, 6, 1 ) ) + 128 SPRITE T_SN + 3, PX + 24, PY, ASC( MID$( S$, 8, 1 ) ) + 128 SPRITE T_SN + 4, PX + 32, PY, ASC( MID$( S$, 10, 1 ) ) + 128 SPRITE T_SN + 5, PX + 40, PY, ASC( MID$( S$, 12, 1 ) ) + 128 SPRITE T_SN + 6, PX + 48, PY, ASC( MID$( S$, 14, 1 ) ) + 128 SPRITE T_SN + 7, PX + 56, PY, ASC( RIGHT$( S$, 1 ) ) + 128 ADD T_SN, 8, 0 TO 63 END SUB SUB NUMPAD_INIT( NEW_INKEY$, U, D, L, R, A, B ) 'UDLRAB ARE OPTIONAL, IF YOU DON'T WANT TO SWAP OUT JUST PASS SIX -1 ARGUMENTS. E_INKEY$ = NEW_INKEY$ IF U >= 0 THEN MID$( E_INKEY$, U + 1, 1 ) = CHR$(20) IF D >= 0 THEN MID$( E_INKEY$, D + 1, 1 ) = CHR$(19) IF L >= 0 THEN MID$( E_INKEY$, L + 1, 1 ) = CHR$(18) IF R >= 0 THEN MID$( E_INKEY$, R + 1, 1 ) = CHR$(17) IF A >= 0 THEN MID$( E_INKEY$, A + 1, 1 ) = CHR$(32) IF B >= 0 THEN MID$( E_INKEY$, B + 1, 1 ) = CHR$(8) TMP_KEY$ = E_INKEY$ CALL STR_FIND_RPLC_ALL( TMP_KEY$, CHR$(20), CHR$(27) ) CALL STR_FIND_RPLC_ALL( TMP_KEY$, CHR$(19), CHR$(28) ) CALL STR_FIND_RPLC_ALL( TMP_KEY$, CHR$(18), CHR$(29) ) CALL STR_FIND_RPLC_ALL( TMP_KEY$, CHR$(17), CHR$(30) ) CALL STR_FIND_RPLC_ALL( TMP_KEY$, CHR$(32), CHR$(32) ) CALL STR_FIND_RPLC_ALL( TMP_KEY$, CHR$( 8), CHR$(31) ) RESTORE NUMPAD_INIT0 FOR POS = 1 TO 16 READ D_POS2X( POS ), D_POS2Y( POS ) D_NUMPAD_CELL( D_POS2X(POS), D_POS2Y(POS) ) = ASC( MID$(TMP_KEY$,POS,1) ) + 32 NEXT POS NUMPAD_INIT0: DATA 1,3, 0,0, 1,0, 2,0, 0,1, 1,1, 2,1, 0,2 DATA 1,2, 2,2, 0,3, 2,3, 3,0, 3,1, 3,2, 3,3 END SUB SUB NUMPAD_ALL( NEW_CX1, NEW_CY1, PL ) N_CX1 = NEW_CX1 N_CY1 = NEW_CY1 KEYBOARD ON PAUSE OFF PAL PL FOR CY2 = 0 TO 3 FOR CX2 = 0 TO 3 CELL N_CX1 + CX2, N_CY1 + CY2, D_NUMPAD_CELL( CX2, CY2 ) NEXT CX2 NEXT CY2 END SUB SUB NUMPAD_POLL N_K$ = INKEY$ IF LEN( N_K$ ) THEN N_KEY_TIME = TIMER CALL NUMPAD_KEY( 1, N_LAST$, 1 ) CALL NUMPAD_KEY( 3, N_K$ , 1 ) N_LAST$ = N_K$ ELSE IF N_KEY_TIME AND N_KEY_TIME + 6 <= TIMER THEN N_KEY_TIME = 0 CALL NUMPAD_KEY( 1, N_LAST$, 1 ) END IF END SUB SUB NUMPAD_KEY( PL, K$, POS0 ) POS = INSTR( E_INKEY$, K$, POS0 ) IF POS THEN TINT N_CX1 + D_POS2X( POS ), N_CY1 + D_POS2Y( POS ) PAL PL END SUB SUB NUMPAD_ROW( CX1, CY, PL, ROW ) PAL PL FOR CX2 = 0 TO 3 CELL CX1 + CX2, CY, D_NUMPAD_CELL( CX2, ROW ) NEXT CX2 END SUB SUB STR_RAM2INS_INIT RESTORE STR_INS2ASC_INIT0 STR_INS2ASC_INIT0: HI_TO_INS = 1 DATA "", "JP NNN", "CALL NNN", "SE VX,KK" DATA "SNE VX,KK", "", "LD VX,KK", "ADD VX,KK" DATA "", "", "LD I,NNN", "JP V0,NNN" DATA "RND VX,KK", "D VX,VY,N", "", "" FOR HI = 0 TO $F READ E_INS$( HI_TO_INS, HI ) NEXT HI IF C_BNNN THEN E_INS$( HI_TO_INS, $B ) = "JP VX,NNN" HI = 5 DATA "SE VX,VY", "", "", "" DATA "", "", "", "" DATA "", "", "", "" DATA "", "", "", "" FOR N0 = 0 TO $F READ E_INS$( HI, N0 ) NEXT N0 HI = 8 DATA "LD VX,VY", "OR VX,VY", "AND VX,VY", "XOR VX,VY" DATA "ADD VX,VY", "SUB VX,VY", "SHR VX,VY", "SUBN VX,VY" DATA "", "", "", "" DATA "", "", "SHL VX,VY", "" FOR N0 = 0 TO $F READ E_INS$( HI, N0 ) NEXT N0 IF C_8XY6 THEN E_INS$( HI, 6 ) = "SHR VX" IF C_8XY6 THEN E_INS$( HI, $E ) = "SHL VX" HI = 9 DATA "SNE VX,VY", "", "", "" DATA "", "", "", "" DATA "", "", "", "" DATA "", "", "", "" FOR N0 = 0 TO $F READ E_INS$( HI, N0 ) NEXT N0 HI = $E SEARCH$ = "_" DATA $9E, "SKP VX", $A1, "SKNP VX" FOR POS = 1 TO 2 READ SEARCH_TERM, E_INS$( HI, POS ) SEARCH$ = SEARCH$ + "." + HEX$( SEARCH_TERM, 2 ) NEXT POS E_INS$( HI, 0 ) = SEARCH$ HI = $F SEARCH$ = "_" DATA $07, "LD VX,DT", $0A, "LD VX,K", $15, "LD DT,VX", $18, "LD ST,VX" DATA $1E, "ADD I_,VX", $29, "LD F,VX", $30, "LD FF,VX", $33, "LD B,VX" DATA $55,"LD (I+),VX", $65,"LD VX,(I+)", $75, "LD R,VX", $85, "LD VX,R" FOR POS = 1 TO 12 READ SEARCH_TERM, E_INS$( HI, POS ) SEARCH$ = SEARCH$ + "." + HEX$( SEARCH_TERM, 2 ) NEXT POS E_INS$( HI, 0 ) = SEARCH$ IF C_FX1E THEN E_INS$( HI, 5 ) = "ADD IVF,VX" IF C_FX55 THEN E_INS$( HI, 9 ) = "LD (I'),VX" IF C_FX55 THEN E_INS$( HI, 10 ) = "LD VX,(I')" HI = 0 SEARCH$ = "_" DATA $E0, "ERASE", $EE, "RET", $FB, "SCR", $FC, "SCL" DATA $FD, "EXIT", $FE, "LOW", $FF, "HIGH" FOR POS = 1 TO 7 READ SEARCH_TERM, E_INS$( HI, POS ) SEARCH$ = SEARCH$ + "." + HEX$( SEARCH_TERM, 2 ) NEXT POS E_INS$( HI, 0 ) = SEARCH$ HI0_Y_TO_INS = 2 DATA "", "", "", "" DATA "", "", "", "" DATA "", "", "", "" DATA "SCD N", "", "", "" FOR Y1 = 0 TO $F READ E_INS$( HI0_Y_TO_INS, Y1 ) NEXT Y1 V0$ = CHR$( ASC( "V" ) + 32 ) + "0" VF$ = CHR$( ASC( "V" ) + 32 ) + "F" FOR HI = 0 TO 15 ITR1 = 1 + ( HI <> $E AND HI <> $F AND HI <> 0 ) FOR ITER = ITR1 TO 15 S$ = E_INS$( HI, ITER ) CALL STR_FIND_RPLC_ALL( S$, "V0", V0$ ) CALL STR_FIND_RPLC_ALL( S$, "VF", VF$ ) FOR POS = 2 TO LEN( S$ ) CH = ASC( MID$( S$, POS, 1 ) ) IF CH=32 THEN EXIT ELSE IF CH>=65 AND CH<=90 THEN MID$(S$,POS,1) = CHR$(CH+32) NEXT POS E_INS$( HI, ITER ) = S$ NEXT ITER NEXT HI E_INS_TRAP$ = "-" END SUB SUB STR_RAM2INS( SRC, RET$ ) WORD = $100*PEEK(SRC)+PEEK(SRC+1) HI = WORD \ $1000 Y0 = ( WORD AND $00F0 ) \ $10 N0 = WORD AND $000F RET$ = E_INS$( 1, HI ) IF RET$ = "" THEN IF INSTR( "589", STR$(HI) ) THEN RET$ = E_INS$( HI, N0 ) ELSE POS = INSTR( E_INS$( HI, 0 ), HEX$( WORD AND $00FF, 2 ) ) \ 3 IF HI THEN IF POS THEN RET$ = E_INS$( HI, POS ) ELSE IF ( WORD AND $FF00 ) = $0000 THEN IF POS THEN RET$ = E_INS$( HI, POS ) ELSE RET$ = E_INS$( 2, Y0 ) END IF END IF IF RET$ = "" THEN RET$ = E_INS_TRAP$ END IF X0$ = HEX$( ( WORD AND $0F00 ) \ $100 ) N0$ = HEX$( N0 ) CALL STR_FIND_RPLC_ARG( RET$, "NNN", X0$ + HEX$(Y0) + N0$ ) CALL STR_FIND_RPLC_ARG( RET$, "KK", HEX$(Y0) + N0$ ) CALL STR_FIND_RPLC_ARG( RET$, "VX", CHR$(118)+X0$ ) CALL STR_FIND_RPLC_ARG( RET$, "VY", CHR$(118)+HEX$(Y0) ) CALL STR_FIND_RPLC_ARG( RET$, "N", N0$ ) END SUB SUB STR_RAM2CARET( SRC, RET$ ) RET$ = "" SRC2 = SRC + 7 FOR SRC1 = SRC TO SRC2 CH = PEEK( SRC1 ) IS_HI = CH \ 128 IF IS_HI THEN ADD CH, -128 IS_NPC = CH < 32 OR CH = 127 RET$ = RET$ + MID$(" ^+\",2*IS_HI-IS_NPC+1,1) + CHR$( IS_NPC AND $40 XOR CH ) NEXT SRC1 END SUB SUB STR_RAM2BYT( SRC, RET$ ) BYTE = PEEK( SRC ) IF BYTE AND $80 THEN RET$ = D_CH_HI$ ELSE RET$ = " " IF BYTE AND $40 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $20 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $10 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $08 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $04 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $02 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $01 THEN RET$ = RET$+D_CH_HI$+" " ELSE RET$ = RET$+" " END SUB SUB STR_RAM2WRD( SRC, RET$ ) BYTE = PEEK( SRC ) IF BYTE AND $80 THEN RET$ = D_CH_HI$ ELSE RET$ = " " IF BYTE AND $40 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $20 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $10 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $08 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $04 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $02 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $01 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " BYTE = PEEK( SRC + 1 ) IF BYTE AND $80 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $40 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $20 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $10 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $08 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $04 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $02 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " IF BYTE AND $01 THEN RET$ = RET$+D_CH_HI$ ELSE RET$ = RET$+" " END SUB SUB STR_CENTER( RET$, INSERT$ ) DIA = LEN( RET$ ) - LEN( INSERT$ ) + 2 MID$( RET$, DIA \ 2, LEN( INSERT$ ) ) = INSERT$ END SUB SUB STR_FIND_RPLC_ARG( RET$, FIND$, RPLC$ ) POS = INSTR( RET$, " " + FIND$ ) IF POS THEN MID$( RET$, POS + 1, LEN( RPLC$ ) ) = RPLC$ POS = INSTR( RET$, "," + FIND$ ) IF POS THEN MID$( RET$, POS + 1, LEN( RPLC$ ) ) = RPLC$ END SUB SUB STR_FIND_RPLC_ALL( RET$, FIND$, RPLC$ ) POS = INSTR( RET$, FIND$, POS + 1 ) WHILE POS MID$( RET$, POS, 1 ) = RPLC$ POS = INSTR( RET$, FIND$, POS + 1 ) WEND END SUB SUB INKEY_WAIT( K$ ) REPEAT WAIT VBL K$ = INKEY$ UNTIL K$ <> "" END SUB SUB CHIP8_INIT( STATE$ ) RANDOMIZE TIMER FOR NN = 0 TO 15 A_V(NN) = 0 A_STACK(NN) = 0 NEXT NN A_PC = $200 + $A400 A_SP = 0 A_VI = 0 A_DT = 0 A_ST = 0 A_INS_ACC = 0 A_IS_HIGH = 0 FILL $A400, $3C00 E_ROM = -1 E_FILE = -1 IF LEFT$( STATE$, 4 ) = LEFT$( "ROM ##", 4 ) THEN E_ROM = VAL( "0X" + RIGHT$( STATE$, 2 ) ) COPY ROM( E_ROM ), SIZE( E_ROM ) TO $A600 ELSE IF LEFT$( STATE$, 5 ) = LEFT$( "FILE ##", 5 ) THEN E_FILE = VAL( "0X" + RIGHT$( STATE$, 2 ) ) LOAD E_FILE, $A600 END IF RESTORE CHIP8_INIT0 CHIP8_INIT0: '$0C0 NO QUIRKS. $05F SCHIP. $45F AMIGA. $1F0 VIP NO FLICKR. $3F0 VIP. DATA %000000,%010101,%101010,%111111,3,-1,-1,-1,-1,-1,-1, -1, -1,"" DATA 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0,"" DATA 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0,"" DATA 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0,"" DATA 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0,"" '4:PONG 5:ALIEN 6:ANT 7:BLINKY 8:TETRIS 9:H. PIPER 10:JOUST 11:LOOPZ 12:SOKOBAN 13:SPACEFIGHT 14:RUSH HOUR DATA %000000,%010101,%101010,%111111,3, 1, 4,-1,-1,-1,-1,$05F, 900, "#4:PONG" DATA %000000,%010101,%101010,%111111,3,-1,-1, 3,$C,$A,-1,$05F,2400, "#5:ALIEN LINDSTEDT '93" DATA %000000,%010101,%101010,%111111,3,-1,-1, 3,$C,$A,-1,$05F,1800, "#6:ANT CATTO '91" DATA %000000,%010101,%101010,%111111,3, 3, 6, 7, 8,$F, 1,$05F,1800, "#7:BLINKY EDEBERG '91" DATA %000000,%010101,%101010,%111111,3,-1, 7, 5, 6, 4,-1,$05F,1800, "#8:TETRIS DACHILLE '91" DATA %000000,%010101,%101010,%111111,3, 3, 6, 7, 8, 1, 4,$05F,1800, "#9:H. PIPER RAINES '91" DATA %000000,%010101,%101010,%111111,3,$A,-1, 3,$C,-1,-1,$05F,2400,"#10:JOUST CATTO '93" DATA %000000,%010101,%101010,%111111,3,$C,$D,-1,-1, 5,-1,$05F,1800,"#11:LOOPZ DAUMANN '93 HAP '06" DATA %000000,%010101,%101010,%111111,4, 5, 8, 7, 9,$A,-1,$05F,1800,"#12:SOKOBAN HAP '06" DATA %000000,%010101,%101010,%111111,3,-1,-1, 3,$C,$A,-1,$45F,1800,"#13:SPACEFIGHT2091 SOERENSEN '92" DATA %000000,%010101,%101010,%111111,4, 5, 8, 7, 9,$A, 1,$05F,1800,"#14:RUSH HOUR HAP '06" FOR ITER = -1 TO E_ROM READ C0, C1, C2, C3, C_FONT,U,D,L,R,A,B,QUIRKS,IPS,UNUSED_REMARK$ NEXT ITER PALETTE 0, C0, C1, C2, C3 CALL NUMPAD_INIT( "X123QWEASDZC4RFV", U, D, L, R, A, B ) IF QUIRKS >= 0 THEN C_QUIRKS = QUIRKS IF IPS >= 0 THEN A_IPS = IPS FOR ROW = 2 TO 50 CALL MAIN_MENU_EDIT( ROW, 0 ) NEXT ROW IF U + D + L + R + A + B = -6 THEN CALL MAIN_MENU_EDIT( 28, 10 ) ELSE CALL MAIN_MENU_EDIT( 30, 0 ) CALL CHIP8_00E0 END SUB SUB CHIP8_TRAP( MSG$ ) TRACE CHR$(10) TRACE CHR$(10) TRACE CHR$(10) TRACE CHR$(10) TRACE CHR$(10) TRACE CHR$(10) TRACE "" IF LEN( MSG$ ) THEN IF LEN( MSG$ ) < 11 THEN MSG$ = MSG$ + LEFT$( " ", 11 - LEN( MSG$ ) ) IF E_IS_PLAY THEN TRACE " "+MSG$+CHR$(10) ELSE TRACE CHR$(10)+" "+MSG$ E_TRAP_TIME = TIMER ELSE TRACE CHR$(10) END IF TRACE "" END SUB SUB CHIP8_TIMER IF A_DT THEN DEC A_DT IF A_ST THEN PLAY 0, 50, 2 DEC A_ST END IF END SUB SUB CHIP8_VBL ADD A_INS_ACC, -A_IPS FRAMES = TIMER - E_VBL_TIME IF FRAMES > 1 THEN CALL CHIP8_TRAP( "EMU SKIP" ) ELSE IF FRAMES = 0 THEN WAIT VBL E_VBL_TIME = TIMER IF E_TRAP_TIME AND E_TRAP_TIME + 5 <= TIMER THEN CALL CHIP8_TRAP( "" ) E_TRAP_TIME = 0 END IF END SUB SUB CHIP8_READY WAIT VBL E_VBL_TIME = TIMER END SUB SUB CHIP8_INS HIGH = PEEK(A_PC)\$10 IF HIGH <= 7 THEN IF HIGH <= 3 THEN IF HIGH <= 1 THEN IF HIGH = 0 THEN CALL CHIP8_0 ELSE CALL CHIP8_1NNN ELSE IF HIGH = 2 THEN CALL CHIP8_2NNN ELSE CALL CHIP8_3XKK END IF ELSE IF HIGH <= 5 THEN IF HIGH = 4 THEN CALL CHIP8_4XKK ELSE CALL CHIP8_5 ELSE IF HIGH = 6 THEN CALL CHIP8_6XKK ELSE CALL CHIP8_7XKK END IF END IF ELSE IF HIGH <= 11 THEN IF HIGH <= 9 THEN IF HIGH = 8 THEN CALL CHIP8_8 ELSE CALL CHIP8_9 ELSE IF HIGH = $A THEN CALL CHIP8_ANNN ELSE CALL CHIP8_BNNN END IF ELSE IF HIGH <= 13 THEN IF HIGH = $C THEN CALL CHIP8_CXKK ELSE CALL CHIP8_DXYN ELSE IF HIGH = $E THEN CALL CHIP8_E ELSE CALL CHIP8_F END IF END IF END IF ADD A_PC, 2, $A400 TO $DFFE IF A_PC AND 1 THEN CALL CHIP8_TRAP( "PC MISALIGN" ) A_PC = A_PC AND A_PC_WORD ELSE IF A_PC > $B400 THEN CALL CHIP8_TRAP( "PC RANGE" ) END IF IF A_INS_ACC < A_IPS THEN ADD A_INS_ACC, 60 ELSE CALL CHIP8_VBL END SUB SUB CHIP8_0 IF PEEK(A_PC) THEN CALL CHIP8_TRAP( "INVALID INS" ) ELSE POS = INSTR( "E0 EE FB FC FD FE FF", HEX$( PEEK(A_PC+1), 2 ) ) IF POS<=7 THEN IF POS<=1 THEN IF POS THEN CALL CHIP8_00E0 ELSE IF PEEK(A_PC+1)\$10 = $C THEN CALL CHIP8_00CN ELSE CALL CHIP8_TRAP( "INVALID INS" ) ELSE IF POS = 4 THEN CALL CHIP8_00EE ELSE CALL CHIP8_00FB END IF ELSE IF POS<=13 THEN IF POS = 10 THEN CALL CHIP8_00FC ELSE CALL CHIP8_00FD ELSE IF POS = 16 THEN CALL CHIP8_00FE ELSE CALL CHIP8_00FF END IF END IF END IF END SUB SUB CHIP8_00CN UP_ONE_ROW = -1 DST = 63 FOR SRC = 63 - (PEEK(A_PC+1) AND $0F) TO 0 STEP UP_ONE_ROW POKE D_XY2RAM( 0, DST ), PEEK( D_XY2RAM( 0, SRC ) ) POKE D_XY2RAM( 8, DST ), PEEK( D_XY2RAM( 8, SRC ) ) POKE D_XY2RAM( 16, DST ), PEEK( D_XY2RAM( 16, SRC ) ) POKE D_XY2RAM( 24, DST ), PEEK( D_XY2RAM( 24, SRC ) ) POKE D_XY2RAM( 32, DST ), PEEK( D_XY2RAM( 32, SRC ) ) POKE D_XY2RAM( 40, DST ), PEEK( D_XY2RAM( 40, SRC ) ) POKE D_XY2RAM( 48, DST ), PEEK( D_XY2RAM( 48, SRC ) ) POKE D_XY2RAM( 56, DST ), PEEK( D_XY2RAM( 56, SRC ) ) POKE D_XY2RAM( 64, DST ), PEEK( D_XY2RAM( 64, SRC ) ) POKE D_XY2RAM( 72, DST ), PEEK( D_XY2RAM( 72, SRC ) ) POKE D_XY2RAM( 80, DST ), PEEK( D_XY2RAM( 80, SRC ) ) POKE D_XY2RAM( 88, DST ), PEEK( D_XY2RAM( 88, SRC ) ) POKE D_XY2RAM( 96, DST ), PEEK( D_XY2RAM( 96, SRC ) ) POKE D_XY2RAM( 104, DST ), PEEK( D_XY2RAM( 104, SRC ) ) POKE D_XY2RAM( 112, DST ), PEEK( D_XY2RAM( 112, SRC ) ) POKE D_XY2RAM( 120, DST ), PEEK( D_XY2RAM( 120, SRC ) ) DEC DST NEXT SRC IF DST - SRC >= 9 THEN FILL D_XY2RAM( 0, 0 ), 256 ADD SRC, 9 ELSE INC SRC END IF SZ = DST - SRC + 1 FILL D_XY2RAM( 0, SRC ), SZ FILL D_XY2RAM( 8, SRC ), SZ FILL D_XY2RAM( 16, SRC ), SZ FILL D_XY2RAM( 24, SRC ), SZ FILL D_XY2RAM( 32, SRC ), SZ FILL D_XY2RAM( 40, SRC ), SZ FILL D_XY2RAM( 48, SRC ), SZ FILL D_XY2RAM( 56, SRC ), SZ FILL D_XY2RAM( 64, SRC ), SZ FILL D_XY2RAM( 72, SRC ), SZ FILL D_XY2RAM( 80, SRC ), SZ FILL D_XY2RAM( 88, SRC ), SZ FILL D_XY2RAM( 96, SRC ), SZ FILL D_XY2RAM( 104, SRC ), SZ FILL D_XY2RAM( 112, SRC ), SZ FILL D_XY2RAM( 120, SRC ), SZ CALL DISP_DEV( 0, 0, 127, 63 ) END SUB SUB CHIP8_00E0 FILL $8800, 512 FILL $9C00, 2048 END SUB SUB CHIP8_00EE ADD A_SP, -1, 0 TO 15 IF A_SP = 15 THEN CALL CHIP8_TRAP( "SP UNDRFLOW" ) A_PC = A_STACK( A_SP ) + $A400 END SUB SUB CHIP8_00FB LEFT_ONE_COL = -$10 FOR CY = 0 TO 56 STEP 8 AR2 = D_XY2RAM( 8, CY ) FOR ADR = D_XY2RAM( 120, CY ) TO AR2 STEP LEFT_ONE_COL POKE ADR , PEEK( ADR ) \ $10 OR PEEK( ADR - $10 ) * $10 POKE ADR + 1, PEEK( ADR + 1 ) \ $10 OR PEEK( ADR - $0F ) * $10 POKE ADR + 2, PEEK( ADR + 2 ) \ $10 OR PEEK( ADR - $0E ) * $10 POKE ADR + 3, PEEK( ADR + 3 ) \ $10 OR PEEK( ADR - $0D ) * $10 POKE ADR + 4, PEEK( ADR + 4 ) \ $10 OR PEEK( ADR - $0C ) * $10 POKE ADR + 5, PEEK( ADR + 5 ) \ $10 OR PEEK( ADR - $0B ) * $10 POKE ADR + 6, PEEK( ADR + 6 ) \ $10 OR PEEK( ADR - $0A ) * $10 POKE ADR + 7, PEEK( ADR + 7 ) \ $10 OR PEEK( ADR - $09 ) * $10 NEXT ADR POKE ADR , PEEK( ADR ) \ $10 POKE ADR + 1, PEEK( ADR + 1 ) \ $10 POKE ADR + 2, PEEK( ADR + 2 ) \ $10 POKE ADR + 3, PEEK( ADR + 3 ) \ $10 POKE ADR + 4, PEEK( ADR + 4 ) \ $10 POKE ADR + 5, PEEK( ADR + 5 ) \ $10 POKE ADR + 6, PEEK( ADR + 6 ) \ $10 POKE ADR + 7, PEEK( ADR + 7 ) \ $10 NEXT CY CALL DISP_DEV( 0, 0, 127, 63 ) END SUB SUB CHIP8_00FC FOR CY = 0 TO 56 STEP 8 AR2 = D_XY2RAM( 112, CY ) FOR ADR = D_XY2RAM( 0, CY ) TO AR2 STEP $10 POKE ADR , PEEK( ADR ) * $10 OR PEEK( ADR + $10 ) \ $10 POKE ADR + 1, PEEK( ADR + 1 ) * $10 OR PEEK( ADR + $11 ) \ $10 POKE ADR + 2, PEEK( ADR + 2 ) * $10 OR PEEK( ADR + $12 ) \ $10 POKE ADR + 3, PEEK( ADR + 3 ) * $10 OR PEEK( ADR + $13 ) \ $10 POKE ADR + 4, PEEK( ADR + 4 ) * $10 OR PEEK( ADR + $14 ) \ $10 POKE ADR + 5, PEEK( ADR + 5 ) * $10 OR PEEK( ADR + $15 ) \ $10 POKE ADR + 6, PEEK( ADR + 6 ) * $10 OR PEEK( ADR + $16 ) \ $10 POKE ADR + 7, PEEK( ADR + 7 ) * $10 OR PEEK( ADR + $17 ) \ $10 NEXT ADR POKE ADR , PEEK( ADR ) * $10 POKE ADR + 1, PEEK( ADR + 1 ) * $10 POKE ADR + 2, PEEK( ADR + 2 ) * $10 POKE ADR + 3, PEEK( ADR + 3 ) * $10 POKE ADR + 4, PEEK( ADR + 4 ) * $10 POKE ADR + 5, PEEK( ADR + 5 ) * $10 POKE ADR + 6, PEEK( ADR + 6 ) * $10 POKE ADR + 7, PEEK( ADR + 7 ) * $10 NEXT CY CALL DISP_DEV( 0, 0, 127, 63 ) END SUB SUB CHIP8_00FD CALL CHIP8_INIT( "" ) ADD A_PC, -2 END SUB SUB CHIP8_00FE A_IS_HIGH = 0 END SUB SUB CHIP8_00FF A_IS_HIGH = NOT 0 END SUB SUB CHIP8_1NNN A_PC = $100*(PEEK(A_PC) AND $0F)+PEEK(A_PC+1) + $A3FE END SUB SUB CHIP8_2NNN A_STACK( A_SP ) = A_PC - $A400 ADD A_SP, 1, 0 TO 15 IF A_SP = 0 THEN CALL CHIP8_TRAP( "SP OVERFLOW" ) A_PC = $100*(PEEK(A_PC) AND $0F)+PEEK(A_PC+1) + $A3FE END SUB SUB CHIP8_3XKK IF A_V(PEEK(A_PC) AND $0F) = PEEK(A_PC+1) THEN ADD A_PC, 2 END SUB SUB CHIP8_4XKK IF A_V(PEEK(A_PC) AND $0F) <> PEEK(A_PC+1) THEN ADD A_PC, 2 END SUB SUB CHIP8_5 IF PEEK(A_PC+1) AND $0F THEN CALL CHIP8_TRAP( "INVALID INS" ) ELSE CALL CHIP8_5XY0 END SUB SUB CHIP8_5XY0 IF A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC+1)\$10) THEN ADD A_PC, 2 END SUB SUB CHIP8_6XKK A_V(PEEK(A_PC) AND $0F) = PEEK(A_PC+1) END SUB SUB CHIP8_7XKK A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC) AND $0F) + PEEK(A_PC+1) AND $FF END SUB SUB CHIP8_8 N0 = PEEK(A_PC+1) AND $0F IF N0 <= 7 THEN IF N0 <= 3 THEN IF N0 <= 1 THEN IF N0 = 0 THEN CALL CHIP8_8XY0 ELSE CALL CHIP8_8XY1 ELSE IF N0 = 2 THEN CALL CHIP8_8XY2 ELSE CALL CHIP8_8XY3 END IF ELSE IF N0 <= 5 THEN IF N0 = 4 THEN CALL CHIP8_8XY4 ELSE CALL CHIP8_8XY5 ELSE IF N0 = 6 THEN CALL CHIP8_8XY6 ELSE CALL CHIP8_8XY7 END IF END IF ELSE IF N0 = $E THEN CALL CHIP8_8XYE ELSE CALL CHIP8_TRAP( "INVALID INS" ) END IF END SUB SUB CHIP8_8XY0 A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC+1)\$10) END SUB SUB CHIP8_8XY1 A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC) AND $0F) OR A_V(PEEK(A_PC+1)\$10) END SUB SUB CHIP8_8XY2 A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC) AND $0F) AND A_V(PEEK(A_PC+1)\$10) END SUB SUB CHIP8_8XY3 A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC) AND $0F) XOR A_V(PEEK(A_PC+1)\$10) END SUB SUB CHIP8_8XY4 A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC) AND $0F) + A_V(PEEK(A_PC+1)\$10) A_V($F) = -( A_V(PEEK(A_PC) AND $0F) > $FF ) A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC) AND $0F) + $100 AND $FF END SUB SUB CHIP8_8XY5 A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC) AND $0F) - A_V(PEEK(A_PC+1)\$10) A_V($F) = -( A_V(PEEK(A_PC) AND $0F) >= 0 ) A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC) AND $0F) + $100 AND $FF END SUB SUB CHIP8_8XY6 IF C_8XY6 THEN NUM=A_V(PEEK(A_PC) AND $0F) IF (PEEK(A_PC) AND $0F)<>(PEEK(A_PC+1)\$10) THEN CALL CHIP8_TRAP( "VY IGNORED" ) A_V(PEEK(A_PC) AND $0F) = NUM \ 2 A_V($F) = NUM AND $01 ELSE NUM=A_V(PEEK(A_PC+1)\$10) A_V(PEEK(A_PC) AND $0F) = NUM \ 2 A_V($F) = NUM AND $01 END IF END SUB SUB CHIP8_8XY7 A_V(PEEK(A_PC) AND $0F) =-A_V(PEEK(A_PC) AND $0F) + A_V(PEEK(A_PC+1)\$10) A_V($F) = -( A_V(PEEK(A_PC) AND $0F) >= 0 ) A_V(PEEK(A_PC) AND $0F) = A_V(PEEK(A_PC) AND $0F) + $100 AND $FF END SUB SUB CHIP8_8XYE IF C_8XY6 THEN NUM=A_V(PEEK(A_PC) AND $0F) IF (PEEK(A_PC) AND $0F)<>(PEEK(A_PC+1)\$10) THEN CALL CHIP8_TRAP( "VY IGNORED" ) A_V(PEEK(A_PC) AND $0F) = NUM * 2 AND $FF A_V($F) = NUM \ $80 ELSE NUM=A_V(PEEK(A_PC+1)\$10) A_V(PEEK(A_PC) AND $0F) = NUM * 2 AND $FF A_V($F) = NUM \ $80 END IF END SUB SUB CHIP8_9 IF PEEK(A_PC+1) AND $0F THEN CALL CHIP8_TRAP( "INVALID INS" ) ELSE CALL CHIP8_9XY0 END SUB SUB CHIP8_9XY0 IF A_V(PEEK(A_PC) AND $0F) <> A_V(PEEK(A_PC+1)\$10) THEN ADD A_PC, 2 END SUB SUB CHIP8_ANNN A_VI = $100*(PEEK(A_PC) AND $0F)+PEEK(A_PC+1) END SUB SUB CHIP8_BNNN IF C_BNNN THEN ARG = PEEK(A_PC) AND $0F ELSE ARG = 0 A_PC = $100*(PEEK(A_PC) AND $0F)+PEEK(A_PC+1) + A_V(ARG) + $A3FE END SUB SUB CHIP8_CXKK A_V(PEEK(A_PC) AND $0F) = RND( 255 ) AND PEEK(A_PC+1) END SUB SUB CHIP8_DXYN 'A_IS_HIGH -1HIGH/0LOW. C_DXYN0 -1VF<>0/0VF=1. C_DXYN1 -1SKIP/0S16X06/1S8X06. C_DXYN2 -1PT WRAP/0BIT WRAP(N/A)/1CLIP. C_DXYN3 -1WAIT/0FAST/1WAIT HIT. REPEAT X0 = A_V(PEEK(A_PC) AND $0F) Y0 = A_V(PEEK(A_PC+1)\$10) H0 = (PEEK(A_PC+1) AND $0F) - 1 IF A_IS_HIGH THEN IF H0 < 0 THEN W0 = 8 ELSE W0 = 0 IF H0 < 0 THEN H0 = 15 ELSE IF H0 < 0 AND C_DXYN1 = 0 THEN W0 = 8 ELSE W0 = 0 IF H0 < 0 AND C_DXYN1 >= 0 THEN H0 = 15 ADD X0, X0 ADD Y0, Y0 ADD W0, W0 ADD H0, H0 END IF IF C_DXYN2 <> 1 THEN X0 = X0 AND $7F Y0 = Y0 AND $3F END IF Y2 = MIN( Y0 + H0, $3F ) SUM_HIT = 0 UNTIL 1 IF X0 <= $7F AND Y0 <= $3F THEN X0_LE_H77 = X0 <= $77 X0_LE_H6F = X0 <= $6F SRC = A_VI + $A400 SHR = 2 ^ ( X0 AND 7 ) SHL = 2 ^ ( 8 - ( X0 AND 7 ) ) X0P08 = X0 + 8 X0P16 = X0 + 16 RESTORE MAIN0 IF A_IS_HIGH THEN FOR Y1 = Y0 TO Y2 READ D_ROW_HIT CALL CHIP8_DXYN0( PEEK(SRC)\SHR, D_XY2RAM(X0 ,Y1 ) ) IF X0_LE_H77 THEN CALL CHIP8_DXYN0( PEEK(SRC)*SHL, D_XY2RAM(X0P08,Y1 ) ) IF W0 THEN INC SRC CALL CHIP8_DXYN0( PEEK(SRC)\SHR, D_XY2RAM(X0P08,Y1 ) ) IF X0_LE_H6F THEN CALL CHIP8_DXYN0( PEEK(SRC)*SHL, D_XY2RAM(X0P16,Y1 ) ) END IF ELSE IF W0 THEN INC SRC END IF IF D_ROW_HIT THEN INC SUM_HIT INC SRC NEXT Y1 ELSE IF W0 THEN X0_LE_H67 = X0 <= $67 X0_LE_H5F = X0 <= $5F X0P24 = X0 + 24 X0P32 = X0 + 32 END IF FOR Y1 = Y0 TO Y2 STEP 2 Y1P1 = Y1 + 1 READ D_ROW_HIT WDHI = D_B2H( PEEK( SRC ) ) CALL CHIP8_DXYN0( WDHI \SHR, D_XY2RAM(X0 ,Y1 ) ) CALL CHIP8_DXYN0( WDHI \SHR, D_XY2RAM(X0 ,Y1P1) ) IF X0_LE_H77 THEN CALL CHIP8_DXYN0( WDHI *SHL, D_XY2RAM(X0P08,Y1 ) ) CALL CHIP8_DXYN0( WDHI *SHL, D_XY2RAM(X0P08,Y1P1) ) WDLO = D_B2L( PEEK( SRC ) ) CALL CHIP8_DXYN0( WDLO \SHR, D_XY2RAM(X0P08,Y1 ) ) CALL CHIP8_DXYN0( WDLO \SHR, D_XY2RAM(X0P08,Y1P1) ) IF X0_LE_H6F THEN CALL CHIP8_DXYN0( WDLO *SHL, D_XY2RAM(X0P16,Y1 ) ) CALL CHIP8_DXYN0( WDLO *SHL, D_XY2RAM(X0P16,Y1P1) ) IF W0 THEN INC SRC WDHI = D_B2H( PEEK( SRC ) ) CALL CHIP8_DXYN0( WDHI \SHR, D_XY2RAM(X0P16,Y1 ) ) CALL CHIP8_DXYN0( WDHI \SHR, D_XY2RAM(X0P16,Y1P1) ) IF X0_LE_H67 THEN CALL CHIP8_DXYN0( WDHI *SHL, D_XY2RAM(X0P24,Y1 ) ) CALL CHIP8_DXYN0( WDHI *SHL, D_XY2RAM(X0P24,Y1P1) ) WDLO = D_B2L( PEEK( SRC ) ) CALL CHIP8_DXYN0( WDLO \SHR, D_XY2RAM(X0P24,Y1 ) ) CALL CHIP8_DXYN0( WDLO \SHR, D_XY2RAM(X0P24,Y1P1) ) IF X0_LE_H5F THEN CALL CHIP8_DXYN0( WDLO *SHL, D_XY2RAM(X0P32,Y1 ) ) CALL CHIP8_DXYN0( WDLO *SHL, D_XY2RAM(X0P32,Y1P1) ) END IF END IF END IF ELSE IF W0 THEN INC SRC END IF ELSE IF W0 THEN INC SRC END IF IF D_ROW_HIT THEN INC SUM_HIT INC SRC NEXT Y1 END IF IF H0 >= 0 THEN CALL DISP_DEV( X0, Y0, MIN( X0 + 14 + W0, $7F ), Y2 ) END IF IF C_DXYN0 AND A_IS_HIGH THEN A_V($F)=SUM_HIT+MAX(0,Y0+H0-$3F) ELSE A_V($F)=SGN(SUM_HIT) IF C_DXYN3 = 1 AND SUM_HIT = 0 OR C_DXYN3 THEN A_INS_ACC = A_IPS END SUB SUB CHIP8_DXYN0( NUM, DST ) ADD D_ROW_HIT, PEEK( DST ) AND NUM POKE DST, PEEK( DST ) XOR NUM END SUB SUB CHIP8_E POS = INSTR( "9E A1", HEX$( PEEK(A_PC+1), 2 ) ) IF POS THEN IF POS = 1 THEN CALL CHIP8_EX9E ELSE CALL CHIP8_EXA1 ELSE CALL CHIP8_TRAP( "INVALID INS" ) END IF END SUB SUB CHIP8_EX9E IF A_V(PEEK(A_PC) AND $0F) = INSTR(E_INKEY$,N_K$) - 1 THEN ADD A_PC, 2 END SUB SUB CHIP8_EXA1 IF A_V(PEEK(A_PC) AND $0F) <> INSTR(E_INKEY$,N_K$) - 1 THEN ADD A_PC, 2 END SUB SUB CHIP8_F POS = INSTR( "07 0A 15 18 1E 29 30 33 55 65 75 85", HEX$( PEEK(A_PC+1), 2 ) ) IF POS<=19 THEN IF POS<=7 THEN IF POS<=1 THEN IF POS THEN CALL CHIP8_FX07 ELSE CALL CHIP8_TRAP( "INVALID INS" ) ELSE IF POS = 4 THEN CALL CHIP8_FX0A ELSE CALL CHIP8_FX15 END IF ELSE IF POS<=13 THEN IF POS = 10 THEN CALL CHIP8_FX18 ELSE CALL CHIP8_FX1E ELSE IF POS = 16 THEN CALL CHIP8_FX29 ELSE CALL CHIP8_FX30 END IF END IF ELSE IF POS<=31 THEN IF POS<=25 THEN IF POS = 22 THEN CALL CHIP8_FX33 ELSE CALL CHIP8_FX55 ELSE IF POS = 28 THEN CALL CHIP8_FX65 ELSE CALL CHIP8_FX75 END IF ELSE CALL CHIP8_FX85 END IF END IF END SUB SUB CHIP8_FX07 A_V(PEEK(A_PC) AND $0F) = A_DT END SUB SUB CHIP8_FX0A IF DEV_IS_FAST THEN POS = INSTR( E_INKEY$, N_K$ ) IF POS THEN A_V(PEEK(A_PC) AND $0F) = POS - 1 ELSE ADD A_PC, -2 ELSE CALL NUMPAD_ALL( 0, 1, 1 ) REPEAT POS = INSTR( E_INKEY$, INKEY$ ) WAIT VBL UNTIL POS A_V(PEEK(A_PC) AND $0F) = POS - 1 CALL NUMPAD_ALL( 0, 1, 2 ) END IF END SUB SUB CHIP8_FX15 A_DT = A_V(PEEK(A_PC) AND $0F) END SUB SUB CHIP8_FX18 A_ST = A_V(PEEK(A_PC) AND $0F) END SUB SUB CHIP8_FX1E A_VI = ( A_VI + A_V(PEEK(A_PC) AND $0F) ) MOD $3C00 IF C_FX1E THEN A_V($F) = -( A_VI > $0FFF ) END SUB SUB CHIP8_FX29 A_VI = 5 * A_V(PEEK(A_PC) AND $0F) + 4 END SUB SUB CHIP8_FX30 A_VI = 10 * A_V(PEEK(A_PC) AND $0F) + 84 END SUB SUB CHIP8_FX33 NUM = A_V(PEEK(A_PC) AND $0F) IF A_VI<$3C00 THEN POKE A_VI+$A400, NUM \100 ELSE POKE A_VI+$6800, NUM \100 IF A_VI<$3BFF THEN POKE A_VI+$A401,(NUM MOD 100)\10 ELSE POKE A_VI+$6801,(NUM MOD 100)\10 IF A_VI<$3BFE THEN POKE A_VI+$A402, NUM MOD 10 ELSE POKE A_VI+$6802, NUM MOD 10 END SUB SUB CHIP8_FX55 AG2 = PEEK(A_PC) AND $0F FOR ARG = 0 TO AG2 POKE ( A_VI + ARG ) MOD $3C00 + $A400, A_V(ARG) NEXT ARG IF NOT C_FX55 THEN A_VI = ( A_VI + ARG ) MOD $3C00 END SUB SUB CHIP8_FX65 AG2 = PEEK(A_PC) AND $0F FOR ARG = 0 TO AG2 A_V(ARG) = PEEK( ( A_VI + ARG ) MOD $3C00 + $A400 ) NEXT ARG IF NOT C_FX55 THEN A_VI = ( A_VI + ARG ) MOD $3C00 END SUB SUB CHIP8_FX75 AG2 = PEEK(A_PC) AND $0F FOR ARG = 0 TO AG2 POKE ARG + $E000, A_V(ARG) NEXT ARG IF ARG > 7 THEN CALL CHIP8_TRAP( "RPL RANGE" ) END SUB SUB CHIP8_FX85 AG2 = PEEK(A_PC) AND $0F FOR ARG = 0 TO AG2 A_V(ARG) = PEEK( ARG + $E000 ) NEXT ARG IF ARG > 7 THEN CALL CHIP8_TRAP( "RPL RANGE" ) END SUB '##:LAYERS. ' BG1 CELL=2 (P5 DEFAULT, TINT P3 TO HIGHLIGHT) OR PIXEL-LEVEL DISPLAY BUFFER ' BG0 ALL OTHER TEXT 'SPRITES ONLY USED IN DEV DISPLAY FOR A FRACTION OF THE TRANSLATION CHARACTERS. '##:RAM. '$8800 TO $8FFF (2 KB) PLAY DISPLAY CHARACTER BITMAP DIRECT, CH 128 TO 255 (128 CH). '$8800 TO $89FF (512 B) DEV DISPLAY CHARACTER BITMAP DIRECT, CH 128 TO 159 (32 CH). '$8A00 TO $8FFF (1.5 KB) DEV TRANSLATION CHARACTERS, CH 160 TO 255 (96 CH). '$9000 TO $93FF (1 KB) BG0 CY=0 TO CY=15. '$9400 TO $97FF (1 KB) BG0 CY=16 TO CY=31 HIDDEN. '$9800 TO $9BFF (1 KB) BG1 CY=0 TO CY=15. '$9C00 TO $9FFF (1 KB) BG1 CY=16 TO CY=31 HIDDEN. WORKING RAM FOLLOWS AT $A000. '$A000 TO $DFFF (16 KB) WORKING RAM. '$9C00 TO $A3FF (2 KB) DEV DISPLAY CHARACTER BITMAP BUFFER. '$A400 TO $DFFF (15 KB) EMULATED RAM: ' $0000 TO $0FFF (4KB) EXECUTABLE RAM, A_PC MAY EXCEED THESE VALUES, BUT JP NNN IS ' LIMITED SO IT'S EFFECTIVELY DATA-ONLY. ' $0000 (2 B) CLS, $00E0. ' $0002 (2 B) JP $200, $1200. ' $0004 TO $F3 (240 B) SYSTEM HEXADECIMAL FONTS (USE WITH LD I,VX). ' $0000 TO $01FF (512 B) INTERPRETER RESERVED RAM. MODERN GAMES DO NOT RESPECT RESERVED ' RAM AND MIGHT LOAD DATA TO BE EXECUTED AS BANK-SWITCHED CODE. ' $0200 TO $3C00 (14.5 KB) LOAD ADDRESS FOR GAMES. ' $0EA0 TO $0FFF (352 B) VARIABLES AND DISPLAY REFRESH RESERVED RAM. MODERN GAMES DO NOT ' RESPECT RESERVED RAM AND MIGHT BE MUCH LARGER. THE OCTO EMULATOR ALLOWS ' GAMES UP TO 64 KB, SO I'VE PROVIDED AS MUCH LOWRES NX RAM AS POSSIBLE. ' $0E8F TO $0FFF (368 B) THE ORIGINAL INTERPRETER DOCUMENTATION SHOWS THIS RANGE RESERVED ' RATHER THAN ABOVE, BUT INCORRECTLY CLAIMS IT IS 352 BYTES (MOST LIKELY A ' HEXADECIMAL ARITHMETIC ERROR IN THE DOCUMENTATION). '$E000 TO $E007 (16 B) RPL FLAGS, MODERN GAMES DO NOT RESPECT ORIGINAL BYTE LIMIT (8) AND ' MIGHT ATTEMPT TO USE UP TO 16 BYTES. '$E008 TO $EFFF (~3.99 KB) 255 CONFIG STATES, 16 BYTES EACH: ' $0000 TO $0002 (3 B) HASH VALUE (PEARSON HASH WITH AN LFSR-24 TABLE). ' $0003 TO $0004 (2 B) QUIRKS (BITS 4 TO 31) AND FONT (BITS 0 TO 3). ' $0005 TO $0006 (2 B) IPS (BIT 0 TO 14), HI CLR 1 (BIT 15 RESET), HI CLR 2 (BIT 15 SET). ' $0007 TO $000A (4 B) COLOR RGB VALUES FOR CLR=0, CLR=1, CLR=2, AND CLR=3. ' $000B TO $000B (1 B) HEXADECIMAL KEY UP (BIT 0 TO 3), KEY DOWN (BIT 4 TO 7). ' $000C TO $000C (1 B) HEXADECIMAL KEY LEFT (BIT 0 TO 3), KEY RIGHT (BIT 4 TO 7). ' $000D TO $000D (1 B) HEXADECIMAL KEY BUTTON-A (BIT 0 TO 3), KEY BUTTON-B (BIT 4 TO 7). ' $000E TO $000F (2 B) RESERVED. PAD WITH A GARBAGE WORD FOR NOW. '$F000 TO $FFFF (4 KB) LOWRES NX SYSTEM RESERVED. SOME OF THIS RAM IS WRITABLE, BUT IT'S NOT ' CONTIGUOUS IN ANY APPRECIABLE QUANTITY AND IT EFFECTS THE LOWRES NX DISPLAY. 'NOTES: ' 1. A_VI IS IN EMULATOR SPACE, ONLY ADD LOW RES NX RAM OFFSET WHEN PEEKING. BECAUSE A_VI ' COULD BE VERY CLOSE TO THE 15 KB LIMIT, THIS VARIABLE WRAPS (DOES NOT RESET). ' 2. A_PC IS IN LOW RES NX SPACE, FROM $A400 TO $DFFF, RESETS (DOES NOT WRAP). RESET IS ' ACCEPTABLE SINCE $DFFF SO FAR OUTSIDE EXECUTABLE LIMIT AT $AFFF. '#0:CHIP8 FONTS. '#1:MAIN PALETTES. ' PAL COLORS BUTTON DESC TEXT TINT NOTES ' 0 N/A N/A N/A N/A PIXEL-LEVEL DISPLAY BUFFER ' 1 GRAY POLLING NORMAL DEFAULT ' 2 GRAY DISABLED N/A N/A ' 3 GRAY PRESSED N/A N/A ' 4 BLUE SELECTED VALUES HIGHLIGHT ' 5 ORANGE POLLING MENU N/A ' 6 RED N/A ADDRESS N/A ' 7 WHITE N/A PAUSE N/A '#2:MAIN CHARACTERS. 'PAGE 1 NORMAL TEXT: ' CELL CHR DESC ' 2 " SOLID C1 ' 27 ; ENTER ' 59 [ LEFT ' 60 \ BACKSPACE ' 61 ] RIGHT ' 62 ^ UP ' 63 _ DOWN 'PAGE 2 BUTTON TEXT. 'PAGE 3-4 TINY TEXT FOR USE WITH TRANSLATION. '#3:TINY CHARACTERS. '#4 TO #14: CHIP8 GAMES. #0:CHIP8 FONTS F0909090F00000000000000000000000 60202020700000000000000000000000 F010F080F00000000000000000000000 F010F010F00000000000000000000000 A0A0F020200000000000000000000000 F080F010F00000000000000000000000 F080F090F00000000000000000000000 F0101010100000000000000000000000 F090F090F00000000000000000000000 F090F010F00000000000000000000000 F090F090900000000000000000000000 F0507050F00000000000000000000000 F0808080F00000000000000000000000 F0505050F00000000000000000000000 F080F080F00000000000000000000000 F080F080800000000000000000000000 E0A0A0A0E00000000000000000000000 40404040400000000000000000000000 E020E080E00000000000000000000000 E020E020E00000000000000000000000 80A0A0E0200000000000000000000000 E080E020E00000000000000000000000 E080E0A0E00000000000000000000000 E0202020200000000000000000000000 E0A0E0A0E00000000000000000000000 E0A0E020E00000000000000000000000 E0A0E0A0A00000000000000000000000 C0A0E0A0C00000000000000000000000 E0808080E00000000000000000000000 C0A0A0A0C00000000000000000000000 E080E080E00000000000000000000000 E080C080800000000000000000000000 E0A0A0A0E00000000000000000000000 20202020200000000000000000000000 E020E080E00000000000000000000000 E020E020E00000000000000000000000 A0A0E020200000000000000000000000 E080E020E00000000000000000000000 E080E0A0E00000000000000000000000 E0202020200000000000000000000000 E0A0E0A0E00000000000000000000000 E0A0E020E00000000000000000000000 E0A0E0A0A00000000000000000000000 8080E0A0E00000000000000000000000 E0808080E00000000000000000000000 2020E0A0E00000000000000000000000 E080E080E00000000000000000000000 E080C080800000000000000000000000 F0909090F00000000000000000000000 20602020700000000000000000000000 F010F080F00000000000000000000000 F010F010F00000000000000000000000 9090F010100000000000000000000000 F080F010F00000000000000000000000 F080F090F00000000000000000000000 F0102040400000000000000000000000 F090F090F00000000000000000000000 F090F010F00000000000000000000000 F090F090900000000000000000000000 E090E090E00000000000000000000000 F0808080F00000000000000000000000 E0909090E00000000000000000000000 F080F080F00000000000000000000000 F080F080800000000000000000000000 3C7EE7C3C3C3C3E70000000000000000 18385818181818180000000000000000 3E7FC3060C1830600000000000000000 3C7EC3030E0E03C30000000000000000 060E1E3666C6FFFF0000000000000000 FFFFC0C0FCFE03C30000000000000000 3E7CE0C0FCFEC3C30000000000000000 FFFF03060C1830600000000000000000 3C7EC3C37E7EC3C30000000000000000 3C7EC3C37F3F03030000000000000000 3C7EC3C3FFFFC3C30000000000000000 FCFEC3C3FEFEC3C30000000000000000 3C7EC3C0C0C0C0C30000000000000000 FCFEC3C3C3C3C3C30000000000000000 FFFFC0C0FEFEC0C00000000000000000 FFFFC0C0FEFEC0C00000000000000000 7E3C0000000000000000000000000000 183C0000000000000000000000000000 FFFF0000000000000000000000000000 7E3C0000000000000000000000000000 06060000000000000000000000000000 7E3C0000000000000000000000000000 7E3C0000000000000000000000000000 60600000000000000000000000000000 7E3C0000000000000000000000000000 3E7C0000000000000000000000000000 C3C30000000000000000000000000000 FEFC0000000000000000000000000000 7E3C0000000000000000000000000000 FEFC0000000000000000000000000000 FFFF0000000000000000000000000000 C0C00000000000000000000000000000 60A0A0A0C00000000000000000000000 40C04040E00000000000000000000000 C0204080E00000000000000000000000 C0204020C00000000000000000000000 20A0E020200000000000000000000000 E080C020C00000000000000000000000 4080C0A0400000000000000000000000 E0206040400000000000000000000000 40A040A0400000000000000000000000 40A06020400000000000000000000000 40A0E0A0A00000000000000000000000 C0A0C0A0C00000000000000000000000 60808080600000000000000000000000 C0A0A0A0C00000000000000000000000 E080C080E00000000000000000000000 E080C080800000000000000000000000 7CC6CEDED6F6E6C60000000000000000 1030F030303030300000000000000000 78CCCC0C183060CC0000000000000000 78CC0C0C380C0CCC0000000000000000 0C1C3C6CCCFE0C0C0000000000000000 FCC0C0C0F80C0CCC0000000000000000 3860C0C0F8CCCCCC0000000000000000 FEC6C6060C1830300000000000000000 78CCCCEC78DCCCCC0000000000000000 7CC6C6C67C1818300000000000000000 3078CCCCCCFCCCCC0000000000000000 FC6666667C6666660000000000000000 3C66C6C0C0C0C6660000000000000000 F86C66666666666C0000000000000000 FE6260647C6460620000000000000000 FE6662647C6460600000000000000000 7C000000000000000000000000000000 FC000000000000000000000000000000 FC000000000000000000000000000000 78000000000000000000000000000000 1E000000000000000000000000000000 78000000000000000000000000000000 78000000000000000000000000000000 30000000000000000000000000000000 78000000000000000000000000000000 70000000000000000000000000000000 CC000000000000000000000000000000 FC000000000000000000000000000000 3C000000000000000000000000000000 F8000000000000000000000000000000 FE000000000000000000000000000000 F0000000000000000000000000000000 F0909090F00000000000000000000000 20602020700000000000000000000000 F010F080F00000000000000000000000 F010F010F00000000000000000000000 9090F010100000000000000000000000 F080F010F00000000000000000000000 F080F090F00000000000000000000000 F0102040400000000000000000000000 F090F090F00000000000000000000000 F090F010F00000000000000000000000 F090F090900000000000000000000000 E090E090E00000000000000000000000 F0808080F00000000000000000000000 E0909090E00000000000000000000000 F080F080F00000000000000000000000 F080F080800000000000000000000000 FFFFC3C3C3C3C3C30000000000000000 18787818181818180000000000000000 FFFF0303FFFFC0C00000000000000000 FFFF0303FFFF03030000000000000000 C3C3C3C3FFFF03030000000000000000 FFFFC0C0FFFF03030000000000000000 FFFFC0C0FFFFC3C30000000000000000 FFFF0303060C18180000000000000000 FFFFC3C3FFFFC3C30000000000000000 FFFFC3C3FFFF03030000000000000000 7EFFC3C3FFFFC3C30000000000000000 FCFCC3C3FCFCC3C30000000000000000 3CFFC3C0C0C0C0C30000000000000000 FCFEC3C3C3C3C3C30000000000000000 FFFFC0C0FFFFC0C00000000000000000 FFFFC0C0FFFFC0C00000000000000000 FFFF0000000000000000000000000000 FFFF0000000000000000000000000000 FFFF0000000000000000000000000000 FFFF0000000000000000000000000000 03030000000000000000000000000000 FFFF0000000000000000000000000000 FFFF0000000000000000000000000000 18180000000000000000000000000000 FFFF0000000000000000000000000000 FFFF0000000000000000000000000000 C3C30000000000000000000000000000 FCFC0000000000000000000000000000 FF3C0000000000000000000000000000 FEFC0000000000000000000000000000 FFFF0000000000000000000000000000 C0C00000000000000000000000000000 #1:MAIN PALETTES 00052F3F00152A3F0000152A003F2A15 15011B2F0024393E00213A3F00013F01 #2:MAIN CHARACTERS 00000000000000000000000000000000 000000000000000000060C7E307E4000 0000000000000000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000083E380E3E0800 00000000000000000062640810264600 0000000000000000001C34386E643A00 00000000000000000018183000000000 0000000000000000000C183030180C00 00000000000000000030180C0C183000 0000000000000000000024187E182400 0000000000000000000018187E181800 00000000000000000000000018183000 0000000000000000000000007E000000 00000000000000000000000000181800 000000000000000000060C1830604000 0000000000000000003C666E76663C00 00000000000000000018381818187E00 0000000000000000003C660C18307E00 0000000000000000003C660C06663C00 00000000000000000066667E06060600 0000000000000000007E607C06067C00 0000000000000000001C307C66663C00 0000000000000000007E060C18303000 0000000000000000003C663C66663C00 0000000000000000003C663E06663C00 00000000000000000000001800180000 FE8195B5FDB1917FFFFEEACA82CEEE80 000000000000000000000C1830180C00 00000000000000000000007E007E0000 0000000000000000000030180C183000 0000000000000000003C660C18001800 FFFFFFFFFFFFFFFF0000000000000000 000000000000000000183C667E666600 0000000000000000007C667C66667C00 0000000000000000003C666060663C00 000000000000000000786C66666C7800 0000000000000000007E607860607E00 0000000000000000007E607860606000 0000000000000000003C606E66663C00 00000000000000000066667E66666600 0000000000000000003C181818183C00 0000000000000000001E060606663C00 000000000000000000666C78786C6600 00000000000000000060606060607E00 00000000000000000042667E7E666600 00000000000000000066767E6E666600 0000000000000000003C666666663C00 0000000000000000007C667C60606000 0000000000000000003C66666A6C3E00 0000000000000000007C667C786C6600 0000000000000000003E603C06067C00 0000000000000000007E181818181800 00000000000000000066666666663C00 000000000000000000666666663C1800 00000000000000000066667E7E664200 000000000000000000663C183C666600 00000000000000000066663C18181800 0000000000000000007E0C1830607E00 FE91B9FD9191817FFFFEFEFEFEFEFE80 FE9191FDB991817FFFFEFEFEFEFEFE80 FE91B1FDB191817FFFFEFEFEFEFEFE80 FE9199FD9991817FFFFEFEFEFEFEFE80 FE9DBDFDBD9D817FFFE2DABADAE2FE80 FE81B7A795B5817FFFFEFEFEFEFEFE80 FE9191918191817FFFEEEEEEFEEEFE80 FE81A9A98181817FFFFED6D6FEFEFE80 FEA9FDA9FDA9817FFFD682D682D6FE80 FEBDD1B995F9917FFFC2AEC6EA86EE80 FE81A58991A5817FFFFEDAF6EEDAFE80 FE91A991A995817FFFEED6EED6EAFE80 FE8191918181817FFFFEEEEEFEFEFE80 FE8991919189817FFFF6EEEEEEF6FE80 FE9189898991817FFFEEF6F6F6EEFE80 FE81A991A981817FFFFED6EED6FEFE80 FE8191B99181817FFFFEEEC6EEFEFE80 FE8181818991817FFFFEFEFEF6EEFE80 FE8181B98181817FFFFEFEC6FEFEFE80 FE8181819999817FFFFEFEFEE6E6FE80 FE81858991A1817FFFFEFAF6EEDEFE80 FEBDA5A5A5BD817FFFC2DADADAC2FE80 FE91B19191B9817FFFEECEEEEEC6FE80 FEB98599A1BD817FFFC6FAE6DEC2FE80 FEB9859985B9817FFFC6FAE6FAC6FE80 FEA5A5BD8585817FFFDADAC2FAFAFE80 FEBDA1B985B9817FFFC2DEC6FAC6FE80 FE99A1B9A599817FFFE6DEC6DAE6FE80 FEBD85899191817FFFC2FAF6EEEEFE80 FE99A599A599817FFFE6DAE6DAE6FE80 FE99A59D8599817FFFE6DAE2FAE6FE80 FE8191819181817FFFFEEEFEEEFEFE80 FE8189818991817FFFFEF6FEF6EEFE80 FE8991A19189817FFFF6EEDEEEF6FE80 FE81B981B981817FFFFEC6FEC6FEFE80 FEA1918991A1817FFFDEEEF6EEDEFE80 FE99A5898189817FFFE6DAF6FEF6FE80 FE99A5ADA19D817FFFE6DAD2DEE2FE80 FE99A5BDA5A5817FFFE6DAC2DADAFE80 FEB9A5B9A5B9817FFFC6DAC6DAC6FE80 FE99A5A1A599817FFFE6DADEDAE6FE80 FEB9A5A5A5B9817FFFC6DADADAC6FE80 FEBDA1B9A1BD817FFFC2DEC6DEC2FE80 FEBDA1B9A1A1817FFFC2DEC6DEDEFE80 FE9DA1ADA59D817FFFE2DED2DAE2FE80 FEA5A5BDA5A5817FFFDADAC2DADAFE80 FEB9919191B9817FFFC6EEEEEEC6FE80 FE9D8585A599817FFFE2FAFADAE6FE80 FEA5A9B1A9A5817FFFDAD6CED6DAFE80 FEA1A1A1A1BD817FFFDEDEDEDEC2FE80 FEC5EDD5C5C5817FFFBA92AABABAFE80 FEC5E5D5CDC5817FFFBA9AAAB2BAFE80 FEB9C5C5C5B9817FFFC6BABABAC6FE80 FEB9A5B9A1A1817FFFC6DAC6DEDEFE80 FE99A5A5AD9D817FFFE6DADAD2E2FE80 FEB9A5B9A5A5817FFFC6DAC6DADAFE80 FE9DA19985B9817FFFE2DEE6FAC6FE80 FEB991919191817FFFC6EEEEEEEEFE80 FEA5A5A5A599817FFFDADADADAE6FE80 FEC5C5A9A991817FFFBABAD6D6EEFE80 FEC5C5D5EDC5817FFFBABAAA92BAFE80 FEC5A991A9C5817FFFBAD6EED6BAFE80 FEC5A9919191817FFFBAD6EEEEEEFE80 FEBD8991A1BD817FFFC2F6EEDEC2FE80 FE8199919199817FFFFEE6EEEEE6FE80 FE81A1918985817FFFFEDEEEF6FAFE80 FE8199898999817FFFFEE6F6F6E6FE80 FE91A9C58181817FFFEED6BAFEFEFE80 FE81818181BD817FFFFEFEFEFEC2FE80 #3:TINY CHARACTERS 00000000000000000000000000000000 00000000000000000040404000400000 00000000000000000050500000000000 00000000000000000050705070500000 00000000000000000020706030702000 00000000000000000050102040500000 00000000000000000020502050300000 00000000000000000020200000000000 00000000000000000010202020100000 00000000000000000040202020400000 00000000000000000000502050000000 00000000000000000000207020000000 00000000000000000000000020204000 00000000000000000000007000000000 00000000000000000000000020200000 00000000000000000000102040000000 00000000000000000020505050200000 00000000000000000020602020700000 00000000000000000060102040700000 00000000000000000060102010600000 00000000000000000050507010100000 00000000000000000070406010600000 00000000000000000030407050700000 00000000000000000070102040400000 00000000000000000070507050700000 00000000000000000070507010100000 00000000000000000000200000200000 00000000000000000000200000204000 00000000000000000010204020100000 00000000000000000000700070000000 00000000000000000040201020400000 00000000000000000060102000200000 00000000000000000020505040300000 00000000000000000020507050500000 00000000000000000060506050600000 00000000000000000030404040300000 00000000000000000060505050600000 00000000000000000070406040700000 00000000000000000070406040400000 00000000000000000030405050300000 00000000000000000050507050500000 00000000000000000070202020700000 00000000000000000010101050200000 00000000000000000050506050500000 00000000000000000040404040700000 00000000000000000050707050500000 00000000000000000010507050400000 00000000000000000070505050700000 00000000000000000060506040400000 00000000000000000020505070300000 00000000000000000060506050500000 00000000000000000030402010600000 00000000000000000070202020200000 00000000000000000050505050300000 00000000000000000050505020200000 00000000000000000050507070500000 00000000000000000050502050500000 00000000000000000050502020200000 00000000000000000070102040700000 00000000000000000030202020300000 00000000000000000000402010000000 00000000000000000060202020600000 00000000000000000020500000000000 00000000000000000000000000007000 00000000000000000040200000000000 00000000000000000000305050300000 00000000000000000040605050600000 00000000000000000000304040300000 00000000000000000010305050300000 00000000000000000000305060300000 00000000000000000010207020200000 00000000000000000000305030106000 00000000000000000040605050500000 00000000000000000020006020200000 00000000000000000020002020204000 00000000000000000040506060500000 00000000000000000060202020200000 00000000000000000000707070500000 00000000000000000000605050500000 00000000000000000000205050200000 00000000000000000000605050604000 00000000000000000000305050301000 00000000000000000000304040400000 00000000000000000000306030600000 00000000000000000020702020100000 00000000000000000000505050300000 00000000000000000000505020200000 00000000000000000000507070700000 00000000000000000000502020500000 00000000000000000000505030106000 00000000000000000000703060700000 00000000000000000030204020300000 00000000000000000020202020200000 00000000000000000060201020600000 00000000000000000030600000000000 00000000000000008080808080808000 #4:TANK WEISBECKER '78 6A026B0C6C3F6D0CA2EADAB6DCD66E00 22D4660368026060F015F0073000121A C717770869FFA2F0D671A2EADAB6DCD6 6001E0A17BFE6004E0A17B02601F8B02 DAB68D70C00A7DFE40007D026000601F 8D02DCD6A2F0D67186848794603F8602 611F871246021278463F1282471F69FF 47006901D671122A68026301807080B5 128A68FE630A807080D53F0112A26102 80153F0112BA80153F0112C880153F01 12C26020F01822D48E3422D4663E3301 660368FE33016802121679FF49FE69FF 12C87901490269016004F01876014640 76FE126CA2F2FE33F265F12964146500 D4557415F229D45500EE808080808080 800000000000 #5:ALIEN LINDSTEDT '93 12124A6F6E6173204C696E6473746564 740000FF128A6401A5106B006C3BDBC4 7B083B80121E683CA5086935D8966300 4300123AA50ED23263008C407CFF6B03 8CB26B004C00124E7B057CFF12446100 A4EEFB1EF065A516F11EF05571017B01 310612506D086E0566006A01A51680D0 D0E57014306C12702344240E22F62384 4F42123024463463127A00E0A4946D28 6E0A6C0ADDEA7D08FC1E3D581294A4D0 6D346E196C05DDE57D08FC1E3D4C12A6 6D2D6E286C05DDE57D08FC1E3D4512B6 A515F065A522F0336C00A522FC1EF065 F029DDE57D057C013C0312CA6C0AEC9E 12DEA51460006100F1556C3600C17CFF 3C0012EC12163300132ACC0F3C001328 CC077C018C56A51CFC1EF06540001328 82D083E073054C00132072147CFF1316 A50ED2323F00133800EEA50ED2327301 333A1320630000EE6C358B308BC53F00 646300EE8040700180566C00A51CFC1E F0557C013C05134CA522F433236C6C78 FC15FC073C001362236C00EEA523F065 F0306C376B1BDCBAA524F065F0306C41 DCBA00EE46001400A50ED56276FF4600 1400D5624F0014008CE07C058C654F00 1402D56275FB66008CD060008BC08B55 3F0013BA7C14700113ACA51CF01EF065 70FFF055A5164000DCE56C0AFC18A514 F0656CFF80C3F055300013E4A515F065 7001F0556C006B00A51CFC1EF0653000 7B017C013C0513E83B00140074016F42 00EEA50ED232D5626300660000EE6B00 6C03ECA16BFF6C0CECA16B014B001432 48016B0148786BFFA5086935D89688B4 D8966C0AEC9E14443600144485806635 A50ED56200EEF00730001464600AF015 67003D21145A6AFF14603D0714626A01 6701246600EE8BD06C0089B081E0A51C FC1EF06540001482A516D91589A48174 D9157C017B143C05146A8DA48E744E30 646300EE3C0C1E1E33333F6161F31F0C 0C0C0C0C0C8C8CDF0701010101010101 61E7E78383838383838383E7FB190161 E161010119FB9F86C6E6E6B69E9E8EE6 E494E790F7878080808788888888AF66 884828C64CAAACAA4AE088C088E00000 18FF3C00183CFF81423C3C3C423C5A5A 7E7E0000243C24000018183C7EFF1818 FF225588000000000000000000000000 000000000000 #6:ANT CATTO '91 120E5B20416E742076312E30205D00FF 60FE6100AA10F155224C235C65006A01 6B006D006E0023683F0013C645FD12D0 47CC227A41FB14D041FC156841FA15E0 41F9162C600237CC24C612266E00A7F2 FE1E602EF0557009617CAAE8D1046001 24C0600224C63E1F00FC7E013E20124E 60046104AAF8D01000EE4B0022E67BFF AA12F165A7F2FE1EF0557E01621F8E22 41FE12A441FF12AE7009627CAAE8FD1E D20400EE7007617CAB38D10400EE6100 4B0261084B0161104B006118AB18F11E 617C7001D1087008AAE8FD1ED10400EE 47CC73FCAD5CD340330073FC3300D340 430065001230AA10F165700240FE231A F055A8124101A910F01EF165AA12F155 62F082174F00131641FE132441FF1328 41FD132C13588B1000EE61016000AA10 F15500EE6B0C00EE6B0400EE6B0165FD 840074F96070ABDCD040600424C06360 AD5CD340600224C0600224C6600124C0 6070ABDCD04000EE6B0100EE6600682E 6C00AA68D68000EE6700242E23DE82C0 600CE0A124666003E0A12486806037CC 867481808894AA68F21ED01047CC00FC AA68FC1ED68000EE6700242E23DE82C0 600CE0A1246647CC67046003E0A12486 8060867481808894AA68F21ED010AA68 FC1ED68000EE6100D680600224C06002 24C67101310713C8601E24C600FD600A E09E140C4A0000EE4A0123FE6A0269FC AA0EF065580000EE6A0069FE00EE6002 24C0808070ECAA0EF05500EE4A021428 80602452980014248060700C24529800 142400EE6A0100EE6A0069FE00EE4A02 00EE600449FE60028900806024529800 69008060700C24529800690049046A00 00EE8056805680E4611F8012A7F2F01E F065810000EE60004C0060208C008060 7010245280854F0000EE6704463867CC 918014B200EE60404C4060608C004600 00EE806070FC245280854F0000EE67FC 918014A600EE8060245280874F0069FC 00EE8060700C245280874F0069FC00EE F018805E14C6F015F007300014C800EE 24E224F623983F0013C625104670153C 14D4600124C0AA68FC1ED68076FCD680 360014E200EE6309642565046018AB3C D0307014D0407014D0307014D04000EE 43096504432565FCAB3C601881308354 D010D0306040D010D030602C81408455 D010D0406054D010D04000EE7D0400FC A7F2FE1E602AF0557009617CAAE8FD1E D104600124C0600224C67E014E206E00 76FC3600153E122624E2257A258C2398 3F0013C64670153C156C6070610F62FE 6300AA14F355AB5CD01000EEAA14F365 8420420264FE42FE6402411125CC4121 25D482408430732043806300AB5CF41E 84108124850070FCD540AB5CF31E3500 D010AA14F355350000EE157A640442FC 64FE00EE64FC420464024402F41800EE 25F025FC23983F0013C6367015E2153C 6370640F6500AD7CD34000EE8030700C 245271F954102622803073FCAD7CF51E 7520D010AD7CF51E3000D340300000EE 15F0814074046002F01800EE24E2265C 6E00266827483F0013C6467017D62646 600324C616344D0016D04D0216F64D04 16A84D0616804D08172E174063686427 6500ABDCD34000EE6B006500AA54FE1E F0658D007E014E146E004D08171C00EE 6427825075204540650080307304ACDC F21E4048ABDCD040ACDCF51E4368ABDC D340336800EE16686427825075204540 6500803073FCAD1CF21E4068ABDCD040 AD1CF51E4348ABDCD340334800EE1668 AA18FB1EF265ABDCF51ED340ABDCF21E D0108300841085206001452024C07B03 3B1E00EE1668AA36FB1EF265ABDCF51E D340ABDCF21ED0108300841085206001 452024C07B033B1E00EE1668853075F0 AD5CD540600124C0600124C000EE8050 75FCAD5CD0403000D540300000EE1668 7501350600EE1668670027A4277282C0 600CE0A127BA6003E0A127C680608674 81808894AA68F21ED010AA68FC1ED680 00EE600AE09E17904A0000EE60024A01 24C06A0269FC381A00EE6A0069FE00EE 4A02179E482E179A00EE6A0100EE6A00 69FE00EE4A0200EE600449FE60028900 482E690049046A0000EE60004C006020 8C00670400EE60404C4060608C004600 00EE67FC00EE6001F075600224C024C6 600424C024C6600824C0601E24C600E0 00FD0000000000000000000000000000 00000000000000000000000000000000 00002A04260422041E041A0416082EFE 16081A041E04220426042A102AFD2203 22FF220826102EFE26042A042AFF2A06 2AFF2A06260A26062EFE260422041E03 1EFD1A0416081AFF32FE2A062A1C2604 26FC1E042EFE1A0516042EFE260826FF 26FF1A04160816FD2E0E16082EFE1604 2EFE16032EFE160416FD2EFE26082E06 2A04260422041E041A04160432FF32FF 32FF32FF2E081E04220426042A0432FE 2E042EFD2A0416032A1C260426FB32FE 2A04260422041E041A0416041AFF22FF 2AFF26041E0432FE160332FE1E0332FE 160316FD32FE1E0332FE16032EFF2EFF 2EFF2E082A0416062E042A0426042204 1E041A04160816FA2E042EFD22031E04 2E02260216031A02260526FF2E061A03 1E032206260426FD160632FE32FF2E06 1A0316031E02220226061A041E061EFD 32FE2604160322031A051AFF160316FD 2E061E021A02160432FE1E041EFD2E08 2EFF2A0616041A0116011A0116011A01 16011A0116011A0116011A0116011A01 16011A0116011A0116011A0116011A01 16011A0116041A041AFD160432FE32FF 2E052A02260322021E031A0216031A02 1EFF2E062202160816FD2E0616032E06 16032E0616032E06160316FF16022E06 16031EFE1A051E04220326022A012E05 2EFF2A042E042EFF22042E052AFF2E06 2EFF2E052EFF2E052EFF2A0432FE2E03 2EFD2EFF1A041EFE1A042E222EF90000 FE00000000000000682720641D406015 605C0F805811A0540FC05015E04C1D40 4827204827004827204C1D405015E054 0FC05811A05C0F80601560641D406827 20682700000A08060408020A08000608 0A00020804020A080011000A780EDDDB BFFFFFEE7AE0A550A550000000000000 00000000000000000011000A780EDDDB BFFFFFEE39F052A852A8000000000000 000000000000000088005000701EDBBB FFFD77FF075E0AA50AA5000000000000 000000000000000088005000701EDBBB FFFD77FF0F9C154A154A000000000000 0000000000000000F000F050E0B0E0B0 F02080F0F09090F0008000C000E000F0 FFF8FFFCFFFEFFFFFFFEFFFCFFF800F0 00E000C000800000F080B0A0B0A08080 F00010A030A00000F00020A0A0A00000 F010D0B0B0D01010203070F000000000 00000000001F0021003100C1032D7C8D 8201FFFF7FFF00000000000019C02620 40108008810840882044204240428082 8002400C207010800F000000000001E0 02101C10200840088388844488024002 400280028004430824901860000000F0 01080E04300240014101420242042204 11021081100108020464039806180924 10C220014001400240024011222111C1 10021004083808400780000001F00208 02887608F20859F0544053C070600050 004800A401200A100408001000000000 03E0041005100C1004103BE078802FC0 28A028903B90028002E0062001F00208 02887608F20859F2544453F870400040 004000A001100A080404000804000A00 112020A049202240158019804240FC20 501FA811141008100030000000000400 020279058508851087E0A51085087904 120204041F8018801F80080010002020 10500880050002000200020E1FCA222A 4F9A104F106E114010400F80001001F8 011801F820204048209E10A108A507E1 08A110A1A09E40400020000014000E20 14502D8855242482024401A801900240 8438F80008000800080018000F801040 1140106E104F0F9A022A07CA0A0E1200 1200050008801050202010000F801040 1140106E104F0F9A022A07CA060E0600 03000200020006000A00070001F00208 02887608F20859F0544053E070500048 004800A001100A080404000801F00208 02887608F20859F0544053E070600060 00C0004000400060005000E03C006B00 D540AAA8D555AAA8D5406B003C000000 000000000000000000000000000007C0 1830200840044C649EF296B28C628002 8002438444442008183007C0000007C0 1830200840C441E481A28CC29E029A1A 8C22404440842088183007C0000007C0 1830200846044F048D12862280228622 8F124D0446042008183007C0000007C0 1830208840844C449A229E1A8C028182 834243C441842008183007C0000007C0 1830200844444384800280028C629AD2 9EF24C6440042008183007C0000007C0 183022084204446488B2B0F280628302 8582478443042008183007C0000007C0 1830200840C4416491E288C2880288C2 916241E440C42008183007C0000007C0 1830200843044784858283028062B0F2 88B2446442042208183007C0 #7:BLINKY EDEBERG '91 121A322E303020432E20456765626572 672031382F382D27393100FF80038113 A8E2F1556005A8E6F055877386632786 00E027A86E4087E26E2787E168346918 6A706B006C046D342762A928DAB8DCD8 23E23E00127EA8E6F0658500C4FF8452 2508C4FF845226306001E0A127F036F7 12508E6028946E64289427F0122CF007 4000132280808006800681A081068106 8015400012A0400112A040FF12A012D2 80908006800681B08106810680154000 12BC400112BC40FF12BC12D2A928DAB8 6A706B00DAB86EF387E26E0487E16E32 289480808006800681C0810681068015 400012EE400112EE40FF12EE12568090 8006800681D08106810680154000130A 4001130A40FF130A1256A928DCD86C04 6D34DCD86ECF87E26E2087E16E192894 1256603F28C22762A928DAB8DCD86E40 87E3807080E2300012348E60289428A4 00E066246714A8E4280066246720A8E2 2800640065106601670FAB80D460ABA0 D560600328C23E0013D8AB80D460ABA0 D560740475043460135AAB80D460ABA0 D560600328C23E0013D8AB80D460ABA0 D5607604362D137AAB80D460ABA0D560 600328C23E0013D8AB80D460ABA0D560 74FC75FC34001398AB80D460ABA0D560 600328C23E0013D8AB80D460ABA0D560 76FC360113B8135AABA0D560ABC0D560 121A83706E0383E2848085906E06EEA1 14446E03EEA1145C6E08EEA114746E07 EEA1148C43037504430075FC43027404 430174FC8040815027D082006E0880E2 300014A46E07802082E2420514AC4206 14C4420714FE27626EFC87E287318840 8950176280408150710427D082006E08 80E23000140463037504142080408150 71FC27D082006E0880E2300014046300 75FC142080408150700427D082006E08 80E23000140463027404142080408150 70FC27D082006E0880E2300014046301 74FC14202762D8988EF000EE6EF080E2 8031F055A930D45876016105F0074000 F11814366EF080E28031F055A938D458 760480A081B027D06EF080E2300014E4 6E0C87E380C081D027D06EF080E23000 14F66E3087E360FFF018F01514364301 6474430264001436827083706E0C82E2 80A081B027D0A9286EF080E230001536 DAB8420C7B0442007BFC42087A044204 7AFCDAB800EE6E80F107310015E63400 15E68100830E3F001568839083B54F00 159E3300158687E3838083A54F0015CE 330015B687E315E6838083A54F0015CE 330015B687E3839083B54F00159E3300 158687E315E663408132410015E6DAB8 7B04DAB86EF387E2620C872100EE6310 8132410015E6DAB87BFCDAB86EF387E2 6200872100EE63208132410015E6DAB8 7A04DAB86EF387E26208872100EE6380 8132410015E6DAB87AFCDAB86EF387E2 6204872100EEC1F08012300015F66E0C 87E382E31520DAB8800E4F0016046204 7AFC1626800E4F001610620C7B041626 800E4F00161C62087A041626800E4F00 15EE62007BFCDAB86EF387E2872100EE 827083706E3082E280C081D027D0A928 6EF080E23000165EDCD842307D044200 7DFC42207C0442107CFCDCD800EE6E80 F10731001716340017168100830E4F00 1690839083D54F0016C8330016AE87E3 838083C54F0016FC330016E287E31716 838083C54F0016FC330016E287E38390 83D54F0016C8330016AE87E317166340 813241001716DCD87D04DCD887E36ECF 87E26230872100EE6310813241001716 DCD87DFCDCD887E36ECF87E262008721 00EE6320813241001716DCD87C04DCD8 87E36ECF87E26220872100EE63808132 41001716DCD87CFCDCD887E36ECF87E2 6210872100EEC1F080123000172887E3 6E3087E382E31648DCD8800E4F001736 62907CFC1758800E4F00174262307D04 1758800E4F00174E62A07C041758800E 4F00171E62007DFCDCD86E4F87E28721 00EE80706E0380E2800E818081946E04 81E241007001800E800E800EA8E8F01E D8988EF000EE6E00A980FE1EFE1EFE1E FE1EF365ABE0FE1EFE1EFE1EFE1EF355 7E013E80178800EE822383336E0F8020 813027D480E2800E800EA940F01ED234 7204328017AE82237304434000EE17AE 700471048006800681068106810E810E 810E810EABE0F11EF11EF01EF06500EE A8E6F0658006F0556001E0A117FA00EE F1656E01844382008310651083554F00 82E54F001826652782554F0018268020 813084E4180AF430D67A760C84438200 831065E883554F0082E54F00184E6503 82554F00184E8020813084E41832F430 D67A760C844382008310656483554F00 82E54F00186E8020813084E4185AF430 D67A760C844382008310650A83554F00 1888813084E4187AF430D67A760CF130 D67A00EEA8E2F16581E43F007001A8E2 F15500EEA8E2F3658E008E254F0000EE 3E0018BC8E108E354F0000EEA8E4F155 00EE8EE3620F63FF6110E2A118DE8134 310018CA61108034300018CA00EE6E01 00EE00000000050000226363777F3E1C 001C1E5D5D6F3E1C003C7E0F070F7E3C 001C267F7F7B061C001E3F7870783F1E 001C327F7F6F301C001C3E7F77636322 001C3E6F5D5D1E1C001C3E49777F637F 00000000080000000000000008080000 00000000000000000000000000000000 00000000800000008080000000000000 F0000000000000008080808000000000 F080808080808080F000000080000000 0C08080808080808080808080808080D 0C08080808080808080808080808080D 0A6505050505E50505E505050505C50A 0A6505050505E50505E505050505C50A 0A050C08080F050C0D050808080D050E 0F050C08080F050C0D050808080D050A 0A050A650605950A0A350505C50A3505 05950A650505950A0A350506C50A050A 0A050F0508080808080C080F05080808 08080F0508080C080808080F050F050A 0A7505B505050505C50A6505B505E505 05E505B505C50A6505050505B505D50A 0A050C080808080D050F050C080F0508 0F0508080D050F050C080808080D050A 0F050F650505C50A35E5950A6505B005 05B505C50A35E5950A650505C50F050F 077405D5080F050E0F05080F050C0808 08080D05080F05080F05080F7505D407 0A050A350505F50505B50505D508080D 0C080F750505B50505F50505950A050A 0A050808080D050C0808080D3505C50A 0A6505950C0808080D050C08080F050A 0A750506C50A050808080808080F0508 0F050808080808080F050A650605D50A 0A050C0D050A3505050505E50505F505 05F50505E505050505950A050C0D050A 0A05080F0508080808080F050C0D0508 0F050C0D0508080808080F05080F050A 0A350505B5050505050505950A0A3505 05950A0A35050505050505B50505950A 0808080808080808080808080F080808 08080F0808080808080808080808080F 01E0021004C809E40BF40BB409E504C9 021301E70007018303F001FF00FF003F 0F00108026404F205FA05DA04F202640 9080CF00C00083001F80FF00FE00F800 0F001F803FC07FE07FE05FE047E020C0 9080CF00C08083C01F80FF00FE00F800 #8:TETRIS DACHILLE '91 A2B423E622B67001D0113025120671FF D011601AD01160253100120EC4704470 121CC303601E6103225CF515D0143F01 123CD01471FFD0142340121CE7A12272 E8A12284E9A12296E29E12506600F615 F6073600123CD0147101122AA2C4F41E 660043016604430266084303660CF61E 00EED01470FF23343F0100EED0147001 233400EED014700123343F0100EED014 70FF233400EED014730143046300225C 23343F0100EED01473FF43FF6303225C 233400EE8000670568066904611F6510 620700EE40E0000040C0400000E04000 406040004040600020E00000C0404000 00E080004040C00000E0200060404000 80E0000040C08000C060000040C08000 C060000080C040000060C00080C04000 0060C000C0C00000C0C00000C0C00000 C0C000004040404000F0000040404040 00F00000D014663576FF3600133800EE A2B48C103C1E7C013C1E7C013C1E7C01 235E4B0A237291C000EE71011350601B 6B00D0113F007B01D011700130251362 00EE601BD0117001302513748E108DE0 7EFF601B6B00D0E13F001390D0E11394 D0D17B017001302513864B0013A67DFF 7EFF3D01138223C03F0123C07A0123C0 80A06D0780D2400475FE4502650400EE A700F255A804FA33F265F0296D326E00 DDE57D05F129DDE57D05F229DDE5A700 F265A2B400EE6A00601900EE3723 #9:H. PIPER RAINES '91 121676322E30205261696E6573202863 29203139393100FFF3858E2043011226 6E4E60006100A86EF1556CFF60006100 6200F27500E0600B61006200A8ACF21E F15572023278123C60006200A864F21E F15572023206124CA872602661396300 F31ED0156305700830461260A8866068 6102D01570086205F21ED015A8906068 612AD01570086205F21ED01581E08156 60648015A81EF033F265635A6439F129 D3457305F229D34580E0A7BCF055A7CE 60006100D0127008306012B46402A7A4 6000D04CA7B06008D04C740C343E12BE 6700807027207701370512D261326010 A7DED0167008306012E261006060A7A2 D0127102313812F06D342412241E242C 6102A8166010D0187008306013067108 313213044CFF132A4B0063064B036304 4B0663024B0563001338C3077301CC30 7C108C34C303835EA85CF31EF1658B00 8210892080C0267226CC6A02243E6700 6800275E278060FFF0156007E0A123AA 6008E0A123C46003E0A123DE6006E0A1 23F86001E0A1238C6004E0A12396600F E0A16E02F0074000244E135A600F2720 80D0267200EE271C80D0267200EE80D0 610F801281D0810500EE2412242C239E 70FF40FF60008D108D042412242C6090 243600EE2412242C239E7001400A6009 8D108D042412242C6090243600EE241E 242C239E71F041F061008D108D04241E 242C6090243600EE241E242C239E7110 416061508D108D04241E242C60902436 00EE239E7060262AA846D01400EE239E 8010700A262AA83ED01800EE80D0262A A836D01800EE70FF3000143600EEA854 FA1EF06526BC606C611CD01800EE243E 7A01809061F08012400014644A041492 4A05152282A03B00146E620882A580B0 80568056300014C03B0072FF80C0262A 8124A84AD0114F0015043A0115046900 153E8B9360078B0280C0262A391614A4 A84C7104391D14ACA84E7102391514B4 A8507104391E14BCA8527102D0121522 3B0514D06380420814DC8356720114C6 6301420814DC835E720114D281308030 A81EF155A81E80C0262A7103390314F6 4A0414F83A05D0124F0015043A011504 6900153E3A081522275E600077013764 15167801670070013003150C275E6A00 26E480E081808174410070B0F015243E 00EE600BE09E1534E0A1153800EE6003 F018253200E062006300A8ACF21EF165 720283143278154A433C7801A86EF165 80746364803584F03400710134017064 8184A86EF155850063286428A86AF133 F265F030D34A730BF130D34A730BF230 D34AA86AF533F265730BF130D34A730B F230D34A275EA7BCF0658E004E027E04 7EFC380015C280566164810587154F00 15CC25F630001234630115E0A89A602A 6118D01570086205F21ED01525F66300 A86EF16582E0F375600BE0A115EA6000 E0A115F000FDA7CE63026408D348A7E6 630AD348A8A4630E6410D34760252436 600BE0A116286000E0A11628D3477402 44381606D347160C00EE81006FF081F2 81566F0F80F2805E805E805E70107102 00EE70F071FE805680568056815E8014 00EEA8AC81006F0F81F2815EF11E6FF0 80F280568100815681568014805EF01E 00EE83002652F1656500300B65FF4100 16886103F11816A426BC8030262AD018 8030265261008020F155802026BC8030 262AD018275E875437FF16B8480016B6 78FF676316B86700275E00EE610F8012 805E805E805EA7BEF01E00EE80C02652 F165400B153E890080C0265280906101 F15500EE63004B0663014B0363104B00 63F04B0563FF81C081346FF081F241F0 153E4160153E81C081346F0F81F2410F 153E410A153E8C3426CC00EE81A0172A C1078056805640008156A854F11EF065 850064036300A864F31EF065820026BC 6004D048A864F31E8050F05526BC6004 D048740C852073013305173600EE6369 6409A86AF833F265F229D3457306A86A F733F265F129D3457306F229D34500EE 80E070FE8056805661148105A86AF133 F265F13063686432D34A730BF230D34A 00EEF8F8C0C0C0C0C0C0C0C0C0C0C0FF 0303030303030303030303FF00000000 000000000000C3C3C3C3C3C3C3C3FFFF 00000000FFFFC3C300000000C3C3FFFF FFFFFFFFFFFFFFFF0F07030383C3FFFF F0E0C0C0C1C3FFFFC0C0C0C0FFFFFFFF 03030303FFFFC3C3C3C3C3C3FFFFFFFF C3C3C3C3C3C3007E424242427E000000 000000000000C3C1C0C0E0F0FFFFC383 0303070FFFFF0000183C3C1800000010 1070701010000018187E180008040408 102020101D15161E0102030306070508 0009030A000000000000000000000000 0000A3A2E3A2AABB9293123ABBA2B322 3A8888884048D992D252D93BAAB3AA2B 9A929A91D9B4A4B42436EAAAAEA4E4EE 8ACE89E9202070F8F8F870000B000B00 0B000B000B000B000B000B000B000B00 0B000B000B000B000B000B000B000B00 0B000B000B000B000B000B000B000B00 0B000B000B000B000B000B000B000B00 0B000B000B000B000B000B000B000B00 0B000B000B000B000B000B000B000B00 0B000B000B000B000B000B000B000B00 0B000B00 #10:JOUST CATTO '93 120E204A6F7573742076322E330000FF 28F06000AA5AF055680069036C006D0F 229E00E06A027C016D078DC54F00124E 4C0468018BC07B0127486E1B6D098DC5 4F001254FC306D3CDDEA2750126A6B08 68021238AAB0FC33F2656D37F130DDEA 6D41F230DDEA2750126A6D078DC24D07 1950284C277025F83B0025F06D0F229E 22A846DD16B04A00121E22FA380024BC 6D054800229E6D034801229E1280FD15 FD073D0012A000EEAA82F56524A06200 6D0AEDA1249C6D03EDA124906D0CEDA1 249622CE46DD00EE3F00251600EE2782 27EC8D008E1080248134AA62F51E657F 8052854086008710DDE8AA62F41ED018 413866DDAA82F55500EE4A0113164A02 130E4A0313AE4A0413B44A0513BA2316 4A02236800EEAA88F565CD034D0024A4 232A237A3F0014E800EE8D608D054F00 8DF76E108ED54F0000EE8D708D154F00 8DF76E0C8ED54F0000EE8D608D054F00 24903F0024968D708D153F0024A04F00 249C9170249C00EEAA8EF565CD014D00 24A423823F0014F000EE238AAA88F555 00EE238AAA8EF55500EE278227EC4134 249C8D008E1080248134AA72F51E657F 80528540DDE8AA72F41ED01800EE2316 23BA00EE240E23BA00EEAA94F4654402 13CE62002440247CAA94F45500EE7201 420813DAAA94F45500EEAAC2D0144A04 13EA4A0314006A0000EEAA9AF465AA94 F4554B006A054B0000EE25F86A0300EE 4B006A014B0000EE25F06A0200EEAA9A F4654402142262002440247CAA9AF455 00EE72014208142EAA9AF45500EEAAC2 D0144B00143C25F86A0300EE6A0500EE 41181450410C146641241466630100EE 27AC330000EE6D01FD1863FD440062FE 4401620200EE27BE330000EE6D01FD18 63FD440062FE4401620200EE8D008E10 80248134AAC2DDE4D0144138640200EE 640862FC00EE6400620400EE63FE00EE 630200EECD01FD184D0024904D012496 CD014D0024A04D01249C00EECD033D00 00EEAAC0F1656D3BAABAD0D580144008 24DC407024E2AAC0F15500EE60106108 00EE606861F800EE24F84F00159200EE 24F84F0015CE00EE8D608D054F008DF7 6E088DE53F0000EE8D708D154F008DF7 6E088DE500EE4A0215644A0115924A04 15284A05153A1552AA94F46525764F00 154625844F001546153A272027022702 AA94F46513DA272027022702AA9AF465 142EAA88F56525764F00153A25844F00 153A1592AA88F56525764F0015CE2584 4F0015CE15928D608D054F008DF76E08 8ED500EE8D708D154F008DF76E088ED5 00EEAA88F565971016628D708D153F00 15EC270CAA72F51ED0184A0315BA4A02 15C04A016A05264000EE6A04264800EE 2640AA8EF565AA88F5556A0300EEAA8E F565971016788D708D153F0015EC270C AA72F51ED0186A03264000EE66DD00EE 2600AA8EF55500EE2600AA88F55500EE 261A7BFF249CCD013D0124903D002496 AA72F41ED018854000EECD034D00163A 4D0116344D02162E6078613400EE6040 612000EE6040610800EE6008611400EE 2650AA94F45500EE2650AA9AF45500EE 71086D378D154F006137C401AAC2D014 00EE268E3F0016702496237A237A16A4 2490237A237A1698268E3F0016862496 2382238216A424902382238216986D03 FD188D608D0500EEAA82F565249622CE 22CE00EEAA82F565249022CE22CE00EE 270C270227166D0A229E79FF490016DA 4A017B014A037B014A027B026A024B00 121E6A024B016A01126A26E400E0272A 290C12126D0CFD186D18229E270C270C 271627166D20229E271627166D20229E 00EE6D02FD186D05229E00EE6D04FD18 6D0A229E00EE6D08FD186D14229E00EE AA5AF0657001F05500EEAA5AF065F033 F2656E1B6D31F030DDEA7D0AF130DDEA 7D0AF230DDEA00EE63006400657C663E AA5ED343D363D543D5637304740275FC 76FE6D04229E434000EE438000EE1752 6400650060706114AA62D018AA82F555 00EE410017D0413417D86D0253D0179E 411417AC410817BE412017BE00EE4120 17AC411417BE412C17BE00EE6D108D07 4F0017E86D688D054F0017E800EE6D29 8D074F0000EE6D508D074F0017E800EE 6DFE93D024A000EE6D0253D000EE4800 17E8380017AC00EE630000EE420000EE 6D0452D018004068180A4028181C00EE 4010180A4050181C00EE6D118D174F00 00EE6D218D174F00184800EE6D1C8D15 4F0018366D058D174F0000EE6D158D17 4F00184800EE6D1D8D174F0000EE6D2D 8D174F00184800EE620000EE00E06D00 6E3CAAACDDE46D08DDE4AAA86D104800 28A8380028B2AAA86E1C6D78DDE46D00 DDE46D386E10DDE46D40DDE46E28DDE4 6D38DDE4AAA06D48DDE46E10DDE46D08 6E1CDDE4AAA46D70DDE46E286D30DDE4 6E10DDE428D200EEDDE47D083D8018A8 00EE6D70DDE46D78DDE46D10AAB46E3B DDE57D083D7018C0606861F8AAC0F155 00EE490100EE6D016E3DAA5EDDE37D04 3902DDE37D04660386954F00DDE300EE AAC66D246E18DDE06020F01E7D10DDE0 F01E7D10DDE0F01E7D10DDE068006B01 6A0025F827702496AA82F5556D0A229E AA82F565294022D2AA82F555AA88F565 29402392AA88F5556D0AED9E191C00EE CD0F4D0024A441026302413663FE00EE 284C2770AAC26E0C6D32DDE47D0CDDE4 7D0CDDE46E246D32DDE47D0CDDE47D0C DDE46E186D0ADDE46E38DDE46D72DDE4 660067007701476A121E6D01FD186D03 229EAA82F56524A062006D0AEDA1249C 6D03EDA124906D0CEDA12496278227EC 8D008E1080248134AA62F51E657F8052 8540DDE8AA62F41ED01841381A38AA82 F5553F0029DC46091A4819846E3491E0 19F66E1491E01A046E0891E01A0C6E20 91E01A0C00EE6D7090D01A206D0890D0 1A2000EE6D0890D01A2000EE6D3090D0 1A207D0C90D01A207D0C90D01A2000EE 7D027E04AAC2DDE4270227027601AA5A F0657001F05500EE6D08FD186D14229E 79FF490016DA121EAA5AF0657008F055 79012716270C2716121E0000000040E0 4000666F4CFF6CDCEC7866F632FF363B 371E6E6F4CFF6CBE9E7C76F632FF367D 793E0000000000000000000000000000 00000000000000000000000000000000 FFBAE880FF6D1B02FFEEBBB6FFFFFFFF 00000000061C284CFE0066243C6E0000 000060B0F06000C000C000C000C000C0 00C000C300C700CC00CCC0CCC0CCC0CC C0CC7F873F0300000000000000000000 0000F0C0F8C00CC00CC00CC00CC00CC0 0CC0F87FF03F00000000000000000000 0000C3FCC7FCCC00CC00C7F0C3F8C00C C00CCFF8CFF000000000300030003000 3000FC00FC0030003000300030003300 33001E000C00 #11:LOOPZ DAUMANN '93 HAP '06 1F9E28632920412E4461756D616E6E00 E000FFF28531AA00FD32AA00FDADD6F0 55231323696000ADB5F055276BADB960 02F05527C96000ADCDF055ADCEF055AD CFF055ADD0F055ADD1F055ADD2F055AD D3F055ADD4F055ADD5F05527E7280F68 086903240723C96007E0A124556008E0 A12449600CE0A1246F600DE0A1246360 06E0A1247D6005E0A1248D2799ADB5F0 653000126727D7ADB9F06530FF12A112 C160FF7001610FF1186128F115F10731 0012AD300212A3276B23C9240723C912 6723C928AF60FF7002610FF018610BF1 15F107310012D1300B12C7ADD0F56566 AA67AAF775F00A60FF700100C1304012 E900FDAB44F51EF0658200AB58F61EF0 6583006106AB58F71EF065A8FFF01ED2 3600EE61FF7101A970F11EF065AA24F1 1EF05531B3131500EE61EB60FF700171 015050132D60FF7001711450601337AA 24F11EF065870000EE61EB60FF700171 015050134D60FF7001711450601357AA 24F11E8070F05500EE61FE67077102AA D8F11EF0658500AAD9F11EF0658600F1 7522F3F185316A136D00EE4A0613A94A 0713A94A0813A94A0913A94A0A13A94A 0B13A96D0087A013B16D0187A0600687 056EDC60FF7E247001507013B500EEAB 61FB1EF0658C0000EE23BF61FF63FF62 FF7301720171013D0013DFADED13E1AE C5FE1EFC1EF11EF06540FF13FD852085 84863086948700F37522F3F385320213 D3330213CF00EE6100C1FFAB65F11EF0 658A006B00238B3A0B00EE2429370100 EE6A006B00238B00EE6700620061FF71 01AA24F11EF0653006143D720131B314 2F327E00EE670100EE4811145323C978 0123C900EE4800146123C96001880523 C900EE4906146D23C9790123C900EE49 00147B23C96001890523C900EE23C94B 0314877B0114896B0023C900EE23BF61 FF640063FF62FF7301720171013D0014 A5ADED14A7AEC5FE1EFC1EF11EF06540 FF14C78520858486308694F3752329F3 85470614C76401320214993302149534 0014D94A0B152B14DF4A0B1531152B60 02F01823BF61FF640063FF62FF730172 0171013D0014FBADED14FDAEC5FE1EFC 1EF11EF06540FF151985208584863086 94F37587002349F385320214EF330214 EB2541240723C9276B00EE600AF01800 EE6002F01823C92681240723C9276B00 EE61FF60007101AC9AF11EF055AD18F1 1EF055317D15458580869075017601AC 9780508160F1552329AC8DF71EF065AC 65F01EF06582006000AC99F055320015 C100EEF3752329F385AC8DF71EF065AC 79F01EF16583008410523015AFAC8DF7 1EF0657001AC65F01EF065820015C152 4000EEAC8DF71EF065AC65F01EF06582 00AC99F065AC9AF01E8050F055AC99F0 65AD18F01E8060F055AC99F0657001F0 55600142018605420275014203760142 048505AC97F165505016015160160116 031583F3752329F385AC8DF71EF065AC 79F01EF165830084105230161F162352 4000EE2629283700EEAC99F065820060 01820561FF4A0B61006001F0187101AC 9AF11EF0658500AD18F11EF065860064 06F37523298040847087002349874022 F33A0B166B670228691679ADD6F065AD D7F01EF06587002869F3855120163900 EE61FF60007101AC9AF11EF055AD18F1 1EF055317D16856000AC99F055AD9660 00F0558580869075017601AC97805081 60F155F3752329F385AD96F0658100AC 8DF71EF0658014AC65F01EF065820032 001713174BF3752329F385AC8DF71EF0 65AC79F01EF1658300841052301701AC 8DF71EF0657001AC65F01EF065820017 135240174BAC8DF71EF065AC65F01EF0 658200AC99F0654000172FAC9AF01E80 50F055AC99F065AD18F01E8060F055AC 99F0657001F055600142018605420275 01420376014204850516D5AD96F06570 0140021759F05516A3262900EE6237AD 97F71EF065A935D02500EEADB5F06581 0060018105601EF055411D178B710187 10F175275DF185311D177DADD6F065AD E1F01EF065F01500EEF007300000EEAD B5F06561018015F0558700275DADD6F0 65ADE1F01EF065F01500EE6201ADB6F7 1EF065A93AD20400EE670027BB670127 BB670227BB00EEADB9F0658700610180 15F05527BB00EE61FF64377101ADC4F1 1EF0658200ADCDF11EF0658300ADBAF3 1EF065A93EF01ED245310217EB00EE61 FF64377101ADC7F11EF0658200ADD0F1 1EF0658300ADBAF31EF065A93EF01ED2 453105181300EE27E7610360018105AD CDF11EF0654009184F7001F055186560 00F0553100183B6000ADCDF055ADCEF0 55ADCFF05527E700EE280F6200720161 0660018105ADD0F11EF0654009188570 01F05518A76000F055310018716000AD D0F055ADD1F055ADD2F055ADD3F055AD D4F055ADD5F0555270186D280F00EE24 29370000EE6A0B63FF730162FF720185 207501863076012329470618F5ADEB80 20F055ADEC8030F055882089302681AD EBF0658200ADECF0658300F3752429F3 85370000EE321118BD330618B900EE7C FCC0C0CCCCF8FC0C0CCCCCCCCCC0C0FC 7CCCCC0C0CFCF8CCCCCCCCCCCCFCFC00 00FCFC000000000000A854A854A85430 78FCFC7830C0C0C0C0C060F0D06040A0 A0A04040C04040E0C0204080E0E02040 20E080A0E02020E080C020E06080C0A0 E0E020404040E0A040A0E0E0A06020C0 07070707070707070707070707070707 07070707070606060606060606060606 06060606060606070706060606060606 06060606060606060606060707060606 06060606060606060606060606060607 07060606060606060606060606060606 06060607070606060606060606060606 06060606060606070706060606060606 06060606060606060606060707060606 06060606060606060606060606060607 07070707070707070707070707070707 07070707070707070707070707070707 07070707070707070706060606060606 06060606060606060606060707060606 06060606060606060606060606060607 07060606060606060606060606060606 06060607070606060606060606060606 06060606060606070706060606060606 06060606060606060606060707060606 06060606060606060606060606060607 07060606060606060606060606060606 06060607070707070707070707070707 07070707070707070000000101000002 02000003030000040400000505000006 06000007070000080800010809000208 0A0003080B0004080C0005080D000608 0E0007080F0008081000090811000A08 12000B0813000C0813010D0813020E08 13030F08130410081305110813061208 13071308060C12181E242A30363C4248 4E545A60666C727800060C12181E242A 300009121B0000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 01010101010101010101010101010101 01010101010101010101010101010101 01010101010101010101010101010101 01010101010101010101010202020202 02020202020202020202020202020203 03030303030303030303030303030303 03030404040404040404040404040404 04040404040505050505050505050505 05050505050506060606060606060606 06060606060606070707070707070707 07070707080808080808080808080808 08090909090909090A0A0A0A0A0A0A0B 0B0B0B0B0B0203040301020104010304 02000000000000000004010201030403 02030102040000000000000000000204 06080A0C0E1012000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000000002426282A2C2E303234 36383A3C3E40424446484A4C4E505254 56585A5C5E00322D280000050A0F1419 1E23282D060A0E676B6F73777B000000 000000000000000306090C0F1215181B 1E161412100E0C0A0806040000FFFFFF FF02FFFFFFFFFFFFFFFF03FFFFFFFFFF FFFFFF01FFFFFFFFFFFFFFFF00FFFFFF FFFFFFFFFF04FFFFFFFFFFFFFFFF05FF FFFFFFFFFFFFFF04FFFFFFFFFFFFFFFF 05FFFFFFFFFF04FFFF0205FFFFFFFF04 FF0503FFFFFFFFFFFFFF0501FFFF04FF FFFFFFFF0005FF04FFFFFFFF00050104 FF04FF0005FF04FFFF020504FF040205 03FFFFFF0501FFFF04FF0503FFFFFFFF 050505FFFFFFFF04FFFF04FFFF04FFFF FFFF050505FFFFFFFF04FFFF04FFFF04 FFFFFFFF050501FFFF04FF0005FF04FF FF04FF04FFFF020505FFFFFFFF04FFFF 04FF0503FFFFFFFF00050504FFFFFF04 FFFF04FFFF0205FFFF04050503FFFFFF 0501FFFF04FFFF04FF04FFFF0201FFFF 04FFFFFFFFFF00050503FF04FFFF0201 FFFF04FFFFFFFFFF00050503FFFFFF04 FF0003FF04FF0501FFFF0205FFFFFFFF FF04FF0003FF04FF0501FFFF0205FFFF FF04FFFF020501FFFF04FF0005FF04FF 0503FF04FFFF020501FFFF04FF0005FF 04FF0503FFFFFF0400050304FFFF0501 FFFF04FFFF0205FFFF0400050304FFFF 0501FFFF04FFFF0205FFFFFFFF08FFFF FFFFFFFFFFFF08FFFFFFFFFFFFFFFF08 FFFFFFFFFFFFFFFF08FFFFFFFF0000FF 00E0600D611BF030D11A60002FC42FCE F10A2FC441051FE6410C2FDA410D2FE0 2FC41FAEF0306208631BD23A00EE6110 F115F10731001FD200EE3009700100EE 300070FF00EE00E06202F21882006012 610FA200F155802061AA62AAF2751200 #12:SOKOBAN HAP '06 00FF221B6E05222FECA11237EDA1127F 4A321204EBA1223F12048000E0A488FE 65A4644A0014582269F629D99500EEF1 073100122F00EE4A0112046E081216F7 156001F018AFC8FA1EF565A2F3F1654E 05125F81354F0070FF7AFF8530126581 4480F47A01F155226DA44CFA33A44CF2 65F129DD95F229D695A488FA5500EE22 1B6D006C006202F218614022D5876061 8022D584E081E0816422A74C00132D43 1812BB230F12996E0023014E01230123 0183E08323830E830E00EE22A7431812 CF22E57E04230F7EFF3E0012C51299A4 85F75512A322E57E058E0E8E0E86E086 17860600EE6E00230123012301230100 EE6D08A4B4FC1EF0658B009C506CFF7C 014D0012F17DFF8E0E8B0E8EF100EE43 1013193314131B78017901A494F31ED6 747604561000EE8645770400EEA485F7 656A00222F6B01A493F56598901417E1 A1143CE0A11440E3A11444E4A11448E5 A11429E29E13354C0013356B007CFFA4 ACD6747DFF4DFF6D38A44CFD1EF0658A 00F41581A2A493F11EF5654B0023F380 608170804481544B001393A43A24074E 011333A21A24074E0013C38200831082 4483544B0013E5A21A240F4E0113337A 80A4A4240788E5240F88E4A4B0D014FB 18D2344B0013EB3C397C0180A0A44CFD 1E7D014D396D00F055A4ACD674864487 54D67413338A0E4F0113B1A485F765A4 AC13DDA485F755864487548644875485 B784B7F55500EED0128EF0D01200EED2 328EF0D23200EEF3186032F015222F22 1B4A321202223F1281F118601EF01522 2FE59E13353A00127F1200206A021371 6A0413716A0113716A03137100C1D561 F11E75083558144E6528831533FE144C 6A011227FE7999E7C7DB0ECDF3366CDB 1CCDE3366CDB38CDB33667DB70CD9B37 C0DBE07981E6079EFE01800600000F07 02020009070A050800FC000400000000 F0F0F0F000402000F0D0B0F060F0F060 F09090F06E0088C290185341842A1560 E8528C1551144089808A444365285836 D121519143640180C5402260598C03B0 30155D8128505D81AAA0BB0048282EC0 8852282D288250A5288200C0508C005C 824520AC06460A95A2C1528560CB4A21 15288AB300294282BB600A140598023C 9E83C520E84C11909814010A5026052D AD0A213028580D109814B4694B150A30 1606A4560680200B0360340581A16B68 48C0D004016071708C82446108111822 354182301A458540598014A15566000A 5A28CC00B42922454282C15294182AA2 8C1D0060F120678902A3B022C8AEC0A8 0BB406D176044A2ECA89488946820215 288094282020A02045407881C4422602 A8922968A01604A1415015488D55282A 6C894A536C8802BB644B4476C882A444 5500BB0558421170402814A209528850 410A5040154A882A8B234A505014028D 404502805294890454181304604C1198 9823313046626091409C8344E0C86D98 144436CC09816330241436CC09450DB3 01548A4052DA2C062214A44C06940405 90A1402852265A522301604C1628BE15 08DC8AB034052D02D0A536CA16D40283 B6528096968ED954042803B6580A5294 76CA011215DB2A2085283B650512D295 76536442C09CA6C896D2DA3A24303472 009151C8030772011B00AE832AC19544 1822A0AD181A812050604A14B5458120 D580B0244A5A22B0140A20948A802168 811114B055C00A845763645581BB6730 86616111308C8E0C291122501444294A 5411102C94051511A52ABB6510294176 CA2B6D28BB6580A28BB68900A2ED9008 8C0558230160D1308E022B0550142240 AC0504015428D10436C289592A88E70A 08D04031852805111CE140505A531852 880835CE152850285DB08D22400A0882 01161540BD81C4E031380B01602964A3 016D1022A22B3128088166251111598A 02A80AA2A3550680850444296D04AA22 0528ADA2244603404602A8A808C0D80A 03038A030A5500BC022905404182A140 606A8D0154010A0B404010490A254010 6054551455AB0144ACC2880885DBFC54 888330A02080A91304B4106068301607 1201844440A988C15016088020AA0941 541042D281505641A00A0828528A2505 14C883568391502ECB90401DF6C825A3 30A084541060CAA09B022D0276040604 ED02604EC082A8113041418420820A08 4445055150A111105128504A0A494280 8112148980200C1A248E80C5E0886040 6088E0090402222EC8AA0A09B2B01552 8ED80A214500D85051488D5A94404414 401A5A220851104AA20C2D0422E082AC 1554BE0894250245582444A030440500 5580A510500602944222301528500460 2A528A88C05442822301511A808C0545 40448985055119814028050367446854 A04C0B034149818F80BE008B40623045 5060281419041227554154401441A6CA 250A0820E512830169B2882A2C05CA2A 0820D3651004AAA0E51A050A0F36500A 252883A2255401E6C80805A2B3020302 52240450AA8AC0981B02606AA028AA20 80A322802025B4A16A0208A504041142 9140B69504405026044404763220222E D92225076CC054088C0A22BE89405540 1008984480A821410142850A25282B4A 02489401429171510198D2A22824C482 220599288894660364110A555AAA544A 02A50282A580D28500548914888B0560 6C7C9E0089C210415603112B441401D8 41040401D84AD10AAA38180B41047602 A094011DA441A341047612B01A823B08 36B41057612A085682EC20820202B855 088808AA0AA04440BE8D803330655199 ADC8245E880AC0A8580D15154042882C 090141150A82282A2A51AA802A444288 20A91100A2882289410A14A022142B6D 0404410B0288892282083018D0BE5585 A11A04103666241044889B6416A01322 080B62411128C062520AD128112050A3 6D581AC09006B554551944011100B014 0444051602AA44AC48A2C1100408B804 447A227044108880A083B65442A0ED81 128DA6D8110A83B63220258B581D28A8 21688091205B64604C096051408E23A0 ED804010156610AA23459890A0802CC4 82088458A14A083016AD16A8A05004A0 08828A882D11296C0685044A01569122 26120B088900AC82C4609110181A9428 454A14A2E581DA0BB284485761510401 DB0A5010076C2C83451576D110A5A0BB 20285285DB200968510C80205282A804 48061111008E88C29016129422B01511 81C5040AD6404050605440A282A45454 14DBCC222A8A7DF6FB88A962C2D14281 42805050404040418F809E81C5E0880C 052220C06944408895445128A0229411 2849688B6D1145404500451015223514 603419811054528CC0A940A203B5C282 9441660224044B6CA011100888BD0558 5211580A8282030142A59280AA0D0A09 4A82A8551A580A8208816D0528050AA4 44A51A82080A0A82B4401066080A00AB 312AC09981560AED9610ED984C44A881 2AC06220802C06A0294145464A512822 A8A0541981A51066040A833005A28ED8 4A0244A94181202B0268AC0D060AAAA7 8D40541502814888A5A28144014B6891 101128A8208514A9500503648A6C5191 6614A8ACC08515765008C8A922B01660 01401CE428A0B302248A24C0820AC05A 2D15150A008D0A52A0888528A220A828 2200A28A21442820AD280A802111812A 80BE8C113010045660502D4090261501 1501260545150426044A580A22A8852A 830288882A88A2823405100528504510 1512940110110A28A24444B603683015 1454A0C09004401814488900BE844442 2211201040550A5288250145141440A5 80D0A22A5051602A0911223688B62248 B0144A0AD54A0A25040541504B4A205A 200C0501410089EC65581B32B0466560 9170AE8BC1198808B4C4020A02ECA940 2C0576C52880A02ED9B110041540101A 0D1042D2942A8208501AD16882A28802 820214A29120100A14181A80880C1223 244610A866812A91324460341102A951 6BB64412ED810471914404688D0A0088 44C550BE84C488CCC0A80B01598142D5 0A48B302C0AD2A13028514B444DB2851 4A084C0A91115174440A145030295504 888AA050181A0851A52AA0825B52808A A0802168C0E2402B088880BC008C4058 3280208DA50401A350524405144A2280 8146822008094044014A501440104142 880200A5A8912B40404660422839DB0B 04660018233000C122A0AE83C4612A02 C1D602C1942D060AA5A1460A9402882A 8081691208A0A00BA116D917244C5015 C913C34AACCE2011B0A309505852A88D 80C5206AB02890200A52812208A2D694 B1126242D150262410144989A14146CC 45A94501515A1488850A142880850A14 28811202250488806E8244E091104156 0280814010551B4514116048828AA0A9 5A14282ED8011410176C804822A2BB64 150A1422A28080C1A2A0AE2230A40614 891382302B24480128B4540401154A01 440122220D2240AA2D81285428228A2C 151DB244C150DB03015511DB23064544 60CC0D8345409B888AB0276C882A80ED 950A080CC0A50AA8B302814115DB0A52 888A008504414454889446850050A485 00A0A0252D28AA112054114015401500 B98B0030455122420A894A50A2C0DA02 AD0B505410512A80B502922008528A80 220504011404405088880C150198D501 98D80C546D82AAC0A2A0A00A16054890 0A280BB651B4A5AD5DB288048081B650 A8ADA06D94A1685166055B0389821138 22A8B808A803F77EE803BEFBE401FBEF BA00EFBEF9007EFBEE802A02B0240402 2444E0EA5294A515294A514694A52A08 164A0208444105501540AB81AAC21058 3A02C192D1606AD0A280AA0140454122 20880233051110293022214477D91150 5515101549282D580AA580B034140607 1500BE8146204BB00203015DB9402880 2EDF223450076F9112822AED90401110 518322494A2A088A25028088082B6808 888802050112220952230241A0202020 820A80B0141060480282AC0A24282321 382E242837354C3B333C433E33313947 4B37474645442C393F354341312C364B 46421F483F3539323C3A342E38384B #13:SPACEFIGHT2091 SOERENSEN '92 12245370616365466967687432303931 20627920536C616D6D65722F416E6172 6368792100FF00E02786222E1226AC40 6000F0556800A86FF81EF765AC57F81E F755780838C01236AC40600061036200 F255229EAC3FF0654000126070FFF055 283E261E2566247E2350AC48F4653000 12943100129432001294330012943400 129422EAAC40F0657020F05540C000EE 229E1254AC41F0653000125400EE26EA AC43603861006200F255AC4660006100 62016301640165016601670568006900 6A006B006C05FC55AC3F60FFF05500E0 26A6268C26BE266E265826C665001518 73013305137E6300137EAC3FF0658056 80568056F055277826A6268C26BE266E 60206119A9AF62086300D0187008F21E 73013308130A266428362836AC3FF065 400000EE2664266EAC3FF06570FFF055 AC42F0657001F0552664266E6001F018 283EAC3FF065300013242836283600EE AC50F265300013A472FFF255320000EE AC40F06562C082058256825682568256 82568020AC52F055C303C4018344AC48 F31EF065400012E0A86AF31EF0658300 AC46F165803470077119AC50F2556002 F018147424747104AC50F15524744140 144E413F144E413E144E413D144E412B 140E412A140E4129140E4128140E4127 140E4F0000EE82008310AC44F1654000 13FE502013FEAC42F0657001F0556001 F01825E6AC4460006100F155144E6A00 245E245A7A013A051400245E144E8200 8300825682568256AC40F065AC57F01E F21EF065400000EEF06570FF82006000 F055420014448020F0556210F21E6000 F055144E60F88032612CAC3AD0142474 AC5060006100F15500EE6901146269FF 1462268C6001F018AC41F0658094F055 268C183AAC50F165AAF6D01300EEAC4D F06570FFF055300000EE6005F0556500 2518249865011518AC4EF16540001504 400114CC400214F0600AF018AC47F065 300C7001F0557101AC4F8010F0553104 00EEAC4E60006100F15500EE600AF018 AC47F065300C7001F0557101AC4F8010 F055310400EEAC4E60026100F15500EE AC46F06570FCF055300000EEAC4E6003 F05500EEAC46F0657004F055302800EE AC4E6001F05500EEAC46F16587108600 77096800AC40F0658900AC48F81EF065 AA0FF91E3000D6703F00254676127801 3805152A00EE450000EED670AC48F81E 6000F055266EAC42F0657002F055266E 25E6AC441616AC44F165400000EE412C 157E412D157E412E157E312F00EE8200 8300825682568256AC40F065AC57F01E F21EF065400000EEF06570FF82006000 F055420015B48020F0556210F21E6000 F05515BE60F88032612CAC3AD01425E6 AC441616600AE09E00EEAC44F0653000 00EEAC43F0657007AC44612EF15525E6 6001F01800EEAC44F165AAF63000D013 00EE25E6AC44F16571FE410816164109 1616F15525E630004F0000EE65002518 6501251800EE60006100F15500EE25C4 25F26003E0A11644600CE0A1163000EE AC43F065407000EE26587001AC43F055 265800EEAC43F065400000EE265870FF AC43F055265800EEAC43F0656131AACF D01000EEAC3FF065633964221676AC42 F06563226403AC53F033F265F0292686 F1292686F229D345730500EEAC41F065 400000EE614D6201AAEFD127710870FF 3000169A00EE60656100AB1962086300 D0187008F21E7301330416B000EE6000 6100AAF916AC6100622C6300AC40F065 8400AC67F41EF31EF065AC3A3000D124 71087301331016D200EE275C2714272C 26F6276A00EE270E2836270E283A270E 283A270E2836270E2836270E18366003 F01800EE6020610CABF962086300D018 7008F21E73013308171E00EE60306120 A9EF62086300D0187008F21E73013304 1736AC40F06580568056805680568056 7001F030603B6129D01A00EE6100283E 00FC71013120175E00EE6100283E00FB 71013120176C00EE6100283E00C47101 3110177A00EEAC3E6064F05527D026A6 268C26BE266E27E8283E280027A6600A E09E179800EEAC3EF06570FFF0553000 00EE6064F05527D0AB39601061186220 6300D0107010F21E7301330617C200EE A92F6020611862206300D0107010F21E 7301330417DA00EEAC566000F0558200 64002828720180207401341017F200EE AC56F065820084002828A84A825EF21E C07FC13FF155AC39D011630F74018432 8040AC56F05500EEA84A805EF01EF165 AC39D01100EE600C1840600618406001 F015F0073000184200EE0A115B225B29 753854110C09341378342604061A0C22 200A001606053F07001E001224364800 00000000000000000000000000000000 00000000000000000000000000000000 00000000000101010100000000000000 00000000000101010100000000000000 00000202020000000001010100000000 00000101010000000001010100000000 05050000000500000500000005050000 0101000000010000010000000101000A 0A00000A0A000000000A0A00000A0A01 01000001010000000001010000010114 14141414141414141414141414141401 0101010101010101010101010101013C 007C00E000C000CC71CCFBCDDBCD9BCD 9BFDFB7CFB000000000000FFFFFFFF00 00000000000000F0E0F9F07D986DF86D 806DF86CF8000000000000FFFFFFFF38 007C00EC00CC00CD99CD9BCD9BCD9BCD 9BFCF37861000000000000FFFFFFFF00 07000700060006C1CCE3CC3708F60806 00F618F618000000000000FFFFFFFFFD FD113131313131A1B3BFBFB3B3B3B31C 3C706078607C3C0E1F1B191F191F1F0E 1FBBB333B3BF1E66767E6E66666666CC CCCDCDCCEC7D3D70F383E0F033F3E0C0 C1C3C3C3E37B39ECEC8C0CCC0FE7E3C7 CFDCD8DED89F0F6060606060703C1C00 0097D2038001000FE03FF85554ABBAFF 6EBABA55543FF84FE400008002000003 C0066004A003C004200B301458142810 5812A80D5016A823C47FFE400200004A AA15504AAAD553E4277FFE399C0C3006 6007E033CC2BD407E003C00180000003 C0056006A003C01BD82D745EBAA565C6 A3C7E3CDB3DA5B542A18181818300C30 0C4812A42584214C32324C02401FF820 AC285420AC1FF87FFE9249924992493F FC40025AFA500A43EA524A47CA500A5F FA40023FFC0FF0381C5436AC2BF81F01 00010001000100010003800380038007 C0C6C67D7C3FF87FFCC3860100000010 1010287CD6FE8080803879C3F37B1BFB F1E3E78E0C0C0CEFE78EDFDBD9DFDFDB 990E1EB8B0BC30BE9EC3C3C3C3C3E37B 3B66666666667E3C183879E3C3F1C0FB 7BE0E000C0E060E0C03C007C00E000C0 00F1E079F11DBB0D9B0D9BFDFBF9F101 8001800180FC3FFFFF00000000000000 00E1CEF3DFB719361F3618F7DFF3CF00 0000000000FFFFFFFF0F001F00380030 003EC73ECFB01DB0D930D9B0DFB0CF00 01000F000FFFE0FFFF30603060306030 603C78BE78B760B360B370B33CB31C80 00800000007FFFFFFF3C3C7E7EE6E6C6 C60EC61CC638C670C6E0C6FEFEFE7C00 0000000000FFFFFFFF3CC77EC7E6C6C6 C6C6CCFECC7EC806C806C0FED8FCD800 0000000000FFFFFFFF3C7CE1C1CDCDFD 7C77F7C081E181F1F1E0E08080808080 80F0F8DDCDFDF9DDCC71F3C786E786F6 F6C7EF6D6CEC6C6F6F1999D9DFCFC6C6 86989898981800181880FFAA55FF0000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000 #14:RUSH HOUR HAP '06 2D469010151D1ED05B6279206861705D 9A00880084358800886A802784358027 886A841922EA127A22BC234612382316 22BC127A22EA23463BFF127A66006507 26633E0A169B00E0686E2DBCA7EBF265 41051274A802F11EF0654003127472F6 502012747001A802F11EF0552DBC2D46 50102EDE155122EA2316A7FEDBC5A7F0 F665E5A113DCE2A17001E1A17002E3A1 7004E6A17008400012B8FA073A00127E F415E4A16502A7FEDBC585F1A40BF01E F065A2B7F0551230F015127E4B2300EE 4C0100EE350312E624859A9000EE80A0 70FFA816DB01DB014F0100EE89B02763 7AFB276324297CFB00EE4B2300EE4C1A 00EE3503131224859A9000EE7905A816 DB91DB914F0100EE89B027637A052763 24297C0500EE4B0500EE3503133C24C9 996000EE809070FFA817D0C3D0C34F01 00EE8AC0276379F3276324297BFB00EE 4C0B134E00EE4B1E13404B2300EE3503 137224C9996000EE7605A817D6C3D6C3 4F0100EE8AC0276379FD276324294623 13767B0500EE7B0586B08B907BF3A816 DBC1DBC14F001392A812DBC5DBC54F01 13B04B05139A7BFB137E8B802D546809 37006816470168102DBC6A0B88B066FF 63008B60620BF218F21579F827637301 23D4330B13B800EE6001F018682C2DBC 6021F015F007300013D400EEE5A113DC A7FEDBC52D54681D2DBCF90A681D2DBC 390A13F823C8169D2DBCF90A68252DBC 390A140823C815592D54127A30362824 303428782E3628762E3428000000363B 142C31080000002C31A41CF465F5187D 01A41BFD3341091445F129D3457101F1 29D34500EEF029D245F129D345A41CF1 65F029D245F129D3454D64145F00EEA4 25F3656D00770147646700A424F733F0 29D245F129D345A425F165F029D245F1 29D34500EE68018AC089C0A812DB95DB 954F0114A57905DB95DB954F0114A579 05780200EEA816DBA1DBA14F0114BF7A FBDBA1DBA14F0114BF7AFB780200EE80 9080A5400A780200EE68004C0B780489 B086B0A81AD6C3D6C34F0114ED7605D6 C3D6C34F0114ED7605780200EEA817D9 C3D9C34F01150779FBD9C3D9C34F0115 0779FB780200EE80608095400A780200 EE2D54F91868362DBC602D23D200E0A8 95FA65F315A896F21EF165A874F01E23 D4D4A7F11ED9A7FA18740879F8720232 081523600A23D2684D2DBC2D4650101F 2C23D068612DBCF00A00E0600F23D2A8 91F165A70BF155A7F6F565A828D54675 083540156DD40DD41C74083428157572 066108A7994220A795D215A802F31E73 01F065A7FB3000D214422015BB6107A8 02F31EF0657106411F157FA794D21640 0015A5A7FAD21570FF15A5683C2DBCA8 88FE65670A2635A78ED7B123D4F90AD7 B149011511490A167F6006F015263D66 00490515FF4908160D4909161D390715 C5470A15C57CFF77FA66FF6574162F4B 0A15C57DFF7BFA66FF65BA16314B1C15 C5472215C57D017B0665461631472215 C5371C16293B0A15C57C017706658C26 63266315C580C081D0A7ECF155A41EF5 654E001655A55AD05175FE80E0400A60 0FF029D155A7ECF165F129D455F029D3 5500EEA70BF165826081544F01167546 FF70FF167946007001A70BF15500EE4F 0116972D54F91868302DBC602D23D268 302DBC2D5415C72D5423C87E0100E02D 5468002DBC263D88E078FF800E880488 52888EA20CF765A214F81EF365851087 30A20CF755A7DFFC65A41CF155A425F1 55A8572751620FA8682751FC29D35573 05334016DDA7ABD4CAD46AD45CDCCADC 6ADC5CA828D7AFD78F7708372416F5A7 8DD46768FF3B0017156B08A8A0FC1EF0 658D007C017BFF8DD64F001723780138 03170548FF173B4A0B7804276388864F 01173B79FD88864F0179057905392317 0369057A053A1F1703A7E3FD652DBC14 086029D0247008404100EEF71E17532D 1F1B24A20BF81EF165808080064F0117 85A75FF01EF065A79DF11ED9A5F01E79 08D9A500EEA79DF11ED9AF00EED08080 808080D020F8888888F8888C88F8D8D8 D8D8D8D8D8D8D8D8D8D8D8F8F8F8F8F8 F8F8F8F8F8F8F888A8A88888A8A8A888 88A8A888F888C8A89888C8A89888C8A8 9888F888A8A88888A8A888F800000000 00012C23140A04100501000000000501 000905080A01071402000000707070F8 F8F87000000000F8D8D8D8D8D8D8D8D8 F8000000000020000080000008FF8891 A2FF80B380FFFF80FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFDFC80FCFDFE8A1222 FE029A02FEFE02FEFEEEE602E6EEC040 4040C0C040C0C083E494E3338AAA1A08 3848383838383838F1AAAAA994554988 8C5004D8FCE6E6E4F8ECE6E6E6FEE6E6 E6E6E6E67CE6E07C06E67CE6E6E6E6E6 7CA8A00A010A00000A00100606003901 E19F4700863800E3301F73604A0000A0 47BC010100CF0308ECC03800797B3C31 C7100419F1AFA7610007D68621466000 00E869DA88DAE5005658F1FB8331004D E13F38B02200DF0308ECC038008BE711 E0600E00358C37798225010DD0D64630 05004AFDFF071B9002B59FB00F0E0800 3BA8863C673B00ED093E388403002C30 16340E0000E3341A0FB0E000ED792038 001C00ECC627184DE600DCB3206C411C 002C06D3086702004DE13FE3300B02E6 C69ED80EC610EB111A8F30E000377805 9B9E5300E73184AD6876006F87219407 0A0039ACC5F3097000FD0282D5630400 F60282D56B7300E3301F738329017C8F 11ECD026007F599EB8C114004DF1FFC1 811501E3341A8FB0E000EC301A9F6C41 009FB1F1C80DA6047AC02FF0011000EC F009469339000DA67F61C15600F71B43 4CD9080EE69E8DA09E2500EC62166C3D E20067DBC1B700EB00EA0F2C59070A00 DE1A3662CD18705A627CC20F28006D0C 69D380D601F682D2EFD08000EB076830 C75A007303FA6DC1E628BBE76803E286 00BFF5301A4C18070D3FFE09075604DF C6F0C80DA6044BEA632CD80A00D63016 B47E84036BDE80A61F5002D373B40171 E30056646D40D3E6006B81B5642DE000 2BECF2B68C611CBF1B3CB1061C05B711 BEC18476006A6C847F0BA2033BD817D6 6018075B1EE893358C035BF14A9FB180 0356AC0FBE013900F3827D60672C012E D692B5BDD001B72DC858622D000A3F82 ACC51C00DC33206D6CC4015658F1FE3C 03024D50634F34130037CF9058CD0401 6F0D71BF0C031C3F42EFA60D4801DCF3 C980DC3800EE4734FE891D0AF8C01F66 010E00C71FFEB0622B00BBBD83250F74 00BE46CF59832901C703876D872500E6 B0F7C1790604AC6173EC8B11046D0C71 3B2FAC00DF199EE6C02E02ECB2FF0F3E 000AF8620EAC1FE00056DCFFA1B01500 7F5ED0E881E000FC6105D3DED1016641 7F239E2500ED7920E0CE7600E96B6E3C 525C00BF1B3DB1069C033F0B70D378A4 03D68671AC650C01BBE76803E2C601EB 3786D83B3838BF833DF1044B044DE13F E3C08A0067DBC15A1EE800DDCF519AC6 E900DCB3E4F900E10037BFC027C07100 ACC1BBF90F2614D3C680760F5300CE63 13ACB01500BD3D80E05B1000B5054FE3 B01500BFA2A7713C0B0237BFC0070B50 00B7FF05A2C18402ECC6272C63190733 C1BE21B92101B75FF032805D04B31E59 03CA8800560F2F286C0500B6436BC86F 0B10376B081BA00000CF02B439DE1600 D77F43606B40017E1A3DD106A4004D0F 4FE3C00A003BD81718D176006F87A64D 8005015B313EA6C0120067033E6687AD 08761B43DE0EC610F9013EB0433B0019 8BE713E03800ECF2B30095150059431A 331E29009ADF80660D261C56581F9C67 09003716B47D03A20003EEBF8D004B00 DF30A2693C520056AF7FC2C106045658 B1FF8305017683F9180BD601DF92A7D1 80A600BFC29ED0784401B50168EFB005 015BF10A32BFE000FC820956AF710058 3F86BCC212012DF13EE6C08800EC6034 1A6FC201DCB38CB00571007603B47D8F 111C6BF17C80601D004DF15E38C38800 3C80F007040700BD070480050000C733 24EF01E000DF072634861C007390DB34 1E3900EB87218C8F6108B527F8606C44 01BFF580360DB80EFE363CF20D080737 DE607A62C105AEF0F06570018100AEF0 F06500EE623B611AA7AB6002F015D216 23D472FB32271D5AA862D21600EE8202 0203004084C4A4A0A064A00243004082 82008085E590E084A0C0A4A44040A4A0 408044A020C38380804383C08044A080 648080659090648020C420A060E42080 E01575907010F6A8AEA85050ADFAF81E F56578026AF86603F615ADFEF81E7801 F065800E86F08006AD6EF01EF3654600 860080A281A282A283A2A208F355A208 D454460100EE8464840523D41DC62A1B 4A3B122C0202822D1B0712322F912D1B 323535A82D1B162B2B2C912A1B272F2C 27208B2A1B4408122C8B301B35992D1B 283532992C1B153B3299020132063535 382F0115353B2743382FAC010A2C273B 2B2B1232010E3B480116083F3F28AF0C 1816272F3838013B01192FA00D034A2F 2828014335072F91010A080728353219 2F4301072F1D2C01382FAC0211163B38 384A3527438D301B07B5181216283BA0 1418080728353299010A352712240D01 073515032C061207192B088702112B35 270100320612160001152001063B1682 00E068AA2DBC23D02DBC606E151B6013 23D22DBCA803F365800E800E8011833E 833E8321610A620582038133A208F355 632B61106200A208F21EF065F0296011 23D2D3157305720132041F0600EEA828 6010D016700830301F2200EE23D0689C 2DBC2DBC61112F1EF30A43051F484308 1F54430A1F601F3841111F382F1E6111 2F1E1F3841171F382F1E61172F1E1F38 6001F0186205F2152F1E73FF23D43300 1F664111155900E06402650E688D2DC2 AFF5F865AD02D131F00AA208F71E7701 F055AD02D131F029D125F61847041FAC 7105AD02D131E0A11FA61F882D54A208 F3658143825352001FEE51301FEE8100 82308006800683368336816282624100 1FD640001FEE42001FDE41001FEE4300 1FE642001FEEA803F35523C81559F418 2DBC23D0151D2B0D110A05030098