' CHIP8 ' SEE HTTPS://CHIP-8.GITHUB.IO/LINKS/#EMULATORINTERPRETER-DEVELOPMENT ' AND HTTP://WWW.MULTIGESTURE.NET/ARTICLES/HOW-TO-WRITE-AN-EMULATOR-CHIP-8-INTERPRETER/ KEYBOARD ON ON RASTER CALL MICROROWS ON VBL CALL UPDATECLOCK 'A = $000A20/8 'B = $F0 ' ------------------ CHIP8 MEMORY ------------------ 'RANDOM ACCESS MEMORY RAM=$E000 'CPU REGISTERS DIM GLOBAL V(15) 'PROGRAM COUNTER PC=RAM+$200 'INDEX REGISTER IREG=0 'ST TIMER ST=0 'NORMAL TIMER DT=0 'STACK POINTER DIM GLOBAL STACK(15) SP=0 KEY=-1 LASTKEY=-1 CYCLES = 0 GLOBAL IREG, RAM, SP, PC, ST, DT, KEY, CYCLES, LASTKEY ' ------------------ MY VARS ------------------ 'OTHER VARS NAME$="" MODE=0 _STEP = 0 _PLAY = 1 _EDIT = 2 _POWER = 3 HDISP=0 HITTING=0 TRUE=-1 GLOBAL TRUE, FALSE, NAME$, MODE, _STEP, _PLAY, _EDIT,_POWER, HITTING, OUT, OUT$, R, R$ ' ------------------ SETTINGS ------------------ RESOX = 64 RESOY = 32 PALSCREEN = 0 CHRSCREEN = 64 SHOWNAMES = TRUE RAMSIZE = 4096 CYCLEPERVBL = 5 GLOBAL RESOX, RESOY, PALSCREEN, CHRSCREEN, SHOWNAMES, CYCLEPERVBL ' ---------------- SPRITE SETTINGS -------------- SPRITE 63 PAL 5 SPRITE 40 PAL 5 SIZE 1 ' ------------------ KEY CONFIG------------------ 'ORIGINAL CONFIG KORIG$ = "" KORIG$ = KORIG$+"123C" KORIG$ = KORIG$+"456D" KORIG$ = KORIG$+"789E" KORIG$ = KORIG$+"A0BF" 'MY KEY CONFIG (CHANGE THIS FOR YOURS) KCONF$ = "" KCONF$ = KCONF$+"1234" KCONF$ = KCONF$+"AZER" KCONF$ = KCONF$+"QSDF" KCONF$ = KCONF$+"WXCV" GLOBAL KCONF$, KORIG$ ' ------------------ GAMES ADDR ------------------ GAMEROM = ROM(5) LASTLINE = 749 NBGAMES = 23 DIM GLOBAL GAME(NBGAMES) DIM GLOBAL GNAME$(NBGAMES) FOR I=0 TO NBGAMES READ GAME(I) READ GNAME$(I) NEXT I DATA 1 , "15PUZZLE" DATA 26 , "BLINKY" DATA 175 , "BLITZ" DATA 201 , "BRIX" DATA 220 , "CONNECT4" DATA 234 , "GUESS" DATA 245 , "HIDDEN" DATA 300 , "INVADERS" DATA 382 , "KALEID" DATA 391 , "MAZE" DATA 395 , "MERLIN" DATA 418 , "MISSILE" DATA 431 , "PONG" DATA 448 , "PONG2" DATA 466 , "PUZZLE" DATA 479 , "SYZYGY" DATA 540 , "TANK" DATA 576 , "TEST" DATA 607 , "TETRIS" DATA 639 , "TICTAC" DATA 671 , "UFO" DATA 686 , "VBRIX" DATA 719 , "VERS" DATA 735 , "WIPEOFF" ' ------------------ INITIALISATION ------------------ INIT: CLS 'INIT VARS IREG = 0 PC = 0 ST = 0 DT = 0 PC=RAM+$200 CALL INITSCREEN(FALSE) 'CLEAR STACK & REGISTERS SP=0 FOR I=0 TO 15 STACK(I) = 0 V(I) = 0 NEXT I CALL PRINTALL 'LOADING FONT TO RAM+$000 GOSUB LOADFONT ' ------------------ MAIN LOOP ------------------ MAIN: DO K=0 K$=INKEY$ CALL GETKEY(K$) IF K$<>"" THEN K = ASC(K$) IF K$=";" THEN GOTO INIT IF K$="?" THEN GOTO LOADROM IF K$="," THEN GOTO LOADEXTROM IF K$="." THEN GOTO SAVEDISK IF K$="+" THEN GOTO SETTINGS IF K$="H" THEN GOSUB HELP IF K$="P" AND MODE<>_POWER THEN MODE=_POWER K$="" CLS END IF IF MODE = _STEP THEN GOSUB STEPMODE ELSE IF MODE = _PLAY OR MODE = _POWER THEN IF K = 10 OR K$="P" THEN MODE=_STEP CALL PRINTALL END IF CALL DOCYCLE ELSE IF MODE = _EDIT THEN GOSUB EDITRAM END IF 'WAIT VBL LOOP ' --------------------------------------------------- CLEARRAM: 'CLEAR RAM FILL RAM, $1000, 0 RETURN LOADFONT: 'LOAD FONTS COPY ROM(4), 80 TO RAM RETURN HELP: PAL 4 IF NOT HDISP THEN CALL MICRO(0, 20,"?-LOAD .-SAVE ;-RESET SPC-STEP RET/P-RUN") HDISP=-1 ELSE CALL MICRO(0, 20," ") HDISP=0 END IF RETURN PRINTFILES: CLS FOR I=0 TO 15 TAB$ = " " IF I>=10 THEN TAB$ = "" CALL MICRO(1, I+3, TAB$+STR$(I)+" - "+FILE$(I)+" ") WAIT VBL NEXT I RETURN PRINTROMS: CLS FOR I=0 TO NBGAMES TAB$ = " " S = 1 IF I>=10 THEN TAB$ = "" IF I>NBGAMES/2 THEN S=NBGAMES/2+1 CALL MICRO(S, I-S+5, TAB$+STR$(I)+" - "+GNAME$(I)+" ") WAIT VBL NEXT I RETURN QUESTION: CALL MICRO(1, 0, LEFT$(QUESTION$+" ", 40)) LOCATE 0, 1 INPUT " ";R$ R = VAL(R$) WAIT VBL RETURN SETTINGS: CLS SPRITE OFF PAL 0 QUESTION$ = "CYCLE PER VBL (MAX SPEED)? (CURR="+STR$(CYCLEPERVBL)+") " GOSUB QUESTION IF R>0 THEN CYCLEPERVBL = R QUESTION$ = "CHENGE KEYBOARD LAYOUT (Y/N) ? " GOSUB QUESTION IF R$="Y" THEN KCONF$ = "" FOR I=0 TO 15 K$=MID$(KORIG$,I+1,1) KEY = INSTR("0123456789ABCDEF", K$)-1 CALL PRINTKEY QUESTION$ = "KEY "+K$+" ? (CONFIG:"+KCONF$+") " GOSUB QUESTION KCONF$ = KCONF$+R$ NEXT I END IF CLS GOTO INIT SAVEDISK: 'SAVE TO DISK CLS SPRITE OFF FILES PC=RAM+$200 PAL 0 QUESTION$ = "SAVE ON EXTERNAL ROM NUMBER?" GOSUB PRINTFILES GOSUB QUESTION IF R$="" THEN CLS GOTO INIT END IF RNUM = R QUESTION$ = "SAVED ROM NAME?" GOSUB PRINTFILES GOSUB QUESTION IF RNUM>=0 AND RNUM<=15 AND R$<>"" THEN SAVE RNUM, R$, PC, $800 END IF CLS GOTO INIT LOADROM: 'LOAD FROM ROMS CLS SPRITE OFF FILES PC=RAM+$200 PAL 0 QUESTION$ = "LOAD ROM NUMBER ?" GOSUB PRINTROMS GOSUB QUESTION IF R>=0 AND R<=NBGAMES THEN GOSUB CLEARRAM LAST = LASTLINE IF R=0 AND R<=15 THEN GOSUB CLEARRAM 'LOAD ROM LOAD R, PC END IF CLS GOTO INIT STEPMODE: 'SPACE IF K$ = " " THEN CALL DOCYCLE 'UP IF K = 20 THEN ADD PC, -2 CALL PRINTRAM END IF 'DOWN IF K = 19 THEN ADD PC, +2 CALL PRINTRAM END IF 'ENTER IF K = 10 THEN MODE=1 'BACKSOACE IF K = 8 THEN MODE=2 RETURN EDITRAM: K=0 I=0 WHILE K<>8 K$="" K=0 K$=INKEY$ IF K$ <> "" THEN K = ASC(K$) 'CURSOR NAVIGATION 'RIGHT IF K=17 THEN ADD I, +1, 0 TO 3 'LEFT IF K=18 THEN ADD I, -1, 0 TO 3 'UP IF K=20 THEN ADD PC, -2 'DOWN IF K=19 THEN ADD PC, +2 'INSERT IF K$="I" THEN COPY PC, RAM+RAMSIZE-PC-2 TO PC+2 POKE PC, 0 POKE PC+1, 0 END IF 'DELETE IF K$="X" THEN COPY PC+2, RAM+RAMSIZE-PC-4 TO PC END IF 'BYTE MODIF B=-1 IF (K>=65 AND K<=70) THEN B=K-55 IF (K>=48 AND K<=57) THEN B=K-48 IF B>=0 THEN POS = 2^(((I+1) MOD 2)*4) MASK = $FF AND NOT ($F * POS) 'TRACE HEX$(PC+I\2, 4), HEX$(MASK, 4) BYTE = PEEK(PC+I\2) AND MASK POKE PC+I\2, BYTE OR B*POS ADD I, +1 IF I>3 THEN I=0 ADD PC, +2 END IF END IF CALL PRINTRAM SPRITE 63, 23+I*4, 24, 17 WAIT VBL WEND MODE = 0 SPRITE OFF 63 CALL PRINTRAM RETURN SUB CLEARSCREEN(BYTE) FILL $8000+16*CHRSCREEN, RESOX/8*RESOY/8*16, BYTE END SUB SUB PRINTRAM 'PRINT LOCAL RAM IF MODE=_POWER THEN EXIT SUB I=PC-6 J=1 WHILE I") END IF 'PRINT BYTES PAL 0 OP = PEEK(I)*256 OR PEEK(I+1) CALL MICRO(1, J, HEX$(I AND $0FFF,3)+"-"+HEX$(OP, 4)) 'PRINT OP NAME S$ = " " IF OP>0 AND SHOWNAMES AND MODE<>_PLAY THEN CALL GETNAME(OP) IF LEN(NAME$)>0 THEN S$ = "-" + NAME$ +" " END IF S$ = LEFT$(S$, 13) PAL 4 CALL MICRO(5, J, S$) 'NEXT RAM ROW INC J ADD I, 2 WEND PAL 0 END SUB SUB PRINTALL 'INITIAL PRINTS CALL PRINTTITLES PAL 0 CALL PRINTRAM FOR I=0 TO 15 CALL PRINTVF(I) CALL PRINTSTACK(I) NEXT I CALL PRINTOTHER END SUB SUB PRINTTITLES IF MODE=_POWER THEN EXIT SUB PAL 1 CALL MICRO(1, 11, "REG ") CALL MICRO(8, 11, "STACK ") CALL MICRO(1, 0, "ADR RAM ") END SUB SUB PRINTVF(I) PAL 0 IF MODE=_POWER THEN EXIT SUB IF I<=7 THEN CALL MICRO(1, 12+I, "V"+HEX$(I,1)+"-"+HEX$(V(I),2)+" ") ELSE CALL MICRO(4, 4+I, "V"+HEX$(I,1)+"-"+HEX$(V(I),2)+" ") END IF END SUB SUB PRINTOTHER PAL 0 IF MODE=_POWER THEN EXIT SUB CALL MICRO(16, 12, "I-"+HEX$(IREG AND $0FFF,3)+" ") CALL MICRO(16, 14, "DT-"+HEX$(DT,2)+" ") CALL MICRO(16, 16, "ST-"+HEX$(ST,2)+" ") END SUB SUB GETKEY(K$) IF K$<>"" THEN I = INSTR(KCONF$, K$) IF I<>0 THEN KEY=-1 K = ASC(MID$(KORIG$, I, 1)) 'A-Z IF (K>=65 AND K<=70) THEN KEY=K-55 '0-9 IF (K>=48 AND K<=57) THEN KEY=K-48 LASTKEY=KEY END IF ELSE KEY=-1 END IF CALL PRINTKEY END SUB SUB PRINTKEY 'IF MODE=_POWER THEN EXIT SUB 'COPY KEYPAD BG COPY 0, 0, 5, 5 TO 12,6 'CIRCLE THE KEY IF KEY>=0 THEN I = INSTR(KORIG$, HEX$(KEY,1)) SPRITE 40, 101+((I-1) MOD 4)*8, 42+(I-1)\4*6, 41 ELSE IF TIMER MOD 10 = 0 THEN SPRITE OFF 40 END IF END SUB SUB PRINTSTACK(I) IF MODE=_POWER THEN EXIT SUB IF SP=I THEN S$=">" ELSE S$=" " END IF IF I<=7 THEN CALL MICRO(7, 12+I, S$+"S"+HEX$(I,1)+"-"+HEX$(STACK(I),3)+" ") ELSE CALL MICRO(11, 4+I, S$+"S"+HEX$(I,1)+"-"+HEX$(STACK(I),3)+" ") END IF END SUB SUB DRAWCHAR(PX, PY, CH) ADDR = ROM(4) + 5*CH FOR I=0 TO 4 CALL DRAWBYTE(PX, PY+I, PEEK(ADDR+I)) NEXT I END SUB SUB DRAWBYTE(PX, PY, BYTE) PX = PX MOD RESOX PY = PY MOD RESOY CX = PX\8 CY = PY\8 NUMC = CHRSCREEN+CX+CY*RESOX\8 PPX = PX MOD 8 PPY = PY MOD 8 ADDR = $8000+16*NUMC+PPY+8 'THEN FIRST BITS B = BYTE\(2^PPX) AND $FF BIT = PEEK(ADDR) XOR B 'COLLISION DETECT HITTING = (BIT AND B) = B AND B>0 'TRACE BIN$(BIT,8), BIN$(B,8) POKE ADDR, BIT 'IF ONE BYTE IS ON 2 CELLS IF PPX > 0 THEN ADDR = $8000+16*(NUMC+1)+PPY+8 IF CX=RESOX\8-1 THEN ADD ADDR, -16*RESOX\8 'THE REMAINING BITS B = BYTE*(2^(8-PPX)) AND $FF 'XOR THE BYTE TO DRAW IT BIT = PEEK(ADDR) XOR B 'TRACE BIN$(BIT,8), BIN$(B,8) 'COLLISION DETECT HITTING = HITTING OR (((BIT AND B) = B) AND (B>0)) POKE ADDR, BIT END IF 'TRACE HITTING END SUB SUB INITSCREEN(RULLERS) PAL PALSCREEN C = CHRSCREEN S = 1 FOR J=0 TO RESOY/8-1 FOR I=0 TO RESOX/8-1 CX = 20-(RESOX/8-I+1) CY = 1+J 'SCREEN CELLS SPRITE S, CX*8, CY*8, C INC C INC S NEXT I NEXT J CALL CLEARSCREEN($FF) END SUB SUB MICROPHONE(CX, CY, T$, ALLOWED$) CALL MICRO(CX, CY, T$) PRINT("") INPUT " ";OUT$ CALL MICRO(CX, CY, LEFT$(" ", LEN(T$)+1)) END SUB SUB MICRO(CX, CY, T$) CX0 = CX 'IF TIMER MOD 2 = 0 THEN L=LEN(T$) BG 1 FOR I=1 TO L\2 C$=MID$(T$,I*2,1) TEXT CX,CY,C$ INC CX NEXT I 'ELSE IF TIMER MOD 2 = 1 THEN CX=CX0 L=LEN(T$) BG 0 FOR I=1 TO L\2 C$=MID$(T$,I*2-1,1) TEXT CX,CY,C$ INC CX NEXT I CX=CX0 'END IF END SUB SUB MICROROWS 'HANDLES WHAT ROW IS BEING DRAWN 'AND WHERE THE NEXT CHARACTER IS DISPLAYED 'Y : Y POSITION Y=(RASTER\6)*2-1 SCROLL 0,0,Y 'HERE'S THE OTHER PART OF THE MAGIC...MOVE BACKGROUND 'TO OVERPRINT THE CHARACTER. SCROLL 1,-4,Y END SUB SUB DOCYCLE 'FETCH THE NEXT 2 BYTES OP = PEEK(PC)*256 OR PEEK(PC+1) 'FIRST BYTE O = $F000 AND OP 'RIGHT BYTES P = $0FFF AND OP FL = $F00F AND OP 'MID BYTES X = ($0F00 AND OP) / 256 Y = ($00F0 AND OP) / 16 'TWO LAST BYTES K = $00FF AND OP 'END BYTE E = $000F AND OP 'INCREMENT POINTER ADD PC, 2 'EXECUTE CPU INSTRUCTION IF OP = $00E0 THEN '00E0 - CLS CALL CLEARSCREEN($FF) ELSE IF OP = $00EE THEN '00EE - RET PC=RAM+STACK(SP) DEC SP CALL PRINTSTACK(SP) CALL PRINTSTACK(SP+1) ELSE IF O = $1000 THEN '1NNN - JP ADDR PC = RAM+P ELSE IF O = $2000 THEN '2NNN - CALL ADDR INC SP STACK(SP) = PC AND $0FFF PC = RAM OR P CALL PRINTSTACK(SP) CALL PRINTSTACK(SP-1) ELSE IF O = $3000 THEN '3XKK - SE VX, BYTE IF V(X) = K THEN ADD PC, 2 ELSE IF O = $4000 THEN '4XKK - SNE VX, BYTE IF V(X) <> K THEN ADD PC, 2 CALL PRINTVF(X) ELSE IF O = $5000 THEN '5XY0 - SE VX, VY IF V(X) = V(Y) THEN ADD PC, 2 ELSE IF O = $6000 THEN '6XKK - LD VX, BYTE V(X) = K CALL PRINTVF(X) ELSE IF O = $7000 THEN '7XKK - ADD VX, BYTE V(X) = (V(X)+K) AND $FF CALL PRINTVF(X) ELSE IF FL = $8000 THEN '8XY0 - LD VX, VY V(X) = V(Y) CALL PRINTVF(X) ELSE IF FL = $8001 THEN '8XY1 - OR VX, VY V(X) = V(X) OR V(Y) CALL PRINTVF(X) ELSE IF FL = $8002 THEN '8XY2 - AND VX, VY V(X) = V(X) AND V(Y) CALL PRINTVF(X) ELSE IF FL = $8003 THEN '8XY3 - XOR VX, VY V(X) = V(X) XOR V(Y) CALL PRINTVF(X) ELSE IF FL = $8004 THEN '8XY4 - ADD VX, VY S = V(X) + V(Y) IF S>$FF THEN V($F) = 1 ELSE V($F) = 0 END IF V(X) = S AND $FF CALL PRINTVF(X) CALL PRINTVF($F) ELSE IF FL = $8005 THEN '8XY5 - SUB VX, VY S = V(X) - V(Y) IF V(X) 0) V(X) = ((V(X)/2) AND %11110111) CALL PRINTVF(X) CALL PRINTVF($F) ELSE IF FL = $8007 THEN '8XY7 - SUBN VX, VY S = V(Y) - V(X) IF V(Y) 0) V(X) = ((V(X)*2) AND %11101111) CALL PRINTVF(X) CALL PRINTVF($F) ELSE IF FL = $9000 THEN '9XY0 - SNE VX, VY IF V(X) <> V(Y) THEN ADD PC, 2 ELSE IF O = $A000 THEN 'ANNN - LD I, ADDR IREG = RAM + P CALL PRINTOTHER ELSE IF O = $B000 THEN 'BNNN - JP V0, ADDR PC = P + V(0) ELSE IF O = $C000 THEN 'CXKK - RND VX, BYTE V(X) = RND(255) AND K CALL PRINTVF(X) ELSE IF O = $D000 THEN 'DXYN - DRW VX, VY, NIBBLE V($F)=0 FOR I=0 TO E-1 B = PEEK(IREG+I) HITTING = 0 CALL DRAWBYTE(V(X), V(Y)+I, B) IF HITTING THEN V($F) = 1 NEXT I V($F) = ABS(V($F)) TRACE V($F) CALL PRINTVF($F) ELSE IF O = $E000 AND K = $9E THEN 'EX9E - SKP VX IF LASTKEY = V(X) THEN ADD PC, 2 'LASTKEY=-1 END IF ELSE IF O = $E000 AND K = $A1 THEN 'EXA1 - SKNP VX IF LASTKEY <> V(X) THEN ADD PC, 2 'LASTKEY=-1 END IF ELSE IF O = $F000 AND E = $7 THEN 'FX07 - LD VX, DT V(X) = DT CALL PRINTVF(X) ELSE IF O = $F000 AND K = $0A THEN 'FX0A - LD VX, K KEY=-1 'COPY KEYPAD CALL MICRO(17, 8, "PRESS ") CALL MICRO(17, 9, " KEY ") K$="" K=0 WHILE KEY=-1 AND INSTR("?,.;+P",K$)=0 AND K<>10 'KEYPAD K$ = INKEY$ CALL GETKEY(K$) WAIT VBL WEND V(X) = KEY CALL PRINTVF(X) CALL MICRO(17, 8, " ") CALL MICRO(17, 9, " ") ELSE IF O = $F000 AND K = $15 THEN 'FX15 - LD DT, VX DT=V(X) CALL PRINTOTHER ELSE IF O = $F000 AND K = $18 THEN 'FX18 - LD ST, VX V(X) = ST CALL PRINTVF(X) ELSE IF O = $F000 AND K = $1E THEN 'FX1E - ADD I, VX IREG=IREG+V(X) CALL PRINTOTHER ELSE IF O = $F000 AND K = $29 THEN 'FX29 - LD F, VX IREG = RAM+V(X)*5 CALL PRINTOTHER ELSE IF O = $F000 AND K = $33 THEN 'FX33 - LD B, VX S$ = STR$(V(X)) POKE IREG, VAL(MID$(S$, 1, 1)) POKE IREG+1, VAL(MID$(S$, 2, 1)) POKE IREG+2, VAL(MID$(S$, 3, 1)) ELSE IF O = $F000 AND K = $55 THEN 'FX55 - LD [I], VX FOR I=0 TO X POKE IREG+I, V(I) NEXT I IREG = IREG + X + 1 CALL PRINTOTHER ELSE IF O = $F000 AND K = $65 THEN 'FX65 - LD VX, [I] FOR I=0 TO X V(I) = PEEK(IREG+I) CALL PRINTVF(I) NEXT I IREG = IREG + X + 1 CALL PRINTOTHER ELSE 'TRACE "OP "+HEX$(OP, 4)+" UNKNOWN" END IF CALL PRINTRAM INC CYCLES IF CYCLES MOD CYCLEPERVBL = 0 THEN WAIT VBL END IF END SUB SUB UPDATECLOCK 'UPDATE CLOCKS IF DT>0 THEN DEC DT CALL PRINTOTHER END IF IF ST>0 THEN PLAY 0, 42, 0 DEC ST CALL PRINTOTHER END IF END SUB SUB GETNAME(OP) NAME$="" 'FIRST BYTE O = $F000 AND OP 'RIGHT BYTES P = $0FFF AND OP FL = $F00F AND OP 'MID BYTES X = ($0F00 AND OP) / 256 Y = ($00F0 AND OP) / 16 'TWO LAST BYTES K = $00FF AND OP 'END BYTE E = $000F AND OP IF OP = $00E0 THEN NAME$ = "CLS" ELSE IF OP = $00EE THEN NAME$ = "RET" ELSE IF O = $1000 THEN NAME$ = "JP "+HEX$(P,3) ELSE IF O = $2000 THEN NAME$ = "CALL "+HEX$(P,3) ELSE IF O = $3000 THEN NAME$ = "SE V"+HEX$(X,1)+","+HEX$(K,2) ELSE IF O = $4000 THEN NAME$ = "SNE V"+HEX$(X,1)+","+HEX$(K,2) ELSE IF O = $5000 THEN NAME$ = "SE V"+HEX$(X,1)+",V"+HEX$(Y,1) ELSE IF O = $6000 THEN NAME$ = "LD V"+HEX$(X,1)+","+HEX$(K,2) ELSE IF O = $7000 THEN NAME$ = "ADD V"+HEX$(X,1)+","+HEX$(K,2) ELSE IF FL = $8000 THEN NAME$ = "LD V"+HEX$(X,1)+",V"+HEX$(Y,1) ELSE IF FL = $8001 THEN NAME$ = "OR V"+HEX$(X,1)+",V"+HEX$(Y,1) ELSE IF FL = $8002 THEN NAME$ = "AND V"+HEX$(X,1)+",V"+HEX$(Y,1) ELSE IF FL = $8003 THEN NAME$ = "XOR V"+HEX$(X,1)+",V"+HEX$(Y,1) ELSE IF FL = $8004 THEN NAME$ = "ADD V"+HEX$(X,1)+",V"+HEX$(Y,1) ELSE IF FL = $8005 THEN NAME$ = "SUB V"+HEX$(X,1)+",V"+HEX$(Y,1) ELSE IF FL = $8006 THEN NAME$ = "SHR V"+HEX$(X,1)+"{,V"+HEX$(Y,1)+"}" ELSE IF FL = $8007 THEN NAME$ = "SUBN V"+HEX$(X,1)+",V"+HEX$(Y,1) ELSE IF FL = $800E THEN NAME$ = "SHL V"+HEX$(X,1)+"{,V"+HEX$(Y,1)+"}" ELSE IF FL = $9000 THEN NAME$ = "SNE V"+HEX$(X,1)+",V"+HEX$(Y,1) ELSE IF O = $A000 THEN NAME$ = "LD I, "+HEX$(P, 3) ELSE IF O = $B000 THEN NAME$ = "JP V0, "+HEX$(P, 3) ELSE IF O = $C000 THEN NAME$ = "RND V"+HEX$(X,1)+","+HEX$(K,2) ELSE IF O = $D000 THEN NAME$ = "DRW V"+HEX$(X,1)+",V"+HEX$(Y,1)+","+HEX$(E,1) ELSE IF O = $E000 AND K = $9E THEN NAME$ = "SKP V"+HEX$(X,1)+"" ELSE IF O = $E000 AND K = $A1 THEN NAME$ = "SKNP V"+HEX$(X,1)+"" ELSE IF O = $F000 AND E = $7 THEN NAME$ = "LD V"+HEX$(X,1)+",DT" ELSE IF O = $F000 AND K = $0A THEN NAME$ = "LD V"+HEX$(X,1)+",K" ELSE IF O = $F000 AND K = $15 THEN NAME$ = "LD DT, V"+HEX$(X,1)+"" ELSE IF O = $F000 AND K = $18 THEN NAME$ = "LD ST, V"+HEX$(X,1)+"" ELSE IF O = $F000 AND K = $1E THEN NAME$ = "ADD I, V"+HEX$(X,1)+"" ELSE IF O = $F000 AND K = $29 THEN NAME$ = "LD F, V"+HEX$(X,1)+"" ELSE IF O = $F000 AND K = $33 THEN NAME$ = "LD B, V"+HEX$(X,1)+"" ELSE IF O = $F000 AND K = $55 THEN NAME$ = "LD [I], V"+HEX$(X,1)+"" ELSE IF O = $F000 AND K = $65 THEN NAME$ = "LD V"+HEX$(X,1)+",[I]" END IF '- 00E0 - CLS '- 00EE - RET '- 0NNN - SYS ADDR '- 1NNN - JP ADDR '- 2NNN - CALL ADDR '- 3XKK - SE VX, BYTE '- 4XKK - SNE VX, BYTE '- 5XY0 - SE VX, VY '- 6XKK - LD VX, BYTE '- 7XKK - ADD VX, BYTE '- 8XY0 - LD VX, VY '- 8XY1 - OR VX, VY '- 8XY2 - AND VX, VY '- 8XY3 - XOR VX, VY '- 8XY4 - ADD VX, VY '- 8XY5 - SUB VX, VY '- 8XY6 - SHR VX {, VY} '- 8XY7 - SUBN VX, VY '- 8XYE - SHL VX {, VY} '- 9XY0 - SNE VX, VY '- ANNN - LD I, ADDR '- BNNN - JP V0, ADDR '- CXKK - RND VX, BYTE '- DXYN - DRW VX, VY, NIBBLE '- EX9E - SKP VX '- EXA1 - SKNP VX '- FX07 - LD VX, DT '- FX0A - LD VX, K '- FX15 - LD DT, VX '- FX18 - LD ST, VX '- FX1E - ADD I, VX '- FX29 - LD F, VX '- FX33 - LD B, VX '- FX55 - LD [I], VX '- FX65 - LD VX, [I] END SUB #1:MAIN PALETTES 153F2F0000383400003C0C00003F3C00 002A091500302A30003F2A1500302A00 #2:MAIN CHARACTERS 00000000000000000000000000000000 0000000000000000FFFFFFFFFFFFFFFF D5000000000000007F00000000000000 80800080008000800080808080808080 04040404040407070404040404040707 44C44444E404FFFF040404040404FFFF E424E484E404FFFF040404040404FFFF E4246424E404FFFF040404040404FFFF 648484846404FCFC040404040404FCFC 00000000000000070000000000000007 00000000000000FF00000000000000FF 00000000000000FC00000000000000FC 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 D88800000088D800D88800000088D800 00000000000000000000000000000000 00000000000000000000000000000000 04040404040407070404040404040707 A4A4E4242404FFFF040404040404FFFF E484E424E404FFFF040404040404FFFF E484E4A4E404FFFF040404040404FFFF C4A4A4A4C404FCFC040404040404FCFC 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 04040404040407070404040404040707 E42424242404FFFF040404040404FFFF E4A4E4A4E404FFFF040404040404FFFF E4A4E4242404FFFF040404040404FFFF E484C484E404FCFC040404040404FCFC FF8080808080FF00FF8080808080FF00 80808080808080008080808080808000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 04040404040404070404040404040407 44A4E4A4A404FFFF040404040404FFFF E4A4A4A4E404FFFF040404040404FFFF C4A4C4A4C404FFFF040404040404FFFF E484C4848404FCFC040404040404FCFC 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 40404000400000000000000000000000 A0A00000000000000000000000000000 A0E0A0E0A00000000000000000000000 40E040E0400000000000000000000000 A0204080A00000000000000000000000 0040E040000000000000000000000000 40400000000000000000000000000000 20404040200000000000000000000000 80404040800000000000000000000000 00A040A0000000000000000000000000 0040E040000000000000000000000000 00000040400000000000000000000000 0000E000000000000000000000000000 00000000400000000000000000000000 20204080800000000000000000000000 E0A0A0A0E00000000000000000000000 40C04040E00000000000000000000000 E020E080E00000000000000000000000 E0206020E00000000000000000000000 A0A0E020200000000000000000000000 E080E020E00000000000000000000000 E080E0A0E00000000000000000000000 E0202020200000000000000000000000 E0A0E0A0E00000000000000000000000 E0A0E020200000000000000000000000 00400040000000000000000000000000 00400040800000000000000000000000 20408040200000000000000000000000 00E000E0000000000000000000000000 80402040800000000000000000000000 C0204000400000000000000000000000 608060A0C00000000000000000000000 40A0E0A0A00000000000000000000000 C0A0C0A0C00000000000000000000000 60808080600000000000000000000000 C0A0A0A0C00000000000000000000000 E080C080E00000000000000000000000 E080C080800000000000000000000000 6080A0A0600000000000000000000000 A0A0E0A0A00000000000000000000000 E0404040E00000000000000000000000 E0202020C00000000000000000000000 A0A0C0A0A00000000000000000000000 80808080E00000000000000000000000 E0E0A0A0A00000000000000000000000 C0A0A0A0A00000000000000000000000 40A0A0A0400000000000000000000000 C0A0C080800000000000000000000000 40A0A0A0600000000000000000000000 C0A0C0A0A00000000000000000000000 60804020C00000000000000000000000 E0404040400000000000000000000000 A0A0A0A0600000000000000000000000 A0A0A0A0400000000000000000000000 A0A0A0E0E00000000000000000000000 A0A040A0A00000000000000000000000 A0A06020C00000000000000000000000 E0204080E00000000000000000000000 60404040600000000000000000000000 80804020200000000000000000000000 C0404040C00000000000000000000000 40A00000000000000000000000000000 00000000E00000000000000000000000 #3:MAIN BG 0000141009000A000A000A000B000000 00000000000000000000000000000000 00000000000000000000000004000500 06000700080000000000000000000000 00000000000000000000000000000000 00000000140015001600170018000000 00000000000000000000000000000000 00000000000000000000000024002500 26002700280000000000000000000000 00000000000000000000000000000000 00000000340035003600370038000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000 #4:CHIP8 FONT F0909090F02060202070F010F080F0F0 10F010F09090F01010F080F010F0F080 F090F0F010204040F090F090F0F090F0 10F0F090F09090E090E090E0F0808080 F0E0909090E0F080F080F0F080F08080 #5:GAMES 00000000000000000000000000000000 00E06C004C006E0FA2036020F05500E0 22BE2276228E225E2246121061006217 6304411000EEA2E8F11EF06540001234 F029D235710172056403841234001222 621773061222640384E2650385D29450 00EE440300EE640184E422A612466403 84E2650385D2945000EE440000EE64FF 84E422A6125E640C84E2650C85D29450 00EE440000EE64FC84E422A61276640C 84E2650C85D2945000EE440C00EE6404 84E422A6128EA2E8F41EF065A2E8FE1E F0556000A2E8F41EF0558E4000EE3C00 12D2221C22D8221CA2F8FD1EF0658D00 00EE7CFFCD0F00EE7D01600F8D02ED9E 12D8EDA112E200EE0102030405060708 090A0B0C0D0E0F000D00010204050608 090A0C0E03070B0F84E422A61276640C 84E2650C85D2945000EE440C00EE6404 84E422A6128EA2E8F41EF065A2E8FE1E F0556000A2E8F41EF0558E4000EE3C00 12D2221C22D8221CA2F8FD1EF0658D00 00EE7CFFCD0F00EE7D01600F8D02ED9E 12D8EDA112E200EE0102030405060708 090A0B0C0D0E0F000D00010204050608 00000000000000000000000000000000 121A322E303020432E20456765626572 672031382F382D27393180038113A8C8 F1556005A8CCF05587738663277200E0 27946E4087E26E2787E1681A690C6A38 6B006C026D1A2750A8EDDAB4DCD423D0 3E00127CA8CCF0658500C4FF845224F6 C4FF8452261E6001E0A127D636F7124E 8E60287A6E64287A27D6122AF0074000 13108080800681A0810680154000129A 4001129A40FF129A12C88090800681B0 81068015400012B2400112B240FF12B2 12C8A8EDDAB46A386B00DAB46EF387E2 6E0487E16E32287A8080800681C08106 8015400012E0400112E040FF12E01254 8090800681D081068015400012F84001 12F840FF12F81254A8EDDCD46C026D1A DCD46ECF87E26E2087E16E19287A1254 603F28A82750A8EDDAB4DCD46E4087E3 807080E2300012328E60287A288A00E0 6611670AA8CA27E666116710A8C827E6 640065086600670FAB19D469AB22D569 600328A83E0013C6AB19D469AB22D569 7402750234301348AB19D469AB22D569 600328A83E0013C6AB19D469AB22D569 760236161368AB19D469AB22D5696003 28A83E0013C6AB19D469AB22D56974FE 75FE34001386AB19D469AB22D5696003 28A83E0013C6AB19D469AB22D56976FE 360013A61348AB22D569AB2BD569121A 83706E0383E2848085906E06EEA11432 6E03EEA1144A6E08EEA114626E07EEA1 147A43037502430075FE430274024301 74FE8040815027BA82006E0880E23000 14926E07802082E24205149A420614B2 420714EC27506EFC87E2873188408950 175080408150710227BA82006E0880E2 300013F263037502140E8040815071FE 27BA82006E0880E2300013F2630075FE 140E80408150700227BA82006E0880E2 300013F263027402140E8040815070FE 27BA82006E0880E2300013F2630174FE 140E2750D8948EF000EE6EF080E28031 F055A8F1D45476016105F0074000F118 14246EF080E28031F055A8F5D4547604 80A081B027BA6EF080E2300014D26E0C 87E380C081D027BA6EF080E2300014E4 6E3087E360FFF018F01514244301643A 430264001424827083706E0C82E280A0 81B027BAA8ED6EF080E230001524DAB4 420C7B0242007BFE42087A0242047AFE DAB400EE6E80F107310015D4340015D4 8100830E3F001556839083B54F00158C 3300157487E3838083A54F0015BC3300 15A487E315D4838083A54F0015BC3300 15A487E3839083B54F00158C33001574 87E315D463408132410015D4DAB47B02 DAB46EF387E2620C872100EE63108132 410015D4DAB47BFEDAB46EF387E26200 872100EE63208132410015D4DAB47A02 DAB46EF387E26208872100EE63808132 410015D4DAB47AFEDAB46EF387E26204 872100EEC1F08012300015E46E0C87E3 82E3150EDAB4800E4F0015F262047AFE 1614800E4F0015FE620C7B021614800E 4F00160A62087A021614800E4F0015DC 62007BFEDAB46EF387E2872100EE8270 83706E3082E280C081D027BAA8ED6EF0 80E23000164CDCD442307D0242007DFE 42207C0242107CFEDCD400EE6E80F107 31001704340017048100830E4F00167E 839083D54F0016B63300169C87E38380 83C54F0016EA330016D087E317048380 83C54F0016EA330016D087E3839083D5 4F0016B63300169C87E3170463408132 41001704DCD47D02DCD487E36ECF87E2 6230872100EE6310813241001704DCD4 7DFEDCD487E36ECF87E26200872100EE 6320813241001704DCD47C02DCD487E3 6ECF87E26220872100EE638081324100 1704DCD47CFEDCD487E36ECF87E26210 872100EEC1F080123000171687E36E30 87E382E31636DCD4800E4F0017246290 7CFE1746800E4F00173062307D021746 800E4F00173C62A07C021746800E4F00 170C62007DFEDCD46E4F87E2872100EE 80706E0380E2800E818081946E0281E2 41007001800E800EA8CDF01ED8948EF0 00EE6E00A919FE1EFE1EFE1EFE1EF365 AB34FE1EFE1EFE1EFE1EF3557E013E80 177400EE822383336E0F8020813027BE 80E2800EA8F9F01ED23272023240179A 82237302432000EE179A700271028006 8106810E810E810E810EAB34F11EF11E F01EF06500EEA8CCF0658006F0556001 E0A117E000EEF1656E01844382008310 651083554F0082E54F00180C65278255 4F00180C8020813084E417F0F429D675 760684438200831065E883554F0082E5 4F001834650382554F00183480208130 84E41818F429D6757606844382008310 656483554F0082E54F00185480208130 84E41840F429D6757606844382008310 650A83554F00186E813084E41860F429 D6757606F129D67500EEA8C8F16581E4 3F007001A8C8F15500EEA8C8F3658E00 8E254F0000EE3E0018A28E108E354F00 00EEA8CAF15500EE8EE3620F63FF6110 E2A118C48134310018B0611080343000 18B000EE6E0100EE0000000005005070 20005070200060306000603060003060 30003060300020705000207050002070 70000020000000000000000000000000 000000800000000000C0000000808000 00C0808080C00080000C080808080808 08080808080808080D0C080808080808 08080808080808080D0A6505050505E5 0505E505050505C50A0A6505050505E5 0505E505050505C50A0A050C08080F05 0C0D050808080D050E0F050C08080F05 0C0D050808080D050A0A050A65060595 0A0A350505C50A350505950A65050595 0A0A350506C50A050A0A050F05080808 08080C080F0508080808080F0508080C 080808080F050F050A0A7505B5050505 05C50A6505B505E50505E505B505C50A 6505050505B505D50A0A050C08080808 0D050F050C080F05080F0508080D050F 050C080808080D050A0F050F650505C5 0A35E5950A6505B00505B505C50A35E5 950A650505C50F050F077405D5080F05 0E0F05080F050C080808080D05080F05 080F05080F7505D4070A050A350505F5 0505B50505D508080D0C080F750505B5 0505F50505950A050A0A050808080D05 0C0808080D3505C50A0A6505950C0808 080D050C08080F050A0A750506C50A05 0808080808080F05080F050808080808 080F050A650605D50A0A050C0D050A35 05050505E50505F50505F50505E50505 0505950A050C0D050A0A05080F050808 0808080F050C0D05080F050C0D050808 0808080F05080F050A0A350505B50505 05050505950A0A350505950A0A350505 05050505B50505950A08080808080808 08080808080F08080808080F08080808 08080808080808080F3C429999423C01 100F7884323284780010E078FCFEFE84 780010E0000000000000000000000000 00000000000000000000000000000000 1217424C49545A204279204461766964 2057494E544552A34160046109620E67 04D01EF21E700C30401221F00A00E022 D9F00A00E08E70A31E6B1FCC1F8CC4DC B23F011249DCB21239CA077A017BFEDC B27AFF3A00124D7EFF3E0012396B008C 706D006E00A31BDDE33F0012C13B0012 816005E09E12876B0188D0780289E079 03A31ED89181F06005F015F007300012 8B3B0112ABA31E3101D8917901392012 AB6B0031007CFF4C0012BBA31BDDE37D 023D4012B96D007E01126500E0770212 2DA31BDDE360146102620BA320D01BF2 1E7008302C12CD12D7600A610D6205A3 07D015F21E7008302A12E1807070FE80 06A387F033F265602DF129610DD01570 05F229D01500EE83828382FBE8088805 E2BEA0B8203E80808080F880F8FCC0C0 F981DBCBFB00FA8A9A99F8EF2AE82929 006F682E4C8FBEA0B8B0BE00BE223E34 B2D8D800C3C300D8D800C3C300D8D8C0 C000C0C000C0C000C0C000DBDBDBDB00 181800181800181800DBDBDBDB001818 001818001818001818DBDB0003030018 1800C0C000DBDB000000000000000000 00000000000000000000000000000000 6E0565006B066A00A30CDAB17A043A40 12087B023B1212066C206D1FA310DCD1 22F660006100A312D0117008A30ED011 6040F015F00730001234C60F671E6801 69FFA30ED671A310DCD16004E0A17CFE 6006E0A17C02603F8C02DCD1A30ED671 86848794603F8602611F8712471F12AC 46006801463F68FF47006901D6713F01 12AA471F12AA600580753F0012AA6001 F018806061FC8012A30CD07160FE8903 22F6750122F6456012DE124669FF8060 80C53F0112CA610280153F0112E08015 3F0112EE80153F0112E86020F018A30E 7EFF80E080046100D0113E00123012DE 78FF48FE68FF12EE7801480268016004 F01869FF1270A314F533F265F1296337 6400D3457305F229D34500EEE0008000 FC00AA00000000000000000000000000 00000000000000000000000000000000 121A434F4E4E45435434206279204461 7669642057494E544552A2BBF665A2B4 F655690068016B006D0F6E1FA2A5600D 61326200D02FD12F720F321E1234D021 D1217201600AA29FD021D121A29FDDE1 FC0ADDE14C05127E3C04126A7BFF7DFB 3D0A127A6B066D2D127A3C0612987B01 7D053D32127A6B006D0FDDE11250A2B4 FB1EF06540FC12988A0070FBF0558983 A29E3900A2A1DDA4A29FDDE1125060F0 F0609090608080808080808080808080 808080801A1A1A1A1A1A1A1A1A1A1A1A 1A1A0000000000000000000000000000 00000000000000000000000000000000 6E0100E06D016A016B018CD08CE24C00 122088D0223E3A4012206A017B063C3F 7D013D3F120AF00A400589E48EE43E40 12026A1C6B0D889000E0223E123CA294 F833F2652254DAB57A0481202254DAB5 7A0500EE8310833483348314A262F31E 00EEE0A0A0A0E04040404040E020E080 E0E020E020E0A0A0E02020E080E020E0 E080E0A0E0E020202020E0A0E0A0E0E0 A0E020E0000000000000000000000000 00000000000000000000000000000000 121D48494444454E2120312E30204279 2044617669642057494E544552A43F60 006140F155A43F6000F05500E0A47E60 0C6108620FD01F7008F21E30341235F0 0A00E0A4C96013610D6204D0147008F2 1E302B124BA41FFF65A42FFF55634066 08C10FC20FA42FF11EF0658400A42FF2 1EF06585008040F055A42FF11E8050F0 5573FF3300126100E060006100A477D0 1770083020128F600071083120128F6C 006D006E00A43FF0657001F05523B96A 10235D23CD8A9087D088E0235D23CD23 B9A42FF91EF0658100A42FFA1EF06550 10132B23DF6020240123DF6000A42FF9 1EF055A42FFA1EF05576FF360012A5A4 3FF165820080153F00130180208120F1 5500E0A51960106107620ED01F7008F2 1E3030130BA43FF16584108300660924 0B660F8340240BF00A122523DB608024 0123DBA42FFA1EF06570FF23F3A441F0 1ED787A477D787A42FF91EF06570FF23 F3A441F01EDDE7A477DDE712A5A471DD E7FB0ADDE73B0413714D00135D7DF87C FF3B06137D4D18135D7D087C013B0213 894E00135D7EF87CFC3B0813954E1813 5D7E087C043B05135DA42FFC1EF06540 00135D89C099A0135D70FFA477DDE7A4 4123F3F01EDDE700EEA4D56024610A62 0BD01B7008F21E303C13C100EE603461 10A4F1D015A4F6D01500EEA4FB13E1A5 0A6024610D6205D0157008F21E303C13 E700EE81008114800480048004801500 EEF015F0073000140300EEA42FF333F2 656523F129D5656528F229D56500EE01 02030408070605050607080403020101 02030408070605050607080403020100 00FEEEC682C6EEFEFEC6C6C6FEFEC6AA 82AAC6FEC6828282C6FEBAD6EED6BAFE EEEE82EEEEFE82FE82FE82FEAAAAAAAA AAFEFEFEFEFEFEFEAAD6AAD6AAFE8B88 F8888B0000000000F0484848F2EF8484 84EF0008080A008A8AAAAA523C929292 3C00E2A3E3008BC8A89888FA83E282FA 0028B89000EF888E888F2121A1602100 00000000BC223C28A4898AAB529751D1 51C00000156A8A8E8A6A00648A8E8A6A 44AAAAAA4400CCAACAAAAC6E884C28CE 00040C04040E0C1204081E6394949463 38A5B8A021E101C120C1898A522221CF 282F28C80282020002FF808F908E819E 8091919F919180FF003C4040403C007C 1010107C00FF00008000800000008000 800000FF010101010101010101010101 01FF0000000000000000000000000000 00000000000000000000000000000000 1225535041434520494E564144455253 2076302E392042792044617669642057 494E544552600061006208A3D3D01871 08F21E3120122D700861003040122D69 056C156E002387600AF015F007300012 4B23877E0112456600681C69006A046B 0A6C046D3C6E0F00E0236B2347FD1560 04E09E127D236B380078FF236B6006E0 9E128B236B38397801236B3600129F60 05E09E12E96601651B8480A3CFD451A3 CFD45175FF35FF12AD660012E9D4513F 0112E9D45166008340730383B562F883 226208330012C923738206430812D333 1012D523738206331812DD2373820643 2012E7332812E923733E001307790649 1869006A046B0A6C047DF46E0F00E023 47236BFD15126FF7073700126FFD1523 478BA43B12131B7C026AFC3B0213237C 026A0423473C18126F00E0A4D3601461 08620FD01F7008F21E302C1333F00A00 E0A6F4FE651225A3B7F91E6108235F81 06235F8106235F8106235F7BD000EE80 E080123000DBC67B0C00EEA3CF601CD8 0400EE23478E2323476005F018F015F0 073000137F00EE6A008DE06B04E9A112 57A602FD1EF06530FF13A56A006B046D 016E01138DA500F01EDBC67B087D017A 013A07138D00EE3C7EFFFF99997EFFFF 2424E77EFF3C3C7EDB81423C7EFFDB10 387CFE00007F003F007F000000010101 0303030300003F20202020202020203F 0808FF0000FE00FC00FE0000007E4242 626262620000FF0000000000000000FF 0000FF007D00417D057D7D0000C2C2C6 446C28380000FF0000000000000000FF 0000FF00F71014F7F7040400007C44FE C2C2C2C20000FF0000000000000000FF 0000FF00EF2028E8E82F2F0000F985C5 C5C5C5F90000FF0000000000000000FF 0000FF00BE00203020BEBE0000F704E7 858584F40000FF0000000000000000FF 0000FF00007F003F007F000000EF28EF 00E0606F0000FF0000000000000000FF 0000FF0000FE00FC00FE000000C000C0 C0C0C0C00000FC0404040404040404FC 1010FFF981B98B9A9AFA00FA8A9A9A9B 99F8E62525F434343400171434373626 C7DF50505CD8D8DF00DF111F121B19D9 7C44FE868686FC84FE8282FEFE80C0C0 C0FEFC82C2C2C2FCFE80F8C0C0FEFE80 F0C0C0C0FE80BE8686FE8686FE868686 1010101010101818184848789C90B0C0 B09C8080C0C0C0FEEE9292868686FE82 868686867C828686867CFE82FEC0C0C0 7C82C2CAC47AFE86FE909C84FEC0FE02 02FEFE10303030308282C2C2C2FE8282 82EE38108686969292EE824438384482 8282FE303030FE021EF080FE00000000 06060000006060C00000000000001818 181800187CC60C1800180000FEFE0000 FE82868686FE080808181818FE02FEC0 C0FEFE021E0606FE84C4C4FE0404FE80 FE0606FEC0C0C0FE82FEFE0202060606 7C44FE8686FEFE82FE06060644FE4444 FE44A8A8A8A8A8A8A86C5A000C18A830 4E7E001218666CA85A66542466004848 1812A80690A812007E3012A884304E72 1866A8A8A8A8A8A8905478A848786C72 A812186C72665490A8722A18A8304E7E 001218666CA87254A85A66187E184E72 A8722A183066A8304E7E006C30544E9C A8A8A8A8A8A8A848547E18A890547866 A86C2A305AA88430722AA8D8A8004E12 A8E4A2A8004E12A86C2A545472A88430 722AA8DE9CA8722A18A80C54485A7872 1866A8721842426CA8722A0072A8722A 18A8304E7E001218666CA8304E0C6618 006C18A8722A183066A81E54660C189C A824545412A842780C3CA8AEA8A8A8A8 A8A8A8FF000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 60006380611F620F2232A200F31EF00A F0554000121C7301330012086380A200 F31EF0654000121C73014300121C2232 121E400272FF400471FF400671014008 7201A2776AE08A126B1F81B23A007201 6AF08A226B0F82B23A0071016B1F81B2 D1218A106B1F8B25DAB16A3F8A15DAB1 8B20DAB100EE01800000000000000000 00000000000000000000000000000000 A21EC2013201A21AD014700430401200 60007104312012001218804020102040 80100000000000000000000000000000 00000000000000000000000000000000 1219204D45524C494E20427920446176 69642057494E54455222F9A31D601061 0022CBA331600B611B22CB640422DF65 00622822C1C2038020A359F51EF05560 176108630183223300700A6302832233 00710AA317D016621422C1D016620522 C1750154501235650060176108A317F3 0A330412796300129733051283700A63 0112973307128D710A63021297330812 69700A710A6303D016621422C1D016A3 59F51EF0657501503012B55540126922 DF7401122D22F9A3456010610E22CB12 BFF215F207320012C300EE83006205D0 15F21E700885307520505012CF00EEA3 59834073FDF333F265F129602B631BD0 357005F229D03500EEA30F60176107D0 18700AD018710AD01870F6D01800EEFF 818181818181FF7E7E7E7E7E7EDBAA8B CBCBEF088F0DECA0A0B030BE5F5151D9 D983828382FBE8088805E2BEA0B8203E 80808080F8F785B795F576545654563A 2A2A2A39B6A5B6A53500000000000000 00000000000000000000000000000000 12194D495353494C4520627920446176 69642057494E5445526C0C6000610065 08660A67006E01A2ADD0147008304012 296000611CA2B0D014A2B0D0143E0112 49700440386E00124F70FC40006E01D0 14FC15FB073B0012536208E29E12953C 007CFE631B8200A2B0D2316400D23173 FFD2313F0064013303126DD231340112 91770575FF82006300A2ADD234450012 9776FF36001239A2B4F733F265631B64 0DF129D3457305F229D34512AB103838 10387CFE000000000000000000000000 00000000000000000000000000000000 6A026B0C6C3F6D0CA2EADAB6DCD66E00 22D4660368026060F015F0073000121A C717770869FFA2F0D671A2EADAB6DCD6 6001E0A17BFE6004E0A17B02601F8B02 DAB6600CE0A17DFE600DE0A17D02601F 8D02DCD6A2F0D67186848794603F8602 611F871246021278463F1282471F69FF 47006901D671122A68026301807080B5 128A68FE630A807080D53F0112A26102 80153F0112BA80153F0112C880153F01 12C26020F01822D48E3422D4663E3301 660368FE33016802121679FF49FE69FF 12C87901490269016004F01876014640 76FE126CA2F2FE33F265F12964146500 D4557415F229D45500EE808080808080 80000000000000000000000000000000 00000000000000000000000000000000 22F66B0C6C3F6D0CA2EADAB6DCD66E00 22D4660368026060F015F0073000121A C717770869FFA2F0D671A2EADAB6DCD6 6001E0A17BFE6004E0A17B02601F8B02 DAB6600CE0A17DFE600DE0A17D02601F 8D02DCD6A2F0D67186848794603F8602 611F871246001278463F1282471F69FF 47006901D671122A68026301807080B5 128A68FE630A807080D53F0112A26102 80153F0112BA80153F0112C880153F01 12C26020F01822D48E3422D4663E3301 660368FE33016802121679FF49FE69FF 12C87901490269016004F01876014640 76FE126CA2F2FE33F265F12964146500 D4557415F229D45500EE808080808080 8000000000006B206C00A2EADBC17C01 3C2012FC6A0000EE0000000000000000 00000000000000000000000000000000 6A126B01611062006000A2B0D127F029 3000DAB571087A083130122461107208 6A127B08A300F01EF05570013010120A 6A126B016C0062FFC0067002225272FF 320012386E006E00F00A22527E017E01 124884A085B086C03002126445011264 75F876FC300812704519127075087604 3006127C4412127C74F876FF30041288 442A128874087601A300F61EF0658100 6000A300F61EF055A300FC1E8010F055 F129D455DAB58A408B508C6000EEEE5E FEFEFEFEFEFEFEFE0000000000000000 00000000000000000000000000000000 12128D8D20A93139393020525454208E 8E0024B624DA600FE0A11224600EE0A1 1228121624DA122C00E0122CC11F7110 C20F7208C30385308610872088304800 7701480177FF48027601480376FFA54C D121D67164F069F1A800F41E8030F055 7401A800F41E6001F05525226A007A00 F0073000129C3D0012946000F029DBC5 3F01128CDBC52522F015129CFE156D01 6E00129C80E0F029DBC525226003E0A1 63006006E0A163016007E0A163026008 E0A16303430072FF43017201430271FF 43037101A54CD1213F0113243D011388 603F8102601F820280B080173F011388 80B0700380153F01138880C080273F01 138880C0700480253F0113886004F018 CE077E028AE4A54CD1216000F029DBC5 80E0F029DBC56030F015F0073000131A A54CD1219350133E7401A800F41E8030 F0557401A800F41E6000F0558530A800 F41EF0657001F0554A001358600C70FF 3000134E7AFF1270A54CD671480077FF 48017701480276FF48037601A800F91E F06570FFF055300012707901A800F91E F065880079011270600DF018600BE09E 138E6B016C006D007B013B0A13AA6B00 7C013C0A13AA6C007D01A54CD6714800 77FF48017701480276FF48037601A800 F91EF06570FFF05530001398994013DE 7901A800F91EF06588007901139800E0 66116709682F6917A552D67ED87E77FF A54ED671D6917608D671D6917608D671 D6917608A550D671D691A59E66136711 249AA5AEF36593D01424803080D53F01 143A144492C01432802080C53F01143A 1444801080B53F001444A5AE83D082C0 81B0F355A5AEF365661377F98D308C20 8B10A5A4249AC13FC21F600D80153F00 147C603080173F00147C600380253F00 147C601880273F00147C1482C30FF329 D125600FE0A11490600EE0A114961456 00E024B6122C00E0122CD675A5AA7602 D674FD29760AD675FC297605D675FB29 7605D67500EEA54E61006200661FD121 D1617108314014BEA5526201653FD12F D52F720FD12FD52F00EE610C6207A562 D12AA56C7106D12AA5767106D12AA56C 7106D12AA5807106D12AA56C7106D12A 610E6218A58AD123A58E710872FFD124 710972FEA592D12671067201A598D125 00EE6DC5CB3F8EB08ED44F0115247B01 6DE6CC1F8EC08ED44F0115327C016D00 CE3F7E40FE15CE3F7E4000EE8000FF00 FE008080808080808080808080808080 80801F1010101F010101011F11111111 1F04040404041F01020204040808101F 1F11101010131111111F050502007151 51750C121E141209143E15152A007744 24147700575272525700000100010000 00000000000000000000000000000000 00000000000000000000000000000000 123076FB602080654F006600138400FF 00000001000C0A001902040608020203 2C000F0002052E080000020500000000 6E006DA06A0869066804670266196410 630C62006106A212FA5523D46040F015 F0073000125023D4230A2362A212F565 22AE22C622EC3F0123143F0122EC3F01 22EC3F01227C4F0113661262A212F565 460035001288138CE7A16209E8A16204 E9A16206EAA16201420000EE22AE8120 239A23AC6C0162006F00A212F555A3FF 41016000410460134106600D41096006 F01ED34700EE6005E09E00EE450F00EE 650F76FFA212F55574037303239A239A 239AA223F555A419D34100EEA223F565 450000EEA419D341239A6C0223BE4BBB 130AD341A223F55500EE65006000A217 F0551304A21DF565350F1344A41AD345 32001332C103A219F11EF0658100C20F 7201239AA41A6C0372FF6F00D345A21D F55500EEC407A41FF41EF0658300A427 F41EF0658400A41AD3456020F018650F 133E6500133E4C0112024C021382A223 F56545001202A419D3416F00D3413F01 12027E0A6040F01800E0124A00E023D4 6060F01813946E001384410174FF4104 73FF410673014109740100EE44007401 43007301433873FF441874FF00EE6B00 440013CE430013CE433F13CE441F6BBB 6F0000EE63086408A229FE33F26523EC 6328A229F633F26523F200EEF029D345 7306F129D3457306F229D34500EE0110 547C6C7C7C447C7C6C7C541000FC786E 78FC003F1E761E3F0080A870F870A80B 1B283830201000000000081B1B1B1804 00000000000000000000000000000000 124EEAACAAEACEAAAAAEE0A0A0E0C040 40E0E020C0E0E06020E0A0E020206040 2040E080E0E0E0202020E0E0A0E0E0E0 20E040A0E0A0E0C080E0E080C080A040 A0A0A202DAB400EEA202DAB413DC6801 69056A0A6B01652A662BA216D8B4A23E D9B4A202362BA206DAB46B06A21AD8B4 A23ED9B4A206452AA202DAB46B0BA21E D8B4A23ED9B4A2065560A202DAB46B10 A226D8B4A23ED9B4A20676FF462AA202 DAB46B15A22ED8B4A23ED9B4A2069560 A202DAB46B1AA232D8B4A23ED9B42242 6817691B6A206B01A20AD8B4A236D9B4 A202DAB46B06A22AD8B4A20AD9B4A206 8750472AA202DAB46B0BA22AD8B4A20E D9B4A206672A87B1472BA202DAB46B10 A22AD8B4A212D9B4A2066678671F8762 4718A202DAB46B15A22AD8B4A216D9B4 A2066678671F87634767A202DAB46B1A A22AD8B4A21AD9B4A206668C678C8764 4718A202DAB4682C69306A346B01A22A D8B4A21ED9B4A206668C6778876547EC A202DAB46B06A22AD8B4A222D9B4A206 66E0866E46C0A202DAB46B0BA22AD8B4 A236D9B4A206660F86664607A202DAB4 6B10A23AD8B4A21ED9B4A3E860006130 F155A3E9F065A2064030A202DAB46B15 A23AD8B4A216D9B4A3E86689F633F265 A2023001A2063103A2063207A206DAB4 6B1AA20ED8B4A23ED9B4124813DC0000 00000000000000000000000000000000 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 F265A2B400EE6A00601900EE37230000 00000000000000000000000000000000 12185449435441432062792044617669 642057494E5445526B006C0080B081C0 A3E6F155A3C4FF65A3B4FF55A3E6F165 8B008C1000E06E0160136103A39AD011 7008302B123E601371083123123E6013 6103A39BD01F7008303312546013710F D01A7008303312602366F00A8100A3B4 F01EF0654000128A227C126A6010F018 F015F0073000128200EE60028E0380E0 F055A3D4801070FF8004F01EF165A3AA 3E03A3AFD01522C83A00121CA3B46100 62006301F06530007101F31E72013210 12B43110126A121C6A00A3B46001F01E F865690089042344891423448924234A 690089342344894423448954234A6900 89642344897423448984234A69008964 2344893423448904234A690089742344 894423448914234A6900898423448954 23448924234A69008984234489442344 8904234A690089642344894423448924 234A00EE890E890E00EE49151354493F 135A00EE23667B01135E23667C012366 6A01F00A00EE6305640AA3AFD3456302 7406A3E6FB3323886332640AA3AAD345 632F7406A3E6FC33F265F0292394F129 2394F229D345730500EE7F8080808080 808080808080808080801C2222221C22 14081422010000000000000000000101 01010101010000000000000000000101 0101010113051B052305130D1B0D230D 13151B15231500000000000000000000 00000000000000000000000000000000 A2CD69386A08D9A3A2D06B006C03DBC3 A2D6641D651FD4516700680F22A222AC 48001222641E651CA2D3D4536E006680 6D04EDA166FF6D05EDA166006D06EDA1 6601368022D8A2D0DBC3CD018BD4DBC3 3F001292A2CDD9A3CD013D006DFF79FE D9A33F00128C4E00122EA2D3D4534500 128675FF8464D4533F0112466D088D52 4D08128C129222AC78FF121E22A27705 129622A2770F22A26D03FD18A2D3D453 1286A2F8F733630022B600EEA2F8F833 633222B600EE6D1BF265F029D3D57305 F129D3D57305F229D3D500EE017CFE7C 60F06040E0A0F8D46E016D10FD1800EE 00000000000000000000000000000000 00E023B66007E09E1204680067032346 224A22C02366238A23ACF00A225A225A 22D022883A00121C6C0123AC77FF23AC 6078F015F007300012343700121C23AC 6007E09E1242120A00FD69106002A254 D09500EE8080808080006001E0A11268 6004E0A1127200EE809070FF400000EE 127C80907001401B00EE127C6102A254 D195D105890000EE80A070FE300000EE 80B080954F0000EE8100620581253F00 00EEA2BAF01EF0658D004B016D014B1E 6DFF6C01600AF01800EEFFFF00010100 CB207B016A046C016D01A364DAB100EE 80A081B08AC48BD4A3644B016D014B1E 6DFF4A3E6CFF4A006C01D011DAB14F00 00EE80A0612180154F0000EE80A081B0 70DE71FF62FF63FF6403720180453F00 130A730181453F001312802081308024 80248134813470227101A386D0137EFF 60008C076002F018238A7801238A3E00 00EE236600EE00E060006100621FA364 D011D0217001303F1350D01171013120 135A00EE80006101630AA38660226207 D013700372FF32001370710373FF3300 136C6E4600EEE0A0E000A3A6F833F265 63036402F029D3457305F129D3457305 F229D34500EE00000000000060146102 F729D01500EE600A610C62096305A3CE D015F31E700572FF320013C000EE9090 909060E090E090E0E090E09090202020 202090906090900000600000F090F080 80F080F010F0E090E090900000000000 00000000000000000000000000000000 121A4A4D4E203139393120534F465457 41524553208080FF00006300670000E0 A21760006100D01171FFD01171017008 304012267101A215D01270FFD0127001 7102311F12386008611062046437650F 6602D011D4516801E8A162026802E8A1 62046807E8A16201680AE8A16203680B E8A16602680FE8A16604680CE8A16601 680DE8A16603420171FF420270FF4203 710142047001460175FF460274FF4603 750146047401D0113F0012B4D4513F00 12B81256770112BA7301680078013800 12BC00E060086104F329D0156034F729 D01568007801380012D4430812E44708 12E4121E12E400000000000000000000 00000000000000000000000000000000 A2CC6A0761006B086000D01170087BFF 3B00120A71047AFF3A00120666006710 A2CD6020611ED011631D623F820277FF 470012AAFF0AA2CBD23165FFC4013401 64FFA2CD6C006E04EEA16CFF6E06EEA1 6C01D01180C4D0114F01129842006401 423F64FF43006501431F12A4A2CBD231 82448354D2313F011242431E12986A02 FA187601467012AAD231C401340164FF C501350165FF12426A03FA18A2CBD231 73FF1236A2CBD2311228A2CDD011A2F0 F633F2656318641BF029D3457305F129 D3457305F229D34512C8018044FF0000 00000000000000000000000000000000