GS33 shell.bin reference: known hardware addresses B0000000 N64 ROM (10000000) B2000000 N64 ROM, mirrored BE000000 GS ROM, mirrored BE400000 GS parallel port, lower halfword BE500000 likely nothing BE5FFFFC LCD controller note this can only be read via proper PI transfer BEC00000 GS ROM lower halfword, when read bytewise BEE00000 GS ROM lower halfword, when read bytewise BEF00000 GS ROM upper halfword, when read bytewise BEF40000 GS ROM upper halfword, when read bytewise BEF80000 GS ROM upper halfword, when read bytewise BEFC0000 GS ROM upper halfword, when read bytewise memory allocation headers: 0x0 2 "DM" dynamic memory 0x2 1 type 'R' reserved 'F' free 'T' terminator '~' NULL 0x3 1 RESERVED 0x4 4 p->next entry 0x8 4 p->data 0xC 4 size +_+ 80000000-80101000 copy of first 101000 bytes from cart ROM 80110000-80150000 copy of first 40000 bytes of GS ROM +_+ dASM: 80200400 entry point ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 802185CC ;V0=COP0 Status NOP ADDIU A0,R0,FFFE AND A0,V0,A0 ;A0=Status & ~1 LUI V1,8025 JAL 802185DC ;A0->COP0 Status SW V0,8F98 (V1) ;V0->80248F98: COP0 (except int.enabled) JAL 80217CD0 ;set hardware addy -> A0; save 0E to cur.addy+400 LUI A0,BE00 ;A0=BE000000: GScart LUI A0,8000 ORI A0,A0,0318 ;A0=80000318 LUI V0,8025 LUI V1,8025 SW A0,91C0 (V0) ;80000318->802491C0: p->size of RAM ADDIU V0,R0,0001 SW V0,9100 (V1) ;1->80249100: correct RAM size (set to 0 by EE codetype) LUI V0,8025 SW R0,9120 (V0) ;0->80249120: do not use alt.hook (set to 1 by CC codetype) LW V1,0000 (A0) ;V1=80000318: size of RAM (4MB or 8MB) LUI V0,8025 SW V1,9110 (V0) ;V1->80249110: size of RAM JAL 802006F4 NOP JAL 802067F0 ;display A0 to LCD screen ADDU A0,R0,R0 JAL 8021210C NOP JAL 80200488 ADDU A0,V0,R0 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80200488: accepts: A0=??? LUI V0,8025 LW V0,9124 (V0) ;V0=80249124: p->codelist ADDIU SP,SP,FFE0 SW S0,0010 (SP) SW RA,0018 (SP) SW S1,0014 (SP) LUI AT,A440 SW R0,0000 (AT) ;reset VI Status LUI AT,A000 SW V0,0200 (AT) ;codelist location->A0000200: set p->codelist location JAL 802076E0 ;replace GS checksum and update ROM ADDU S0,A0,R0 ;S0=A0: 0 if 4MB? //802004B8: BEQ S0,R0,802004C4 ;branch if 4MB? ADDU A0,R0,R0 ;A0=0 ADDIU A0,R0,002E ;A0=2E: '.' //802004C4: move codelist if applicable JAL 802067F0 ;display A0 to LCD screen NOP LUI V0,8022 LW V0,7BF4 (V0) ;V0=80227BF4: FALSE if custom codelist location BNE V0,R0,802004F4 ;branch if standard codelist location LUI V0,8025 BEQ S0,R0,802004F0 ;branch if 4MB? LUI V0,8022 LW V0,7BDC (V0) ;V0=80227BDC: p->target codelist location LUI AT,A000 SW V0,0200 (AT) ;V0->A0000200: set codelist location //802004F0: detect if forcing memory size LUI V0,8025 LW V0,9100 (V0) ;V0=80249100: 0 if EE codetype used ADDIU S1,R0,0001 BNE V0,S1,80200510 ;branch if EE codetype used //80200500: reset size of RAM detected by N64 cart LUI V0,8025 LW V0,9110 (V0) ;V0=80249110: size of RAM LUI AT,A000 SW V0,0318 (AT) ;V0->A0000318: set size of RAM detected by N64 cart //80200510: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP LUI V0,007F LUI V1,8025 LW V1,9110 (V1) ;V1=80249110: size of RAM ORI V0,V0,FFFF ;V0=7FFFFF SLT V0,V0,V1 ;TRUE if 8MB exp.pak BEQ V0,R0,80200550 ;branch if 4MB //80200530: N64 detects 8MB LUI V0,8022 LW V0,7560 (V0) ;V0=80227560: BNE V0,S1,80200550 ;branch if V0 not 1 LUI A0,8078 JAL 802185AC ;JAL 80780800 ORI A0,A0,0800 ;A0=80780800: trainer entry point? J 802005B8 NOP //80200550: N64 detects 4MB BEQ S0,R0,802005B8 ;branch if 4MB LUI V0,8025 LW V1,9110 (V0) ;V1=80249110: size of RAM LUI V0,0080 BNE V1,V0,80200590 ;branch if 8MB exp.pak not detected LUI V0,8025 LUI V0,8022 LW V1,7BF4 (V0) ;V1=80227BF4: FALSE if custom codelist location ADDIU V0,R0,0001 BNE V1,V0,80200590 ;branch if using custom codelist location LUI V0,8025 LUI V0,A07C ORI V0,V0,5C00 ;V0=A07C5C00 LUI AT,A000 SW V0,0200 (AT) ;A07C5C00->A0000200: set std. 8MB codelist location LUI V0,8025 //80200590: figure out which handler to hook with LW V1,9120 (V0) ;V1=80249120: use alt.hook ADDIU V0,R0,0001 BNE V1,V0,802005B0 ;branch if CC command not used NOP JAL 80218240 ;special CC hook NOP J 802005B8 NOP //802005B0: normal operation JAL 80218190 ;normal hook NOP //802005B8: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 802005DC NOP //802005C8: return LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 802005DC: LUI V0,8022 LW V0,7BD0 (V0) ;V0=80227BD0: TRUE if using special entrypoint ADDIU SP,SP,FFD8 SW S0,0010 (SP) LUI S0,B000 LW S0,0008 (S0) ;S0=B0000008: p->N64 entry point SW RA,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) BEQ V0,R0,80200610 ;branch if using standard entrypoint SW S1,0014 (SP) LUI V0,8022 LW S0,7BD4 (V0) ;S0=80227BD4: special entrypoint //80200610: LUI V0,8010 SLTU V0,V0,S0 ;TRUE if entrypoint < 80100000 BEQ V0,R0,8020062C ;branch if later entrypoint LUI V0,0010 LUI S0,8000 J 80200630 ORI S0,S0,0400 ;S0=80000400: oldest known entrypoint //8020062C: ADDU S0,S0,V0 ;S0+=100000 ADDU V1,R0,R0 ;V1=0 init.count ADDU S2,S0,R0 ;S2=S0: entrypoint ADDU A1,S2,R0 ;A1=S2: entrypoint LUI V0,8022 ADDIU A0,V0,840C ;A0=8021840C //80200644: copy code to entrypoint LW V0,0000 (A0) ;V0=op ADDIU A0,A0,0004 ;V0+=4: source+=4 ADDIU V1,V1,0001 ;V1++ SW V0,0000 (A1) ;V0->A1+0: op->target SLTI V0,V1,0040 BNE V0,R0,80200644 ;loop 64 times ADDIU A1,A1,0004 ;A1+=4: target+=4 //80200660: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP LUI V0,8022 LW V0,7BD0 (V0) ;V0=80227BD0: TRUE if using special entrypoint LUI S0,B000 LW S0,0008 (S0) ;S0=B0000008: entrypoint BEQ V0,R0,80200684 ;branch if normal entrypoint LUI V0,8022 LW S0,7BD4 (V0) ;S0=80227BD4: special entrypoint //80200684: LUI S1,B000 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM ORI S1,S1,1000 ;S1=B0001000 ADDU V1,R0,R0 ;V1=0 init.count ADDIU S3,S2,1000 ;S3=S2+1000: entrypoint+1000 ADDU A1,S3,R0 ;A1=entrypoint+1000 LUI V0,8025 ADDIU A0,V0,B110 ;A0=8024B110: p->inicodelist //802006A4: copy 100 ops from entrypoint to entrypoint+1000 LW V0,0000 (A0) ;V0=source+0: op ADDIU A0,A0,0004 ;A0+=4 source+=4 ADDIU V1,V1,0001 ;V1++ count++ SW V0,0000 (A1) ;V0->target+0: op->target SLTI V0,V1,0064 BNE V0,R0,802006A4 ;loop 100 times ADDIU A1,A1,0004 ;A1+=4 target+=4 //802006C0: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP ADDU A0,S0,R0 ;A0=S0: p->entrypoint ADDU A1,S1,R0 ;A1=S1: B0001000 JALR RA,S2 ;JAL to entrypoint ADDU A2,S3,R0 ;A2=S3: entrypoint+1000 //802006D8: LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 802006F4 ADDIU SP,SP,FFE8 LUI V0,0040 SW RA,0014 (SP) SW S0,0010 (SP) LUI AT,A000 SW V0,0318 (AT) ;4MB->A0000318: manually set RAM size to 4MB, which seems odd to me really... JAL 80217610 ;clear LCD display LUI S0,8022 JAL 802067F0 ;display A0 to LCD screen ADDIU A0,R0,0030 ;A0='0' JAL 80215470 ADDU A0,R0,R0 JAL 80207A50 NOP //8020072C: set up "dynamic" memory allocations LUI A0,8008 ;A0=80080000: p->start JAL 80215798 ;set up dynamic memory table spanning from A0 to A1 LUI A1,8018 ;A1=80180000: p->end //80200738: JAL 80215804 ;V0=p->A0 bytes of allocated memory ADDIU A0,R0,002C ;A0=2C bytes ADDIU A0,R0,002C ;A0=2C bytes LUI V1,8025 //80200748: JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,9950 (V1) ;V0->80249950: p->??? ADDIU A0,R0,002C ;A0=2C bytes LUI V1,8025 //80200758: JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,9AEC (V1) ;V0->80249AEC: ADDIU A0,R0,002C ;A0=2C bytes LUI V1,8025 //80200768: JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,9AF0 (V1) ;V0->80249AF0: LUI A0,0001 ;A0=1MB LUI V1,8025 //80200778: JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,A6F8 (V1) ;V0->8024A6F8: ORI A0,R0,8000 ;A0=8000 bytes LUI V1,8024 //80200788: JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,2C50 (V1) ;V0->80242C50: ADDU A0,R0,R0 LUI V1,8024 //80200798: JAL 802061C0 SW V0,4D7C (V1) ;V0->80244D7C: JAL 80215960 NOP ADDU A2,R0,R0 ;A2=0 ADDU A3,R0,R0 ;A3=0 LUI V0,F7BC ORI V0,V0,F7BC ;V0=F7BCF7BC LUI V1,F7BC ORI V1,V1,F7BC ;V1=F7BCF7BC LUI AT,8025 SW A2,91B8 (AT) LUI AT,8025 SW A3,91BC (AT) LUI AT,8025 SW V0,9AE0 (AT) ;F7BCF7BC->80249AE0: LUI AT,8025 SW V1,9AE4 (AT) ;F7BCF7BC->80249AE4: //802007E0: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80212C6C NOP JAL 8020E310 SW R0,7BE8 (S0) ;0->80227BE8: #games defaults to 0 JAL 8020E588 ;V0=#games in current codelist NOP JAL 80210958 ;copy and load settings from hardware SW V0,7BE8 (S0) ;V0->80227BE8: #games JAL 8020ED6C ;V0=total #codes in all game headings NOP JAL 802069D8 ;copy keycode list to 802491E0 NOP //80200818: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80200828 LUI V0,8022 ADDIU A2,V0,51B0 ADDU V1,A0,A2 SLTU V0,A0,V1 BEQ V0,R0,80200864 LUI V0,8022 ADDIU A2,V0,5300 LBU V0,0000 (A0) ADDU V0,V0,A2 LBU V0,0000 (V0) ADDIU A0,A0,0001 SB V0,0000 (A1) SLTU V0,A0,V1 BNE V0,R0,80200844 ADDIU A1,A1,0001 JR RA NOP 8020086C strncpy(A0,A1,A2), converting mempak charset to GS internal accepts: A0=p->source, A1=p->target, A2=size ADDU V1,A0,A2 ;V=A0+A2: p->source+size? SLTU V0,A0,V1 BEQ V0,R0,80200920 ;return if size negative LUI V0,8022 ADDIU A2,V0,5200 ;A2=80225200: p->char translation table ADDIU T1,R0,00DF ;T1=DF ADDIU A3,R0,00DE ;A3=DE ADDU T0,V1,R0 ;T0=V1: p->end //8020088C: alias semi-voiced with original, which is a very silly concept LBU V1,0000 (A0) ;V1=source+offset: mempak.char SLTIU V0,V1,0090 BNE V0,R0,802008B8 ;branch if mempak.char 0-8F (start semi-voiced) SLTIU V0,V1,008B ADDU V0,V1,R0 ;V0=V1: mempak.char ADDU V0,V0,A2 ;V0+=p->table LBU V0,FFD9 (V0) ;V0=table+mempak.char#-27: GS.char SB V0,0000 (A1) ;GS.char->target+offset ADDIU A1,A1,0001 ;A1++ target++ J 80200910 SB T1,0000 (A1) ;DF->target+offset: //802008B8: alias voiced with original, which is a very silly concept BNE V0,R0,802008DC ;branch if mempak.char 0-8A (later voiced) SLTIU V0,V1,007C LBU V0,0000 (A0) ;V0=source+offset: mempak.char ADDU V0,V0,A2 ;V0+=p->table LBU V0,FFDE (V0) ;V0=table+mempak.char#-22: GS.char SB V0,0000 (A1) ;GS.char->target+offset ADDIU A1,A1,0001 ;A1++ target++ J 80200910 SB A3,0000 (A1) ;DE->target+offset: //802008DC: alias voiced with original, which is a very silly concept BNE V0,R0,80200900 ;branch if mempak.char 0-7B (start voiced) NOP LBU V0,0000 (A0) ;V0=source+offset: mempak.char ADDU V0,V0,A2 ;V0+=p->table LBU V0,FFD9 (V0) ;V0=table+mempak.char#-27: GS.char SB V0,0000 (A1) ;GS.char->target+offset ADDIU A1,A1,0001 ;A1++ target++ J 80200910 SB A3,0000 (A1) ;DE->target+offset: //80200900: read normal entries from table LBU V0,0000 (A0) ;V0=source+offset: mempak.char ADDU V0,V0,A2 ;V0+=p->table LBU V0,0000 (V0) ;V0=table+mempak.char#: GS.char SB V0,0000 (A1) ;GS.char->target+offset //80200910: loop for size ADDIU A0,A0,0001 ;A0++ source++ SLTU V0,A0,T0 BNE V0,R0,8020088C ;loop until end ADDIU A1,A1,0001 ;A1++ target++ //80200920: return JR RA SB R0,0000 (A1) ;0->target+size: NULL terminator 80200928 set custom conversion for mempak char A0 to GS char A1 accepts: A0=slot, A1=value LUI V0,8022 ADDIU V0,V0,5200 ;V0=80225200 ADDU A0,A0,V0 JR RA SB A1,0000 (A0) ;A1->80225200+offset: alter char conversion slot 8020093C likely data ;JAL 802008D8 80200940 copy save game data from controller paks and N64 ADDIU SP,SP,FFC8 SW S5,002C (SP) LUI S5,B000 ORI S5,S5,003B ;S5=B000003B: game ID+version SW S6,0030 (SP) ADDIU S6,R0,0005 ;S6=5 ADDIU A0,R0,004F ;A0=4F: 8022524F ADDIU A1,R0,00DD ;A1=DD SW RA,0034 (SP) SW S4,0028 (SP) SW S3,0024 (SP) SW S2,0020 (SP) SW S1,001C (SP) //80200974: reset controller state JAL 80200928 ;set custom conversion for mempak char A0 to GS char A1 SW S0,0018 (SP) ADDIU A0,R0,004A ;A0=4A: 8022524A JAL 80200928 ;set custom conversion for mempak char A0 to GS char A1 ADDIU A1,R0,00AF ;A1=AF ADDIU A0,R0,0045 ;A0=45: 80225245 JAL 80200928 ;set custom conversion for mempak char A0 to GS char A1 ADDIU A1,R0,00A7 ;A1=A7 JAL 80201D44 ;reset controller and cart eeprom status ADDU S3,R0,R0 ;S3=0 init.count JAL 80201E64 ;V0=TRUE if controller 1 slot filled NOP //802009A4: set 80242050-80242A50 to zero LUI A0,8024 ADDIU A0,A0,2050 ;A0=80242050: p->target ADDU A1,R0,R0 ;A1=0 LUI V0,8025 LW S4,9128 (V0) ;S4=80249128: PIFram buffer JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,0A00 ;A2=A00: size //802009C0: initialize 80240020-38, 80242038-50, 80242D00-18 LUI V0,8024 ADDIU A1,V0,0020 ;A1=80240020 LUI V0,8024 ADDIU A0,V0,2038 ;A0=80242038 LUI V0,8024 ADDIU V1,V0,2D00 ;V1=80242D00 //802009D8: loop six times to initialize tables SW R0,0000 (V1) ;0->80242D00+offset: reset device present flags SW R0,0000 (A0) ;0->80242038+offset: SW R0,0000 (A1) ;0->80240020+offset: ADDIU A1,A1,0004 ;A1+=4 ADDIU A0,A0,0004 ;A0+=4 ADDIU S3,S3,0001 ;S3++ count++ SLTI V0,S3,0006 BNE V0,R0,802009D8 ;loop six times ADDIU V1,V1,0004 ;V1+=4 //802009FC: LUI V0,8022 LW V0,7424 (V0) ;V0=80227424: BLEZ V0,80200A1C LUI V0,8024 ADDIU V1,R0,0001 SW V1,204C (V0) ;1->8024204C: LUI V0,8024 SW V1,2D14 (V0) ;1->80242D14: //80200A1C: check if device in controller 1 slot LBU V0,0006 (S4) ;V0=PIFram buffer+6: controller 1 slot state ANDI V0,V0,0001 ;V0=TRUE if slot filled BEQ V0,R0,80200A34 ;skip if no device present LUI V1,8024 ADDIU V0,R0,0001 SW V0,2D04 (V1) ;1->80242D04: device flag //80200A34: check if device in controller 2 slot LBU V0,000D (S4) ;V0=PIFram buffer+D: controller 2 slot state ANDI V0,V0,0001 ;V0=TRUE if slot filled BEQ V0,R0,80200A4C ;skip if no device present LUI V1,8024 ADDIU V0,R0,0001 SW V0,2D08 (V1) ;1->80242D08: device flag //80200A4C: check if device in controller 3 slot LBU V0,0014 (S4) ;V0=PIFram buffer+14: controller 3 slot state ANDI V0,V0,0001 ;V0=TRUE if slot filled BEQ V0,R0,80200A64 ;skip if no device present LUI V1,8024 ADDIU V0,R0,0001 SW V0,2D0C (V1) ;1->80242D0C: device flag //80200A64: check if device in controller 4 slot LBU V0,001B (S4) ;V0=PIFram buffer+1B: controller 4 slot state ANDI V0,V0,0001 ;V0=TRUE if slot filled BEQ V0,R0,80200A7C ;skip if no device present LUI V1,8024 ADDIU V0,R0,0001 SW V0,2D10 (V1) ;1->80242D10: device flag //80200A7C: LUI V0,8024 ADDIU S1,V0,2D00 ;S1=80242D00: device present flags LW V0,0004 (S1) ;V0=80242D04: controller 1 slot flag ADDIU S0,R0,0001 BNE V0,S0,80200A9C ;branch if slot 1 empty NOP JAL 80201EE0 ADDU A0,S0,R0 ;A0=1: slot# //80200A9C: LW V0,0008 (S1) ;V0=80242D08: controller 2 slot flag BNE V0,S0,80200AB0 ;branch if slot 2 empty NOP JAL 80201EE0 ADDIU A0,R0,0002 ;A0=2: slot# //80200AB0: LW V0,000C (S1) ;V0=80242D0C: controller 3 slot flag BNE V0,S0,80200AC4 ;branch if slot 3 empty NOP JAL 80201EE0 ADDIU A0,R0,0003 ;A0=3: slot# //80200AC4: LW V0,0010 (S1) ;V0=80242D10: controller 4 slot flag BNE V0,S0,80200AD8 ;branch if slot 4 empty NOP JAL 80201EE0 ADDIU A0,R0,0004 ;A0=4: slot# //80200AD8: JAL 80201164 ;generate table of note entry names for mempak A0 ADDIU A0,R0,0001 ;A0=1 controller 1 JAL 80201164 ;generate table of note entry names for mempak A0 ADDIU A0,R0,0002 ;A0=2 controller 2 JAL 80201164 ;generate table of note entry names for mempak A0 ADDIU A0,R0,0003 ;A0=3 controller 3 JAL 80201164 ;generate table of note entry names for mempak A0 ADDIU A0,R0,0004 ;A0=4 controller 4 //80200AF8: initialize more tables LUI S0,8025 ADDIU A0,S0,9AB0 ;A0=80249AB0 ADDU A1,R0,R0 ;A1=0 JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,0008 ;A2=8 LUI S2,8025 ADDIU S1,S2,A910 ;S1=8024A910 ADDU A0,S1,R0 ;A0=8024A910 ADDU A1,R0,R0 ;A1=0 JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,0800 ;A2=800 //80200B24: read eeprom block 0 and copy to buffer JAL 80222110 ;read eeprom block A0 ADDU A0,R0,R0 ;A0=0 ADDIU T9,S0,9AB0 ;T9=80249AB0: first dw of eeprom LWL T6,0008 (S4) ;T6=PIFram buffer+8: source+0 LWR T6,000B (S4) LWL T7,000C (S4) ;T7=PIFram buffer+C: source+4 LWR T7,000F (S4) SWL T6,0000 (T9) ;T6->eeprom.dw+0 SWR T6,0003 (T9) SWL T7,0004 (T9) ;T7->eeprom.dw+4 SWR T7,0007 (T9) LUI S0,8022 ADDIU T9,S0,742C ;T9=8022742C: "ChrisU" LWL T6,0000 (T9) ;T6=str+0 LWR T6,0003 (T9) LWL T7,0004 (T9) ;T7=str+4 LWR T7,0007 (T9) SWL T6,0008 (S4) ;T6->PIFram buffer+8 SWR T6,000B (S4) SWL T7,000C (S4) ;T7->PIFram buffer+C SWR T7,000F (S4) //80200B78: write eeprom block 0 JAL 802221F0 ;write preset data to eeprom block A0 ADDU A0,R0,R0 ;A0=0 ADDIU A0,S4,0008 ;A0=S4+8: PIFram buffer+8 ADDU A1,R0,R0 ;A1=0 JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,0008 ;A2=8 JAL 80222110 ;read eeprom block A0 ADDU A0,R0,R0 ;A0=0 ADDIU A1,R0,0001 ;A1=1 eeprom present flag ADDU S3,R0,R0 ;S3=0 init.count ADDIU S0,S0,742C ;S0=8024742C: "ChrisU" ADDIU T9,S2,A910 ;T9=8024A910: write test buffer LWL T6,0008 (S4) ;T6=PIFram buffer+8: source+0 LWR T6,000B (S4) LWL T7,000C (S4) ;T6=PIFram buffer+C: source+4 LWR T7,000F (S4) SWL T6,0000 (T9) ;T6->test.buffer+0 SWR T6,0003 (T9) SWL T7,0004 (T9) ;T7->test.buffer+4 SWR T7,0007 (T9) //80200BC8: test if write capable (if eeprom exists, in other words) ADDU V0,S3,S0 ;V0=8024742C+count: str ADDU V1,S3,S1 ;V1=8024A910+count: test LBU A0,0000 (V0) ;A0=str+offset: source LBU V0,0000 (V1) ;V0=test+offset: result BNEL A0,V0,80200BE0 ;A1=0 if no match present ADDU A1,R0,R0 //80200BE0: loop to test entire string ADDIU S3,S3,0001 ;S3++ count++ SLTI V0,S3,0006 BNE V0,R0,80200BCC ;test 6 bytes ADDU V0,S3,S0 LUI V0,8022 LW V1,741C (V0) ;V1=8022741C: BNEL V1,R0,80200C00 ;if 8022741C set, force detect eeprom ADDIU A1,R0,0001 //80200C00: ADDIU V0,R0,0001 BNE A1,V0,80201074 ;branch if eeprom not detected LUI V0,8025 LUI V0,8022 LW V0,7424 (V0) ;V0=80227424: BNE V0,R0,80201074 ;skip eeprom if set LUI V0,8025 BNE V1,R0,80200CA4 ;skip if forced detection ADDU S1,R0,R0 ;S1=0 init.match.count ADDU S3,S1,R0 ;S3=0 init.eeprom.count LUI V0,8025 ADDIU S0,V0,A910 ;S0=8024A910: eeprom buffer //80200C30: copy eeprom to buffer JAL 80222110 ;read eeprom block A0 ADDU A0,S3,R0 ;A0=S3: eeprom.count LWL T6,0008 (S4) ;T6=PIFram buffer+8: source+0 LWR T6,000B (S4) LWL T7,000C (S4) ;T7=PIFram buffer+C: source+4 LWR T7,000F (S4) SWL T6,0000 (S0) ;T6->eeprom.buffer+0 SWR T6,0003 (S0) SWL T7,0004 (S0) ;T7->eeprom.buffer+4 SWR T7,0007 (S0) ADDIU S3,S3,0001 ;S3++ eeprom.count++ SLTI V0,S3,0100 BNE V0,R0,80200C30 ;loop through eeprom ADDIU S0,S0,0008 ;S0+=8 next dw in buffer //80200C68: ADDU S3,R0,R0 ;S3=0 init.count LUI V0,8022 ADDIU A2,V0,742C ;A2=8022742C: "ChrisU" LUI V0,8025 ADDIU A1,V0,A910 ;A1=8024A910: eeprom.buffer ADDU V0,S3,A2 ;V0=str+count //80200C80: compare eeprom buffer with string ADDU V1,S3,A1 ;V1=eeprom.buffer+count LBU A0,0000 (V0) ;A0=str+offset LBU V0,0000 (V1) ;V0=buffer+offset BEQL A0,V0,80200C94 ;if chars match, match.count++ ADDIU S1,S1,0001 //80200C94: loop through string ADDIU S3,S3,0001 ;S3++ count++ SLTI V0,S3,0006 BNE V0,R0,80200C80 ;loop six times ADDU V0,S3,A2 ;V0=str+count //80200CA4: ADDIU V0,R0,0006 BEQ S1,V0,80200CBC ;branch if string matches LUI V0,8022 LW V0,741C (V0) ;V0=8022741C: BEQ V0,R0,80201074 ;skip if not set LUI V0,8025 //80200CBC: generate entry named after ROM ID ADDU A3,R0,R0 ;A3=0 init.count LUI V0,8024 ADDIU V1,R0,0001 SW V1,2D14 (V0) ;1->80242D14: LUI V0,8024 SW V1,204C (V0) ;1->8024204C: LUI V0,8025 ADDIU A0,V0,9AF8 ;A0=80249AF8: mempak paging files SB R0,0A15 (A0) ;0->A0+A15: 0->8024A50D SB R0,0A16 (A0) ;0->A0+A16: 0->8024A50E SB R0,0A17 (A0) ;0->A0+A17: 0->8024A50F SB R0,0A18 (A0) ;0->A0+A18: 0->8024A510 SB R0,0A19 (A0) ;0->A0+A19: 0->8024A511 SB R0,0A1A (A0) ;0->A0+A1A: 0->8024A512 SB R0,0A1B (A0) ;0->A0+A1B: 0->8024A513 SB R0,0A1C (A0) ;0->A0+A1C: 0->8024A514 SB R0,0A1D (A0) ;0->A0+A1D: 0->8024A515 SB R0,0A1E (A0) ;0->A0+A1E: 0->8024A516 SB R0,0A1F (A0) ;0->A0+A1F: 0->8024A517 LBU V1,0001 (S5) ;V1=ROM+3C: ID[1] ADDIU V0,R0,0011 SB V0,0A0C (A0) ;V0->A0+A0C: '1'->8024A504 SB R0,0A0D (A0) ;0->A0+A0D: 0->8024A505 SB R0,0A0E (A0) ;0->A0+A0E: 0->8024A506 SB R0,0A0F (A0) ;0->A0+A0F: 0->8024A507 ADDIU V1,V1,FFD9 ;V1-=27: letter->mempakfont# SB V1,0A10 (A0) ;letter1->A0+A10: letter1->8024A508 LBU V0,0002 (S5) ;V0=ROM+3D: ID[2] LBU V1,0001 (S5) ;V1=ROM+3C: ID[1] ADDIU V0,V0,FFD9 ;V0-=27: letter->mempakfont# ADDIU V1,V1,FFD9 ;V1-=27: letter->mempakfont# SB V0,0A11 (A0) ;letter1->A0+A11: letter1->8024A509 SB V1,0A12 (A0) ;letter2->A0+A12: letter2->8024A50A LBU V0,0002 (S5) ;V0=ROM+3D: ID[2] SLL T1,S6,0x9 ;T1=5*200: channel offset ADDU V1,V0,R0 ;V1=V0: second letter of game ID code ADDIU V0,V0,FFD9 ;V0-=27: letter->mempakfont# ADDIU V1,V1,FFD9 ;V1-=27: letter->mempakfont# SB V0,0A13 (A0) ;letter2->A0+A13: letter2->8024A50B ADDU V0,T1,A0 ;V0=A0+channel*200 SB V1,0A14 (A0) ;letter2->A0+A14: letter2->8024A50C SB R0,0A14 (A0) ;0->A0+A14: 0->8024A50C //80200D64: test name of new entry LBU V0,0010 (V0) ;V0=saved.mempak+10: char f/name BEQ V0,R0,80200E04 ;branch if NULL ADDU S3,A3,R0 ADDU T2,A0,R0 LUI V0,8022 ADDIU T5,V0,53FC ADDIU T4,R0,002F LUI V0,8024 ADDIU T3,V0,2050 ADDU A1,A3,R0 //80200D8C: SLTI V0,A3,0010 BEQ V0,R0,80200E04 ADDU T0,T1,R0 ADDU A2,A1,T0 ADDU V0,A2,T2 LBU V1,0010 (V0) ADDIU A0,V1,0020 ADDU V1,A0,R0 ANDI V0,V1,00FF SLTIU V0,V0,003A BEQL V0,R0,80200DBC ADDIU V1,A0,0007 //80200DBC: ANDI A0,V1,00FF SLTIU V0,A0,005B BNE V0,R0,80200DDC ANDI V0,V1,00FF ADDU V0,A0,T5 LBU V0,FFA5 (V0) ADDIU V1,V0,0020 ANDI V0,V1,00FF //80200DDC: BEQL V0,T4,80200DE4 ADDIU V1,R0,0020 //80200DE4: ADDIU A1,A1,0001 ADDU V0,A2,T3 SB V1,0000 (V0) ADDU V0,A1,T0 ADDU V0,V0,T2 LBU V0,0010 (V0) BNE V0,R0,80200D8C ADDIU A3,A3,0001 //80200E04: BLEZ A3,80200E30 LUI A0,8024 ADDIU A0,A0,2050 SLL V0,S3,0x5 ADDU V0,A3,V0 SLL V1,S6,0x9 ADDU V0,V0,V1 ADDU V0,V0,A0 ADDIU V1,R0,002E SB V1,0000 (V0) ADDIU A3,A3,0001 SLL A2,S3,0x5 SLL A1,S6,0x9 LUI V0,8025 ADDIU V1,V0,9AF8 ADDU V0,A2,A1 ADDU V0,V0,V1 LBU V0,000C (V0) BEQ V0,R0,80200EF8 ADDU S1,R0,R0 ADDU T2,V1,R0 LUI V0,8022 ADDIU T5,V0,53FC ADDIU T4,R0,002F LUI V0,8024 ADDIU T3,V0,2050 SLTI V0,S1,0004 BEQ V0,R0,80200EF8 ADDU T1,A2,R0 ADDU V0,S1,T1 ADDU T0,A1,R0 ADDU V0,V0,T0 ADDU V0,V0,T2 LBU V1,000C (V0) ADDIU A0,V1,0020 ADDU V1,A0,R0 ANDI V0,V1,00FF SLTIU V0,V0,003A BEQL V0,R0,80200EA4 ADDIU V1,A0,0007 //80200EA4: ANDI A0,V1,00FF SLTIU V0,A0,005B BNE V0,R0,80200EC4 ANDI V0,V1,00FF ADDU V0,A0,T5 LBU V0,FFA5 (V0) ADDIU V1,V0,0020 ANDI V0,V1,00FF //80200EC4: BEQL V0,T4,80200ECC ADDIU V1,R0,0020 //80200ECC: ADDU V0,A3,A2 ADDIU S1,S1,0001 ADDU V0,V0,A1 ADDU V0,V0,T3 SB V1,0000 (V0) ADDU V0,S1,T1 ADDU V0,V0,T0 ADDU V0,V0,T2 LBU V0,000C (V0) BNE V0,R0,80200E6C ADDIU A3,A3,0001 BEQL S1,R0,80200F00 ADDIU A3,A3,FFFF //80200F00: LUI V0,8024 ADDIU S5,V0,2050 SLL V0,S3,0x5 ADDU V0,A3,V0 SLL S1,S6,0x9 ADDU V0,V0,S1 ADDU V0,V0,S5 SB R0,0000 (V0) LUI V0,8022 LW V0,741C (V0) BNEL V0,R0,8020100C LUI S0,8024 ADDIU S3,R0,0006 ADDU A1,R0,R0 LUI V1,8022 ADDIU A2,V1,742C LUI V0,8025 ADDIU A0,V0,A910 LBU A3,742C (V1) ADDU V0,S3,A0 LBU V0,0000 (V0) BNEL A3,V0,80200FC4 ADDIU S3,S3,0001 ADDU V0,S3,A0 LBU V1,0001 (A2) LBU V0,0001 (V0) BNEL V1,V0,80200FC4 ADDIU S3,S3,0001 ADDU V0,S3,A0 LBU V1,0002 (A2) LBU V0,0002 (V0) BNEL V1,V0,80200FC4 ADDIU S3,S3,0001 ADDU V0,S3,A0 LBU V1,0003 (A2) LBU V0,0003 (V0) BNEL V1,V0,80200FC4 ADDIU S3,S3,0001 ADDU V0,S3,A0 LBU V1,0004 (A2) LBU V0,0004 (V0) BNEL V1,V0,80200FC4 ADDIU S3,S3,0001 ADDU V0,S3,A0 LBU V1,0005 (A2) LBU V0,0005 (V0) BEQL V1,V0,80200FC0 ADDIU A1,R0,0001 //80200FC0: ADDIU S3,S3,0001 SLTI V0,S3,0800 BEQ V0,R0,80200FDC LUI V1,8022 BEQ A1,R0,80200F50 ADDU V0,S3,A0 LUI V1,8022 //80200FDC: ADDIU V0,S3,FFFF SW V0,7424 (V1) ADDU A0,V0,R0 LUI V0,8024 ADDIU V0,V0,2050 SLL V1,S6,0x9 BGEZ A0,80201000 ADDU V1,V1,V0 ADDIU A0,S3,00FE //80201000: SRA V0,A0,0x8 J 80201070 SB V0,001F (V1) //8020100C: LW A0,2C50 (S0) ;A0=80242C50: p->target JAL 80205320 ;copy FLASHram to A0 LUI S3,8024 ORI A2,R0,8000 ;A2=80000000 LW A0,4D7C (S3) ;A0=80244D7C: LW A1,2C50 (S0) ;A1=80242C50: p->target ADDU A3,R0,R0 ;A3=0 SW R0,0010 (SP) JAL 80216D24 SW R0,0014 (SP) ADDIU V1,V0,00FF LUI S2,8022 ADDU A0,S1,S5 BGEZ V1,8020104C SW V0,7420 (S2) ;V0->80227420: ADDIU V1,V0,01FE //8020104C: ADDU A2,R0,R0 ;A2=0 SRA V0,V1,0x8 SB V0,001F (A0) LW A0,2C50 (S0) ;A0=80242C50: p->target LW A1,4D7C (S3) ;A1=80244D7C: ADDU A3,A2,R0 ;A3=A2: 0 JAL 80217124 ;decompress compressed data A1 to A0 SW R0,0010 (SP) ;SP+10=0 SW V0,7420 (S2) //80201070: correct fried eeprom data LUI V0,8025 ADDIU T9,V0,9AB0 ;T9=80249AB0: org.eeprom buffer LWL T6,0000 (T9) ;T6=org.buffer+0 LWR T6,0003 (T9) LWL T7,0004 (T9) ;T7=org.buffer+4 LWR T7,0007 (T9) SWL T6,0008 (S4) ;T6->PIFram.buffer+8 SWR T6,000B (S4) SWL T7,000C (S4) ;T7->PIFram.buffer+C SWR T7,000F (S4) JAL 802221F0 ;write preset data to eeprom block A0 ADDU A0,R0,R0 ;A0=0 JAL 80222110 ;read eeprom block A0 ADDU A0,R0,R0 ;A0=0 ADDIU S3,R0,0001 ;S3=1 init.count LUI A0,8024 ADDIU V0,A0,2D00 ;V0=80242D00: device present flags ADDIU V1,V0,0004 ;V1=80242D04: devices 1-4 (controllers) LUI V0,8025 ADDIU T9,V0,A910 ;T9=8024A910: eeprom.buffer LWL T6,0008 (S4) ;T6=PIFram.buffer+8: source+0 LWR T6,000B (S4) LWL T7,000C (S4) ;T7=PIFram.buffer+C: source+4 LWR T7,000F (S4) SWL T6,0000 (T9) ;T6->eeprom.buffer+0 SWR T6,0003 (T9) SWL T7,0004 (T9) ;T7->eeprom.buffer+4 SWR T7,0007 (T9) //802010E0: update controller count LW V0,0000 (V1) ;V0=V1+offset: device present flag BEQ V0,R0,802010F8 ;branch if not attached ADDIU S3,S3,0001 ;S3++ count++ LW V0,2D00 (A0) ;V0=80222D00: #controllers ADDIU V0,V0,0001 ;V0++ controller count++ SW V0,2D00 (A0) ;update # controllers //802010F8: loop for each controller SLTI V0,S3,0006 BNE V0,R0,802010E0 ;loop six times ADDIU V1,V1,0004 ;V1+=4 //80201104: fail to printf() debug script, then change custom conversions back LUI V0,8024 LUI A0,8022 LW A1,2D00 (V0) ;A1=80222D00: #controllers JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,2490 ;A0=80222490: "Conrollers found = %d\n" ADDIU A0,R0,004F ;A0=4F: 8022524F JAL 80200928 ;set custom conversion for mempak char A0 to GS char A1 ADDIU A1,R0,00B0 ;A1=B0 ADDIU A0,R0,0045 ;A0=45: 80225245 JAL 80200928 ;set custom conversion for mempak char A0 to GS char A1 ADDIU A1,R0,00A6 ;A1=A6 ADDIU A0,R0,004A ;A0=4A: 8022524A JAL 80200928 ;set custom conversion for mempak char A0 to GS char A1 ADDIU A1,R0,00AB ;A1=AB //8020113C: return LW RA,0034 (SP) LW S6,0030 (SP) LW S5,002C (SP) LW S4,0028 (SP) LW S3,0024 (SP) LW S2,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0038 80201164 generate table of note entry names for mempak A0 accepts: A0=slot# ADDIU SP,SP,FFC8 SW S7,002C (SP) ADDU S7,A0,R0 ;S7=A0: slot# LUI V0,8024 ADDIU V0,V0,2038 ;V0=80242038 SLL V1,S7,0x2 ;V1=slot->offset ADDU V0,V1,V0 ;V0+=offset SW RA,0034 (SP) SW S8,0030 (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S4,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW S1,0014 (SP) SW S0,0010 (SP) SW R0,0000 (V0) ;0->80242038+offset: //802011A8: LUI V0,8024 ADDIU V0,V0,2C58 ;V0=80242C58 ADDU S0,V1,V0 ;S0=80242C58+offset LUI V0,8024 ADDIU V0,V0,2D00 ;V0=80242D00 ADDU V1,V1,V0 ;V1+=V0: 80242D00+offset SW R0,0000 (S0) ;0->80242C58+offset: LW V0,0000 (V1) ;V0=80242D00+offset: device present flag BEQ V0,R0,802014C4 ;return if device not present on slot A0 NOP //802011D0: JAL 80201E84 ;write value A1 to controller slot A0's device manager (block 0x400) ADDU A1,R0,R0 ;A1=0 JAL 802014F4 ADDU A0,S7,R0 ;A0=S7: slot# BLEZ V0,802012E8 ADDIU V0,R0,FFFF ;V0= -1 JAL 80201F90 ADDU A0,S7,R0 ;A0=S7: slot# LUI V0,8025 ADDIU V0,V0,9AF8 ;V0=80249AF8 SLL V1,S7,0x9 ;V1=slot#*0x200 ADDU V1,V1,V0 ;V1+=80249AF8: p->target LUI V0,8025 ADDIU A0,V0,A708 ;A0=8024A708: p->source OR V0,V1,A0 ;V0|=8024A708 ANDI V0,V0,0003 BEQ V0,R0,8020126C ;branch if an aligned address ADDIU V0,A0,0200 ;V0=A0+200: 8024A908 //80201218: LWL T0,0000 (A0) ;T0=source+0 LWR T0,0003 (A0) LWL T1,0004 (A0) ;T1=source+4 LWR T1,0007 (A0) LWL T2,0008 (A0) ;T2=source+8 LWR T2,000B (A0) LWL T3,000C (A0) ;T3=source+C LWR T3,000F (A0) SWL T0,0000 (V1) ;T0->target+0 SWR T0,0003 (V1) SWL T1,0004 (V1) ;T1->target+4 SWR T1,0007 (V1) SWL T2,0008 (V1) ;T2->target+8 SWR T2,000B (V1) SWL T3,000C (V1) ;T3->target+C SWR T3,000F (V1) ADDIU A0,A0,0010 ;A0+=10 source+=10 BNE A0,V0,80201218 ;loop for 200 bytes ADDIU V1,V1,0010 ;V1+=10 target+=10 J 8020129C SLL V0,S7,0x9 ;V0=slot#*0x200 //8020126C: copy aligned memory LW T0,0000 (A0) ;T0=source+0 LW T1,0004 (A0) ;T1=source+4 LW T2,0008 (A0) ;T2=source+8 LW T3,000C (A0) ;T3=source+C SW T0,0000 (V1) ;T0->target+0 SW T1,0004 (V1) ;T1->target+4 SW T2,0008 (V1) ;T2->target+8 SW T3,000C (V1) ;T3->target+C ADDIU A0,A0,0010 ;A0+=10 source+=10 BNE A0,V0,8020126C ;loop for 200 bytes ADDIU V1,V1,0010 ;V1+=10 target+=10 //80201298: SLL V0,S7,0x9 ;V0=slot#*0x200 LUI A0,8025 ADDIU A0,A0,9AF8 ;A0=80249AF8 ADDU A0,V0,A0 ;A0=80249AF8+offset JAL 80217B70 ADDIU A1,R0,0200 ;A1=200 JAL 802017E4 ADDU A0,S7,R0 ;A0=S7: slot# ADDU A0,S7,R0 ;A0=S7: slot# LUI V1,8024 ADDIU V1,V1,2038 ;V1=80242038 SLL S0,S7,0x2 ;S0=slot#->offset ADDU V1,S0,V1 ;V1+=offset: 80242038+offset JAL 802021C4 SW V0,0000 (V1) ;V0->80242038+offset LUI V1,8024 ADDIU V1,V1,0020 ;V1=80240020 ADDU S0,S0,V1 ;S0+=V1: 80242038+offset J 802012F0 SW V0,0000 (S0) ;V0->80242038+offset: //802012E8: fail miserably J 802014C4 ;return SW V0,0000 (S0) ;-1 ->80242C58+offset: //802012F0: ADDU S6,R0,R0 ;S6=0 LUI V0,8025 ADDIU S4,V0,9AF8 ;S4=80249AF8 LUI V0,8024 ADDIU S5,V0,2050 ;S5=80242050 ADDIU S8,R0,002F ;S8=2F SLL S2,S7,0x9 ;S2=slot#*0x200 ADDU S3,S2,R0 ;S3=slot#*0x200 ADDU S1,S6,R0 ;S1=0 init.note# //80201314: ADDU V0,S3,S4 ;V0=80249AF8+offset LBU V0,0010 (V0) ;V0=saved.mempak+10: char f/ save.name BEQ V0,R0,80201354 ;skip if NULL ADDU S0,R0,R0 ;S0=0 init.count LUI V0,8025 ADDIU V1,V0,9AF8 ;V1=80249AF8 SLTI V0,S0,0010 //80201330: S0=strlen BEQ V0,R0,80201358 ;skip if count > 15 ADDU A0,S1,S4 ;A0=80249AF8+S1: saved.mempak + note# ADDIU S0,S0,0001 ;S0++ count++ ADDU V0,S0,S1 ;V0=S0+S1: count + note#: ADDU V0,V0,S2 ;V0+=S2: count + note# + slot#*0x200 ADDU V0,V0,V1 ;V0+=V1: count + note# + slot#*0x200 + 80249AF8 LBU V0,0010 (V0) ;V0=saved mempak+10+offset: next char of save.name BNE V0,R0,80201330 ;loop until a NULL entry SLTI V0,S0,0010 //80201354: ADDU A0,S1,S4 ;A0=80249AF8+S1 ADDU A0,S2,A0 ;A0+=S2: 80249AF8 + note# + slot#*0x200 ADDIU A0,A0,0010 ;A0+=10: 80249AF8 + note# + slot#*0x200 + 0x10: p->save.name ADDU A1,S1,S5 ;A1=80242050+S1 ADDU A1,S2,A1 ;A1+=S2: 80242050 + note# + slot#*0x200: p->save.name list JAL 8020086C ;strncpy(A0,A1,A2), converting mempak charset to GS internal ADDU A2,S0,R0 ;A2=S0: strlen ADDU V0,S0,S1 ;V0=count + S1: ADDU V0,V0,S2 ;V0+=S2: count + note# + slot#*0x200 ADDU V0,V0,S5 ;V0+=S5: count + note# + slot#*0x200 + 80242050: p->save.name LBU V0,0000 (V0) ;V0=char f/ copied save.name BEQ V0,R0,802013BC ;skip if save.name NULL LUI V0,8024 ADDIU A1,V0,2050 ;A1=80242050 ADDU A0,S1,R0 ;A0=S1: note# SLL V1,S7,0x9 ;V1=slot#*0x200 SLTI V0,S0,0010 //80201398: find end of string BEQ V0,R0,802013BC ;skip if count > 15 NOP ADDIU S0,S0,0001 ;S0++ count++ ADDU V0,S0,A0 ;V0=S0+A0: count + note ADDU V0,V0,V1 ;V0+=V1: count + note + slot#*0x200 ADDU V0,V0,A1 ;V0+=A1: count + note + slot#*0x200 + 80242050: p->save.name LBU V0,0000 (V0) ;V0=char f/save.name BNE V0,R0,80201398 ;loop if not NULL SLTI V0,S0,0010 //802013BC: replace NULL with '.' BLEZ S0,802013D8 ;skip if count invalid ADDU V0,S0,S1 ;V0=S0+S1: count + note ADDU V0,V0,S2 ;V0+=S2: count + note# + slot#*0x200 ADDU V0,V0,S5 ;V0+=S5: count + note# + slot#*0x200 + 80242050: p->save.name ADDIU V1,R0,002E SB V1,0000 (V0) ;2E->save.name: overwrite NULL with '.' ADDIU S0,S0,0001 ;S0++ count++ //802013D8: ADDU A1,R0,R0 ;A1=0 init.count ADDU V0,S3,S4 ;V0=slot#*0x200 + 80249AF8: p->saved.mempak LBU V0,000C (V0) ;V0=saved.mempak+C: BEQ V0,R0,8020147C ;skip if NULL ADDU A2,S2,R0 ;A2=S2: slot#*0x200 //802013EC: SLTI V0,A1,0004 BEQ V0,R0,8020147C ;branch if count > 3 ADDU V0,A1,S1 ;V0=count + note ADDU A3,A2,R0 ;A3=A2: slot#*0x200 ADDU V0,V0,A3 ;V0+=A3: count + note + slot#*0x200 ADDU V0,V0,S4 ;V0+=S4: count + note + slot#*0x200 + 80249AF8: p->saved.mempak LBU A0,000C (V0) ;V0=saved.mempak+C: ADDIU V1,A0,0020 ;V1=A0+20: convert value to alpha-numeric ADDU A0,V1,R0 ;A0+=20 ANDI V0,A0,00FF ;V0=A0->char SLTIU V0,V0,003A BEQL V0,R0,80201420 ;if V0 > 3A, increment to alphabetical range ADDIU A0,V1,0007 //80201420: handle ASCII above 'Z' ANDI V1,A0,00FF ;V1=A0->char SLTIU V0,V1,005B BNE V0,R0,80201448 ;skip if a valid alphabetical character (no greater than 'Z') ANDI V0,A0,00FF ;V0=A0->char LUI T0,8022 ADDIU T0,T0,53FC ;T0=802253FC: character alias table ADDU V0,V1,T0 ;V0=table+char LBU V0,FFA5 (V0) ;V0=802253FC+offset-5B: alias value ADDIU A0,V0,0020 ;A0=V0+20: value->character ANDI V0,A0,00FF ;V0=A0->char //80201448: handle '/' BEQL V0,S8,80201450 ;if char = 2F, reset to ' ' ADDIU A0,R0,0020 //80201450: ADDU V0,S0,S1 ;V0=count + note ADDIU A1,A1,0001 ;A1++ char.count++ ADDU V0,V0,A2 ;V0+=A2: count + note + slot#*0x200 ADDU V0,V0,S5 ;V0+=S5: count + note + slot#*0x200 + 80242050: p->save.name SB A0,0000 (V0) ;A0->save.name ADDU V0,A1,S1 ;V0=char.count + note ADDU V0,V0,A3 ;V0+=A3: count + note + slot#*0x200 ADDU V0,V0,S4 ;V0+=S4: count + note + slot#*0x200 + 80249AF8: p->saved.mempak LBU V0,000C (V0) ;V0=saved.mempak+C+offset: BNE V0,R0,802013EC ;loop until NULL ADDIU S0,S0,0001 ;S0++ count++ //8020147C: BNE A1,R0,80201490 ;branch if char.count set ADDU V1,S3,S5 ;V1=slot#*0x200 + 80242050: p->save.name BGTZL S0,80201490 ;if count set, count-- ADDIU S0,S0,FFFF ADDU V1,S3,S5 ;V1=slot#*0x200 + 80242050: p->1st save.name //80201490: ADDU A0,S3,S4 ;A0=slot#*0x200 + 80249AF8: p->saved.mempak ADDIU S3,S3,0020 ;S3+=20: next note in slot ADDU V0,S0,S1 ;V0=count + note ADDU V0,V0,S2 ;V0+=S2: count + note + slot#*0x200 ADDU V0,V0,S5 ;V0+=S5: count + note + slot#*0x200 + 80242050: p->save.name SB R0,0000 (V0) ;0->save.name+offset: NULL terminate SB R0,0010 (V1) ;0->1st save.name+10: LBU V0,0009 (A0) ;V0=saved.mempak+9: ADDIU S6,S6,0001 ;S6++ note# SB V0,001F (V1) ;V0->1st save.name+1F: SLTI V0,S6,0010 BNE V0,R0,80201314 ;loop for each note ADDIU S1,S1,0020 ;S1+=20: next note //802014C4: return LW RA,0034 (SP) LW S8,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 802014F4 ADDIU SP,SP,FFD0 SW S5,0024 (SP) ADDU S5,A0,R0 SW S1,0014 (SP) ADDU S1,R0,R0 SW S2,0018 (SP) ADDU S2,S1,R0 SW S3,001C (SP) ADDU S3,S1,R0 LUI V0,8024 SW S4,0020 (SP) ADDIU S4,V0,2D70 ADDU A0,S4,R0 LUI V0,8022 ADDIU V0,V0,539C SW S0,0010 (SP) SLL S0,S5,0x2 ADDU S0,S0,V0 ADDIU A1,R0,0100 SW RA,0028 (SP) LW A2,0000 (S0) ADDU A3,S5,R0 JAL 8020222C ;copy data from controller A3's mempak blocks A1-A2 to A0 SLL A2,A2,0x8 LW S0,0000 (S0) BLEZ S0,802015DC ADDU T2,S1,R0 ADDIU T4,R0,0003 ADDIU T3,R0,0001 ADDU T0,S1,R0 ADDU A0,S4,R0 ADDU A3,A0,R0 LHU T1,0000 (A3) ADDU V1,R0,R0 ADDIU A1,R0,0002 ADDU A2,T0,R0 ADDU V0,A2,A1 ADDU V0,V0,A0 LBU V0,0000 (V0) BNE V0,T4,802015A0 ADDU V1,V1,V0 BEQL S2,R0,802015A0 ADDIU S2,S1,0001 BEQL V0,T3,802015A8 ADDIU S1,S1,0001 ADDIU A1,A1,0001 SLTI V0,A1,0100 BNE V0,R0,80201588 ADDU V0,A2,A1 ANDI V1,V1,00FF ANDI V0,T1,00FF BNEL V1,V0,802015C8 ADDIU S3,R0,0001 ADDIU T0,T0,0100 ADDIU T2,T2,0001 SLT V0,T2,S0 BNE V0,R0,80201574 ADDIU A3,A3,0100 BNE S3,R0,802015FC LUI A0,8022 JAL 8020162C ADDU A0,S5,R0 ADDIU V1,S2,FFFF SLL V1,V1,0x10 J 80201608 OR V0,V1,V0 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,24A8 ADDIU V0,R0,FFFF LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8020162C ADDU T8,A0,R0 ADDU T5,R0,R0 LUI V0,8022 ADDIU V0,V0,53E4 SLL V1,T8,0x2 ADDU V0,V1,V0 LW A1,0000 (V0) LUI V0,8022 ADDIU V0,V0,53B4 ADDU A0,V1,V0 LW V0,0000 (A0) ADDIU V0,V0,FFFF SLT V0,A1,V0 BEQ V0,R0,802017AC ADDU T0,A1,R0 LUI V0,8024 ADDIU T6,V0,2D70 ADDIU T4,R0,0003 LUI V0,8022 ADDIU T1,V0,540C ADDIU T3,R0,0080 ADDU T7,V1,R0 ADDU T2,A0,R0 SLL V0,A1,0x1 ADDU V0,V0,T6 LH V0,0000 (V0) BNE V0,T4,8020173C SLL V0,T0,0x1 ADDIU V1,A1,0001 SLL A0,V1,0x1 ADDU A2,A0,T6 LH V0,0000 (A2) BNEL V0,T4,802016E4 ADDU A1,V1,R0 ADDU A0,V1,R0 SLL V0,T0,0x1 BGEZ V1,802016C8 ADDU A3,V0,T1 ADDIU A0,A1,0080 SRA A0,A0,0x7 SLL V0,A0,0x7 SUBU A2,V1,V0 SLL V0,A0,0x8 ADDU V0,A2,V0 J 80201774 SH V0,0000 (A3) LW V0,0000 (T2) SLT V0,A1,V0 BEQ V0,R0,8020172C LUI V0,8022 ADDIU V0,V0,53B4 ADDU A3,T7,V0 ADDU A0,A0,T1 ADDU V1,A2,R0 LH V0,0000 (V1) BEQ V0,T4,8020172C NOP SH T3,0000 (A0) ADDIU A0,A0,0002 LW V0,0000 (A3) ADDIU A1,A1,0001 SLT V0,A1,V0 BNE V0,R0,80201704 ADDIU V1,V1,0002 LW V0,0000 (T2) BNE A1,V0,80201748 ADDU V1,A1,R0 SLL V0,T0,0x1 ADDU V0,V0,T1 J 80201774 SH T3,0000 (V0) SLL V0,T0,0x1 BGEZ A1,80201758 ADDU A0,V0,T1 ADDIU V1,A1,007F SRA V1,V1,0x7 SLL V0,V1,0x7 SUBU V0,A1,V0 SLL V1,V1,0x8 ADDU V0,V0,V1 SH V0,0000 (A0) ADDIU A1,A1,FFFF SLL V0,T0,0x1 ADDU V0,V0,T1 LH V1,0000 (V0) ADDIU V0,R0,0080 BEQL V1,V0,80201798 ADDIU A1,A1,0001 BEQL T5,R0,80201794 ADDU T5,T0,R0 ADDIU A1,A1,0001 LW V0,0000 (T2) ADDIU V0,V0,FFFF SLT V0,A1,V0 BNE V0,R0,80201688 ADDU T0,A1,R0 LUI A0,8022 LUI V1,8022 ADDIU V1,V1,53B4 SLL V0,T8,0x2 ADDU V0,V0,V1 ADDIU A0,A0,540C LW V0,0000 (V0) ADDIU V1,R0,0080 ADDIU V0,V0,FFFF SLL V0,V0,0x1 ADDU V0,V0,A0 SH V1,0000 (V0) JR RA ADDU V0,T5,R0 802017E4 LUI V0,8022 ADDIU V0,V0,53CC SLL A0,A0,0x2 ADDU V0,A0,V0 LW A1,0000 (V0) LUI V0,8022 ADDIU V0,V0,53B4 ADDU A0,A0,V0 LW A0,0000 (A0) SLT V0,A1,A0 BEQ V0,R0,80201844 ADDU A2,R0,R0 ADDIU A3,R0,0001 LUI V0,8024 ADDIU V0,V0,2D70 SLLV V1,A1,A3 ADDU V1,V1,V0 LH V0,0000 (V1) BEQL V0,A3,80201834 ADDIU A2,A2,0001 ADDIU A1,A1,0001 SLT V0,A1,A0 BNE V0,R0,80201828 ADDIU V1,V1,0002 JR RA ADDU V0,A2,R0 8020184C LUI V0,8022 ADDIU V0,V0,539C SLL A0,A0,0x2 ADDU A0,A0,V0 LW V0,0000 (A0) BLEZ V0,802018C4 ADDU A3,R0,R0 LUI V0,8024 ADDIU T1,V0,4F90 ADDU T0,T1,R0 ADDU A1,A3,R0 ADDU A2,R0,R0 ADDIU V1,R0,0002 ADDU V0,A1,V1 ADDU V0,T1,V0 LBU V0,0000 (V0) ADDIU V1,V1,0001 ADDU A2,A2,V0 SLTI V0,V1,0100 BNE V0,R0,80201884 ADDU V0,A1,V1 ANDI V0,A2,00FF OR V0,V0,A1 SH V0,0000 (T0) ADDIU T0,T0,0100 LW V0,0000 (A0) ADDIU A3,A3,0001 SLT V0,A3,V0 BNE V0,R0,80201878 ADDIU A1,A1,0100 JR RA ADDU V0,A2,R0 802018CC ADDIU SP,SP,FFC8 SW S2,0018 (SP) ADDU S2,A0,R0 SW S1,0014 (SP) ADDU S1,R0,R0 SW S0,0010 (SP) SLL S0,A1,0x8 ADDU V0,S0,R0 SW S7,002C (SP) ADDU S7,A3,R0 SW RA,0034 (SP) SW S8,0030 (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S4,0020 (SP) SW S3,001C (SP) BGEZ S0,80201918 SW A2,0040 (SP) ADDIU V0,S0,00FF SRA S4,V0,0x8 JAL 802014F4 ADDU A0,S7,R0 ADDU S8,V0,R0 BLTZ S8,80201D14 ADDIU V0,R0,FFFF JAL 802017E4 ADDU A0,S7,R0 ADDIU V1,R0,0010 BEQL V0,V1,80201944 ADDU S8,R0,R0 BLEZ S8,80201D10 ADDU S3,S2,R0 LUI A0,8022 ADDIU A0,A0,5374 LW A1,0040 (SP) ADDIU A2,R0,0004 SRA V0,S8,0x10 JAL 80203044 ;memcpy(A0,A1,A2) ANDI S0,V0,007F JAL 8020237C ADDU A0,S7,R0 ADDU S6,V0,R0 BEQ S6,R0,80201C14 ANDI S5,S8,FFFF BEQ S0,R0,80201C14 NOP JAL 8020540C NOP ADDIU V1,R0,0001 BEQ V0,V1,80201D14 ADDIU V0,R0,03E7 ;V0=999 LH S0,0008 (S6) BNE S4,S0,802019E4 SLT V0,S4,S0 BEQ S4,R0,80201D10 LUI V0,8024 ADDIU S2,V0,0038 LH S1,0000 (S2) ADDIU S2,S2,0002 ADDU A0,S3,R0 ADDIU A2,R0,0100 ADDU A3,S7,R0 ADDIU S0,S0,FFFF ADDU S3,S3,A2 JAL 80202548 SLL A1,S1,0x8 BNE S0,R0,802019B0 ADDU V0,S8,R0 J 80201D14 NOP BEQ V0,R0,80201B4C NOP BEQ S4,R0,80201A30 ADDU S5,R0,R0 LUI V0,8024 ADDIU S2,V0,0038 LH S1,0000 (S2) ADDIU S2,S2,0002 ADDIU S5,S5,0001 ADDU A0,S3,R0 ADDIU A2,R0,0100 ADDU A3,S7,R0 ADDIU S0,S0,FFFF ADDIU S4,S4,FFFF ADDU S3,S3,A2 JAL 80202548 SLL A1,S1,0x8 BNE S4,R0,802019FC NOP BGEZ S1,80201A3C ADDU V1,S1,R0 ADDIU V1,S1,00FF SRA V1,V1,0x8 SLL V0,V1,0x8 SUBU V0,S1,V0 SLL V1,V1,0x7 ADDU V1,V0,V1 LUI V0,8024 ADDIU A0,V0,4F90 SLL V0,V1,0x1 ADDU V0,V0,A0 ADDIU V1,R0,0001 BEQ S0,R0,80201AC0 SH V1,0000 (V0) ADDU A2,A0,R0 ADDIU A1,R0,0003 LUI V0,8024 ADDIU V0,V0,0038 SLL V1,S5,0x1 ADDU A0,V1,V0 LH S1,0000 (A0) ADDIU A0,A0,0002 BGEZ S1,80201A98 ADDU V1,S1,R0 ADDIU V1,S1,00FF SRA V1,V1,0x8 SLL V0,V1,0x8 SUBU V0,S1,V0 SLL V1,V1,0x7 ADDU V1,V0,V1 SLL V0,V1,0x1 ADDU V0,V0,A2 ADDIU S0,S0,FFFF BNE S0,R0,80201A84 SH A1,0000 (V0) JAL 8020184C ADDU A0,S7,R0 LUI S1,8024 ADDIU S1,S1,4F90 ADDU A0,S1,R0 ADDIU A1,R0,0100 LUI S0,8022 ADDIU S0,S0,539C SLL S2,S7,0x2 ADDU S0,S2,S0 LW A2,0000 (S0) ADDU A3,S7,R0 JAL 80202548 SLL A2,A2,0x8 ADDU A0,S1,R0 LW A2,0000 (S0) ADDU A3,S7,R0 SLL A2,A2,0x8 JAL 80202548 ADDIU A1,A2,0100 LUI A0,8025 ADDIU A0,A0,A708 LUI V0,8025 LHU V0,9AD8 (V0) ADDIU A2,R0,0200 SH V0,0008 (S6) LUI V0,8022 ADDIU V0,V0,53CC ADDU S2,S2,V0 LW A1,0000 (S2) ADDU A3,S7,R0 JAL 80202548 SLL A1,A1,0x8 J 80201D14 ADDU V0,S8,R0 JAL 802021C4 ADDU A0,S7,R0 SUBU V1,S4,S0 SLT V0,V0,V1 BNEL V0,R0,80201D10 ADDU S8,R0,R0 BEQ S0,R0,80201BA0 LUI V0,8024 ADDIU S2,V0,0038 LH S1,0000 (S2) ADDIU S2,S2,0002 ADDU A0,S3,R0 ADDIU A2,R0,0100 ADDIU A3,R0,0001 ADDIU S0,S0,FFFF ADDIU S4,S4,FFFF ADDU S3,S3,A2 JAL 80202548 SLL A1,S1,0x8 BNE S0,R0,80201B70 NOP BGEZ S1,80201BAC ADDU V0,S1,R0 ADDIU V0,S1,00FF SRA A0,V0,0x8 SLL V0,A0,0x8 SUBU V1,S1,V0 SLL V0,A0,0x7 ADDU V1,V1,V0 ADDU A3,S5,R0 LUI V0,8024 ADDIU V0,V0,4F90 SLL V1,V1,0x1 BGEZ S5,80201BDC ADDU T0,V1,V0 ADDIU A3,S5,007F ADDU A0,S4,R0 ADDU A1,S5,R0 ADDU A2,S3,R0 SRA V1,A3,0x7 SLL V0,V1,0x7 SUBU V0,A1,V0 SLL V1,V1,0x8 ADDU V0,V0,V1 SH V0,0000 (T0) LUI V0,8025 LHU V0,9AD8 (V0) ADDU A3,S7,R0 J 80201D08 SH V0,0008 (S6) JAL 802021C4 ADDU A0,S7,R0 SLT V0,V0,S4 BEQ V0,R0,80201C30 ADDIU A1,R0,00FF J 80201D10 ADDU S8,R0,R0 ADDU V1,R0,R0 ADDU A2,A1,R0 LUI V0,8025 ADDIU A0,V0,A708 BNEL A1,A2,80201C58 ADDIU V1,V1,0001 LBU V0,0010 (A0) BEQL V0,R0,80201C54 ADDU A1,V1,R0 ADDIU V1,V1,0001 SLTI V0,V1,0010 BNE V0,R0,80201C40 ADDIU A0,A0,0020 ADDIU V0,R0,00FF BNE A1,V0,80201C78 SLL V0,A1,0x5 J 80201D14 ADDU V0,R0,R0 LUI V1,8025 ADDIU V1,V1,A708 ADDU S6,V0,V1 ADDIU A0,S6,0010 LUI A1,8025 JAL 8021109C ;strcpy(A0,A1) ADDIU A1,A1,9130 BGEZ S5,80201CA0 ADDU V1,S5,R0 ADDIU V1,S5,007F ADDU A0,S4,R0 ADDU A1,S5,R0 SRA V1,V1,0x7 SLL V0,V1,0x7 SUBU V0,A1,V0 SLL V1,V1,0x8 ADDU V0,V0,V1 SH V0,0006 (S6) LUI V0,8025 LHU V0,9AD8 (V0) ADDU A2,S3,R0 SH V0,0008 (S6) LUI V0,8022 ADDIU T4,V0,537C LWL T1,0000 (T4) LWR T1,0003 (T4) LH T2,0004 (T4) SWL T1,0000 (S6) SWR T1,0003 (S6) SH T2,0004 (S6) LW T5,0040 (SP) ADDU A3,S7,R0 LWL T1,0000 (T5) LWR T1,0003 (T5) SWL T1,000C (S6) SWR T1,000F (S6) JAL 80202728 NOP ADDU V0,S8,R0 LW RA,0034 (SP) LW S8,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 80201D44 reset controller and cart eeprom status sets PIFram to 80242D20: FF0103FF 000000FF 0103FF00 0000FF01 03FF0000 00FF0103 FF000000 FF0103FF 000000FE FEFEFEFE -------- -------- -------- -------- -------- 00000001 ADDIU SP,SP,FFE0 LUI V1,8024 ADDIU V1,V1,2D20 ;V1=80242D20: PIFram buffer ADDIU V1,V1,000F ;V1+=F ADDIU V0,R0,FFF0 AND V1,V1,V0 ;V1&=FFF0: V1 rounded up to quadword, which is still 80242D20 LUI A1,FF01 ORI A1,A1,03FF ;A1=FF0103FF LUI A0,0103 ORI A0,A0,FF00 ;A0=0103FF00 LUI A2,00FF ORI A2,A2,0103 ;A2=00FF0103 LUI A3,FEFE ORI A3,A3,FEFE ;A3=FEFEFEFE SW S0,0010 (SP) ADDU S0,R0,R0 ;S0=0 init.count LUI V0,8025 SW S1,0014 (SP) ADDU S1,V0,R0 ;S1=80250000 SW RA,0018 (SP) SW V1,9128 (S1) ;V1->80249128: p->PIFram buffer SW A1,0000 (V1) ;FF0103FF->80242D20 LW V0,9128 (S1) ;V0=80249128: p->PIFram buffer ADDIU V1,R0,00FF SW V1,0004 (V0) ;000000FF->80242D24 ORI V1,R0,FF01 SW V1,000C (V0) ;0000FF01->80242D2C LUI V1,03FF SW V1,0010 (V0) ;03FF0000->80242D30 LUI V1,FF00 SW V1,0018 (V0) ;FF000000->80242D38 ADDIU V1,R0,00FE SW V1,0020 (V0) ;000000FE->80242D40 ADDIU V1,R0,0001 SW A0,0008 (V0) ;0103FF00->80242D28 SW A2,0014 (V0) ;00FF0103->80242D34 SW A1,001C (V0) ;FF0103FF->80242D3C SW A3,0024 (V0) ;FEFEFEFE->80242D44 SW V1,003C (V0) ;00000001->80242D5C //80201DE0: set cache for PIFram SLL V0,S0,0x2 ;V0count->offset LW A0,9128 (S1) ;A0=80249128: p->PIFram buffer ADDIU S0,S0,0001 ;S0++ count++ JAL 80218598 ;cache target ADDU A0,A0,V0 ;A0+=offset: cache target SLTI V0,S0,0010 BNE V0,R0,80201DE4 ;set cache for entire PIFram buffer SLL V0,S0,0x2 //80201E00: send controller state request to SI LUI V0,8025 LW A0,9128 (V0) ;A0=80249128: p->PIFram buffer JAL 802026E4 ;write buffer A0 to PIFram ADDU S0,R0,R0 ;S0=0 init.count LUI V1,0005 ORI V1,V1,090F ;V1=0005090F: 329999 //80201E18: wait arbitrary amount of time ADDIU S0,S0,0001 ;S0++ count++ SLT V0,V1,S0 BEQ V0,R0,80201E1C ;loop 330000 times ADDIU S0,S0,0001 //80201E28: read result from PIFram LUI V0,8025 LW A0,9128 (V0) ;A0=80249128: p->PIFram buffer JAL 80202BAC ;read PIFram to buffer A0 ADDU S0,R0,R0 ;S0=0 init.count LUI V1,0005 ORI V1,V1,090F ;V1=0005090F: 329999 //80201E40: wait arbitrary amount of time ADDIU S0,S0,0001 ;S0++ count++ SLT V0,V1,S0 BEQ V0,R0,80201E44 ;loop 330000 times ADDIU S0,S0,0001 //80201E50: return LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80201E64 V0=TRUE if controller 1 slot filled; redirect to 80202C90 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80202C90 ;V0=controller 1 slot state NOP LW RA,0010 (SP) ANDI V0,V0,0001 ;V0&=1: TRUE/FALSE return JR RA ADDIU SP,SP,0018 80201E84 write value A1 to controller slot A0's device manager (block 0x400) accepts: A0=slot# (1-4), A1=value ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: slot# ADDU A2,A1,R0 ;A2=A1: value ANDI A1,A2,00FF ;A1->byte LUI A0,8025 LUI V1,8022 ADDIU V1,V1,5384 ;V1=80225384 SLL V0,S0,0x2 ;V0=slot->offset LW A0,9128 (A0) ;A0=80249128: p->PIFbuffer ADDU V0,V0,V1 ;V0+=V1: 80225384+offset SW RA,0014 (SP) SW A2,0000 (V0) ;A2->80225384+offset: //80201EB8: setup read controller slot command ADDIU A2,R0,0020 ;A2=20 JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A0,A0,0009 ;A0+=9: PIFbuffer+9: data segment for read slot command ADDIU A0,R0,0400 ;A0=400: block# JAL 80202A04 ;write preset data to mempak bank A0 of channel A1 ADDU A1,S0,R0 ;A1=S0: slot# //80201ED0: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80201EE0 accepts: A0=slot# (1-4) ADDIU SP,SP,FEE8 SW S0,0110 (SP) ADDU S0,A0,R0 ;S0=A0: slot# LUI A0,8022 ADDIU A0,A0,24BC ;A0=802224BC: "ReadSize %8\n" SW RA,0114 (SP) JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDU A1,S0,R0 ;A1=S0: slot# ADDU A0,S0,R0 ;A0=S0: slot# JAL 80201E84 ;write value A1 to controller slot A0's device manager (block 0x400) ADDU A1,R0,R0 ;A1=0 ADDIU A0,SP,0010 ;A0=SP+10: p->target ADDU A1,R0,R0 ;A1=0 ADDIU A2,R0,0100 ;A2=100 JAL 8020222C ;copy data from controller A3's mempak blocks A1-A2 to A0 ADDU A3,S0,R0 ;A3=S0: slot# //80201F20: LUI V1,8022 ADDIU V1,V1,539C ;V1=8022539C SLL S0,S0,0x2 ;S0->offset ADDU V1,S0,V1 ;V1=8022539C+offset LUI A1,8022 ADDIU A1,A1,53B4 ;A1=802253B4 LBU V0,004A (SP) ;V0=target+3A: ADDU A1,S0,A1 ;A1=802253B4+offset SW V0,0000 (V1) ;V0->8022539C+offset: SLL V0,V0,0x7 ;V0*=80: SW V0,0000 (A1) ;V0->802253B4+offset: LUI V0,8022 ADDIU V0,V0,53CC ;V0=802253CC LW A0,0000 (V1) ;A0=8022539C+offset: ADDU V0,S0,V0 ;V0+=offset SLL A0,A0,0x1 ;A0*=2 ADDIU V1,A0,0001 ;V1=A0+1: SW V1,0000 (V0) ;V1->802253CC+offset: LUI V0,8022 ADDIU V0,V0,53E4 ;V0=802253E4 ADDU S0,S0,V0 ;S0+=802253E4 ADDIU A0,A0,0003 ;A0+=3 SW A0,0000 (S0) ;A0->802253E4+offset: //80201F7C: return LW V0,0000 (A1) ;V0=802253B4+offset: LW RA,0114 (SP) LW S0,0110 (SP) JR RA ADDIU SP,SP,0118 80201F90 ADDIU SP,SP,FFD8 SW S2,0018 (SP) ADDU S2,A0,R0 LUI V0,8024 SW S3,001C (SP) ADDIU S3,V0,4F90 ADDU A0,S3,R0 ADDIU A1,R0,0100 LUI V0,8022 ADDIU V0,V0,539C SW S0,0010 (SP) SLL S0,S2,0x2 ADDU V0,S0,V0 SW RA,0024 (SP) SW S4,0020 (SP) SW S1,0014 (SP) LW A2,0000 (V0) ADDU A3,S2,R0 JAL 8020222C ;copy data from controller A3's mempak blocks A1-A2 to A0 SLL A2,A2,0x8 LUI S1,8025 ADDIU S1,S1,A708 ADDU A0,S1,R0 ADDIU A2,R0,0200 LUI V0,8022 ADDIU V0,V0,53CC ADDU V0,S0,V0 LW A1,0000 (V0) ADDU A3,S2,R0 JAL 8020222C ;copy data from controller A3's mempak blocks A1-A2 to A0 SLL A1,A1,0x8 LUI A0,8024 ADDIU A0,A0,4D90 ADDU A1,R0,R0 JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,0200 ADDU S4,R0,R0 LUI V0,8022 ADDIU V0,V0,53E4 ADDU V0,S0,V0 LW T2,0000 (V0) LUI V0,8022 ADDIU V0,V0,53B4 ADDU S0,S0,V0 LW S0,0000 (S0) SLT V0,T2,S0 BEQ V0,R0,80202078 ADDU A3,S4,R0 ADDIU V1,R0,0001 SLLV V0,T2,V1 ADDU A0,V0,S3 LH V0,0000 (A0) BEQL V0,V1,80202068 ADDIU A3,R0,0001 ADDIU T2,T2,0001 SLT V0,T2,S0 BNE V0,R0,8020205C ADDIU A0,A0,0002 ADDU T2,R0,R0 LUI V0,8025 ADDIU S0,V0,95F8 ADDIU T5,R0,0001 LUI V0,8024 ADDIU T4,V0,4F90 LUI T6,8024 ADDIU T7,T6,0038 SLL A0,S2,0x6 ADDIU S1,S1,0010 LHU V0,FFF8 (S1) ADDU V1,A0,S0 SH V0,0000 (V1) LBU V0,0000 (S1) BEQ V0,R0,8020218C SH R0,FFF8 (S1) BNEL A3,T5,8020218C SB R0,0000 (S1) LHU V0,FFF6 (S1) SH V0,0038 (T6) LH V1,FFF6 (S1) ADDIU T3,R0,0001 BGEZ V1,802020DC ADDU V0,V1,R0 ADDIU V0,V1,00FF SRA A2,V0,0x8 SLL V0,A2,0x8 SUBU V0,V1,V0 SLL V0,V0,0x10 SRA A1,V0,0x10 SLL V0,A2,0x7 ADDU V0,A1,V0 SLL V0,V0,0x1 ADDU V1,V0,T4 LHU V0,0000 (V1) SLL V0,V0,0x10 SRA V0,V0,0x10 XORI V0,V0,0001 SLTIU T1,V0,0001 BNEL T1,R0,8020218C SH T3,FFF8 (S1) ADDIU T0,T7,0002 LHU V0,0000 (V1) ADDIU T3,T3,0001 SH V0,0000 (T0) LHU V0,0000 (V1) ADDIU T0,T0,0002 SLL V0,V0,0x10 SRA V1,V0,0x10 BGEZ V1,80202148 ADDU V0,V1,R0 ADDIU V0,V1,00FF SRA A1,V0,0x8 SLL V0,A1,0x8 SUBU V0,V1,V0 SLL V0,V0,0x10 SRA A2,V0,0x10 SLL V0,A1,0x7 ADDU V0,A2,V0 SLL V0,V0,0x1 ADDU V1,V0,T4 LHU V0,0000 (V1) SLL V0,V0,0x10 SRA V0,V0,0x10 BEQL V0,T5,80202180 ADDIU T1,R0,0001 BEQ T1,R0,80202120 NOP SH T3,FFF8 (S1) ADDIU S1,S1,0020 ADDIU T2,T2,0001 SLTI V0,T2,0010 BNE V0,R0,802020A0 ADDIU A0,A0,0004 ADDU V0,S4,R0 LW RA,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 802021C4 LUI V0,8022 ADDIU V0,V0,53E4 SLL A0,A0,0x2 ADDU V0,A0,V0 LW A1,0000 (V0) LUI V0,8022 ADDIU V0,V0,53B4 ADDU A0,A0,V0 LW A0,0000 (A0) SLT V0,A1,A0 BEQ V0,R0,80202224 ADDU A2,R0,R0 ADDIU A3,R0,0003 LUI V0,8024 ADDIU V0,V0,2D70 SLL V1,A1,0x1 ADDU V1,V1,V0 LH V0,0000 (V1) BEQL V0,A3,80202214 ADDIU A2,A2,0001 ADDIU A1,A1,0001 SLT V0,A1,A0 BNE V0,R0,80202208 ADDIU V1,V1,0002 JR RA ADDU V0,A2,R0 8020222C copy data from controller A3's mempak blocks A1-A2 to A0 accepts: A0=p->target, A1=first block, A2=last block#, A3=slot# ADDIU SP,SP,FFD0 SW S6,0028 (SP) ADDU S6,A0,R0 ;S6=A0: p->target SW S0,0010 (SP) ADDU S0,A1,R0 ;S0=A1: block.start SW S1,0014 (SP) SW S4,0020 (SP) ADDU S4,A3,R0 ;S4=A3: slot# LUI A0,8025 SRA A1,S0,0x10 ;A1=S0/10000: upper short LUI V1,8022 ADDIU V1,V1,5384 SLL V0,S4,0x2 ;V0=S4->offset ADDU V0,V0,V1 ;V0=80225384+offset SW RA,002C (SP) SW S5,0024 (SP) SW S3,001C (SP) SW S2,0018 (SP) LW V0,0000 (V0) ;V0=80225384+offset: p->word related to controller slot [A3] LW S5,9128 (A0) ;S5=80249128: p->PIFram buffer BEQ V0,A1,8020228C ADDU S1,A2,R0 ;S1=A2: block.end JAL 80201E84 ;write value A1 to controller slot A0's device manager (block 0x400) ADDU A0,S4,R0 ;A0=S4: slot# //8020228C: figure first and last blocks ADDU A1,S0,R0 ;A1=S0: first block BLTZL A1,80202298 ;if A1 < 0, try to round up a block ADDIU A1,A1,001F ADDU A2,S1,R0 ;A2=S1: block.end BGEZ A2,802022A8 ;branch if valid block# SRA S3,A1,0x5 ;S3=A1/20: block#->address ADDIU A2,A2,001F ;A2+=1F: round up a block //802022A8: catch bad final blocks SRA S2,A2,0x5 ;S2=A2/20: block.end/20=address BLEZ S2,80202354 ;return if not a real block ADDU S0,R0,R0 ;S0=0 init.count ADDU S1,S6,R0 ;S1=S6: p->target //802022B8: copy data from each block to target ADDU A0,S0,S3 ;A0=count+start addy JAL 80202898 ;read data from controller mempak block A0 in slot A1 ADDU A1,S4,R0 ;A1=S4: slot# LWL T0,0009 (S5) ;T0=buffer+9: data[0] LWR T0,000C (S5) LWL T1,000D (S5) ;T1=buffer+D: data[4] LWR T1,0010 (S5) LWL T2,0011 (S5) ;T2=buffer+11: data[8] LWR T2,0014 (S5) LWL T3,0015 (S5) ;T3=buffer+15: data[C] LWR T3,0018 (S5) SWL T0,0000 (S1) ;T0->target+0: data[0] SWR T0,0003 (S1) SWL T1,0004 (S1) ;T1->target+4: data[4] SWR T1,0007 (S1) SWL T2,0008 (S1) ;T2->target+8: data[8] SWR T2,000B (S1) SWL T3,000C (S1) ;T3->target+C: data[C] SWR T3,000F (S1) LWL T0,0019 (S5) ;T0=buffer+19: data[10] LWR T0,001C (S5) LWL T1,001D (S5) ;T1=buffer+1D: data[14] LWR T1,0020 (S5) LWL T2,0021 (S5) ;T2=buffer+21: data[18] LWR T2,0024 (S5) LWL T3,0025 (S5) ;T3=buffer+25: data[1C] LWR T3,0028 (S5) SWL T0,0010 (S1) ;T0->target+10: data[10] SWR T0,0013 (S1) SWL T1,0014 (S1) ;T1->target+14: data[14] SWR T1,0017 (S1) SWL T2,0018 (S1) ;T2->target+18: data[18] SWR T2,001B (S1) SWL T3,001C (S1) ;T3->target+1C: data[1C] SWR T3,001F (S1) ADDIU S0,S0,0001 ;S0++ SLT V0,S0,S2 BNE V0,R0,802022B8 ;loop for each block being copied ADDIU S1,S1,0020 ;S1+=20 //80202254: return LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8020237C ADDIU SP,SP,FFD0 SW S1,0014 (SP) ADDU S1,A0,R0 LUI A0,8024 ADDIU A0,A0,4F90 ADDIU A1,R0,0100 ADDU A3,S1,R0 SW S2,0018 (SP) ADDU S2,R0,R0 SW S4,0020 (SP) ADDU S4,A0,R0 SW S3,001C (SP) LUI S3,8024 SW S5,0024 (SP) ADDIU S5,S3,0038 LUI V0,8022 ADDIU V0,V0,539C SW S0,0010 (SP) SLL S0,S1,0x2 ADDU V0,S0,V0 SW RA,0028 (SP) LW A2,0000 (V0) LUI V0,8022 SW R0,5370 (V0) JAL 8020222C ;copy data from controller A3's mempak blocks A1-A2 to A0 SLL A2,A2,0x8 LUI A0,8025 ADDIU A0,A0,A708 ADDIU A2,R0,0200 ADDU A3,S1,R0 ADDU S1,A0,R0 LUI V0,8022 ADDIU V0,V0,53CC ADDU S0,S0,V0 LW A1,0000 (S0) ADDIU S0,S1,0008 JAL 8020222C ;copy data from controller A3's mempak blocks A1-A2 to A0 SLL A1,A1,0x8 LUI A0,8024 ADDIU A0,A0,4D90 ADDU A1,S2,R0 JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,0200 ADDIU A0,S1,0010 LUI A1,8025 JAL 80211028 ADDIU A1,A1,9130 BNEL V0,R0,80202510 ADDIU S0,S0,0020 ADDIU A0,S1,000C LUI A1,8022 JAL 80211028 ADDIU A1,A1,5374 BNEL V0,R0,80202510 ADDIU S0,S0,0020 LHU V0,FFFE (S0) SH V0,0038 (S3) LH V1,FFFE (S0) ADDIU A3,R0,0001 BGEZ V1,80202474 ADDU V0,V1,R0 ADDIU V0,V1,00FF SRA A1,V0,0x8 SLL V0,A1,0x8 SUBU V0,V1,V0 SLL V0,V0,0x10 SRA A0,V0,0x10 SLL V0,A1,0x7 ADDU V0,A0,V0 SLL V0,V0,0x1 ADDU A0,V0,S4 LH V0,0000 (A0) LHU V1,0000 (A0) BEQ V0,A3,802024FC ADDIU T0,R0,0001 ADDIU A2,S5,0002 SH V1,0000 (A2) ADDIU A2,A2,0002 LH V1,0000 (A0) ADDIU A3,A3,0001 BGEZ V1,802024C8 ADDU V0,V1,R0 ADDIU V0,V1,00FF SRA A0,V0,0x8 SLL V0,A0,0x8 SUBU V0,V1,V0 SLL V0,V0,0x10 SRA A1,V0,0x10 SLL V0,A0,0x7 ADDU V0,A1,V0 SLL V0,V0,0x1 ADDU A0,V0,S4 LH V0,0000 (A0) LHU V1,0000 (A0) BNEL V0,T0,802024B0 SH V1,0000 (A2) ADDU V0,S1,R0 LUI V1,8022 SH A3,0000 (S0) J 80202524 SW S2,5370 (V1) ADDIU S2,S2,0001 SLTI V0,S2,0010 BNE V0,R0,80202428 ADDIU S1,S1,0020 ADDU V0,R0,R0 LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 80202548 ADDIU SP,SP,FFD0 SW S2,0018 (SP) ADDU S2,A0,R0 SW S0,0010 (SP) ADDU S0,A1,R0 SW S1,0014 (SP) SW S5,0024 (SP) ADDU S5,A3,R0 LUI A0,8025 SRA A1,S0,0x10 LUI V1,8022 ADDIU V1,V1,5384 SLL V0,S5,0x2 ADDU V0,V0,V1 SW RA,002C (SP) SW S6,0028 (SP) SW S4,0020 (SP) SW S3,001C (SP) LW V0,0000 (V0) LW S6,9128 (A0) ;S6=80249128: p->PIFram buffer BEQ A1,V0,802025A8 ADDU S1,A2,R0 JAL 80201E84 ;write value A1 to controller slot A0's device manager (block 0x400) ADDU A0,S5,R0 ADDU A1,S0,R0 BLTZL A1,802025B4 ADDIU A1,A1,001F ADDU A2,S1,R0 BGEZ A2,802025C4 SRA S4,A1,0x5 ADDIU A2,A2,001F SRA S1,A2,0x5 BLEZ S1,802026B4 ADDU S0,R0,R0 ADDIU S3,R0,0092 LWL T0,0000 (S2) LWR T0,0003 (S2) LWL T1,0004 (S2) LWR T1,0007 (S2) LWL T2,0008 (S2) LWR T2,000B (S2) LWL T3,000C (S2) LWR T3,000F (S2) SWL T0,0009 (S6) SWR T0,000C (S6) SWL T1,000D (S6) SWR T1,0010 (S6) SWL T2,0011 (S6) SWR T2,0014 (S6) SWL T3,0015 (S6) SWR T3,0018 (S6) LWL T0,0010 (S2) LWR T0,0013 (S2) LWL T1,0014 (S2) LWR T1,0017 (S2) LWL T2,0018 (S2) LWR T2,001B (S2) LWL T3,001C (S2) LWR T3,001F (S2) SWL T0,0019 (S6) SWR T0,001C (S6) SWL T1,001D (S6) SWR T1,0020 (S6) SWL T2,0021 (S6) SWR T2,0024 (S6) SWL T3,0025 (S6) SWR T3,0028 (S6) ADDU A0,S4,S0 JAL 80202A04 ;write preset data to mempak bank A0 of channel A1 ADDU A1,S5,R0 DIV S3,S1 BNE S1,R0,80202670 NOP BREAK 00001C00 ADDIU AT,R0,FFFF BNE S1,AT,80202688 LUI AT,8000 BNE S3,AT,80202688 NOP BREAK 00001800 MFLO A0 NOP NOP MULT S0,A0 ADDIU S2,S2,0020 MFLO A0 JAL 8022241C ADDIU S0,S0,0001 SLT V0,S0,S1 BNE V0,R0,802025D4 NOP JAL 8022241C ADDIU A0,R0,0092 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 802026E4 write buffer A0 to PIFram accepts: A0=p->PIFram buffer ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 80202B88 ;wait until SI status clear ADDU S0,A0,R0 ;S0=A0: p->buffer LUI V1,1FFF ORI V1,V1,FFFF ;V1=1FFFFFFF: address mask LUI A0,1FC0 ORI A0,A0,07C0 ;A0=1FC007C0: p->PIFram LUI V0,A480 AND S0,S0,V1 ;S0&=V1: buffer address SW S0,0000 (V0) ;S0->A4800000: SI dram address SW A0,0010 (V0) ;A0->A4800010: SI write address LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80202728 ADDIU SP,SP,FFD0 SW S1,0014 (SP) ADDU S1,A0,R0 SW S0,0010 (SP) ADDU S0,A1,R0 SW S3,001C (SP) ADDU S3,A2,R0 SW S4,0020 (SP) ADDU S4,A3,R0 ADDU V1,S0,R0 SW RA,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) BGEZ S0,80202768 SW S2,0018 (SP) ADDIU V1,S0,007F SRA V1,V1,0x7 SLL V0,V1,0x7 SUBU V0,S0,V0 SLL V1,V1,0x8 BEQ S1,R0,802027E8 ADDU S0,V0,V1 LUI V0,8022 ADDIU S6,V0,540C LUI V0,8024 ADDIU S5,V0,4F90 ADDU T0,S0,R0 BGEZ T0,802027A0 ADDU V1,T0,R0 ADDIU V1,T0,00FF ADDU A0,S3,R0 SLL A1,T0,0x8 ADDIU A2,R0,0100 ADDU A3,S4,R0 SRA V1,V1,0x8 SLL V0,V1,0x8 SUBU V0,T0,V0 SLL V1,V1,0x7 ADDU S2,V0,V1 SLL V1,S2,0x1 ADDU V0,V1,S6 LH S0,0000 (V0) ADDU V1,V1,S5 JAL 80202548 SH S0,0000 (V1) ADDIU S1,S1,FFFF BNE S1,R0,80202790 ADDIU S3,S3,0100 ADDU A0,S4,R0 LUI S1,8024 ADDIU S1,S1,4F90 SLL V0,S2,0x1 ADDU V0,V0,S1 ADDIU V1,R0,0001 JAL 8020184C SH V1,0000 (V0) ADDU A0,S1,R0 ADDIU A1,R0,0100 LUI S0,8022 ADDIU S0,S0,539C SLL S2,S4,0x2 ADDU S0,S2,S0 LW A2,0000 (S0) ADDU A3,S4,R0 JAL 80202548 SLL A2,A2,0x8 ADDU A0,S1,R0 LW A2,0000 (S0) ADDU A3,S4,R0 SLL A2,A2,0x8 JAL 80202548 ADDIU A1,A2,0100 LUI A0,8025 ADDIU A0,A0,A708 ADDIU A2,R0,0200 LUI V0,8022 ADDIU V0,V0,53CC ADDU S2,S2,V0 LW A1,0000 (S2) ADDU A3,S4,R0 JAL 80202548 SLL A1,A1,0x8 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 80202898 read data from controller mempak block A0 in slot A1 accepts: A0=block#, A1=slot# ADDIU SP,SP,FFD0 SW S5,0024 (SP) ADDU S5,A0,R0 ;S5=A0: block# SW S4,0020 (SP) ADDU S4,A1,R0 ;S4=A1: slot# SW S2,0018 (SP) LUI S2,8025 SW S3,001C (SP) ADDIU S3,R0,00FF ;S3=FF SW S6,0028 (SP) SLL S6,S5,0x5 ;S6=S5*20: block#->address SW RA,002C (SP) SW S1,0014 (SP) SW S0,0010 (SP) LW S1,9128 (S2) ;S1=80249128: p->PIFram buffer SLTI V0,S4,0002 ;TRUE if slots 0,1 SB S3,0000 (S1) ;FF->buffer+0 SB S3,0001 (S1) ;FF->buffer+1 SB S3,0002 (S1) ;FF->buffer+2 BNE V0,R0,802028F0 ;branch if not slot 1 SB S3,0003 (S1) ;FF->buffer+3 SB R0,0000 (S1) ;0->buffer+0 //802028F0: controller slot 2 SLTI V0,S4,0003 BEQL V0,R0,802028FC ;branch if not slot 2 SB R0,0001 (S1) ;0->buffer+1 //802028FC: controller slot 3 SLTI V0,S4,0004 BEQL V0,R0,80202908 ;branch if not slot 3 SB R0,0002 (S1) ;0->buffer+2 //80202908: controller slot 4 SLTI V0,S4,0005 BEQL V0,R0,80202914 ;branch if not slot 4 SB R0,0003 (S1) ;0->buffer+3 //80202914: ADDU A0,S5,R0 ;A0=S5: block# ADDIU V0,R0,0003 SB V0,0004 (S1) ;03->buffer+4: #bytes written ADDIU V0,R0,0021 SB V0,0005 (S1) ;21->buffer+5: #bytes read ADDIU V0,R0,0002 SB V0,0006 (S1) ;02->buffer+6: command=read controller slot SRA V0,S5,0x3 ;V0=addy/100: addy.hi SB V0,0007 (S1) ;V0->buffer+7: addy.hi JAL 80202BF0 ;V0=address CRC SB S6,0008 (S1) ;S6->buffer+8: addy.lo ADDU S0,R0,R0 ;S0=0 init.count LBU A0,0008 (S1) ;A0=buffer+8: addy.lo ADDIU V1,R0,00FE ;V1=FE SB V1,002A (S1) ;FE->buffer+2A: stop reading channel data ADDIU V1,R0,0001 SB V1,003F (S1) ;1->buffer+3F: process PIF commands OR A0,A0,V0 ;A0|=V0: addy.lo | addy.crc SB A0,0008 (S1) ;A0->buffer+8: addy|crc //80202960: set cache for PIFram buffer SLL V0,S0,0x2 ;V0=count->offset LW A0,9128 (S2) ;A0=80249128: p->PIFram buffer ADDIU S0,S0,0001 ;S0++ count++ JAL 80218598 ;cache target ADDU A0,A0,V0 ;A0+=V0: buffer+offset SLTI V0,S0,0010 BNE V0,R0,80202964 ;loop for entire PIFram buffer SLL V0,S0,0x2 LW A0,9128 (S2) ;A0=80249128: p->PIFram buffer JAL 802026E4 ;write buffer A0 to PIFram ADDU S0,R0,R0 ;S0=0 init.count LUI V1,0005 ORI V1,V1,090F ;V1=5090F: 329999 //80202994: wait an arbitrary amount of time ADDIU S0,S0,0001 ;S0++ SLT V0,V1,S0 BEQ V0,R0,80202998 ;loop 330000 times ADDIU S0,S0,0001 LW A0,9128 (S2) ;A0=80249128: p->PIFram buffer JAL 80202BAC ;read PIFram to buffer A0 ADDU S0,R0,R0 ;S0=0 init.count LUI V1,0005 ORI V1,V1,090F ;V1=5090F: 329999 //802029B8: wait an arbitrary amount of time ADDIU S0,S0,0001 ;S0++ count++ SLT V0,V1,S0 BEQL V0,R0,802029BC ;loop 330000 times ADDIU S0,S0,0001 JAL 80202C30 ;V0=data CRC for mempak data at A0 ADDIU A0,S1,0009 ;A0=S1+9: p->data LBU V1,0029 (S1) ;V1=buffer+29: data.CRC BNE V0,V1,802028D0 ;keep trying until you get a good read NOP //802029DC: return LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 80202A04 write preset data to mempak bank A0 of channel A1 accepts: A0=mempak bank#, A1=slot# (1-4) ADDIU SP,SP,FFC8 SW S6,0028 (SP) ADDU S6,A0,R0 ;S6=A0: bank# SW S5,0024 (SP) ADDU S5,A1,R0 ;S5=A1: slot# SW S2,0018 (SP) LUI S2,8025 SW S4,0020 (SP) ADDIU S4,R0,00FF ;S4=FF SW S7,002C (SP) ADDIU S7,R0,0001 ;S7=01 SW S8,0030 (SP) SLL S8,S6,0x5 ;S8=[A0]*20: bank->offset SW S3,001C (SP) ADDIU S3,R0,00FE ;S3=FE SW RA,0034 (SP) SW S1,0014 (SP) SW S0,0010 (SP) LW S1,9128 (S2) ;S1=80249128: p->PIFram buffer SLTI V0,S5,0002 ;TRUE if slot 0-1 SB S4,0000 (S1) ;FF->buffer+0 SB S4,0001 (S1) ;FF->buffer+1 SB S4,0002 (S1) ;FF->buffer+2 BNE V0,R0,80202A6C ;branch if not slot 1 SB S4,0003 (S1) ;FF->buffer+3 SB R0,0000 (S1) ;00->buffer+0 //80202A6C: test if slot 2 SLTI V0,S5,0003 ;TRUE if slot 0-2 BEQL V0,R0,80202A78 ;00->buffer+1 if slot 2 SB R0,0001 (S1) //80202A78: test if slot 3 SLTI V0,S5,0004 ;TRUE if slot 0-3 BEQL V0,R0,80202A84 ;00->buffer+2 if slot 3 SB R0,0002 (S1) //80202A84: test if slot 4 SLTI V0,S5,0005 ;TRUE if slot 0-4 BEQL V0,R0,80202A90 ;00->buffer+3 if slot 4 SB R0,0003 (S1) //80202A90: set addy.block, addy.CRC, skip other buffers, process flag ADDU A0,S6,R0 ;A0=[A0 f/caller]: block# ADDIU V0,R0,0023 ;V0=23 SB V0,0004 (S1) ;23->buffer+4: send #bytes ADDIU V0,R0,0003 ;V0=03 SB V0,0006 (S1) ;03->buffer+6: command 3: write controller slot SRA V0,S6,0x3 ;V0=S6*8: upper half of block# SB S7,0005 (S1) ;01->buffer+5: read #bytes SB V0,0007 (S1) ;V0->buffer+7: block.hi JAL 80202BF0 ;V0=address CRC SB S8,0008 (S1) ;S8->buffer+8: block.lo LBU V1,0008 (S1) ;V1=buffer+8: block# ADDU S0,R0,R0 ;S0=0 init.count SB S3,002A (S1) ;FE->buffer+2A SB S3,002B (S1) ;FE->buffer+2B SB S3,002C (S1) ;FE->buffer+2C SB S3,002D (S1) ;FE->buffer+2D SB S7,003F (S1) ;1->buffer+3F: process PIF commands OR V1,V1,V0 ;V1|=V0: block | CRC SB V1,0008 (S1) ;V1->buffer+8: tack on CRC //80202ADC: set cache for PIFram buffer SLL V0,S0,0x2 ;V0=S0*4: count->offset LW A0,9128 (S2) ;A0=80249128: p->PIFram buffer ADDIU S0,S0,0001 ;S0++ count++ JAL 80218598 ;cache target ADDU A0,A0,V0 ;A0+=V0: PIFram buffer+offset SLTI V0,S0,0010 BNE V0,R0,80202AE0 ;loop for whole buffer SLL V0,S0,0x2 //80202AFC: send write request to buffer LW A0,9128 (S2) ;A0=80249128: p->PIFram buffer JAL 802026E4 ;write buffer A0 to PIFram ADDU S0,R0,R0 ;S0=0 init.count LUI V1,0005 ORI V1,V1,090F ;V1=5090F: 329999 //80202B10: wait an arbitrary amount of time ADDIU S0,S0,0001 ;S0++ count++ SLT V0,V1,S0 BEQ V0,R0,80202B14 ;loop 330000 times ADDIU S0,S0,0001 LW A0,9128 (S2) ;A0=80249128: p->PIFram buffer JAL 80202BAC ;read PIFram to buffer A0 ADDU S0,R0,R0 ;S0=0 init.count LUI V1,0005 ORI V1,V1,090F ;V1=5090F: 329999 //80202B34: wait an arbitrary amount of time ADDIU S0,S0,0001 ;S0++ count++ SLT V0,V1,S0 BEQL V0,R0,80202B38 ;loop 330000 times ADDIU S0,S0,0001 JAL 80202C30 ;V0=data CRC for mempak data at A0 ADDIU A0,S1,0009 ;A0=buffer+9: p->data //80202A4C: can't just fail on a bad CRC, now can we... LBU V1,0029 (S1) ;V1=buffer+29: data.CRC BNE V0,V1,80202A4C ;loop like an idiot if the CRC doesn't match NOP //80202B58: return LW RA,0034 (SP) LW S8,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 80202B88 wait until SI status clear LUI V0,A480 LW V0,0018 (V0) ;V0=A4800018: SI Status ANDI V0,V0,0003 BEQ V0,R0,80202BA4 ;return if status clear NOP //80202B9C: loop until status clear BNE V0,R0,80202B9C NOP //80202BA4: JR RA NOP 80202BAC read PIFram to buffer A0 accepts: A0=p->PIFram buffer ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 80202B88 ;wait until SI status clear ADDU S0,A0,R0 ;S0=A0: p->buffer LUI V1,1FFF ORI V1,V1,FFFF ;V1=1FFFFFFF: address mask LUI A0,1FC0 ORI A0,A0,07C0 ;A0=1FC007C0: p->PIFram LUI V0,A480 AND S0,S0,V1 ;S0&=V1: actual address SW S0,0000 (V0) ;S0->A4800000: SI dram address SW A0,0004 (V0) ;A0->A4800004: SI read address LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80202BF0 V0=address CRC accepts: A0=mempak block# ADDU A1,R0,R0 ;A1=0 ADDIU A2,R0,0400 ;A2=400 ADDIU A3,R0,0001 ;A3=1 ANDI V0,A1,0010 ;V0=nonzero if 0x10 set //80202C00: SLTU V1,R0,V0 ;V1=TRUE if 0x10 not set AND V0,A0,A2 ;V0=nonzero if mask A2 set in addy BNEL V0,R0,80202C10 ;if V0 set, invert V1 XORI V1,V1,0001 //80202C10: BNE V1,A3,80202C1C ;branch if V1 not set SLL A1,A1,0x1 ;A1*=2: push 1 bit XORI A1,A1,0015 ;A1^=15 //80202C1C: SRA A2,A2,0x1 ;A2/=2: next bit BNE A2,R0,80202C00 ;loop for each bit ANDI V0,A1,0010 //80202C28: return JR RA ANDI V0,A1,001F ;V0=A1&0x1F: address CRC 80202C30 V0=data CRC for mempak data at A0 ADDU A2,R0,R0 ADDU A3,R0,R0 ADDIU T1,R0,0001 ADDIU A1,R0,0080 ADDU V0,A0,A3 LBU T0,0000 (V0) ANDI V0,A2,0080 SLTU V1,R0,V0 AND V0,T0,A1 BNEL V0,R0,80202C5C XORI V1,V1,0001 SLL V0,A2,0x1 BNE V1,T1,80202C6C ADDU A2,V0,R0 XORI A2,V0,0085 SRA A1,A1,0x1 BNE A1,R0,80202C4C ANDI V0,A2,0080 ADDIU A3,A3,0001 SLTI V0,A3,0020 BNE V0,R0,80202C40 ADDIU A1,R0,0080 JR RA ANDI V0,A2,00FF 80202C90 V0=controller 1 slot state ADDIU SP,SP,FFE0 SW RA,001C (SP) SW S2,0018 (SP) SW S1,0014 (SP) JAL 80201D44 ;reset controller and cart eeprom status SW S0,0010 (SP) ADDU S1,R0,R0 ;S1=0 init.count LUI V0,8025 ADDU S2,V0,R0 ;S2=V0: 80250000 ADDIU V0,R0,00FF ;V0=FF fill ADDIU A0,R0,0001 ;A0=01 LW S0,9128 (S2) ;S0=80249128: p->PIFram buffer ADDIU V1,R0,0003 ;V1=03 SB V0,0000 (S0) ;FF->buffer+0 SB V0,0003 (S0) ;FF->buffer+3 SB V0,0007 (S0) ;FF->buffer+7 SB V0,000A (S0) ;FF->buffer+A SB V0,000E (S0) ;FF->buffer+E SB V0,0011 (S0) ;FF->buffer+11 SB V0,0015 (S0) ;FF->buffer+15 SB V0,0018 (S0) ;FF->buffer+18 SB V0,001C (S0) ;FF->buffer+1C SB V0,001F (S0) ;FF->buffer+1F ADDIU V0,R0,00FE ;V0=FE skip SB A0,0001 (S0) ;01->buffer+1 SB V1,0002 (S0) ;03->buffer+2 SB A0,0008 (S0) ;01->buffer+8 SB V1,0009 (S0) ;03->buffer+9 SB A0,000F (S0) ;01->buffer+F SB V1,0010 (S0) ;03->buffer+10 SB A0,0016 (S0) ;01->buffer+16 SB V1,0017 (S0) ;03->buffer+17 SB A0,001D (S0) ;01->buffer+1D SB V1,001E (S0) ;03->buffer+1E SB V0,0023 (S0) ;FE->buffer+23 SB V0,0024 (S0) ;FE->buffer+24 SB A0,003F (S0) ;FE->buffer+3F //80202D24: set cache for PIFram buffer SLL V0,S1,0x2 ;V0=count->offset LW A0,9128 (S2) ;A0=80249128: p->PIFram buffer ADDIU S1,S1,0001 ;S1++ count++ JAL 80218598 ;cache target ADDU A0,A0,V0 ;A0=buffer+offset: target SLTI V0,S1,0010 BNE V0,R0,80202D28 ;loop for whole buffer SLL V0,S1,0x2 //80202D44: send PIF request to SI LUI V0,8025 LW A0,9128 (V0) ;A0=80249128: p->PIFram buffer JAL 802026E4 ;write buffer A0 to PIFram ADDU S1,R0,R0 LUI V1,0005 ORI V1,V1,090F //80202D5C: wait for arbitrary time ADDIU S1,S1,0001 ;S1++ count++ SLT V0,V1,S1 BEQ V0,R0,80202D60 ;loop 330000 times ADDIU S1,S1,0001 //80202D6C: retrieve result from PIF LUI V0,8025 LW A0,9128 (V0) ;A0=80249128: p->PIFram buffer JAL 80202BAC ;read PIFram to buffer A0 ADDU S1,R0,R0 ;S1=0 init.count LUI V1,0005 ORI V1,V1,090F //80202D84: wait for arbitrary time ADDIU S1,S1,0001 ;S1++ count++ SLT V0,V1,S1 BEQ V0,R0,80202D88 ;loop 330000 times ADDIU S1,S1,0001 //80202D94: return LBU V0,0006 (S0) ;V0=S0+6: buffer+6: controller 1 slot state LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80202DB0 ADDIU SP,SP,FFD8 SW S1,0014 (SP) ADDU S1,A0,R0 SW S4,0020 (SP) ADDU S4,A1,R0 ADDU A0,S4,R0 SW RA,0024 (SP) SW S3,001C (SP) SW S2,0018 (SP) JAL 802014F4 SW S0,0010 (SP) ADDU S3,V0,R0 BLEZL S3,80202E40 ADDIU S3,R0,FFFF JAL 8020237C ADDU A0,S4,R0 BEQL V0,R0,80202E4C ADDU S3,R0,R0 LH S0,0008 (V0) BEQ S0,R0,80202E4C ADDU S2,S1,R0 LUI V0,8024 ADDIU S1,V0,0038 LH A1,0000 (S1) ADDIU S1,S1,0002 ADDU A0,S2,R0 ADDIU S0,S0,FFFF ADDIU S2,S2,0100 ADDIU A2,R0,0100 ADDU A3,S4,R0 JAL 8020222C ;copy data from controller A3's mempak blocks A1-A2 to A0 SLL A1,A1,0x8 BNE S0,R0,80202E0C ADDU V0,S3,R0 J 80202E50 NOP LUI A0,8022 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,24CC ADDU V0,S3,R0 LW RA,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80202E70 ADDIU SP,SP,FFD8 SW S3,001C (SP) ADDU S3,A1,R0 ADDU A0,S3,R0 SW RA,0024 (SP) SW S4,0020 (SP) SW S2,0018 (SP) SW S1,0014 (SP) JAL 802014F4 SW S0,0010 (SP) BGTZ V0,80202EA8 LUI A0,8022 J 80203024 ADDU V0,R0,R0 ADDIU A0,A0,24E0 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDU A1,V0,R0 JAL 8020237C ADDU A0,S3,R0 LUI A0,8022 ADDIU A0,A0,2500 ADDU S2,V0,R0 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDU A1,S2,R0 LH V1,0006 (S2) BGEZ V1,80202EE0 ADDU V0,V1,R0 ADDIU V0,V1,00FF SRA A1,V0,0x8 SLL V0,A1,0x8 SUBU V0,V1,V0 SLL V0,V0,0x10 SRA A0,V0,0x10 SLL V0,A1,0x7 ADDU V0,A0,V0 LUI V1,8024 ADDIU S4,V1,4F90 SLL V0,V0,0x1 ADDU A0,V0,S4 LH V1,0000 (A0) BGEZ V1,80202F1C ADDU V0,V1,R0 ADDIU V0,V1,00FF SRA S0,V0,0x8 SLL V0,S0,0x8 SUBU V0,V1,V0 SLL S0,S0,0x7 ADDU S0,V0,S0 ADDU S1,S0,R0 ADDIU V0,R0,0003 SH V0,0000 (A0) ADDU A0,S2,R0 JAL 80203070 ;memset(A0,A1) ADDIU A1,R0,0020 SLL S0,S0,0x10 SRA S0,S0,0x10 ADDIU V0,R0,0001 BEQ S0,V0,80202FA8 ADDU V1,S4,R0 ADDIU T1,R0,0003 ADDU T0,V0,R0 SLL V0,S1,0x10 SRA V0,V0,0xF ADDU A3,V0,V1 LH A0,0000 (A3) BGEZ A0,80202F80 ADDU V0,A0,R0 ADDIU V0,A0,00FF SRA A1,V0,0x8 SLL V0,A1,0x8 SUBU A2,A0,V0 SLL V0,A1,0x7 ADDU V0,A2,V0 ADDU S1,V0,R0 SLL V0,V0,0x10 SRA V0,V0,0x10 BNE V0,T0,80202F64 SH T1,0000 (A3) JAL 8020184C ADDU A0,S3,R0 LUI S1,8024 ADDIU S1,S1,4F90 ADDU A0,S1,R0 ADDIU A1,R0,0100 LUI S0,8022 ADDIU S0,S0,539C SLL S2,S3,0x2 ADDU S0,S2,S0 LW A2,0000 (S0) ADDU A3,S3,R0 JAL 80202548 SLL A2,A2,0x8 ADDU A0,S1,R0 LW A2,0000 (S0) ADDU A3,S3,R0 SLL A2,A2,0x8 JAL 80202548 ADDIU A1,A2,0100 LUI A0,8025 ADDIU A0,A0,A708 ADDIU A2,R0,0200 LUI V0,8022 ADDIU V0,V0,53CC ADDU S2,S2,V0 LW A1,0000 (S2) ADDU A3,S3,R0 JAL 80202548 SLL A1,A1,0x8 ADDIU V0,R0,0001 LW RA,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80203044 memcpy(A0,A1,A2) accepts: A0=p->target, A1=p->source, A2=size BEQ A2,R0,80203068 ADDIU V1,A2,FFFF ADDIU A2,R0,FFFF LBU V0,0000 (A1) ADDIU A1,A1,0001 ADDIU V1,V1,FFFF SB V0,0000 (A0) BNE V1,A2,80203050 ADDIU A0,A0,0001 JR RA NOP 80203070 memset(A0,A1) accepts: A0=p->target, A1=size BEQ A1,R0,8020308C ;return if size zero ADDIU V0,A1,FFFF ;V0=size-1 ADDIU V1,R0,FFFF ;V1= -1 //8020307C: loop for size SB R0,0000 (A0) ;0->target ADDIU V0,V0,FFFF ;V0-- size-- BNE V0,V1,8020307C ;loop A1 times ADDIU A0,A0,0001 ;A0++ target++ //8020308C: return JR RA NOP 80203094 likely data ;JAL 80212AD0 ;ADDIU A0,R0,0001 ;ADDIU A0,S8,000E 802030A0 accepts: A0=, A1= ADDIU SP,SP,FFA8 SW S8,0050 (SP) ADDU S8,A1,R0 ;S8=A1: SW RA,0054 (SP) SW S7,004C (SP) SW S6,0048 (SP) SW S5,0044 (SP) SW S4,0040 (SP) SW S3,003C (SP) SW S2,0038 (SP) SW S1,0034 (SP) SW S0,0030 (SP) SW A0,0058 (SP) ;SP+58=A0: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM SW R0,0028 (SP) BNE S8,R0,802030F0 ;branch if [A1 f/caller] set ADDIU A0,S8,000E ;A0=[A1]+E: JAL 80212B20 ADDIU A0,R0,0001 ADDIU A0,S8,000E ;A0=[A1]+E: //802030F0: ADDIU A1,R0,000E ;A1=E LUI V0,8022 ADDIU S4,V0,7660 ;S4=80227660: string pointer table LW A3,00CC (S4) ;A3=str+CC: 802240C0 "GameShark Pro Version 3.30" ADDIU A2,R0,001F ;A2=1F: JAL 80212C90 SW R0,0010 (SP) ;0->SP+10: ADDIU A0,R0,000E SUBU A0,A0,S8 ADDIU A1,R0,0022 LW A3,04F8 (S4) ;A3=str+4F8: 8022437C "Memory Card Manager" ADDIU A2,R0,001F JAL 80212C90 SW R0,0010 (SP) ADDIU A0,R0,0010 SUBU A0,A0,S8 ADDIU A1,R0,0038 ADDIU A2,R0,008C ADDIU A3,R0,009C JAL 80213988 SW R0,0010 (SP) ADDIU A0,S8,00A4 ADDIU A1,R0,0038 ADDIU A2,R0,008C ADDIU A3,R0,009C JAL 80213988 SW R0,0010 (SP) LUI A0,8024 LW V1,2C80 (A0) ADDIU V0,R0,0001 BEQ V1,V0,80203180 ADDIU V0,R0,0002 BEQ V1,V0,80203328 ADDIU V0,A0,2C80 J 80203650 NOP LUI V1,8024 LW V0,2D00 (V1) BNE V0,R0,802031B8 ADDU S1,R0,R0 LUI A0,8022 ADDIU A0,A0,2520 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDU A1,S1,R0 ADDIU A0,R0,0020 SUBU A0,A0,S8 ADDIU A1,R0,0064 LW A2,051C (S4) ;A2=str+51C: 80222D40 "No Cards Found" J 80203640 LUI A3,FFC0 ADDU A1,R0,R0 ADDIU S0,R0,0001 ADDU T0,S0,R0 ADDIU A3,A0,2C80 LUI V0,8025 ADDIU A2,V0,8FA8 LUI V0,8025 ADDIU A0,V0,9AD0 ADDIU V0,V1,2D00 ADDIU V1,V0,0004 LW V0,0000 (V1) BNEL V0,T0,8020321C ADDIU S0,S0,0001 LW V0,0004 (A3) SLTI V0,V0,0002 BNEL V0,R0,80203218 ADDIU A1,A1,0001 LW V0,0004 (A0) SLL V0,V0,0x2 ADDU V0,V0,A2 LW V0,0018 (V0) BEQL V0,S0,8020321C ADDIU S0,S0,0001 ADDIU A1,A1,0001 ADDIU S0,S0,0001 SLTI V0,S0,0006 BNE V0,R0,802031E0 ADDIU V1,V1,0004 ADDIU S0,R0,0001 ADDIU S6,A1,FFFF ADDIU S5,R0,04FC LUI V0,8024 ADDIU V0,V0,2D00 ADDIU S4,V0,0004 LUI V0,8025 ADDIU S7,V0,8FA8 SLL V0,S1,0x2 ADDU S3,V0,S7 SLL V0,S1,0x3 ADDIU S2,V0,0064 LW V1,0000 (S4) ADDIU V0,R0,0001 BNEL V1,V0,80203310 ADDIU S5,S5,0004 LUI T1,8024 ADDIU T1,T1,2C80 LW V0,0004 (T1) SLTI V0,V0,0002 BNEL V0,R0,802032A4 LUI A3,7BDE LUI T1,8025 ADDIU T1,T1,9AD0 LW V0,0004 (T1) SLL V0,V0,0x2 ADDU V0,V0,S7 LW V0,0018 (V0) BEQL V0,S0,80203310 ADDIU S5,S5,0004 LUI A3,7BDE LUI V0,8022 LW V0,7428 (V0) BNE V0,R0,802032DC ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LUI T1,8025 LW V0,9AD0 (T1) BEQ V0,S1,802032D4 SLT V0,S6,V0 BEQ V0,R0,802032E0 ADDIU A0,R0,0028 BNE S1,S6,802032E4 SUBU A0,A0,S8 LUI A3,FFFE ORI A3,A3,FFFE ADDIU A0,R0,0028 SUBU A0,A0,S8 ADDU A1,S2,R0 ADDIU S2,S2,0008 LUI T1,8022 ADDIU T1,T1,7660 ;T1=80227660: string pointer table ADDU V0,S5,T1 LW A2,0000 (V0) ;A2=str+offset: JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDIU S1,S1,0001 SW S0,0000 (S3) ADDIU S3,S3,0004 ADDIU S5,S5,0004 ADDIU S0,S0,0001 SLTI V0,S0,0006 BNE V0,R0,80203258 ADDIU S4,S4,0004 J 8020364C LUI A0,8024 ADDIU A0,R0,0026 SUBU A0,A0,S8 ADDIU A1,R0,0030 LUI V1,8025 LUI S3,8025 LW V0,9AD0 (S3) ADDIU S2,V1,8FA8 SLL V0,V0,0x2 ADDU V0,V0,S2 LW V0,0000 (V0) LUI A3,FFC0 ADDIU V0,V0,013E SLL V0,V0,0x2 ADDU V0,V0,S4 LW A2,0000 (V0) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 LW V0,9AD0 (S3) LUI V1,8024 SLL V0,V0,0x2 ADDU V0,V0,S2 LW V0,0000 (V0) ADDIU V1,V1,2C58 SLL V0,V0,0x2 ADDU V0,V0,V1 LW V0,0000 (V0) BNE V0,R0,802035F8 ADDIU S0,R0,002C ADDU S1,R0,R0 ADDU S0,S1,R0 ADDU S7,S2,R0 ADDU S6,S3,R0 LUI S5,8025 LUI S4,8024 ADDIU S4,S4,2050 ADDU S3,S1,R0 ADDIU S2,R0,0040 LW V0,9AD0 (S6) LUI T1,8024 SLL V0,V0,0x2 ADDU V0,V0,S7 LW V1,0000 (V0) ADDIU T1,T1,2038 SLL V0,V1,0x2 ADDU V0,V0,T1 LW V0,0000 (V0) BEQL S1,V0,80203470 ADDIU S4,S4,0020 SLL V0,V1,0x9 ADDU V0,S3,V0 LUI T1,8024 ADDIU T1,T1,2050 ADDU V0,V0,T1 LBU V0,0000 (V0) BEQL V0,R0,80203470 ADDIU S4,S4,0020 LUI A3,7BDE LUI V0,8022 LW V0,7428 (V0) BNE V0,R0,80203430 ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LW V0,95E8 (S5) BNE V0,S1,80203440 ADDIU A0,R0,0018 LUI A3,FFFE ORI A3,A3,FFFE LW V0,95E8 (S5) BEQL V0,S1,8020343C SW S0,0028 (SP) ADDIU A0,R0,0018 SUBU A0,A0,S8 ADDU A1,S2,R0 LW V0,9AD0 (S6) ADDIU S2,S2,0008 SLL V0,V0,0x2 ADDU V0,V0,S7 LW A2,0000 (V0) ADDIU S1,S1,0001 SLL A2,A2,0x9 JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDU A2,A2,S4 ADDIU S4,S4,0020 ADDIU S0,S0,0001 SLTI V0,S0,0010 BNE V0,R0,802033BC ADDIU S3,S3,0020 LUI A0,8024 LUI V1,8025 LUI V0,8025 LW V0,9AD0 (V0) ADDIU V1,V1,8FA8 SLL V0,V0,0x2 ADDU V0,V0,V1 LW V0,0000 (V0) ADDIU A0,A0,2038 SLL V0,V0,0x2 ADDU V0,V0,A0 LW V0,0000 (V0) BNEL V0,R0,80203500 LUI S3,8022 LUI A3,7BDE LUI V0,8022 LW V0,7428 (V0) BNE V0,R0,802034E4 ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LUI V0,8025 LW V0,95E8 (V0) BNE V0,R0,802034E8 ADDIU A0,R0,0018 LUI A3,FFFE ORI A3,A3,FFFE ADDIU A0,R0,0018 SUBU A0,A0,S8 LUI V0,8022 LW A2,77D4 (V0) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDIU A1,R0,0040 LUI S3,8022 LW V0,7428 (S3) BNE V0,R0,8020352C ADDIU A0,R0,0018 SUBU A0,A0,S8 ADDIU A1,R0,00C0 LUI V0,8022 LW A2,7B70 (V0) LUI A3,FFC0 JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 ADDIU A0,R0,0018 SUBU A0,A0,S8 ADDIU A1,R0,00C8 LUI A3,FFC0 LUI V0,8022 LW A2,7B74 (V0) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 LUI V1,8024 LUI S0,8025 LUI S1,8025 LW V0,9AD0 (S1) ADDIU S0,S0,8FA8 SLL V0,V0,0x2 ADDU V0,V0,S0 LW V0,0000 (V0) ADDIU V1,V1,0020 SLL V0,V0,0x2 ADDU V0,V0,V1 LW A0,0000 (V0) JAL 80210DB4 ;ltoa(A0,A1,0xA) ADDIU A1,SP,0018 ADDIU V0,R0,0078 SUBU S2,V0,S8 ADDU A0,S2,R0 ADDIU A1,R0,00C8 ADDIU A2,SP,0018 LUI A3,FFC0 JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 LUI A0,8024 ADDIU A0,A0,2050 LW V0,9AD0 (S1) LW T1,0028 (SP) SLL V0,V0,0x2 ADDU V0,V0,S0 LW V1,0000 (V0) SLL V0,T1,0x5 SLL V1,V1,0x9 ADDU V0,V0,V1 ADDU V0,V0,A0 LBU A0,001F (V0) JAL 80210DB4 ;ltoa(A0,A1,0xA) ADDIU A1,SP,0018 LW V0,7428 (S3) BNE V0,R0,8020364C LUI A0,8024 ADDU A0,S2,R0 ADDIU A1,R0,00C0 ADDIU A2,SP,0018 J 80203640 LUI A3,FFC0 SUBU S0,S0,S8 ADDU A0,S0,R0 ADDIU A1,R0,0064 LUI A3,FFC0 LW A2,055C (S4) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 ADDU A0,S0,R0 ADDIU A1,R0,006C LUI A3,FFC0 LW A2,0560 (S4) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 ADDIU A0,R0,0034 SUBU A0,A0,S8 ADDIU A1,R0,0074 LUI A3,FFC0 LW A2,0564 (S4) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 LUI A0,8024 ADDIU V0,A0,2C80 LW V1,0004 (V0) ADDIU V0,R0,0001 BEQ V1,V0,80203670 ADDIU V0,R0,0002 BEQ V1,V0,802037F8 ADDIU A0,S8,00BA J 80203B18 NOP LUI V1,8024 LW V0,2D00 (V1) BNE V0,R0,80203698 ADDU S1,R0,R0 ADDIU A0,S8,00B4 ADDIU A1,R0,0064 LUI V0,8022 LW A2,7B7C (V0) J 80203B10 LUI A3,FFC0 ADDU A1,R0,R0 ADDIU S0,R0,0001 ADDU A3,S0,R0 ADDIU V0,V1,2D00 LW V1,2C80 (A0) ADDIU A0,V0,0004 LUI V0,8025 LW V0,9AD0 (V0) SLTI A2,V1,0002 LUI V1,8025 ADDIU V1,V1,8FA8 SLL V0,V0,0x2 ADDU V1,V0,V1 LW V0,0000 (A0) BNEL V0,A3,802036F4 ADDIU S0,S0,0001 BNEL A2,R0,802036F0 ADDIU A1,A1,0001 LW V0,0000 (V1) BEQL V0,S0,802036F4 ADDIU S0,S0,0001 ADDIU A1,A1,0001 ADDIU S0,S0,0001 SLTI V0,S0,0006 BNE V0,R0,802036CC ADDIU A0,A0,0004 ADDIU S0,R0,0001 ADDIU S6,A1,FFFF ADDIU S5,R0,04FC LUI V0,8024 ADDIU V0,V0,2D00 ADDIU S4,V0,0004 LUI V0,8025 ADDIU S7,V0,8FA8 SLL V0,S1,0x2 ADDU S3,V0,S7 SLL V0,S1,0x3 ADDIU S2,V0,0064 LW V1,0000 (S4) ADDIU V0,R0,0001 BNEL V1,V0,802037E0 ADDIU S5,S5,0004 LUI V0,8024 LW V0,2C80 (V0) SLTI V0,V0,0002 BNEL V0,R0,80203774 LUI A3,7BDE LUI T1,8025 LW V0,9AD0 (T1) SLL V0,V0,0x2 ADDU V0,V0,S7 LW V0,0000 (V0) BEQL V0,S0,802037E0 ADDIU S5,S5,0004 LUI A3,7BDE LUI V0,8022 LW V0,7428 (V0) BNE V0,V1,802037B0 ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LUI T1,8025 ADDIU T1,T1,9AD0 LW V0,0004 (T1) BEQ V0,S1,802037A8 SLT V0,S6,V0 BEQ V0,R0,802037B4 ADDIU A0,S8,00BC BNE S1,S6,802037B8 ADDU A1,S2,R0 LUI A3,FFFE ORI A3,A3,FFFE ADDIU A0,S8,00BC ADDU A1,S2,R0 ADDIU S2,S2,0008 LUI T1,8022 ADDIU T1,T1,7660 ;T1=80227660: string pointer table ADDU V0,S5,T1 LW A2,0000 (V0) ;A2=str+offset: JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDIU S1,S1,0001 SW S0,0018 (S3) ADDIU S3,S3,0004 ADDIU S5,S5,0004 ADDIU S0,S0,0001 SLTI V0,S0,0006 BNE V0,R0,80203730 ADDIU S4,S4,0004 J 80203B18 NOP ADDIU A1,R0,0030 LUI A3,FFC0 LUI A2,8022 LUI V1,8025 LUI V0,8025 ADDIU S3,V0,9AD0 LW V0,0004 (S3) ADDIU S2,V1,8FA8 SLL V0,V0,0x2 ADDU V0,V0,S2 LW V0,0018 (V0) ADDIU S1,A2,7660 ;S1=80227660: string pointer table ADDIU V0,V0,013E SLL V0,V0,0x2 ADDU V0,V0,S1 LW A2,0000 (V0) ;A2=str+offset: JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 LW V0,0004 (S3) LUI V1,8024 SLL V0,V0,0x2 ADDU V0,V0,S2 LW V0,0018 (V0) ADDIU V1,V1,2C58 SLL V0,V0,0x2 ADDU V0,V0,V1 LW V0,0000 (V0) BNE V0,R0,80203AC8 ADDIU S0,R0,00C0 ADDU S1,R0,R0 ADDU S0,S1,R0 ADDU S7,S2,R0 ADDU S6,S3,R0 LUI V0,8025 ADDIU S5,V0,95E8 LUI S4,8024 ADDIU S4,S4,2050 ADDU S3,S1,R0 ADDIU S2,R0,0040 LW V0,0004 (S6) LUI T1,8024 SLL V0,V0,0x2 ADDU V0,V0,S7 LW V1,0018 (V0) ADDIU T1,T1,2038 SLL V0,V1,0x2 ADDU V0,V0,T1 LW V0,0000 (V0) BEQL S1,V0,80203948 ADDIU S4,S4,0020 SLL V0,V1,0x9 ADDU V0,S3,V0 LUI T1,8024 ADDIU T1,T1,2050 ADDU V0,V0,T1 LBU V0,0000 (V0) BEQL V0,R0,80203948 ADDIU S4,S4,0020 LUI A3,7BDE LUI V0,8022 LW V1,7428 (V0) ADDIU V0,R0,0001 BNE V1,V0,8020390C ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LW V0,0004 (S5) BNE V0,S1,8020391C ADDIU A0,S8,00AC LUI A3,FFFE ORI A3,A3,FFFE LW V0,0004 (S5) BEQL V0,S1,80203918 SW S0,0028 (SP) ADDIU A0,S8,00AC ADDU A1,S2,R0 LW V0,0004 (S6) ADDIU S2,S2,0008 SLL V0,V0,0x2 ADDU V0,V0,S7 LW A2,0018 (V0) ADDIU S1,S1,0001 SLL A2,A2,0x9 JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDU A2,A2,S4 ADDIU S4,S4,0020 ADDIU S0,S0,0001 SLTI V0,S0,0010 BNE V0,R0,80203894 ADDIU S3,S3,0020 LUI A0,8024 LUI V1,8025 LUI V0,8025 LW V0,9AD4 (V0) ADDIU V1,V1,8FA8 SLL V0,V0,0x2 ADDU V0,V0,V1 LW V0,0018 (V0) ADDIU A0,A0,2038 SLL V0,V0,0x2 ADDU V0,V0,A0 LW V0,0000 (V0) BNEL V0,R0,802039D8 LUI S4,8022 LUI A3,7BDE LUI V0,8022 LW V1,7428 (V0) ADDIU V0,R0,0001 BNE V1,V0,802039C0 ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LUI V0,8025 LW V0,95EC (V0) BNE V0,R0,802039C4 ADDIU A0,S8,00AC LUI A3,FFFE ORI A3,A3,FFFE ADDIU A0,S8,00AC LUI V0,8022 LW A2,77D4 (V0) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDIU A1,R0,0040 LUI S4,8022 LW V0,7428 (S4) ADDIU S3,R0,0001 BNE V0,S3,80203A04 ADDIU A0,S8,00AC ADDIU A1,R0,00C0 LUI V0,8022 LW A2,7B70 (V0) LUI A3,FFC0 JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 ADDIU A0,S8,00AC ADDIU A1,R0,00C8 LUI A3,FFC0 LUI V0,8022 LW A2,7B74 (V0) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 LUI V1,8024 LUI S1,8025 LUI S0,8025 ADDIU S0,S0,9AD0 LW V0,0004 (S0) ADDIU S1,S1,8FA8 SLL V0,V0,0x2 ADDU V0,V0,S1 LW V0,0018 (V0) ADDIU V1,V1,0020 SLL V0,V0,0x2 ADDU V0,V0,V1 LW A0,0000 (V0) JAL 80210DB4 ;ltoa(A0,A1,0xA) ADDIU A1,SP,0018 ADDIU S2,S8,010C ADDU A0,S2,R0 ADDIU A1,R0,00C8 ADDIU A2,SP,0018 LUI A3,FFC0 JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 LUI A0,8024 ADDIU A0,A0,2050 LW V0,0004 (S0) LW T1,0028 (SP) SLL V0,V0,0x2 ADDU V0,V0,S1 LW V1,0018 (V0) SLL V0,T1,0x5 SLL V1,V1,0x9 ADDU V0,V0,V1 ADDU V0,V0,A0 LBU A0,001F (V0) JAL 80210DB4 ;ltoa(A0,A1,0xA) ADDIU A1,SP,0018 LW V0,7428 (S4) BNE V0,S3,80203B18 ADDU A0,S2,R0 ADDIU A1,R0,00C0 ADDIU A2,SP,0018 J 80203B10 LUI A3,FFC0 SUBU S0,S0,S8 ADDU A0,S0,R0 ADDIU A1,R0,0064 LUI A3,FFC0 LW A2,055C (S1) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 ADDU A0,S0,R0 ADDIU A1,R0,006C LUI A3,FFC0 LW A2,0560 (S1) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 ADDIU A0,R0,00C8 SUBU A0,A0,S8 ADDIU A1,R0,0074 LUI A3,FFC0 LW A2,0564 (S1) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 LW T1,0058 (SP) BNE T1,R0,80203BE8 LUI V0,8022 LW V0,7418 (V0) BNE V0,R0,80203BF4 LUI V0,FFC0 LUI V1,8024 LUI V0,8022 LW A0,7428 (V0) ADDIU V1,V1,2C80 SLL V0,A0,0x2 ADDU V0,V0,V1 LW V0,0000 (V0) SLTI V0,V0,0002 BEQ V0,R0,80203B90 LUI V0,FFC0 ORI V0,V0,FFC0 ADDU A0,R0,R0 ADDIU A1,R0,00D8 LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A3,052C (S0) ;A3=str+52C: 80222CE0 "A:SELECT L:FORMAT " ADDIU A2,R0,0140 JAL 802136DC ;display string A3 in colour SP+10 centered on line at {A2-A0,A1} SW V0,0010 (SP) LUI V1,8025 LW V0,B2AC (V1) LW A0,0530 (S0) ;A0=str+530: 80222CC4 "B:EXIT R:RE-READ" J 80203BDC ADDIU V0,V0,0008 BNE A0,R0,80203B9C ADDIU V1,R0,014F ADDIU V1,R0,014D LUI V0,FFC0 ORI V0,V0,FFC0 ADDU A0,R0,R0 ADDIU A1,R0,00D8 LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table SW V0,0010 (SP) SLL V0,V1,0x2 ADDU V0,V0,S0 LW A3,0000 (V0) ;A3=str+offset: JAL 802136DC ;display string A3 in colour SP+10 centered on line at {A2-A0,A1} ADDIU A2,R0,0140 LUI V1,8025 LW V0,B2AC (V1) LW A0,0538 (S0) ;A0=str+538: 80222C8C "Z:DELETE FILE R:RE-READ" ADDIU V0,V0,0008 JAL 80212520 ;print string A0 to screen SW V0,B2AC (V1) LUI V0,8022 LW V0,7418 (V0) BEQ V0,R0,80203C2C LUI V0,FFC0 ORI V0,V0,FFC0 ADDU A0,R0,R0 ADDIU A1,R0,00D8 LUI V1,8022 SW V0,0010 (SP) LUI V0,8022 LW V0,7418 (V0) ADDIU V1,V1,7660 ;V1=80227660: string pointer table ADDIU V0,V0,0150 SLL V0,V0,0x2 ADDU V0,V0,V1 LW A3,0000 (V0) ;A3=str+offset: JAL 802136DC ;display string A3 in colour SP+10 centered on line at {A2-A0,A1} ADDIU A2,R0,0140 LUI S1,8022 LW V0,7410 (S1) BEQ V0,R0,80203DE0 NOP JAL 8021853C ;invalidate any CACHE work on first 6K of RAM ADDIU S0,R0,0001 LUI V0,0028 ORI V0,V0,0028 ADDIU A0,R0,0040 ADDIU A1,R0,00A6 ADDIU A2,R0,00C1 ADDIU A3,R0,002D JAL 8021126C SW V0,0010 (SP) ADDIU A0,R0,0040 SUBU A0,A0,S8 ADDIU A1,R0,00A6 ADDIU A2,R0,00C1 ADDIU A3,R0,002D JAL 80213988 SW S0,0010 (SP) LW V1,7410 (S1) ADDIU V0,R0,0002 BEQ V1,V0,80203CF0 SLTI V0,V1,0003 BEQ V0,R0,80203CA8 ADDIU V0,R0,0003 BEQ V1,S0,80203CB8 LUI V0,8022 J 80203D6C NOP BEQ V1,V0,80203D28 LUI V0,8022 J 80203D6C NOP LUI S1,FFFE ORI S1,S1,FFFE ADDIU A0,R0,0040 ADDIU A1,R0,00AC LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A3,04CC (S0) ;A3=str+4CC: 80222EB4 "Are you sure" ADDIU A2,R0,00C1 JAL 802136DC ;display string A3 in colour SP+10 centered on line at {A2-A0,A1} SW S1,0010 (SP) ADDIU A0,R0,0040 LW A3,0528 (S0) ;A3=str+528: 80222CFC "you want to format?" J 80203D5C ADDIU A1,R0,00B4 LUI S1,FFFE ORI S1,S1,FFFE ADDIU A0,R0,0040 ADDIU A1,R0,00AC LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A3,0550 (S0) ;A3=str+550: 80222BD0 "Are you sure you" ADDIU A2,R0,00C1 JAL 802136DC ;display string A3 in colour SP+10 centered on line at {A2-A0,A1} SW S1,0010 (SP) ADDIU A0,R0,0040 LW A3,0554 (S0) ;A3=str+554: 80222BB8 "want to delete file?" J 80203D5C ADDIU A1,R0,00B4 LUI S1,FFFE ORI S1,S1,FFFE ADDIU A0,R0,0040 ADDIU A1,R0,00AC LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A3,0550 (S0) ;A3=str+550: 80222BD0 "Are you sure you" ADDIU A2,R0,00C1 JAL 802136DC ;display string A3 in colour SP+10 centered on line at {A2-A0,A1} SW S1,0010 (SP) ADDIU A0,R0,0040 ADDIU A1,R0,00B4 LW A3,0558 (S0) ;A3=str+558: 80222BA4 "want to overwrite?" ADDIU A2,R0,00C1 JAL 802136DC ;display string A3 in colour SP+10 centered on line at {A2-A0,A1} SW S1,0010 (SP) LUI V0,8022 LW V0,7414 (V0) BNE V0,R0,80203DAC ADDIU A0,R0,006E ADDIU A0,R0,00A5 ADDIU A1,R0,00C6 LUI A3,7BDE LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A2,0170 (S0) ;A2=str+170: 80223EEC " No" JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% ADDIU A0,R0,006E ADDIU A1,R0,00C6 LW A2,016C (S0) ;A2=str+16C: 80223EF0 "Yes" J 80203DD8 LUI A3,FFFE ADDIU A1,R0,00C6 LUI A3,7BDE LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A2,016C (S0) ;A2=str+16C: 80223EF0 "Yes" JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% ADDIU A0,R0,00A5 ADDIU A1,R0,00C6 LUI A3,FFFE LW A2,0170 (S0) ;A2=str+170: 80223EEC " No" JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFFE //80203DE0: return LW RA,0054 (SP) LW S8,0050 (SP) LW S7,004C (SP) LW S6,0048 (SP) LW S5,0044 (SP) LW S4,0040 (SP) LW S3,003C (SP) LW S2,0038 (SP) LW S1,0034 (SP) LW S0,0030 (SP) JR RA ADDIU SP,SP,0058 80203E10 accepts: A0=??? ADDIU SP,SP,FFE8 SUBU A1,R0,A0 ;A1= -A0 SW RA,0010 (SP) JAL 802030A0 ADDIU A0,R0,0001 ;A0=1 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80203E30 accepts: A0= ADDIU SP,SP,FFE8 SUBU A1,R0,A0 ;A1= -A0 SW RA,0010 (SP) JAL 802030A0 ADDU A0,R0,R0 ;A0=0 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80203E50 ADDIU SP,SP,FFE0 LUI V0,8022 ADDIU V0,V0,2550 LUI A2,8022 LUI A3,8022 ADDU A0,R0,R0 ADDIU A1,R0,0003 ADDIU A2,A2,2538 ADDIU A3,A3,2544 SW RA,0018 (SP) JAL 80214210 SW V0,0010 (SP) LW RA,0018 (SP) JR RA ADDIU SP,SP,0020 80203E8C ADDIU SP,SP,FFB0 ADDIU T2,R0,0001 SW S6,0040 (SP) ADDU S6,R0,R0 LUI V0,8022 SW RA,004C (SP) SW S8,0048 (SP) SW S7,0044 (SP) SW S5,003C (SP) SW S4,0038 (SP) SW S3,0034 (SP) SW S2,0030 (SP) SW S1,002C (SP) SW S0,0028 (SP) SW R0,0018 (SP) SW T2,001C (SP) SW R0,0020 (SP) JAL 8020521C SW R0,7418 (V0) ADDU S2,S6,R0 LUI V1,8024 ADDIU A3,V1,2C58 LUI V1,8024 ADDIU A2,V1,0020 LUI V1,8024 ADDIU A1,V1,2038 LUI V1,8024 ADDIU A0,V1,2D00 LUI V1,8022 SW V0,741C (V1) LUI V0,8022 SW R0,7410 (V0) LUI V0,8024 LW T3,001C (SP) LUI V1,8025 SW T3,EF74 (V0) LUI V0,8024 ADDIU T2,V0,EF78 ADDIU T6,V1,9130 LWL T4,0000 (T2) LWR T4,0003 (T2) LWL T5,0004 (T2) LWR T5,0007 (T2) SWL T4,0000 (T6) SWR T4,0003 (T6) SWL T5,0004 (T6) SWR T5,0007 (T6) LWL T4,0008 (T2) LWR T4,000B (T2) LB T5,000C (T2) SWL T4,0008 (T6) SWR T4,000B (T6) SB T5,000C (T6) LUI V1,8022 LUI V0,8024 ADDIU T6,V0,EF88 ADDIU T5,V1,537C LWL T3,0000 (T6) LWR T3,0003 (T6) LB T4,0004 (T6) SWL T3,0000 (T5) SWR T3,0003 (T5) SB T4,0004 (T5) LB T3,0005 (T6) SB T3,0005 (T5) LUI V0,8024 SW R0,2C80 (V0) ADDIU V0,V0,2C80 SW R0,0004 (V0) LUI V0,8025 SW R0,9AD0 (V0) ADDIU V0,V0,9AD0 SW R0,0004 (V0) LUI V0,8025 SW R0,95E8 (V0) ADDIU V0,V0,95E8 SW R0,0004 (V0) SW R0,0000 (A0) SW R0,0000 (A1) SW R0,0000 (A2) SW R0,0000 (A3) ADDIU A3,A3,0004 ADDIU A2,A2,0004 ADDIU A1,A1,0004 ADDIU S2,S2,0001 SLTI V0,S2,0006 BNE V0,R0,80203FC0 ADDIU A0,A0,0004 LUI A0,8021 ADDIU A0,A0,18BC LUI A1,8020 ADDIU A1,A1,3E10 JAL 8021401C ADDU A2,R0,R0 ADDIU A0,R0,0001 JAL 802030A0 ADDU A1,R0,R0 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP ADDIU A0,R0,0010 ADDIU A1,R0,00D8 LUI A3,FFC0 LUI V0,8022 LW A2,7B78 (V0) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP JAL 80200940 ;copy save game data from controller paks and N64 NOP LUI V0,8024 ADDIU V1,R0,0001 ADDIU S0,V0,2C80 SW V1,2C80 (V0) LUI V0,8025 LW V0,9128 (V0) ;V0=80249128: p->PIFram buffer SW V1,0004 (S0) JAL 80210D30 ;V0=button and stick pos for controller 1 SW V0,0024 (SP) LW T2,0018 (SP) BNE T2,R0,802050D8 LUI S5,8022 LUI V0,8025 ADDIU S3,V0,9AD0 LUI V0,8025 ADDIU S4,V0,8FA8 LUI V0,8024 ADDIU S8,V0,2050 JAL 80210D4C ;V0=button and stick pos NOP ADDU S7,V0,R0 ;S7=V0: button/stick LUI V0,4000 AND V0,S7,V0 ;V0=nonzero if B pressed BEQ V0,R0,802040F0 LUI T3,8024 LW V0,7428 (S5) ADDIU T3,T3,2C80 SLL V0,V0,0x2 ADDU V1,V0,T3 LW V0,0000 (V1) SLTI V0,V0,0002 BNE V0,R0,802040DC ADDIU T5,R0,0001 ADDIU T4,R0,0001 J 802040E0 SW T4,0000 (V1) SW T5,0018 (SP) LUI A0,4000 LUI T6,8020 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T6,3E30 LUI V0,0100 ORI V0,V0,0008 ;V0=01000008: + right, stick right AND V0,S7,V0 ;V0=nonzero if right pressed BEQ V0,R0,80204108 ADDIU T2,R0,0001 SW T2,7428 (S5) LUI V0,0200 ORI V0,V0,0004 ;V0=02000004: + left, stick left AND V0,S7,V0 ;V0=nonzero if left pressed BNEL V0,R0,8020411C SW R0,7428 (S5) LUI V0,0800 ORI V0,V0,0002 ;V0=08000002: + up, stick up AND V0,S7,V0 ;V0=nonzero if up pressed BEQ V0,R0,80204178 LUI T3,8024 LW V0,7428 (S5) ADDIU T3,T3,2C80 SLL V1,V0,0x2 ADDU V0,V1,T3 LW V0,0000 (V0) SLTI V0,V0,0002 BEQ V0,R0,80204158 LUI T4,8025 J 80204160 ADDU V1,V1,S3 ADDIU T4,T4,95E8 ADDU V1,V1,T4 LW V0,0000 (V1) BLEZ V0,80204170 ADDIU V0,V0,FFFF SW V0,0000 (V1) ADDIU T5,R0,0001 SW T5,0020 (SP) LUI V0,0400 ORI V0,V0,0001 ;V0=04000001: + down, stick down AND V0,S7,V0 ;V0=nonzero if down pressed BEQ V0,R0,8020421C LUI T6,8024 LW A0,7428 (S5) ADDIU T6,T6,2C80 SLL A1,A0,0x2 ADDU V0,A1,T6 LW V0,0000 (V0) SLTI V0,V0,0002 BEQ V0,R0,802041B8 LUI T2,8024 LW V0,2D00 (T2) J 802041FC ADDU A0,A1,S3 ADDU V0,A1,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 LUI T3,8025 ADDIU T3,T3,95E8 ADDU A0,A1,T3 LUI T4,8024 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V0,0000 (V1) ADDIU T4,T4,2038 SLL V0,V0,0x2 ADDU V0,V0,T4 LW V0,0000 (V0) LW V1,0000 (A0) ADDIU V0,V0,FFFF SLT V0,V1,V0 BEQ V0,R0,80204214 ADDIU V0,V1,0001 SW V0,0000 (A0) ADDIU T5,R0,0001 SW T5,0020 (SP) LUI V0,2000 AND V0,S7,V0 ;V0=nonzero if Z pressed BEQ V0,R0,80204500 LUI T6,8024 LW A0,7428 (S5) ADDIU T6,T6,2C80 SLL V1,A0,0x2 ADDU V0,V1,T6 LW V0,0000 (V0) SLTI V0,V0,0002 BNE V0,R0,80204500 ADDU V0,V1,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 LUI T2,8024 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V1,0000 (V1) ADDIU T2,T2,2038 SLL V0,V1,0x2 ADDU V0,V0,T2 LW V0,0000 (V0) BLEZ V0,80204500 ADDIU T3,R0,0005 BEQ V1,T3,80204500 LUI A0,2000 LUI T4,8020 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T4,3E30 LUI S0,8022 ADDIU V0,R0,0002 JAL 80205110 SW V0,7410 (S0) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM SW R0,7410 (S0) LUI V0,8022 LW V0,7414 (V0) BNE V0,R0,80204500 ADDIU A0,R0,0001 JAL 802030A0 ADDU A1,R0,R0 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDU A2,R0,R0 ADDU S2,A2,R0 LUI T5,8025 ADDIU T5,T5,95E8 LUI T6,8024 LW A0,7428 (S5) ADDIU T6,T6,2038 SLL A1,A0,0x2 ADDU V0,A1,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V0,0000 (V1) ADDU A1,A1,T5 SLL V1,V0,0x9 SLL V0,V0,0x2 ADDU V0,V0,T6 LW A0,0000 (V0) BEQL A2,A0,80204360 ADDIU S2,S2,0001 ADDU V0,V1,S8 LBU V0,0000 (V0) BEQL V0,R0,80204360 ADDIU S2,S2,0001 LW V0,0000 (A1) BEQL V0,A2,80204358 ADDU S6,S2,R0 ADDIU A2,A2,0001 ADDIU S2,S2,0001 SLTI V0,S2,0010 BNE V0,R0,80204334 ADDIU V1,V1,0020 ADDU S2,R0,R0 LUI V0,8025 ADDIU T0,V0,9130 LUI V0,8025 ADDIU A3,V0,9AF8 SLL A2,S6,0x5 LW A0,7428 (S5) ADDU A1,S2,T0 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V1,0000 (V1) ADDU V0,S2,A2 SLL V1,V1,0x9 ADDU V0,V0,V1 ADDU V0,V0,A3 LBU V0,0010 (V0) ADDIU S2,S2,0001 SB V0,0000 (A1) SLTI V0,S2,0010 BNE V0,R0,80204384 LUI V0,8025 SB R0,9140 (V0) ADDU S2,R0,R0 LUI V0,8022 ADDIU T0,V0,5374 LUI V0,8025 ADDIU A3,V0,9AF8 SLL A2,S6,0x5 LW A0,7428 (S5) ADDU A1,S2,T0 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V1,0000 (V1) ADDU V0,S2,A2 SLL V1,V1,0x9 ADDU V0,V0,V1 ADDU V0,V0,A3 LBU V0,000C (V0) ADDIU S2,S2,0001 SB V0,0000 (A1) SLTI V0,S2,0004 BNE V0,R0,802043F8 NOP JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP LW A0,7428 (S5) SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW A1,0000 (V1) JAL 80202E70 ADDU A0,S6,R0 LW A0,7428 (S5) SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW A0,0000 (V1) JAL 80201164 ;generate table of note entry names for mempak A0 NOP LW A0,7428 (S5) LUI A1,8024 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V0,0000 (V1) ADDIU A1,A1,2C58 SLL V0,V0,0x2 ADDU V0,V0,A1 SW R0,0000 (V0) BGEZ S7,80204E80 LUI V0,0010 LUI T2,8024 LW V0,7428 (S5) ADDIU T2,T2,2D00 SLL V0,V0,0x2 ADDU V0,V0,T2 LW V0,0000 (V0) BEQ V0,R0,80204E7C LUI V1,8025 LUI V0,8024 LUI A0,8022 LUI S0,8022 ADDIU T6,V0,EF78 ADDIU T5,V1,9130 LWL T3,0000 (T6) LWR T3,0003 (T6) LWL T4,0004 (T6) LWR T4,0007 (T6) SWL T3,0000 (T5) SWR T3,0003 (T5) SWL T4,0004 (T5) SWR T4,0007 (T5) LWL T3,0008 (T6) LWR T3,000B (T6) LB T4,000C (T6) SWL T3,0008 (T5) SWR T3,000B (T5) SB T4,000C (T5) LW V1,7418 (S0) LUI V0,8024 ADDIU T5,V0,EF88 ADDIU T4,A0,537C LWL T2,0000 (T5) LWR T2,0003 (T5) LB T3,0004 (T5) SWL T2,0000 (T4) SWR T2,0003 (T4) SB T3,0004 (T4) LB T2,0005 (T5) SB T2,0005 (T4) BEQ V1,R0,802045C0 LUI A0,8000 ;A0=A button LUI T6,8020 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T6,3E30 ;A1=80203E30 J 80204E7C SW R0,7418 (S0) LUI T2,8024 LW A0,7428 (S5) ADDIU T2,T2,2C80 SLL A2,A0,0x2 ADDU V1,A2,T2 LW V0,0000 (V1) SLTI V0,V0,0002 BEQ V0,R0,80204608 LUI T3,8020 LUI A0,8000 ADDIU A1,T3,3E30 ADDIU V0,R0,0002 LUI T4,8025 ADDIU T4,T4,95E8 SW V0,0000 (V1) ADDU V0,A2,T4 J 80204E74 SW R0,0000 (V0) XORI V0,A0,0001 SLL V0,V0,0x2 LUI T5,8024 ADDIU T5,T5,2C80 ADDU V0,V0,T5 LW V0,0000 (V0) SLTI V0,V0,0002 BNE V0,R0,80204E80 LUI V0,0010 ADDU V0,A2,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 LUI T6,8024 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V0,0000 (V1) ADDIU T6,T6,2038 SLL V0,V0,0x2 ADDU V0,V0,T6 LW V0,0000 (V0) BLEZ V0,80204E7C ADDIU A0,R0,0001 JAL 802030A0 ADDU A1,R0,R0 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM ADDU S2,R0,R0 ADDIU A0,R0,0038 ADDIU A1,R0,00D8 LUI A3,FFC0 LUI V0,8022 LW A2,7B80 (V0) JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDU A2,S2,R0 LUI T2,8025 ADDIU T2,T2,95E8 LUI T3,8024 LW A0,7428 (S5) ADDIU T3,T3,2038 SLL A1,A0,0x2 ADDU V0,A1,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V0,0000 (V1) ADDU A1,A1,T2 SLL V1,V0,0x9 SLL V0,V0,0x2 ADDU V0,V0,T3 LW A0,0000 (V0) BEQL A2,A0,80204728 ADDIU S2,S2,0001 ADDU V0,V1,S8 LBU V0,0000 (V0) BEQL V0,R0,80204728 ADDIU S2,S2,0001 LW V0,0000 (A1) BEQL V0,A2,80204720 ADDU S6,S2,R0 ADDIU A2,A2,0001 ADDIU S2,S2,0001 SLTI V0,S2,0010 BNE V0,R0,802046FC ADDIU V1,V1,0020 ADDIU A1,R0,0020 LW A0,7428 (S5) LUI S1,8025 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW A0,0000 (V1) ADDIU S1,S1,9AF8 SLL A0,A0,0x9 JAL 80217B70 ADDU A0,A0,S1 LW A0,7428 (S5) ADDU S2,R0,R0 XORI A0,A0,0001 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW A0,0000 (V1) ADDIU A1,R0,0020 SLL A0,A0,0x9 JAL 80217B70 ADDU A0,A0,S1 LUI S0,8025 ADDIU A0,S0,9130 ADDU A1,S2,R0 JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,0020 ADDIU S0,S0,9130 SLL A2,S6,0x5 LW A0,7428 (S5) ADDU A1,S2,S0 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V1,0000 (V1) ADDU V0,S2,A2 SLL V1,V1,0x9 ADDU V0,V0,V1 ADDU V0,V0,S1 LBU V0,0010 (V0) ADDIU S2,S2,0001 SB V0,0000 (A1) SLTI V0,S2,0010 BNE V0,R0,802047D8 LUI V0,8025 SB R0,9140 (V0) ADDU S2,R0,R0 LUI V0,8022 ADDIU T0,V0,5374 LUI V0,8025 ADDIU A3,V0,9AF8 SLL A2,S6,0x5 LW A0,7428 (S5) ADDU A1,S2,T0 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V1,0000 (V1) ADDU V0,S2,A2 SLL V1,V1,0x9 ADDU V0,V0,V1 ADDU V0,V0,A3 LBU V0,000C (V0) ADDIU S2,S2,0001 SB V0,0000 (A1) SLTI V0,S2,0004 BNE V0,R0,8020484C SLL A1,S6,0x2 LUI A3,8025 LW V1,7428 (S5) ADDIU A3,A3,95F8 SLL A2,V1,0x2 ADDU A2,A2,S3 SLL A0,V1,0x1 ADDU A0,A0,V1 LW V0,0000 (A2) SLL A0,A0,0x3 SLL V0,V0,0x2 ADDU V0,V0,A0 ADDU V0,V0,S4 LW V0,0000 (V0) SLL V0,V0,0x6 ADDU V0,A1,V0 ADDU V0,V0,A3 LHU V1,0000 (V0) LUI V0,8025 SH V1,9AD8 (V0) LW V0,0000 (A2) SLL V0,V0,0x2 ADDU V0,V0,A0 ADDU V0,V0,S4 LW V0,0000 (V0) LUI A0,8022 SLL V0,V0,0x6 ADDU A1,A1,V0 ADDU A1,A1,A3 LH A1,0000 (A1) JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,255C LW A3,7428 (S5) SLL V0,A3,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A3,0x1 ADDU V0,V0,A3 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW A1,0000 (V1) ADDIU T4,R0,0005 BNEL A1,T4,80204A98 LUI S0,8024 LUI V0,8022 LW V0,741C (V0) BEQ V0,R0,8020497C LUI V0,8024 SLLV A2,S6,T4 ADDU A1,A2,S8 LW A0,4D7C (V0) J 80204990 XORI A3,A3,0001 LUI A0,8025 ADDIU A0,A0,A910 SLL A2,S6,0x5 ADDU A1,A2,S8 XORI A3,A3,0001 SLL V0,A3,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A3,0x1 ADDU V0,V0,A3 SLL V0,V0,0x3 LBU A1,0A1F (A1) SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LUI V0,8025 ADDIU V0,V0,9AF8 ADDU A2,A2,V0 LW A3,0000 (V1) JAL 802018CC ADDIU A2,A2,0A0C ADDU S2,V0,R0 ADDIU V0,R0,03E7 ;V0=999 BEQ S2,V0,80204A88 ADDIU T2,R0,0001 BLEZ S2,80204A28 LUI A0,8022 LW A0,7428 (S5) XORI A0,A0,0001 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW A0,0000 (V1) JAL 80201164 ;generate table of note entry names for mempak A0 NOP J 80204A88 ADDIU T2,R0,0001 ADDIU A0,A0,256C LUI V0,8022 ADDIU T5,R0,0001 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C SW T5,7418 (V0) LUI A1,8024 LW A0,7428 (S5) ADDIU A1,A1,2C58 XORI A0,A0,0001 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V1,0000 (V1) ADDIU V0,R0,FFFF SLL V1,V1,0x2 ADDU V1,V1,A1 SW V0,0000 (V1) ADDIU T2,R0,0001 LUI T6,8024 ADDIU T6,T6,2038 J 80204E68 SW T2,0014 (T6) LW A0,2C50 (S0) JAL 80202DB0 NOP BLEZ V0,80204E0C ADDIU T3,R0,0005 LW A1,7428 (S5) XORI A0,A1,0001 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V0,0000 (V1) BNE V0,T3,80204CAC SLL V0,A1,0x2 ADDU A2,R0,R0 ADDU V0,V0,S3 ADDU S2,A2,R0 LW V1,0000 (V0) SLL V0,A1,0x1 ADDU V0,V0,A1 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V0,0000 (V1) SLLV A3,S6,T3 SLL A1,V0,0x9 ADDU V0,S2,A3 ADDU V0,V0,A1 ADDU V0,V0,S8 ADDU V1,S2,S8 LBU A0,0000 (V0) LBU V0,0A00 (V1) BNEL A0,V0,80204B38 ADDIU A2,R0,0001 ADDIU S2,S2,0001 SLTI V0,S2,0004 BNE V0,R0,80204B1C ADDU V0,S2,A3 LUI V0,8022 LW V0,741C (V0) BEQ V0,R0,80204BF4 NOP BNE A2,R0,80204BD8 LUI V0,8022 ADDU A2,R0,R0 LUI S0,8024 LUI V0,8024 LW A0,4D7C (S0) LW A1,2C50 (V0) ADDU A3,A2,R0 JAL 80217124 ;decompress compressed data A1 to A0 SW R0,0010 (SP) LW A0,4D7C (S0) LUI V1,8022 JAL 802053A8 SW V0,7420 (V1) LW A0,7428 (S5) SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V1,0000 (V1) SLL V0,S6,0x5 SLL V1,V1,0x9 ADDU V0,V0,V1 ADDU V0,V0,S8 LBU V0,001F (V0) J 80204E68 SB V0,0A1F (S8) ADDIU T4,R0,0001 SW T4,7418 (V0) LUI A0,8022 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,257C J 80204E6C LUI A0,8000 BNE A2,R0,80204C90 LUI V0,8022 ADDU S2,R0,R0 LUI S0,8022 LUI S1,8024 LW V0,7424 (S0) BLTZL V0,80204C14 ADDIU V0,V0,0007 SRA V0,V0,0x3 SLT V0,S2,V0 BEQ V0,R0,80204C78 ADDU A0,S2,R0 SLL V0,S2,0x3 LW V1,2C50 (S1) LW T5,0024 (SP) ADDU V0,V0,V1 LWL T6,0000 (V0) LWR T6,0003 (V0) LWL T2,0004 (V0) LWR T2,0007 (V0) SWL T6,0008 (T5) SWR T6,000B (T5) SWL T2,000C (T5) SWR T2,000F (T5) JAL 802221F0 ;write preset data to eeprom block A0 ADDIU S2,S2,0001 ADDU A1,R0,R0 LW T5,0024 (SP) ADDIU A2,R0,0008 JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A0,T5,0008 J 80204C08 NOP LW V0,7424 (S0) BLTZL V0,80204C84 ADDIU V0,V0,00FF SRA V0,V0,0x8 J 80204E68 SB V0,0A1F (S8) ADDIU T6,R0,0001 SW T6,7418 (V0) LUI A0,8022 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,258C J 80204E6C LUI A0,8000 ADDU V0,V0,S3 LUI A0,8022 LW V1,0000 (V0) SLL V0,A1,0x1 ADDU V0,V0,A1 SLL V0,V0,0x3 LUI T1,8025 ADDIU T1,T1,9AF8 SLL T0,S6,0x5 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V0,0000 (V1) LW A1,7428 (S5) SLL V0,V0,0x9 ADDU V0,V0,T0 ADDU V0,V0,T1 ADDIU T5,A0,537C LWL T2,0000 (V0) LWR T2,0003 (V0) LB T3,0004 (V0) LB T4,0005 (V0) SWL T2,0000 (T5) SWR T2,0003 (T5) SB T3,0004 (T5) SB T4,0005 (T5) SLL V0,A1,0x2 ADDU V0,V0,S3 LW A2,0000 (V0) SLL V0,A1,0x1 ADDU V0,V0,A1 SLL V0,V0,0x3 XORI A1,A1,0001 LW A0,2C50 (S0) SLL A2,A2,0x2 ADDU A2,A2,V0 SLL V0,A1,0x2 ADDU V0,V0,S3 ADDU A2,A2,S4 LW V1,0000 (V0) SLL V0,A1,0x1 ADDU V0,V0,A1 SLL V0,V0,0x3 LW A2,0000 (A2) SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 SLL A2,A2,0x9 ADDU V0,T0,A2 ADDU V0,V0,S8 ADDU T0,T0,T1 ADDU A2,A2,T0 LW A3,0000 (V1) LBU A1,001F (V0) JAL 802018CC ADDIU A2,A2,000C ADDU S2,V0,R0 ADDIU V0,R0,03E7 ;V0=999 BEQ S2,V0,80204E6C LUI A0,8000 BLEZ S2,80204DE4 LUI A0,8022 LW A0,7428 (S5) XORI A0,A0,0001 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW A0,0000 (V1) JAL 80201164 ;generate table of note entry names for mempak A0 NOP J 80204E6C LUI A0,8000 ADDIU A0,A0,259C LUI V0,8022 ADDIU T6,R0,0001 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C SW T6,7418 (V0) LUI A1,8024 LW A0,7428 (S5) ADDIU A1,A1,2C58 J 80204E30 XORI A0,A0,0001 LUI A0,8022 ADDIU A0,A0,25AC LUI V1,8022 ADDIU V0,R0,0002 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C SW V0,7418 (V1) LUI A1,8024 LW A0,7428 (S5) ADDIU A1,A1,2C58 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V1,0000 (V1) ADDIU V0,R0,FFFF SLL V1,V1,0x2 ADDU V1,V1,A1 SW V0,0000 (V1) LUI A0,8000 ;A0=A button LUI T2,8020 ADDIU A1,T2,3E30 ;A1=80203E30 JAL 80211130 ;use handler A1 if buttons A0 pressed NOP LUI V0,0010 AND V0,S7,V0 BEQ V0,R0,80204ED0 ADDIU A0,R0,0001 JAL 802030A0 ADDU A1,R0,R0 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP ADDIU A0,R0,0010 ADDIU A1,R0,00D8 LUI V0,8022 LW A2,7B78 (V0) LUI A3,FFC0 JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFC0 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP JAL 80200940 ;copy save game data from controller paks and N64 NOP LUI V0,0020 AND V0,S7,V0 BEQ V0,R0,80205084 LUI T3,8024 LW A0,7428 (S5) ADDIU T3,T3,2D00 SLL V1,A0,0x2 ADDU V0,V1,T3 LW V0,0000 (V0) BEQ V0,R0,80205084 ADDU V0,V1,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW V0,0000 (V1) ADDIU T4,R0,0005 BEQ V0,T4,80205084 LUI A0,0020 ;A0=L button LUI T5,8020 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T5,3E30 ;A1=80203E30 LUI S0,8022 ADDIU T6,R0,0001 JAL 80205110 SW T6,7410 (S0) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM SW R0,7410 (S0) LUI V0,8022 LW V0,7414 (V0) BNE V0,R0,80205084 ADDIU A0,R0,0001 JAL 802030A0 ADDU A1,R0,R0 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP LUI V1,FFC0 ORI V1,V1,FFC0 ADDU A0,R0,R0 ADDIU A1,R0,00D8 LUI V0,8022 LW A3,7BA0 (V0) ADDIU A2,R0,0140 JAL 802136DC ;display string A3 in colour SP+10 centered on line at {A2-A0,A1} SW V1,0010 (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP LW A0,7428 (S5) LUI A1,8022 SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW A3,0000 (V1) ADDIU A1,A1,539C SLL V0,A3,0x2 ADDU V0,V0,A1 LW A0,0000 (V0) ADDIU V0,R0,0004 BEQ A0,V0,80205028 SLTI V0,A0,0005 BEQ V0,R0,80205004 ADDIU T2,R0,0001 BEQ A0,T2,80205018 LUI A0,8024 J 80205050 NOP ADDIU V0,R0,0010 BEQ A0,V0,8020503C LUI A0,8024 J 80205050 NOP ADDIU A0,A0,AA6D ADDU A1,R0,R0 J 80205048 ADDIU A2,R0,0500 LUI A0,8024 ADDIU A0,A0,AF6D ADDU A1,R0,R0 J 80205048 ADDIU A2,R0,0E00 ADDIU A0,A0,BD6D ADDU A1,R0,R0 ADDIU A2,R0,3200 JAL 80202548 NOP LW A0,7428 (S5) SLL V0,A0,0x2 ADDU V0,V0,S3 LW V1,0000 (V0) SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x3 SLL V1,V1,0x2 ADDU V1,V1,V0 ADDU V1,V1,S4 LW A0,0000 (V1) JAL 80201164 ;generate table of note entry names for mempak A0 NOP BNE S7,R0,80205094 ADDU A0,R0,R0 ADDIU T3,R0,0001 SW T3,001C (SP) JAL 802030A0 ADDU A1,A0,R0 JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP LW T4,0020 (SP) BEQ T4,R0,802050CC ADDU A0,S7,R0 ADDIU A1,R0,0005 LUI T5,8020 LW A2,001C (SP) JAL 802111A0 ADDIU A3,T5,3E30 SW R0,0020 (SP) SW R0,001C (SP) LW T6,0018 (SP) BEQ T6,R0,80204094 NOP LW RA,004C (SP) LW S8,0048 (SP) LW S7,0044 (SP) LW S6,0040 (SP) LW S5,003C (SP) LW S4,0038 (SP) LW S3,0034 (SP) LW S2,0030 (SP) LW S1,002C (SP) LW S0,0028 (SP) LUI V0,8024 SW R0,EF74 (V0) JR RA ADDIU SP,SP,0050 80205110 ADDIU SP,SP,FFD0 SW S1,0014 (SP) ADDU S1,R0,R0 LUI V1,8022 ADDIU V0,R0,0001 SW S4,0020 (SP) LUI S4,0200 ORI S4,S4,0004 ;S4=02000004: + left, stick left SW S0,0010 (SP) ADDU S0,V1,R0 SW S2,0018 (SP) ADDU S2,V0,R0 SW S3,001C (SP) LUI S3,0100 ORI S3,S3,0008 ;S3=01000008: + right, stick right SW S6,0028 (SP) LUI S6,4000 ;S6=B button SW S5,0024 (SP) LUI S5,8000 ;S5=A button SW RA,002C (SP) SW V0,7414 (V1) JAL 80210D30 ;V0=button and stick pos for controller 1 NOP ADDU V1,V0,R0 ;V1=V0: button/stick AND V0,V1,S4 ;V0=nonzero if left pressed BEQ V0,R0,8020518C AND V0,V1,S3 ;V0=nonzero if right pressed LW V0,7414 (S0) BEQL V0,S2,80205188 SW R0,7414 (S0) AND V0,V1,S3 ;V0=nonzero if right pressed BEQ V0,R0,802051A4 AND V0,V1,S6 ;V0=nonzero if B pressed LW V0,7414 (S0) BEQL V0,R0,802051A0 SW S2,7414 (S0) AND V0,V1,S6 ;V0=nonzero if B pressed BEQ V0,R0,802051B4 AND V0,V1,S5 ;V0=nonzero if A pressed SW S2,7414 (S0) ADDIU S1,R0,0002 BNEL V0,R0,802051BC ADDIU S1,R0,0001 JAL 80203E10 ADDU A0,R0,R0 JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BEQ S1,R0,80205164 LUI A0,8000 ;A0=A button LUI S0,8020 ADDIU S0,S0,3E10 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=80203E10 LUI A0,4000 ;A0=B button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=80203E10 ADDU V0,S1,R0 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8020521C ADDIU SP,SP,FFD8 ADDIU T1,SP,0018 ADDU T0,R0,R0 LUI V1,B000 LW V1,0020 (V1) LUI A0,B000 LW A0,0024 (A0) LUI A1,B000 LW A1,0028 (A1) LUI A2,B000 LW A2,002C (A2) LUI A3,B000 LW A3,0030 (A3) LUI V0,8022 ADDIU T5,V0,25BC LWL T2,0000 (T5) LWR T2,0003 (T5) LWL T3,0004 (T5) LWR T3,0007 (T5) LWL T4,0008 (T5) LWR T4,000B (T5) SWL T2,0000 (SP) SWR T2,0003 (SP) SWL T3,0004 (SP) SWR T3,0007 (SP) SWL T4,0008 (SP) SWR T4,000B (SP) LWL T2,000C (T5) LWR T2,000F (T5) LWL T3,0010 (T5) LWR T3,0013 (T5) SWL T2,000C (SP) SWR T2,000F (SP) SWL T3,0010 (SP) SWR T3,0013 (SP) SW V1,0018 (SP) SW A0,001C (SP) SW A1,0020 (SP) SW A2,0024 (SP) SW A3,0028 (SP) ADDU V0,SP,T0 LBU V1,0000 (V0) LBU V0,0000 (T1) BEQ V1,V0,802052D8 ADDIU T1,T1,0001 J 802052EC ADDU V0,R0,R0 ADDIU T0,T0,0001 SLTI V0,T0,0013 BNE V0,R0,802052C0 ADDU V0,SP,T0 ADDIU V0,R0,0001 JR RA ADDIU SP,SP,0028 802052F4 V0=word from hardware address A0; waits for PI status to clear accepts: A0=p->hardware LUI V1,A460 ORI V1,V1,0010 //802052FC: LW V0,0000 (V1) ;V0=A4600010: PI Status ANDI V0,V0,0003 BNE V0,R0,802052FC ;loop until status clear LUI V0,BFFF ORI V0,V0,FFFC AND A0,A0,V0 ;A0&=BFFFFFFC: address mask LW V0,0000 (A0) ;V0=word from hardware A0 JR RA NOP 80205320 copy FLASHram to A0 accepts: A0=p->target ADDIU SP,SP,FFD8 SW S1,0014 (SP) ADDU S1,A0,R0 ;S1=A0: p->target SW S3,001C (SP) LUI S3,A800 SW S0,0010 (SP) ADDU S0,R0,R0 ;S0=0 init.count SW S2,0018 (SP) ADDIU S2,R0,7FFF ;S2=7FFF SW RA,0020 (SP) //80205348: copy FLASHram to target JAL 802052F4 ;V0=word from hardware address A0 OR A0,S3,S0 ;A0=A8000000+count: FLASHram+count SW V0,0000 (S1) ADDIU S0,S0,0004 ;S0+=4 next word in source SLT V0,S2,S0 BEQ V0,R0,80205348 ;loop for entire FLASHram file ADDIU S1,S1,0004 ;S1+=4 next word in target //80205364: return LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80205380 save A1 to hardware address A0; waits for PI Status to clear accepts: A0=p->hardware, A1=data LUI V1,A460 ORI V1,V1,0010 //80205388: LW V0,0000 (V1) ;V0=A4600010: PI Status ANDI V0,V0,0003 BNE V0,R0,80205388 ;loop until status clear LUI V0,BFFF ORI V0,V0,FFFC AND A0,A0,V0 ;A0&=BFFFFFFC: address mask JR RA SW A1,0000 (A0) ;A1->A0 802053A8 ADDIU SP,SP,FFD8 SW S3,001C (SP) LUI S3,A800 SW S1,0014 (SP) ADDU S1,A0,R0 SW S0,0010 (SP) ADDU S0,R0,R0 SW S2,0018 (SP) ADDIU S2,R0,7FFF SW RA,0020 (SP) LW A1,0000 (S1) ADDIU S1,S1,0004 OR A0,S3,S0 JAL 80205380 ;save A1 to hardware address A0 ADDIU S0,S0,0004 SLT V0,S2,S0 BEQ V0,R0,802053D0 NOP LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8020540C ADDIU SP,SP,FFE8 SW S0,0010 (SP) LUI S0,8022 ADDIU V0,R0,0003 SW RA,0014 (SP) JAL 80205110 SW V0,7410 (S0) LUI V0,8022 LW V0,7414 (V0) LW RA,0014 (SP) SW R0,7410 (S0) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80205444 likley data ;BLEZ A1,8020548C ;ADDU A3,A2,R0 ;ADDIU T0,R0,0010 80205450 decrypt A1 words of data at A0 accepts: A0=p->enc, A1=#words ADDIU SP,SP,FFC0 ADDU A2,SP,R0 ;A2=SP+0: p->buffer LUI V0,8022 ADDIU V0,V0,25D0 ;V0=802225D0: table of .enc decryption seeds ADDIU A3,V0,0040 ;A3=80222610 //80205464: copy encryption seeds to buffer LW T1,0000 (V0) LW T2,0004 (V0) LW T3,0008 (V0) LW T4,000C (V0) SW T1,0000 (A2) ;T1->buffer+0 SW T2,0004 (A2) ;T2->buffer+4 SW T3,0008 (A2) ;T3->buffer+8 SW T4,000C (A2) ;T4->buffer+C ADDIU V0,V0,0010 ;V0+=10: source+=10 BNE V0,A3,80205464 ;loop for 40 bytes ADDIU A2,A2,0010 ;A2+=10: target+=10 //80205490: ADDU A2,R0,R0 ;A2=0 init.cycle BLEZ A1,802054DC ;return if invalid #words ADDU A3,A2,R0 ;A3=0 init.count ADDIU T0,R0,0010 ;T0=10 //802054A0: SLL V0,A2,0x2 ;V0=cycle->offset ADDU V0,SP,V0 ;V0=SP+offset LW V1,0000 (A0) ;V1=A0+offset: org.value LW V0,0000 (V0) ;V0=SP+offset: word f/buffer ADDIU A2,A2,0001 ;A2++ cycle++ XOR V1,V1,V0 ;V1^=V0 ANDI V0,V0,FF00 ;V0&=FF00 SUBU V1,V1,V0 ;V1-=(V0&=FF00) BNE A2,T0,802054CC ;if reset cycle at 10 SW V1,0000 (A0) ;V1->A0: update with decrypted data ADDU A2,R0,R0 ;A2=0 count=0 //802054CC: loop for #words ADDIU A3,A3,0001 ;A3++ count++ SLT V0,A3,A1 BNE V0,R0,802054A0 ;loop through data ADDIU A0,A0,0004 ;A0+=4: next sample //802054DC: return JR RA ADDIU SP,SP,0040 802054E4 decrypt up to A0 bytes of data at A1 accepts: A0=size, A1=p->enc ADDIU SP,SP,FFE8 SRA V0,A0,0x2 ;V0=size/4: #words ADDU A0,A1,R0 ;A0=A1: p-> SW RA,0010 (SP) JAL 80205450 ;decrypt A1 words of data at A0 ADDU A1,V0,R0 ;A1=#words LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80205508 V0=TRUE if timeout occurs during PC comms sync ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDIU S0,R0,03E8 ;S0=3E8: timeout count SW S1,0014 (SP) ADDIU S1,R0,0047 ;S1=47: 'G' confirmation value SW S2,0018 (SP) ADDIU S2,R0,0054 ;S2=54: 'T' confirmation value SW RA,001C (SP) //80205528: test if PC is responding "GT" to sync JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0067 ;A0=67: 'g' BEQ V0,S1,80205540 ;test for 'T' if responded ADDU V0,S0,R0 BGTZ V0,80205528 ;loop until timeout elapsed ADDIU S0,S0,FFFF ;S0-- timeout-- //80205540: JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0074 ;A0=74: 't' BEQ V0,S2,80205558 ;return if response valid ADDU V0,S0,R0 BGTZ V0,80205528 ;loop until timeout elapsed ADDIU S0,S0,FFFF ;S0-- timeout-- //80205558: return SLTI V0,S0,0001 ;V0=TRUE if timed out LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80205574 download and install encrypted BIOS from PC ADDIU SP,SP,FEC8 SW S4,0120 (SP) ADDIU S4,R0,0063 ;S4=63: 'c' LUI A0,0002 ORI A0,A0,FB00 ;A0=2FB00: settings ADDIU A1,SP,0010 ;A1=SP+10: p->target ADDIU A2,R0,0100 ;A2=100: size SW RA,0134 (SP) SW S8,0130 (SP) SW S7,012C (SP) SW S6,0128 (SP) SW S5,0124 (SP) SW S3,011C (SP) SW S2,0118 (SP) SW S1,0114 (SP) JAL 802180A8 ;copy A2 bytes from hardware A0 to A1 SW S0,0110 (SP) //802055B8: JAL 80220A50 NOP //802055C0: ADDU A0,R0,R0 ADDIU A1,R0,0001 LUI V0,8022 LW S8,7C0C (V0) ;S8=80227C0C: ADDU A2,A1,R0 JAL 80220B20 SW R0,7C0C (V0) ADDIU A0,R0,003C LUI A2,FFFE ORI A2,A2,FFFE LUI V0,8022 ADDIU S0,V0,7660 ;S0=80227660: string pointer table LW A1,0424 (S0) ;A1=str+424: 802231B0 "Upgrade Request Detected" JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP JAL 80205508 ;V0=TRUE if timeout occurs during PC comms sync NOP BNE V0,R0,8020589C ;return if timeout occurs ADDU A0,R0,R0 ADDIU A1,R0,0001 JAL 80220B20 ADDU A2,A1,R0 ADDIU A0,R0,0052 LW A1,0428 (S0) ;A1=str+428: 802231A0 "Downloading Rom" LUI A2,FFFE ORI A2,A2,FFFE ADDU A3,R0,R0 LUI S5,8018 ;S5=80180000 ADDU S2,A3,R0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDIU S1,R0,0003 ;S1=3: count=3 JAL 8021110C ;unconditional return ADDU S6,S5,R0 ;S6=80180000 JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP //8020565C: get word, one byte at a time JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 NULL write SLL S3,V0,0x18 JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 NULL write SLL V0,V0,0x10 ADDU S3,S3,V0 JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 NULL write SLL V0,V0,0x8 ADDU S3,S3,V0 JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 NULL write ADDU S3,S3,V0 ;S3=word read from port BEQ S3,R0,80205700 ADDU S0,S3,R0 ;S0=S3: size from port ADDIU S7,R0,0067 ;S7=67: 'g': init.LCD display ANDI V0,S0,03FF ;V0=size & 3FF: at most 0x400 bytes //802056A4: loop, uploading a word of binary and saving to buffer byteswapped BNE V0,R0,802056C4 ;branch except at end of 0x400 segment NOP JAL 802067F0 ;display A0 to LCD screen ANDI A0,S4,00FF ;A0=(byte) value ADDIU S4,S4,0001 ;S4++ iterate from 'c' to 'g' ANDI V0,S4,00FF ;V0=(byte) S4 BEQL V0,S7,802056C4 ;if S4= 'g', reset to 'c' ADDIU S4,R0,0063 ;reset S4 to 'c' if same //802056C4: read a byte from port JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 NULL write ADDU V1,S5,S1 ;V1=80180000+offset: p->target SB V0,0000 (V1) ;V0->target ANDI V0,V0,00FF ADDU S2,S2,V0 ;S2+=value: checksum BNE S1,R0,802056F0 ;branch except on last byte in word ANDI S2,S2,0FFF ;S2&=FFF: checksum is only three nibbles long //802056E4: ADDIU S5,S5,0004 ;S5+=4: next word J 802056F4 ADDIU S1,R0,0003 ;S1=3: next four bytes in word //802056F0: loop through file ADDIU S1,S1,FFFF ;S1-- write bytes backward ADDIU S0,S0,FFFF ;S0-- size-- BNE S0,R0,802056A4 ;loop until completely copied ANDI V0,S0,03FF ;V0=size & 3FF //80205700: confirm checksum JAL 802177AC ;V0=read/write byte to/from port ADDU A0,S2,R0 ;A0=S2: checksum.lower ADDU S0,V0,R0 ;S0=V0: checksum.PC JAL 802177AC ;V0=read/write byte to/from port SRL A0,S2,0x8 ;A0=S2*100: checksum.upper SLL V0,V0,0x8 OR S0,S0,V0 ;S0=checksum.PC BNE S2,S0,80205824 ;if checksums don't match, fail NOP //80205724: success! JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 respond "SUCCESSED!" ADDU A0,R0,R0 ADDIU A1,R0,0001 ADDU A2,A1,R0 JAL 80220B20 ADDU S0,V0,R0 ;S0=V0: mode from PC ADDIU A0,R0,0052 ;A0=52: ypos LUI V0,8022 LW A1,7A8C (V0) ;A1=80227A8C: 80223184 "Processing...Please Wait" LUI A2,FFFE ORI A2,A2,FFFE JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDU A0,S3,R0 ;A0=S3: size JAL 802054E4 ;decrypt up to A0 bytes of data at A1 ADDU A1,S6,R0 ;A1=S6: p->target ADDU A2,R0,R0 ;A2=0 init.count LUI A3,0003 ORI A3,A3,FFFF ;A3=3FFFF size of ROM ADDU V0,S6,A2 ;V0=target+count: p->data //80205788: byteswap A3 bytes of data LBU A1,0000 (V0) ;A1=data[0] LBU A0,0003 (V0) ;A0=data[3] LBU V1,0002 (V0) ;V1=data[2] SB A1,0003 (V0) ;data[0]->data[3] LBU A1,0001 (V0) ;A1=data[1] ADDIU A2,A2,0004 ;A2+=4: count+word SB A0,0000 (V0) ;data[3]->data[0] SB V1,0001 (V0) ;data[2]->data[1] SB A1,0002 (V0) ;data[1]->data[2] SLT V0,A3,A2 BEQ V0,R0,80205788 ;loop for size ADDU V0,S6,A2 ;V0=target+count: p->data //802057B8: overwrite uploaded settings with hardware JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0070 ;A0=70: 'p' processed BEQ S0,R0,802057FC ;overwrite settings if zero ADDIU A1,SP,0010 ;A1=SP+10: p->settings f/hardware LUI V0,0002 ORI V0,V0,FB00 ;V0=2FB00: settings ADDU A0,S6,V0 ;A0=80180000+2FB00: settings ADDU S0,R0,R0 ;S0=0 init.count ADDU V1,A0,S0 ;V1=A0+count: p->cur.target //802057DC: copy old settings to uploaded ROM ADDU V0,A1,S0 ;V0=source+count: p->cur.source LBU V0,0000 (V0) ;V0=source ADDIU S0,S0,0001 ;S0++ count++ SB V0,0000 (V1) ;V0->target SLTIU V0,S0,0100 BNE V0,R0,802057DC ;loop for 0x100 ADDU V1,A0,S0 ;V1=A0+count: p->cur.target LUI S3,0003 ;S3=30000 size, minus codelist //802057FC: overwrite BIOS with uploaded copy and confirm valid ADDU A0,R0,R0 ;A0=0 ADDU A1,S6,R0 ;A1=S6: p->ROM 80180000 JAL 80217F04 ;write A2 bytes from A1 to hardware A0 ADDU A2,S3,R0 ;A2=S3: size ADDU A0,R0,R0 ;A0=0 ADDU A1,S6,R0 ;A1=S6: p->ROM 80180000 JAL 80218024 ;V0=0 if A2 bytes at hardware A0 and dram A1 match or -1 if failed ADDU A2,S3,R0 ;A2=S3: size BEQ V0,R0,80205838 ;branch if successful NOP //80205824: respond "FAILED!" JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 respond FAILED! LUI V0,8022 J 8020589C ;return SW S8,7C0C (V0) ;S8->80227C0C: //80205838: send SUCCESS value, wait for setting replacement code JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 respond SUCCESS! LUI V0,8022 ADDIU V1,R0,0001 SW V1,7C0C (V0) ;1->80227C0C: LUI V0,8022 ADDIU S0,V0,7660 ;S0=80227660: string pointer table //80205854: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP ADDU A0,R0,R0 ADDIU A1,R0,0001 JAL 80220B20 ADDU A2,A1,R0 ADDIU A0,R0,0052 ;A0=52: ypos LW A1,043C (S0) ;A1=str+43C: 80223128 "Upgrade Complete." LUI A2,FFFE ORI A2,A2,FFFE JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 JAL 80214EE4 ;wait for next VI scan to start NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP J 80205854 NOP //8020589C: return LW RA,0134 (SP) LW S8,0130 (SP) LW S7,012C (SP) LW S6,0128 (SP) LW S5,0124 (SP) LW S4,0120 (SP) LW S3,011C (SP) LW S2,0118 (SP) LW S1,0114 (SP) LW S0,0110 (SP) JR RA ADDIU SP,SP,0138 802058CC copy and execute "start game w/o codes" accepts: A0=p->function to be copied and executed ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A0,R0 ;S1=A0: p->function SW S0,0010 (SP) LUI S0,8000 ORI S0,S0,0400 ;S0=80000400 ADDU A1,R0,R0 ;A1=0 init.count LUI A0,8000 ORI A0,A0,0400 ;A0=80000400: p->target for code LUI V0,8022 ADDIU V1,V0,84C0 ;V1=802184C0: start game w/o codes SW RA,0018 (SP) //802058FC: copy "start game" execute code to 80000400 LW V0,0000 (V1) ;V0=V1+0: source ADDIU V1,V1,0004 ;V1+=4 source++ ADDIU A1,A1,0001 ;A1++ count++ SW V0,0000 (A0) ;V0->A0+0: target SLTI V0,A1,0080 BNE V0,R0,802058FC ;loop for 200 bytes ADDIU A0,A0,0004 ;A0+=4 target++ //80205918: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP LUI A0,8020 ORI A0,A0,0400 ;A0=80200400: p->target function LUI A2,8020 LUI V0,8025 ORI A2,A2,0400 ;A2=80200400 LW V0,9110 (V0) ;V0=80249110: size of RAM LUI AT,A000 SW V0,0318 (AT) ;V0->A0000318: size of RAM detected by N64 cart JALR RA,S0 ;execute "start game" code ADDU A1,S1,R0 ;A1=S1: p->source function to copy and execute LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020595C download and replace BIOS this BIOS is unencrypted, unbyteswapped, and overwrites settings ADDIU SP,SP,FFC8 SW S4,0020 (SP) ADDIU S4,R0,0063 ;S4=63: 'c' init.LCD display SW RA,0030 (SP) SW S7,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW S1,0014 (SP) JAL 80220A50 SW S0,0010 (SP) ADDU A0,R0,R0 ADDIU A1,R0,0001 LUI V0,8022 LW S7,7C0C (V0) ;S7=80227C0C: ADDU A2,A1,R0 JAL 80220B20 SW R0,7C0C (V0) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM ADDIU S0,R0,0047 ADDIU A0,R0,0052 LUI A2,FFFE ORI A2,A2,FFFE ADDU A3,R0,R0 LUI V0,8022 LW A1,7A84 (V0) ;A1=80227A84: JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDIU S1,R0,0054 JAL 80214EE4 ;wait for next VI scan to start NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP //802059E0: loop until sync JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0067 ;A0=67: 'g' BNE V0,S0,802059E0 NOP JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0074 ;A0=74: 't' BNE V0,S1,802059E0 ADDU A0,R0,R0 ;A0=0 //80205A00: ADDIU A1,R0,0001 ;A1=1 JAL 80220B20 ADDU A2,A1,R0 ;A2=1 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM LUI S2,8018 ;S2=80180000 p->target ADDIU A0,R0,0052 ;A0=52: ypos LUI V0,8022 LW A1,7A88 (V0) ;A1=80227A88: LUI A2,FFFE ORI A2,A2,FFFE ADDU A3,R0,R0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU S1,A3,R0 ;S1=A3 JAL 80214EE4 ;wait for next VI scan to start ADDU S6,S2,R0 ;S6=S2: p->target JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP //80205A44: JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 SLL S3,V0,0x18 JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 SLL V0,V0,0x10 ADDU S3,S3,V0 JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 SLL V0,V0,0x8 ADDU S3,S3,V0 JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 ADDU S3,S3,V0 ;S3|=V0: size BEQ S3,R0,80205AD0 ;S3=branch if size zero ADDU S0,S3,R0 ;S0=S3: size ADDIU S5,R0,0067 ;S5=67: 'g': letter code to loop at //80205A88: only update LCD every 0x400 bytes ANDI V0,S0,03FF BNE V0,R0,80205AAC ;skip update unless at 0x400 boundry NOP //80205A94: change LCD display counter: M,UL,T,UR JAL 802067F0 ;display A0 to LCD screen ANDI A0,S4,00FF ;A0=S4->byte: LCD display->byte ADDIU S4,S4,0001 ;S4++ next bar in display ANDI V0,S4,00FF ;V0=S4->byte BEQL V0,S5,80205AAC ;if 'g', reset to 'c' ADDIU S4,R0,0063 //80205AAC: save PC file to target JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 SB V0,0000 (S2) ;V0->80180000+offset: save downloaded value to buffer ANDI V0,V0,00FF ;V0->byte ADDIU S2,S2,0001 ;S2++ buffer++ ADDIU S0,S0,FFFF ;S0-- count-- ADDU S1,S1,V0 ;S1+=V0: update checksum BNE S0,R0,80205A88 ;loop for size ANDI S1,S1,0FFF ;S1&=FFF: checksum only 3 nibbles //80205AD0: compare checksums JAL 802177AC ;V0=read/write byte to/from port ADDU A0,S1,R0 ;A0=S1: checksum-lower ADDU S0,V0,R0 ;S0=V0: PC checksum-lower JAL 802177AC ;V0=read/write byte to/from port SRL A0,S1,0x8 ;A0=S1/100: checksum-upper SLL V0,V0,0x8 ;V0*=100: PC checksum->upper OR S0,S0,V0 ;S0|=V0: PC checksum BNE S1,S0,80205B6C ;branch on checksum mismatch NOP //80205AF4: send confirmation OK JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 confirmation byte ADDU A0,R0,R0 ;A0=0 ADDIU A1,R0,0001 ;A1=1 JAL 80220B20 ADDU A2,A1,R0 ;A2=1 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP ADDIU A0,R0,0052 ;A0=52: ypos LUI V0,8022 ADDIU S0,V0,7660 ;S0=80227660: string pointer table LW A1,042C (S0) ;A1=str+42C: 80223184 "Processing...Please Wait" LUI A2,FFFE ORI A2,A2,FFFE JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 JAL 80214EE4 ;wait for next VI scan to start NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDU A0,R0,R0 ;A0=0 ADDU A1,S6,R0 ;A1=S6: 80180000 p->source JAL 80217F04 ;write A2 bytes from A1 to hardware A0 ADDU A2,S3,R0 ;A2=S3: size ADDU A0,R0,R0 ;A0=0 ADDU A1,S6,R0 ;A1=S6: 80180000 p->source JAL 80218024 ;V0=0 if A2 bytes at hardware A0 and dram A1 match or -1 if failed ADDU A2,S3,R0 ;A2=S3: size BEQ V0,R0,80205B7C ;branch if file transfer confirmed NOP //80205B6C: replacement FAILED! JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 failure J 80205BD4 NOP //80205B7C: replacement SUCCESSFUL JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 confirmation LUI V0,8022 SW S7,7C0C (V0) ;S7->80227C0C: set to original value //80205B8C: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP ADDU A0,R0,R0 ADDIU A1,R0,0001 JAL 80220B20 ADDU A2,A1,R0 ADDIU A0,R0,0052 ;A0=52: ypos LW A1,043C (S0) ;A1=str+43C: 80223128 "Upgrade Complete." LUI A2,FFFE ORI A2,A2,FFFE JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 JAL 80214EE4 ;wait for next VI scan to start NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP J 80205B8C NOP //80205BD4: return LW RA,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 80205C00 V0=p->upload block of code from PC ADDIU SP,SP,FFD8 SW S2,0018 (SP) ADDIU S2,R0,0063 ;S2=63: 'c': init.LCD display SW S0,0010 (SP) ADDIU S0,R0,0047 ;S0=47: 'G': PC response SW S1,0014 (SP) ADDIU S1,R0,0054 ;S1=54: 'T': PC response (game transfer) SW RA,0024 (SP) SW S4,0020 (SP) SW S3,001C (SP) //80205C28: wait for GT sync JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0067 ;A0=67: 'g' BNE V0,S0,80205C28 ;loop until 'G' recieved NOP JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0074 ;A0=74: 't' BNE V0,S1,80205C28 ;loop until 'T' recieved NOP //80205C48: get size of transfer (send 1) JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 size SLL S0,V0,0x18 ;S0=FF.00.00.00 JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 size SLL V0,V0,0x10 ;V0*=10000 ADDU S0,S0,V0 ;S0|=V0: FF.FF.00.00 JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 size SLL V0,V0,0x8 ;V0*=100 ADDU S0,S0,V0 ;S0|=V0: FF.FF.FF.00 JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 size ADDU S0,S0,V0 ;S0|=V0: FF.FF.FF.FF: size //80205C80: get target rdram address (send 2) JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0002 ;A0=2 address SLL S1,V0,0x18 ;S1=FF.00.00.00 JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0002 ;A0=2 address SLL V0,V0,0x10 ;V0*=10000 ADDU S1,S1,V0 ;S1|=V0: FF.FF.00.00 JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0002 ;A0=2 address SLL V0,V0,0x8 ;V0*100 ADDU S1,S1,V0 ;S1|=FF.FF.FF.00 JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0002 ;A0=2 address ADDU S3,S1,V0 ;S3=S1+V0: FF.FF.FF.FF: address BEQ S0,R0,80205D00 ADDU S1,S3,R0 ;S1=S3: address ADDIU S4,R0,0067 ;S4=67: LCD wraparound value //80205CC4: cycle LCD display: M,UL,T,UR ANDI V0,S0,03FF BNE V0,R0,80205CE8 ;branch if not 0x400 aligned NOP JAL 802067F0 ;display A0 to LCD screen ANDI A0,S2,00FF ;A0=S2->byte LCD display code ADDIU S2,S2,0001 ;S2++ next bar in LCD display ANDI V0,S2,00FF ;V0=S2->byte BEQL V0,S4,80205CE8 ;reset LCD to 'c' if 'g' ADDIU S2,R0,0063 //80205CE8: read byte from PC and save to target JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0003 ;A0=3 data SB V0,0000 (S1) ;V0->S1+offset: PC data -> target ADDIU S0,S0,FFFF ;S0-- count-- BNE S0,R0,80205CC4 ;loop until out of data ADDIU S1,S1,0001 ;S1++ next byte in target //80205D00: return ADDU V0,S3,R0 ;V0=S3: upload address LW RA,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80205D24 upload data from PC and execute at cart boot ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80205C00 ;V0=p->upload block of code from PC NOP JAL 802058CC ;copy and execute "start game w/o codes" ADDU A0,V0,R0 ;A0=V0: p->function to copy and execute at N64 cart boot LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80205D48 retrieve and execute PC comms commands ADDIU SP,SP,FFB0 SW S0,0038 (SP) ADDIU S0,R0,0047 ;S0=47: 'G' SW S1,003C (SP) ADDIU S1,R0,0054 ;S1=54: 'T' SW RA,0048 (SP) SW S3,0044 (SP) SW S2,0040 (SP) //80205D68: loop relaying initialization values JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0067 ;A0=67: 'g' BNE V0,S0,80205D68 ;loop until 'G' read from port NOP JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0074 ;A0=74: 't' BNE V0,S1,80205D68 ;loop until 'T' read in sequence NOP //80205D88: JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 ADDIU V1,V0,FF9C ;V1=result-64: 'd' through '.' SLTIU V0,V1,001C ;TRUE if 64-7F BEQ V0,R0,80205F98 ;branch if invalid command //80205D9C: handle individual command types LUI V0,8022 ADDIU V0,V0,2620 SLL V1,V1,0x2 ADDU V1,V1,V0 ;V1=80222620+offset: LW V0,0000 (V1) ;V0=pointer to handling function JR V0 NOP //80205DB8: 0x65 'e' JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 J 80205F98 ;return NOP //80205DC8: 0x66 'f' ADDIU A0,SP,0010 ;A0=SP+10: p->buffer LUI V0,8022 LW A1,772C (V0) ;A1=8022772C: 802240C0 "GameShark Pro Version 3.30" ADDU S0,R0,R0 ;S0=0 init.count JAL 8021109C ;strcpy(A0,A1) ADDU S1,A0,R0 ;S1=A0: p->buffer JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,004E ;A0=4E: 'N' JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,012E ;A0=12E: 1 is truncated, so '.' JAL 802141F0 ;V0=strlen(A0) ADDIU A0,SP,0010 ;A0=SP+10: p->buffer ADDU A0,V0,R0 ;A0=V0: strlen //80205E04: send version string JAL 802177AC ;V0=read/write byte to/from port NOP JAL 802141F0 ;V0=strlen(A0) ADDIU A0,SP,0010 ;A0=SP+10: p->buffer SLT V0,S0,V0 BEQ V0,R0,80205F98 ;return when finished w/ string ADDU V0,S1,S0 ;V0=S1+S0: buffer+count LBU A0,0000 (V0) ;A0=next char J 80205E04 ADDIU S0,S0,0001 ;S0++ count++ //80205E2C: 0x67 'g' rom download JAL 80205574 ;download and install encrypted BIOS from PC NOP J 80205F98 NOP //80205E3C: 0x6E 'n' unencryted BIOS download; overwrites settings JAL 8020595C ;download and replace BIOS with file NOP J 80205F98 NOP //80205E4C: 0x7F ram upload JAL 80205FE8 ;upload data from RAM to PC NOP J 80205F98 NOP //80205E5C: 0x7E '~' upload #blocks from controller 1 mempak to PC JAL 802060B4 ;upload data from 80500000 to PC NOP J 80205F98 NOP //80205E6C: 0x7C '|' update codelist JAL 80217824 ;V0=read/write word to/from port ADDU A0,S2,R0 ;A0=S2: odd, concidering ADDU S0,R0,R0 ;S0=0 init. count ADDU S2,V0,R0 ;S2=V0: size of data BLEZ S2,80205EBC ;skip upload if bad total data value ADDU S1,S0,R0 ;S1=S0: checksum LUI S3,8022 //80205E88: download S2 bytes from port JAL 802177AC ;V0=read/write byte to/from port ADDU A0,R0,R0 ;A0=0 read only LW V1,7570 (S3) ;V1=80227570: p->target: cur.codelist ADDU V1,V1,S0 SB V0,0000 (V1) ;V0->target+offset: save uploaded value LW V0,7570 (S3) ;V0=80227570: p->target: cur codelist ADDU V0,V0,S0 LBU V0,0000 (V0) ;V0=value just saved ADDIU S0,S0,0001 ;S0++ next byte ADDU S1,S1,V0 ;S1+=V0: update checksum SLT V0,S0,S2 ;TRUE if more bytes left to file BNE V0,R0,80205E88 ;loop for entire file NOP //80205EBC: download checksum JAL 80217824 ;V0=read/write word to/from port ADDU A0,R0,R0 BEQ S1,V0,80205EE4 ;branch if checksum matches downloaded value NOP //80205ECC: invalid checksum... JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0001 ;A0=1 JAL 8020E310 NOP J 80205F98 ;return NOP //80205EE4: replace codelist on hardware JAL 8020E39C ;replace codelist on ROM with revised copy NOP JAL 802177AC ;V0=read/write byte to/from port ADDIU A0,R0,0002 ;A0=2 LUI V0,8022 ADDIU S0,V0,7660 ;S0=80227660: string pointer table //80205EFC: seemingly endless loop... JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP ADDU A0,R0,R0 ADDIU A1,R0,0001 JAL 80220B20 ADDU A2,A1,R0 ADDIU A0,R0,0052 ;A0=0x52: ypos LW A1,043C (S0) ;A1=str+43C: 80223128 "Upgrade Complete." LUI A2,FFFE ORI A2,A2,FFFE ;A2=FFFEFFFE JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 JAL 80214EE4 ;wait for next VI scan to start NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP J 80205EFC NOP //80205F44: 0x7D '}' upload cur.codelist ADDU S1,R0,R0 ;S1=0 checksum JAL 80217824 ;V0=read/write word to/from port LUI A0,0001 ;A0=10000: size ADDU S0,S1,R0 ;S0=S1: offset LUI S2,8022 ORI S3,R0,FFFF //80205F5C: send 1MB of data LW V0,7570 (S2) ;V0=80227570: p->cur.codelist ADDU V0,V0,S0 ;V0=source+offset LBU A0,0000 (V0) ;A0=byte from codelist JAL 802177AC ;V0=read/write byte to/from port NOP LW V0,7570 (S2) ;V0=80227570: p->cur.codelist ADDU V0,V0,S0 ;V0=source+offset LBU V0,0000 (V0) ;V0=byte from codelist ADDIU S0,S0,0001 ;S0++ next byte ADDU S1,S1,V0 ;S1+=V0: checksum SLT V0,S3,S0 ;TRUE when S0 = 65535 BEQ V0,R0,80205F5C ;loop for 1MB NOP JAL 80217824 ;V0=read/write word to/from port ADDU A0,S1,R0 ;A0=S1: checksum //80205F98: return; default LW RA,0048 (SP) LW S3,0044 (SP) LW S2,0040 (SP) LW S1,003C (SP) LW S0,0038 (SP) JR RA ADDIU SP,SP,0050 80205FB4 initialize port, retrieve, and execute PC comms commands ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80217930 ;cycle GS activity display, returning V0=value on port or 0 NOP ANDI V0,V0,00FF ADDIU V1,R0,0003 ;V1=3: initialization value BNE V0,V1,80205FDC ;return if initilization not detected on port NOP //80205FD4: execute any PC comms commands JAL 80205D48 ;retrieve and execute PC comms commands NOP //80205FDC: return LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80205FE8 upload data from RAM to PC ADDIU SP,SP,FFD0 SW S2,0018 (SP) ADDIU S2,R0,0063 ;S2=63: 'c': init.LCD display SW S4,0020 (SP) ADDU S4,R0,R0 ;S4=0 checksum SW S5,0024 (SP) ADDU S5,S4,R0 ;S5=0 LCD count ADDU A0,S4,R0 ;A0=0 SW RA,002C (SP) SW S6,0028 (SP) SW S3,001C (SP) SW S1,0014 (SP) JAL 80217824 ;V0=read/write word to/from port SW S0,0010 (SP) ADDU S3,V0,R0 ;S3=V0: address JAL 80217824 ;V0=read/write word to/from port ADDU A0,S4,R0 BEQ S3,R0,80206084 ;return if NULL address ADDU S1,V0,R0 ;S1=V0: size BLEZ S1,80206080 ;return if invalid size ADDIU S6,R0,0067 ;S6=67: 'g': letter code to loop at //8020603C: update LCD display during progress ADDIU S5,S5,0001 ;S5++ count++ ANDI V0,S5,03FF BNE V0,R0,80206064 ;branch if not a 0x400 boundry update only every 1/4Kb ADDU A0,S2,R0 ;A0=S2: cur.LCD ADDIU S2,S2,0001 ;S2++ next.LCD JAL 802067F0 ;display A0 to LCD screen ANDI A0,A0,00FF ;A0->byte ANDI V0,S2,00FF ;V0=S2->byte BEQL V0,S6,80206064 ;reset LCD to 'c' if 'g' ADDIU S2,R0,0063 //80206064: upload value from address to PC LW S0,0000 (S3) ;S0=source+offset: data ADDIU S3,S3,0004 ;S3+=4 next address ADDIU S1,S1,FFFC ;S1-=4 update count JAL 80217824 ;V0=read/write word to/from port ADDU A0,S0,R0 ;A0=S0: data BGTZ S1,8020603C ;loop for entire upload ADDU S4,S4,S0 ;S4+=S0: update checksum ANDI S4,S4,00FF ;S4->byte //80206084: close port and return JAL 802177AC ;V0=read/write byte to/from port ADDU A0,S4,R0 ;A0=S4: checksum LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 802060B4 upload blocks from controller 1 mempak to PC ADDIU SP,SP,FFD0 SW S1,0014 (SP) ADDIU S1,R0,0063 ;S1=63: 'c': init.LCD display SW S3,001C (SP) ADDU S3,R0,R0 ;S3=0 checksum value SW S5,0024 (SP) ADDU S5,S3,R0 ;S5=0 init.count ADDU A0,S3,R0 ;A0=0 to PC: obtains size SW RA,002C (SP) SW S6,0028 (SP) SW S4,0020 (SP) SW S2,0018 (SP) JAL 80217824 ;V0=read/write word to/from port SW S0,0010 (SP) //802060EC: JAL 80200940 ;copy save game data from controller paks and N64 ADDU S2,V0,R0 ;S2=V0: final block //802060F4: LUI A0,8050 ;A0=80500000 ADDU A1,S3,R0 ;A1=0 start block ADDU A2,S2,R0 ;A2=S2: end block JAL 8020222C ;copy data from controller A3's mempak blocks A1-A2 to A0 ADDIU A3,R0,0001 ;A3=1 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM LUI S4,8050 ;S4=80500000: p->source BLEZ S2,8020615C ;skip if no data ADDIU S6,R0,0067 ;S6=67: 'g': letter code to loop at //80206118: update LCD while sending data ADDIU S5,S5,0001 ;S5++ sent.count++ ANDI V0,S5,03FF BNE V0,R0,80206140 ;update only every 0x400 bytes ADDU A0,S1,R0 ;A0=S1: cur.LCD ADDIU S1,S1,0001 ;S1++ next.LCD JAL 802067F0 ;display A0 to LCD screen ANDI A0,A0,00FF ;A0->byte ANDI V0,S1,00FF ;V0=S1->byte BEQL V0,S6,80206140 ;reset LCD to 'c' if set to 'g' ADDIU S1,R0,0063 //80206140: send next byte from source to PC LBU S0,0000 (S4) ;S0=source+offset: value to upload ADDIU S4,S4,0001 ;S4++ source++ ADDIU S2,S2,FFFF ;S2-- count-- JAL 802177AC ;V0=read/write byte to/from port ADDU A0,S0,R0 ;A0=S0: value BGTZ S2,80206118 ;loop for count ADDU S3,S3,S0 ;S3+=S0: checksum //8020615C: send checksum for confirmation JAL 802177AC ;V0=read/write byte to/from port ANDI A0,S3,00FF ;A0=1-byte checksum LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8020618C likely data ;LUI A0,8023 80206190 play sound A0 of length A1, dacrate A2, bitrate A3 accepts: A0=p->audio data, A1=length, A2=dacrate, A3=bitrate LUI V1,A450 SW A0,0000 (V1) ;A0->A4500000: AI dram BLTZL A1,802061A0 ;if -len, add 7 to compensate ADDIU A1,A1,0007 //802061A0: SRA V0,A1,0x3 ;V0/=8 SW V0,0004 (V1) ;V0->A4500004: AI length ADDIU V0,R0,0001 SW V0,0008 (V1) ;1->A4500008: AI control - set DMA SW A2,0010 (V1) ;A2->A4500010: AI dacrate SW A3,0014 (V1) ;A3->A4500014: AI bitrate JR RA NOP 802061C0 LUI V0,8022 LW V0,7580 (V0) ADDIU SP,SP,FFE8 BEQ V0,R0,80206210 SW RA,0010 (SP) BNE A0,R0,802061F0 LUI A0,8023 LUI A0,8023 ADDIU A0,A0,941D LUI A1,8023 J 802061FC ADDIU A1,A1,B113 ADDIU A0,A0,B113 LUI A1,8023 ADDIU A1,A1,CFB9 SUBU A1,A1,A0 SRA A1,A1,0x2 ADDIU A2,R0,2B11 JAL 80206190 ;play sound A0 of length A1, dacrate A2, bitrate A3 ADDIU A3,R0,0008 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8020621C A0-- ADDIU A0,A0,FFFF JR RA NOP 80206228 V0=cur.LCD flags LUI V0,8022 LW V0,7440 (V0) ;V0=80227440: prev.w.port JR RA NOP 80206238 A0->parallel port and prev.w.port; A0->80227440, A0->BE500000 LUI V0,8022 SW A0,7440 (V0) ;A0->80227440: prev.w.port LUI V0,BE50 SW A0,0000 (V0) ;A0->BE500000: upper half of parallel port? JR RA NOP 80206250 loop A0 times (probably) accepts: A0=count BEQ A0,R0,80206278 ;return if A0=0 ORI A1,R0,FFFF ;A1=-1 //80206258: ADDU V1,R0,R0 ;V1=0 init.count ADDIU V1,V1,0001 ;V1++ count++ //80206260: SLT V0,A1,V1 ;TRUE if -1 < V1 BEQL V0,R0,80206260 ;loop if somehow < -1 ADDIU V1,V1,0001 ;V1++ count++ ADDIU A0,A0,FFFF ;A0-- BNE A0,R0,8020625C ;loop until A0 zero ADDU V1,R0,R0 ;V1=0 init.count //80206278: return JR RA NOP 80206280 untoggle 80808080 and send to BE500000, then retoggle and resend 100 times ADDIU SP,SP,FFE8 SW RA,0014 (SP) JAL 80206228 ;V0=80227440: prev.w.port SW S0,0010 (SP) LUI V1,7F7F ORI V1,V1,7F7F AND S0,V0,V1 ;S0=value & 7F7F7F7F: unset 80808080 flags JAL 80206238 ;A0->80227440, A0->BE500000 ADDU A0,S0,R0 ;A0=S0: update flags JAL 80206250 ;loop A0 times ADDIU A0,R0,0001 ;loop once LUI A0,8080 ORI A0,A0,8080 JAL 80206238 ;A0->80227440, A0->BE500000 OR A0,S0,A0 ;A0=value | 80808080: set 80808080 flags JAL 80206250 ;loop A0 times ADDIU A0,R0,0064 ;loop 100 times LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 802062D4 unset LCD '.' ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80206228 ;V0=80227440: prev.w.port NOP LUI A0,7F7F ORI A0,A0,7F7F ;A0=7F7F7F7F JAL 80206238 ;A0->80227440, A0->BE500000 AND A0,V0,A0 ;A0=value & mask LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80206300 set or unset (A0=1:0) 40402040 flags at 80227440 and BE500000 accepts: A0=set or unset (1:0) ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 80206228 ;V0=80227440: prev.w.port ADDU S0,A0,R0 ;S0=A0: mode LUI V1,BFBF ORI V1,V1,DFBF ;V1=BFBFDFBF BEQ S0,R0,80206330 ;branch if mode=unset AND A0,V0,V1 ;A0&=mask LUI V0,4040 ORI V0,V0,2040 ;V0=40402040 OR A0,A0,V0 ;A0|=flags //80206330: JAL 80206238 ;A0->80227440, A0->BE500000 NOP LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80206348 set or unset (A0=1:0) 20204020 flags at 80227440 and BE500000 accepts: A0=set or unset (1:0) ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 80206228 ;V0=80227440: prev.w.port ADDU S0,A0,R0 ;S0=A0: mode LUI V1,DFDF ORI V1,V1,BFDF ;V1=DFDFBFDF BEQ S0,R0,80206378 ;branch if mode=unset AND A0,V0,V1 ;A0=V0&DFDFBFDF: untoggle 20204020 LUI V0,2020 ORI V0,V0,4020 ;V0=20204020 OR A0,A0,V0 ;A0|=flags //80206378: JAL 80206238 ;A0->80227440, A0->BE500000 NOP LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80206390 read word from cur. hardware address; redirects to 80217C50: A0=0 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80217C50 ;V0=word from cur.hardware address + A0 ADDU A0,R0,R0 ;A0=0 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 802063AC loop until GS button in state A0 (1:pressed; 0:unpressed) accepts: A0=GS button pressed:1; not pressed:0 ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,R0,R0 ;S0=0: GS button not pressed SW RA,0018 (SP) BEQ A0,R0,802063CC ;S0=0 if A0 is same SW S1,0014 (SP) LUI S0,0040 ORI S0,S0,0040 ;S0=00400040: GS button pressed //802063CC: build mask LUI S1,0040 ORI S1,S1,0040 ;S1=00400040: GS button mask //802063D4: test port for GS button flag JAL 80206390 ;read word from cur. hardware address NOP AND V0,V0,S1 ;V0&=GS button mask BNE V0,S0,802063D4 ;loop until in test state NOP //802063E8: return LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 802063FC ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A0,R0 SW S1,0014 (SP) ADDU S1,R0,R0 SW RA,0018 (SP) JAL 80206300 ADDIU A0,R0,0001 JAL 80206348 ANDI A0,S0,0080 SLL S0,S0,0x1 JAL 802063AC ;loop until GS button in state A0 ADDIU A0,R0,0001 ;A0=pressed JAL 80206300 ADDU A0,R0,R0 JAL 802063AC ;loop until GS button in state A0 ADDU A0,R0,R0 ;A0=unpressed ADDIU S1,S1,0001 SLTI V0,S1,0008 BNE V0,R0,80206414 NOP LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80206464 ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,R0,R0 SW S1,0014 (SP) ADDU S1,S0,R0 SW S2,0018 (SP) LUI S2,0020 ORI S2,S2,0020 SW RA,001C (SP) SLL S0,S0,0x1 ANDI S0,S0,00FF JAL 802063AC ;loop until GS button in state A0 ADDIU A0,R0,0001 ;A0=pressed JAL 80206300 ADDIU A0,R0,0001 JAL 802063AC ;loop until GS button in state A0 ADDU A0,R0,R0 ;A0=unpressed JAL 80206390 ;read word from cur. hardware address NOP AND V0,V0,S2 BNEL V0,R0,802064BC ORI S0,S0,0001 JAL 80206300 ADDU A0,R0,R0 ADDIU S1,S1,0001 SLTI V0,S1,0008 BNEL V0,R0,8020648C SLL S0,S0,0x1 ADDU V0,S0,R0 LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 802064F0 ADDIU SP,SP,FFD8 SW RA,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW S1,0014 (SP) JAL 80206280 SW S0,0010 (SP) JAL 80206390 ;read word from cur. hardware address ADDIU S0,R0,00AE LUI V1,0020 ORI V1,V1,0020 AND S3,V0,V1 ADDU S1,R0,R0 LUI S2,0020 ORI S2,S2,0020 JAL 80206300 ADDIU A0,R0,0001 ANDI A0,S0,0080 BEQ A0,R0,80206544 SLL S0,S0,0x1 ORI S0,S0,0001 JAL 80206348 ANDI S0,S0,00FF JAL 80206250 ;loop A0 times ADDIU A0,R0,0001 JAL 80206300 ADDU A0,R0,R0 JAL 80206250 ;loop A0 times ADDIU A0,R0,0001 JAL 80206390 ;read word from cur. hardware address NOP AND V0,V0,S2 BNE V0,S3,80206588 SLTI V0,S1,0006 ADDIU S1,S1,0001 SLTI V0,S1,0006 BNE V0,R0,8020652C SLTI V0,S1,0006 LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 802065A4 ORI A2,R0,FFFF BLEZ A1,80206604 ADDU T1,R0,R0 ADDIU A3,R0,000F ADDU V0,A0,T1 LBU V1,0000 (V0) LBU V0,0001 (V0) SLL V1,V1,0x8 OR V1,V1,V0 ANDI T0,A2,8000 ANDI V0,V1,8000 BEQ V0,R0,802065DC SLL A2,A2,0x1 ORI A2,A2,0001 BEQ T0,R0,802065E8 SLL V1,V1,0x1 XORI A2,A2,8005 ADDIU A3,A3,FFFF BGEZ A3,802065C8 ANDI A2,A2,FFFF ADDIU T1,T1,0002 SLT V0,T1,A1 BNE V0,R0,802065B4 ADDIU A3,R0,000F JR RA ADDU V0,A2,R0 8020660C ADDIU SP,SP,FFD8 ADDU A1,A0,R0 ADDIU A0,SP,0010 SW S1,001C (SP) ADDU S1,R0,R0 SW S0,0018 (SP) ADDU S0,A0,R0 SRL V0,A1,0x18 SB V0,0012 (SP) SRL V0,A1,0x10 SB V0,0013 (SP) LUI V0,8022 LUI V1,8022 LBU A2,744B (V0) LBU V1,744F (V1) SRL V0,A1,0x8 SB A1,0015 (SP) ADDIU A1,R0,0006 SW RA,0020 (SP) SB V0,0014 (SP) SB A2,0010 (SP) JAL 802065A4 SB V1,0011 (SP) SRL V1,V0,0x8 SB V1,0016 (SP) SB V0,0017 (SP) ADDU V0,S0,S1 LBU A0,0000 (V0) JAL 802063FC ADDIU S1,S1,0001 SLTI V0,S1,0008 BNE V0,R0,80206678 ADDU V0,S0,S1 JAL 80206250 ;loop A0 times ADDIU A0,R0,000A ADDU S0,R0,R0 ADDU S1,S0,R0 JAL 80206464 SLL S0,S0,0x8 OR S0,S0,V0 ADDIU S1,S1,0001 SLTI V0,S1,0004 BNE V0,R0,802066A0 ADDU V0,S0,R0 LW RA,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0028 802066D0 ADDIU SP,SP,FFE8 SW S0,0010 (SP) LUI S0,8022 LW V0,7444 (S0) BNE V0,R0,802066F0 SW RA,0014 (SP) JAL 802064F0 NOP LW RA,0014 (SP) ADDIU V0,R0,0001 SW V0,7444 (S0) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80206708 ADDIU SP,SP,FFE0 LUI A0,6962 ORI A0,A0,A1B4 SW S1,0014 (SP) LUI S1,8022 ADDIU V0,R0,0002 SW S0,0010 (SP) LUI S0,8022 SW RA,0018 (SP) SW V0,7448 (S1) JAL 8020660C SW V0,744C (S0) LUI V1,0455 ORI V1,V1,4321 BNE V0,V1,80206758 ADDIU V0,R0,0001 ADDU V0,R0,R0 ADDIU V1,R0,0001 SW V1,7448 (S1) SW V1,744C (S0) LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020676C likely fill ;LBU V0,0000 (V1) 80206770 save A0 to hardware+800 accepts: A0=mode ADDIU SP,SP,FFE8 ADDU A1,A0,R0 ;A1=A0: value SW RA,0010 (SP) JAL 80217C8C ;save A1->hardware + A0 ADDIU A0,R0,0800 ;A0=800: offset JAL 8021763C ;stall 190 cycles NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80206798 V0=bitsample for displaying A0 to LCD screen accepts: A0=char LUI V1,8022 LBU V0,7450 (V1) ;V0=80227450: table of bitcodes for command IDs ADDIU A2,R0,00FF BEQ V0,A2,802067E4 ;return -1 if 80227450=FF: at end of list ADDU A1,R0,R0 ;A1=0 init. offset ANDI A0,A0,00FF ;A0->byte ADDU T0,A2,R0 ;T0=A2: FF ADDIU A3,V1,7450 ;A3=80227450 ADDU V1,A3,R0 ;V1=A3: 80227450 LBU V0,0000 (V1) ;V0=80227450: sample //802067C0: on hit, return alias value BNE V0,A0,802067D8 ;branch if sample doesn't match source value ADDIU V1,V1,0002 ;V1+=2: next sample ADDU V0,A1,A3 LBU A2,0001 (V0) ;A2=80227451+offset: matching value in alias table JR RA ADDU V0,A2,R0 ;V0=A2: matching pair //802067D8: loop through all entries LBU V0,0000 (V1) ;V0=V1+0: next value BNE V0,T0,802067C0 ;loop until end of list (FF) ADDIU A1,A1,0002 ;A1+=2: next entry to test //802067E4: return -1:no match ADDU V0,A2,R0 JR RA NOP 802067F0 display A0 to LCD screen accepts: A0=[letter ID] ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: char ADDIU A0,R0,0600 ;A0=600: SW RA,001C (SP) SW S2,0018 (SP) JAL 802176B4 ;save 0600 to hardware + 600 SW S1,0014 (SP) JAL 80206798 ;V0=bitsample for displaying A0 to LCD screen ANDI A0,S0,00FF ;A0=S0: (byte)inital A0 LUI V1,0001 OR S1,V0,V1 ;S1=10000 | V0: bitsample to indicate write modes SLTI V0,S1,0101 ;always FALSE, since you just ORed with 10000... BNE V0,R0,80206874 ;skip if magically the above wasn't FALSE... LUI S2,0400 ORI S2,S2,0400 ;S2=04000400 ANDI V0,S1,0001 ;V0=S1&1: flag, by default would be set in first sample //80206834: determine values to send based on flags BEQ V0,R0,80206844 ;S0 = 0 if flag not set, 200 otherwise ADDU S0,R0,R0 ;S0=00000000 LUI S0,0200 ORI S0,S0,0200 ;S0=02000200 //80206844: send values JAL 80206770 ;save A0 to hardware + 800 ADDU A0,S0,R0 ;A0=S0 JAL 80206770 ;save A0 to hardware + 800 OR A0,S0,S2 ;A0|=04000400 JAL 80206770 ;save A0 to hardware + 800 ADDU A0,S0,R0 ;A0=S0 SRL V0,S1,0x1F ;V0=TRUE if negative number ADDU V0,S1,V0 ;V0+=S1 SRA S1,V0,0x1 ;S1=(S1+V0)/2 SLTI V0,S1,0101 ;TRUE while S1 < 101. By default this means 8 samples BEQ V0,R0,80206834 ;repeat for next 8 bits in sample ANDI V0,S1,0001 ;V0=S1: flag //80206874: JAL 802176B4 ;save 0200 to hardware + 600 ADDIU A0,R0,0200 ;A0=200 //8020687C: return LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80206894 redirects to 802067F0 accepts: A0=char ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 802067F0 ;display A0 to LCD screen ANDI A0,A0,00FF ;A0->byte LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 802068B0 ADDIU SP,SP,FFD0 SW S1,0014 (SP) ADDU S1,R0,R0 LUI A0,8000 ;A0=A button LUI A1,8020 ADDIU A1,A1,6B74 ;A1=80206B74 LUI V0,8022 ADDIU V1,R0,0001 SW S0,0010 (SP) LUI S0,8022 SW RA,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S4,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW V1,74AC (V0) JAL 80211130 ;use handler A1 if buttons A0 pressed SW V1,74B4 (S0) LUI S4,0200 ORI S4,S4,0004 ;S4=02000004: + left, stick left ADDIU S2,R0,0001 LUI S3,0100 ORI S3,S3,0008 ;S3=01000008: + right, stick right LUI S6,4000 ;S6=B button LUI S5,8000 ;S5=A button JAL 80210D30 ;V0=button and stick pos for controller 1 NOP ADDU V1,V0,R0 ;V1=V0: button/stick AND V0,V1,S4 ;V0=nonzero if left pressed BEQ V0,R0,80206940 AND V0,V1,S3 ;V0=nonzero if right pressed LW V0,74B4 (S0) BEQL V0,S2,8020693C SW R0,74B4 (S0) AND V0,V1,S3 ;V0=nonzero if right pressed BEQ V0,R0,80206958 AND V0,V1,S6 ;V0=nonzero if B pressed LW V0,74B4 (S0) BEQL V0,R0,80206954 SW S2,74B4 (S0) AND V0,V1,S6 ;V0=nonzero if B pressed BEQ V0,R0,80206968 AND V0,V1,S5 ;V0=nonzero if A pressed SW S2,74B4 (S0) ADDIU S1,R0,0002 BNEL V0,R0,80206970 ADDIU S1,R0,0001 JAL 80206B74 NOP JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BEQ S1,R0,80206918 LUI A0,8000 ;A0=A button LUI S0,8020 ADDIU S0,S0,6B74 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=80206B74 LUI A0,4000 ;A0=B button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=80206B74 ADDU V0,S1,R0 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 802069D8 copy keycode list to 802491E0; redirect to 802180A8: A0=2FC00, A1=802491E0, A2=400 ADDIU SP,SP,FFE8 LUI A0,0002 ORI A0,A0,FC00 ;A0=2FC00: keycode list LUI A1,8025 ADDIU A1,A1,91E0 ;A1=802491E0: p->target SW RA,0010 (SP) JAL 802180A8 ;copy A2 bytes from hardware A0 to A1 ADDIU A2,R0,0400 ;A2=400 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80206A04 save keycode table to ROM ADDIU SP,SP,FFE8 LUI A0,0002 ORI A0,A0,FC00 ;A0=2FC00 LUI A1,8025 ADDIU A1,A1,91E0 ;A1=802491E0: keycode table SW RA,0010 (SP) JAL 80217F04 ;write A2 bytes from A1 to hardware A0 ADDIU A2,R0,0400 ;A2=400 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80206A30 accepts: A0=CRC, A1=~CRC, A2=mask byte, A3=boot address ADDU A0,A0,A1 ;A0+=A1: CRC+~CRC ADDU A0,A0,A3 ;A0+=A3: CRC+~CRC+boot ADDU A1,R0,R0 ;A1=0 init.count ADDIU A3,R0,0004 ;A3=4 #words to grab LUI V1,BEC0 ORI V1,V1,0030 ;V1=BEC00030: GS+30 //80206A48: retrieve GS ROM+30 to 40 LW V0,0000 (V1) ;V0=timestamp[0-3] ADDIU V1,V1,0004 ;V1+=4 ADDIU A1,A1,0001 ;A1++ count++ BNE A1,A3,80206A48 ;loop four times ADDU A0,A0,V0 ;A0+=V0: sum+timestamp XOR V0,A2,A0 ;V0=A2^A0: invert mask bits ANDI V0,V0,00FF ;V0->byte JR RA SLTIU V0,V0,0001 ;TRUE if V0=0 80206A6C accepts: A0=, A1=offset to selected keycode LUI V0,8022 LW V0,749C (V0) ;V0=8022749C: BNEL V0,R0,80206A88 ;FAIL if zero LUI V0,8022 LUI V0,FFFE JR RA ORI V0,V0,FFFE ;V0=FFFEFFFE: white? //80206A88: LW V0,7498 (V0) ;V0=80227498: BNE A0,V0,80206B6C ;if doesn't match A0, FAIL LUI V0,FFFE LUI V0,8022 LW V1,74A0 (V0) ;V1=802274A0: ADDIU V0,R0,0001 BNEL V1,V0,80206AFC ;branch if not 1 LUI V0,8022 AND V0,A0,V0 ;V0&=A0: TRUE if 1 set BNE V0,R0,80206AD8 ;branch if 1 set in A0 LUI V0,8022 LW V0,74C4 (V0) ;V0=802274C4: p->new checksum ADDU A2,V0,A1 ;A2=V0+A1: table+offset=p->selected keycode LBU V1,0000 (A2) ANDI V0,V1,00F0 SLTI V0,V0,00F0 BEQ V0,R0,80206AF8 ADDIU V0,V1,0010 J 80206AF8 SB V0,0000 (A2) //80206AD8: LW V0,74C4 (V0) ;V0=802274C4: p->new checksum ADDU A2,V0,A1 ;A2=V0+A1: table+offset=p->selected keycode LBU V1,0000 (A2) ANDI V0,V1,000F SLTI V0,V0,000F BEQ V0,R0,80206AF8 ADDIU V0,V1,0001 SB V0,0000 (A2) //80206AF8: LUI V0,8022 LW V1,74A0 (V0) ;V1=802274A0: ADDIU V0,R0,0002 BNE V1,V0,80206B5C ;branch if not 2 LUI V0,8022 ANDI V0,A0,0001 BNE V0,R0,80206B38 ;branch if 1 set in A0 LUI V0,8022 LW V0,74C4 (V0) ;V0=802274C4: p->new checksum ADDU A1,V0,A1 ;A1=V0+A1: table+offset=p->selected keycode LBU V1,0000 (A1) ANDI V0,V1,00F0 BLEZL V0,80206B5C LUI V0,8022 J 80206B54 ADDIU V0,V1,FFF0 //80206B38: LW V0,74C4 (V0) ;V0=802274C4: p->new checksum ADDU A1,V0,A1 ;A1=V0+A1: table+offset=p->selected keycode LBU V1,0000 (A1) ANDI V0,V1,000F BLEZL V0,80206B5C LUI V0,8022 ADDIU V0,V1,FFFF //80206B54: SB V0,0000 (A1) LUI V0,8022 //80206B5C: return green: SUCCESS SW R0,74A0 (V0) ;0->802274A0: LUI V0,07C0 JR RA ORI V0,V0,07C0 ;V0=07C007C0: green //80206B6C: return white: FAILED JR RA ORI V0,V0,FFFE ;V0=FFFEFFFE: white 80206B74 ADDIU SP,SP,FFC8 SW RA,0030 (SP) SW S5,002C (SP) SW S4,0028 (SP) SW S3,0024 (SP) SW S2,0020 (SP) SW S1,001C (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM SW S0,0018 (SP) JAL 80212B20 ADDIU A0,R0,0001 ADDIU A0,R0,000E ADDU A1,A0,R0 ADDIU A2,R0,001F ADDU S2,R0,R0 ADDU S3,S2,R0 LUI S4,8022 LUI S5,8022 ADDIU S1,R0,0024 LUI V0,8022 LW A3,772C (V0) ADDIU S0,R0,001C JAL 80212C90 SW R0,0010 (SP) ADDIU A0,R0,000E ADDIU A1,R0,0022 ADDIU A2,R0,001F LUI A3,8022 ADDIU A3,A3,2690 JAL 80212C90 SW R0,0010 (SP) ADDIU A0,R0,0010 ADDIU A1,R0,0064 ADDIU A2,R0,0120 ADDIU A3,R0,0012 ADDIU V0,R0,0001 JAL 80213988 SW V0,0010 (SP) ADDU A0,S2,R0 LW V0,7490 (S4) ;V0=80227490: selected keycode ADDIU S2,S2,0001 SLL A1,V0,0x1 ADDU A1,A1,V0 SLL A1,A1,0x2 SUBU A1,A1,V0 SLL A1,A1,0x2 ;A1=V0*2C: offset to selected keycode JAL 80206A6C ADDU A1,A1,S3 ADDU A0,S0,R0 ADDIU A1,R0,006A LW V1,7490 (S4) ;V1=80227490: selected keycode ADDU A3,V0,R0 SLL V0,V1,0x1 ADDU V0,V0,V1 SLL V0,V0,0x2 SUBU V0,V0,V1 SLL V0,V0,0x2 ;V0=V1*2C: offset to selected keycode LW V1,74C4 (S5) ;V1=802274C4: p->new checksum ADDU V0,V0,S3 ADDU V1,V1,V0 LBU A2,0000 (V1) ADDIU S0,S0,0014 JAL 80211338 ;print nibble A2 as hex centered on line in colour A3 at {A0,A1} SRL A2,A2,0x4 ADDU A0,S2,R0 LW V0,7490 (S4) ;V0=80227490: selected keycode ADDIU S2,S2,0001 SLL A1,V0,0x1 ADDU A1,A1,V0 SLL A1,A1,0x2 SUBU A1,A1,V0 SLL A1,A1,0x2 ;A1=V0*2C: offset to selected keycode JAL 80206A6C ADDU A1,A1,S3 ADDU A0,S1,R0 ADDIU A1,R0,006A ADDU A3,V0,R0 LW V1,7490 (S4) ;V1=80227490: selected keycode ADDIU S1,S1,0014 SLL V0,V1,0x1 ADDU V0,V0,V1 SLL V0,V0,0x2 SUBU V0,V0,V1 SLL V0,V0,0x2 ;V0=V1*2C: offset to selected keycode LW V1,74C4 (S5) ;V1=802274C4: p->new checksum ADDU V0,V0,S3 ADDU V1,V1,V0 LBU A2,0000 (V1) ADDIU S3,S3,0001 JAL 80211338 ;print nibble A2 as hex centered on line in colour A3 at {A0,A1} ANDI A2,A2,000F SLTI V0,S3,0008 BNE V0,R0,80206C10 ADDU A0,S2,R0 ADDIU S2,S2,0001 ADDIU S3,R0,0008 LUI V0,8022 ADDU S4,V0,R0 LUI V1,8022 LW V0,7490 (S4) ;V0=80227490: selected keycode ADDU S5,V1,R0 SLL A1,V0,0x1 ADDU A1,A1,V0 SLL A1,A1,0x2 SUBU A1,A1,V0 SLL A1,A1,0x2 ;A1=V0*2C: offset to selected keycode JAL 80206A6C ADDIU A1,A1,000C ADDIU A0,R0,00BC LW A2,7490 (S4) ;A2=80227490: selected keycode ADDIU A1,R0,006A SLL V1,A2,0x1 ADDU V1,V1,A2 SLL V1,V1,0x2 SUBU V1,V1,A2 LW A2,74C4 (S5) ;A2=802274C4: p->new checksum SLL V1,V1,0x2 ;V1=A2*2C: offset to selected keycode ADDU V1,V1,A2 LBU A2,000C (V1) ADDU A3,V0,R0 JAL 80211338 ;print nibble A2 as hex centered on line in colour A3 at {A0,A1} SRL A2,A2,0x4 ADDU A0,S2,R0 LW V0,7490 (S4) ;V0=80227490: selected keycode ADDIU S2,S2,0001 SLL A1,V0,0x1 ADDU A1,A1,V0 SLL A1,A1,0x2 SUBU A1,A1,V0 SLL A1,A1,0x2 ;A1=V0*2C: offset to selected keycode JAL 80206A6C ADDIU A1,A1,000C ADDIU A0,R0,00C4 LW A2,7490 (S4) ;A2=80227490: selected keycode ADDIU A1,R0,006A SLL V1,A2,0x1 ADDU V1,V1,A2 SLL V1,V1,0x2 SUBU V1,V1,A2 LW A2,74C4 (S5) ;A2=802274C4: p->new checksum SLL V1,V1,0x2 ;V1=A2*2C: offset to selected keycode ADDU V1,V1,A2 LBU A2,000C (V1) ADDU A3,V0,R0 JAL 80211338 ;print nibble A2 as hex centered on line in colour A3 at {A0,A1} ANDI A2,A2,000F ADDU A0,S2,R0 LW V0,7490 (S4) ;V0=80227490: selected keycode ADDIU S2,S2,0001 SLL A1,V0,0x1 ADDU A1,A1,V0 SLL A1,A1,0x2 SUBU A1,A1,V0 SLL A1,A1,0x2 ;A1=V0*2C: offset to selected keycode JAL 80206A6C ADDU A1,A1,S3 ADDIU S1,S3,0001 SLL S0,S1,0x2 ADDU S0,S0,S1 SLL S0,S0,0x2 ADDIU A0,S0,0024 LW A2,7490 (S4) ;A2=80227490: selected keycode ADDIU A1,R0,006A SLL V1,A2,0x1 ADDU V1,V1,A2 SLL V1,V1,0x2 SUBU V1,V1,A2 SLL V1,V1,0x2 ;V1=A2*2C: offset to selected keycode LW A2,74C4 (S5) ;A2=802274C4: p->new checksum ADDU V1,V1,S3 ADDU A2,A2,V1 LBU A2,0000 (A2) ADDU A3,V0,R0 JAL 80211338 ;print nibble A2 as hex centered on line in colour A3 at {A0,A1} SRL A2,A2,0x4 ADDU A0,S2,R0 LW V0,7490 (S4) ;V0=80227490: selected keycode ADDIU S2,S2,0001 SLL A1,V0,0x1 ADDU A1,A1,V0 SLL A1,A1,0x2 SUBU A1,A1,V0 SLL A1,A1,0x2 ;A1=V0*2C: offset to selected keycode JAL 80206A6C ADDU A1,A1,S3 ADDIU A0,S0,002C ADDIU A1,R0,006A LW V1,7490 (S4) ;V1=80227490: selected keycode ADDU A3,V0,R0 SLL V0,V1,0x1 ADDU V0,V0,V1 SLL V0,V0,0x2 SUBU V0,V0,V1 SLL V0,V0,0x2 ;V0=V1*2C: offset to selected keycode LW V1,74C4 (S5) ;V1=802274C4: p->new checksum ADDU V0,V0,S3 ADDU V1,V1,V0 LBU A2,0000 (V1) ADDU S3,S1,R0 JAL 80211338 ;print nibble A2 as hex centered on line in colour A3 at {A0,A1} ANDI A2,A2,000F SLTI V0,S3,000C BNE V0,R0,80206DC0 ADDU A0,S2,R0 ADDIU A0,R0,0084 LUI A2,FFFE ORI A2,A2,FFFE ;A2=FFFEFFFE LUI S0,8022 LW V0,7490 (S0) ;V0=80227490: selected keycode LUI V1,8022 SLL A1,V0,0x1 ADDU A1,A1,V0 SLL A1,A1,0x2 SUBU A1,A1,V0 SLL A1,A1,0x2 ;A1=V0*2C: offset to selected keycode LW V0,74C4 (V1) ;V0=802274C4: p->keycode checksum correction ADDIU A1,A1,000D ;A1+=D: offset to string JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ADDU A1,V0,A1 ;A1+=V0: p->keycode entry name LUI V0,8022 LW V0,74B8 (V0) ;V0=802274B8: BEQ V0,R0,80206F1C ADDIU A0,R0,00BE LUI A2,F800 LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A1,04D4 (S0) ;A1=str+4D4: 80222E84 "Please turn the power off" JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,F800 ;A2=F800F800: red ADDIU A0,R0,00C6 LUI A2,F800 LW A1,04D8 (S0) ;A1=str+4D8: 80222E74 "and change game" J 802071CC ORI A2,A2,F800 ;A2=F800F800: red //80206F1C: LUI V0,8022 LW V0,74A4 (V0) ;V0=802274A4: BEQ V0,R0,80206F40 ADDIU A0,R0,00A4 LUI V0,8022 LW A1,7B24 (V0) ;A1=80227B24: LUI A2,F800 J 802071CC ORI A2,A2,F800 ;A2=F800F800: red //80206F40: LUI V0,8022 LW V0,74A8 (V0) BEQ V0,R0,80206F60 LUI V0,8022 LW A1,7B28 (V0) LUI A2,F800 J 802071CC ORI A2,A2,F800 ;A2=F800F800: red //80206F60: LUI V0,8022 LW V0,74B0 (V0) BEQ V0,R0,80207018 LUI V0,0028 ORI V0,V0,0028 ADDIU A0,R0,0044 ADDIU A1,R0,00A6 ADDIU A2,R0,00B9 ADDIU A3,R0,002D JAL 8021126C SW V0,0010 (SP) LUI V0,FFFE ORI V0,V0,FFFE ADDIU A0,R0,0044 ADDIU A1,R0,00A6 ADDIU A2,R0,00B9 ADDIU A3,R0,002D JAL 8021149C SW V0,0010 (SP) ADDIU A0,R0,00AA LUI A2,FFFE LUI V0,8022 ADDIU S0,V0,7660 ;S0=80227660: string pointer table LW A1,04DC (S0) ;A1=str+4DC: 80222E60 "Do you want to save" JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE ADDIU A0,R0,00B2 LUI A2,FFFE LW A1,04E0 (S0) ;A1=str+4E0: 80222E50 "this Key code?" JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE LUI V0,8022 LW V0,74B4 (V0) BNE V0,R0,802070D0 ADDIU A0,R0,006E ADDIU A0,R0,00A5 ADDIU A1,R0,00C8 LUI A3,7BDE LW A2,0170 (S0) ;A2=str+170: 80223EEC " No" JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% ADDIU A0,R0,006E //80207018: ADDIU A1,R0,00C8 LW A2,016C (S0) ;A2=str+16C: 80223EF0 "Yes" J 802070F4 LUI A3,FFFE //80207028: LUI V0,8022 LW V0,74AC (V0) BEQ V0,R0,80207104 LUI V0,0028 ORI V0,V0,0028 ADDIU A0,R0,0044 ADDIU A1,R0,00A6 ADDIU A2,R0,00B9 ADDIU A3,R0,002D JAL 8021126C SW V0,0010 (SP) LUI V0,FFFE ORI V0,V0,FFFE ADDIU A0,R0,0044 ADDIU A1,R0,00A6 ADDIU A2,R0,00B9 ADDIU A3,R0,002D JAL 8021149C SW V0,0010 (SP) ADDIU A0,R0,00AA LUI A2,FFFE LUI V0,8022 ADDIU S0,V0,7660 ;S0=80227660: string pointer table LW A1,04CC (S0) ;A1=str+4CC: 80222EB4 "Are you sure" JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE ADDIU A0,R0,00B2 LUI A2,FFFE LW A1,04D0 (S0) ;A1=str+4D0: 80222EA0 "you have this game?" JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE LUI V0,8022 LW V0,74B4 (V0) BNE V0,R0,802070D0 ADDIU A0,R0,006E //802070A4: ADDIU A0,R0,00A5 ADDIU A1,R0,00C8 LUI A3,7BDE LW A2,0170 (S0) ;A2=str+170: 80223EEC " No" JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% ADDIU A0,R0,006E ADDIU A1,R0,00C8 LW A2,016C (S0) ;A1=str+16C: 80223EF0 "Yes" J 802070F4 LUI A3,FFFE //802070D0: ADDIU A1,R0,00C8 LUI A3,7BDE LW A2,016C (S0) ;A2=str+16C: 80223EF0 "Yes" JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% ADDIU A0,R0,00A5 ADDIU A1,R0,00C8 LUI A3,FFFE LW A2,0170 (S0) ;A2=str+170: 80223EEC " No" //802070F4: JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ORI A3,A3,FFFE J 802071D4 ;return NOP //80207104: LUI V0,8022 LW V1,7490 (S0) ;V1=80227490: selected keycode LW V0,74C0 (V0) ;V0=802274C0: #keycodes BNE V1,V0,802071A4 ;branch if not last entry ADDIU A0,R0,00A4 LUI V0,8022 LW V0,749C (V0) BEQ V0,R0,80207164 ADDIU A0,R0,00B4 LUI A2,FFFE LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A1,04A4 (S0) ;A1=str+A4: 80222FE8 "Use Left/Right to select." JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE ADDIU A0,R0,00BC LUI A2,FFFE LW A1,04A8 (S0) ;A1=str+A8: 80222FC8 "Use Up/Down to change value." JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE ADDIU A0,R0,00C4 LW A1,04AC (S0) ;A1=str+AC: 80222FAC "Press 'A' when finished." J 802071C8 LUI A2,FFFE //80207164: ADDIU A0,R0,00A4 LUI A2,FFFE LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A1,04B4 (S0) ;A1=str+4B4: 80222F68 "Use Up/Down to view key codes." JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE ADDIU A0,R0,00B4 LUI A2,FFFE LW A1,04C0 (S0) ;A1=str+4C0: 80222F0C "Press 'Z' to set to factory default." JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE ADDIU A0,R0,00C4 LW A1,04B0 (S0) ;A1=str+4B0: 80222F88 "Press 'A' to Edit custom Keycode." J 802071C8 LUI A2,FFFE //802071A4: LUI A2,FFFE LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A1,04B4 (S0) ;A1=str+4B4: 80222F68 "Use Up/Down to view key codes." JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE ADDIU A0,R0,00B4 LUI A2,FFFE LW A1,04C0 (S0) ;A1=str+4C0: 80222F0C "Press 'Z' to set to factory default." //802071C8: ORI A2,A2,FFFE JAL 80210EF4 ;print A1 centered on line A0 in colour A2 NOP //802071D4: return LW RA,0030 (SP) LW S5,002C (SP) LW S4,0028 (SP) LW S3,0024 (SP) LW S2,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0038 802071F8 ADDIU SP,SP,FFC0 SW S5,002C (SP) ADDU S5,R0,R0 SW S1,001C (SP) LUI S1,8022 SW S0,0018 (SP) LUI S0,8022 SW RA,003C (SP) SW S8,0038 (SP) SW S7,0034 (SP) SW S6,0030 (SP) SW S4,0028 (SP) SW S3,0024 (SP) SW S2,0020 (SP) SW R0,0010 (SP) SW R0,7498 (S1) JAL 8020787C ;determine #keycode entries SW R0,749C (S0) JAL 80210D30 ;V0=button and stick pos for controller 1 ADDU S2,S0,R0 ;S2=S0: 80220000 ADDU S7,S1,R0 ADDIU S6,R0,0001 LUI S3,8022 LUI S4,8020 LUI S8,8022 JAL 80210D4C ;V0=button and stick pos NOP ADDU S1,V0,R0 ;S1=V0: button/stick LUI V0,0200 ORI V0,V0,0004 ;V0=02000004: + left, stick left AND V0,S1,V0 ;V0=nonzero if left BEQ V0,R0,802072BC LUI V0,0100 LW V0,749C (S2) ;V0=8022749C: BEQ V0,R0,802072BC LUI V0,0100 LW V0,7498 (S7) BLEZ V0,802072AC LUI A0,0200 JAL 802061C0 ADDU A0,R0,R0 LW V0,7498 (S7) ADDIU V0,V0,FFFF SW V0,7498 (S7) LUI A0,0200 ORI A0,A0,0004 ;A0=02000004: + left, stick left JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S4,6B74 LUI V0,0100 ORI V0,V0,0008 ;V0=01000008: + right, stick right AND V0,S1,V0 ;V0=nonzero if right pressed BEQ V0,R0,80207310 LUI V0,0800 LW V0,749C (S2) ;V0=8022749C: BEQ V0,R0,80207310 LUI V0,0800 LW V0,7498 (S7) SLTI V0,V0,0019 BEQ V0,R0,80207300 LUI A0,0100 JAL 802061C0 ADDU A0,R0,R0 LW V0,7498 (S7) ADDIU V0,V0,0001 SW V0,7498 (S7) LUI A0,0100 ORI A0,A0,0008 ;A0=01000008: + right, stick right JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S4,6B74 ;A1=80206B74 LUI V0,0800 ORI V0,V0,0002 ;V0=08000002: + up, stick up AND V0,S1,V0 ;V0=nonzero if up pressed BEQ V0,R0,80207364 LUI V0,0400 LW V0,749C (S2) ;V0=8022749C: BEQ V0,R0,80207340 NOP JAL 802061C0 ADDU A0,R0,R0 LUI T0,8022 J 80207350 SW S6,74A0 (T0) // LW V0,7490 (S3) ;V0=80227490: selected keycode BLEZ V0,80207350 ;branch if can't backtrack ADDIU V0,V0,FFFF ;V0-- previous selection SW V0,7490 (S3) ;update selected keycode LUI A0,0800 ORI A0,A0,0002 ;V0=08000002: + up, stick up JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S4,6B74 ;A1=80206B74 LUI V0,0400 ORI V0,V0,0001 ;V0=04000001: + down, stick down AND V0,S1,V0 ;V0=nonzero if down pressed BEQ V0,R0,802073C4 LUI V0,4000 LW V0,749C (S2) ;V0=8022749C: BEQ V0,R0,80207398 LUI T1,8022 JAL 802061C0 ADDU A0,R0,R0 ADDIU T0,R0,0002 LUI T1,8022 J 802073B0 SW T0,74A0 (T1) // LW V1,7490 (S3) ;V1=80227490: selected keycode LW V0,74C0 (T1) ;V0=802274C0: #keycodes SLT V0,V1,V0 BEQ V0,R0,802073B0 ;branch if final entry ADDIU V0,V1,0001 ;V0=V1+1: selection+1 SW V0,7490 (S3) ;update selected keycode LUI A0,0400 ORI A0,A0,0001 ;A0=04000001: + down, stick down JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S4,6B74 ;A1=80206B74 LUI V0,4000 AND V0,S1,V0 ;V0=nonzero if B pressed BEQ V0,R0,802073EC LUI A0,4000 ;A0=B button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S4,6B74 ;A1=80206B74 LW V0,749C (S2) ;V0=8022749C: BEQL V0,R0,802073EC ADDIU S5,R0,0001 JAL 802069D8 ;copy keycode list to 802491E0 SW R0,749C (S2) ;0->8022749C: BGEZ S1,80207648 LUI V0,2000 LUI A1,8020 ADDIU A1,A1,6B74 ;A1=80206B74: p->handler JAL 80211130 ;use handler A1 if buttons A0 pressed LUI A0,8000 ;A0=A button LUI T0,8022 LW A0,7490 (S3) ;A0=80227490: selected keycode LW V0,74C0 (T0) ;V0=802274C0: #keycodes BNE A0,V0,802074F8 ;branch if not final entry LUI T0,8022 LW V0,749C (S2) ;V0=8022749C: BEQ V0,R0,802074EC LUI V1,8022 SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x2 SUBU V0,V0,A0 SLL V0,V0,0x2 ;V0=A0*2C: offset to selected keycode LW V1,74C8 (V1) ;V1=802274C8: p->keycode list LW A2,74C4 (S8) ;A2=802274C4: p->new checksum ADDU V1,V0,V1 ;V1+=V0: p->selected keycode ADDU V0,V0,A2 ;V0+=A2: new+offset LW A0,0000 (V1) ;A0=keycode+0: CRC LW A1,0004 (V1) ;A1=keycode+4: ~CRC LBU A2,000C (V0) ;A2=keycode+C: mask confirmation byte LW A3,0008 (V1) ;A3=keycode+8: boot address JAL 80206A30 NOP BNE V0,R0,80207488 ;branch if TRUE LUI T1,8022 ADDIU A0,R0,0096 ;A0=150 times LUI A1,8020 ADDIU A1,A1,6B74 ;A1=80206B74 LUI S0,8022 JAL 8021120C ;call routine A1 A0 times SW S6,74A8 (S0) ;1->802274A8: J 80207630 SW R0,74A8 (S0) ;0->802274A8: // JAL 80207754 SW S6,74B0 (T1) ;1->802274B0: ADDIU T0,R0,0002 BNE V0,T0,802074B0 ;branch if not 2 LUI V0,8022 JAL 802076E0 ;replace GS checksum and update ROM ADDIU S5,R0,0001 ;S5=1 LUI T1,8022 J 80207630 SW R0,74B0 (T1) ;0->802274B0: // LW V0,74B4 (V0) ;V0=802274B4: LUI T0,8022 BNE V0,R0,802074DC SW R0,74B0 (T0) ;0->802274B0: JAL 80206A04 ;save keycode table to ROM NOP LUI T1,8022 LW V0,74C0 (T1) ;V0=802274C0: #keycodes ADDIU V0,V0,0001 ;V0++ increment count for new entry J 802074E4 SW V0,74C0 (T1) ;V0->802274C0: update count // JAL 802069D8 ;copy keycode list to 802491E0 NOP J 80207630 SW R0,749C (S2) ;0->8022749C: // SW R0,7498 (S7) ;0->80227498: J 80207630 SW S6,749C (S2) ;1->8022749C: // JAL 802068B0 SW S6,74AC (T0) ;1->802274AC: ADDIU T1,R0,0002 BNE V0,T1,80207520 ;branch if not 2 LUI V0,8022 JAL 802076E0 ;replace GS checksum and update ROM ADDIU S5,R0,0001 ;S5=1 LUI T0,8022 J 80207630 SW R0,74AC (T0) ;0->802274AC: // LW V0,74B4 (V0) LUI T1,8022 BNE V0,R0,80207624 SW R0,74AC (T1) ;0->802274AC: ADDU A0,R0,R0 ;A0=0 LUI T0,8025 ADDIU A1,T0,9788 ;A1=80249788: p->target JAL 802180A8 ;copy A2 bytes from hardware A0 to A1 ADDIU A2,R0,0100 ;A2=100: size ADDU A1,R0,R0 LUI T1,8025 ADDIU T1,T1,9788 LW V1,7490 (S3) ;V1=80227490: selected keycode ADDU A0,A1,T1 SLL V0,V1,0x1 ADDU V0,V0,V1 SLL V0,V0,0x2 SUBU V0,V0,V1 SLL V0,V0,0x2 ;V0=V1*2C: offset to selected keycode LW V1,74C4 (S8) ;V1=802274C4: p->new checksum ADDU V0,V0,A1 ADDU V1,V1,V0 LBU V0,0000 (V1) ADDIU A1,A1,0001 SB V0,0010 (A0) SLTI V0,A1,0008 BNE V0,R0,8020754C LUI T1,8025 ADDU A1,R0,R0 LUI T0,8025 ADDIU T0,T0,9788 LW V1,7490 (S3) ;V1=80227490: selected keycode ADDU A0,A1,T0 SLL V0,V1,0x1 ADDU V0,V0,V1 SLL V0,V0,0x2 SUBU V0,V0,V1 SLL V0,V0,0x2 ;V0=V1*2C: offset to selected keycode LW V1,74C4 (S8) ;V1=802274C4: p->new checksum ADDU V0,V0,A1 ADDU V0,V0,V1 LBU V0,0008 (V0) ADDIU A1,A1,0001 SB V0,0008 (A0) SLTI V0,A1,0004 BNE V0,R0,80207598 LUI T0,8025 ADDU A0,R0,R0 LUI T1,8025 ADDIU A1,T1,9788 JAL 80217F04 ;write A2 bytes from A1 to hardware A0 ADDIU A2,R0,0100 LUI V0,8022 SW S6,74B8 (V0) LUI S0,4C00 ORI S0,S0,0003 ;S0=B, + up, + down, stick up, stick down JAL 80210D4C ;V0=button and stick pos NOP JAL 80206B74 ADDU S1,V0,R0 ;S1=V0: button/stick JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP AND V0,S1,S0 ;V0=nonzero if B, up, down pressed BEQ V0,R0,80207600 NOP LUI V0,8022 SW R0,74B8 (V0) LUI S1,2000 BGEZ S1,80207648 LUI V0,2000 LUI A0,8000 ;A0=A button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S4,6B74 ;A1=80206B74 LUI V0,2000 AND V0,S1,V0 ;V0=nonzero if Z pressed BEQ V0,R0,80207684 NOP LUI A1,8020 ADDIU A1,A1,6B74 ;A1=80206B74: p->handler JAL 80211130 ;use handler A1 if buttons A0 pressed LUI A0,2000 ;A0=Z button LUI S0,8022 JAL 802076E0 ;replace GS checksum and update ROM SW S6,74A4 (S0) LUI A1,8020 ADDIU A1,A1,6B74 ;A1=80206B78 JAL 8021120C ;call routine A1 A0 times ADDIU A0,R0,0064 ;A0=100 times SW R0,74A4 (S0) JAL 80206B74 NOP JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP LW T0,0010 (SP) BNEL T0,R0,802076A8 SW R0,0010 (SP) BEQ S5,R0,8020725C NOP LW RA,003C (SP) LW S8,0038 (SP) LW S7,0034 (SP) LW S6,0030 (SP) LW S5,002C (SP) LW S4,0028 (SP) LW S3,0024 (SP) LW S2,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0040 802076E0 replace GS checksum and update ROM ADDIU SP,SP,FFE8 ADDU A0,R0,R0 ;A0=0 SW S0,0010 (SP) LUI S0,8025 ADDIU S0,S0,9788 ;S0=80249788: copy of header ADDU A1,S0,R0 ;A1=S0: p->target SW RA,0014 (SP) JAL 802180A8 ;copy A2 bytes from hardware A0 to A1 ADDIU A2,R0,0100 ;A2=100 //80207704: copy CRCs one byte at a time ADDU A0,R0,R0 ;A0=0 init. count LUI A1,8022 //8020770C: replace checksum LW V0,74C4 (A1) ;V0=802274C4: p->new checksum ADDU V1,A0,S0 ;V1=80249788+offset: p->next byte of data ADDU V0,V0,A0 LBU V0,0000 (V0) ;V0=source+offset: byte from checksum ADDIU A0,A0,0001 ;A0++ SB V0,0010 (V1) ;V0->target+10: replace checksum one byte at a time SLTI V0,A0,0008 BNE V0,R0,8020770C ;loop 8 times NOP //80207730: upload revised header ADDU A0,R0,R0 ;A0=0 LUI A1,8025 ADDIU A1,A1,9788 ;S0=80249788: copy of header JAL 80217F04 ;write A2 bytes from A1 to hardware A0 ADDIU A2,R0,0100 ;A2=100 //80207744: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80207754 ADDIU SP,SP,FFD0 SW S1,0014 (SP) ADDU S1,R0,R0 LUI A0,8000 ;A0=A button LUI A1,8020 ADDIU A1,A1,6B74 ;A1=80206B74 LUI V0,8022 ADDIU V1,R0,0001 SW S0,0010 (SP) LUI S0,8022 SW RA,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S4,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW V1,74B0 (V0) JAL 80211130 ;use handler A1 if buttons A0 pressed SW V1,74B4 (S0) LUI S4,0200 ORI S4,S4,0004 ;S4=02000004: + left, stick left ADDIU S2,R0,0001 LUI S3,0100 ORI S3,S3,0008 ;S3=01000008: + right, stick right LUI S6,4000 ;S6=B button LUI S5,8000 ;S5=A button JAL 80210D30 ;V0=button and stick pos for controller 1 NOP ADDU V1,V0,R0 ;V1=V0: button/stick AND V0,V1,S4 ;V0=nonzero if left pressed BEQ V0,R0,802077E4 AND V0,V1,S3 ;V0=nonzero if right pressed LW V0,74B4 (S0) BEQL V0,S2,802077E0 SW R0,74B4 (S0) AND V0,V1,S3 ;V0=nonzero if right pressed BEQ V0,R0,802077FC AND V0,V1,S6 ;V0=nonzero if B pressed LW V0,74B4 (S0) BEQL V0,R0,802077F8 SW S2,74B4 (S0) AND V0,V1,S6 ;V0=nonzero if B pressed BEQ V0,R0,8020780C AND V0,V1,S5 ;V0=nonzero if A pressed SW S2,74B4 (S0) ADDIU S1,R0,0002 BNEL V0,R0,80207814 ADDIU S1,R0,0001 JAL 80206B74 NOP JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BEQ S1,R0,802077BC LUI A0,8000 ;A0=A button LUI S0,8020 ADDIU S0,S0,6B74 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=80206B74 LUI A0,4000 ;A0=B button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=80206B74 ADDU V0,S1,R0 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8020787C determine #keycode entries LUI V0,8022 LW A1,74C8 (V0) ;A1=802274C8: p->keycode list LUI V0,8022 ADDU A2,V0,R0 SW R0,74C0 (A2) ;0->802274C0: #keycode entries //80207890: LW V0,0000 (A1) ;V0=keycodes+0: CRC LW V1,0004 (A1) ;V1=keycodes+4: ~CRC LW A0,0008 (A1) ;A0=keycodes+8: boot address ADDU V0,V0,V1 ADDU V0,V0,A0 ;V0+=A0+V1: nonzero if set BEQ V0,R0,802078BC ;quit at last, NULL entry ADDIU A1,A1,002C ;A1+=2C //802078AC: increment and loop LW V0,74C0 (A2) ;V0=802274C0: count ADDIU V0,V0,0001 ;V0++ J 80207890 SW V0,74C0 (A2) ;update 802274C0 //802078BC: JR RA NOP 802078C4: just filler from previous build ;SW V0,7CE0 (S1) ;LW S1,0014 (SP) ;XOR S0,S0,V1 802078D0: detects and sets parallel port hardware address and bank returns: V0=FALSE if ROM > 96Mb or strange debug ROM ADDIU SP,SP,FFE0 LUI A0,B200 ;A0=B2000000: N64 ROM SW S1,0014 (SP) LUI S1,8022 LUI V0,0060 SW RA,0018 (SP) SW S0,0010 (SP) JAL 80217CD0 ;set hardware addy -> A0; save 02 to cur.addy SW V0,7D30 (S1) ;600000->80227D30: hardware bank LUI S0,B2C0 LW S0,0000 (S0) ;S0=B2C00000: if N64 cart < 96Mb, GS ROM JAL 80217CD0 ;set hardware addy -> A0; save 0E to cur.addy LUI A0,BE00 ;A0=BE000000: GScart LUI V1,8037 ORI V1,V1,1240 ;V1=80371240 LW RA,0018 (SP) LUI V0,0040 SW V0,7D30 (S1) ;400000->80227D30: hardware bank LW S1,0014 (SP) XOR S0,S0,V1 ;S0=nonzero if the two don't match SLTIU V0,S0,0001 ;V0=FALSE if either strange debug ROM or ROM size larger than 96Mb LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80207930 generate checksum A1,A2 for data at A0 accepts: A0=p->data, A1=@CRC1, A2=@CRC2 ADDIU SP,SP,FFF8 SW S0,0000 (SP) ADDU T8,A0,R0 ;T8=A0: p->data ADDU S0,A1,R0 ;S0=A1: p->CRC1.out ADDIU T9,R0,0020 ;T9=20 LUI T0,F8CA ORI T0,T0,4DDC ;T0=F8CA4DDC LUI T6,F8CA ORI T6,T6,4DDC ;T6=F8CA4DDC LUI T5,F8CA ORI T5,T5,4DDC ;T5=F8CA4DDC LUI T3,F8CA ORI T3,T3,4DDC ;T3=F8CA4DDC LUI T1,F8CA ORI T1,T1,4DDC ;T1=F8CA4DDC LUI T4,F8CA ORI T4,T4,4DDC ;T4=F8CA4DDC ADDU T2,R0,R0 ;T2=0 init. count LUI T7,000F ORI T7,T7,FFFF ;T7=FFFFF: mask for address offset? //80207980: ADDU A1,T2,T8 ;A1=dram+offset: p->source LBU V0,1000 (A1) ;V0=source+1000 LBU V1,1001 (A1) ;V1=source+1001 LBU A0,1002 (A1) ;A0=source+1002 SLL V0,V0,0x18 SLL V1,V1,0x10 OR V0,V0,V1 SLL A0,A0,0x8 LBU V1,1003 (A1) ;V1=source+1003 OR V0,V0,A0 OR A0,V0,V1 ;A0=byteswapped word read from source+1000 ADDU V1,T0,A0 SLTU A1,V1,T0 ;A1=TRUE if sum < org BEQ A1,R0,802079C0 ADDU T0,V1,R0 ;T0+=word ADDIU T6,T6,0001 ;T6++ //802079C0: ANDI V1,A0,001F SUBU V0,T9,V1 ;V0=0x20-V1: ANDI V0,V0,001F ;V0&=1F: SRLV A3,A0,V0 SLLV V0,A0,V1 SLTU A1,T1,A0 XOR T5,T5,A0 OR V0,V0,A3 BEQ A1,R0,802079EC ADDU T3,T3,V0 XOR V0,T0,A0 //802079EC: XOR T1,T1,V0 XOR V0,A0,T3 ADDU T4,T4,V0 ADDIU T2,T2,0004 SLTU V0,T7,T2 BEQ V0,R0,80207984 ADDU A1,T2,T8 //80207A08: return XOR V0,T0,T6 XOR T0,V0,T5 XOR A3,T3,T1 XOR T3,A3,T4 SW T0,0000 (S0) SW T3,0000 (A2) ;T3->A2+0: CRC2.out LW S0,0000 (SP) JR RA ADDIU SP,SP,0008 80207A2C: V0=TRUE if A0+10=A1 and A0+14=A2 accepts: A0=p->header, A1=CRC1, A2=CRC2 LW V0,0010 (A0) BNE V0,A1,80207A48 ;if A0+10 isn't A1, return FALSE ADDU V0,R0,R0 LW V1,0014 (A0) BEQ V1,A2,80207A48 ;if A0+14=A2, return TRUE ADDIU V0,R0,0001 ADDU V0,R0,R0 ;return FALSE //80207A48: JR RA NOP 80207A50 ADDIU SP,SP,FFD8 ADDU A0,R0,R0 ;A0=0: blank video buffer SW RA,0020 (SP) SW S1,001C (SP) JAL 80214EB8 ;fill entire video buffer with value A0 SW S0,0018 (SP) JAL 802078D0 ;detect and set hardware addresses for GS port access NOP BEQ V0,R0,80208138 ;return if large or odd N64 ROM NOP //80207A78: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM LUI S0,8025 LUI V1,07C0 ORI V1,V1,07C0 ;V1=07C007C0: green LUI V0,8022 LW A0,772C (V0) ;A0=8022772C: p->"GameShark Pro Version 3.30" JAL 80215224 ;printf(A0) SW V1,9778 (S0) ;07C007C0->80229778: font colour LUI A0,8022 JAL 80215224 ;printf(A0) ADDIU A0,A0,26B0 ;A0=802226B0: "\n\nINTERACT\n\n" LUI V0,FFFE ORI V0,V0,FFFE ;V0=FFFEFFFE LUI A0,8022 ADDIU A0,A0,26C0 ;A0=802226C0: "ROM Flasher v2.0\n" JAL 80215224 ;printf(A0) SW V0,9778 (S0) ;FFFEFFFE->80229778: font colour LUI A0,8022 JAL 80215224 ;printf(A0) ADDIU A0,A0,26D4 ;A0=802226D4: "Scousers 1999\n\n\n" LUI V0,7BDE ORI V0,V0,7BDE ;V0=7BDE7BDE: grey 50% LUI A0,8022 ADDIU A0,A0,26E8 ;A0=802226E8: "N64 cart check..." JAL 80215224 ;printf(A0) SW V0,9778 (S0) ;7BDE7BDE->80229778: font colour JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80214F38 ;set VI buffer at next scan, then swap video buffers NOP LUI V0,8025 LW A0,91D8 (V0) LUI V0,8025 LW V1,B2A4 (V0) OR V0,V1,A0 ANDI V0,V0,0003 BEQ V0,R0,80207B6C LUI V0,0004 ORI V0,V0,B000 ;V0=4B000 ADDU V0,V1,V0 //80207B18: LWL A3,0000 (V1) LWR A3,0003 (V1) LWL T0,0004 (V1) LWR T0,0007 (V1) LWL T1,0008 (V1) LWR T1,000B (V1) LWL T2,000C (V1) LWR T2,000F (V1) SWL A3,0000 (A0) SWR A3,0003 (A0) SWL T0,0004 (A0) SWR T0,0007 (A0) SWL T1,0008 (A0) SWR T1,000B (A0) SWL T2,000C (A0) SWR T2,000F (A0) ADDIU V1,V1,0010 BNE V1,V0,80207B18 ADDIU A0,A0,0010 J 80207BA0 NOP //80207B6C: ORI V0,V0,B000 ADDU V0,V1,V0 //80207B74: LW A3,0000 (V1) LW T0,0004 (V1) LW T1,0008 (V1) LW T2,000C (V1) SW A3,0000 (A0) SW T0,0004 (A0) SW T1,0008 (A0) SW T2,000C (A0) ADDIU V1,V1,0010 BNE V1,V0,80207B74 ADDIU A0,A0,0010 //80207BA0: copy from cart ROM and compute checksum JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP LUI A0,8000 ;A0=80000000 target LUI A1,B000 ;A1=B0000000 N64 ROM LUI A2,0010 JAL 80217D3C ;copy A2 bytes from A1 to A0 ORI A2,A2,1000 ;A2=101000 //80207BBC: compute checksum for 1MB, starting at 1000 LUI A0,8000 ;A0=80000000: copy of first MB of cart ROM ADDIU A1,SP,0010 ;A1=SP+10: &CRC1 JAL 80207930 ;generate checksum A1,A2 for data at A0 ADDIU A2,SP,0014 ;A2=SP+14: &CRC2 //80207BCC: verify proper checksum LUI A0,8000 LW A1,0010 (SP) ;A1=SP+10: CRC1 LW A2,0014 (SP) ;A2=SP+14: CRC2 JAL 80207A2C ;TRUE if A0+10=A1 and A0+14=A2 ADDU S1,A0,R0 ;S1=A0: 80000000 BEQ V0,R0,80208020 ;branch on checksum mismatch //80207BE4: handle matching checksums LUI V0,07C0 ORI V0,V0,07C0 ;V0=07C007C0: green LUI A0,8022 ADDIU A0,A0,26FC ;A0=802226FC: "PASS\n" LUI S0,8025 JAL 80215224 ;printf(A0) SW V0,9778 (S0) ;07C007C0->80249778: font colour JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP LUI V0,7BDE ORI V0,V0,7BDE ;V0=7BDE7BDE: grey 50% LUI A0,8022 ADDIU A0,A0,2704 ;A0=80222704: "Flash program...." JAL 80215224 ;printf(A0) SW V0,9778 (S0) ;7BDE7BDE->80249778: font colour JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80214F38 ;set VI buffer at next scan, then swap video buffers NOP LUI V0,8025 LW A0,91D8 (V0) ;A0=801491D8: LUI V0,8025 LW V1,B2A4 (V0) ;V1=8024B2A4: OR V0,V1,A0 ANDI V0,V0,0003 BEQ V0,R0,80207CAC LUI V0,0004 ORI V0,V0,B000 ADDU V0,V1,V0 //80207C58: LWL A3,0000 (V1) LWR A3,0003 (V1) LWL T0,0004 (V1) LWR T0,0007 (V1) LWL T1,0008 (V1) LWR T1,000B (V1) LWL T2,000C (V1) LWR T2,000F (V1) SWL A3,0000 (A0) SWR A3,0003 (A0) SWL T0,0004 (A0) SWR T0,0007 (A0) SWL T1,0008 (A0) SWR T1,000B (A0) SWL T2,000C (A0) SWR T2,000F (A0) ADDIU V1,V1,0010 BNE V1,V0,80207C58 ADDIU A0,A0,0010 J 80207CE0 NOP //80207CAC: ORI V0,V0,B000 ADDU V0,V1,V0 //80207CB4: LW A3,0000 (V1) LW T0,0004 (V1) LW T1,0008 (V1) LW T2,000C (V1) SW A3,0000 (A0) SW T0,0004 (A0) SW T1,0008 (A0) SW T2,000C (A0) ADDIU V1,V1,0010 BNE V1,V0,80207CB4 ADDIU A0,A0,0010 //80207CE0: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM LUI S0,8022 LUI A0,B200 ;A0=B2000000: N64 ROM LUI V0,0060 JAL 80217CD0 ;set hardware addy -> A0; save 02 to cur.addy SW V0,7D30 (S0) ;600000->80227D30: bank //80207CF8: copy GS ROM for checksum calculation LUI A0,8011 ;A0=80110000: p->target LUI A1,B2C0 ;A1=B2C00000: GS ROM, if cart < 96Mb LUI A2,0004 ;A2=40000 LUI V0,0040 LUI V1,8022 SW V0,7D30 (S0) ;400000->80227D30: bank LUI V0,BE00 JAL 80217D3C ;copy A2 bytes from hardware A1 to A0 SW V0,7D34 (V1) ;BE000000->80227D34: GS ROM->hardware target address bank //80207D1C: ADDU A0,R0,R0 ;A0=0 LUI A1,8011 ;A1=80110000: p->copied ROM JAL 80217F04 ;write A2 bytes from A1 to hardware A0 LUI A2,0004 ;A2=40000 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM LUI S0,8025 LUI V0,07C0 ORI V0,V0,07C0 ;V0=07C007C0: green LUI A0,8022 ADDIU A0,A0,2718 ;A0=80222718: "DONE\n" JAL 80215224 ;printf(A0) SW V0,9778 (S0) ;V0=07C007C0->80249778: font colour JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP LUI V0,7BDE ORI V0,V0,7BDE ;V0=7BDE7BDE: grey 50% LUI A0,8022 ADDIU A0,A0,2720 ;A0=80222720: "Flash verify....." JAL 80215224 ;printf(A0) SW V0,9778 (S0) ;7BDE7BDE->80249778: font colour JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80214F38 ;set VI buffer at next scan, then swap video buffers NOP LUI V0,8025 LW A0,91D8 (V0) ;A0=802491D8: p->video buffer LUI V0,8025 LW V1,B2A4 (V0) ;V1=8024B2A4: OR V0,V1,A0 ANDI V0,V0,0003 BEQ V0,R0,80207DF8 LUI V0,0004 ORI V0,V0,B000 ;V0=4B000 ADDU V0,V1,V0 //80207DA4: LWL A3,0000 (V1) LWR A3,0003 (V1) LWL T0,0004 (V1) LWR T0,0007 (V1) LWL T1,0008 (V1) LWR T1,000B (V1) LWL T2,000C (V1) LWR T2,000F (V1) SWL A3,0000 (A0) SWR A3,0003 (A0) SWL T0,0004 (A0) SWR T0,0007 (A0) SWL T1,0008 (A0) SWR T1,000B (A0) SWL T2,000C (A0) SWR T2,000F (A0) ADDIU V1,V1,0010 BNE V1,V0,80207DA4 ADDIU A0,A0,0010 J 80207E2C NOP //80207DF8: ORI V0,V0,B000 ADDU V0,V1,V0 //80207E00: LW A3,0000 (V1) LW T0,0004 (V1) LW T1,0008 (V1) LW T2,000C (V1) SW A3,0000 (A0) SW T0,0004 (A0) SW T1,0008 (A0) SW T2,000C (A0) ADDIU V1,V1,0010 BNE V1,V0,80207E00 ADDIU A0,A0,0010 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP ADDU A0,R0,R0 ;A0=0 LUI A1,8011 ;A1=80110000: p->copied ROM JAL 80218024 ;V0=0 if A2 bytes at hardware A0 and dram A1 match or -1 if failed LUI A2,0004 ;A2=40000 BEQ V0,R0,80207F34 LUI V1,F800 ORI V1,V1,F800 ;V1=F800F800: red LUI A0,8022 ADDIU A0,A0,2734 ;A0=80222734: "FAIL\n" LUI V0,8025 JAL 80215224 ;printf(A0) SW V1,9778 (V0) ;F800F800->80249778: font colour JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80214F38 ;set VI buffer at next scan, then swap video buffers NOP LUI V0,8025 LW A0,91D8 (V0) LUI V0,8025 LW V1,B2A4 (V0) OR V0,V1,A0 ANDI V0,V0,0003 BEQ V0,R0,80207EF0 LUI V0,0004 ORI V0,V0,B000 ADDU V0,V1,V0 //80207E9C: LWL A3,0000 (V1) LWR A3,0003 (V1) LWL T0,0004 (V1) LWR T0,0007 (V1) LWL T1,0008 (V1) LWR T1,000B (V1) LWL T2,000C (V1) LWR T2,000F (V1) SWL A3,0000 (A0) SWR A3,0003 (A0) SWL T0,0004 (A0) SWR T0,0007 (A0) SWL T1,0008 (A0) SWR T1,000B (A0) SWL T2,000C (A0) SWR T2,000F (A0) ADDIU V1,V1,0010 BNE V1,V0,80207E9C ADDIU A0,A0,0010 J 80207F24 NOP //80207EF0: ORI V0,V0,B000 ADDU V0,V1,V0 //80207EF8: LW A3,0000 (V1) LW T0,0004 (V1) LW T1,0008 (V1) LW T2,000C (V1) SW A3,0000 (A0) SW T0,0004 (A0) SW T1,0008 (A0) SW T2,000C (A0) ADDIU V1,V1,0010 BNE V1,V0,80207EF8 ADDIU A0,A0,0010 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP //80207F2C: loop indefinately J 80207F2C NOP //80207F34: LUI V1,07C0 ORI V1,V1,07C0 ;V1=07C007C0: green LUI A0,8022 ADDIU A0,A0,26FC ;A0=802226FC: "PASS\n" LUI V0,8025 JAL 80215224 ;printf(A0) SW V1,9778 (V0) ;07C007C0->80249778: font colour JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80214F38 ;set VI buffer at next scan, then swap video buffers NOP LUI V0,8025 LW A0,91D8 (V0) LUI V0,8025 LW V1,B2A4 (V0) OR V0,V1,A0 ANDI V0,V0,0003 BEQ V0,R0,80207FDC LUI V0,0004 ORI V0,V0,B000 ADDU V0,V1,V0 //80207F88: LWL A3,0000 (V1) LWR A3,0003 (V1) LWL T0,0004 (V1) LWR T0,0007 (V1) LWL T1,0008 (V1) LWR T1,000B (V1) LWL T2,000C (V1) LWR T2,000F (V1) SWL A3,0000 (A0) SWR A3,0003 (A0) SWL T0,0004 (A0) SWR T0,0007 (A0) SWL T1,0008 (A0) SWR T1,000B (A0) SWL T2,000C (A0) SWR T2,000F (A0) ADDIU V1,V1,0010 BNE V1,V0,80207F88 ADDIU A0,A0,0010 J 80208010 NOP //80207FDC: ORI V0,V0,B000 ADDU V0,V1,V0 //80207FE4: LW A3,0000 (V1) LW T0,0004 (V1) LW T1,0008 (V1) LW T2,000C (V1) SW A3,0000 (A0) SW T0,0004 (A0) SW T1,0008 (A0) SW T2,000C (A0) ADDIU V1,V1,0010 BNE V1,V0,80207FE4 ;branch if checksums mismatch ADDIU A0,A0,0010 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP //80208018: loop indefinately J 80208018 NOP //80208020: handle checksum mismatch LUI V0,F800 ORI V0,V0,F800 ;V0=F800F800: red LUI A0,8022 ADDIU A0,A0,2734 ;A0=80222734: "FAIL\n" LUI S0,8025 JAL 80215224 ;printf(A0) SW V0,9778 (S0) ;F800F800->80249778: font colour LUI V0,7BDE ORI V0,V0,7BDE ;V0=7BDE7BDE: grey 50% //80208044: display checksums LUI A0,8022 LW A1,0010 (S1) ;A1=S1+10: actual CRC1 LW A2,0010 (SP) ;A2=SP+10: calculated CRC1 ADDIU A0,A0,273C ;A0=8022273C: "Checksums = %8x, %8x\n" JAL 80215224 ;printf(A0) SW V0,9778 (S0) ;7BDE7BDE->80249778: font colour LUI A0,8022 LW A1,0014 (S1) ;A1=S1+14: actual CRC2 LW A2,0014 (SP) ;A2=SP+14: calculated CRC2 JAL 80215224 ;printf(A0) ADDIU A0,A0,2754 ;A0=80222754: " = %8x, %8x\n" JAL 80214F38 ;set VI buffer at next scan, then swap video buffers NOP LUI V0,8025 LW A0,91D8 (V0) LUI V0,8025 LW V1,B2A4 (V0) OR V0,V1,A0 ANDI V0,V0,0003 BEQ V0,R0,802080F4 LUI V0,0004 ORI V0,V0,B000 ADDU V0,V1,V0 //802080A0: LWL A3,0000 (V1) LWR A3,0003 (V1) LWL T0,0004 (V1) LWR T0,0007 (V1) LWL T1,0008 (V1) LWR T1,000B (V1) LWL T2,000C (V1) LWR T2,000F (V1) SWL A3,0000 (A0) SWR A3,0003 (A0) SWL T0,0004 (A0) SWR T0,0007 (A0) SWL T1,0008 (A0) SWR T1,000B (A0) SWL T2,000C (A0) SWR T2,000F (A0) ADDIU V1,V1,0010 BNE V1,V0,802080A0 ADDIU A0,A0,0010 J 80208128 NOP //802080F4: ORI V0,V0,B000 ADDU V0,V1,V0 //802080FC: LW A3,0000 (V1) LW T0,0004 (V1) LW T1,0008 (V1) LW T2,000C (V1) SW A3,0000 (A0) SW T0,0004 (A0) SW T1,0008 (A0) SW T2,000C (A0) ADDIU V1,V1,0010 BNE V1,V0,802080FC ADDIU A0,A0,0010 //80208128: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP //80208130: inf.loop! J 80208130 NOP //80208138: LW RA,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0028 8020814C clear active codelist in RAM and ROM ADDIU SP,SP,FFE8 ADDIU SP,SP,FFE8 SW RA,0010 (SP) ADDIU V1,R0,007F LUI V0,8025 ADDIU V0,V0,8FD8 ;V0=80248FD8: p->active codelist ADDIU V0,V0,00FE //80208168: blank active codelist SH R0,0000 (V0) ;0->list+offset ADDIU V1,V1,FFFF BGEZ V1,80208168 ;loop for 100 bytes ADDIU V0,V0,FFFE //80208178: blank saved active codelist in ROM LUI A0,0002 ORI A0,A0,EF00 ;A0=2EF00: saved active codelist LUI A1,8025 ADDIU A1,A1,8FD8 ;A1=80248FD8: p->source JAL 80217F04 ;write A2 bytes from A1 to hardware A0 ADDIU A2,R0,0100 ;A2=size 100 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8020819C ADDIU SP,SP,FFE8 LUI V0,8025 LW V1,9110 (V0) ;V1=80249110: size of RAM LUI V0,0080 SW RA,0014 (SP) BNE V1,V0,80208228 ;branch if 8MB exp.pak not present SW S0,0010 (SP) //802081B8: read saved active codelist into memory LUI A0,0002 ORI A0,A0,EF00 ;A0=2EF00: saved active codelist LUI S0,8025 ADDIU S0,S0,8FD8 ;S0=80248FD8: p->active codelist ADDU A1,S0,R0 ;A1=S0: p->target JAL 802180A8 ;copy A2 bytes from hardware A0 to A1 ADDIU A2,R0,0100 ;A2=size 100 //802081D4: LHU A1,0002 (S0) ;A1=codelist+2: #codes ADDIU V0,A1,FFFF SLTIU V0,V0,0027 ;TRUE if #codes<40 BEQ V0,R0,80208220 ;branch if exceeded maximum codes LUI V1,8022 ADDIU V0,R0,0001 LUI A0,8022 SW V0,74EC (V1) ;1->802274EC: SLL V0,A1,0x10 LUI A1,8022 LW V1,74F4 (A1) ;V1=802274F4: SRA V0,V0,0x10 ;V0=#codes->short SLT V1,V1,V0 BEQ V1,R0,80208228 SW V0,74FC (A0) ;V0->802274FC: #codes //80208210: LUI V0,8022 SW R0,74F4 (A1) ;0->802274F4: J 80208228 SW R0,74F8 (V0) ;0->802274F8: //80208220: LUI V0,8022 SW R0,74F0 (V0) ;0->802274F0: //80208228: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80208238 ADDIU SP,SP,FFB8 LUI V0,8022 ADDIU V0,V0,29D4 LUI A3,8022 ADDIU A3,A3,29D0 SW V0,0010 (SP) LUI V0,8022 ADDIU V0,V0,29D8 SW V0,001C (SP) LUI V0,8022 ADDIU V0,V0,29DC SW V0,0028 (SP) LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table LUI V1,8022 SW RA,0040 (SP) SW A3,0018 (SP) SW A3,0024 (SP) SW A3,0030 (SP) LW A0,00BC (V0) ;A0=str+BC: 80224110 "Exit" LW A1,00C8 (V0) ;A1=str+C8: 802240DC ":Backspace" LW A2,0044 (V0) ;A2=str+44: 802242AC ":Delete" LW T0,0380 (V0) ;T0=str+380: 80223608 "Use the L and R Triggers to move left and right" ADDIU V1,V1,29E0 SW V1,0038 (SP) SW A0,0014 (SP) ADDIU A0,R0,0001 SW A1,0020 (SP) SW A2,002C (SP) SW T0,0034 (SP) LW A2,037C (V0) ;A2=str+37C: 80223638 "Use up/down/left/right and 'A' to select" JAL 80214210 ADDIU A1,R0,000D LW RA,0040 (SP) JR RA ADDIU SP,SP,0048 802082C8: LUI V0,8022 LW V0,74FC (V0) ADDIU SP,SP,FFC8 BNE V0,R0,80208330 SW RA,0030 (SP) ADDIU A0,R0,0001 ADDIU A1,R0,0007 LUI A3,8022 ADDIU A3,A3,29D0 LUI V1,8022 ADDIU V1,V1,7660 ;V1=80227660: string pointer table LUI V0,8022 LW A2,037C (V1) ;A2=str+37C: 80223638 "Use up/down/left/right and 'A' to select" ADDIU V0,V0,29D4 SW V0,0010 (SP) LUI V0,8022 SW A3,0018 (SP) LW T0,00BC (V1) ;T0=str+BC: 80224110 "Exit" LW V1,0380 (V1) ;V1=str+380: 80223608 "Use the L and R Triggers to move left and right" ADDIU V0,V0,29E0 SW V0,0020 (SP) SW T0,0014 (SP) JAL 80214210 SW V1,001C (SP) J 80208388 NOP ADDIU A0,R0,0001 ADDIU A1,R0,0009 LUI A3,8022 ADDIU A3,A3,29D0 LUI V1,8022 ADDIU V1,V1,7660 ;V1=80227660: string pointer table LUI V0,8022 LW A2,037C (V1) ;A2=str+37C: 80223638 "Use up/down/left/right and 'A' to select" ADDIU V0,V0,29D4 SW V0,0010 (SP) LUI V0,8022 SW A3,0018 (SP) SW A3,0020 (SP) LW T0,00BC (V1) ;T0=str+BC: 80224110 "Exit" LW T1,0380 (V1) ;T1=str+380: 80223608 "Use the L and R Triggers to move left and right" LW V1,03EC (V1) ;V1=str+3EC: 8022332C "Use C[80] to highlight found codes" ADDIU V0,V0,29E0 SW V0,0028 (SP) SW T0,0014 (SP) SW T1,001C (SP) JAL 80214210 SW V1,0024 (SP) LW RA,0030 (SP) JR RA ADDIU SP,SP,0038 80208394 accepts: A0= ADDIU SP,SP,FFD8 LUI V0,8022 ADDIU V0,V0,29D8 LUI V1,8022 ADDIU V1,V1,7660 ;V1=80227660: string pointer table SW V0,0010 (SP) LUI V0,8022 ADDIU V0,V0,29E0 LUI A3,8022 SW RA,0020 (SP) LW A1,0044 (V1) ;A1=str+44: 802242AC ":Delete" ADDIU A3,A3,29D0 ;A3=802229D0 SW V0,0018 (SP) ;SP+18= 802229E0: SW A1,0014 (SP) ;A1->SP+14: LW A2,037C (V1) ;A2=str+37C: 80223638 "Use up/down/left/right and 'A' to select" JAL 80214210 ADDIU A1,R0,0005 ;A1=5 LW RA,0020 (SP) JR RA ADDIU SP,SP,0028 802083E4 ADDIU SP,SP,FFC0 SW S4,0028 (SP) ADDIU S4,R0,0006 SW S8,0038 (SP) ADDIU S8,R0,0001 SW RA,003C (SP) SW S7,0034 (SP) SW S6,0030 (SP) SW S5,002C (SP) SW S3,0024 (SP) SW S2,0020 (SP) SW S1,001C (SP) SW S0,0018 (SP) SW A0,0040 (SP) SW A1,0044 (SP) ADDIU V1,R0,0001 BNE S8,V1,8020844C ADDIU S7,R0,005B SW S8,0010 (SP) ADDIU A0,R0,0094 ADDIU A1,R0,0051 ADDIU A2,R0,009C JAL 80213988 ADDIU A3,R0,004A ADDU S4,R0,R0 ADDIU S7,R0,005B ADDU S3,R0,R0 ADDU S6,S3,R0 ADDU S0,R0,R0 ADDU S5,S7,S4 ADDU S2,S6,R0 ADDIU S1,S4,009D LUI V1,8022 LW V0,74E8 (V1) ADDIU V1,R0,0001 BNE V0,V1,80208490 ADDU A0,S1,R0 LUI V1,8022 ADDIU V1,V1,27F0 BEQ S4,R0,802084A0 ADDU A2,S2,V1 J 802084CC ADDU A3,R0,R0 LUI V1,8022 ADDIU V1,V1,28E0 BNE S4,R0,802084C8 ADDU A2,S2,V1 LUI A3,7BDE LW V1,0044 (SP) BNE S3,V1,802084CC ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LW V1,0040 (SP) BNE S0,V1,802084CC NOP LUI A3,FFFE J 802084CC ORI A3,A3,FFFE ADDU A3,R0,R0 LW A2,0000 (A2) JAL 802112D0 ;handle special chars and print A2 in colour A3 to screen at {A0,A1} ADDU A1,S5,R0 ADDIU S1,S1,000C ADDIU S0,S0,0001 SLTI V0,S0,000C BNE V0,R0,80208464 ADDIU S2,S2,0004 ADDIU S7,S7,000C ADDIU S3,S3,0001 SLTI V0,S3,0005 BNE V0,R0,80208454 ADDIU S6,S6,0030 ADDIU S8,S8,0001 SLTI V0,S8,0002 BNE V0,R0,80208424 ADDIU V1,R0,0001 LW RA,003C (SP) LW S8,0038 (SP) LW S7,0034 (SP) LW S6,0030 (SP) LW S5,002C (SP) LW S4,0028 (SP) LW S3,0024 (SP) LW S2,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0040 80208540: ADDIU SP,SP,FF98 SW S3,004C (SP) ADDIU S3,R0,0006 SW S7,005C (SP) ADDIU S7,R0,0001 SW S8,0060 (SP) LUI S8,8022 SW RA,0064 (SP) SW S6,0058 (SP) SW S5,0054 (SP) SW S4,0050 (SP) SW S2,0048 (SP) SW S1,0044 (SP) SW S0,0040 (SP) SW A0,0068 (SP) SW A1,006C (SP) SW A2,0070 (SP) ADDIU V0,R0,0001 BNE S7,V0,802085B0 ADDIU A0,R0,0094 ADDIU A1,R0,0051 ADDIU A2,R0,003E ADDU A3,A2,R0 LW V0,74F0 (S8) ADDU S3,R0,R0 SLTIU V0,V0,0001 JAL 80213988 SW V0,0010 (SP) LW T0,0070 (SP) BEQ T0,R0,80208658 ADDIU S5,R0,005B ADDU S1,R0,R0 ADDIU S4,R0,009D ADDU S0,R0,R0 ADDU S6,S5,S3 SLL S2,S1,0x4 ADDU A0,S4,S3 LUI T0,8022 ADDIU T0,T0,2780 BNE S3,R0,80208618 ADDU A2,S2,T0 LUI A3,7BDE LW T0,006C (SP) BNE S1,T0,8020861C ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LW T0,0068 (SP) BNE S0,T0,80208620 ADDU A1,S6,R0 LW V0,74F0 (S8) BNE V0,R0,80208620 NOP LUI A3,FFFE J 80208620 ORI A3,A3,FFFE ADDU A3,R0,R0 ADDU A1,S6,R0 LW A2,0000 (A2) ADDIU S4,S4,000C ADDIU S2,S2,0004 JAL 802112D0 ;handle special chars and print A2 in colour A3 to screen at {A0,A1} ADDIU S0,S0,0001 SLTI V0,S0,0004 BNE V0,R0,802085D4 ADDU A0,S4,S3 ADDIU S1,S1,0001 SLTI V0,S1,0004 BNE V0,R0,802085C0 ADDIU S5,S5,000C J 802086F0 ADDIU S7,S7,0001 ADDU S1,R0,R0 ADDIU S4,R0,009D ADDU S0,R0,R0 ADDU S6,S5,S3 SLL S2,S1,0x4 ADDU A0,S4,S3 LUI T0,8022 ADDIU T0,T0,27C0 BNE S3,R0,802086B4 ADDU A2,S2,T0 LUI A3,7BDE LW T0,006C (SP) BNE S1,T0,802086B8 ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LW T0,0068 (SP) BNE S0,T0,802086BC ADDU A1,S6,R0 LW V0,74F0 (S8) BNE V0,R0,802086BC NOP LUI A3,FFFE J 802086BC ORI A3,A3,FFFE ADDU A3,R0,R0 ADDU A1,S6,R0 LW A2,0000 (A2) ADDIU S4,S4,000C ADDIU S2,S2,0004 JAL 802112D0 ;handle special chars and print A2 in colour A3 to screen at {A0,A1} ADDIU S0,S0,0001 SLTI V0,S0,0004 BNE V0,R0,80208670 ADDU A0,S4,S3 ADDIU S1,S1,0001 SLTI V0,S1,0003 BNE V0,R0,8020865C ADDIU S5,S5,000C ADDIU S7,S7,0001 SLTI V0,S7,0002 BNE V0,R0,80208588 ADDIU V0,R0,0001 LUI V0,8022 LW V0,74FC (V0) BEQ V0,R0,802088BC ADDIU A0,R0,0094 ADDIU A1,R0,0092 ADDIU A2,R0,009B ADDIU A3,R0,003A ADDIU S4,R0,009D ADDIU S5,R0,009C ADDIU T0,SP,002C LUI V0,8022 LW V0,74F0 (V0) ADDU S8,R0,R0 SW T0,0038 (SP) ADDIU T0,SP,0028 SW T0,003C (SP) XORI V0,V0,0001 SLTIU V0,V0,0001 JAL 80213988 SW V0,0010 (SP) LUI V0,8022 LW S0,74F8 (V0) LUI V0,8025 ADDIU S7,V0,8FD8 SLL V1,S0,0x1 ADDU V1,V1,S0 SLL V0,V1,0x1 ADDIU S6,V0,0008 ADDIU S3,V0,0006 ADDIU S2,V0,0004 ADDU S1,V1,R0 LUI V0,8022 LW V0,74FC (V0) SLT V0,S0,V0 BEQL V0,R0,802088B0 ADDIU S8,S8,0001 ADDIU A1,SP,0018 ADDU V0,S2,S7 ADDU V1,S3,S7 LHU A0,0000 (V0) LHU V0,0000 (V1) SLL A0,A0,0x10 JAL 8020B808 OR A0,A0,V0 LUI T0,8022 LW V0,74E0 (T0) BEQ V0,R0,802087E4 ADDU V0,S6,S7 LH A0,0000 (V0) JAL 8020B808 ADDIU A1,SP,0028 ADDIU A0,SP,0018 LUI T0,8022 JAL 802110C4 ;strcat(A0,A1) ADDIU A1,T0,29E4 LW A1,0038 (SP) J 80208814 NOP ADDIU V0,S1,0004 SLL V0,V0,0x1 ADDU V0,V0,S7 LH A0,0000 (V0) LW A1,003C (SP) JAL 8020B844 ADDIU A2,R0,0005 ADDIU A0,SP,0018 LUI T0,8022 JAL 802110C4 ;strcat(A0,A1) ADDIU A1,T0,29E4 LW A1,003C (SP) JAL 802110C4 ;strcat(A0,A1) ADDIU A0,SP,0018 LUI V0,8022 LW V1,74F0 (V0) ADDIU V0,R0,0001 BNE V1,V0,80208860 LUI T0,8022 LUI V0,8022 LUI V1,8022 LW V0,74F4 (V0) LW V1,74F8 (V1) ADDU V0,V0,V1 BNE V0,S0,80208860 ADDU A0,S4,R0 ADDU A1,S5,R0 ADDIU A2,SP,0018 LUI A3,FFFE J 80208890 ORI A3,A3,FFFE LW V0,74E0 (T0) BEQ V0,R0,80208880 ADDU A0,S4,R0 ADDU A1,S5,R0 ADDIU A2,SP,0018 LUI A3,7BDE J 80208890 ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% ADDU A1,S5,R0 ADDIU A2,SP,0018 LUI A3,05EE ORI A3,A3,05EE JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDIU S5,S5,0008 ADDIU S6,S6,0006 ADDIU S3,S3,0006 ADDIU S2,S2,0006 ADDIU S1,S1,0003 ADDIU S0,S0,0001 ADDIU S8,S8,0001 SLTI V0,S8,0005 BNE V0,R0,8020877C LUI V0,8022 LW RA,0064 (SP) LW S8,0060 (SP) LW S7,005C (SP) LW S6,0058 (SP) LW S5,0054 (SP) LW S4,0050 (SP) LW S3,004C (SP) LW S2,0048 (SP) LW S1,0044 (SP) LW S0,0040 (SP) JR RA ADDIU SP,SP,0068 802088EC: ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80208540 ADDIU A2,R0,0001 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80208908: ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80208540 ADDU A2,R0,R0 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80208924: ADDIU SP,SP,FFD8 LUI A0,8000 SW RA,0020 (SP) SW S1,001C (SP) JAL 80210F5C SW S0,0018 (SP) JAL 802061C0 ADDIU A0,R0,0001 LUI V0,0028 ORI V0,V0,0028 ADDIU A0,R0,0046 ADDIU A1,R0,00B1 ADDIU A2,R0,00B3 ADDIU A3,R0,0021 JAL 8021126C SW V0,0010 (SP) LUI V0,FFFE ORI V0,V0,FFFE ADDIU A0,R0,0046 ADDIU A1,R0,00B0 ADDIU A2,R0,00B3 ADDIU A3,R0,0021 JAL 8021149C SW V0,0010 (SP) ADDIU A0,R0,00B4 LUI A2,FFFE ORI A2,A2,FFFE LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A1,0110 (S0) ;A1=str+110: 80223FE0 "Out Of Space!" JAL 80210EF4 ;print A1 centered on line A0 in colour A2 LUI S1,8000 ADDIU A0,R0,00C8 LUI A2,FFFE LW A1,0284 (S0) ;A1=str+284: 80223AB0 "Press 'B'" JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP //802089C0: loop until A pressed JAL 80210D30 ;V0=button and stick pos for controller 1 NOP BNE V0,S1,802089C0 ;loop until A pressed NOP JAL 80210F5C LUI A0,8000 ;A0=A button //802089D8: return LW RA,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0028 802089EC: ADDIU SP,SP,FEF0 SW S5,00FC (SP) ADDU S5,R0,R0 SW S1,00EC (SP) ADDIU S1,R0,0001 SW S6,0100 (SP) ADDU S6,S5,R0 SW S4,00F8 (SP) ADDU S4,S5,R0 SW S2,00F0 (SP) ADDU S2,S5,R0 SW A0,0110 (SP) ADDIU A0,R0,0003 ADDIU A1,R0,00BC ADDIU A2,SP,0020 SW S8,0108 (SP) ADDIU S8,R0,009E SW S3,00F4 (SP) LUI S3,8025 SW S7,0104 (SP) ADDU S7,S1,R0 LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table SW RA,010C (SP) SW S0,00E8 (SP) LW A3,009C (V0) ;A3=str+9C: 8022416C "Delete! Are You Sure?" LW V1,00A0 (V0) ;V1=str+A0: 80224164 "Delete" LW T0,00A4 (V0) ;T0=str+A4: 80222FE8 "Use Left/Right to select." LUI V0,8022 SW S1,74D0 (V0) SW V1,0010 (SP) JAL 802137A4 SW T0,0014 (SP) JAL 80210D30 ;V0=button and stick pos for controller 1 NOP JAL 80210D4C ;V0=button and stick pos NOP LUI V1,0800 ORI V1,V1,0002 ;V1=08000002: + up, stick up ADDU S0,V0,R0 ;S0=V0: button/stick AND V1,S0,V1 ;V1=nonzero if up pressed BEQ V1,R0,80208AC4 LUI V0,0400 BNEL S1,R0,80208AB4 SW R0,90F8 (S3) LW V0,90F8 (S3) BEQL V0,R0,80208AC0 SW S7,90F8 (S3) J 80208AC4 LUI V0,0400 JAL 802061C0 ADDU A0,R0,R0 ADDU S1,R0,R0 LUI V0,0400 ORI V0,V0,0001 ;V0=04000001: + down, stick down AND V0,S0,V0 ;V0=nonzero if down pressed BEQ V0,R0,80208AFC NOP BEQL S1,R0,80208AF0 SW R0,90F8 (S3) LW V0,90F8 (S3) BEQL V0,R0,80208AFC SW S7,90F8 (S3) J 80208AFC NOP JAL 802061C0 ADDU A0,R0,R0 ADDIU S1,R0,0001 BGEZ S0,80208B2C NOP BNE S1,R0,80208B14 ADDIU S2,R0,000C ADDIU S6,R0,0001 ADDU S2,S6,R0 BNE S5,R0,80208B28 ADDIU S5,R0,0001 JAL 802061C0 ADDU A0,R0,R0 ADDIU S5,R0,0001 ADDU S4,S5,R0 LW T1,0110 (SP) JALR RA,T1 ADDU A0,R0,R0 ADDIU A0,R0,003A ADDU A1,S8,R0 ADDIU A2,R0,0014 ADDIU A3,R0,0002 SW R0,0010 (SP) SW S1,0014 (SP) JAL 80212E3C SW S4,0018 (SP) ADDIU A0,R0,003A ADDU A1,S8,R0 ADDIU A2,R0,0014 ADDIU A3,R0,0002 ADDIU V0,SP,0020 SW S1,0010 (SP) SW S4,0014 (SP) JAL 80213820 SW V0,0018 (SP) JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BGTZL S2,80208B94 ADDIU S2,S2,FFFF BEQ S5,R0,80208A78 NOP BNE S2,R0,80208A78 LUI V0,8022 SW R0,74D0 (V0) ADDU V0,S6,R0 LW RA,010C (SP) LW S8,0108 (SP) LW S7,0104 (SP) LW S6,0100 (SP) LW S5,00FC (SP) LW S4,00F8 (SP) LW S3,00F4 (SP) LW S2,00F0 (SP) LW S1,00EC (SP) LW S0,00E8 (SP) JR RA ADDIU SP,SP,0110 80208BDC: LUI A1,8025 LUI A2,8025 LUI A3,8024 LUI T0,8024 LUI V0,8024 SUBU V1,R0,A0 LW V0,2C88 (V0) LW A0,9AC8 (A1) LW A1,9108 (A2) LW A2,4D74 (A3) LW A3,2C74 (T0) ADDIU SP,SP,FFE0 SW RA,0018 (SP) SW V1,0014 (SP) JAL 802090C4 SW V0,0010 (SP) LW RA,0018 (SP) JR RA ADDIU SP,SP,0020 80208C28: ADDIU SP,SP,FFE0 LUI V0,8025 SUBU V1,R0,A0 LW A0,9AC8 (V0) LUI V0,8025 LW A1,9108 (V0) LUI V0,8024 LW A2,4D74 (V0) LUI V0,8024 LW V0,2C88 (V0) ADDU A3,R0,R0 SW RA,001C (SP) SW S0,0018 (SP) SW V1,0014 (SP) JAL 802090C4 SW V0,0010 (SP) LUI V0,8025 LW A0,8F90 (V0) LUI V0,8025 LW A1,8F94 (V0) JAL 802083E4 NOP LUI A0,8022 LW V0,74DC (A0) ADDIU V1,V0,0001 SLTI V0,V1,0010 BNE V0,R0,80208CC0 SW V1,74DC (A0) ADDIU V0,R0,001E BEQL V1,V0,80208CA4 SW R0,74DC (A0) LUI V0,8025 LUI V1,8025 LW V0,91D0 (V0) LW V1,90F0 (V1) ADDU V0,V0,V1 J 80208CD8 ADDIU V1,R0,005F LUI V0,8025 LUI V1,8025 LW V0,91D0 (V0) LW V1,90F0 (V1) ADDU V0,V0,V1 ADDIU V1,R0,0020 SB V1,0000 (V0) ADDIU A0,R0,0018 ADDIU A2,R0,0112 ADDIU A3,R0,0009 LUI S0,8025 LW A1,8FA4 (S0) ADDIU V0,R0,0005 JAL 8021126C SW V0,0010 (SP) LUI A2,FFFE ORI A2,A2,FFFE LUI V0,8025 LW A0,8FA4 (S0) LW A1,91D0 (V0) ;A1=802491D0: JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ADDIU A0,A0,0001 LW RA,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0020 80208D28: ADDIU SP,SP,FF98 ADDU A3,R0,R0 LUI V0,8025 SUBU T0,R0,A0 LW A0,9AC8 (V0) LUI V0,8025 LW A1,9108 (V0) LUI V0,8024 LW A2,4D74 (V0) LUI V0,8024 LW V1,2C88 (V0) LUI V0,8022 SW RA,0064 (SP) SW S6,0060 (SP) SW S5,005C (SP) SW S4,0058 (SP) SW S3,0054 (SP) SW S2,0050 (SP) SW S1,004C (SP) SW S0,0048 (SP) ADDIU T4,V0,29E8 LW T1,0000 (T4) LW T2,0004 (T4) LW T3,0008 (T4) SW T1,0018 (SP) SW T2,001C (SP) SW T3,0020 (SP) LW T1,000C (T4) LW T2,0010 (T4) LW T3,0014 (T4) SW T1,0024 (SP) SW T2,0028 (SP) SW T3,002C (SP) LW T1,0018 (T4) LW T2,001C (T4) SW T1,0030 (SP) SW T2,0034 (SP) SW T0,0014 (SP) JAL 802090C4 SW V1,0010 (SP) LUI V0,8022 LW V0,74E0 (V0) BNE V0,R0,80208E08 LUI V0,8025 LUI V0,8024 LW V0,2C54 (V0) SLTI V0,V0,0008 BNE V0,R0,80208E08 LUI V0,8025 LW A0,8F90 (V0) LUI V0,8025 LW A1,8F94 (V0) JAL 80208908 NOP J 80208E20 LUI V0,8022 LW A0,8F90 (V0) LUI V0,8025 LW A1,8F94 (V0) JAL 802088EC NOP LUI V0,8022 LW V0,74E0 (V0) BEQ V0,R0,80208E4C ADDIU A2,R0,0068 ADDIU A3,R0,0008 LUI V0,8025 LW A0,8FA0 (V0) LUI V0,8025 LW A1,8FA4 (V0) ADDIU V0,R0,0005 J 80208E70 SW V0,0010 (SP) ADDIU A2,R0,0070 ADDIU A3,R0,0008 LUI V0,8025 LW A1,8FA4 (V0) LUI V0,8025 LW A0,8FA0 (V0) ADDIU V0,R0,0005 SW V0,0010 (SP) ADDIU A0,A0,FFFD JAL 8021126C NOP LUI V1,8022 LW V0,74DC (V1) ADDIU V0,V0,0001 SW V0,74DC (V1) SLTI V0,V0,001F BEQL V0,R0,80208E94 SW R0,74DC (V1) LUI V0,8022 LW V0,74E0 (V0) BEQ V0,R0,80208EB0 LUI V0,8025 LW S0,8FA0 (V0) J 80208EBC ADDU S1,R0,R0 LW V0,8FA0 (V0) ADDIU S0,V0,FFFD ADDU S1,R0,R0 LUI S6,8025 LUI S5,8022 LUI S3,8022 LUI V0,8025 ADDIU S4,V0,8FA4 ADDU S2,S0,R0 ADDIU S0,SP,0018 LW V0,9AE8 (S6) LW V1,0000 (S0) LW V0,0000 (V0) SRAV V0,V0,V1 ANDI V1,V0,000F SLTIU V0,V1,000A BNE V0,R0,80208EFC ORI A2,V1,0030 ADDIU A2,V1,0037 LW V0,74F0 (S5) BNEL V0,R0,80208F08 SW R0,74DC (S3) LUI A3,FFFE ORI A3,A3,FFFE ADDU A0,S2,R0 LUI V0,8024 LW V0,2C54 (V0) BNE S1,V0,80208F3C ANDI A2,A2,00FF LW V0,74DC (S3) SLTI V0,V0,0010 BNE V0,R0,80208F3C NOP LUI A3,07C0 ORI A3,A3,07C0 ;A3=07C007C0: green LW A1,0000 (S4) ADDIU S2,S2,0008 ADDIU S0,S0,0004 JAL 802112D0 ;handle special chars and print A2 in colour A3 to screen at {A0,A1} ADDIU S1,S1,0001 SLTI V0,S1,0008 BNE V0,R0,80208ED8 LUI V0,8022 LW V0,74E0 (V0) BEQ V0,R0,80209010 ADDU S1,R0,R0 LUI S6,8025 LUI V0,8025 ADDIU S5,V0,8FA4 LUI S4,8024 LUI S3,8022 LUI V0,8025 LW V1,8FA0 (V0) LUI V0,8022 ADDIU S2,V0,2770 ADDIU S0,V1,0049 LW V0,95E0 (S6) LW V1,0000 (S2) LW V0,0000 (V0) SRAV V0,V0,V1 ANDI V1,V0,000F SLTIU V0,V1,000A BNE V0,R0,80208FB4 ORI A2,V1,0030 ADDIU A2,V1,0037 LUI A3,FFFE ORI A3,A3,FFFE ADDU A0,S0,R0 LW V0,2C54 (S4) ADDIU V0,V0,FFF8 BNE S1,V0,80208FE8 ANDI A2,A2,00FF LW V0,74DC (S3) SLTI V0,V0,0010 BNE V0,R0,80208FE8 NOP LUI A3,07C0 ORI A3,A3,07C0 ;A3=07C007C0: green LW A1,0000 (S5) ADDIU S0,S0,0008 ADDIU S2,S2,0004 JAL 802112D0 ;handle special chars and print A2 in colour A3 to screen at {A0,A1} ADDIU S1,S1,0001 SLTI V0,S1,0004 BEQ V0,R0,8020909C NOP J 80208F90 NOP ADDIU A1,SP,0038 ADDIU A2,R0,0005 ADDU S2,A1,R0 LUI S5,8024 LUI S4,8022 LUI V0,8025 LUI V1,8025 LW V1,95E0 (V1) LW V0,8FA0 (V0) LW A0,0000 (V1) JAL 8020B844 ADDIU S0,V0,0043 LUI V0,8025 ADDIU S3,V0,8FA4 LUI A3,FFFE ADDU V1,S2,S1 LW V0,2C54 (S5) LBU A2,0000 (V1) ADDIU V0,V0,FFF8 BNE S1,V0,8020907C ORI A3,A3,FFFE LW V0,74DC (S4) SLTI V0,V0,0010 BNE V0,R0,80209080 ADDU A0,S0,R0 LUI A3,07C0 ORI A3,A3,07C0 ;A3=07C007C0: green ADDU A0,S0,R0 LW A1,0000 (S3) ADDIU S0,S0,0008 JAL 802112D0 ;handle special chars and print A2 in colour A3 to screen at {A0,A1} ADDIU S1,S1,0001 SLTI V0,S1,0005 BNE V0,R0,8020904C LUI A3,FFFE LW RA,0064 (SP) LW S6,0060 (SP) LW S5,005C (SP) LW S4,0058 (SP) LW S3,0054 (SP) LW S2,0050 (SP) LW S1,004C (SP) LW S0,0048 (SP) JR RA ADDIU SP,SP,0068 802090C4: ADDIU SP,SP,FED8 SW S6,0118 (SP) ADDU S6,A1,R0 SW S2,0108 (SP) ADDU S2,A3,R0 SW S1,0104 (SP) ADDU S1,R0,R0 SW RA,0124 (SP) SW S8,0120 (SP) SW S7,011C (SP) SW S5,0114 (SP) SW S4,0110 (SP) SW S3,010C (SP) SW S0,0100 (SP) SW A0,0128 (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM SW A2,0130 (SP) LW T2,013C (SP) BNE T2,R0,80209120 ADDIU A1,R0,000E JAL 80212B20 ADDIU A0,R0,0001 ADDIU A1,R0,000E LUI V0,8022 ADDIU S0,V0,7660 ;S0=80227660: string pointer table LW T3,013C (SP) LW A3,00CC (S0) ;A3=str+CC: 802240C0 "GameShark Pro Version 3.30" ADDIU A2,R0,001F SW R0,0010 (SP) JAL 80212C90 ADDIU A0,T3,000E LUI V0,8024 LW V1,2C7C (V0) ADDIU V0,R0,0001 BNE V1,V0,80209304 LUI V0,8022 LW T2,0138 (SP) BNE T2,R0,802091A4 LUI V0,8025 ADDIU A0,R0,0004 ADDIU A1,R0,00C8 LW T3,0128 (SP) ADDIU V0,R0,0021 LBU V1,0244 (T3) LW A3,0364 (S0) ;A3=str+364: 80223710 "Options" SUBU V0,V0,V1 SLL V0,V0,0x2 ADDU V0,V0,S0 LW T0,0000 (V0) ;T0=str+offset: LW V0,0088 (S0) ;V0=str+88: 802241C0 "Exit & Save" LW V1,03C0 (S0) ;V1=str+3C0: 80223468 "Exit & Discard" ADDIU A2,SP,0020 SW V0,0014 (SP) SW V1,0018 (SP) J 80209214 SW T0,0010 (SP) LW V0,9AC8 (V0) LBU V0,0000 (V0) BNE V0,R0,802091E4 ADDIU S1,R0,0004 ADDIU S1,R0,0003 ADDIU A0,R0,0004 ADDIU A1,R0,00C8 LW A3,0364 (S0) ;A3=str+364: 80223710 "Options" LW V0,0420 (S0) ;V0=str+420: 802231CC "Default Off" LW V1,03A8 (S0) ;V1=str+3A8: 80223518 "Detect Game" LW T0,03C0 (S0) ;T0=str+3C0: 80223468 "Exit & Discard" ADDIU A2,SP,0020 SW V0,0010 (SP) SW V1,0014 (SP) J 80209214 SW T0,0018 (SP) ADDIU A0,R0,0005 ADDIU A1,R0,00C8 LW A3,0364 (S0) ;A3=str+364: 80223710 "Options" LW V0,0420 (S0) ;V0=str+420: 802231CC "Default Off" LW V1,03A8 (S0) ;V1=str+3A8: 80223518 "Detect Game" LW T0,0088 (S0) ;T0=str+88: 802241C0 "Exit & Save" LW T1,03C0 (S0) ;T1=str+3C0: 80223468 "Exit & Discard" ADDIU A2,SP,0020 SW V0,0010 (SP) SW V1,0014 (SP) SW T0,0018 (SP) SW T1,001C (SP) JAL 802137A4 NOP LUI V0,8024 LW V1,2C7C (V0) ADDIU V0,R0,0001 BNE V1,V0,80209304 LUI V0,8022 ADDIU T2,R0,0096 SW T2,00E8 (SP) ADDIU S5,R0,0051 ADDIU V0,R0,FFFE BNE S6,V0,8020924C ADDIU S0,R0,FFFF ADDU S0,R0,R0 ADDIU V0,R0,FFFD BEQL S6,V0,80209258 ADDIU S0,R0,0001 ADDIU V0,R0,FFFC BEQL S6,V0,80209264 ADDIU S0,R0,0002 ADDIU V0,R0,FFFB BEQL S6,V0,80209270 ADDIU S0,R0,0003 ADDIU A3,R0,0003 LW T3,013C (SP) LW T2,0138 (SP) BEQ T2,R0,80209288 ADDIU A0,T3,0096 ADDU A3,S1,R0 ADDIU V0,S6,0005 SLTIU V0,V0,0004 SW R0,0010 (SP) BEQ V0,R0,802092A4 SW S0,0014 (SP) J 802092A8 SW S2,0018 (SP) SW R0,0018 (SP) ADDU A1,S5,R0 JAL 80212E3C ADDIU A2,R0,000E LW T3,00E8 (SP) LW T2,013C (SP) ADDU A0,T3,T2 LW T3,0138 (SP) BEQ T3,R0,802092D0 ADDIU A3,R0,0003 ADDU A3,S1,R0 ADDIU V0,S6,0005 SLTIU V0,V0,0004 BEQ V0,R0,802092E8 SW S0,0010 (SP) J 802092EC SW S2,0014 (SP) SW R0,0014 (SP) ADDIU V0,SP,0020 SW V0,0018 (SP) ADDU A1,S5,R0 JAL 80213820 ADDIU A2,R0,000E LUI V0,8022 LUI A1,8022 LW T2,013C (SP) LW V1,7510 (A1) SUBU A0,R0,T2 ADDIU V1,V1,0001 SW V1,7510 (A1) SLTI V1,V1,0008 BNE V1,R0,8020932C SW A0,7650 (V0) SW R0,7510 (A1) LW T3,0138 (SP) ADDIU V0,R0,0002 BNE T3,V0,80209364 ADDIU S2,R0,0006 ADDIU A0,R0,0010 ADDIU A1,R0,003E LUI V0,8022 LW T2,013C (SP) LW A3,79C0 (V0) ADDIU A2,R0,000B SW R0,0010 (SP) JAL 80212C90 SUBU A0,A0,T2 ADDIU S2,R0,0006 ADDIU T3,R0,0001 LW T2,013C (SP) ADDIU V0,R0,0010 SW T3,00EC (SP) LW T3,0128 (SP) SUBU V0,V0,T2 ADDIU T3,T3,0020 SW V0,00F0 (SP) SW T3,00F4 (SP) LW T2,00EC (SP) ADDIU V0,R0,0001 BNE T2,V0,80209468 ADDIU S5,R0,0059 NOR V0,R0,S6 SLTIU V0,V0,0001 ADDIU A1,R0,0022 ADDIU A2,R0,0120 LW A0,00F0 (SP) ADDIU A3,R0,0012 JAL 80213988 SW V0,0010 (SP) LW T3,0138 (SP) BNE T3,R0,802093DC SLTIU V0,S6,0001 ADDIU A1,R0,0038 ADDIU A2,R0,0120 LW A0,00F0 (SP) ADDIU A3,R0,0012 JAL 80213988 SW V0,0010 (SP) LW T2,0138 (SP) LW T3,00EC (SP) BEQ T2,T3,80209408 SLT V0,R0,S6 ADDIU A1,R0,0051 ADDIU A2,R0,0080 LW T2,013C (SP) ADDIU A3,R0,007B SW V0,0010 (SP) JAL 80213988 ADDIU A0,T2,0010 ADDU S2,R0,R0 LUI A2,FFFE ADDIU T3,R0,FFFF BEQ S6,T3,80209424 ORI A2,A2,FFFE LUI A2,7BDE ORI A2,A2,7BDE ;A2=7BDE7BDE: grey 50% ADDIU A0,R0,0028 LW A1,0128 (SP) JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 LW T2,0138 (SP) BNE T2,R0,80209468 ADDIU S5,R0,0059 LUI A2,FFFE BEQ S6,R0,80209454 ORI A2,A2,FFFE LUI A2,7BDE ORI A2,A2,7BDE ;A2=7BDE7BDE: grey 50% ADDIU A0,R0,003E LW A1,00F4 (SP) JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 ADDIU S5,R0,0059 ADDIU T3,R0,001C LW T2,0138 (SP) ADDIU V0,R0,0001 BEQ T2,V0,80209788 SW T3,00E8 (SP) LUI V0,8022 LW T3,0128 (SP) LW A0,0240 (T3) LW V1,7650 (V0) BLEZ A0,802095FC ADDU S0,R0,R0 ADDIU V0,S2,001C ADDIU S4,R0,0001 ADDU S1,S2,S5 LW T2,013C (SP) LW S3,0130 (SP) ADDU S8,V0,T2 ADDIU T3,S8,FFFD ADDIU V0,S2,0065 ADDU S7,V0,T2 ADDIU T2,S7,FFFA SW T3,00F8 (SP) SW T2,00FC (SP) SLTI V0,S0,000C BEQ V0,R0,802095FC LUI T3,8022 LW V0,74E0 (T3) BEQ V0,R0,80209514 ADDU A1,S1,R0 LW T2,0128 (SP) SLL V0,S3,0x3 BNE S2,R0,80209504 ADDU V0,T2,V0 LUI A3,7BDE BNE S4,S6,80209508 ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LUI A3,FFFE J 80209508 ORI A3,A3,FFFE ADDU A3,R0,R0 LW A2,0040 (V0) J 80209548 ADDU A0,S8,R0 LW T3,0128 (SP) SLL V0,S3,0x3 BNE S2,R0,8020953C ADDU V0,T3,V0 LUI A3,7BDE BNE S4,S6,80209540 ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LUI A3,FFFE J 80209540 ORI A3,A3,FFFE ADDU A3,R0,R0 LW A0,00F8 (SP) LW A2,0040 (V0) JAL 8021143C ;print word A2 as hex centered on line in colour A3 at {A0,A1} NOP LUI T2,8022 LW V0,74E0 (T2) BEQ V0,R0,802095A0 ADDU A1,S1,R0 LW T3,0128 (SP) SLL V0,S3,0x3 BNE S2,R0,80209588 ADDU V0,T3,V0 LUI A3,7BDE BNE S4,S6,8020958C ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LUI A3,FFFE J 8020958C ORI A3,A3,FFFE ADDU A3,R0,R0 LW A2,0044 (V0) JAL 802113D8 ;print short A2 as hex centered on line in colour A3 at {A0,A1} ADDU A0,S7,R0 J 802095DC ADDIU S1,S1,0008 LW T2,0128 (SP) SLL V0,S3,0x3 BNE S2,R0,802095C8 ADDU V0,T2,V0 LUI A3,7BDE BNE S4,S6,802095CC ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LUI A3,FFFE J 802095CC ORI A3,A3,FFFE ADDU A3,R0,R0 LW A0,00FC (SP) LW A2,0044 (V0) JAL 8020B8B8 ADDIU S1,S1,0008 ADDIU S5,S5,0008 ADDIU S4,S4,0001 LW T3,0128 (SP) LW V0,0240 (T3) ADDIU S0,S0,0001 SLT V0,S0,V0 BNE V0,R0,802094C4 ADDIU S3,S3,0001 LW T2,0128 (SP) LW T3,0130 (SP) LW A0,0240 (T2) ADDU V1,S6,T3 ADDIU V0,A0,0001 BNE V1,V0,80209650 ADDU A3,R0,R0 ADDU A1,S5,S2 LW T2,00E8 (SP) LW T3,013C (SP) ADDU V0,T2,S2 BNE S2,R0,80209638 ADDU A0,V0,T3 LUI A3,FFFE ORI A3,A3,FFFE LUI A2,8022 ADDIU A2,A2,2A08 JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDIU S5,S5,0008 J 8020970C ADDIU S0,S0,0001 LW T2,0130 (SP) ADDU V1,T2,S0 SLT V0,V1,A0 BEQ V0,R0,8020970C ADDU A1,S5,S2 LW T3,00E8 (SP) ADDU V0,T3,S2 LW T2,013C (SP) LW T3,0128 (SP) ADDU A0,V0,T2 SLL V0,V1,0x3 BNE S2,R0,802096A0 ADDU V1,T3,V0 LUI A3,7BDE ADDIU V0,S0,0001 BNE V0,S6,802096A4 ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LUI A3,FFFE J 802096A4 ORI A3,A3,FFFE ADDU A3,R0,R0 LW A2,0040 (V1) JAL 8021143C ;print word A2 as hex centered on line in colour A3 at {A0,A1} NOP ADDIU T2,R0,0065 ADDU V0,T2,S2 ADDU A1,S5,S2 LW T3,013C (SP) LW T2,0130 (SP) ADDU A0,V0,T3 ADDU V0,T2,S0 LW T3,0128 (SP) SLL V0,V0,0x3 BNE S2,R0,802096F8 ADDU V1,T3,V0 LUI A3,7BDE ADDIU V0,S0,0001 BNE V0,S6,802096FC ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% LUI A3,FFFE J 802096FC ORI A3,A3,FFFE ADDU A3,R0,R0 LW A2,0044 (V1) ADDIU S5,S5,0008 JAL 802113D8 ;print short A2 as hex centered on line in colour A3 at {A0,A1} ADDIU S0,S0,0001 ADDU S1,S0,R0 SLTI V0,S1,000D BEQ V0,R0,80209788 NOP LW T2,00E8 (SP) ADDU V0,T2,S2 LW T3,013C (SP) ADDU S0,S5,S2 ADDU S3,V0,T3 LUI T2,8022 LW V0,74E0 (T2) BEQ V0,R0,80209754 NOP BNE S2,R0,80209764 ADDU A3,R0,R0 LUI A3,7BDE J 80209764 ORI A3,A3,7BDE ;A3=7BDE7BDE: grey 50% BNE S2,R0,80209764 ADDU A3,R0,R0 LUI A3,05EE ORI A3,A3,05EE ADDU A0,S3,R0 LUI A2,8022 ADDIU A2,A2,2A08 JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDU A1,S0,R0 ADDIU S1,S1,0001 SLTI V0,S1,000D BNE V0,R0,80209730 ADDIU S0,S0,0008 LW T3,00EC (SP) ADDIU T3,T3,0001 SLTI V0,T3,0002 BNE V0,R0,80209388 SW T3,00EC (SP) LW T2,013C (SP) LUI V0,8022 SW R0,7650 (V0) JAL 8021433C SLTU A0,R0,T2 LW RA,0124 (SP) LW S8,0120 (SP) LW S7,011C (SP) LW S6,0118 (SP) LW S5,0114 (SP) LW S4,0110 (SP) LW S3,010C (SP) LW S2,0108 (SP) LW S1,0104 (SP) LW S0,0100 (SP) JR RA ADDIU SP,SP,0128 802097E0 ADDIU SP,SP,FF60 SW S0,0078 (SP) ADDU S0,A1,R0 ADDIU T0,R0,0001 SW S4,0088 (SP) LUI V0,8022 SW RA,009C (SP) SW S8,0098 (SP) SW S7,0094 (SP) SW S6,0090 (SP) SW S5,008C (SP) SW S3,0084 (SP) SW S2,0080 (SP) SW S1,007C (SP) SW A0,00A0 (SP) SW A2,00A8 (SP) SW A3,00AC (SP) SW T0,0070 (SP) SW R0,0074 (SP) ADDIU T0,V0,29E8 LW T1,0000 (T0) LW T2,0004 (T0) LW T3,0008 (T0) SW T1,0010 (SP) SW T2,0014 (SP) SW T3,0018 (SP) LW T1,000C (T0) LW T2,0010 (T0) LW T3,0014 (T0) SW T1,001C (SP) SW T2,0020 (SP) SW T3,0024 (SP) LW T1,0018 (T0) LW T2,001C (T0) SW T1,0028 (SP) SW T2,002C (SP) LUI V0,8022 ADDIU T0,V0,2A18 LW T1,0000 (T0) LW T2,0004 (T0) LW T3,0008 (T0) SW T1,0030 (SP) SW T2,0034 (SP) SW T3,0038 (SP) LW T1,000C (T0) LW T2,0010 (T0) LW T3,0014 (T0) SW T1,003C (SP) SW T2,0040 (SP) SW T3,0044 (SP) LW T1,0018 (T0) LW T2,001C (T0) SW T1,0048 (SP) SW T2,004C (SP) LUI V0,8022 ADDIU T0,V0,2A38 LW T1,0000 (T0) LW T2,0004 (T0) LW T3,0008 (T0) SW T1,0050 (SP) SW T2,0054 (SP) SW T3,0058 (SP) LW T1,000C (T0) SW T1,005C (SP) JAL 8020819C ADDU S4,R0,R0 JAL 802082C8 LUI S3,8025 LUI S1,8025 LUI V0,8025 LW T1,00A0 (SP) LW T2,00AC (SP) LW T3,00A8 (SP) LUI S2,8025 SW S0,95E0 (S2) LUI S0,8024 SW R0,8F90 (S3) SW R0,8F94 (S1) SW R0,2C54 (S0) SW T1,9AE8 (V0) LUI V0,8025 SW T2,8FA4 (V0) LUI V0,8025 JAL 80210D30 ;V0=button and stick pos for controller 1 SW T3,8FA0 (V0) LUI A0,8000 ;A0=A button LUI A1,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,A1,8D28 ;A1=80208D28 LUI S7,8022 LUI S8,8022 ADDU S5,S1,R0 ADDU S6,S0,R0 JAL 80210D4C ;V0=button and stick pos ADDU S0,R0,R0 ADDU S1,V0,R0 ;S1=V0: button/stick LUI V0,0001 AND V0,S1,V0 ;V0=nonzero if c right pressed BEQ V0,R0,802099AC ADDIU T0,R0,0001 LW V0,74F0 (S7) BNE V0,T0,80209984 NOP J 802099A0 SW R0,74F0 (S7) BNE V0,R0,802099B0 LUI V0,0800 LUI V0,8022 LW V0,74EC (V0) BEQ V0,R0,802099AC ADDIU T1,R0,0001 SW T1,74F0 (S7) JAL 802061C0 ADDU A0,R0,R0 ADDIU S4,R0,0001 LUI V0,0800 ORI V0,V0,0002 ;V0=08000002: + up, stick up AND V0,S1,V0 ;V0=nonzero if up pressed BEQ V0,R0,80209A24 ADDIU T2,R0,0001 LW V0,74F0 (S7) BNE V0,T2,80209A00 LUI T3,8022 LW V0,74F4 (T3) BLEZ V0,802099E0 ADDIU V0,V0,FFFF J 802099F0 SW V0,74F4 (T3) LW V0,74F8 (S8) BLEZ V0,802099F8 ADDIU V0,V0,FFFF SW V0,74F8 (S8) JAL 802061C0 ADDU A0,R0,R0 J 80209A24 ADDIU S4,R0,0001 LW V0,8F94 (S5) BLEZ V0,80209A28 LUI V0,0400 JAL 802061C0 ADDU A0,R0,R0 LW V0,8F94 (S5) ADDIU S4,R0,0001 ADDIU V0,V0,FFFF SW V0,8F94 (S5) LUI V0,0400 ORI V0,V0,0001 ;V0=04000001: + down, stick down AND V0,S1,V0 ;V0=nonzero if down pressed BEQ V0,R0,80209AE4 ADDIU T0,R0,0001 LW V0,74F0 (S7) BNE V0,T0,80209A94 LUI T2,8022 LUI V0,8022 LUI T1,8022 LW A1,74F8 (S8) LW A0,74F4 (T1) LW V0,74FC (V0) ADDU V1,A1,A0 ADDIU V0,V0,FFFF SLT V1,V1,V0 BEQ V1,R0,80209A8C SLTI V0,A0,0004 BEQ V0,R0,80209A7C ADDU V0,A0,T0 J 80209A84 SW V0,74F4 (T1) ADDIU V0,A1,0001 SW V0,74F8 (S8) JAL 802061C0 ADDU A0,R0,R0 J 80209AE4 ADDIU S4,R0,0001 LW V0,74E0 (T2) BNE V0,R0,80209AB0 NOP LW V0,2C54 (S6) SLTI V0,V0,0008 BEQ V0,R0,80209ABC NOP LW V0,8F94 (S5) J 80209AC4 SLTI V0,V0,0003 LW V0,8F94 (S5) SLTI V0,V0,0002 BEQ V0,R0,80209AE4 NOP JAL 802061C0 ADDU A0,R0,R0 LW V0,8F94 (S5) ADDIU S4,R0,0001 ADDU V0,V0,S4 SW V0,8F94 (S5) LW V0,74F0 (S7) BNE V0,R0,80209C3C LUI V0,0200 ORI V0,V0,0004 ;V0=02000004: + left, stick left AND V0,S1,V0 ;V0=nonzero if left pressed BEQ V0,R0,80209B28 LUI V0,0100 LW V0,8F90 (S3) BLEZ V0,80209B28 LUI V0,0100 JAL 802061C0 ADDU A0,R0,R0 LW V0,8F90 (S3) ADDIU S4,R0,0001 ADDIU V0,V0,FFFF SW V0,8F90 (S3) LUI V0,0100 ORI V0,V0,0008 ;V0=01000008: + right, stick right AND V0,S1,V0 ;V0=nonzero if right pressed BEQ V0,R0,80209B64 LUI V0,0020 LW V0,8F90 (S3) SLTI V0,V0,0003 BEQ V0,R0,80209B64 LUI V0,0020 JAL 802061C0 ADDU A0,R0,R0 LW V0,8F90 (S3) ADDIU S4,R0,0001 ADDU V0,V0,S4 SW V0,8F90 (S3) LUI V0,0020 AND V0,S1,V0 ;V0=nonzero if L pressed BEQ V0,R0,80209BA0 LUI V0,0010 JAL 802061C0 ADDU A0,R0,R0 LW V0,2C54 (S6) BLEZ V0,80209B8C ADDIU V0,V0,FFFF ADDIU S4,R0,0001 SW V0,2C54 (S6) ADDIU V0,R0,000F LUI T3,8022 SW V0,74DC (T3) ADDIU S0,R0,0001 LUI V0,0010 AND V0,S1,V0 ;V0=nonzero if R pressed BEQ V0,R0,80209C3C NOP JAL 802061C0 ADDU A0,R0,R0 LUI T0,8022 LW V0,74E0 (T0) BEQ V0,R0,80209BDC NOP LW V0,2C54 (S6) SLTI V0,V0,000B BNEL V0,R0,80209BF0 ADDIU S4,R0,0001 J 80209C30 ADDIU V0,R0,000F LW V0,2C54 (S6) SLTI V0,V0,000C BEQ V0,R0,80209C30 ADDIU V0,R0,000F ADDIU S4,R0,0001 LUI T1,8022 LW V0,2C54 (S6) LW V1,74E0 (T1) ADDU A0,V0,S4 BEQ V1,S4,80209C2C SW A0,2C54 (S6) ADDIU V0,R0,0008 BNE A0,V0,80209C30 ADDIU V0,R0,000F LW V1,8F94 (S5) SLTI V0,V1,0003 BNE V0,R0,80209C30 ADDIU V0,R0,000F ADDIU V0,V1,FFFF SW V0,8F94 (S5) ADDIU V0,R0,000F LUI T2,8022 SW V0,74DC (T2) ADDIU S0,R0,0001 BGEZ S1,80209EF8 LUI V0,4000 JAL 802061C0 ADDU A0,R0,R0 LW V0,74F0 (S7) ADDIU S4,R0,0001 BNE V0,S4,80209CFC LUI T3,8022 LUI T0,8025 ADDIU T0,T0,8FD8 LUI T1,8025 ADDIU T1,T1,8FD8 LUI A0,8000 ;A0=A button LUI A1,8021 LW V1,74F4 (T3) LW V0,74F8 (S8) LW T2,00A0 (SP) ADDU V1,V1,V0 SLLV V0,V1,S4 ADDU V0,V0,V1 ADDIU V1,V0,0002 SLLV V1,V1,S4 ADDU V1,V1,T0 ADDIU V0,V0,0003 SLLV V0,V0,S4 ADDU V0,V0,T1 LHU V1,0000 (V1) LHU V0,0000 (V0) SLL V1,V1,0x10 OR V1,V1,V0 SW V1,0000 (T2) LW V1,74F4 (T3) LUI T3,8025 LW V0,74F8 (S8) ADDIU T3,T3,8FD8 ADDU V1,V1,V0 SLLV V0,V1,S4 ADDU V0,V0,V1 ADDIU V0,V0,0004 SLLV V0,V0,S4 ADDU V0,V0,T3 LW V1,95E0 (S2) LH V0,0000 (V0) ADDIU A1,A1,8D28 ;A1=80208D28 JAL 80211130 ;use handler A1 if buttons A0 pressed SW V0,0000 (V1) J 80209EE8 ADDIU V0,R0,000F LW V1,2C54 (S6) SLTI V0,V1,0008 BEQ V0,R0,80209DAC SLL V0,V1,0x2 ADDU V0,SP,V0 LUI T1,8022 LW T0,00A0 (SP) LW V0,0030 (V0) LW V1,0000 (T0) ADDIU T1,T1,2780 AND A0,V1,V0 SW A0,0000 (T0) LW V0,8F90 (S3) LW V1,8F94 (S5) SLL V0,V0,0x2 SLL V1,V1,0x4 ADDU V0,V0,V1 ADDU V0,V0,T1 LW V1,0000 (V0) ADDIU V0,V1,FFD0 ADDU A1,V0,R0 SLTIU V0,A1,000A BEQL V0,R0,80209D5C ADDIU A1,V1,FFC9 LUI T3,8022 LW V0,2C54 (S6) ADDIU T0,R0,0001 SLL V0,V0,0x2 ADDU V0,SP,V0 LW V0,0010 (V0) LW T2,00A0 (SP) SLLV A1,A1,V0 ADDU V0,A0,A1 SW V0,0000 (T2) LW V0,2C54 (S6) LW V1,74E0 (T3) ADDIU A0,V0,0001 BEQ V1,T0,80209EE4 SW A0,2C54 (S6) ADDIU V0,R0,0008 BNE A0,V0,80209EE8 ADDIU V0,R0,000F J 80209ECC NOP LUI T1,8022 LW V0,74E0 (T1) BEQ V0,R0,80209E58 ADDIU V0,V1,FFF8 SLL V0,V0,0x2 ADDU V1,SP,V0 LUI T2,8022 LW A0,95E0 (S2) LW V1,0050 (V1) LW V0,0000 (A0) ADDIU T2,T2,2780 AND V0,V0,V1 SW V0,0000 (A0) LW V0,8F90 (S3) LW V1,8F94 (S5) SLL V0,V0,0x2 SLL V1,V1,0x4 ADDU V0,V0,V1 ADDU V0,V0,T2 LW V1,0000 (V0) ADDIU V0,V1,FFD0 ADDU A1,V0,R0 SLTIU V0,A1,000A BEQL V0,R0,80209E10 ADDIU A1,V1,FFC9 LUI V1,8022 ADDIU V1,V1,2770 LW V0,2C54 (S6) LW A0,95E0 (S2) ADDIU V0,V0,FFF8 SLL V0,V0,0x2 ADDU V0,V0,V1 LW V1,0000 (V0) LW V0,0000 (A0) SLLV A1,A1,V1 ADDU V0,V0,A1 SW V0,0000 (A0) LW V1,2C54 (S6) SLTI V0,V1,000B BEQ V0,R0,80209EE4 ADDIU V0,V1,0001 J 80209EE4 SW V0,2C54 (S6) ADDIU S0,SP,0060 LW V0,95E0 (S2) ADDU A1,S0,R0 LW A0,0000 (V0) JAL 8020B844 ADDIU A2,R0,0005 ADDU A0,S0,R0 LUI A1,8022 ADDIU A1,A1,27C0 LW V0,8F90 (S3) LW V1,8F94 (S5) SLL V0,V0,0x2 SLL V1,V1,0x4 ADDU V0,V0,V1 ADDU V0,V0,A1 LW V1,2C54 (S6) LBU V0,0003 (V0) ADDU V1,V1,A0 JAL 8020B95C SB V0,FFF8 (V1) LW V1,95E0 (S2) SW V0,0000 (V1) LW V1,2C54 (S6) SLTI V0,V1,000C BEQ V0,R0,80209EE4 ADDIU V1,V1,0001 ADDIU V0,R0,0008 BNE V1,V0,80209EE4 SW V1,2C54 (S6) LW V1,8F94 (S5) SLTI V0,V1,0003 BNE V0,R0,80209EE8 ADDIU V0,R0,000F ADDIU V0,V1,FFFF SW V0,8F94 (S5) ADDIU V0,R0,000F LUI T3,8022 SW V0,74DC (T3) ADDIU S0,R0,0001 LUI V0,4000 AND V0,S1,V0 BEQ V0,R0,80209F28 ADDU A0,R0,R0 JAL 802061C0 ADDU A0,R0,R0 ADDIU T0,R0,0001 SW T0,0074 (SP) LUI A0,4000 ;A0=B button LUI A1,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,A1,8D28 ;A1=80208D28 ADDU A0,R0,R0 LW T1,00AC (SP) LW T2,00A8 (SP) LUI V0,8025 SW T1,8FA4 (V0) LUI V0,8025 JAL 80208D28 SW T2,8FA0 (V0) JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BNE S1,R0,80209F60 ADDIU T3,R0,0001 SW T3,0070 (SP) BEQ S4,R0,80209F88 ADDU A0,S1,R0 SLL A1,S0,0x2 ORI A1,A1,0008 LUI A3,8021 LW A2,0070 (SP) JAL 802111A0 ADDIU A3,A3,8D28 ADDU S4,R0,R0 SW R0,0070 (SP) LW T0,0074 (SP) BEQ T0,R0,80209954 NOP LW RA,009C (SP) LW S8,0098 (SP) LW S7,0094 (SP) LW S6,0090 (SP) LW S5,008C (SP) LW S4,0088 (SP) LW S3,0084 (SP) LW S2,0080 (SP) LW S1,007C (SP) LW S0,0078 (SP) JR RA ADDIU SP,SP,00A0 80209FC4 ADDIU SP,SP,FFC0 SW S1,001C (SP) ADDU S1,A0,R0 SW S0,0018 (SP) ADDU S0,A2,R0 SW S8,0038 (SP) ADDIU S8,R0,0001 SW S2,0020 (SP) ADDU S2,R0,R0 SW RA,003C (SP) SW S7,0034 (SP) SW S6,0030 (SP) SW S5,002C (SP) SW S4,0028 (SP) SW S3,0024 (SP) JAL 802141F0 ;V0=strlen(A0) SW R0,0010 (SP) LUI S3,8025 LUI S4,8025 LUI S6,8025 SW V0,90F0 (S3) ADDIU V0,R0,0004 SW S1,91D0 (S4) LUI S1,8025 SW V0,8F90 (S6) ADDIU V0,R0,0002 SW V0,8F94 (S1) LUI V0,8025 ADDIU S0,S0,FFFF JAL 80208238 SW S0,8FA4 (V0) LW V1,90F0 (S3) SLTI V0,V1,001E BEQ V0,R0,8020A05C ADDU S5,S2,R0 LW V0,91D0 (S4) ADDU V0,V1,V0 SB R0,0001 (V0) LUI A0,8000 ;A0=A button LUI S0,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S0,8C28 ;A1=80208C28 JAL 80210D30 ;V0=button and stick pos for controller 1 ADDU S7,S1,R0 JAL 80210D4C ;V0=button and stick pos ADDU S0,R0,R0 LUI V1,0800 ORI V1,V1,0002 ;V1=08000002: + up, stick up ADDU S1,V0,R0 ;S1=V0: button/stick AND V1,S1,V1 ;V1=nonzero if up pressed BEQ V1,R0,8020A0BC LUI V0,0400 LW V0,8F94 (S7) BLEZ V0,8020A0BC LUI V0,0400 JAL 802061C0 ADDU A0,S0,R0 LW V0,8F94 (S7) ADDIU S2,R0,0001 ADDIU V0,V0,FFFF SW V0,8F94 (S7) LUI V0,0400 ORI V0,V0,0001 ;V0=04000001: + down, stick down AND V0,S1,V0 ;V0=nonzero if down pressed BEQ V0,R0,8020A0F8 LUI V0,0200 LW V0,8F94 (S7) SLTI V0,V0,0004 BEQ V0,R0,8020A0F8 LUI V0,0200 JAL 802061C0 ADDU A0,R0,R0 LW V0,8F94 (S7) ADDIU S2,R0,0001 ADDU V0,V0,S2 SW V0,8F94 (S7) LUI V0,0200 ORI V0,V0,0004 ;V0=02000004: + left, stick left AND V0,S1,V0 ;V0=nonzero if left pressed BEQ V0,R0,8020A130 LUI V0,0100 LW V0,8F90 (S6) BLEZ V0,8020A130 LUI V0,0100 JAL 802061C0 ADDU A0,R0,R0 LW V0,8F90 (S6) ADDIU S2,R0,0001 ADDIU V0,V0,FFFF SW V0,8F90 (S6) LUI V0,0100 ORI V0,V0,0008 ;V0=01000008: + left, stick left AND V0,S1,V0 ;V0=nonzero if right pressed BEQ V0,R0,8020A16C LUI V0,0020 LW V0,8F90 (S6) SLTI V0,V0,000B BEQ V0,R0,8020A16C LUI V0,0020 JAL 802061C0 ADDU A0,R0,R0 LW V0,8F90 (S6) ADDIU S2,R0,0001 ADDU V0,V0,S2 SW V0,8F90 (S6) LUI V0,0020 AND V0,S1,V0 ;V0=nonzero if L pressed BEQ V0,R0,8020A1C0 LUI V0,0010 LW V0,90F0 (S3) BLEZ V0,8020A1BC ADDIU S0,R0,0001 JAL 802061C0 ADDU A0,R0,R0 LW V0,91D0 (S4) LW V1,90F0 (S3) ADDIU S2,R0,0002 ADDU V0,V0,V1 SB R0,0000 (V0) LW V0,90F0 (S3) LW V1,91D0 (S4) ADDIU V0,V0,FFFF ADDU V1,V1,V0 SW V0,90F0 (S3) SB R0,0000 (V1) ADDIU S0,R0,0001 LUI V0,0010 AND V0,S1,V0 ;V0=nonzero if R pressed BEQ V0,R0,8020A20C LUI V0,2000 LW V0,90F0 (S3) SLTI V0,V0,001E BEQ V0,R0,8020A208 ADDIU S0,R0,0001 JAL 802061C0 ADDU A0,R0,R0 ADDIU S2,R0,0002 LW A0,90F0 (S3) LW V1,91D0 (S4) ADDIU V0,R0,0020 ADDU V1,V1,A0 ADDIU A0,A0,0001 SB V0,0000 (V1) SW A0,90F0 (S3) ADDIU S0,R0,0001 LUI V0,2000 AND V0,S1,V0 ;V0=nonzero if Z pressed BEQ V0,R0,8020A234 NOP JAL 802061C0 ADDU A0,R0,R0 LUI T0,8022 LW V0,74E8 (T0) LUI S5,2000 SLTIU V0,V0,0001 SW V0,74E8 (T0) BGEZ S1,8020A2F0 LUI V0,0002 JAL 802061C0 ADDU A0,R0,R0 LW A1,90F0 (S3) SLTI V0,A1,001E BEQ V0,R0,8020A2E8 ADDIU S2,R0,0002 LUI T0,8022 ADDIU T0,T0,27F0 LW V1,8F90 (S6) LW A0,8F94 (S7) SLLV V1,V1,S2 SLL V0,A0,0x1 ADDU V0,V0,A0 SLL V0,V0,0x4 ADDU A2,V1,V0 ADDU A0,A2,T0 LW V1,0000 (A0) ADDIU V0,R0,0083 BNE V1,V0,8020A298 LUI T0,8022 LW V0,91D0 (S4) J 8020A2C8 ADDIU V1,R0,0020 LW V0,74E8 (T0) BNE V0,R0,8020A2C0 LUI V0,8022 ADDIU V0,V0,28E0 ADDU V0,A2,V0 LW V1,91D0 (S4) LBU V0,0003 (V0) ADDU V1,V1,A1 J 8020A2D0 SB V0,0000 (V1) LW V0,91D0 (S4) LBU V1,0003 (A0) ADDU V0,V0,A1 SB V1,0000 (V0) ADDIU V0,A1,0001 SW V0,90F0 (S3) LW V0,91D0 (S4) LW V1,90F0 (S3) ADDU V0,V0,V1 SB R0,0000 (V0) ADDIU S0,R0,0001 LUI V0,0002 AND V0,S1,V0 ;V0=nonzero if c left pressed BEQ V0,R0,8020A33C LUI V0,4000 LW V0,90F0 (S3) BLEZ V0,8020A33C LUI V0,4000 JAL 802061C0 ADDU A0,R0,R0 LUI V0,8025 SW R0,90F8 (V0) ADDU V1,R0,R0 LW V0,91D0 (S4) ADDU V0,V0,V1 ADDIU V1,V1,0001 SB R0,0000 (V0) SLTI V0,V1,0020 BNE V0,R0,8020A31C LUI V0,4000 SW R0,90F0 (S3) AND V0,S1,V0 ;V0=nonzero if B pressed BEQ V0,R0,8020A368 NOP JAL 802061C0 ADDU A0,R0,R0 ADDIU T0,R0,0001 SW T0,0010 (SP) LUI A0,4000 ;A0=B button LUI T0,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T0,8C28 ;A1=80208C28 JAL 80208C28 ADDU A0,R0,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BEQL S1,R0,8020A388 ADDIU S8,R0,0001 BEQ S2,R0,8020A3C4 ADDIU V0,R0,0002 BNE S2,V0,8020A3A4 ADDU A0,S1,R0 LUI V1,8022 ADDIU V0,R0,0010 SW V0,74DC (V1) SLL A1,S0,0x2 ORI A1,A1,0008 ADDU A2,S8,R0 LUI T0,8021 JAL 802111A0 ADDIU A3,T0,8C28 ADDU S2,R0,R0 ADDU S8,S2,R0 BEQ S5,R0,8020A3DC ADDU A0,S5,R0 LUI T0,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T0,8C28 ADDU S5,R0,R0 LW T0,0010 (SP) BEQ T0,R0,8020A074 LUI V0,8025 LUI V1,8025 LW V0,91D0 (V0) LW V1,90F0 (V1) ADDU V0,V0,V1 SB R0,0000 (V0) LW RA,003C (SP) LW S8,0038 (SP) LW S7,0034 (SP) LW S6,0030 (SP) LW S5,002C (SP) LW S4,0028 (SP) LW S3,0024 (SP) LW S2,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0040 8020A42C LUI V1,8022 LW V0,7500 (V1) ADDIU SP,SP,FFC0 SW S4,0028 (SP) ADDU S4,A0,R0 SW S5,002C (SP) ADDU S5,A1,R0 SW S3,0024 (SP) ADDU S3,A2,R0 SW RA,0038 (SP) SW S7,0034 (SP) SW S6,0030 (SP) SW S2,0020 (SP) SW S1,001C (SP) SW S0,0018 (SP) ADDIU V0,V0,0001 SW V0,7500 (V1) LBU V0,0286 (S3) BNE V0,R0,8020A4E4 ADDU S2,R0,R0 BNE S5,R0,8020A4D8 ADDIU V0,V0,0001 SB V0,0286 (S3) LUI V0,8022 ADDIU V1,V0,7660 ;V1=80227660: string pointer table LW V0,00C0 (V1) ;V0=str+C0: 80224100 "No Cheat Name" LBU V0,0000 (V0) BEQ V0,R0,8020A4D0 ADDU S0,S2,R0 ADDU A0,V1,R0 ;A0=V1: string pointer table LW V0,00C0 (A0) ;V0=str+C0: 80224100 "No Cheat Name" ADDU V0,V0,S0 LBU V1,0000 (V0) ADDU V0,S3,S0 SB V1,0020 (V0) LW V0,00C0 (A0) ;V0=str+C0: 80224100 "No Cheat Name" ADDIU S0,S0,0001 ADDU V0,V0,S0 LBU V0,0000 (V0) BNE V0,R0,8020A4A4 NOP ADDU V0,S3,S0 SB R0,0020 (V0) LBU V0,0286 (S3) BEQ V0,R0,8020A50C NOP ADDU A0,S4,R0 JAL 8020F500 ADDIU A1,S3,0020 ADDIU V1,R0,FFFE BEQ V0,V1,8020A530 ADDIU A0,R0,0001 JAL 8020F664 ADDU A0,S4,R0 J 8020A538 ADDU S5,V0,R0 LBU V0,0285 (S3) BEQ V0,R0,8020A548 ADDU A1,S5,R0 ADDU A0,S4,R0 JAL 8020F48C ADDIU A2,S3,0020 ADDIU V1,R0,FFFE BNE V0,V1,8020A538 ADDIU A0,R0,0002 JAL 80208924 ADDIU S2,S2,0001 JAL 8020E3C4 NOP JAL 8020F664 ADDU A0,S4,R0 LBU V0,0287 (S3) BEQ V0,R0,8020A590 NOP BNE S2,R0,8020A6A8 ADDU S0,R0,R0 ADDU A0,S4,R0 JAL 8020E970 ADDU A1,S3,R0 ADDIU V1,R0,FFFE BNE V0,V1,8020A580 NOP JAL 80208924 ADDIU A0,R0,0003 ADDIU S2,R0,0001 JAL 8020E3C4 NOP JAL 8020F664 ADDU A0,S4,R0 BNE S2,R0,8020A6A8 ADDU S0,R0,R0 ADDIU S6,R0,0002 ADDU S1,S3,R0 ADDU V0,S3,S0 LBU V0,0245 (V0) BNE V0,S6,8020A5C8 ADDU A0,S4,R0 LW V0,0044 (S1) ADDU A1,S5,R0 SW V0,0010 (SP) LW A3,0040 (S1) JAL 8020F8DC ADDIU A2,S0,0001 JAL 8020E3C4 ADDIU S1,S1,0008 JAL 8020F664 ADDU A0,S4,R0 ADDIU S0,S0,0001 SLTI V0,S0,0040 BEQ V0,R0,8020A5F0 NOP BEQ S2,R0,8020A5A4 ADDU V0,S3,S0 BNE S2,R0,8020A6A8 ADDU S0,R0,R0 ADDIU S7,R0,0001 ADDIU S6,R0,FFFE ADDU S1,S3,R0 ADDU V0,S3,S0 LBU V0,0245 (V0) BNE V0,S7,8020A638 ADDU A0,S4,R0 LW A2,0040 (S1) LH A3,0046 (S1) JAL 8020F7C8 ADDU A1,S5,R0 BNE V0,S6,8020A638 NOP JAL 80208924 ADDIU A0,R0,0004 ADDIU S2,S2,0001 JAL 8020E3C4 ADDIU S1,S1,0008 JAL 8020F664 ADDU A0,S4,R0 ADDIU S0,S0,0001 SLTI V0,S0,0040 BEQ V0,R0,8020A660 NOP BEQ S2,R0,8020A608 ADDU V0,S3,S0 BNE S2,R0,8020A6A8 ADDIU V0,R0,0001 LBU V1,0244 (S3) BNE V1,V0,8020A680 ADDU A0,S4,R0 ADDU A1,S5,R0 J 8020A688 ADDU A2,V0,R0 ADDU A1,S5,R0 ADDU A2,R0,R0 JAL 8020F058 NOP JAL 8020E3C4 NOP JAL 8020F664 ADDU A0,S4,R0 JAL 8020E39C ;replace codelist on ROM with revised copy NOP JAL 8020E310 NOP LW RA,0038 (SP) LW S7,0034 (SP) LW S6,0030 (SP) LW S5,002C (SP) LW S4,0028 (SP) LW S3,0024 (SP) LW S2,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0040 8020A6DC LBU V0,0000 (A0) BEQ V0,R0,8020A710 ADDU A2,R0,R0 ADDU V1,A1,A2 ADDU V0,A0,A2 LBU V0,0000 (V0) ADDIU A2,A2,0001 SB V0,0020 (V1) SLTI V0,A2,0020 BNE V0,R0,8020A6EC ADDU V1,A1,A2 J 8020A75C NOP LUI V0,8022 ADDIU V1,V0,7660 ;V1=80227660: string pointer table LW V0,00C0 (V1) ;V0=str+C0: 80224100 "No Cheat Name" LBU V0,0000 (V0) BEQ V0,R0,8020A754 ADDU A0,V1,R0 LW V0,00C0 (A0) ;V0=str+C0: 80224100 "No Cheat Name" ADDU V0,V0,A2 LBU V1,0000 (V0) ADDU V0,A1,A2 SB V1,0020 (V0) LW V0,00C0 (A0) ;V0=str+C0: 80224100 "No Cheat Name" ADDIU A2,A2,0001 ADDU V0,V0,A2 LBU V0,0000 (V0) BNE V0,R0,8020A728 NOP ADDU V0,A1,A2 SB R0,0020 (V0) LBU V0,0288 (A1) ADDIU V0,V0,0001 JR RA SB V0,0288 (A1) 8020A76C ADDIU SP,SP,FFD8 SW S2,0018 (SP) ADDU S2,A0,R0 SW S3,001C (SP) ADDU S3,A1,R0 ADDU A3,R0,R0 LUI A0,8025 SW RA,0020 (SP) SW S1,0014 (SP) SW S0,0010 (SP) LW V0,9AC8 (A0) SLL V1,A3,0x3 ADDU V0,V0,A3 SB R0,0245 (V0) LW V0,9AC8 (A0) ADDIU A3,A3,0001 ADDU V0,V0,V1 SW R0,0040 (V0) SW R0,0044 (V0) SLTI V0,A3,0040 BNE V0,R0,8020A794 NOP LUI A0,8025 LW V0,9AC8 (A0) SB R0,0286 (V0) LW V0,9AC8 (A0) SB R0,0285 (V0) LW V0,9AC8 (A0) SB R0,0287 (V0) LW V0,9AC8 (A0) SB R0,0288 (V0) LUI V0,8024 LW V1,2C88 (V0) ADDIU V0,R0,0001 BEQ V1,V0,8020A810 NOP LW A1,9AC8 (A0) JAL 8020FB14 ADDU A0,S2,R0 J 8020A81C LUI A0,8024 LW V0,9AC8 (A0) SB R0,0000 (V0) LUI A0,8024 LW V0,2C88 (A0) BEQ V0,R0,8020A854 LUI V1,8025 LW V0,9AC8 (V1) SB R0,0020 (V0) LW V0,2C88 (A0) ADDIU A0,R0,0001 BNE V0,A0,8020A848 NOP LW V0,9AC8 (V1) SW R0,0240 (V0) LW V0,9AC8 (V1) J 8020A98C SB A0,0244 (V0) BEQ S3,R0,8020A8F4 ADDU A0,S2,R0 LUI S0,8025 LW A2,9AC8 (S0) ADDU A1,S3,R0 JAL 8020FAA0 ADDIU A2,A2,0020 LW A0,9AC8 (S0) JAL 8020CD70 ADDIU A0,A0,0020 ADDU A0,S2,R0 JAL 8020F874 ADDU A1,S3,R0 LW V1,9AC8 (S0) ADDU A3,R0,R0 BLEZ V0,8020A8D8 SW V0,0240 (V1) ADDU S1,S0,R0 ADDU A0,S2,R0 ADDU A1,S3,R0 ADDIU S0,A3,0001 ADDU A2,S0,R0 SLL A3,A3,0x3 LW V0,9AC8 (S1) ADDIU A3,A3,0040 JAL 8020FBE0 ADDU A3,V0,A3 LW V0,9AC8 (S1) LW V0,0240 (V0) ADDU A3,S0,R0 SLT V0,A3,V0 BNE V0,R0,8020A8A0 ADDU A0,S2,R0 ADDU A0,S2,R0 JAL 8020EF78 ADDU A1,S3,R0 LUI V1,8025 LW V1,9AC8 (V1) J 8020A98C SB V0,0244 (V1) LUI A0,8025 LW V1,9AC8 (A0) ADDIU V0,R0,0001 SB V0,0244 (V1) LUI V0,8022 ADDIU V1,V0,7660 ;V1=80227660: string pointer table LW V0,00B4 (V1) ;V0=str+B4: 80224118 "--- New Code Description ---" LBU V0,0000 (V0) BEQ V0,R0,8020A954 ADDU A3,R0,R0 ADDU A1,A0,R0 ADDU A0,V1,R0 ;A0=V1: string pointer table LW V0,00B4 (A0) ;V0=str+B4: 80224118 "--- New Code Description ---" LW V1,9AC8 (A1) ADDU V0,V0,A3 LBU V0,0000 (V0) ADDU V1,V1,A3 SB V0,0020 (V1) LW V0,00B4 (A0) ;V0=str+B4: 80224118 "--- New Code Description ---" ADDIU A3,A3,0001 ADDU V0,V0,A3 LBU V0,0000 (V0) BNE V0,R0,8020A924 NOP LUI V1,8025 LW V0,9AC8 (V1) ADDU V0,V0,A3 SB R0,0020 (V0) LW V0,9AC8 (V1) LUI A0,8025 SW R0,9108 (A0) SW R0,0240 (V0) LUI V0,8024 LW V1,2C88 (V0) ADDIU V0,R0,0001 BNE V1,V0,8020A98C ADDIU V0,R0,FFFF SW V0,9108 (A0) LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8020A9A8 ADDIU SP,SP,FFA8 SW S2,0050 (SP) ADDU S2,A0,R0 ADDIU A1,R0,FFFF ADDU A3,R0,R0 SW S1,004C (SP) LUI S1,8024 LUI V0,8024 SW S0,0048 (SP) LUI S0,8024 LW A2,4D74 (S1) LW T0,2C88 (S0) LUI V1,8022 SW R0,2C7C (V0) ADDIU V0,R0,0001 SW RA,0054 (SP) SW V0,74E8 (V1) SW R0,0014 (SP) JAL 802090C4 SW T0,0010 (SP) ADDIU A0,R0,FFFF JAL 802083E4 ADDU A1,A0,R0 JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDU A0,S2,R0 ADDIU A1,R0,FFFF LW A2,4D74 (S1) LW V0,2C88 (S0) ADDU A3,R0,R0 SW R0,0014 (SP) JAL 802090C4 SW V0,0010 (SP) ADDIU A0,R0,FFFF JAL 802083E4 ADDU A1,A0,R0 ADDIU A0,R0,001F ADDIU V0,SP,003F SB R0,0000 (V0) ADDIU A0,A0,FFFF BGEZ A0,8020AA40 ADDIU V0,V0,FFFF LUI V1,8025 LW V0,9AC8 (V1) LBU V0,0000 (V0) BEQ V0,R0,8020AAA4 ADDU A0,R0,R0 ADDIU A2,SP,0020 ADDU A1,V1,R0 SLTI V0,A0,0020 BEQL V0,R0,8020AAA8 ADDIU A0,SP,0020 LW V0,9AC8 (A1) ADDU V0,V0,A0 LBU V1,0000 (V0) ADDU V0,A2,A0 SB V1,0000 (V0) LW V0,9AC8 (A1) ADDIU A0,A0,0001 ADDU V0,V0,A0 LBU V0,0000 (V0) BNE V0,R0,8020AA70 SLTI V0,A0,0020 ADDIU A0,SP,0020 ADDIU A1,R0,0016 ADDIU A2,R0,0028 LUI V0,8025 LUI V1,8024 LUI A3,8024 LW V0,9108 (V0) LW V1,4D74 (V1) LW T0,2C88 (A3) ADDIU A3,R0,0110 SW S2,0010 (SP) SW V0,0014 (SP) SW V1,0018 (SP) JAL 80209FC4 SW T0,001C (SP) ADDIU A0,R0,0001 LUI V1,8024 ADDU V0,A0,R0 JAL 80208394 SW V0,2C7C (V1) LBU V0,0020 (SP) BEQ V0,R0,8020AB50 ADDU A0,R0,R0 LUI A2,8025 ADDIU A1,SP,0020 ADDU V0,A1,A0 LW V1,9AC8 (A2) LBU V0,0000 (V0) ADDU V1,V1,A0 ADDIU A0,A0,0001 SB V0,0000 (V1) SLTI V0,A0,0020 BNE V0,R0,8020AB0C ADDU V0,A1,A0 LUI A0,8025 LW V1,9AC8 (A0) LBU V0,0288 (V1) ADDIU V0,V0,0001 SB V0,0288 (V1) LW V1,9AC8 (A0) LBU V0,0287 (V1) ADDIU V0,V0,0001 SB V0,0287 (V1) LW RA,0054 (SP) LW S2,0050 (SP) LW S1,004C (SP) LW S0,0048 (SP) JR RA ADDIU SP,SP,0058 8020AB68 ADDIU SP,SP,FCC0 ADDIU T1,R0,0001 SW S4,0328 (SP) ADDU S4,R0,R0 SW S5,032C (SP) LUI S5,B000 ORI S5,S5,0020 SW S0,0318 (SP) LUI S0,8024 LUI V0,8024 SW S1,031C (SP) LUI S1,8025 SW S2,0320 (SP) LUI S2,8025 SW R0,4D74 (V0) ADDIU V0,SP,0070 SW RA,033C (SP) SW S8,0338 (SP) SW S7,0334 (SP) SW S6,0330 (SP) SW S3,0324 (SP) SW A0,0340 (SP) SW A1,0344 (SP) SW T1,0308 (SP) SW R0,030C (SP) SW A2,2C88 (S0) SW T1,9108 (S1) JAL 8020A76C SW V0,9AC8 (S2) LW T1,0308 (SP) LW V1,2C88 (S0) LUI V0,8024 SW T1,2C7C (V0) LUI V0,8024 SW R0,2C74 (V0) LUI V0,8022 BNE V1,T1,8020AC30 SW T1,7524 (V0) LUI A0,8021 ADDIU A0,A0,BFB0 LUI A1,8021 ADDIU A1,A1,8BDC ADDU A2,S4,R0 ADDIU V0,R0,FFFE JAL 8021401C SW V0,9108 (S1) LW V0,9AC8 (S2) LBU T1,030B (SP) J 8020AC48 SB T1,0288 (V0) LUI A0,8021 ADDIU A0,A0,CF08 LUI A1,8021 ADDIU A1,A1,8BDC JAL 8021401C ADDU A2,R0,R0 LUI V0,8022 ADDU A0,R0,R0 JAL 80208394 SW R0,7524 (V0) JAL 80210D30 ;V0=button and stick pos for controller 1 NOP LW T1,030C (SP) BNE T1,R0,8020B774 ADDIU A0,R0,0001 LUI S1,8025 LUI S6,8024 LUI S8,8024 ADDIU S3,R0,0001 LUI S2,8025 ADDIU T1,SP,0070 SW T1,0310 (SP) ADDIU T1,SP,0020 SW T1,0314 (SP) JAL 80210D4C ;V0=button and stick pos NOP LUI V1,0800 ORI V1,V1,0002 ADDU S7,V0,R0 AND V1,S7,V1 BEQ V1,R0,8020AD40 LUI V0,0400 LW V1,9108 (S1) SLTI V0,V1,FFFF BEQ V0,R0,8020ACFC NOP LW V0,2C88 (S6) BNE V0,R0,8020ACE0 SLTI V0,V1,FFFE ADDIU T1,R0,FFFE BNE V1,T1,8020ACE0 NOP J 8020ACEC SW R0,9108 (S1) BEQ V0,R0,8020AD3C ADDIU V0,V1,0001 SW V0,9108 (S1) JAL 802061C0 ADDU A0,R0,R0 J 8020AD3C ADDIU S4,R0,0001 LW V0,4D74 (S8) BEQ V0,R0,8020AD24 NOP JAL 802061C0 ADDU A0,R0,R0 LW V0,4D74 (S8) ADDIU S4,R0,0001 ADDIU V0,V0,FFFF J 8020AD3C SW V0,4D74 (S8) BLTZ V1,8020AD3C ADDIU V0,V1,FFFF ADDIU S4,R0,0001 SW V0,9108 (S1) JAL 802061C0 ADDU A0,R0,R0 LUI V0,0400 ORI V0,V0,0001 AND V0,S7,V0 BEQ V0,R0,8020AE74 LUI V0,0200 LW V1,9108 (S1) SLTI V0,V1,FFFF BEQ V0,R0,8020ADB4 NOP LW V0,2C88 (S6) BNE V0,S3,8020AD90 SLTI V0,V1,FFFD LW V0,9AC8 (S2) LBU V0,0000 (V0) BNE V0,R0,8020AD90 SLTI V0,V1,FFFC SLTI V0,V1,FFFD BEQ V0,R0,8020AD98 LUI V0,0200 J 8020AE78 ORI V0,V0,0004 BNE V0,R0,8020AE74 LUI V0,0200 JAL 802061C0 ADDU A0,R0,R0 LW V0,9108 (S1) ADDIU S4,R0,0001 ADDIU V0,V0,FFFF J 8020AE70 SW V0,9108 (S1) LW V0,2C88 (S6) BEQL V0,S3,8020AE60 ADDIU S4,R0,0001 BGTZ V1,8020ADD8 SLTI V0,V1,000D ADDIU S4,R0,0001 ADDU V0,V1,S4 J 8020AE38 SW V0,9108 (S1) BEQ V0,R0,8020AE08 NOP LW V0,9AC8 (S2) LW V0,0240 (V0) ADDIU V0,V0,0001 SLT V0,V1,V0 BEQ V0,R0,8020AE08 NOP ADDIU S4,R0,0001 ADDU V0,V1,S4 J 8020AE38 SW V0,9108 (S1) LW V0,9AC8 (S2) LW A0,4D74 (S8) LW V0,0240 (V0) ADDIU V1,A0,000D SLT V0,V0,V1 BNE V0,R0,8020AE40 SLTI V0,V1,003E BEQ V0,R0,8020AE40 NOP ADDIU S4,R0,0001 ADDU V0,A0,S4 SW V0,4D74 (S8) JAL 802061C0 ADDU A0,R0,R0 LW V0,2C88 (S6) BEQ V0,R0,8020AE74 LUI V0,0200 LW V0,9108 (S1) BNE V0,R0,8020AE74 LUI V0,0200 J 8020AE68 SW S3,9108 (S1) ADDIU T1,R0,FFFE SW T1,9108 (S1) JAL 802061C0 ADDU A0,R0,R0 LUI V0,0200 ORI V0,V0,0004 AND V0,S7,V0 BEQ V0,R0,8020AEB4 LUI V0,0100 LW V0,9108 (S1) SLTI V0,V0,FFFF BEQ V0,R0,8020AEB4 LUI V0,0100 LW V0,2C88 (S6) BNE V0,R0,8020AEB4 LUI V0,0100 ADDIU S4,R0,0001 SW S4,9108 (S1) JAL 802061C0 ADDU A0,R0,R0 LUI V0,0100 ORI V0,V0,0008 AND V0,S7,V0 BEQ V0,R0,8020AEEC LUI V0,0002 LW V0,9108 (S1) SLTI V0,V0,FFFF BNE V0,R0,8020AEEC LUI V0,0002 ADDIU S4,R0,0001 ADDIU T1,R0,FFFE SW T1,9108 (S1) JAL 802061C0 ADDU A0,R0,R0 LUI V0,0002 AND V0,S7,V0 BEQ V0,R0,8020B00C LUI V0,4000 LW A0,9108 (S1) BLEZL A0,8020AFFC LUI A0,0002 LW V0,9AC8 (S2) LW V1,4D74 (S8) LW V0,0240 (V0) ADDU V1,A0,V1 SLT V0,V0,V1 BNE V0,R0,8020AFFC LUI A0,0002 JAL 802061C0 ADDU A0,R0,R0 LW A0,9108 (S1) LW V1,4D74 (S8) LW V0,9AC8 (S2) ADDU A2,A0,V1 ADDU V0,A2,V0 LBU V0,0244 (V0) BEQ V0,S3,8020AF58 NOP LW A0,0340 (SP) LW A1,0344 (SP) JAL 8020F73C NOP LW V1,9108 (S1) LW V0,4D74 (S8) LW A0,9AC8 (S2) ADDU V1,V1,V0 LW V0,0240 (A0) ADDIU A2,V1,FFFF ADDIU V0,V0,FFFF SW V0,0240 (A0) SLTI V0,A2,003F BEQ V0,R0,8020AFD0 NOP LW V1,9AC8 (S2) ADDIU A1,A2,0001 ADDU V0,V1,A1 ADDU V1,V1,A2 LBU V0,0245 (V0) SLL A2,A2,0x3 SB V0,0245 (V1) LW V0,9AC8 (S2) SLL V1,A1,0x3 ADDU V1,V0,V1 LW A0,0040 (V1) ADDU V0,V0,A2 SW A0,0040 (V0) LW V1,0044 (V1) ADDU A2,A1,R0 SW V1,0044 (V0) SLTI V0,A2,003F BNE V0,R0,8020AF84 NOP LW V0,9AC8 (S2) SB R0,0284 (V0) LW V1,9AC8 (S2) SLL V0,A2,0x3 ADDU V0,V1,V0 SW R0,0040 (V0) SW R0,0044 (V0) LBU V0,0288 (V1) ADDIU V0,V0,0001 SB V0,0288 (V1) LUI A0,0002 ;A0= c left LUI T1,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T1,8BDC ;A1=80208BDC LUI V0,4000 AND V0,S7,V0 BEQ V0,R0,8020B058 ADDIU V0,R0,FFFD LW V1,9AC8 (S2) SW V0,9108 (S1) LBU V0,0288 (V1) BNE V0,R0,8020B030 ADDIU V0,R0,FFFC SW V0,9108 (S1) LW V0,2C88 (S6) BNE V0,S3,8020B05C LUI T1,8000 ADDIU V0,R0,FFFB SW V0,9108 (S1) LBU V0,0000 (V1) BNE V0,R0,8020B060 AND V0,S7,T1 ADDIU V0,R0,FFFC SW V0,9108 (S1) LUI T1,8000 AND V0,S7,T1 BEQ V0,R0,8020B700 NOP JAL 802061C0 ADDU A0,R0,R0 LW A0,9108 (S1) ADDIU V0,A0,FFFF SLTIU V0,V0,000D BEQ V0,R0,8020B224 NOP LW A1,9AC8 (S2) LW V1,0240 (A1) BNE V1,R0,8020B0B8 ADDIU V0,R0,0002 LBU V1,0244 (A1) BNE V1,V0,8020B0AC LUI T1,8000 LUI V0,8800 J 8020B0B0 SW V0,0300 (SP) SW T1,0300 (SP) J 8020B0E8 SW R0,0304 (SP) LW V0,4D74 (S8) ADDU A0,A0,V0 ADDIU V0,V1,0001 BNE A0,V0,8020B0D0 ADDIU V0,A0,FFFF ADDIU V0,V1,FFFF SLL V0,V0,0x3 ADDU V0,A1,V0 LW V1,0040 (V0) LW V0,0044 (V0) SW V1,0300 (SP) SW V0,0304 (SP) ADDU A3,R0,R0 LW A0,0310 (SP) LW A1,9108 (S1) LW A2,4D74 (S8) LW V0,2C88 (S6) LUI T1,8024 SW R0,2C7C (T1) SW R0,0014 (SP) JAL 802090C4 SW V0,0010 (SP) ADDU A0,R0,R0 JAL 802088EC ADDU A1,A0,R0 JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP LW A0,0310 (SP) LW A1,9108 (S1) LW A2,4D74 (S8) LW V0,2C88 (S6) ADDU A3,R0,R0 SW R0,0014 (SP) JAL 802090C4 SW V0,0010 (SP) ADDU A0,R0,R0 JAL 802088EC ADDU A1,A0,R0 ADDIU A0,SP,0300 ADDIU A1,SP,0304 ADDIU A2,R0,001C LW A3,9108 (S1) ADDIU V0,R0,006A SW V0,0010 (SP) SLL A3,A3,0x3 JAL 802097E0 ADDIU A3,A3,0051 JAL 80208394 ADDIU A0,R0,0001 LW V1,9108 (S1) LW A2,9AC8 (S2) LW V0,4D74 (S8) LUI T1,8024 SW S3,2C7C (T1) LW A1,0240 (A2) ADDU V1,V1,V0 ADDIU V0,A1,0001 BNEL V1,V0,8020B1E4 ADDIU A1,V1,FFFF SLL V0,A1,0x3 LW V1,0300 (SP) LW A0,0304 (SP) ADDU V0,A2,V0 SW V1,0040 (V0) SW A0,0044 (V0) ADDU V0,A2,A1 SB S3,0245 (V0) LW A0,9AC8 (S2) LW V0,0240 (A0) LBU V1,0288 (A0) ADDIU V0,V0,0001 ADDIU V1,V1,0001 SW V0,0240 (A0) J 8020B700 SB V1,0288 (A0) SLL V0,A1,0x3 LW V1,0300 (SP) LW A0,0304 (SP) ADDU V0,A2,V0 SW V1,0040 (V0) ADDU V1,A2,A1 SW A0,0044 (V0) LBU V0,0245 (V1) BEQ V0,S3,8020B210 ADDIU V0,R0,0002 SB V0,0245 (V1) LW V1,9AC8 (S2) LBU V0,0288 (V1) ADDIU V0,V0,0001 J 8020B700 SB V0,0288 (V1) BNEL A0,R0,8020B3A8 ADDIU V0,R0,FFFF ADDU A1,R0,R0 ADDU A3,A1,R0 LUI T1,8024 LW A0,0310 (SP) LW A2,4D74 (S8) LW V0,2C88 (S6) LUI V1,8022 SW R0,2C7C (T1) SW S3,74E8 (V1) SW R0,0014 (SP) JAL 802090C4 SW V0,0010 (SP) ADDIU A0,R0,FFFF JAL 802083E4 ADDU A1,A0,R0 JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDU A1,R0,R0 LW A0,0310 (SP) LW A2,4D74 (S8) LW V0,2C88 (S6) ADDU A3,A1,R0 SW R0,0014 (SP) JAL 802090C4 SW V0,0010 (SP) ADDIU A0,R0,FFFF JAL 802083E4 ADDU A1,A0,R0 LW T1,0314 (SP) ADDIU A2,R0,001F ADDU V0,T1,A2 SB R0,0000 (V0) ADDIU A2,A2,FFFF BGEZ A2,8020B2A8 ADDIU V0,V0,FFFF LW T1,0344 (SP) BNE T1,R0,8020B2D8 NOP LW V0,9AC8 (S2) LBU V1,0020 (V0) ADDIU V0,R0,002D BEQ V1,V0,8020B328 ADDIU A0,SP,0020 LW V0,9AC8 (S2) LBU V0,0020 (V0) BEQ V0,R0,8020B324 ADDU A2,R0,R0 SLTI V0,A2,0020 BEQ V0,R0,8020B328 ADDIU A0,SP,0020 LW V0,9AC8 (S2) LW T1,0314 (SP) ADDU V0,V0,A2 LBU V1,0020 (V0) ADDU V0,T1,A2 SB V1,0000 (V0) LW V0,9AC8 (S2) ADDIU A2,A2,0001 ADDU V0,V0,A2 LBU V0,0020 (V0) BNE V0,R0,8020B2EC SLTI V0,A2,0020 ADDIU A0,SP,0020 ADDIU A1,R0,0016 ADDIU A2,R0,003E LW V0,9108 (S1) LW V1,4D74 (S8) LW T0,2C88 (S6) LW T1,0310 (SP) ADDIU A3,R0,0110 SW T1,0010 (SP) SW V0,0014 (SP) SW V1,0018 (SP) JAL 80209FC4 SW T0,001C (SP) JAL 80208394 ADDIU A0,R0,0001 LW A1,0310 (SP) JAL 8020A6DC ADDIU A0,SP,0020 LUI T1,8024 SW S3,2C7C (T1) LW T1,0344 (SP) BEQ T1,R0,8020B394 NOP LW V1,9AC8 (S2) LBU V0,0285 (V1) ADDIU V0,V0,0001 J 8020B700 SB V0,0285 (V1) LW V1,9AC8 (S2) LBU V0,0286 (V1) ADDIU V0,V0,0001 J 8020B700 SB V0,0286 (V1) BNE A0,V0,8020B3C0 ADDIU T1,R0,FFFE JAL 8020A9A8 ADDIU A0,SP,0070 J 8020B700 NOP BNE A0,T1,8020B464 ADDIU V0,R0,FFFD LW V0,2C88 (S6) BNE V0,S3,8020B3FC LUI T1,8024 ADDIU A0,R0,000C ;A0=12 times LUI T1,8021 ADDIU A1,T1,8BDC ;A1=80208BDC LUI T1,8024 JAL 8021120C ;call routine A1 A0 times SW S3,2C74 (T1) JAL 8020A9A8 ADDIU A0,SP,0070 J 8020B45C LUI T1,8024 LW V1,9AC8 (S2) SW S3,2C74 (T1) LBU V0,0244 (V1) BNEL V0,S3,8020B414 SB S3,0244 (V1) SB R0,0244 (V1) LW V1,9AC8 (S2) LBU V0,0245 (V1) BEQ V0,S3,8020B42C ADDIU V0,R0,0002 SB V0,0245 (V1) LW V1,9AC8 (S2) ADDIU A0,R0,000C ;A0=12 times LBU V0,0288 (V1) LUI A1,8021 ADDIU A1,A1,8BDC ;A1=80208BDC ADDIU V0,V0,0001 JAL 8021120C ;call routine A1 A0 times SB V0,0288 (V1) LUI A1,8021 ADDIU A1,A1,8BDC ;A1=80208BDC JAL 80211130 ;use handler A1 if buttons A0 pressed LUI A0,8000 ;A0=A button LUI T1,8024 J 8020B700 SW R0,2C74 (T1) BNE A0,V0,8020B540 NOP LW V0,2C88 (S6) BNE V0,S3,8020B538 ADDIU A0,R0,000C ;A0=12 times LUI T1,8021 LW V1,9AC8 (S2) ADDIU A1,T1,8BDC ;A1=80208BDC LBU V0,0288 (V1) LUI T1,8024 ADDIU V0,V0,0001 SB V0,0288 (V1) JAL 8021120C ;call routine A1 A0 times SW S3,2C74 (T1) LW V0,9AC8 (S2) LW V1,0000 (S5) ADDIU S5,S5,0004 SW V1,0000 (V0) ADDIU V0,V0,0004 LW V1,0000 (S5) ADDIU S5,S5,0004 SW V1,0000 (V0) ADDIU V0,V0,0004 LW V1,0000 (S5) ADDIU S5,S5,0004 SW V1,0000 (V0) ADDIU V0,V0,0004 LW V1,0000 (S5) ADDIU S5,S5,0004 SW V1,0000 (V0) ADDIU V0,V0,0004 LW V1,0000 (S5) ADDIU A0,V0,0004 SW V1,0000 (V0) SW R0,0000 (A0) LBU V0,0000 (A0) SLTIU V0,V0,0021 BEQ V0,R0,8020B518 ADDIU S5,S5,0004 SB R0,0000 (A0) ADDIU A0,A0,FFFF LBU V0,0000 (A0) SLTIU V0,V0,0021 BNEL V0,R0,8020B504 SB R0,0000 (A0) LUI T1,8024 SW R0,2C74 (T1) LUI A0,8000 ;A0=A button LUI T1,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T1,8BDC ;A1=80208BDC J 8020B700 NOP BEQ V0,R0,8020B55C NOP LW V1,9108 (S1) ADDIU V0,R0,FFFC BNE V1,V0,8020B6A8 ADDIU V0,R0,FFFB LW V0,2C88 (S6) BNE V0,S3,8020B69C NOP LW V0,2C88 (S6) BNE V0,S3,8020B578 NOP LW V1,9AC8 (S2) LBU V0,0000 (V1) BEQL V0,R0,8020B578 SB R0,0288 (V1) LW V0,9AC8 (S2) LBU V0,0288 (V0) BNEL V0,R0,8020B5A8 ADDIU A0,R0,0001 ;A0=1 time LUI T1,8024 ADDIU A0,R0,000C ;A0=12 times LUI A1,8021 ADDIU A1,A1,8BDC ;A1=80208BDC JAL 8021120C ;call routine A1 A0 times SW S3,2C74 (T1) J 8020B6E8 LUI A0,8000 LUI T1,8021 ADDIU A1,T1,8BDC ;A1=80208BDC LUI T1,8024 JAL 8021120C ;call routine A1 A0 times SW S3,2C74 (T1) LW V0,2C88 (S6) BNE V0,S3,8020B670 ADDU A2,R0,R0 ADDIU A0,SP,0048 LW V0,9AC8 (S2) ADDU V0,V0,A2 LBU V1,0000 (V0) BEQ V1,R0,8020B608 ADDIU V0,V1,FF9F SLTIU V0,V0,001A BEQ V0,R0,8020B5F4 ADDIU V0,V1,FFE0 J 8020B5F8 SB V0,0000 (A0) SB V1,0000 (A0) ADDIU A2,A2,0001 SLTI V0,A2,0020 BNE V0,R0,8020B5CC ADDIU A0,A0,0001 ADDIU A0,SP,0048 ADDU V0,A0,A2 JAL 8020E6E4 SB R0,0000 (V0) ADDU S0,V0,R0 ADDIU T1,R0,FFFE BEQ S0,T1,8020B650 NOP JAL 8020E3C4 NOP LW A1,9AC8 (S2) JAL 8020E970 ADDU A0,S0,R0 JAL 8020E39C ;replace codelist on ROM with revised copy NOP LUI V0,8022 J 8020B658 SW S0,7BE4 (V0) JAL 80208924 ADDIU A0,R0,0005 LUI A0,8000 ;A0=A button LUI T1,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T1,8BDC ;A1=80208BDC J 8020B680 NOP LW A0,0340 (SP) LW A1,0344 (SP) JAL 8020A42C ADDIU A2,SP,0070 JAL 8020E310 NOP LUI T1,8024 LUI A0,8000 SW S3,2C74 (T1) J 8020B6E8 LUI T1,8021 BEQ V0,R0,8020B6BC ADDIU V0,R0,FFFB LW V1,9108 (S1) BNE V1,V0,8020B700 NOP LW V0,2C88 (S6) BNE V0,S3,8020B700 NOP LUI T1,8024 SW S3,2C74 (T1) LUI A1,8021 ADDIU A1,A1,8BDC ;A1=80208BDC JAL 8021120C ;call routine A1 A0 times ADDIU A0,R0,000C ;A0=12 times LUI A1,8021 ADDIU A1,A1,8BDC ;A1=80208BDC JAL 80211130 ;use handler A1 if buttons A0 pressed LUI A0,8000 ;A0=A button LUI A0,4000 ;A0=b button LUI A1,8021 ADDIU A1,A1,8BDC ;A1=80208BDC JAL 80211130 ;use handler A1 if buttons A0 pressed NOP ADDIU T1,R0,0001 SW T1,030C (SP) LW T1,030C (SP) BNE T1,R0,8020B738 ADDIU A0,SP,0070 LW A1,9108 (S1) LW A2,4D74 (S8) LW V0,2C88 (S6) ADDU A3,R0,R0 SW R0,0014 (SP) JAL 802090C4 SW V0,0010 (SP) JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BNE S7,R0,8020B744 ADDIU T1,R0,0001 SW T1,0308 (SP) BEQ S4,R0,8020B768 ADDU A0,S7,R0 ADDIU A1,R0,0008 LUI T1,8021 LW A2,0308 (SP) JAL 802111A0 ADDIU A3,T1,8BDC ADDU S4,R0,R0 SW R0,0308 (SP) LW T1,030C (SP) BEQ T1,R0,8020AC90 ADDIU A0,R0,0001 LUI V0,8022 SW R0,7518 (V0) LUI V0,8022 JAL 8020D410 SW R0,7520 (V0) LUI V0,8022 LW A0,74E4 (V0) JAL 8020F664 NOP LUI V1,8022 SW V0,7530 (V1) LUI V0,8024 LW V1,2C88 (V0) ADDIU V0,R0,0001 BNE V1,V0,8020B7C4 LUI A0,8021 ADDIU A0,A0,8BDC LUI A1,8021 J 8020B7D0 ADDIU A1,A1,BFB0 ADDIU A0,A0,8BDC LUI A1,8021 ADDIU A1,A1,CF08 JAL 8021401C ADDIU A2,R0,0001 LW RA,033C (SP) LW S8,0338 (SP) LW S7,0334 (SP) LW S6,0330 (SP) LW S5,032C (SP) LW S4,0328 (SP) LW S3,0324 (SP) LW S2,0320 (SP) LW S1,031C (SP) LW S0,0318 (SP) JR RA ADDIU SP,SP,0340 8020B808 SB R0,0008 (A1) ADDIU A2,R0,0007 SLL V0,A2,0x2 SRLV V0,A0,V0 ANDI V1,V0,000F SLTIU V0,V1,000A BNE V0,R0,8020B82C ADDIU V0,V1,0030 ADDIU V0,V1,0037 SB V0,0000 (A1) ADDIU A2,A2,FFFF BGEZ A2,8020B810 ADDIU A1,A1,0001 JR RA NOP 8020B844 ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A1,R0 SW S1,0014 (SP) ADDU S1,A2,R0 SW RA,001C (SP) JAL 80210DB4 ;ltoa(A0,A1,0xA) SW S2,0018 (SP) ADDIU S2,R0,0030 JAL 802141F0 ;V0=strlen(A0) ADDU A0,S0,R0 SLTU V0,V0,S1 BEQ V0,R0,8020B8A0 ADDU A0,S1,R0 BLTZL A0,8020B868 SB S2,0000 (S0) ADDU V0,A0,S0 LBU V1,0000 (V0) ADDIU A0,A0,FFFF BGEZ A0,8020B884 SB V1,0001 (V0) J 8020B868 SB S2,0000 (S0) LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020B8B8 ADDIU SP,SP,FFC8 SW S2,0028 (SP) ADDU S2,A0,R0 SW S3,002C (SP) ADDU S3,A1,R0 ADDU A0,A2,R0 ADDIU A1,SP,0010 SW S4,0030 (SP) ADDU S4,A3,R0 SW RA,0034 (SP) SW S1,0024 (SP) JAL 80210DB4 ;ltoa(A0,A1,0xA) SW S0,0020 (SP) ADDIU S0,SP,0010 ADDIU S1,R0,0030 JAL 802141F0 ;V0=strlen(A0) ADDIU A0,SP,0010 SLTIU V0,V0,0005 BEQ V0,R0,8020B928 ADDIU A0,R0,0005 ADDU V0,A0,S0 ADDU V1,S0,A0 LBU V1,0000 (V1) ADDIU A0,A0,FFFF BGEZ A0,8020B908 SB V1,0001 (V0) J 8020B8F4 SB S1,0010 (SP) ADDU A0,S2,R0 ADDU A1,S3,R0 ADDIU A2,SP,0010 JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDU A3,S4,R0 LW RA,0034 (SP) LW S4,0030 (SP) LW S3,002C (SP) LW S2,0028 (SP) LW S1,0024 (SP) LW S0,0020 (SP) JR RA ADDIU SP,SP,0038 8020B95C ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A0,R0 SW S0,0010 (SP) SW RA,0018 (SP) JAL 802141F0 ;V0=strlen(A0) ADDU S0,R0,R0 ADDU A0,V0,R0 BEQ A0,R0,8020B9B8 ADDU V0,S0,R0 BLEZ A0,8020B9B8 ADDU A1,R0,R0 ADDIU A0,A0,FFFF ADDU V0,S1,A1 ADDIU A1,A1,0001 LBU V1,0000 (V0) SLL V0,S0,0x2 ADDU V0,V0,S0 SLL S0,V0,0x1 ADDIU V1,V1,FFD0 BGTZ A0,8020B98C ADDU S0,S0,V1 ADDU V0,S0,R0 LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020B9CC ADDIU A0,SP,0010 LUI V0,8025 LW V0,977C (V0) ADDIU SP,SP,FF08 SW S1,00EC (SP) ADDU S1,A0,R0 SW S2,00F0 (SP) ADDU S2,A1,R0 SW S0,00E8 (SP) ADDU S0,A2,R0 BEQ V0,R0,8020BA70 SW RA,00F4 (SP) ADDIU A0,R0,0005 ADDIU A1,R0,00C8 LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table LW A3,0364 (V0) ;A3=str+364: 80223710 "Options" LW V1,049C (V0) ;V1=str+49C: 80223010 "Add New Game" LW T0,044C (V0) ;T0=str+44C: 802230F8 "Save Codes To Memory Card" LW T1,0450 (V0) ;T1=str+450: 802230DC "Load Codes From Memory Card" LW V0,00BC (V0) ;V0=str+BC: 80224110 "Exit" ADDIU A2,SP,0020 SW V1,0010 (SP) SW T0,0014 (SP) SW T1,0018 (SP) JAL 802137A4 SW V0,001C (SP) ADDIU S0,S0,0018 ADDU A0,S0,R0 ADDIU A1,R0,0032 ADDIU A2,R0,001C ADDIU A3,R0,0004 SW R0,0010 (SP) SW S1,0014 (SP) JAL 80212E3C SW S2,0018 (SP) ADDU A0,S0,R0 ADDIU A1,R0,0032 ADDIU A2,R0,001C J 8020BAD8 ADDIU A3,R0,0004 ADDIU A0,R0,0004 ADDIU A1,R0,00C8 LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table LW A3,0364 (V0) ;A3=str+364: 80223710 "Options" LW V1,049C (V0) ;V1=str+49C: 80223010 "Add New Game" LW T0,0450 (V0) ;T0=str+450: 802230DC "Load Codes From Memory Card" LW V0,00BC (V0) ;V0=str+BC: 80224110 "Exit" ADDIU A2,SP,0020 SW V1,0010 (SP) SW T0,0014 (SP) JAL 802137A4 SW V0,0018 (SP) ADDIU S0,S0,0018 ADDU A0,S0,R0 ADDIU A1,R0,0032 ADDIU A2,R0,001C ADDIU A3,R0,0003 SW R0,0010 (SP) SW S1,0014 (SP) JAL 80212E3C SW S2,0018 (SP) ADDU A0,S0,R0 ADDIU A1,R0,0032 ADDIU A2,R0,001C ADDIU A3,R0,0003 ADDIU V0,SP,0020 SW S1,0010 (SP) SW S2,0014 (SP) JAL 80213820 SW V0,0018 (SP) LW RA,00F4 (SP) LW S2,00F0 (SP) LW S1,00EC (SP) LW S0,00E8 (SP) JR RA ADDIU SP,SP,00F8 8020BB04 ADDIU SP,SP,FF90 SW S8,0068 (SP) ADDU S8,A2,R0 SW S4,0058 (SP) SW A0,0070 (SP) ADDU S4,A0,R0 SW RA,006C (SP) SW S7,0064 (SP) SW S6,0060 (SP) SW S5,005C (SP) SW S3,0054 (SP) SW S2,0050 (SP) SW S1,004C (SP) SW S0,0048 (SP) JAL 8020E588 ;V0=#games in current codelist SW A1,0074 (SP) LUI A0,8022 ADDIU A0,A0,2A50 ADDU S7,V0,R0 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDU A1,S7,R0 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP BNEL S8,R0,8020BB74 ADDIU A0,S8,000E JAL 80212B20 ADDIU A0,R0,0001 ADDIU A0,S8,000E ADDIU A1,R0,000E LUI V0,8022 LW A3,772C (V0) ADDIU A2,R0,001F JAL 80212C90 SW R0,0010 (SP) LUI A0,8022 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,2A68 LUI V1,8022 LW V0,7510 (V1) ADDIU V0,V0,0001 SW V0,7510 (V1) SLTI V0,V0,0008 BEQL V0,R0,8020BBB4 SW R0,7510 (V1) LUI S1,8022 LW V1,7518 (S1) BEQ V1,R0,8020BBF8 LUI V0,8022 LW A0,751C (V0) LUI V0,8025 ADDIU S0,R0,0140 SUBU A2,S0,S8 LW A1,9104 (V0) JAL 8020B9D0 SUBU A2,A2,V1 LW V0,7518 (S1) BEQ V0,S0,8020BBF8 LUI V1,8022 SUBU S8,R0,V0 ADDIU V0,R0,0001 SW V0,7524 (V1) LUI A0,8022 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,2A74 LUI V0,8022 LW V1,7518 (V0) ADDIU V0,R0,0140 BEQ V1,V0,8020BEB0 ADDIU A1,R0,0022 ADDIU S3,R0,0006 ADDU S6,R0,R0 ADDIU A0,R0,000E SUBU A0,A0,S8 ADDIU A2,R0,001F ADDIU S5,R0,0001 LUI T0,8022 ADDIU T0,T0,7660 ;T0=80227660: string pointer table LW A3,0028 (T0) ;A3=str+30: 802242E8 "--- New Game ---" LUI V0,8022 SW S8,7650 (V0) JAL 80212C90 SW R0,0010 (SP) LW T0,0070 (SP) ADDIU V0,S7,FFFB SLT V0,V0,T0 SW V0,0040 (SP) ADDIU V0,T0,0005 SUBU V0,V0,S7 SW V0,0044 (SP) ADDIU V0,R0,0001 BNE S5,V0,8020BC98 ADDIU A0,S8,0010 SW R0,0010 (SP) ADDIU T0,R0,003B ADDIU A1,T0,FFFA ADDIU A2,R0,0120 JAL 80213364 ADDIU A3,R0,0062 ADDU S3,R0,R0 LUI S6,7BDE ORI S6,S6,7BDE ;S6=7BDE7BDE: grey 50% LW T0,0070 (SP) SLTI V0,T0,0006 BNE V0,R0,8020BCB0 SLTI V0,S7,000B BEQ V0,R0,8020BD58 NOP BNE S6,R0,8020BCD8 ADDIU A0,R0,003B LUI T0,8022 ADDIU T0,T0,7660 ;T0=80227660: string pointer table LW A1,0030 (T0) ;A1=str+30: 802242E8 "--- New Game ---" ADDU A2,R0,R0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S3,R0 J 8020BD7C ADDU A0,R0,R0 LW T0,0074 (SP) BEQ T0,R0,8020BD28 LUI A2,7BDE BNE S4,R0,8020BD10 ADDIU A0,R0,003B LUI T0,8022 ADDIU T0,T0,7660 ;T0=80227660: string pointer table LW A1,0030 (T0) ;A1=str+30: 802242E8 "--- New Game ---" LUI A2,FFC0 ORI A2,A2,FFC0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDIU A3,R0,0001 J 8020BD7C ADDU A0,R0,R0 LUI T0,8022 ADDIU T0,T0,7660 ;T0=80227660: string pointer table LW A1,0030 (T0) ;A1=str+30: 802242E8 "--- New Game ---" LUI A2,7BDE J 8020BD48 ORI A2,A2,7BDE ;A2=7BDE7BDE: grey 50% BNE S4,R0,8020BD38 ORI A2,A2,7BDE ;A2=7BDE7BDE: grey 50% LUI A2,FFFE ORI A2,A2,FFFE ;A2=FFFEFFFE: white LUI T0,8022 ADDIU T0,T0,7660 ;T0=80227660: string pointer table LW A1,0030 (T0) ;A1=str+30: 802242E8 "--- New Game ---" ADDIU A0,R0,003B JAL 80210EF4 ;print A1 centered on line A0 in colour A2 NOP J 8020BD7C ADDU A0,R0,R0 LW T0,0040 (SP) BEQ T0,R0,8020BD70 ADDIU A0,S7,FFF6 LW T0,0044 (SP) J 8020BD7C ADDIU S4,T0,0005 LW T0,0070 (SP) ADDIU S4,R0,0005 ADDIU A0,T0,FFFB ADDU S1,R0,R0 ADDIU S0,R0,003B ADDU S2,A0,R0 SLT V0,S7,S1 BNEL V0,R0,8020BE94 ADDIU S5,S5,0001 BNE S2,R0,8020BDB8 LUI A0,8022 LUI T0,8022 ADDIU T0,T0,7660 ;T0=80227660: string pointer table LW A1,0030 (T0) ;A1=str+30: 802242E8 "--- New Game ---" JAL 8021109C ;strcpy(A0,A1) ADDIU A0,SP,0018 J 8020BDDC NOP JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,2A80 ADDU A0,S2,R0 JAL 8020FB14 ADDIU A1,SP,0018 LUI A0,8022 ADDIU A0,A0,2A88 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A1,SP,0018 BNE S1,S4,8020BDF8 ADDU A0,S0,R0 ADDIU A1,SP,0018 LUI T0,8022 LW A3,7510 (T0) JAL 80213F44 ADDU A2,S3,R0 BNE S6,R0,8020BE0C ADDU A0,S0,R0 ADDIU A1,SP,0018 J 8020BE74 ADDU A2,R0,R0 LW T0,0074 (SP) BEQ T0,R0,8020BE5C LUI A2,7BDE BNE S1,S4,8020BE4C ADDU A0,S0,R0 BNE S2,R0,8020BE3C ADDIU A1,SP,0018 ADDU A0,S0,R0 LUI A2,FFA0 ORI A2,A2,FFA0 J 8020BE78 ADDIU A3,R0,0001 LUI A2,FFC0 ORI A2,A2,FFC0 J 8020BE78 ADDIU A3,R0,0001 ADDIU A1,SP,0018 LUI A2,7BDE J 8020BE74 ORI A2,A2,7BDE ;A2=7BDE7BDE: grey 50% BNE S1,S4,8020BE6C ORI A2,A2,7BDE ;A2=7BDE7BDE: grey 50% LUI A2,FFFE ORI A2,A2,FFFE ADDU A0,S0,R0 ADDIU A1,SP,0018 ADDU A3,S3,R0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDIU S0,S0,0008 ADDIU S1,S1,0001 SLTI V0,S1,000B BNE V0,R0,8020BD88 ADDIU S2,S2,0001 ADDIU S5,S5,0001 SLTI V0,S5,0002 BNE V0,R0,8020BC6C ADDIU V0,R0,0001 LUI V0,8022 LW V0,7524 (V0) BNEL V0,R0,8020BEB0 ADDU S8,R0,R0 LUI A0,8022 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,2A8C LUI V0,8022 LW V0,74D0 (V0) BNE V0,R0,8020BEE0 LUI V0,8022 LW A0,0070 (SP) LW A1,0074 (SP) JAL 8020C068 ADDU A2,S8,R0 LUI V0,8022 LW V0,7524 (V0) BNEL V0,R0,8020BEF8 LUI A0,8022 JAL 8021433C SLTU A0,R0,S8 LUI A0,8022 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDIU A0,A0,2A98 LW RA,006C (SP) LW S8,0068 (SP) LW S7,0064 (SP) LW S6,0060 (SP) LW S5,005C (SP) LW S4,0058 (SP) LW S3,0054 (SP) LW S2,0050 (SP) LW S1,004C (SP) LW S0,0048 (SP) JR RA ADDIU SP,SP,0070 8020BF30 ADDIU SP,SP,FFC0 LUI V0,8022 ADDIU V0,V0,2AA8 LUI A3,8022 ADDIU A3,A3,2AA4 SW V0,0010 (SP) LUI V0,8022 ADDIU V0,V0,2AAC SW V0,0020 (SP) LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table LUI V1,8022 SW RA,0038 (SP) SW A3,0018 (SP) SW A3,0028 (SP) LW A0,0044 (V0) ;A0=str+44: 802242AC ":Delete" LW A1,04BC (V0) ;A1=str+4BC: 80222F34 "Press 'Z' to save/load to memory pak. " LW A2,0078 (V0) ;A2=str+78: 802241F0 ":Return To Main Menu" LW T0,0378 (V0) ;T0=str+378: 80223664 "Press the Start button to go to the Start Game menu" ADDIU V1,V1,2AB0 SW V1,0030 (SP) SW A0,0014 (SP) ADDU A0,R0,R0 SW A1,001C (SP) SW A2,0024 (SP) SW T0,002C (SP) LW A2,028C (V0) ;A2=str+28C: 80223A74 "Use up/down and 'A' to select" JAL 80214210 ADDIU A1,R0,000A LW RA,0038 (SP) JR RA ADDIU SP,SP,0040 8020BFB0 LUI V0,8025 LUI V1,8022 SUBU A2,R0,A0 LW A0,977C (V0) LW A1,7520 (V1) ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8020BB04 NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8020BFE0 ADDIU SP,SP,FFD8 SW S0,0018 (SP) ADDU S0,A0,R0 SW RA,0024 (SP) SW S2,0020 (SP) BNE S0,R0,8020C004 SW S1,001C (SP) JAL 80212B20 ADDIU A0,R0,0001 ADDIU A0,R0,000E SUBU A0,A0,S0 ADDIU A1,R0,000E LUI V0,8022 LW A3,772C (V0) ADDIU A2,R0,001F JAL 80212C90 SW R0,0010 (SP) LUI S2,8022 LUI S1,8025 SUBU S0,R0,S0 LW A0,751C (S2) LW A1,9104 (S1) JAL 8020B9D0 ADDU A2,S0,R0 LW A0,751C (S2) LW A1,9104 (S1) JAL 8020C068 ADDU A2,S0,R0 LW RA,0024 (SP) LW S2,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0028 8020C068 LUI V0,8022 LW V0,7524 (V0) ;V0=80227524: ADDIU SP,SP,FF98 SW S5,0054 (SP) ADDU S5,A2,R0 SW RA,0064 (SP) SW S8,0060 (SP) SW S7,005C (SP) SW S6,0058 (SP) SW S4,0050 (SP) SW S3,004C (SP) SW S2,0048 (SP) SW S1,0044 (SP) BEQ V0,R0,8020C0A8 SW S0,0040 (SP) ADDU S5,R0,R0 JAL 8020E588 ;V0=#games in current codelist ADDU S0,R0,R0 LUI A0,8022 ADDIU A0,A0,2AB4 ADDU S2,V0,R0 JAL 80217B54 ;A0->SP+0, A1->SP+4, A2->SP+8, A3->SP+C ADDU A1,S2,R0 BEQ S2,R0,8020C0E4 SLL V0,S0,0x1 JAL 8020E6B8 NOP LUI V1,8022 LW V1,7570 (V1) ;V1=80227570: p->cur.codelist SUBU S0,V0,V1 ;S0=last-first entry in list SLL V0,S0,0x1 ADDU V0,V0,S0 SLL V0,V0,0x3 ADDU V0,V0,S0 SLL V1,V0,0x2 ;V1=S0*0x64: 100*difference in size LUI V0,0001 SLT V0,V0,V1 ;TRUE if less than 100% BEQ V0,R0,8020C120 ;branch if space completely filled ADDIU S3,R0,0064 ;S3=0x64: 100 BGEZL V1,8020C118 SRA V1,V1,0x10 ORI V0,R0,FFFF ADDU V1,V1,V0 SRA V1,V1,0x10 ADDIU V0,R0,0064 SUBU S3,V0,V1 BLTZL S3,8020C128 ADDU S3,R0,R0 SLTI V0,S3,0065 BEQL V0,R0,8020C134 ADDU S3,R0,R0 ADDIU S1,R0,0006 ADDU S0,R0,R0 LUI V0,8022 LUI V1,8022 LW A0,7BE4 (V1) SUBU V1,R0,S5 BEQ A0,R0,8020C15C SW V1,7650 (V0) BNE S2,R0,8020C164 NOP J 8020C16C SB R0,0018 (SP) JAL 8020FB14 ADDIU A1,SP,0018 ADDIU S2,R0,0001 ADDU S8,S2,R0 ADDIU S7,R0,0010 LUI V0,8022 ADDIU S4,V0,7660 ;S4=80227660: string pointer table LUI S6,8022 BNE S2,S8,8020C1B4 LUI V0,8022 SW R0,0010 (SP) SUBU A0,S7,S5 ADDIU A1,R0,0099 ADDIU A2,R0,0120 JAL 80213364 ADDIU A3,R0,0038 ADDU S1,R0,R0 LUI S0,FFC0 ORI S0,S0,FFC0 LUI V0,8022 LW V0,7BE4 (V0) BNE V0,R0,8020C1EC ADDIU A0,R0,00A5 ADDU A2,S0,R0 LW A1,0014 (S4) ;A1=str+14: 80224354 "No Game Selected" JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S1,R0 ADDIU A0,R0,00AF ADDU A2,S0,R0 LW A1,0018 (S4) ;A1=str+18: 8022433C "No Cheat Codes Are On" JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S1,R0 J 8020C21C SLTI V0,S3,0004 ADDIU A1,SP,0018 ADDU A2,S0,R0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S1,R0 LW A0,7534 (S6) LW A1,001C (S4) ;A1=str+1C: 80224328 "Cheat Codes Are On" LW A2,00E8 (S4) ;A2=str+E8: 80224040 "Cheat Code Is On" ADDIU A3,R0,00AF SW S0,0010 (SP) JAL 80210FA0 ;print (A0>1 ? A1:A2) centered on line A3 in colour SP+10 SW S1,0014 (SP) SLTI V0,S3,0004 BEQ V0,R0,8020C22C ADDU A0,S3,R0 LUI S0,F800 ORI S0,S0,F800 ;S0=F800F800: red ADDIU A3,R0,00BE LW A1,0348 (S4) ;A1=str+348: 80223780 "% Code Space Free" ADDIU S2,S2,0001 SW S0,0010 (SP) SW S1,0014 (SP) JAL 80210FA0 ;print (A0>1 ? A1:A2) centered on line A3 in colour SP+10 ADDU A2,A1,R0 SLTI V0,S2,0002 BNE V0,R0,8020C184 LUI V0,8022 LW RA,0064 (SP) LW S8,0060 (SP) LW S7,005C (SP) LW S6,0058 (SP) LW S5,0054 (SP) LW S4,0050 (SP) LW S3,004C (SP) LW S2,0048 (SP) LW S1,0044 (SP) LW S0,0040 (SP) SW R0,7650 (V0) JR RA ADDIU SP,SP,0068 8020C288 ADDIU SP,SP,FFE8 LUI V0,8025 LW A0,977C (V0) LUI V0,8022 LW A1,7520 (V0) SW RA,0010 (SP) JAL 8020BB04 ADDU A2,R0,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDIU A0,R0,000C ;A0=12 times LUI A1,8021 JAL 8021120C ;call routine A1 A0 times ADDIU A1,A1,BFB0 ;A1=8020BFB0 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8020C2D4 LUI V0,8025 LW V1,977C (V0) ADDIU SP,SP,FFE8 BEQ V1,R0,8020C2F8 SW RA,0010 (SP) LUI V0,8022 SW V1,74E4 (V0) JAL 8020D410 ADDU A0,R0,R0 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8020C304 ADDIU SP,SP,FFD0 SW S4,0020 (SP) ADDU S4,A0,R0 SW S1,0014 (SP) ADDIU S1,R0,0003 LUI A0,8022 LUI V0,8022 LW V1,7C10 (V0) ADDIU V0,R0,0001 SW RA,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW S0,0010 (SP) BNE V1,V0,8020C448 SW R0,7518 (A0) ADDU S0,V0,R0 LUI S3,5555 ORI S3,S3,5556 ADDU S2,A0,R0 ADDIU S6,R0,0140 LUI S5,8025 MULT S1,S3 SRA V0,S1,0x1F MFHI A3 SUBU V0,A3,V0 ADDU S0,S0,V0 SLTI V0,S0,0141 BEQL V0,R0,8020C380 ADDIU S0,R0,0140 BNE S4,R0,8020C390 SUBU V0,S6,S0 J 8020C394 SW S0,7518 (S2) SW V0,7518 (S2) LW A0,977C (S5) ADDU A1,R0,R0 ADDU A2,A1,R0 JAL 8020BB04 ADDIU S1,S1,0001 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP SLTI V0,S0,0140 MULT S1,S3 BNE V0,R0,8020C364 NOP ADDIU S1,R0,0003 LUI S3,5555 ORI S3,S3,5556 LUI S2,8022 ADDIU S6,R0,0140 LUI S5,8025 MULT S1,S3 SRA V0,S1,0x1F MFHI A3 SUBU V0,A3,V0 ADDU S0,S0,V0 SLTI V0,S0,0141 BEQL V0,R0,8020C400 ADDIU S0,R0,0140 BNE S4,R0,8020C410 SUBU V0,S6,S0 J 8020C414 SW S0,7518 (S2) SW V0,7518 (S2) LW A0,977C (S5) ADDU A1,R0,R0 ADDU A2,A1,R0 JAL 8020BB04 ADDIU S1,S1,0001 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP SLTI V0,S0,0140 MULT S1,S3 BNE V0,R0,8020C3E4 NOP LUI V1,8022 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) ADDIU V0,R0,0140 SW V0,7518 (V1) JR RA ADDIU SP,SP,0030 8020C47C ADDIU SP,SP,FFE0 SW S1,0014 (SP) LUI V1,8025 LUI V0,8024 ADDIU T0,V0,EF78 ADDIU A3,V1,9130 LWL A1,0000 (T0) LWR A1,0003 (T0) LWL A2,0004 (T0) LWR A2,0007 (T0) SWL A1,0000 (A3) SWR A1,0003 (A3) SWL A2,0004 (A3) SWR A2,0007 (A3) LWL A1,0008 (T0) LWR A1,000B (T0) LB A2,000C (T0) SWL A1,0008 (A3) SWR A1,000B (A3) SB A2,000C (A3) LUI V1,8022 LUI V0,8024 SW RA,0018 (SP) SW S0,0010 (SP) ADDIU T0,V0,EF88 ADDIU A3,V1,537C LWL A1,0000 (T0) LWR A1,0003 (T0) LB A2,0004 (T0) SWL A1,0000 (A3) SWR A1,0003 (A3) SB A2,0004 (A3) LB A1,0005 (T0) SB A1,0005 (A3) JAL 80201E64 ;V0=TRUE if controller 1 slot filled ADDU S1,A0,R0 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM ADDU S0,V0,R0 BEQ S0,R0,8020C570 NOP BEQ S1,R0,8020C538 LUI V0,8025 LW A0,977C (V0) JAL 80221178 NOP J 8020C57C LUI V0,8022 JAL 80220F94 ADDU A0,S0,R0 ADDU V1,V0,R0 BEQ V1,R0,8020C550 LUI V0,8025 SW V1,977C (V0) LUI V0,8025 LW V0,977C (V0) BLEZ V0,8020C57C LUI V0,8022 JAL 8020C2D4 NOP J 8020C57C LUI V0,8022 JAL 80220D20 NOP LUI V0,8022 SW R0,7518 (V0) LUI V0,8022 JAL 80220A50 SW R0,7524 (V0) LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020C5A0 ADDIU SP,SP,FFC8 SW S7,002C (SP) ADDIU S7,R0,0001 SW S6,0028 (SP) ADDU S6,S7,R0 SW S3,001C (SP) LUI S3,8021 SW S4,0020 (SP) ADDIU S4,S3,BFB0 ADDU A0,S4,R0 LUI A1,8021 ADDIU A1,A1,BFE0 ADDU A2,R0,R0 SW S0,0010 (SP) LUI S0,8022 SW S1,0014 (SP) LUI S1,8025 SW S2,0018 (SP) LUI S2,8022 SW RA,0034 (SP) SW S8,0030 (SP) SW S5,0024 (SP) SW R0,751C (S0) SW R0,9104 (S1) JAL 8021401C SW S7,7524 (S2) ADDU S5,S0,R0 ADDU S8,S1,R0 ADDU S1,S7,R0 LUI V1,8022 ADDIU V0,R0,0140 SW R0,7524 (S2) SW V0,7518 (V1) JAL 80210D4C ;V0=button and stick pos NOP ADDU S0,V0,R0 LUI V0,0800 ORI V0,V0,0002 AND V0,S0,V0 BEQ V0,R0,8020C664 LUI V0,0400 LW V0,751C (S5) BLEZ V0,8020C660 ADDIU V0,V0,FFFF SW V0,751C (S5) ADDIU S6,R0,0001 JAL 802061C0 ADDU A0,R0,R0 LUI V0,0400 ORI V0,V0,0001 AND V0,S0,V0 BEQ V0,R0,8020C6C0 LUI T0,8025 LW V0,977C (T0) BNE V0,R0,8020C698 NOP LW V0,751C (S5) SLTI V0,V0,0002 BNEL V0,R0,8020C6AC ADDIU S6,R0,0001 J 8020C6C4 LUI V0,4000 LW V0,751C (S5) SLTI V0,V0,0003 BEQ V0,R0,8020C6C4 LUI V0,4000 ADDIU S6,R0,0001 LW V0,751C (S5) ADDU A0,R0,R0 ADDU V0,V0,S6 JAL 802061C0 SW V0,751C (S5) LUI V0,4000 AND V0,S0,V0 BEQ V0,R0,8020C6F0 LUI A0,4000 ;A0=B button ADDIU A1,S3,BFB0 ;A1=8020BFB0 ADDIU T0,R0,0003 SW T0,751C (S5) SW S1,9104 (S8) JAL 80211130 ;use handler A1 if buttons A0 pressed SW S1,7524 (S2) LUI S0,8000 SW R0,7524 (S2) BGEZ S0,8020C7D8 ADDU A1,R0,R0 LUI A0,8000 ;A0=A button ADDU A1,S4,R0 ;A1=8020BFB0 SW S1,9104 (S8) JAL 80211130 ;use handler A1 if buttons A0 pressed SW S1,7524 (S2) ADDU A0,R0,R0 JAL 802061C0 SW R0,7524 (S2) LUI T0,8025 LW V0,977C (T0) BEQ V0,R0,8020C77C NOP LW V1,751C (S5) BEQ V1,S1,8020C764 SLTI V0,V1,0002 BEQ V0,R0,8020C74C ADDIU V0,R0,0002 BEQ V1,R0,8020C828 ADDIU V0,R0,0001 J 8020C7D4 SW R0,9104 (S8) BEQ V1,V0,8020C790 ADDIU T0,R0,0003 BEQ V1,T0,8020C76C LUI A0,8021 J 8020C7D4 SW R0,9104 (S8) J 8020C794 ADDIU A0,R0,0001 ADDIU A0,A0,BFE0 ADDU A1,S4,R0 J 8020C7B8 ADDIU A2,R0,0001 LW V0,751C (S5) BEQL V0,R0,8020C828 ADDIU V0,R0,0001 BNE V0,S1,8020C7A4 LUI A0,8021 ADDU A0,R0,R0 JAL 8020C47C NOP J 8020C828 ADDU V0,R0,R0 ADDIU A0,A0,BFE0 ADDIU A1,S3,BFB0 ADDIU A2,R0,0001 ADDIU V0,R0,0002 SW V0,751C (S5) LUI V0,8022 SW R0,7518 (V0) JAL 8021401C SW S1,7524 (S2) ADDU V0,R0,R0 J 8020C828 SW R0,7524 (S2) ADDU A1,R0,R0 LUI T0,8025 LW A0,977C (T0) ADDU A2,A1,R0 JAL 8020BB04 SW S1,7524 (S2) JAL 8021110C ;unconditional return SW R0,7524 (S2) JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BEQ S6,R0,8020C624 ADDU A0,S0,R0 ADDIU A1,R0,0005 ADDU A2,S7,R0 ADDIU A3,S3,BFB0 JAL 802111A0 SW S1,7524 (S2) ADDU S6,R0,R0 ADDU S7,S6,R0 J 8020C624 SW R0,7524 (S2) LW RA,0034 (SP) LW S8,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 8020C858 ADDIU SP,SP,FFE8 LUI V0,8025 ADDU A1,R0,R0 LW A0,977C (V0) ADDIU A2,R0,0001 SW RA,0014 (SP) JAL 8020AB68 SW S0,0010 (SP) JAL 8020E310 LUI S0,8022 JAL 8020BF30 NOP JAL 8020E588 ;V0=#games in current codelist NOP LW RA,0014 (SP) SW V0,7BE8 (S0) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 8020C8A4 ADDIU SP,SP,FFC0 ADDIU T0,R0,0001 SW S7,0034 (SP) ADDU S7,R0,R0 SW S4,0028 (SP) ADDU S4,S7,R0 SW S5,002C (SP) ADDU S5,S7,R0 SW S1,001C (SP) LUI S1,8025 SW A0,977C (S1) LUI A0,8021 ADDIU A0,A0,18BC SW S2,0020 (SP) LUI S2,8021 SW S3,0024 (SP) ADDIU S3,S2,BFB0 ADDU A1,S3,R0 ADDU A2,S7,R0 SW S0,0018 (SP) LUI S0,8022 SW RA,003C (SP) SW S8,0038 (SP) SW S6,0030 (SP) SW T0,0010 (SP) JAL 8021401C SW R0,7520 (S0) JAL 8020BF30 LUI S6,8022 JAL 80210D30 ;V0=button and stick pos for controller 1 ADDU S8,S0,R0 LUI S3,8022 JAL 80210D4C ;V0=button and stick pos NOP ADDU S0,V0,R0 LUI V0,1000 AND V0,S0,V0 BEQ V0,R0,8020C9D4 LUI V0,0800 JAL 802061C0 ADDU A0,R0,R0 LW V0,977C (S1) BNEL V0,R0,8020C954 SW V0,7BE4 (S6) ADDIU T0,R0,0001 JAL 8020C288 SW T0,7520 (S8) LUI A1,8021 ADDIU A1,A1,BFB0 ;A1=8020BFB0 JAL 80211130 ;use handler A1 if buttons A0 pressed LUI A0,1000 ;A0=Start button LW A0,7BE4 (S6) LUI A1,8021 ADDIU A1,A1,BFB0 JAL 8020DFF8 NOP LUI V1,8025 LW V1,91DC (V1) ADDU S4,V0,R0 BNE S4,V1,8020C9AC LUI A0,8021 ADDIU A0,A0,DFC0 LUI A1,8021 ADDIU A1,A1,BFB0 JAL 8021401C ADDIU A2,R0,0001 BNE S4,R0,8020C9BC ADDIU T0,R0,0001 J 8020C9C8 ADDIU S4,R0,FFFF BNEL S4,T0,8020C9D0 SW R0,7520 (S8) ADDIU S4,R0,FFFE ADDIU S7,R0,0001 SW R0,7520 (S8) LUI V0,0800 ORI V0,V0,0002 AND V0,S0,V0 BEQ V0,R0,8020CA0C LUI V0,0400 LW V0,977C (S1) BLEZ V0,8020CA08 ADDIU V0,V0,FFFF ADDIU S5,R0,0001 SW V0,977C (S1) JAL 802061C0 ADDU A0,R0,R0 JAL 8020C2D4 NOP LUI V0,0400 ORI V0,V0,0001 AND V0,S0,V0 BEQ V0,R0,8020CA4C NOP LW V1,977C (S1) LW V0,7BE8 (S3) SLT V0,V1,V0 BEQ V0,R0,8020CA4C NOP ADDIU S5,R0,0001 ADDU V0,V1,S5 SW V0,977C (S1) JAL 802061C0 ADDU A0,R0,R0 JAL 8020C2D4 NOP BGEZ S0,8020CB08 LUI V0,0002 JAL 802061C0 ADDU A0,R0,R0 LW V0,977C (S1) ADDIU T0,R0,0001 BNE V0,R0,8020CA9C SW T0,7520 (S8) JAL 8020C288 ADDIU S5,R0,0001 LUI A0,8000 ;A0=A button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S2,BFB0 ;A1=8020BFB0 JAL 8020C858 NOP LW V0,7BE4 (S6) JAL 8020C2D4 SW V0,977C (S1) J 8020CB04 SW R0,7520 (S8) JAL 8020C288 SW V0,7BE4 (S6) LUI A1,8021 ADDIU A1,A1,BFB0 ;A1=8020BFB0 JAL 80211130 ;use handler A1 if buttons A0 pressed LUI A0,8000 ;A0=A button LW A0,977C (S1) JAL 8020D574 NOP ADDU V1,V0,R0 ADDIU V0,V1,0002 SLTIU V0,V0,0002 BEQ V0,R0,8020CADC ADDU S4,V1,R0 J 8020CB00 ADDIU S7,R0,0001 LUI A0,8021 ADDIU A0,A0,CF08 LUI A1,8021 ADDIU A1,A1,BFB0 JAL 8021401C ADDIU A2,R0,0001 JAL 8020BF30 NOP LW S4,977C (S1) SW R0,7520 (S8) LUI V0,0002 AND V0,S0,V0 BEQ V0,R0,8020CBCC LUI V0,0010 LW V0,977C (S1) BLEZ V0,8020CBB4 ADDIU T0,R0,0001 SW T0,7520 (S8) JAL 802061C0 ADDU A0,R0,R0 JAL 8020C288 NOP JAL 802089EC ADDIU A0,S2,BFB0 BEQ V0,R0,8020CBA4 NOP LW A0,977C (S1) JAL 8020E5F0 NOP LW A0,977C (S1) LW V1,7BE4 (S6) SLT V0,A0,V1 BEQ V0,R0,8020CB6C ADDIU V0,V1,FFFF J 8020CB74 SW V0,7BE4 (S6) BEQL A0,V1,8020CB74 SW R0,7BE4 (S6) LW V1,977C (S1) LW V0,7BE8 (S3) BNE V1,V0,8020CB88 ADDIU V0,V1,FFFF SW V0,977C (S1) JAL 8020E588 ;V0=#games in current codelist NOP JAL 8020E39C ;replace codelist on ROM with revised copy SW V0,7BE8 (S3) LUI A0,8000 ;A0=A button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S2,BFB0 ;A1=8020BFB0 JAL 8020C2D4 SW R0,7520 (S8) J 8020CBCC LUI V0,0010 JAL 802061C0 ADDIU A0,R0,0001 LUI A0,0002 ;A0=c left JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S2,BFB0 ;A1=8020BFB0 LUI V0,0010 AND V0,S0,V0 BEQ V0,R0,8020CC1C LUI V0,0020 LW V1,7BE8 (S3) LW A0,977C (S1) ADDIU V0,V1,FFFB SLT V0,V0,A0 BNE V0,R0,8020CBFC ADDIU V0,A0,0005 ADDIU S5,R0,0001 J 8020CC08 SW V0,977C (S1) BEQ A0,V1,8020CC10 NOP SW V1,977C (S1) JAL 802061C0 ADDU A0,R0,R0 JAL 8020C2D4 NOP LUI V0,0020 AND V0,S0,V0 BEQ V0,R0,8020CC64 LUI V0,2000 LW V1,977C (S1) SLTI V0,V1,0005 BNE V0,R0,8020CC44 ADDIU V0,V1,FFFB ADDIU S5,R0,0001 J 8020CC50 SW V0,977C (S1) BEQ V1,R0,8020CC58 NOP SW R0,977C (S1) JAL 802061C0 ADDU A0,R0,R0 JAL 8020C2D4 NOP LUI V0,2000 AND V0,S0,V0 BEQ V0,R0,8020CCB0 LUI V0,4000 JAL 8020C5A0 NOP ADDIU T0,R0,0001 BNE V0,T0,8020CCA0 LUI A0,8000 ;A0=A button ADDIU A1,S2,BFB0 ;A1=8020BFB0 LUI T0,8022 JAL 80211130 ;use handler A1 if buttons A0 pressed SW V0,7524 (T0) LUI T0,8022 JAL 8020C858 SW R0,7524 (T0) JAL 8020E588 ;V0=#games in current codelist NOP SW V0,7BE8 (S3) LUI V0,4000 AND V0,S0,V0 BEQ V0,R0,8020CCD8 NOP LW S4,7BE4 (S6) ADDIU S7,R0,0001 JAL 802061C0 ADDU A0,R0,R0 LUI A0,4000 ;A0=B button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,S2,BFB0 ;A1=8020BFB0 LW V0,977C (S1) BNE S7,R0,8020CD0C SW V0,7BE4 (S6) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80214EE4 ;wait for next VI scan to start NOP LW A0,977C (S1) ADDU A1,R0,R0 JAL 8020BB04 ADDU A2,A1,R0 JAL 80214F84 ;set VI buffer, then swap video buffers NOP BNE S0,R0,8020CD18 ADDIU T0,R0,0001 SW T0,0010 (SP) BEQ S5,R0,8020CD38 ADDU A0,S0,R0 ADDIU A1,R0,0008 LW A2,0010 (SP) JAL 802111A0 ADDIU A3,S2,BFB0 ADDU S5,R0,R0 SW R0,0010 (SP) BEQ S7,R0,8020C924 ADDU V0,S4,R0 LW RA,003C (SP) LW S8,0038 (SP) LW S7,0034 (SP) LW S6,0030 (SP) LW S5,002C (SP) LW S4,0028 (SP) LW S3,0024 (SP) LW S2,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0040 8020CD70 ADDIU SP,SP,FFD8 ADDU A3,R0,R0 ADDU T1,A3,R0 ADDU T2,A3,R0 LUI V0,8022 ADDIU T3,V0,7538 ADDU T0,A0,R0 ADDU A1,SP,R0 LBU A2,0000 (T0) ANDI V1,A2,00FF SLTIU V0,V1,00F6 BNE V0,R0,8020CE20 ANDI V0,A2,00FF ADDIU V0,V0,FF0A SLL V0,V0,0x2 ADDU V0,V0,T3 LW V0,0000 (V0) ADDIU V1,R0,0001 LBU V0,0000 (V0) ADDU A3,A3,V1 SB V0,0000 (A1) ANDI V0,V0,00FF BEQ V0,R0,8020CE10 ADDU A1,A1,V1 LUI V0,8022 ADDIU T1,V0,7538 ADDU A2,T0,R0 LBU V0,0000 (A2) ADDIU V0,V0,FF0A SLL V0,V0,0x2 ADDU V0,V0,T1 LW V0,0000 (V0) ADDIU A3,A3,0001 ADDU V0,V0,V1 LBU V0,0000 (V0) ADDIU V1,V1,0001 SB V0,0000 (A1) ANDI V0,V0,00FF BNE V0,R0,8020CDDC ADDIU A1,A1,0001 ADDIU A1,A1,FFFF ADDIU A3,A3,FFFF J 8020CE38 ADDIU T1,R0,0001 BNEL V1,R0,8020CE30 SB A2,0000 (A1) J 8020CE38 ADDIU T2,R0,0001 ADDIU A1,A1,0001 ADDIU A3,A3,0001 BEQ T2,R0,8020CD90 ADDIU T0,T0,0001 ADDU V0,SP,A3 BEQ T1,R0,8020CE70 SB R0,0000 (V0) ADDU A1,R0,R0 ADDU V1,A0,A1 ADDU V0,SP,A1 LBU V0,0000 (V0) ADDIU A1,A1,0001 SB V0,0000 (V1) SLTI V0,A1,0020 BNE V0,R0,8020CE54 ADDU V1,A0,A1 JR RA ADDIU SP,SP,0028 8020CE78 ADDIU SP,SP,FFB8 LUI V0,8022 ADDIU V0,V0,2B38 LUI A3,8022 ADDIU A3,A3,2B34 SW V0,0010 (SP) LUI V0,8022 ADDIU V0,V0,2B3C SW V0,001C (SP) LUI V0,8022 ADDIU V0,V0,2B40 SW V0,0028 (SP) LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table LUI V1,8022 SW RA,0040 (SP) SW A3,0018 (SP) SW A3,0024 (SP) SW A3,0030 (SP) LW A0,0048 (V0) LW A1,0044 (V0) LW A2,0040 (V0) LW T0,0378 (V0) ADDIU V1,V1,2B44 SW V1,0038 (SP) SW A0,0014 (SP) ADDU A0,R0,R0 SW A1,0020 (SP) SW A2,002C (SP) SW T0,0034 (SP) LW A2,028C (V0) JAL 80214210 ADDIU A1,R0,000D LW RA,0040 (SP) JR RA ADDIU SP,SP,0048 8020CF08 ADDIU SP,SP,FFE0 SUBU A0,R0,A0 LUI V0,8022 LUI V1,8024 LUI A2,8025 ADDIU A2,A2,9150 SW A0,0010 (SP) LW A0,74E4 (V0) LW A1,4D70 (V1) SW RA,0018 (SP) JAL 8020CF44 ADDU A3,R0,R0 LW RA,0018 (SP) JR RA ADDIU SP,SP,0020 8020CF44 ADDIU SP,SP,FF80 SW S3,0064 (SP) SW A1,0084 (SP) ADDU S3,A1,R0 SW RA,007C (SP) SW S8,0078 (SP) SW S7,0074 (SP) SW S6,0070 (SP) SW S5,006C (SP) SW S4,0068 (SP) SW S2,0060 (SP) SW S1,005C (SP) SW S0,0058 (SP) SW A0,0080 (SP) SW A2,0088 (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM SW R0,0050 (SP) LW T0,0090 (SP) BNE T0,R0,8020CFA0 ADDIU A1,R0,000E JAL 80212B20 ADDIU A0,R0,0001 ADDIU A1,R0,000E ADDIU A2,R0,001F ADDIU S4,R0,0006 ADDU S6,R0,R0 LUI V0,8022 LW T0,0090 (SP) ADDIU S0,V0,7660 ;S0=80227660: string pointer table ADDIU A0,T0,000E LUI T0,05EE ORI T0,T0,05EE SW T0,0040 (SP) LUI T0,FFC0 ORI T0,T0,FFC0 SW T0,0048 (SP) LUI T0,7BDE ORI T0,T0,7BDE ;T0=7BDE7BDE: grey 50% SW T0,0044 (SP) LW A3,00CC (S0) ;A3=str+CC: 802240C0 "GameShark Pro Version 3.30" LUI T0,FFFE SW T0,004C (SP) JAL 80212C90 SW R0,0010 (SP) ADDIU A0,R0,000E ADDIU A1,R0,0022 LW T0,0090 (SP) LW A3,002C (S0) ;A3=str+2C: 80224390 "Select Cheat Codes" ADDIU A2,R0,001F SW R0,0010 (SP) JAL 80212C90 SUBU A0,A0,T0 LUI V1,8022 ADDIU S7,R0,003B LW T0,004C (SP) LW V0,7510 (V1) ORI T0,T0,FFFE ADDIU V0,V0,0001 SW V0,7510 (V1) SLTI V0,V0,0008 BNE V0,R0,8020D040 SW T0,004C (SP) SW R0,7510 (V1) LUI V0,8022 ADDIU S5,R0,0001 LW T0,0090 (SP) ADDU S8,S0,R0 ;S8=S0: string pointer table SW T0,7650 (V0) SLTI T0,S3,0006 SW T0,0054 (SP) ADDIU T0,R0,0001 BNE S5,T0,8020D08C ADDIU A1,S7,FFFA ADDIU A2,R0,0120 LW T0,0090 (SP) ADDIU A3,R0,0062 SW R0,0010 (SP) JAL 80213364 ADDIU A0,T0,0010 ADDU S4,R0,R0 LUI S6,7BDE ORI S6,S6,7BDE ;S6=7BDE7BDE: grey 50% LW T0,0054 (SP) BNE T0,R0,8020D0A8 LUI T0,8022 LW V1,7530 (T0) SLTI V0,V1,000B BEQ V0,R0,8020D14C ADDIU V0,V1,FFFB BNE S3,R0,8020D0C4 ADDU A0,S7,R0 LUI T0,8022 LW A1,0038 (S8) ;A1=str+38: 802242CC "--- New Code ---" LW A3,7510 (T0) JAL 80213F44 ADDU A2,S4,R0 BNE S6,R0,8020D0E8 ADDIU T0,R0,0001 ADDU A0,S7,R0 LW A1,0038 (S8) ;A1=str+38: 802242CC "--- New Code ---" ADDU A2,R0,R0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S4,R0 J 8020D170 ADDU A1,R0,R0 BEQ T0,R0,8020D124 LUI A2,7BDE BNE S3,R0,8020D114 ADDU A0,S7,R0 LW A1,0038 (S8) ;A1=str+38: 802242CC "--- New Code ---" LUI A2,FFC0 ORI A2,A2,FFC0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,T0,R0 J 8020D170 ADDU A1,R0,R0 LW A1,0038 (S8) ;A1=str+38: 802242CC "--- New Code ---" LUI A2,7BDE J 8020D13C ORI A2,A2,7BDE ;A2=7BDE7BDE: grey 50% BNE S3,R0,8020D134 ORI A2,A2,7BDE ;A2=7BDE7BDE: grey 50% LUI A2,FFFE ORI A2,A2,FFFE LW A1,0038 (S8) ;A1=str+38: 802242CC "--- New Code ---" ADDU A0,S7,R0 JAL 80210EF4 ;print A1 centered on line A0 in colour A2 NOP J 8020D170 ADDU A1,R0,R0 LW T0,0084 (SP) SLT V0,V0,T0 BEQ V0,R0,8020D168 ADDIU A1,V1,FFF6 SUBU V0,T0,V1 J 8020D170 ADDIU S3,V0,000A ADDIU S3,R0,0005 ADDIU A1,T0,FFFB LUI T0,8022 LW V0,7530 (T0) BLEZL V0,8020D2E4 ADDIU S5,S5,0001 LW T0,0054 (SP) BNEL T0,R0,8020D19C ADDIU V0,R0,0001 SLTI V0,V0,000B BNE V0,R0,8020D19C ADDIU V0,R0,0001 ADDU V0,R0,R0 ADDU S0,V0,R0 SLTI V0,S0,000B BEQ V0,R0,8020D2E0 SLL V0,S0,0x3 ADDU S1,V0,S7 ADDU S2,S0,A1 LUI T0,8022 LW V0,7530 (T0) SLT V0,V0,S0 BNEL V0,R0,8020D2E4 ADDIU S5,S5,0001 LW A0,0080 (SP) ADDU A1,S2,R0 JAL 8020FAA0 ADDIU A2,SP,0018 JAL 8020CD70 ADDIU A0,SP,0018 BNE S0,S3,8020D228 ADDU A0,S1,R0 ADDIU A1,SP,0018 LUI T0,8022 LW A3,7510 (T0) JAL 80213F44 ADDU A2,S4,R0 LBU V1,0018 (SP) ADDIU V0,R0,0028 BNE V1,V0,8020D228 ADDIU V0,R0,004D LBU V1,0019 (SP) BNE V1,V0,8020D228 ADDIU V0,R0,0029 LBU V1,001A (SP) BNE V1,V0,8020D228 ADDIU T0,R0,0001 SW T0,0050 (SP) BNE S6,R0,8020D24C ADDIU T0,R0,0001 ADDU A0,S1,R0 ADDIU A1,SP,0018 ADDU A2,R0,R0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S4,R0 J 8020D2D0 ADDIU S1,S1,0008 BEQ T0,R0,8020D278 NOP BNE S0,S3,8020D278 ADDU A0,S1,R0 ADDIU A1,SP,0018 LUI A2,FFA0 ORI A2,A2,FFA0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 J 8020D2D0 ADDIU S1,S1,0008 LW T0,0088 (SP) ADDU V0,S2,T0 LBU V0,FFFF (V0) ADDIU T0,R0,0001 BNE V0,T0,8020D2B4 NOP LW A2,0040 (SP) BNE S0,S3,8020D2A0 ADDU A0,S1,R0 LW A2,0048 (SP) ADDIU A1,SP,0018 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDIU A3,R0,0001 J 8020D2D0 ADDIU S1,S1,0008 LW A2,0044 (SP) BNE S0,S3,8020D2C4 ADDU A0,S1,R0 LW A2,004C (SP) JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ADDIU A1,SP,0018 ADDIU S1,S1,0008 ADDIU S0,S0,0001 SLTI V0,S0,000B BNE V0,R0,8020D1B4 ADDIU S2,S2,0001 ADDIU S5,S5,0001 SLTI V0,S5,0002 BNE V0,R0,8020D060 ADDIU T0,R0,0001 LUI V0,8022 LW V0,74D0 (V0) BNE V0,R0,8020D3CC ADDIU S4,R0,0006 ADDU S6,R0,R0 LUI V1,8022 LW T0,0090 (SP) LW A0,0080 (SP) SUBU V0,R0,T0 SW V0,7650 (V1) LUI V0,8022 LW S1,7534 (V0) JAL 8020FB14 ADDIU A1,SP,0018 ADDIU S5,R0,0001 ADDU S3,S5,R0 ADDIU S2,R0,0010 LUI V0,8022 ADDIU S0,V0,7660 ;S0=80227660: string pointer table BNE S5,S3,8020D370 ADDIU A0,R0,00AA ADDIU A1,R0,0099 ADDIU A2,R0,0120 LW T0,0090 (SP) ADDIU A3,R0,0038 SW R0,0010 (SP) JAL 80213364 SUBU A0,S2,T0 ADDU S4,R0,R0 LUI S6,FFC0 ORI S6,S6,FFC0 ADDIU A0,R0,00AA ADDIU A1,SP,0018 ADDU A2,S6,R0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S4,R0 ADDU A0,S1,R0 LW A1,001C (S0) ;A1=str+1C: 80224328 "Cheat Codes Are On" LW A2,00E8 (S0) ;A2=str+E8: 80224040 "Cheat Code Is On" ADDIU A3,R0,00B4 SW S6,0010 (SP) JAL 80210FA0 ;print (A0>1 ? A1:A2) centered on line A3 in colour SP+10 SW S4,0014 (SP) LW T0,0050 (SP) BEQL T0,R0,8020D3C0 ADDIU S5,S5,0001 ADDIU A0,R0,00C0 LW A1,041C (S0) ;A1=str+41C: 802231D8 "'Must be on' code: Must be on!" ADDU A2,S6,R0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S4,R0 ADDIU S5,S5,0001 SLTI V0,S5,0002 BNE V0,R0,8020D33C NOP LW T0,0090 (SP) LUI V0,8022 SW R0,7650 (V0) JAL 8021433C SLTU A0,R0,T0 LW RA,007C (SP) LW S8,0078 (SP) LW S7,0074 (SP) LW S6,0070 (SP) LW S5,006C (SP) LW S4,0068 (SP) LW S3,0064 (SP) LW S2,0060 (SP) LW S1,005C (SP) LW S0,0058 (SP) JR RA ADDIU SP,SP,0080 8020D410 ADDIU SP,SP,FFD0 SW S0,0010 (SP) ADDU S0,A0,R0 LUI V0,8022 LW A0,74E4 (V0) SW RA,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S4,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) JAL 8020F664 SW S1,0014 (SP) LUI V1,8022 BNE S0,R0,8020D4F8 SW V0,7530 (V1) LUI V0,8022 SW R0,7534 (V0) ADDIU S0,R0,0063 LUI V0,8025 ADDIU V0,V0,9150 ADDU V0,V0,S0 SB R0,0000 (V0) ADDIU S0,S0,FFFF BGEZ S0,8020D468 ADDIU V0,V0,FFFF LUI V1,8022 LW V0,7530 (V1) BLEZ V0,8020D4F8 ADDU S0,R0,R0 LUI S3,8022 LUI V0,8025 ADDIU S6,V0,9150 ADDIU S5,R0,0001 LUI S2,8022 ADDU S4,V1,R0 ADDIU S1,S0,0001 LW A0,74E4 (S3) JAL 8020EF78 ADDU A1,S1,R0 ADDU S0,S0,S6 SB V0,0000 (S0) LW A0,74E4 (S3) JAL 8020D520 ADDU A1,S1,R0 BEQL V0,S5,8020D4CC SB V0,0000 (S0) LBU V0,0000 (S0) BEQ V0,R0,8020D4E4 NOP LW V0,7534 (S2) ADDIU V0,V0,0001 SW V0,7534 (S2) LW V0,7530 (S4) ADDU S0,S1,R0 SLT V0,S0,V0 BNE V0,R0,8020D4A4 ADDIU S1,S0,0001 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8020D520 ADDIU SP,SP,FFC0 BEQ A1,R0,8020D564 SW RA,0038 (SP) JAL 8020FAA0 ADDIU A2,SP,0010 LBU V1,0010 (SP) ADDIU V0,R0,0028 BNE V1,V0,8020D568 ADDU V0,R0,R0 LBU V1,0011 (SP) ADDIU V0,R0,004D BNE V1,V0,8020D568 ADDU V0,R0,R0 LBU A0,0012 (SP) ADDIU V1,R0,0029 BEQ A0,V1,8020D568 ADDIU V0,R0,0001 ADDU V0,R0,R0 LW RA,0038 (SP) JR RA ADDIU SP,SP,0040 8020D574 ADDIU SP,SP,FFB8 SW S0,0020 (SP) ADDU S0,A0,R0 SW S3,002C (SP) LUI S3,8022 LW V0,74E4 (S3) ADDIU T0,R0,0001 SW S6,0038 (SP) ADDU S6,R0,R0 SW S5,0034 (SP) ADDU S5,S6,R0 SW S7,003C (SP) LUI S7,8024 SW RA,0044 (SP) SW S8,0040 (SP) SW S4,0030 (SP) SW S2,0028 (SP) SW S1,0024 (SP) SW T0,0018 (SP) SW R0,001C (SP) BEQ V0,S0,8020D5D8 SW R0,4D70 (S7) SW S0,74E4 (S3) JAL 8020D410 ADDU A0,S6,R0 ADDU A0,S0,R0 JAL 8020F664 SW A0,74E4 (S3) LUI A0,8021 ADDIU A0,A0,BFB0 LUI S0,8021 ADDIU S1,S0,CF08 ADDU A1,S1,R0 ADDU A2,R0,R0 LUI S2,8022 JAL 8021401C SW V0,7530 (S2) JAL 8020CE78 ADDIU S4,R0,0001 JAL 80210D30 ;V0=button and stick pos for controller 1 ADDU S0,S7,R0 ADDU S7,S2,R0 ADDU S2,S3,R0 LUI T0,8025 ADDIU S3,T0,9150 LUI S8,8022 JAL 80210D4C ;V0=button and stick pos NOP ADDU S1,V0,R0 LUI V0,1000 AND V0,S1,V0 BEQ V0,R0,8020D6C8 LUI V0,0800 JAL 802061C0 ADDU A0,R0,R0 LUI A1,8021 ADDIU A1,A1,CF08 ;A1=8020CF08 JAL 80211130 ;use handler A1 if buttons A0 pressed LUI A0,1000 ;A0=Start button LUI T0,8022 LW A0,7BE4 (T0) LUI A1,8021 ADDIU A1,A1,CF08 JAL 8020DFF8 NOP LUI V1,8025 LW V1,91DC (V1) ADDU S6,V0,R0 BNE S6,V1,8020D6A0 LUI A0,8021 ADDIU A0,A0,DFC0 LUI A1,8021 ADDIU A1,A1,CF08 JAL 8021401C ADDIU A2,R0,0001 BNE S6,R0,8020D6B0 NOP J 8020D6BC ADDIU S6,R0,FFFF BNE S6,S4,8020D6C8 LUI V0,0800 ADDIU S6,R0,FFFE ADDIU T0,R0,0001 SW T0,001C (SP) LUI V0,0800 ORI V0,V0,0002 AND V0,S1,V0 BEQ V0,R0,8020D710 LUI V0,0400 LW V0,4D70 (S0) BLEZ V0,8020D700 LUI A0,1000 JAL 802061C0 ADDU A0,R0,R0 LW V0,4D70 (S0) ADDIU S5,R0,0001 ADDIU V0,V0,FFFF SW V0,4D70 (S0) LUI A0,1000 ;A0=Start button LUI T0,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T0,CF08 ;A1=8020CF08 LUI V0,0400 ORI V0,V0,0001 AND V0,S1,V0 BEQ V0,R0,8020D74C NOP LW V0,4D70 (S0) LW V1,7530 (S7) SLT V0,V0,V1 BEQ V0,R0,8020D74C NOP JAL 802061C0 ADDU A0,R0,R0 LW V0,4D70 (S0) ADDIU S5,R0,0001 ADDU V0,V0,S5 SW V0,4D70 (S0) BGEZ S1,8020D8C4 LUI V0,2000 LW A1,4D70 (S0) BNE A1,R0,8020D7E4 NOP JAL 802061C0 ADDU A0,R0,R0 ADDU A2,S3,R0 LW A0,74E4 (S2) LW A1,4D70 (S0) ADDIU A3,R0,0001 JAL 8020CF44 SW R0,0010 (SP) JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP JAL 8021110C ;unconditional return NOP ADDU A1,R0,R0 LW A0,74E4 (S2) JAL 8020AB68 ADDU A2,A1,R0 JAL 8020E310 NOP JAL 8020CE78 NOP LW A0,74E4 (S2) JAL 8020F664 NOP LW A0,74E4 (S2) ADDU A1,V0,R0 JAL 8020D520 SW A1,7530 (S7) BNE V0,S4,8020D8C4 LUI V0,2000 LW V0,4D70 (S0) ADDU V0,V0,S3 J 8020D8C0 SB S4,FFFF (V0) LW A0,74E4 (S2) JAL 8020D520 NOP BNE V0,S4,8020D810 NOP JAL 802061C0 ADDIU A0,R0,0001 LW V0,4D70 (S0) ADDU V0,V0,S3 J 8020D8A4 SB S4,FFFF (V0) JAL 802061C0 ADDU A0,R0,R0 LUI A0,8000 ;A0=A button LUI T0,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T0,CF08 ;A1=8020CF08 LW A1,4D70 (S0) ADDU V0,A1,S3 LBU V0,FFFF (V0) BNE V0,S4,8020D870 NOP LW A0,74E4 (S2) JAL 8020F058 ADDU A2,R0,R0 LW V0,4D70 (S0) ADDIU V0,V0,FFFF ADDU V1,V0,S3 LBU V0,0000 (V1) BNE V0,S4,8020D8A8 LUI T0,8022 SB R0,0000 (V1) LW V0,7534 (S8) J 8020D8A0 ADDIU V0,V0,FFFF LW A0,74E4 (S2) JAL 8020F058 ADDIU A2,R0,0001 LW V0,4D70 (S0) ADDIU V0,V0,FFFF ADDU V1,V0,S3 LBU V0,0000 (V1) BNE V0,R0,8020D8A8 LUI T0,8022 SB S4,0000 (V1) LW V0,7534 (S8) ADDIU V0,V0,0001 SW V0,7534 (S8) LUI T0,8022 LW A1,4D70 (S0) LW A0,7BE4 (T0) ADDU V0,A1,S3 LBU A2,FFFF (V0) JAL 8020F058 NOP LUI V0,2000 AND V0,S1,V0 BEQ V0,R0,8020D9BC LUI V0,0002 JAL 802061C0 ADDU A0,R0,R0 ADDU A2,S3,R0 LW A0,74E4 (S2) LW A1,4D70 (S0) ADDIU A3,R0,0001 JAL 8020CF44 SW R0,0010 (SP) JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP LUI A0,2000 ;A0=Z button LUI T0,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T0,CF08 ;A1=8020CF08 LW A1,4D70 (S0) BNE A1,R0,8020D994 NOP ADDU A1,R0,R0 LW A0,74E4 (S2) JAL 8020AB68 ADDU A2,A1,R0 JAL 8020E310 NOP JAL 8020CE78 NOP LW A0,74E4 (S2) JAL 8020F664 NOP LW V1,7530 (S7) BEQ V0,V1,8020D9B8 ADDU A1,V0,R0 LW A0,74E4 (S2) SW A1,4D70 (S0) JAL 8020EF78 SW A1,7530 (S7) LW V1,4D70 (S0) ADDU V1,V1,S3 SB V0,FFFF (V1) LW V0,4D70 (S0) ADDU V0,V0,S3 LBU V0,FFFF (V0) BNE V0,S4,8020D9BC LUI V0,0002 LW V0,7534 (S8) ADDIU V0,V0,0001 J 8020D9B8 SW V0,7534 (S8) BLEZ A1,8020D9BC LUI V0,0002 LW A0,74E4 (S2) JAL 8020AB68 ADDU A2,R0,R0 JAL 8020E310 NOP JAL 8020CE78 NOP LUI V0,0002 AND V0,S1,V0 BEQ V0,R0,8020DAE8 LUI V0,0010 LW V0,4D70 (S0) BNE V0,R0,8020D9F0 NOP JAL 802061C0 ADDIU A0,R0,0001 LUI A0,0002 ;A0=c left LUI T0,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T0,CF08 ;A1=8020CF08 LW V0,4D70 (S0) BLEZ V0,8020DAE8 LUI V0,0010 JAL 802061C0 ADDU A0,R0,R0 ADDU A2,S3,R0 LW A0,74E4 (S2) LW A1,4D70 (S0) ADDIU A3,R0,0001 JAL 8020CF44 SW R0,0010 (SP) JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP LUI A1,8021 ADDIU A1,A1,CF08 ;A1=8020CF08 JAL 80211130 ;use handler A1 if buttons A0 pressed LUI A0,0002 ;A0=c left LUI A0,8021 ADDIU A0,A0,CF08 JAL 802089EC NOP BEQ V0,R0,8020DAE8 LUI V0,0010 LW A0,74E4 (S2) LW A1,4D70 (S0) JAL 8020F6CC NOP LW V0,4D70 (S0) ADDIU A0,V0,FFFF ADDU V0,A0,S3 LBU V0,0000 (V0) BNE V0,S4,8020DA84 ADDU A1,A0,R0 LW V0,7534 (S8) ADDIU V0,V0,FFFF SW V0,7534 (S8) LW V0,7530 (S7) SLT V0,A1,V0 BEQ V0,R0,8020DABC ADDU A2,S7,R0 ADDIU A0,A1,0001 ADDU V0,A0,S3 LBU V1,0000 (V0) ADDU V0,A1,S3 SB V1,0000 (V0) LW V0,7530 (A2) ADDU A1,A0,R0 SLT V0,A1,V0 BNE V0,R0,8020DA98 ADDIU A0,A1,0001 LW V1,4D70 (S0) LW V0,7530 (S7) BNE V1,V0,8020DAD0 ADDIU V0,V1,FFFF SW V0,4D70 (S0) LW A0,74E4 (S2) JAL 8020F664 NOP JAL 8020E39C ;replace codelist on ROM with revised copy SW V0,7530 (S7) LUI V0,0010 AND V0,S1,V0 BEQ V0,R0,8020DB34 LUI V0,0020 LW V1,7530 (S7) LW A0,4D70 (S0) ADDIU V0,V1,FFFB SLT V0,V0,A0 BNE V0,R0,8020DB24 NOP JAL 802061C0 ADDU A0,R0,R0 LW V0,4D70 (S0) ADDIU V0,V0,0005 J 8020DB2C SW V0,4D70 (S0) BNEL A0,V1,8020DB2C SW V1,4D70 (S0) ADDIU S5,R0,0001 LUI V0,0020 AND V0,S1,V0 BEQ V0,R0,8020DB78 LUI V0,4000 LW V1,4D70 (S0) SLTI V0,V1,0005 BNE V0,R0,8020DB68 NOP JAL 802061C0 ADDU A0,R0,R0 LW V0,4D70 (S0) ADDIU V0,V0,FFFB J 8020DB70 SW V0,4D70 (S0) BNEL V1,R0,8020DB70 SW R0,4D70 (S0) ADDIU S5,R0,0001 LUI V0,4000 AND V0,S1,V0 BEQ V0,R0,8020DBA4 NOP JAL 802061C0 ADDU A0,R0,R0 ADDIU T0,R0,0001 SW T0,001C (SP) LUI A0,4000 ;A0=B button LUI T0,8021 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDIU A1,T0,CF08 ;A1=8020CF08 LW T0,001C (SP) BEQ T0,S4,8020DBD8 LUI T0,8025 ADDIU A2,T0,9150 LW A0,74E4 (S2) LW A1,4D70 (S0) ADDU A3,R0,R0 JAL 8020CF44 SW R0,0010 (SP) JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BNE S1,R0,8020DBE4 ADDIU T0,R0,0001 SW T0,0018 (SP) BEQ S5,R0,8020DC08 ADDU A0,S1,R0 ADDIU A1,R0,0008 LUI T0,8021 LW A2,0018 (SP) JAL 802111A0 ADDIU A3,T0,CF08 ADDU S5,R0,R0 SW R0,0018 (SP) LW T0,001C (SP) BEQ T0,R0,8020D62C ADDU V0,S6,R0 LW RA,0044 (SP) LW S8,0040 (SP) LW S7,003C (SP) LW S6,0038 (SP) LW S5,0034 (SP) LW S4,0030 (SP) LW S3,002C (SP) LW S2,0028 (SP) LW S1,0024 (SP) LW S0,0020 (SP) JR RA ADDIU SP,SP,0048 8020DC44 ADDU A0,R0,R0 LW V0,AA20 (S0) ADDIU V0,V0,FFFB ADDIU SP,SP,FF90 SW S6,0068 (SP) ADDU S6,A0,R0 SW S5,0064 (SP) ADDU S5,A1,R0 SW S4,0060 (SP) ADDU S4,A2,R0 SW S3,005C (SP) ADDU S3,A3,R0 LUI V0,007F LUI V1,8025 LW V1,9110 (V1) ;V1=80249110: size of RAM ORI V0,V0,FFFF SW RA,006C (SP) SW S2,0058 (SP) SW S1,0054 (SP) SLT V0,V0,V1 ;TRUE if 8MB exp.pak detected BEQ V0,R0,8020DD6C SW S0,0050 (SP) LUI A0,8025 LUI V0,8025 LW V1,A90C (V0) ADDIU V0,R0,0003 BLEZ V1,8020DD14 SW V0,91DC (A0) ADDIU S2,R0,0004 LUI V1,8022 ADDIU V1,V1,7660 ;V1=80227660: string pointer table LW A3,0058 (V1) ;A3=str+58: 80224278 "Start Game Options" LW V0,005C (V1) ;V0=str+5C: 80224258 "Start Game With Selected Codes" LW A2,0060 (V1) ;A2=str+60: 8022423C "Start Game Without Codes" ADDIU A0,R0,0005 SW V0,0010 (SP) LUI V0,8022 LW V0,7560 (V0) ADDIU A1,R0,00C8 SW A2,0014 (SP) LUI A2,8025 ADDIU V0,V0,013C SLL V0,V0,0x2 ADDU V0,V0,V1 LW T0,0000 (V0) ;T0=str+offset: LW V0,0064 (V1) ;V0=str+64: 80224234 "Cancel" ADDIU A2,A2,9888 SW V0,001C (SP) JAL 802137A4 SW T0,0018 (SP) J 8020DDFC NOP ADDIU S2,R0,0003 ADDIU A0,R0,0004 LUI V1,8022 ADDIU V1,V1,7660 ;V1=80227660: string pointer table LW A3,0058 (V1) ;A3=str+58: 80224278 "Start Game Options" LW V0,0060 (V1) ;V0=str+60: 8022423C "Start Game Without Codes" ADDIU A1,R0,00C8 SW V0,0010 (SP) LUI V0,8022 LW V0,7560 (V0) LUI A2,8025 ADDIU V0,V0,013C ;V0+=13C SLL V0,V0,0x2 ;V0->offset ADDU V0,V0,V1 ;V0+=str: p->string LW T0,0000 (V0) LW V0,0064 (V1) ;V0=str+64: 80224234 "Cancel" ADDIU A2,A2,9888 SW V0,0018 (SP) JAL 802137A4 SW T0,0014 (SP) J 8020DDFC NOP LUI A0,8025 LUI V0,8025 LW V1,A90C (V0) ADDIU V0,R0,0002 BLEZ V1,8020DDC8 SW V0,91DC (A0) ADDIU S2,R0,0003 ADDIU A0,R0,0004 ADDIU A1,R0,00C8 LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table LUI A2,8025 LW A3,0058 (V0) ;A3=str+58: 80224278 "Start Game Options" LW V1,005C (V0) ;V1=str+5C: 80224258 "Start Game With Selected Codes" LW T0,0060 (V0) ;T0=str+60: 8022423C "Start Game Without Codes" LW V0,0064 (V0) ;V0=str+64: 80224234 "Cancel" ADDIU A2,A2,9888 SW V1,0010 (SP) SW T0,0014 (SP) JAL 802137A4 SW V0,0018 (SP) J 8020DDFC NOP ADDIU S2,R0,0002 ADDIU A0,R0,0003 ADDIU A1,R0,00C8 LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table LUI A2,8025 LW A3,0058 (V0) ;A3=str+58: 80224278 "Start Game Options" LW V1,0060 (V0) ;V1=str+60: 8022423C "Start Game Without Codes" LW V0,0064 (V0) ;V0=str+64: 80224234 "Cancel" ADDIU A2,A2,9888 SW V1,0010 (SP) JAL 802137A4 SW V0,0014 (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP BNE S3,R0,8020DE18 ADDIU A0,S3,000E JAL 80212B20 ADDIU A0,R0,0001 ADDIU A0,S3,000E ADDIU A1,R0,000E LUI V0,8022 LW A3,772C (V0) ADDIU A2,R0,001F JAL 80212C90 SW R0,0010 (SP) LUI V0,8025 LW V0,A90C (V0) BGTZL V0,8020DE88 ADDIU S0,S3,0010 ADDIU S1,S3,0010 ADDU A0,S1,R0 ADDIU A1,R0,003C ADDIU A2,R0,001F ADDU A3,S2,R0 ADDIU S0,S5,FFFF SW R0,0010 (SP) SW S0,0014 (SP) JAL 80212E3C SW S4,0018 (SP) ADDU A0,S1,R0 ADDIU A1,R0,003C ADDIU A2,R0,001F ADDU A3,S2,R0 LUI V0,8025 ADDIU V0,V0,9888 J 8020DEC4 SW S0,0010 (SP) ADDU A0,S0,R0 ADDIU A1,R0,003C ADDIU A2,R0,001F ADDU A3,S2,R0 SW R0,0010 (SP) SW S5,0014 (SP) JAL 80212E3C SW S4,0018 (SP) ADDU A0,S0,R0 ADDIU A1,R0,003C ADDIU A2,R0,001F ADDU A3,S2,R0 LUI V0,8025 ADDIU V0,V0,9888 SW S5,0010 (SP) SW S4,0014 (SP) JAL 80213820 SW V0,0018 (SP) ADDIU A0,R0,0010 SUBU A0,A0,S3 ADDIU A1,R0,0099 ADDIU A2,R0,0120 ADDIU A3,R0,0038 LUI V1,8022 SUBU V0,R0,S3 SW V0,7650 (V1) JAL 80213364 SW R0,0010 (SP) LUI S0,FFC0 BNE S6,R0,8020DF44 ORI S0,S0,FFC0 ADDIU A0,R0,00AA LUI A2,FFC0 ORI A2,A2,FFC0 LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A1,0014 (S0) ;A1=str+14: 80224354 "No Game Selected" JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 ADDIU A0,R0,00B4 LUI A2,FFC0 ORI A2,A2,FFC0 LW A1,0018 (S0) ;A1=str+18: 8022433C "No Cheat Codes Are On" JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 J 8020DF90 NOP ADDU A0,S6,R0 JAL 8020FB14 ADDIU A1,SP,0020 ADDIU A0,R0,00AA ADDIU A1,SP,0020 LUI A2,FFC0 ORI A2,A2,FFC0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 LUI V0,8025 LW A0,A90C (V0) LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table LW A1,001C (V0) LW A2,00E8 (V0) ADDIU A3,R0,00B4 SW S0,0010 (SP) JAL 80210FA0 ;print (A0>1 ? A1:A2) centered on line A3 in colour SP+10 SW R0,0014 (SP) LW RA,006C (SP) LW S6,0068 (SP) LW S5,0064 (SP) LW S4,0060 (SP) LW S3,005C (SP) LW S2,0058 (SP) LW S1,0054 (SP) LW S0,0050 (SP) LUI V0,8022 SW R0,7650 (V0) JR RA ADDIU SP,SP,0070 8020DFC0 LUI V0,8025 LUI V1,8025 LUI A2,8025 SUBU A3,R0,A0 LW A0,9958 (V0) LW A1,9AC4 (V1) LW A2,91C4 (A2) ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8020DC50 NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8020DFF8 ADDIU SP,SP,FFC8 SW S6,0028 (SP) ADDU S6,A0,R0 SW S0,0010 (SP) ADDU S0,A1,R0 SW S8,0030 (SP) ADDIU S8,R0,0001 SW S3,001C (SP) ADDU S3,R0,R0 SW S2,0018 (SP) ADDU S2,S3,R0 SW RA,0034 (SP) SW S7,002C (SP) SW S5,0024 (SP) SW S4,0020 (SP) BLEZ S6,8020E050 SW S1,0014 (SP) LUI V0,8022 LW V1,7534 (V0) LUI V0,8025 J 8020E058 SW V1,A90C (V0) LUI V0,8025 SW R0,A90C (V0) LUI V0,8025 LUI S7,8025 LUI S5,8025 SW S6,9958 (V0) LW V0,A90C (S5) LUI S1,8025 SW R0,91C4 (S7) SLTIU V0,V0,0001 JAL 8021084C SW V0,9AC4 (S1) ADDU A0,S0,R0 LUI S4,8021 ADDIU S0,S4,DFC0 ADDU A1,S0,R0 JAL 8021401C ADDU A2,R0,R0 JAL 80215A1C ;V0=button and stick pos for controller 1 NOP BNEL S2,R0,8020E2B8 LUI S0,8025 ADDU S5,S7,R0 ADDU S7,S4,R0 ADDU S4,S0,R0 JAL 80210D4C ;V0=button and stick pos NOP LUI V1,0800 ORI V1,V1,0002 ADDU S0,V0,R0 AND V1,S0,V1 BEQ V1,R0,8020E104 LUI T0,8025 LW V0,A90C (T0) LW V1,9AC4 (S1) SLTIU V0,V0,0001 SLT V0,V0,V1 BEQ V0,R0,8020E108 LUI V0,0400 JAL 802061C0 ADDU A0,R0,R0 LW V0,9AC4 (S1) ADDIU S3,R0,0001 ADDIU V0,V0,FFFF SW V0,9AC4 (S1) LUI V0,0400 ORI V0,V0,0001 AND V0,S0,V0 BEQ V0,R0,8020E140 LUI T0,8025 LW V1,9AC4 (S1) LW V0,91DC (T0) SLT V0,V1,V0 BEQ V0,R0,8020E144 LUI V0,1000 ADDIU S3,R0,0001 ADDU V0,V1,S3 SW V0,9AC4 (S1) JAL 802061C0 ADDU A0,R0,R0 LUI V0,1000 AND V0,S0,V0 BEQ V0,R0,8020E1A4 LUI V0,4000 JAL 802061C0 ADDU A0,R0,R0 ADDIU S2,R0,0001 ADDU A0,S6,R0 ADDU A2,S2,R0 LUI T0,8025 LW A1,A90C (T0) ADDU A3,R0,R0 SW S2,91C4 (S5) SLTU A1,A1,S2 JAL 8020DC50 SW A1,9AC4 (S1) JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDIU A0,R0,000C ;A0=12 times JAL 8021120C ;call routine A1 A0 times ADDU A1,S4,R0 ;A1=8020DFC0 LUI A0,0002 ;A0=c left JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S4,R0 ;A1=8020DFC0 LUI V0,4000 AND V0,S0,V0 BEQ V0,R0,8020E1C0 LUI V0,C000 LUI T0,8025 LW V0,91DC (T0) SW V0,9AC4 (S1) LUI V0,C000 AND V0,S0,V0 BEQ V0,R0,8020E26C ADDIU V0,R0,0002 LW V1,9AC4 (S1) BNE V1,V0,8020E228 LUI T0,8025 LW V1,91DC (T0) ADDIU V0,R0,0003 BNE V1,V0,8020E228 NOP JAL 802061C0 ADDU A0,R0,R0 ADDIU A0,R0,000C ;A0=12 times ADDU A1,S4,R0 ;A1=8020DFC0 ADDIU V0,R0,0001 JAL 8021120C ;call routine A1 A0 times SW V0,91C4 (S5) LUI A0,8000 ;A0=A button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S4,R0 ;A1=8020DFC0 LUI V1,8022 LW V0,7560 (V1) SW R0,91C4 (S5) XORI V0,V0,0001 J 8020E26C SW V0,7560 (V1) JAL 802061C0 ADDU A0,R0,R0 ADDIU S2,R0,0001 ADDU A0,S6,R0 ADDU A2,S2,R0 LW A1,9AC4 (S1) ADDU A3,R0,R0 JAL 8020DC50 SW S2,91C4 (S5) JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDIU A0,R0,000C ;A0=12 times JAL 8021120C ;call routine A1 A0 times ADDU A1,S4,R0 ;A1=8020DFC0 LUI A0,0002 ;A0=c left JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S4,R0 ;A1=8020DFC0 ADDU A0,S6,R0 LW A1,9AC4 (S1) LW A2,91C4 (S5) JAL 8020DC50 ADDU A3,R0,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BEQ S3,R0,8020E2B0 ADDU A0,S0,R0 ADDIU A1,R0,0005 ADDU A2,S8,R0 JAL 802111A0 ADDIU A3,S7,DFC0 ADDU S3,R0,R0 ADDU S8,S3,R0 BEQ S2,R0,8020E0B4 LUI S0,8025 LUI V0,8025 LW V1,9AC4 (S0) LW V0,91DC (V0) BEQ V1,V0,8020E2D4 NOP JAL 80208150 NOP LW V0,9AC4 (S0) LW RA,0034 (SP) LW S8,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 8020E308 probably fill ;SW R0,EE74 (S5) ;XORI V0,V0,0001 8020E310 load codelist from ROM to ram ADDIU SP,SP,FFE8 SW S0,0010 (SP) LUI S0,8022 LW V0,7570 (S0) ;V0=80227570: p->cur.codelist BNE V0,R0,8020E334 ;skip if valid pointer SW RA,0014 (SP) JAL 80215804 ;V0=p->A0 bytes of allocated memory LUI A0,0001 ;A0=1MB SW V0,7570 (S0) ;V0->80227570: save new p->target //8020E334: copy codelist from ROM to ram LUI A0,0003 ;A0=30000: codelist LW A1,7570 (S0) ;A1=80227570: p->target JAL 802180A8 ;copy A2 bytes from hardware A0 to A1 LUI A2,0001 ;A2=0x10000 //8020E344: LUI S0,8022 LW V0,7574 (S0) ;V0=80227574: p->table of game entries in codelist BNE V0,R0,8020E370 ;branch if valid pointer NOP JAL 80215804 ;V0=p->A0 bytes of allocated memory ADDIU A0,R0,3E80 ;A0=3E80 bytes ADDIU A0,R0,0400 ;A0=400 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,7574 (S0) ;V0->80227574: save p->table of game entries in codelist LUI V1,8022 SW V0,7578 (V1) ;V0->80227578: p->memory //8020E370: JAL 8020E3C4 NOP JAL 8020E588 ;V0=#games in current codelist NOP LUI V1,8022 JAL 8020ED6C ;V0=total #codes in all game headings SW V0,7BE8 (V1) ;V0->80227BE8: #games //8020E38C: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 8020E39C replace codelist on ROM with revised copy ADDIU SP,SP,FFE8 LUI V0,8022 LUI A0,0003 ;A0=30000: code list LW A1,7570 (V0) ;A1=80227570: p->new codelist SW RA,0010 (SP) JAL 80217F04 ;write A2 bytes from A1 to hardware A0 LUI A2,0001 ;A2=10000 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8020E3C4 LUI V0,8022 LW V0,7570 (V0) ;V0=80227570: p->cur.codelist ADDIU SP,SP,FFD8 SW S0,0010 (SP) ADDU S0,R0,R0 SW RA,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW S1,0014 (SP) JAL 8020E588 ;V0=#games in current codelist ADDIU S1,V0,0004 LUI S3,8022 ADDU S2,V0,R0 ADDU A1,S0,R0 LW A0,7574 (S3) JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,3E80 BLEZ S2,8020E438 ADDU A0,S1,R0 SLL V0,S0,0x2 LW V1,7574 (S3) ADDIU S0,S0,0001 ADDU V0,V0,V1 JAL 8020E4AC SW A0,0004 (V0) ADDU S1,V0,R0 SLT V0,S0,S2 BNE V0,R0,8020E410 ADDU A0,S1,R0 LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8020E454 V0=p->game A0 entry in codelist accepts: A0=game# ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: game# BEQ S0,R0,8020E498 ;if entry 0, return FAILED! SW RA,0014 (SP) JAL 8020E588 ;V0=#games in current codelist NOP SLT V0,V0,S0 ;TRUE if total < game# BNE V0,R0,8020E49C ;return FAILED if invalid game# ADDIU V0,R0,FFFF LUI V0,8022 LW V1,7574 (V0) ;V1=80227574: p->table of game entries SLL V0,S0,0x2 ;V0=game#->offset ADDU V0,V0,V1 ;V0+=base LW V0,0000 (V0) ;V0=p->game# entry in list J 8020E49C NOP //8020E498: return FAILED! ADDIU V0,R0,FFFF //8020E49C: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 8020E4AC ADDIU SP,SP,FFE0 SW RA,0018 (SP) SW S1,0014 (SP) SW S0,0010 (SP) LBU V0,0000 (A0) BEQ V0,R0,8020E4DC ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,A0,S0 LBU V0,0000 (V0) BNEL V0,R0,8020E4CC ADDIU S0,S0,0001 ADDIU S0,S0,0001 ADDU V0,A0,S0 ADDIU S0,S0,0001 LBU S1,0000 (V0) BEQ S1,R0,8020E508 ADDU A0,A0,S0 ADDU S0,R0,R0 JAL 8020EAE8 ADDIU S0,S0,0001 BNE S0,S1,8020E4F8 ADDU A0,V0,R0 LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) ADDU V0,A0,R0 JR RA ADDIU SP,SP,0020 8020E520 V0=0 if successfully decreased #games by 1; else -1 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8020E588 ;V0=#games in current codelist NOP BEQL V0,R0,8020E544 ;branch if no games ADDIU V0,R0,FFFF ;V0= -1 JAL 8020E5BC ;set A0 games in current codelist ADDIU A0,V0,FFFF ;A0=V0-1: #games-1 ADDU V0,R0,R0 ;V0=0 //8020E544: LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8020E550 V0=0 if successfully increased #games by 1; else -1 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8020E588 ;V0=#games in current codelist NOP ADDU A0,V0,R0 ;A0=V0: #games ADDIU V0,R0,03E8 ;V0=0x3E8 1000 BEQ A0,V0,8020E57C ;branch if already 1000 games ADDIU V0,R0,FFFF ;V0= -1 failure JAL 8020E5BC ;set A0 games in current codelist ADDIU A0,A0,0001 ;A0++ #games++ ADDU V0,R0,R0 ;V0=0 success! //8020E57C: return LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8020E588 V0=#games in current codelist LUI V0,8022 LW V1,7570 (V0) ;V1=80227570: p->cur.codelist LBU V0,0000 (V1) ;pull #games one byte at a time and reconstruct LBU A0,0001 (V1) SLL V0,V0,0x8 ADDU V0,V0,A0 SLL V0,V0,0x8 LBU A0,0002 (V1) LBU V1,0003 (V1) ADDU V0,V0,A0 SLL V0,V0,0x8 JR RA OR V0,V0,V1 ;V0=#games in list 8020E5BC set A0 games in current codelist accepts: A0=#games LUI V1,8022 LW A1,7570 (V1) ;A1=80227570: p->cur.codelist SRA V0,A0,0x18 SB V0,0000 (A1) ;save each byte independantly LW A1,7570 (V1) SRA V0,A0,0x10 SB V0,0001 (A1) LW A1,7570 (V1) SRA V0,A0,0x8 SB V0,0002 (A1) LW V0,7570 (V1) JR RA SB A0,0003 (V0) 8020E5F0 ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,0018 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S1,0014 (SP) ADDU S1,V0,R0 ADDIU V0,R0,FFFF BEQ S1,V0,8020E6A4 NOP ADDIU V0,R0,0001 BNE S0,V0,8020E660 NOP JAL 8020E588 ;V0=#games in current codelist NOP BNE V0,S0,8020E660 ADDIU V1,R0,0004 LUI A1,8022 ORI A0,R0,FFFF LW V0,7570 (A1) ;V0=80227570: p->cur.codelist ADDU V0,V0,V1 ADDIU V1,V1,0001 SB R0,0000 (V0) SLT V0,A0,V1 BEQ V0,R0,8020E63C NOP J 8020E690 NOP JAL 8020E454 ;V0=p->game A0 entry in codelist ADDIU A0,S0,0001 ADDU S0,V0,R0 ADDIU V0,R0,FFFF BEQ S0,V0,8020E690 NOP JAL 8020E6B8 NOP ADDU A0,S1,R0 ADDU A1,S0,R0 JAL 8020FB70 SUBU A2,V0,A1 JAL 8020E520 ;V0=0 if successfully decreased #games by 1; else -1 NOP JAL 8020E3C4 NOP ADDU V0,R0,R0 LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020E6B8 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8020E588 ;V0=#games in current codelist NOP JAL 8020E454 ;V0=p->game A0 entry in codelist ADDU A0,V0,R0 ;A0=V0: #games JAL 8020E4AC ADDU A0,V0,R0 ;A0=V0: p->last game in list LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8020E6E4 ADDIU SP,SP,FFA8 SW S7,004C (SP) ADDU S7,A0,R0 SW S5,0044 (SP) ADDU S5,R0,R0 SW S3,003C (SP) ADDU S3,S5,R0 SW RA,0054 (SP) SW S8,0050 (SP) SW S6,0048 (SP) SW S4,0040 (SP) SW S2,0038 (SP) SW S1,0034 (SP) JAL 8020E588 ;V0=#games in current codelist SW S0,0030 (SP) ADDU S4,V0,R0 ADDIU V0,R0,03E8 BEQ S4,V0,8020E940 ADDIU V0,R0,FFFF JAL 802141F0 ;V0=strlen(A0) ADDU A0,S7,R0 JAL 8020E588 ;V0=#games in current codelist ADDU S1,V0,R0 BNE V0,R0,8020E7A0 LUI V0,8022 LW V0,7570 (V0) ;V0=80227570: p->cur.codelist ADDIU S0,V0,0004 SLT V0,S3,S1 BEQ V0,R0,8020E77C ADDU A0,R0,R0 ADDU V1,S0,A0 ADDU V0,S7,A0 LBU V0,0000 (V0) ADDIU A0,A0,0001 SB V0,0000 (V1) SLT V0,A0,S1 BNE V0,R0,8020E760 ADDU V1,S0,A0 JAL 8020E550 ;V0=0 if successfully increased #games by 1; else -1 ADDU A0,S0,R0 ADDIU S3,R0,0001 ADDU V0,S0,S1 SB R0,0000 (V0) J 8020E934 SB R0,0001 (V0) J 8020E940 ADDIU V0,R0,FFFE BEQ S4,R0,8020E934 ADDIU S2,R0,0001 ADDIU S6,SP,0010 LUI S8,0001 JAL 8020E454 ;V0=p->game A0 entry in codelist ADDU A0,S2,R0 ADDU S0,V0,R0 ADDU A1,S0,R0 LBU V0,0000 (S0) BEQ V0,R0,8020E804 ADDU A2,R0,R0 ADDU A0,S6,R0 LBU V1,0000 (A1) ADDIU V0,V1,FF9F SLTIU V0,V0,001A BEQ V0,R0,8020E7EC ADDIU V0,V1,FFE0 J 8020E7F0 SB V0,0000 (A0) SB V1,0000 (A0) ADDIU A0,A0,0001 ADDIU A1,A1,0001 LBU V0,0000 (A1) BNE V0,R0,8020E7D0 ADDIU A2,A2,0001 ADDU V0,S6,A2 SB R0,0000 (V0) ADDU A0,S7,R0 JAL 80211028 ADDU A1,S6,R0 BGTZ V0,8020E8A4 SLT V0,S2,S4 JAL 8020E6B8 NOP ADDU A2,V0,R0 ADDU V1,A2,S1 LUI A3,8022 LW V0,7570 (A3) ;V0=80227570: p->cur.codelist ADDIU V1,V1,0002 ADDU V0,V0,S8 SLTU V1,V1,V0 BEQ V1,R0,8020E798 ADDU A0,S0,S1 ADDIU A0,A0,0002 ADDU A1,S0,R0 JAL 8020FB70 SUBU A2,A2,S0 BLEZ S1,8020E884 ADDU A0,R0,R0 ADDU V1,S0,A0 ADDU V0,S7,A0 LBU V0,0000 (V0) ADDIU A0,A0,0001 SB V0,0000 (V1) SLT V0,A0,S1 BNE V0,R0,8020E868 ADDU V1,S0,A0 JAL 8020E550 ;V0=0 if successfully increased #games by 1; else -1 ADDU A0,S0,R0 ADDIU S5,R0,0001 ADDU S3,S2,R0 ADDU V0,S0,S1 SB R0,0000 (V0) J 8020E91C SB R0,0001 (V0) BNEL V0,R0,8020E920 ADDIU S2,S2,0001 JAL 8020E4AC ADDU A0,S0,R0 ADDU S0,V0,R0 ADDU V1,S0,S1 LUI A3,8022 LW V0,7570 (A3) ;V0=80227570: p->cur.codelist ADDIU V1,V1,0003 ADDU V0,V0,S8 SLTU V1,V1,V0 BEQ V1,R0,8020E940 ADDIU V0,R0,FFFE BLEZ S1,8020E900 ADDU A0,R0,R0 ADDU V1,S0,A0 ADDU V0,S7,A0 LBU V0,0000 (V0) ADDIU A0,A0,0001 SB V0,0000 (V1) SLT V0,A0,S1 BNE V0,R0,8020E8E4 ADDU V1,S0,A0 ADDU V0,S0,S1 SB R0,0000 (V0) SB R0,0001 (V0) JAL 8020E550 ;V0=0 if successfully increased #games by 1; else -1 SB R0,0002 (V0) ADDIU S5,R0,0001 ADDU S3,S4,S5 ADDIU S2,S2,0001 ADDIU V0,S4,0001 BEQ S2,V0,8020E934 NOP BEQ S5,R0,8020E7B0 NOP JAL 8020E3C4 NOP ADDU V0,S3,R0 LW RA,0054 (SP) LW S8,0050 (SP) LW S7,004C (SP) LW S6,0048 (SP) LW S5,0044 (SP) LW S4,0040 (SP) LW S3,003C (SP) LW S2,0038 (SP) LW S1,0034 (SP) LW S0,0030 (SP) JR RA ADDIU SP,SP,0058 8020E970 ADDIU SP,SP,FFD0 SW S6,0028 (SP) ADDU S6,A0,R0 SW S5,0024 (SP) ADDU S5,A1,R0 SW RA,002C (SP) SW S4,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW S1,0014 (SP) JAL 8020E588 ;V0=#games in current codelist SW S0,0010 (SP) SLT V0,V0,S6 BNE V0,R0,8020EA70 ADDIU V0,R0,FFFF JAL 8020E454 ;V0=p->game A0 entry in codelist ADDU A0,S6,R0 ADDU S1,V0,R0 ADDU S0,R0,R0 LBU V0,0000 (S1) BEQ V0,R0,8020E9DC ADDU S3,S1,R0 ADDIU S0,S0,0001 ADDU V0,S1,S0 LBU V0,0000 (V0) BNEL V0,R0,8020E9CC ADDIU S0,S0,0001 ADDIU S0,S0,0001 JAL 8020E6B8 ADDU S1,S1,S0 ADDU A0,S5,R0 JAL 802141F0 ;V0=strlen(A0) ADDU S4,V0,R0 ADDU S2,V0,R0 SUBU V0,S4,S0 ADDU V0,V0,S2 ADDIU V0,V0,0001 ;V0++ count++ LUI V1,8022 LW V1,7570 (V1) ;V1=80227570: p->cur.codelist LUI A0,0001 ADDU V1,V1,A0 ;V1=list + 10000: p->end of list SLTU V0,V0,V1 BNE V0,R0,8020EA28 ;loop for entire codelist ADDU A0,S3,S2 J 8020EA70 ADDIU V0,R0,FFFE ADDIU A0,A0,0001 ADDU A1,S1,R0 JAL 8020FB70 SUBU A2,S4,A1 ADDIU A0,S2,0001 BLEZ A0,8020EA64 ADDU S0,R0,R0 ADDU V1,S3,S0 ADDU V0,S5,S0 LBU V0,0000 (V0) ADDIU S0,S0,0001 SB V0,0000 (V1) SLT V0,S0,A0 BNE V0,R0,8020EA48 ADDU V1,S3,S0 JAL 8020E454 ;V0=p->game A0 entry in codelist ADDIU A0,S6,FFFF ADDU V0,R0,R0 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8020EA98 ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A1,R0 ADDIU V0,R0,FFFF BEQ A0,V0,8020EAD8 SW RA,0014 (SP) JAL 8020ED10 ;V0=#codes for game entry A0 NOP SLT V0,V0,S0 BNE V0,R0,8020EAD8 ADDIU V0,R0,FFFF LUI V0,8022 LW V1,7578 (V0) SLL V0,S0,0x2 ADDU V0,V0,V1 LW V0,0000 (V0) LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 8020EAE8 LBU V0,0000 (A0) BEQ V0,R0,8020EB08 ADDU V1,R0,R0 ADDIU V1,V1,0001 ADDU V0,A0,V1 LBU V0,0000 (V0) BNEL V0,R0,8020EAF8 ADDIU V1,V1,0001 ADDIU V1,V1,0001 ADDU V0,A0,V1 LBU A1,0000 (V0) ADDIU V1,V1,0001 ANDI A1,A1,007F BEQ A1,R0,8020EB34 ADDU A0,A0,V1 SLL V0,A1,0x1 ADDU V0,V0,A1 SLL V0,V0,0x1 ADDU A0,A0,V0 JR RA ADDU V0,A0,R0 8020EB3C ADDIU SP,SP,FFD8 SW S1,0014 (SP) ADDU S1,A0,R0 SW S0,0010 (SP) ADDU S0,A1,R0 SW RA,0020 (SP) SW S3,001C (SP) JAL 8020EA98 SW S2,0018 (SP) ADDU S2,V0,R0 ADDIU S3,R0,FFFF BNE S2,S3,8020EB78 ADDU A0,S1,R0 J 8020EBBC ADDU V0,S3,R0 JAL 8020EA98 ADDIU A1,S0,0001 ADDU S0,V0,R0 BNE S0,S3,8020EB98 NOP JAL 8020E4AC ADDU A0,S1,R0 ADDU S0,V0,R0 JAL 8020E6B8 NOP ADDU A0,S2,R0 ADDU A1,S0,R0 JAL 8020FB70 SUBU A2,V0,A1 JAL 8020EDD0 ADDU A0,S1,R0 ADDU V0,R0,R0 LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8020EBD8 ADDIU SP,SP,FFD8 SW S1,0014 (SP) ADDU S1,A0,R0 SW S3,001C (SP) ADDU S3,A1,R0 SW RA,0024 (SP) SW S4,0020 (SP) SW S2,0018 (SP) JAL 8020ED10 ;V0=#codes for game entry A0 SW S0,0010 (SP) ADDU S2,V0,R0 SLTI V0,S2,0064 BNE V0,R0,8020EC18 ADDU S4,S1,R0 J 8020ECF0 ADDIU V0,R0,FFFF LBU V0,0000 (S4) BEQ V0,R0,8020EC38 ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,S1,S0 LBU V0,0000 (V0) BNEL V0,R0,8020EC28 ADDIU S0,S0,0001 ADDIU S0,S0,0002 ADDU S1,S1,S0 BEQ S2,R0,8020EC5C ADDU S0,R0,R0 JAL 8020EAE8 ADDU A0,S1,R0 ADDIU S0,S0,0001 BNE S0,S2,8020EC48 ADDU S1,V0,R0 JAL 8020E6B8 NOP ADDU A0,S3,R0 JAL 802141F0 ;V0=strlen(A0) ADDU S0,V0,R0 ADDU S2,V0,R0 ADDU A0,S0,S2 ADDIU A0,A0,0002 LUI V0,8022 LW V0,7570 (V0) ;V0=80227570: p->cur.codelist LUI V1,0001 ADDU V0,V0,V1 ;V0+=10000: p->end of codelist SLTU A0,A0,V0 BNE A0,R0,8020ECA0 ;loop for entire list ADDU A0,S1,S2 J 8020ECF0 ADDIU V0,R0,FFFE ADDIU A0,A0,0002 ADDU A1,S1,R0 JAL 8020FB70 SUBU A2,S0,S1 ADDIU A0,S2,0001 BLEZ A0,8020ECDC ADDU S0,R0,R0 ADDU V1,S1,S0 ADDU V0,S3,S0 LBU V0,0000 (V0) ADDIU S0,S0,0001 SB V0,0000 (V1) SLT V0,S0,A0 BNE V0,R0,8020ECC0 ADDU V1,S1,S0 ADDU V0,S2,S1 SB R0,0001 (V0) JAL 8020EE10 ADDU A0,S4,R0 ADDU V0,R0,R0 LW RA,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8020ED10 V0=#codes for game entry A0 accepts: A0=p->game entry in codelist LBU V0,0000 (A0) ;V0=char BEQ V0,R0,8020ED30 ;branch if NULL ADDU V1,R0,R0 ;V1=0 init.count ADDIU V1,V1,0001 ;V1++ count++ //8020ED20: find terminator for game name string ADDU V0,A0,V1 ;V0=entry+count LBU V0,0000 (V0) ;V0=char BNEL V0,R0,8020ED20 ;loopo until NULL found ADDIU V1,V1,0001 ;V1++ //8020ED30: return #codes ADDU V0,V1,A0 ;V0=V1+A0: entry+offset LBU V0,0001 (V0) ;V0=entry+offset+1: #codes JR RA NOP 8020ED40 LBU V0,0000 (A0) BEQ V0,R0,8020ED60 ADDU V1,R0,R0 ADDIU V1,V1,0001 ADDU V0,A0,V1 LBU V0,0000 (V0) BNEL V0,R0,8020ED50 ADDIU V1,V1,0001 ADDU V0,V1,A0 JR RA SB A1,0001 (V0) 8020ED6C V0=total #codes in all game headings ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,R0,R0 ;S1=0 NULL SW RA,001C (SP) SW S2,0018 (SP) JAL 8020E588 ;V0=#games in current codelist SW S0,0010 (SP) ADDIU S0,R0,0001 ;S0=1 count ADDU V0,V0,S0 ;V0+=S0: #games+1 BEQ V0,S0,8020EDB4 ;quit if no games ADDU S2,V0,R0 ;S2=#games //8020ED98: loop for each game entry JAL 8020E454 ;V0=p->game A0 entry in codelist ADDU A0,S0,R0 ;A0=S0: count JAL 8020ED10 ;V0=#codes for game entry A0 ADDU A0,V0,R0 ;A0=V0: p->game S0 in codelist ADDIU S0,S0,0001 ;S0++ BNE S0,S2,8020ED98 ;loop until out of games ADDU S1,S1,V0 ;S1+=V0: total #codes //8020EDB4: return ADDU V0,S1,R0 ;V0=S1: total codes LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020EDD0 ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 8020ED10 ;V0=#codes for game entry A0 ADDU S0,A0,R0 BEQ V0,R0,8020EDFC ADDU A0,S0,R0 JAL 8020ED40 ADDIU A1,V0,FFFF J 8020EE00 ADDU V0,R0,R0 ADDIU V0,R0,FFFF LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 8020EE10 ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 8020ED10 ;V0=#codes for game entry A0 ADDU S0,A0,R0 ADDU A1,V0,R0 ADDIU V0,R0,0064 BEQ A1,V0,8020EE44 ADDU A0,S0,R0 JAL 8020ED40 ADDIU A1,A1,0001 J 8020EE48 ADDU V0,R0,R0 ADDIU V0,R0,FFFF LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 8020EE58 ADDIU SP,SP,FFD0 SW S1,0014 (SP) ADDU S1,A0,R0 SW S0,0010 (SP) ADDU S0,A1,R0 SW S5,0024 (SP) ADDU S5,A2,R0 SW RA,0028 (SP) SW S4,0020 (SP) SW S3,001C (SP) JAL 8020ED10 ;V0=#codes for game entry A0 SW S2,0018 (SP) SLT V0,V0,S0 BNE V0,R0,8020EF54 ADDIU V0,R0,FFFF ADDU A0,S1,R0 JAL 8020EA98 ADDU A1,S0,R0 ADDU S3,V0,R0 ADDU S1,S3,R0 LBU V0,0000 (S3) BEQ V0,R0,8020EEC8 ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,S1,S0 LBU V0,0000 (V0) BNEL V0,R0,8020EEB8 ADDIU S0,S0,0001 ADDIU S0,S0,0001 JAL 8020E6B8 ADDU S1,S1,S0 ADDU A0,S5,R0 JAL 802141F0 ;V0=strlen(A0) ADDU S4,V0,R0 ADDU S2,V0,R0 SUBU V0,S4,S0 ADDU V0,V0,S2 ADDIU V0,V0,0001 LUI V1,8022 LW V1,7570 (V1) ;V1=80227570: p->cur.codelist LUI A0,0001 ADDU V1,V1,A0 ;V1+=10000: p->end of list SLTU V0,V0,V1 BNE V0,R0,8020EF14 ;loop for entire list ADDU A0,S3,S2 J 8020EF54 ADDIU V0,R0,FFFE ADDIU A0,A0,0001 ADDU A1,S1,R0 JAL 8020FB70 SUBU A2,S4,A1 ADDIU A0,S2,0001 BLEZ A0,8020EF50 ADDU S0,R0,R0 ADDU V1,S3,S0 ADDU V0,S5,S0 LBU V0,0000 (V0) ADDIU S0,S0,0001 SB V0,0000 (V1) SLT V0,S0,A0 BNE V0,R0,8020EF34 ADDU V1,S3,S0 ADDU V0,R0,R0 LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8020EF78 ADDIU SP,SP,FFE0 SW S2,0018 (SP) ADDU S2,A1,R0 SW RA,001C (SP) SW S1,0014 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDU S1,V0,R0 ADDIU V0,R0,FFFF BEQ S1,V0,8020F040 NOP JAL 8020ED10 ;V0=#codes for game entry A0 ADDU A0,S1,R0 SLT V0,V0,S2 BNE V0,R0,8020F040 ADDIU V0,R0,FFFF LBU V0,0000 (S1) BEQ V0,R0,8020EFD8 ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,S1,S0 LBU V0,0000 (V0) BNEL V0,R0,8020EFC8 ADDIU S0,S0,0001 ADDIU S0,S0,0002 ADDU S1,S1,S0 ADDIU S0,R0,0001 SLT V0,S0,S2 BEQ V0,R0,8020F00C NOP JAL 8020EAE8 ADDU A0,S1,R0 ADDU S1,V0,R0 ADDIU S0,S0,0001 SLT V0,S0,S2 BNE V0,R0,8020EFF0 NOP LBU V0,0000 (S1) BEQ V0,R0,8020F02C ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,S1,S0 LBU V0,0000 (V0) BNEL V0,R0,8020F01C ADDIU S0,S0,0001 ADDIU S0,S0,0001 ADDU S1,S1,S0 LBU V0,0000 (S1) SLTI V0,V0,0080 XORI V0,V0,0001 LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020F058 ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A1,R0 SW S2,0018 (SP) ADDU S2,A2,R0 SW RA,001C (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDU A0,V0,R0 ADDIU V0,R0,FFFF BEQ A0,V0,8020F130 NOP LBU V0,0000 (A0) BEQ V0,R0,8020F0A8 ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,A0,S0 LBU V0,0000 (V0) BNEL V0,R0,8020F098 ADDIU S0,S0,0001 ADDIU S0,S0,0002 ADDU A0,A0,S0 ADDIU S0,R0,0001 SLT V0,S0,S1 BEQ V0,R0,8020F0D8 NOP JAL 8020EAE8 ADDIU S0,S0,0001 ADDU A0,V0,R0 SLT V0,S0,S1 BNE V0,R0,8020F0C0 NOP LBU V0,0000 (A0) BEQ V0,R0,8020F0F8 ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,A0,S0 LBU V0,0000 (V0) BNEL V0,R0,8020F0E8 ADDIU S0,S0,0001 ADDIU S0,S0,0001 ADDU A0,A0,S0 LBU V1,0000 (A0) ADDIU V0,R0,0001 BNE S2,V0,8020F120 SLL V0,V1,0x18 BLTZL V0,8020F12C SB V1,0000 (A0) J 8020F128 ADDIU V1,V1,FF80 BLTZL V0,8020F128 ADDIU V1,V1,FF80 SB V1,0000 (A0) ADDU V0,R0,R0 LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020F148 ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A0,R0 SW S2,0018 (SP) ADDU S2,A1,R0 ADDIU V0,R0,FFFF SW RA,001C (SP) BEQ S1,V0,8020F1CC SW S0,0010 (SP) JAL 8020F1EC ADDU A0,S1,R0 SLT V0,V0,S2 BNE V0,R0,8020F1CC ADDIU V0,R0,FFFF LBU V0,0000 (S1) BEQ V0,R0,8020F1A0 ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,S1,S0 LBU V0,0000 (V0) BNEL V0,R0,8020F190 ADDIU S0,S0,0001 ADDIU S0,S0,0002 ADDU S1,S1,S0 ADDIU S0,R0,0001 BEQ S2,S0,8020F1CC ADDU V0,S1,R0 JAL 8020F1E4 ADDU A0,S1,R0 ADDIU S0,S0,0001 BNE S0,S2,8020F1B4 ADDU S1,V0,R0 ADDU V0,S1,R0 LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020F1E4 V0=A0+6 JR RA ADDIU V0,A0,0006 8020F1EC: LBU V0,0000 (A0) BEQ V0,R0,8020F20C ADDU V1,R0,R0 ADDIU V1,V1,0001 ADDU V0,A0,V1 LBU V0,0000 (V0) BNEL V0,R0,8020F1FC ADDIU V1,V1,0001 ADDU V0,V1,A0 LBU V0,0001 (V0) JR RA ANDI V0,V0,007F 8020F21C: ADDU V1,A0,R0 ADDU A1,R0,R0 LBU V0,0000 (V1) BEQ V0,R0,8020F244 ADDU A0,A1,R0 ADDIU A0,A0,0001 ADDU V0,V1,A0 LBU V0,0000 (V0) BNEL V0,R0,8020F234 ADDIU A0,A0,0001 ADDIU A0,A0,0001 ADDU A0,V1,A0 LBU V1,0000 (A0) ANDI V0,V1,007F BEQ V0,R0,8020F264 ADDIU V0,V1,FFFF J 8020F268 SB V0,0000 (A0) ADDIU A1,R0,FFFF JR RA ADDU V0,A1,R0 8020F270: ADDU V1,A0,R0 ADDU A1,R0,R0 LBU V0,0000 (V1) BEQ V0,R0,8020F298 ADDU A0,A1,R0 ADDIU A0,A0,0001 ADDU V0,V1,A0 LBU V0,0000 (V0) BNEL V0,R0,8020F288 ADDIU A0,A0,0001 ADDIU A0,A0,0001 ADDU A0,V1,A0 LBU V1,0000 (A0) ANDI V0,V1,007F SLTIU V0,V0,0040 BEQ V0,R0,8020F2BC ADDIU V0,V1,0001 J 8020F2C0 SB V0,0000 (A0) ADDIU A1,R0,FFFF JR RA ADDU V0,A1,R0 8020F2C8: ADDIU SP,SP,FFD8 SW S1,0014 (SP) ADDU S1,A0,R0 SW S0,0010 (SP) ADDU S0,A1,R0 SW RA,0020 (SP) SW S3,001C (SP) JAL 8020F148 SW S2,0018 (SP) ADDU S2,V0,R0 ADDIU S3,R0,FFFF BNE S2,S3,8020F304 ADDU A0,S1,R0 J 8020F348 ADDU V0,S3,R0 JAL 8020F148 ADDIU A1,S0,0001 ADDU S0,V0,R0 BNE S0,S3,8020F324 NOP JAL 8020EAE8 ADDU A0,S1,R0 ADDU S0,V0,R0 JAL 8020E6B8 NOP ADDU A0,S2,R0 ADDU A1,S0,R0 JAL 8020FB70 SUBU A2,V0,A1 JAL 8020F21C ADDU A0,S1,R0 ADDU V0,R0,R0 LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8020F364 ADDIU SP,SP,FFD0 SW S1,0014 (SP) ADDU S1,A0,R0 SW S3,001C (SP) ADDU S3,A1,R0 SW S5,0024 (SP) ADDU S5,A2,R0 SW S4,0020 (SP) ADDU S4,S1,R0 SW RA,0028 (SP) SW S2,0018 (SP) JAL 8020F1EC SW S0,0010 (SP) ADDU S2,V0,R0 SLTI V0,S2,0040 BEQ V0,R0,8020F468 ADDIU V0,R0,FFFF LBU V0,0000 (S1) BEQ V0,R0,8020F3C8 ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,S1,S0 LBU V0,0000 (V0) BNEL V0,R0,8020F3B8 ADDIU S0,S0,0001 ADDIU S0,S0,0002 BEQ S2,R0,8020F3F8 ADDU S1,S1,S0 BLEZ S2,8020F3F8 ADDU S0,R0,R0 JAL 8020F1E4 ADDU A0,S1,R0 ADDU S1,V0,R0 ADDIU S0,S0,0001 SLT V0,S0,S2 BNE V0,R0,8020F3DC NOP JAL 8020E6B8 NOP ADDU S0,V0,R0 ADDIU A0,S0,0006 LUI V0,8022 LW V0,7570 (V0) ;V0=80227570: p->cur.codelist LUI V1,0001 ADDU V0,V0,V1 ;V0+=10000: p->end of list SLTU A0,A0,V0 BEQ A0,R0,8020F468 ADDIU V0,R0,FFFE JAL 8020F270 ADDU A0,S4,R0 ADDIU A0,S1,0006 ADDU A1,S1,R0 JAL 8020FB70 SUBU A2,S0,S1 ADDU V0,R0,R0 SRA V1,S3,0x18 SB V1,0000 (S1) SRA V1,S3,0x10 SB V1,0001 (S1) SRA V1,S3,0x8 SB V1,0002 (S1) SRA V1,S5,0x8 SB S3,0003 (S1) SB V1,0004 (S1) SB S5,0005 (S1) LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8020F48C ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A1,R0 SW S2,0018 (SP) ADDU S2,A2,R0 SW RA,001C (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDIU S0,R0,FFFF BEQ V0,S0,8020F4E4 ADDU A0,V0,R0 ADDU A1,S1,R0 JAL 8020EE58 ADDU A2,S2,R0 ADDU A0,V0,R0 BEQ A0,S0,8020F4E4 ADDIU V0,R0,FFFE ADDU V1,V0,R0 BNEL A0,V1,8020F4E8 ADDU V0,R0,R0 J 8020F4E8 NOP ADDIU V0,R0,FFFF LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020F500 ADDIU SP,SP,FFE0 SW S2,0018 (SP) ADDU S2,A0,R0 SW S1,0014 (SP) ADDU S1,A1,R0 SW RA,001C (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDIU S0,R0,FFFF BEQ V0,S0,8020F540 ADDU A0,V0,R0 JAL 8020EBD8 ADDU A1,S1,R0 ADDU V1,V0,R0 BNE V1,S0,8020F548 ADDIU V0,R0,FFFE J 8020F564 ADDIU V0,R0,FFFF BEQ V1,V0,8020F564 ADDIU V0,R0,FFFE JAL 8020E3C4 NOP JAL 8020F664 ADDU A0,S2,R0 ADDU V0,R0,R0 LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020F57C ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A1,R0 SW RA,001C (SP) SW S2,0018 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDU A1,V0,R0 ADDIU V0,R0,FFFF BEQ A1,V0,8020F64C NOP LBU V0,0000 (A1) BEQ V0,R0,8020F5C8 ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,A1,S0 LBU V0,0000 (V0) BNEL V0,R0,8020F5B8 ADDIU S0,S0,0001 ADDIU S0,S0,0002 ADDU A1,A1,S0 ADDU A0,A1,R0 LUI V1,8022 LW V0,7578 (V1) ADDIU S0,R0,0001 BLEZ S1,8020F64C SW A1,0004 (V0) ADDU S2,V1,R0 LBU V0,0000 (A1) BEQ V0,R0,8020F60C ADDU V1,R0,R0 ADDIU V1,V1,0001 ADDU V0,A1,V1 LBU V0,0000 (V0) BNEL V0,R0,8020F5FC ADDIU V1,V1,0001 ADDIU V1,V1,0001 SLT V0,S0,S1 BEQ V0,R0,8020F62C ADDU A1,A1,V1 JAL 8020EAE8 NOP ADDU A1,V0,R0 ADDU A0,A1,R0 SLL V0,S0,0x2 LW V1,7578 (S2) ADDIU S0,S0,0001 ADDU V0,V0,V1 SW A1,0004 (V0) SLT V0,S1,S0 BEQ V0,R0,8020F5EC NOP LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020F664 ADDIU SP,SP,FFE0 SW S2,0018 (SP) ADDU S2,A0,R0 SW RA,001C (SP) SW S1,0014 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDIU S1,R0,FFFF BEQL V0,S1,8020F6B4 ADDIU V0,R0,FFFF JAL 8020ED10 ;V0=#codes for game entry A0 ADDU A0,V0,R0 ADDU S0,V0,R0 BEQ S0,S1,8020F6B0 ADDU A0,S2,R0 JAL 8020F57C ADDU A1,S0,R0 J 8020F6B4 ADDU V0,S0,R0 ADDIU V0,R0,FFFF LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020F6CC ADDIU SP,SP,FFE0 SW S2,0018 (SP) ADDU S2,A0,R0 SW S1,0014 (SP) ADDU S1,A1,R0 SW RA,001C (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDIU S0,R0,FFFF BEQ V0,S0,8020F720 ADDU A0,V0,R0 JAL 8020EB3C ADDU A1,S1,R0 BEQ V0,S0,8020F724 ADDIU V0,R0,FFFF JAL 8020E3C4 NOP JAL 8020F664 ADDU A0,S2,R0 J 8020F724 ADDU V0,R0,R0 ADDIU V0,R0,FFFF LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020F73C ADDIU SP,SP,FFD8 SW S2,0018 (SP) ADDU S2,A0,R0 SW S1,0014 (SP) ADDU S1,A1,R0 SW S3,001C (SP) ADDU S3,A2,R0 SW RA,0020 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDIU S0,R0,FFFF BEQ V0,S0,8020F7A8 ADDU A0,V0,R0 JAL 8020EA98 ADDU A1,S1,R0 BEQ V0,S0,8020F7A8 ADDU A0,V0,R0 JAL 8020F2C8 ADDU A1,S3,R0 BEQ V0,S0,8020F7AC ADDIU V0,R0,FFFF JAL 8020E3C4 NOP JAL 8020F664 ADDU A0,S2,R0 J 8020F7AC ADDU V0,R0,R0 ADDIU V0,R0,FFFF LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8020F7C8 ADDIU SP,SP,FFD8 SW S4,0020 (SP) ADDU S4,A0,R0 SW S2,0018 (SP) ADDU S2,A1,R0 SW S3,001C (SP) ADDU S3,A2,R0 SW S1,0014 (SP) ADDU S1,A3,R0 SW RA,0024 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDIU S0,R0,FFFF BEQ V0,S0,8020F830 ADDU A0,V0,R0 JAL 8020EA98 ADDU A1,S2,R0 BEQ V0,S0,8020F830 ADDU A0,V0,R0 ADDU A1,S3,R0 SLL A2,S1,0x10 JAL 8020F364 SRA A2,A2,0x10 ADDU V1,V0,R0 BNE V1,S0,8020F838 ADDIU V0,R0,FFFE J 8020F854 ADDIU V0,R0,FFFF BEQ V1,V0,8020F854 ADDIU V0,R0,FFFE JAL 8020E3C4 NOP JAL 8020F664 ADDU A0,S4,R0 ADDU V0,R0,R0 LW RA,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8020F874 ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A1,R0 SW RA,0018 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDIU S0,R0,FFFF BEQ V0,S0,8020F8C4 ADDU A0,V0,R0 JAL 8020EA98 ADDU A1,S1,R0 BEQL V0,S0,8020F8C8 ADDIU V0,R0,FFFF JAL 8020F1EC ADDU A0,V0,R0 ADDU V1,V0,R0 BEQ V1,S0,8020F8C8 ADDIU V0,R0,FFFF J 8020F8C8 ADDU V0,V1,R0 ADDIU V0,R0,FFFF LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020F8DC ADDIU SP,SP,FFD0 SW S5,0024 (SP) LW S5,0040 (SP) SW S3,001C (SP) ADDU S3,A1,R0 SW S4,0020 (SP) ADDU S4,A2,R0 SW S2,0018 (SP) ADDU S2,A3,R0 SW RA,0028 (SP) SW S1,0014 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist SW S0,0010 (SP) ADDU S0,V0,R0 ADDIU S1,R0,FFFF BEQ S0,S1,8020F988 ADDU A0,S0,R0 JAL 8020EA98 ADDU A1,S3,R0 ADDU S0,V0,R0 BEQ S0,S1,8020F98C ADDIU V0,R0,FFFF JAL 8020F1EC ADDU A0,S0,R0 SLT V0,V0,S4 BNE V0,R0,8020F98C ADDIU V0,R0,FFFF ADDU A0,S0,R0 JAL 8020F148 ADDU A1,S4,R0 ADDU S0,V0,R0 ADDU V0,R0,R0 SRA V1,S2,0x18 SB V1,0000 (S0) SRA V1,S2,0x10 SB V1,0001 (S0) SRA V1,S2,0x8 SB V1,0002 (S0) SRA V1,S5,0x8 SB S2,0003 (S0) SB V1,0004 (S0) J 8020F98C SB S5,0005 (S0) ADDIU V0,R0,FFFF LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8020F9B0 ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,001C (SP) SW S2,0018 (SP) JAL 8020F664 SW S1,0014 (SP) ADDU S2,V0,R0 BEQ S2,R0,8020FA88 ADDU V0,R0,R0 JAL 8020E454 ;V0=p->game A0 entry in codelist ADDU A0,S0,R0 ADDU A1,V0,R0 ADDIU V0,R0,FFFF BEQ A1,V0,8020FA88 NOP LBU V0,0000 (A1) BEQ V0,R0,8020FA10 ADDU S0,R0,R0 ADDIU S0,S0,0001 ADDU V0,A1,S0 LBU V0,0000 (V0) BNEL V0,R0,8020FA00 ADDIU S0,S0,0001 ADDIU S0,S0,0001 ADDU A1,A1,S0 ADDU S1,R0,R0 ADDU A0,A1,R0 BLEZ S2,8020FA84 ADDIU S0,R0,0001 LBU V0,0000 (A1) BEQ V0,R0,8020FA48 ADDU V1,R0,R0 ADDIU V1,V1,0001 ADDU V0,A1,V1 LBU V0,0000 (V0) BNEL V0,R0,8020FA38 ADDIU V1,V1,0001 ADDIU V1,V1,0001 ADDU A1,A1,V1 LB V0,0000 (A1) BLTZL V0,8020FA5C ADDIU S1,S1,0001 SLT V0,S0,S2 BEQ V0,R0,8020FA78 ADDIU S0,S0,0001 JAL 8020EAE8 NOP ADDU A1,V0,R0 ADDU A0,A1,R0 SLT V0,S2,S0 BEQ V0,R0,8020FA28 NOP ADDU V0,S1,R0 LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020FAA0 ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A1,R0 SW S1,0014 (SP) SW RA,0018 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist ADDU S1,A2,R0 ADDU A0,V0,R0 JAL 8020EA98 ADDU A1,S0,R0 ADDU V1,V0,R0 LBU V0,0000 (V1) BEQ V0,R0,8020FAF8 ADDU A1,R0,R0 ADDU A0,V1,R0 LBU V0,0000 (A0) ADDIU A0,A0,0001 ADDU V1,S1,A1 SB V0,0000 (V1) LBU V0,0000 (A0) BNE V0,R0,8020FADC ADDIU A1,A1,0001 ADDU V0,S1,A1 SB R0,0000 (V0) LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8020FB14 ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist ADDU S0,A1,R0 ADDU V1,V0,R0 LBU V0,0000 (V1) BEQ V0,R0,8020FB58 ADDU A1,R0,R0 ADDU A0,V1,R0 LBU V0,0000 (A0) ADDIU A0,A0,0001 ADDU V1,S0,A1 SB V0,0000 (V1) LBU V0,0000 (A0) BNE V0,R0,8020FB3C ADDIU A1,A1,0001 ADDU V0,S0,A1 SB R0,0000 (V0) LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 8020FB70 ADDU V0,A1,A2 SLTU V0,A0,V0 BEQ V0,R0,8020FBB0 SLTU V0,A1,A0 BEQ V0,R0,8020FBB0 ADDIU A3,A2,FFFF BLTZ A3,8020FBD8 NOP ADDU V0,A0,A3 ADDU V1,A1,A3 LBU V1,0000 (V1) ADDIU A3,A3,FFFF BGEZ A3,8020FB90 SB V1,0000 (V0) JR RA NOP BLEZ A2,8020FBA8 ADDU A3,R0,R0 ADDU V1,A0,A3 ADDU V0,A1,A3 LBU V0,0000 (V0) ADDIU A3,A3,0001 SB V0,0000 (V1) SLT V0,A3,A2 BNE V0,R0,8020FBBC ADDU V1,A0,A3 JR RA NOP 8020FBE0 ADDIU SP,SP,FFD8 SW S0,0010 (SP) ADDU S0,A1,R0 SW S3,001C (SP) ADDU S3,A2,R0 SW S2,0018 (SP) ADDU S2,A3,R0 SW S1,0014 (SP) SW RA,0020 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist ADDU S1,R0,R0 ADDU A0,V0,R0 JAL 8020EA98 ADDU A1,S0,R0 ADDU S0,V0,R0 JAL 8020F1EC ADDU A0,S0,R0 BNEL V0,R0,8020FC38 ADDU A0,S0,R0 SW R0,0000 (S2) J 8020FC80 SW R0,0004 (S2) JAL 8020F148 ADDU A1,S3,R0 ADDU S0,V0,R0 ADDU A0,R0,R0 ADDU V0,S0,A0 ADDIU A0,A0,0001 LBU V1,0000 (V0) SLL V0,S1,0x8 ADDU S1,V0,V1 SLTI V0,A0,0004 BNE V0,R0,8020FC4C ADDU V0,S0,A0 SW S1,0000 (S2) LBU S1,0004 (S0) LBU V1,0005 (S0) SLL V0,S1,0x8 ADDU S1,V0,V1 SW S1,0004 (S2) LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8020FC9C V0=address byte used by 50 loop command (cur.code+3) accepts: V0=p->buffer LUI V1,8025 LW V1,9124 (V1) ;V1=80249124: p->codelist ADDIU SP,SP,FFF8 SW V0,0000 (SP) SW V1,0000 (V0) ;p->codelist->buffer LBU A0,0003 (V1) ;A0=code[3]: address byte used by loop increment ADDIU V1,V1,0004 ;V1=next address SW V1,0000 (V0) ;p->codelist+4->buffer ADDU V0,A0,R0 ;V0=A0 JR RA ADDIU SP,SP,0008 8020FCC8 ADDIU SP,SP,FFF8 SW V0,0000 (SP) LW A2,0000 (V0) LBU V1,0000 (A2) LBU A1,0001 (A2) LBU A0,0002 (A2) SLL V1,V1,0x18 SLL A1,A1,0x10 OR V1,V1,A1 SLL A0,A0,0x8 OR V1,V1,A0 LBU A0,0003 (A2) OR V1,V1,A0 SW V1,0004 (V0) ADDU V1,A2,R0 LBU A1,0004 (A2) LBU A0,0005 (A2) ADDIU V1,V1,0006 SW V1,0000 (V0) SLL A1,A1,0x8 OR A0,A0,A1 SH A0,0008 (V0) JR RA ADDIU SP,SP,0008 8020FD28 V0=0 if a short write code, -1 if not so accepts: A0=code.address ADDIU SP,SP,FFF8 SW V0,0000 (SP) LUI V1,0100 ORI V1,V1,0001 ;V1=01000001: mask for short write, non-short alignment AND A0,A0,V1 ;A0&=01000001 LUI V1,0100 BNE A0,V1,8020FD4C ;branch if not a short write ADDIU V0,R0,FFFF ;V0=-1 ADDU V0,R0,R0 ;V0=0 //8020FD4C: JR RA ADDIU SP,SP,0008 8020FD54 V0=0 if A0 isn't a short write; else -1 accepts: A0=code.address ADDIU SP,SP,FFE0 SW RA,0018 (SP) JAL 8020FD28 ;V0=0 if a short write code, -1 if not so SW V0,0010 (SP) ADDU V1,V0,R0 ;V1=V0: short flag BEQ V1,R0,8020FD74 ;branch if a short write ADDIU V0,R0,FFFF ;V0= -1 ADDU V0,R0,R0 ;V0=0 //8020FD74: return LW RA,0018 (SP) JR RA ADDIU SP,SP,0020 8020FD80 V0=0 if A0 isn't a Fn- type code; else -1 accepts: A0=code.address ADDIU SP,SP,FFF8 SW V0,0000 (SP) LUI V1,F000 AND A0,A0,V1 ;A0&=F0000000 BEQ A0,V1,8020FD9C ;branch if an Fn code ADDIU V0,R0,FFFF ;V0= -1 yep ADDU V0,R0,R0 ;V0=0 nope //8020FD9C: return JR RA ADDIU SP,SP,0008 8020FDA4 V0=0 if A0 isn't a GS-button activated code; else -1 accepts: A0=code.address ADDIU SP,SP,FFF8 SW V0,0000 (SP) LUI V1,0800 AND A0,A0,V1 ;A0&=08000000 BNE A0,R0,8020FDC0 ;branch if a GS-button activated code ADDIU V0,R0,FFFF ;V0= -1 yep ADDU V0,R0,R0 ;V0=0 nope //8020FDC0: return JR RA ADDIU SP,SP,0008 8020FDC8 V0=0 if A0 isn't a Dn- type code; else -1 accepts: A0=code.address ADDIU SP,SP,FFF8 SW V0,0000 (SP) LUI V1,F000 AND A0,A0,V1 ;A0&=F0000000: code:type LUI V1,D000 BEQ A0,V1,8020FDE8 ;branch if a Dn code ADDIU V0,R0,FFFF ;V0=-1 yep ADDU V0,R0,R0 ;V0=0 nope //8020FDE8: return JR RA ADDIU SP,SP,0008 8020FDF0 V0=0 if 04000000 isn't set in A0; else -1 accepts: A0=code.address ADDIU SP,SP,FFF8 SW V0,0000 (SP) LUI V1,0400 AND A0,A0,V1 ;A0&=04000000 BNE A0,R0,8020FE0C ;branch if set ADDIU V0,R0,FFFF ;V0= -1 ADDU V0,R0,R0 ;V0=0 //8020FE0C: return JR RA ADDIU SP,SP,0008 8020FE14 ADDIU SP,SP,FFB8 SW S7,003C (SP) ADDIU S7,R0,0037 LUI V0,A000 ORI V0,V0,0204 ;V0=A0000204: default 4MB codelist location LUI A0,8025 SW V0,A6FC (A0) ;A0000204->8024A6FC: set default 4MB codelist location LUI V0,8025 LW V1,9110 (V0) ;V1=80249110: size of RAM LUI V0,0080 SW RA,0044 (SP) SW S8,0040 (SP) SW S6,0038 (SP) SW S5,0034 (SP) SW S4,0030 (SP) SW S3,002C (SP) SW S2,0028 (SP) SW S1,0024 (SP) BNE V1,V0,8020FE8C ;branch if 8MB exp.pak not present SW S0,0020 (SP) //8020FE64: 8MB codelist location... LUI V0,A07C ORI V0,V0,5C00 ;V0=A07C5C00: default 8MB codelist location LUI V1,8022 LW V1,7BF4 (V1) ;V1=80227BF4: FALSE if custom codelist location ADDIU S7,R0,03E8 BNE V1,R0,8020FE8C ;branch if default codelist location SW V0,A6FC (A0) ;A07C5C00->8024A6FC: set default 8MB codelist location LUI V0,8022 LW V0,7BDC (V0) ;V0=80227BDC: custom codelist target location SW V0,A6FC (A0) ;V0->8024A6FC: set codelist location //8020FE8C: JAL 80215804 ;V0=p->A0 bytes of allocated memory ADDIU A0,R0,0100 ;A0=100 bytes ADDU A0,V0,R0 LUI S1,8025 LW V0,A6FC (S1) ;V0=8024A6FC: ADDIU V1,R0,FFFF BEQ V0,V1,80210230 ADDIU V0,R0,0001 BEQ A0,V1,80210230 NOP JAL 8020FC9C ADDIU V0,SP,0010 ADDU S3,R0,R0 ADDU S5,V0,R0 BEQ S5,R0,80210154 ADDU S0,S3,R0 ADDU S2,S1,R0 ;S2=80250000: LUI S4,3C1A ORI S4,S4,8000 ;S4=3C1A8000: LUI K0,8000 LUI S6,375A ;S6=375A0000: ORI K0,K0,0000 LUI S8,241B ;S8=241B0000: ADDIU K1,R0,0000 JAL 8020FCC8 ADDIU V0,SP,0010 LW A0,0014 (SP) JAL 8020FDC8 ;V0=0 if A0 isn't a Dn- type code; else -1 ADDIU V0,SP,0010 BEQ V0,R0,8020FFB4 SLL A2,S0,0x2 ADDIU S0,S0,0001 SLL A3,S0,0x2 ADDIU S0,S0,0001 ADDIU V0,SP,0010 LW A0,0014 (SP) LW A1,A6FC (S2) ;A1=8024A6FC: LBU V1,0015 (SP) ADDU A2,A2,A1 OR V1,V1,S4 ADDU A3,A3,A1 SW V1,0000 (A2) ANDI V1,A0,FFFF OR V1,V1,S6 JAL 8020FD28 ;V0=0 if a short write code, -1 if not so SW V1,0000 (A3) BEQ V0,R0,8020FF54 SLL V0,S0,0x2 LW V1,A6FC (S2) ADDIU S0,S0,0001 ADDU V0,V0,V1 J 8020FF64 LUI V1,835A // LW V1,A6FC (S2) ADDIU S0,S0,0001 ADDU V0,V0,V1 LUI V1,875A SW V1,0000 (V0) SLL V1,S0,0x2 ADDIU S0,S0,0001 LW A0,A6FC (S2) LHU V0,0018 (SP) ADDU V1,V1,A0 ADDU V0,V0,S8 SW V0,0000 (V1) LW V0,0014 (SP) LUI V1,0200 AND V0,V0,V1 BEQ V0,R0,8020FF9C LUI V1,175B LUI V1,135B ORI V1,V1,0004 SLL V0,S0,0x2 ADDU V0,V0,A0 SW V1,0000 (V0) J 80210138 ADDIU S0,S0,0001 // LW A0,0014 (SP) JAL 8020FD28 ;V0=0 if a short write code, -1 if not so ADDIU V0,SP,0010 BNE V0,R0,8020FFDC NOP LW A0,0014 (SP) JAL 8020FD54 ;V0=0 if A0 isn't a short write; else -1 ADDIU V0,SP,0010 BEQ V0,R0,8021013C SLT V0,S7,S0 LW A0,0014 (SP) JAL 8020FDA4 ;V0=0 if A0 isn't a GS-button activated code; else -1 ADDIU V0,SP,0010 BEQ V0,R0,8021008C SLL A2,S0,0x2 ;A2=4(S0) ADDIU S0,S0,0001 ;S0++ count.ops SLL T0,S0,0x2 ;T0=4(S0+1) ADDIU S0,S0,0001 ;S0++ SLL T2,S0,0x2 ;T2=4(S0+2) ADDIU S0,S0,0001 ;S0++ SLL T3,S0,0x2 ;T3=4(S0+3) ADDIU S0,S0,0001 ;S0++ LUI T5,337B ORI T5,T5,0400 ;T5=337B0400: ANDI K1,K1,0400 mask for GS button on port SLL T1,S0,0x2 ;T1=4(S0+4) ADDIU S0,S0,0001 ;S0++ LUI T4,1760 ORI T4,T4,0004 ;T4=17600004: BNEZ K1,+20 SLL A3,S0,0x2 ;A3=4(S0+5) ADDIU S0,S0,0001 ;S0++ LUI V0,8022 LUI V1,BE00 LW A0,7D30 (V0) ;A0=80227D30: hardware bank LW A1,A6FC (S2) ADDU A0,A0,V1 ;A0+=BE000000: bank in GS/AR ROM ADDU A2,A2,A1 ;A2+=base address SRL V0,A0,0x10 ;V0=upper two bytes of hardware address LUI V1,3C1A OR V0,V0,V1 ;V0=3C1A0000 | hardware range+bank: LUI K0,BE## ADDU T0,T0,A1 ANDI A0,A0,FFFF ;A0=lower short of address OR A0,A0,S6 ;A0=375A####: ORI K0,K0,#### ADDU T2,T2,A1 SW V0,0000 (A2) ;LUI...->A2+0: LUI V0,875B ;V0=875B0000: LH K1,0000 (K0) ADDU T3,T3,A1 SW A0,0000 (T0) ;ORI...->T0+0: SW V0,0000 (T2) ;LH....->T2+0: ADDIU V0,R0,000F ;V0=0000000F: SYNC ADDU T1,T1,A1 ADDU A3,A3,A1 SW V0,0000 (T3) ;SYNC..->T3+0: SW T5,0000 (T1) ;ANDI..->T1+0: SW T4,0000 (A3) ;BNEZ..->A3+0: SLL A2,S0,0x2 ;A2=4(S0+6) ADDIU S0,S0,0001 ;S0++ SLL A3,S0,0x2 ;A2=4(S0+7) ADDIU S0,S0,0001 ;S0++ ADDIU V0,SP,0010 SLL S1,S0,0x2 ;A2=4(S0+8) LW A0,0014 (SP) ;A0=SP+14: code.addy LW A1,A6FC (S2) LBU V1,0015 (SP) ;V1=SP+15: code.bank: address bank, as per mask 00FF0000 ADDU A2,A2,A1 OR V1,V1,S4 ;V1=LUI K0,8000 | V1: upper half of dram target address ADDU A3,A3,A1 SW V1,0000 (A2) ;LUI...->A2+0 ANDI V1,A0,FFFF ;V1=code.addy & FFFF: lower half of address OR V1,V1,S6 ;V1=ORI K0,K0,0000 | V1: lower half of dram target address ADDU A1,S1,A1 SW V1,0000 (A3) ;ORI...->A3+0 JAL 8020FD28 ;V0=0 if A0 is a 2-byte write SW S8,0000 (A1) ;ADDIU->A1+0: ADDIU K1,R0,0000 BEQ V0,R0,8021010C ;branch if short write ADDIU S0,S0,0001 ;S0++ count.ops //802100E0: byte write SLL V1,S0,0x2 ADDIU S0,S0,0001 ;S0++ count.ops LW A2,A6FC (S2) LBU A0,0019 (SP) ADDU A1,S1,A2 LW V0,0000 (A1) ADDU V1,V1,A2 ADDU V0,V0,A0 SW V0,0000 (A1) J 80210134 LUI V0,A35B //8021010C: short write SLL V1,S0,0x2 ADDIU S0,S0,0001 ;S0++ count.ops LW A2,A6FC (S2) LHU A0,0018 (SP) ADDU A1,S1,A2 LW V0,0000 (A1) ADDU V1,V1,A2 ADDU V0,V0,A0 SW V0,0000 (A1) LUI V0,A75B //80210134: SW V0,0000 (V1) SLT V0,S7,S0 BNE V0,R0,80210158 LUI A1,0340 ADDIU S3,S3,0001 SLTU V0,S3,S5 BNE V0,R0,8020FEE0 NOP LUI A1,0340 //80210158: ORI A1,A1,0008 LUI A2,A000 ORI A2,A2,0204 ;A2=A0000204: 4MB codelist location LUI A3,8025 SLL V1,S0,0x2 LUI T6,8000 ADDIU T6,T6,0120 SRL V0,T6,0x10 LUI T1,3C1A ;T1=3C1A0000: LUI K0,#### ADDU V0,V0,T1 LUI T6,8000 ADDIU T6,T6,0120 LW A0,A6FC (A3) ;A0=8024A6FC: p->codelist target LUI T0,375A ;T0=375A0000: ORI K0,K0,#### ADDU V1,V1,A0 SW V0,0000 (V1) ANDI V0,T6,FFFF ADDU V0,V0,T0 SW V0,0004 (V1) ADDIU V0,R0,0020 SW A1,0008 (V1) BEQ A0,A2,8021022C SW V0,000C (V1) LUI V0,8022 LW V1,7BF4 (V0) ;V1=80227BF4: FALSE if custom codelist location ADDIU V0,R0,0001 BNE V1,V0,802101EC ;branch if using custom location SW A2,A6FC (A3) ;A2->8024A6FC: set codelist target to 4MB location //802101C8: 8MB std. location ADDU V1,T1,R0 ;V1=T1: LUI K0,#### ORI V1,V1,A07C ;V1|=A07C: upper half of 8MB codelist address ADDU V0,T0,R0 ;V0=T0: ORI K0,K0,#### ORI V0,V0,5C00 ;V0|=5C00: lower half of 8MB codelist location SW V1,0000 (A2) ;V1->A0000204: LUI K0,A07C LUI AT,A000 SW V0,0208 (AT) ;V0->A0000208: ORI K0,K0,5C00 J 80210214 LUI A0,0340 //802101EC: set custom 8MB location LUI V0,8022 LW V1,7BDC (V0) ;V1=80227BDC: custom codelist target location SRL V0,V1,0x10 ;V0=upper half of target ADDU V0,V0,T1 ;V0+=LUI K0 ANDI V1,V1,FFFF ;V1=lower half of target ADDU V1,V1,T0 ;V1+=ORI K0,K0 SW V0,0000 (A2) ;V0->A0000204: LUI K0,xxxx LUI AT,A000 SW V1,0208 (AT) ;V1->A0000208: ORI K0,K0,xxxx //80210210: finish hook to codelist LUI A0,0340 LUI V0,8025 ORI A0,A0,0008 ;A0=03400008: JR K0 LW V1,A6FC (V0) ;V1=8024A6FC: p->codelist target ADDIU V0,R0,0020 ;V0=00000020: ADD R0,R0,R0 SW A0,0008 (V1) ;A0->target+8: JR K0 SW V0,000C (V1) ;V0->target+C: ADD R0,R0,R0 //8021022C: ADDU V0,R0,R0 LW RA,0044 (SP) LW S8,0040 (SP) LW S7,003C (SP) LW S6,0038 (SP) LW S5,0034 (SP) LW S4,0030 (SP) LW S3,002C (SP) LW S2,0028 (SP) LW S1,0024 (SP) LW S0,0020 (SP) JR RA ADDIU SP,SP,0048 80210260 ADDIU SP,SP,FFB8 SW S3,002C (SP) ADDU S3,A0,R0 SW S2,0028 (SP) ADDU S2,A1,R0 SW S1,0024 (SP) ADDU S1,A2,R0 SW RA,0044 (SP) SW S8,0040 (SP) SW S7,003C (SP) SW S6,0038 (SP) SW S5,0034 (SP) SW S4,0030 (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM SW S0,0020 (SP) JAL 80212B20 ADDIU A0,R0,0001 ADDIU A0,R0,000E ADDU A1,A0,R0 ADDIU A2,R0,001F ADDIU S6,R0,0046 ADDU S4,R0,R0 ADDU S8,S4,R0 ADDU S5,S4,R0 LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: string pointer table LW A3,00CC (S0) ADDU S7,S4,R0 JAL 80212C90 SW R0,0010 (SP) ADDIU A0,R0,000E ADDIU A1,R0,0022 LW A3,0368 (S0) ADDIU A2,R0,001F JAL 80212C90 SW R0,0010 (SP) SLL V0,S2,0x3 SUBU V0,V0,S2 ADDU S3,V0,S3 ADDIU S1,S1,0080 SLL V0,S3,0x3 ADDU V0,V0,S3 SLL V0,V0,0x3 SUBU S1,S1,V0 ADDU S2,S1,S6 SLTIU V0,S8,0003 BEQ V0,R0,802103F4 ADDIU A0,S1,0006 BLTZ A0,80210370 ADDIU V1,R0,0040 SLTI V0,S2,0140 BNE V0,R0,80210358 ADDIU A1,S6,0006 SLTI V0,A0,0140 BEQ V0,R0,8021039C ADDIU A2,R0,0140 SUBU A2,A2,A0 ADDIU A3,R0,0030 SW V1,0010 (SP) SW V1,0014 (SP) J 80210394 SW V1,0018 (SP) ADDIU A2,R0,0040 ADDIU A3,R0,0030 SW V1,0010 (SP) SW V1,0014 (SP) J 80210394 SW V1,0018 (SP) BLTZ S2,8021039C ADDU A0,R0,R0 ADDIU A1,S6,0006 ADDU A2,S2,R0 ADDIU A3,R0,0030 ADDIU T0,R0,0040 SW T0,0010 (SP) SW T0,0014 (SP) SW T0,0018 (SP) JAL 8021475C NOP ADDIU S0,S1,0040 SLTIU V0,S0,0180 BEQL V0,R0,802103F8 ADDIU S4,S4,0001 BNE S3,S5,802103D4 ADDU A0,S0,R0 ADDIU V0,R0,0005 SW V0,0010 (SP) ADDIU A0,S1,FFFF ADDIU A1,S6,FFFF ADDIU A2,R0,0042 JAL 8021126C ADDIU A3,R0,0032 ADDU A0,S0,R0 SLL V0,S4,0x4 ADDU V0,V0,S7 LUI T0,8025 ADDIU T0,T0,9960 ADDU V0,V0,T0 LW A2,0000 (V0) JAL 8021872C ADDU A1,S6,R0 ADDIU S4,S4,0001 ADDIU V0,R0,0007 BNE S4,V0,80210410 ADDIU S2,S2,0048 ADDU S4,R0,R0 ADDIU S7,S7,0070 ADDIU S8,S8,0001 ADDIU S5,S5,0001 ADDIU T0,R0,0015 ADDIU V0,T0,0003 SLT V0,S5,V0 BNE V0,R0,80210314 ADDIU S1,S1,0048 LW RA,0044 (SP) LW S8,0040 (SP) LW S7,003C (SP) LW S6,0038 (SP) LW S5,0034 (SP) LW S4,0030 (SP) LW S3,002C (SP) LW S2,0028 (SP) LW S1,0024 (SP) LW S0,0020 (SP) JR RA ADDIU SP,SP,0048 80210458 ADDIU SP,SP,FFC8 SW S4,0020 (SP) ADDU S4,R0,R0 SW S1,0014 (SP) ADDU S1,S4,R0 SW S0,0010 (SP) ADDU S0,S4,R0 SW RA,0034 (SP) SW S8,0030 (SP) SW S7,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S3,001C (SP) JAL 80215A1C ;V0=button and stick pos for controller 1 SW S2,0018 (SP) LUI S3,8022 ADDIU S5,R0,FFFF LUI S2,8022 ADDIU S6,R0,0002 LUI S7,8022 LUI V0,8021 ADDIU S8,V0,07B8 BEQ S0,R0,80210548 SLL V0,S0,0x2 ADDU S1,S1,V0 ADDIU V0,R0,0001 BNE S0,V0,80210504 SLTI V0,S1,0048 BNE V0,R0,80210504 NOP ADDU S0,R0,R0 LW A0,7C04 (S3) ADDU S1,S0,R0 ADDIU V0,A0,FFFF BNE V0,S5,80210504 SW V0,7C04 (S3) LW V1,7C00 (S2) ADDIU V0,A0,0006 SW V0,7C04 (S3) ADDIU V1,V1,FFFF BNE V1,S5,80210504 SW V1,7C00 (S2) SW S6,7C00 (S2) BNE S0,S5,80210548 SLTI V0,S1,FFB9 BEQ V0,R0,80210548 ADDIU V0,R0,0007 ADDU S0,R0,R0 ADDU S1,S0,R0 LW V1,7C04 (S3) ADDIU V1,V1,0001 BNE V1,V0,80210548 SW V1,7C04 (S3) LW V1,7C00 (S2) ADDIU V0,R0,0003 SW R0,7C04 (S3) ADDIU V1,V1,0001 BNE V1,V0,80210548 SW V1,7C00 (S2) SW R0,7C00 (S2) JAL 80210D4C ;V0=button and stick pos NOP LUI V1,0200 ORI V1,V1,0004 ADDU A0,V0,R0 AND V1,A0,V1 BEQ V1,R0,80210590 LUI V0,0100 BNE S0,R0,80210594 ORI V0,V0,0008 LW V0,7C04 (S3) BNEL V0,R0,8021058C ADDIU S0,R0,0001 LW V0,7C00 (S2) BEQ V0,R0,80210590 LUI V0,0100 ADDIU S0,R0,0001 LUI V0,0100 ORI V0,V0,0008 AND V0,A0,V0 BEQ V0,R0,802105CC LUI V0,C000 BNE S0,R0,802105D0 AND V0,A0,V0 LW V1,7C04 (S3) ADDIU V0,R0,0006 BNEL V1,V0,802105C8 ADDIU S0,R0,FFFF LW V0,7C00 (S2) BEQ V0,S6,802105CC LUI V0,C000 ADDIU S0,R0,FFFF LUI V0,C000 AND V0,A0,V0 BEQ V0,R0,80210628 ADDU A2,S1,R0 JAL 802061C0 ADDU A0,R0,R0 ADDIU S4,R0,0001 ADDU A2,S1,R0 LW A0,7C04 (S3) LW A1,7C00 (S2) ADDU A3,S4,R0 JAL 80210260 SW S4,7588 (S7) JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDIU A0,R0,000C ;A0=12 times ADDU A1,S8,R0 ;A1=802107B8 JAL 8021120C ;call routine A1 A0 times SW R0,7588 (S7) LUI A0,8000 ;A0=A button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S8,R0 ;A1=802107B8 J 80210648 NOP LW A0,7C04 (S3) LW A1,7C00 (S2) JAL 80210260 ADDU A3,R0,R0 JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BEQ S4,R0,802104B0 NOP LW RA,0034 (SP) LW S8,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 80210678 ADDIU SP,SP,FEF8 SW S2,00F8 (SP) ADDU S2,A0,R0 SW S3,00FC (SP) ADDU S3,A1,R0 SW S1,00F4 (SP) ADDU S1,A2,R0 SW RA,0100 (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM SW S0,00F0 (SP) LUI V0,8022 ADDIU S0,V0,7660 ;S0=80227660: string pointer table LW V0,0368 (S0) LW A3,0364 (S0) SW V0,0010 (SP) LUI V0,8022 LW V1,7C0C (V0) ADDIU V0,R0,00DC SUBU V0,V0,V1 SLL V0,V0,0x2 ADDU V0,V0,S0 LW V0,0000 (V0) ADDIU A0,R0,0006 SW V0,0014 (SP) LUI V0,8022 LW V1,7C10 (V0) ADDIU V0,R0,00E2 SUBU V0,V0,V1 SLL V0,V0,0x2 ADDU V0,V0,S0 LW V0,0000 (V0) ADDIU A1,R0,00C8 SW V0,0018 (SP) LUI V0,8022 LW V1,7580 (V0) ADDIU V0,R0,006F SUBU V0,V0,V1 SLL V0,V0,0x2 ADDU V0,V0,S0 LW V1,0000 (V0) LW V0,00BC (S0) ADDIU A2,SP,0028 SW V0,0020 (SP) JAL 802137A4 SW V1,001C (SP) BNE S1,R0,80210740 ADDIU A0,S1,000E JAL 80212B20 ADDIU A0,R0,0001 ADDIU A0,S1,000E ADDIU A1,R0,000E LW A3,00CC (S0) ADDIU A2,R0,001F JAL 80212C90 SW R0,0010 (SP) ADDIU S0,S1,002D ADDU A0,S0,R0 ADDIU A1,R0,003C ADDIU A2,R0,0017 ADDIU A3,R0,0005 SW R0,0010 (SP) SW S2,0014 (SP) JAL 80212E3C SW S3,0018 (SP) ADDU A0,S0,R0 ADDIU A1,R0,003C ADDIU A2,R0,0017 ADDIU A3,R0,0005 ADDIU V0,SP,0028 SW S2,0010 (SP) SW S3,0014 (SP) JAL 80213820 SW V0,0018 (SP) LW RA,0100 (SP) LW S3,00FC (SP) LW S2,00F8 (SP) LW S1,00F4 (SP) LW S0,00F0 (SP) JR RA ADDIU SP,SP,0108 802107B8 LUI V0,8022 LUI V1,8022 SUBU A2,R0,A0 LW A0,7584 (V0) LW A1,7588 (V1) ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80210678 NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 802107E8 ADDIU SP,SP,FFE8 ADDIU A1,R0,0001 LUI V0,8022 LUI V1,8022 LW A0,7584 (V0) ADDU V0,A1,R0 ADDU A2,R0,R0 SW RA,0014 (SP) SW S0,0010 (SP) JAL 80210678 SW V0,7588 (V1) JAL 80214EE4 ;wait for next VI scan to start LUI S0,8021 JAL 80211114 ;set VI buffer at next scan, then swap video buffers ADDIU S0,S0,07B8 ADDIU A0,R0,000C ;A0=12 times JAL 8021120C ;call routine A1 A0 times ADDU A1,S0,R0 ;A1=802107B8 LUI A0,8000 ;A0=A button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=802107B8 LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 8021084C ADDIU SP,SP,FEE8 LUI A0,0002 ORI A0,A0,FB00 ADDIU A1,SP,0010 SW RA,0110 (SP) JAL 802180A8 ;copy A2 bytes from hardware A0 to A1 ADDIU A2,R0,0100 ADDIU T0,R0,0008 ADDU T1,R0,R0 LUI V0,8025 ADDIU T3,V0,9150 ADDIU V0,R0,0047 LUI V1,8022 LUI A0,8022 LUI A1,8022 LUI A3,8022 SB V0,0010 (SP) ADDIU V0,A3,7BE4 LBU V1,7583 (V1) LBU A0,7C03 (A0) LBU A1,7C07 (A1) LBU A2,0003 (V0) ADDIU V0,R0,0054 SB V0,0011 (SP) LW V0,7BE4 (A3) ADDIU T2,SP,0010 SB V1,0012 (SP) LUI V1,8022 LBU V1,7C0F (V1) SRAV V0,V0,T0 SB A0,0013 (SP) SB A1,0014 (SP) SB A2,0015 (SP) SB V0,0016 (SP) SB V1,0017 (SP) ADDU V1,T2,T0 ADDU V0,T1,T3 LBU V0,0000 (V0) ADDIU T1,T1,0001 SB V0,0000 (V1) SLTI V0,T1,0064 BNE V0,R0,802108D8 ADDIU T0,T0,0001 ADDIU A0,SP,0010 ADDU V1,A0,T0 LUI V0,8022 LBU V0,7C13 (V0) ADDIU T0,T0,0001 SB V0,0000 (V1) SLTI V0,T0,0100 BEQ V0,R0,80210938 ADDU V1,A0,R0 ADDIU A0,R0,00FF ADDU V0,V1,T0 SB A0,0000 (V0) ADDIU T0,T0,0001 SLTI V0,T0,0100 BNE V0,R0,80210924 ADDU V0,V1,T0 LUI A0,0002 ORI A0,A0,FB00 ;A0=2FB00: settings ADDIU A1,SP,0010 ;A1=SP+10: p->source JAL 80217F04 ;write A2 bytes from A1 to hardware A0 ADDIU A2,R0,0100 ;A2=100: size LW RA,0110 (SP) JR RA ADDIU SP,SP,0118 80210958 copy and load settings from hardware ADDIU SP,SP,FED8 LUI A0,0002 ORI A0,A0,FB00 ;A0=2FB00: settings ADDIU A1,SP,0010 ;A1=SP+10 ADDIU A2,R0,0100 ;A2=100 SW RA,0124 (SP) SW S4,0120 (SP) SW S3,011C (SP) SW S2,0118 (SP) SW S1,0114 (SP) JAL 802180A8 ;copy A2 bytes from hardware A0 to A1 SW S0,0110 (SP) LBU V1,0010 (SP) ;V1=settings[0] ADDIU V0,R0,0047 ;V0=47: 'G' BNE V1,V0,80210ABC ;return if not 'G' ADDIU A0,SP,0010 LBU V1,0001 (A0) ;V1=settings[1] ADDIU V0,R0,0054 ;V0=54: 'T' BNE V1,V0,80210ABC ;return if not 'T' //802109A4: LUI A0,8022 LBU V1,0013 (SP) ;V1=settings[3] LBU V0,0012 (SP) ;V0=settings[2] SLTIU V1,V1,0003 BEQ V1,R0,802109C8 ;branch if not 0-2 SW V0,7580 (A0) ;V0->80227580: save settings[2] LBU V1,0013 (SP) ;V1=settings[3] LUI V0,8022 SW V1,7C00 (V0) ;V1->80227C00: save settings[3] //802109C8: LBU V0,0014 (SP) ;V0=settings[4] SLTIU V0,V0,0007 BEQ V0,R0,802109E0 ;branch if not 0-6 LUI V0,8022 LBU V1,0014 (SP) ;V1=settings[4] SW V1,7C04 (V0) ;V1->80227C04: settings[4] //802109E0: LUI A1,8022 LUI V0,8022 LBU V1,0015 (SP) ;V1=settings[5] LBU A0,0016 (SP) ;A0=settings[6] LW V0,7BE8 (V0) ;V0=80227BE8: SLL A0,A0,0x8 ;A0*=100 SW V1,7BE4 (A1) ;V1->80227BE4: settings[5] ADDU V1,V1,A0 ;V1=A0.V1 SLT V0,V0,V1 BEQ V0,R0,80210A10 SW V1,7BE4 (A1) SW R0,7BE4 (A1) ADDIU A0,SP,0018 ADDU S0,R0,R0 LUI V0,8025 ADDIU A1,V0,9150 LBU V1,0017 (SP) LUI V0,8022 SW V1,7C0C (V0) LBU V1,0000 (A0) ADDU V0,S0,A1 ADDIU S0,S0,0001 SB V1,0000 (V0) SLTI V0,S0,0064 BNE V0,R0,80210A2C ADDIU A0,A0,0001 LUI S3,8022 LBU V1,0000 (A0) LW A0,7BE4 (S3) LUI V0,8022 BLEZ A0,80210ABC SW V1,7C10 (V0) JAL 8020F664 ADDU S0,R0,R0 LUI V1,8022 ADDU S1,V0,R0 BLEZ S1,80210ABC SW R0,7534 (V1) LUI V0,8025 ADDIU S4,V0,9150 ADDU S2,V1,R0 ADDU V1,S0,S4 LBU V0,0000 (V1) BEQ V0,R0,80210AA0 ADDIU S0,S0,0001 LW V0,7534 (S2) ADDIU V0,V0,0001 SW V0,7534 (S2) LW A0,7BE4 (S3) LBU A2,0000 (V1) JAL 8020F058 ADDU A1,S0,R0 SLT V0,S0,S1 BNE V0,R0,80210A88 ADDU V1,S0,S4 //80210ABC: return LW RA,0124 (SP) LW S4,0120 (SP) LW S3,011C (SP) LW S2,0118 (SP) LW S1,0114 (SP) LW S0,0110 (SP) JR RA ADDIU SP,SP,0128 80210ADC ADDIU SP,SP,FFC8 SW S4,0020 (SP) ADDIU S4,R0,0001 SW S3,001C (SP) ADDU S3,R0,R0 LUI A0,8021 ADDIU A0,A0,18BC LUI A1,8021 ADDIU A1,A1,07B8 ADDU A2,S3,R0 SW S1,0014 (SP) LUI S1,8022 SW S0,0010 (SP) LUI S0,8022 SW RA,0034 (SP) SW S8,0030 (SP) SW S7,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S2,0018 (SP) SW R0,7588 (S1) JAL 8021401C SW R0,7584 (S0) JAL 80210D30 ;V0=button and stick pos for controller 1 ADDU S2,S0,R0 LUI S8,8022 ADDU S7,S4,R0 LUI S6,8022 LUI S5,8022 JAL 80210D4C ;V0=button and stick pos NOP LUI V1,0800 ORI V1,V1,0002 ;V1=08000002: + up, stick up ADDU S0,V0,R0 ;S0=V0: button/stick pos AND V1,S0,V1 ;V1&=buttons: !0 if up pressed BEQ V1,R0,80210B90 LUI V0,0400 LW V0,7584 (S2) BLEZ V0,80210B8C ADDIU V0,V0,FFFF SW V0,7584 (S2) ADDIU S3,R0,0001 JAL 802061C0 ADDU A0,R0,R0 //80210B90: LUI V0,0400 ORI V0,V0,0001 ;V0=04000001: + down, stick down AND V0,S0,V0 BEQ V0,R0,80210BC4 LUI V0,4000 LW V1,7584 (S2) SLTI V0,V1,0004 BEQ V0,R0,80210BC0 ADDIU V0,V1,0001 SW V0,7584 (S2) ADDIU S3,R0,0001 JAL 802061C0 ADDU A0,R0,R0 //80210BC0: LUI V0,4000 ;V0=B button AND V0,S0,V0 BEQ V0,R0,80210BEC ADDIU T0,R0,0004 LW V0,7584 (S2) BEQL V0,T0,80210BEC SW T0,7584 (S2) JAL 802061C0 ADDU A0,R0,R0 ADDIU T0,R0,0004 SW T0,7584 (S2) LUI V0,C000 ;V0=A, B buttons AND V0,S0,V0 BEQ V0,R0,80210CA4 NOP JAL 802061C0 ADDU A0,R0,R0 LW V1,7584 (S2) SLTIU V0,V1,0005 BEQ V0,R0,80210CA4 SLL V0,V1,0x2 LUI T0,8022 ADDIU T0,T0,2B50 ADDU V0,V0,T0 LW V0,0000 (V0) JR V0 NOP JAL 802107E8 NOP JAL 80210458 NOP J 80210CA4 SW R0,7588 (S1) LW V0,7C0C (S8) BEQL V0,R0,80210C7C SW S7,7C0C (S8) J 80210C7C SW R0,7C0C (S8) LW V0,7C10 (S6) BEQL V0,R0,80210C7C SW S7,7C10 (S6) J 80210C7C SW R0,7C10 (S6) LW V0,7580 (S5) BEQL V0,R0,80210C7C SW S7,7580 (S5) SW R0,7580 (S5) JAL 802107E8 NOP J 80210CA4 SW R0,7588 (S1) JAL 802107E8 NOP JAL 8021084C NOP J 80210CF8 NOP BEQL S0,R0,80210CAC ADDIU S4,R0,0001 LW A0,7584 (S2) ADDU A1,R0,R0 JAL 80210678 ADDU A2,A1,R0 JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BEQ S3,R0,80210CF0 ADDU T0,R0,R0 ADDU A0,S0,R0 ADDIU A1,R0,0005 ADDU A2,S4,R0 LUI A3,8021 JAL 802111A0 ADDIU A3,A3,07B8 ADDU S3,R0,R0 ADDU S4,S3,R0 ADDU T0,R0,R0 BEQ T0,R0,80210B50 NOP LW RA,0034 (SP) LW S8,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 80210D28: likely filler ;NOP ;J 80210D94 80210D30: redirect to 80215A1C ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80215A1C ;V0=button and stick pos for controller 1 NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80210D4C: redirect to 80215B78 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80215B78 ;V0=cur.button and stick pos for controller 1 NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80210D68: print A2 centered on line in colour A3 at {A0,A1} accepts: A0=xpos, A1=ypos, A2=p->string, A3=colour ADDIU SP,SP,FFE8 LUI V0,8025 SW A1,B2AC (V0) ;A1->8024B2AC: ypos LUI V0,8025 LW V0,9780 (V0) ;V0=80249780: LUI V1,8025 SW RA,0010 (SP) SW A3,9778 (V1) ;A3->80249778: font colour SRL V1,V0,0x1F ;V1=1 if V0 negative ADDU V0,V0,V1 ;V0+=correction for negative value SRA V0,V0,0x1 ;V0/=2 centerpoint ADDU A0,A0,V0 ;xpos+=centerpoint LUI V0,8025 SW A0,B2A8 (V0) ;A0->8024B2A8: xpos JAL 8021502C ;print string A0 to screen ADDU A0,A2,R0 ;A0=A2: p->string LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80210DB4 ltoa(A0,A1,0xA) accepts: A0=quantity, A1=p->target LUI A2,0001 ORI A2,A2,86A0 ;A2=0x186A0 100000 BNE A0,R0,80210DE4 ;branch if quantity isn't zero ADDU A3,R0,R0 ;A3=0 LUI V0,8022 ADDIU T6,V0,2B70 ;T6=80222B70 LB T3,0000 (T6) LB T4,0001 (T6) SB T3,0000 (A1) ;'0'->target+0 SB T4,0001 (A1) ;'\0'->target+1 JR RA NOP //80210DE4: determine if less than 100000 ADDIU T2,R0,0001 ADDIU T1,R0,0030 ;T1='0' LUI T0,6666 ORI T0,T0,6667 ;T0=66666667 SLT V0,A0,A2 ;V0=TRUE if A0<100000 //80210DF8: get divisions of 100000 BNE V0,R0,80210E54 ;branch if not 100000 or above NOP DIV A0,A2 BNE A2,R0,80210E10 ;catch non-existant division by zero NOP BREAK 00001C00 //80210E10: catch funky math ADDIU AT,R0,FFFF BNE A2,AT,80210E28 ;branch if it wasn't negative LUI AT,8000 BNE A0,AT,80210E28 ;branch if dividend wasn't negative zero NOP BREAK 00001800 //80210E28: MFLO V0 ;V0=quantity/100000 NOP NOP MULT V0,A2 ADDIU A3,R0,0001 ADDIU V0,V0,0030 ;V0+=30: value->decimal char SB V0,0000 (A1) ;char->target ADDU A1,A1,A3 ;A1++ next target MFLO V1 ;V1=#100000's * 100000 J 80210E68 SUBU A0,A0,V1 ;A0=MFHI A0, quite honestly //80210E54: MULT A2,T0 BNE A3,T2,80210E6C NOP SB T1,0000 (A1) ADDIU A1,A1,0001 //80210E68: MULT A2,T0 SRA V0,A2,0x1F MFHI T3 SRA V1,T3,0x2 SUBU A2,V1,V0 BGTZ A2,80210DF8 SLT V0,A0,A2 JR RA SB R0,0000 (A1) 80210E8C print A1 centered on line A0 in colour A2 accepts: A0=ypos, A1=p->string, A2=colour, A3=UNUSED! ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A0,R0 ;S1=A0: ypos SW S0,0010 (SP) ADDU S0,A1,R0 ;S0=A1: p->string SW S2,0018 (SP) ADDU S2,A2,R0 ;S2=A2: colour SW RA,001C (SP) JAL 802141F0 ;V0=strlen(A0) ADDU A0,S0,R0 ;A0=S0: p->string LUI V1,8022 SLL V0,V0,0x3 ;V0*=8: physical width of string SRA V0,V0,0x1 ;V0/=2: midpoint ADDU A1,S1,R0 ;A1=S1: ypos ADDU A2,S0,R0 ;A2=S0: p->string LW A0,7650 (V1) ;A0=80227650: base x offset ADDU A3,S2,R0 ;A3=S2: colour ADDIU A0,A0,00A0 ;A0+=A0: base + center of screen JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} SUBU A0,A0,V0 ;A0-=V0: xpos for centered text LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80210EF4 print A1 centered on line A0 in colour A2 accepts: A0=ypos, A1=p->string, A2=colour ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A0,R0 ;S1=A0: ypos SW S0,0010 (SP) ADDU S0,A1,R0 ;S0=A1: p->string SW S2,0018 (SP) ADDU S2,A2,R0 ;S2=A2: colour SW RA,001C (SP) JAL 802141F0 ;V0=strlen(A0) ADDU A0,S0,R0 ;A0=S0: p->string LUI V1,8022 SLL V0,V0,0x3 ;V0*=8: physical width SRA V0,V0,0x1 ;V0/=2: midpoint ADDU A1,S1,R0 ;A1=S1: ypos ADDU A2,S0,R0 ;A2=S0: p->string LW A0,7650 (V1) ;A0=80227650: base x offset ADDU A3,S2,R0 ;A3=S2: colour ADDIU A0,A0,00A0 ;A0+=A0: screen midpoint + base offset JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} SUBU A0,A0,V0 ;A0-=V0: xpos for centered text LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80210F5C loop while buttons A0 held accepts: A0=button/stick mask ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: mask SW RA,0014 (SP) //80210F6C: loop while buttons held JAL 80210D4C ;V0=button and stick pos NOP AND V0,V0,S0 ;V0&=mask: nonzero if buttons pressed BEQ V0,R0,80210F90 ;return if not pressed NOP JAL 8021110C ;unconditional return NOP J 80210F6C ;loop until no longer holding NOP //80210F90: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80210FA0 print (A0>1 ? A1:A2) centered on line A3 in colour SP+10 accepts: A0=quantity, A1=p->string.many, A2=p->string.one, A3=ypos, SP+10=colour, SP+14=unused ADDIU SP,SP,FFA0 SW S0,0048 (SP) ADDU S0,A0,R0 ;S0=A0: quantity SW S1,004C (SP) ADDU S1,A1,R0 ;S1=A1: p->string.many SW S2,0050 (SP) ADDU S2,A2,R0 ;S2=A2: p->string.one SW S3,0054 (SP) ADDU S3,A3,R0 ;S3=A3: ypos SW RA,0058 (SP) JAL 80210DB4 ;ltoa(A0,A1,0xA) ADDIU A1,SP,0010 ;A1=SP+10: ADDIU A0,SP,0010 ;A0=SP+10: p->target copy location LUI A1,8022 JAL 802110C4 ;strcat(A0,A1) ADDIU A1,A1,2B74 ;A1=80222B74: ' ' ADDIU V0,R0,0001 BNE S0,V0,80210FF0 ;branch if quantity isn't 1 ADDU A1,S1,R0 ;A1=S1: p->string.many ADDU A1,S2,R0 ;A1=S2: p->string.one //80210FF0: copy and print selected string JAL 802110C4 ;strcat(A0,A1) ADDIU A0,SP,0010 ;A0=SP+10: copy address for selected string ADDU A0,S3,R0 ;A0=S3: ypos LW A2,0070 (SP) ;A2=[SP+10 f/caller]: colour LW A3,0074 (SP) ;A3=[SP+14 f/caller]: derelict value JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDIU A1,SP,0010 ;A1=SP+10: p->string //8021100C: return LW RA,0058 (SP) LW S3,0054 (SP) LW S2,0050 (SP) LW S1,004C (SP) LW S0,0048 (SP) JR RA ADDIU SP,SP,0060 80211028 LBU V1,0000 (A0) LBU V0,0000 (A1) BNE V1,V0,8021107C ADDU T0,R0,R0 BEQL V1,R0,80211054 ADDIU T0,R0,0001 BNEL V0,R0,80211050 ADDIU A0,A0,0001 J 80211054 ADDIU T0,R0,0001 ADDIU A1,A1,0001 LBU V1,0000 (A0) LBU V0,0000 (A1) ANDI A3,V1,00FF ANDI A2,V0,00FF BNE A3,A2,80211074 NOP BEQ T0,R0,80211038 NOP BEQ A3,A2,80211094 ADDU T0,R0,R0 LBU V0,0000 (A0) LBU V1,0000 (A1) SLTU V0,V0,V1 BEQ V0,R0,80211094 ADDIU T0,R0,0001 ADDIU T0,R0,FFFF JR RA ADDU V0,T0,R0 8021109C strcpy(A0,A1); V0=p->end of string accepts: A0=p->target, A1=p->source LBU V1,0000 (A1) ;V1=A1+0: char BEQ V1,R0,802110BC ;return if NULL ADDU V0,A0,R0 ;V0=A0: p->target //802110A8: copy string to A0 ADDIU A1,A1,0001 ;A1++ source++ SB V1,0000 (V0) ;V1->target LBU V1,0000 (A1) ;V1=source+offset BNE V1,R0,802110A8 ;loop until NULL ADDIU V0,V0,0001 ;V0++ target++ //802110BC: NULL terminate and return JR RA SB R0,0000 (V0) ;NULL->target 802110C4 strcat(A0,A1); V0=p->end of target string accepts; A0=p->target, A1=p->source LBU V0,0000 (A0) ;V0=target+0: char BEQ V0,R0,802110E0 ;branch if at end of target string NOP //802110D0: find end of target string ADDIU A0,A0,0001 ;A0++ target++ LBU V0,0000 (A0) ;V0=target+offset: char BNEL V0,R0,802110D4 ;loop until at end of string ADDIU A0,A0,0001 //802110E0: if source NULL, don't bother LBU V0,0000 (A1) ;V0=source+0: char BEQL V0,R0,80211104 ;if NULL, return SB R0,0000 (A0) //802110EC: copy source string to target ADDIU A1,A1,0001 ;A1++ source++ SB V0,0000 (A0) ;char->target LBU V0,0000 (A1) ;V0=source+offset: char BNE V0,R0,802110EC ADDIU A0,A0,0001 ;A0++ target++ //802110D0: NULL terminate and return SB R0,0000 (A0) ;0->target JR RA ADDU V0,A0,R0 ;V0=A0; p->end of target string 8021110C: unconditional return JR RA NOP 80211114: redirect to 80214F38 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80214F38 ;set VI buffer at next scan, then swap video buffers NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80211130: use handler A1 if buttons A0 pressed accepts: A0=button/direction mask, A1=p->handler ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A0,R0 ;S1=A0: button/direction mask SW S0,0010 (SP) ADDU S0,A1,R0 ;A0=A1: p->handler SW RA,0018 (SP) //80211148: JAL 80215B78 ;V0=cur.button and stick pos for controller 1 NOP AND V0,V0,S1 ;V0&=mask: pressed buttons BEQ V0,R0,8021118C ;branch if none pressed NOP BEQ S0,R0,8021116C ;branch if no handler set NOP JALR RA,S0 ;jump to handler ADDU A0,R0,R0 ;A0=0 //8021116C: loop until the handler fries itself JAL 8021110C ;unconditional return NOP BEQ S0,R0,80211148 ;if handler removed, skip vsync NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP J 80211148 ;loop until handler removed NOP //8021118C: return LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 802111A0: ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A1,R0 SW S1,0014 (SP) ADDU S1,A3,R0 BEQ A2,R0,802111C0 SW RA,0018 (SP) ADDIU S0,S0,000F BEQ S0,R0,802111F8 NOP BEQ S1,R0,802111D8 ADDIU S0,S0,FFFF JALR RA,S1 ADDU A0,R0,R0 JAL 8021110C ;unconditional return NOP BEQ S1,R0,802111F0 NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BNE S0,R0,802111C8 NOP LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8021120C: execute routine A1 A0 times accepts: A0=count, A1=p->routine ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: count SW S1,0014 (SP) ADDU S1,A1,R0 ;S1=A1: p->routine BEQ S0,R0,80211258 ;return if count zero SW RA,0018 (SP) //80211228: BEQ S1,R0,80211238 ;don't try to jump if routine NULL ADDIU S0,S0,FFFF ;S0-- count-- JALR RA,S1 ;jump to routine ADDU A0,R0,R0 ;A0=0 //80211238: JAL 8021110C ;unconditional return NOP BEQ S1,R0,80211250 ;skip vbuf swap if routine not set NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP //80211250: loop S0 times BNE S0,R0,80211228 ;branch if count not zero NOP //80211258: return LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8021126C: ADDIU SP,SP,FFD8 LUI V1,8022 LW T0,0038 (SP) ADDIU V1,V1,7C18 SW RA,0020 (SP) SLL V0,T0,0x1 ADDU V0,V0,T0 SLL V0,V0,0x2 ADDU V0,V0,V1 LW V1,0000 (V0) SW V1,0010 (SP) LW V1,0004 (V0) SW V1,0014 (SP) LUI V1,8025 LW T0,0008 (V0) LW V0,9780 (V1) SRL V1,V0,0x1F ADDU V0,V0,V1 SRA V0,V0,0x1 ADDU A0,A0,V0 JAL 80214778 SW T0,0018 (SP) LW RA,0020 (SP) JR RA ADDIU SP,SP,0028 802112D0: handle special chars and print A2 in colour A3 to screen at {A0,A1} accepts: A0=xpos, A1=ypos, A2=char, A3=colour ADDIU SP,SP,FFE8 ADDIU V0,R0,0083 BEQ A2,V0,802112F8 ;don't print char 83: arrow.up SW RA,0010 (SP) //802112E0: handle special symbols ADDIU V0,A2,FF80 ;V0=char-80: catch special symbols SLTIU V0,V0,0004 BNEL V0,R0,802112F0 ;add 21 if 80-82 ADDIU A2,A2,0021 ;A2+=21: arrow.right, arrow.left, arrow.down, arrow.up //802112F0: print to screen JAL 8021F460 ;print A2 in colour A3 to screen at {A0,A1} ADDIU A0,A0,0040 ;A0+=40: offset xpos //802112F8: return LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80211304 wait A0 vsyncs accepts: A0=count ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: count BLEZ S0,80211328 SW RA,0014 (SP) //80211318: wait A0 vsyncs JAL 80214EE4 ;wait for next VI scan to start ADDIU S0,S0,FFFF ;S0-- BGTZ S0,80211318 ;loop for A0 vsyncs NOP //80211328: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80211338 print nibble A2 as hex centered on line in colour A3 at {A0,A1} converts nibble A2 to char, then prints normally accepts: A0=xpos, A1=ypos, A2=value, A3=colour ADDIU SP,SP,FFE0 ANDI A2,A2,000F ;A2->nibble SLTI V0,A2,000A BNE V0,R0,80211354 ;branch if 0-9 SW RA,0018 (SP) J 80211358 ADDIU V0,A2,0037 ;V0=A2->char 0xA-0xF //80211354: 0-9 -> char conversion ADDIU V0,A2,0030 ;V0=A2->char //80211358: print to screen SB V0,0010 (SP) ;V0->SP+10: buffer for char ADDIU A2,SP,0010 ;A2=SP+10: p->char JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} SB R0,0011 (SP) LW RA,0018 (SP) JR RA ADDIU SP,SP,0020 80211374 print byte A2 as hex centered on line in colour A3 at {A0,A1} accepts: A0=xpos, A1=ypos, A2=value, A3=colour ADDIU SP,SP,FFD8 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: xpos SW S1,0014 (SP) ADDU S1,A1,R0 ;S1=A1: ypos SW S2,0018 (SP) ADDU S2,A2,R0 ;S2=A2: value SW S3,001C (SP) ADDU S3,A3,R0 ;S3=A3: colour ANDI A2,S2,00FF ;A2=S2->byte SW RA,0020 (SP) JAL 80211338 ;print nibble A2 as hex centered on line in colour A3 at {A0,A1} SRL A2,A2,0x4 ;A2/=10: upper nibble of byte ADDIU A0,S0,0008 ;A0=S0+8: xpos+=char width ADDU A1,S1,R0 ;A1=S1: ypos ANDI A2,S2,000F ;A2=S2&F: lower nibble of byte JAL 80211338 ;print nibble A2 as hex centered on line in colour A3 at {A0,A1} ADDU A3,S3,R0 ;A3=S3: colour LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 802113D8 print short A2 as hex centered on line in colour A3 at {A0,A1} accepts: A0=xpos, A1=ypos, A2=value, A3=colour ADDIU SP,SP,FFD8 SW S0,0010 (SP) ADDU S0,A0,R0 SW S1,0014 (SP) ADDU S1,A1,R0 SW S2,0018 (SP) ADDU S2,A2,R0 SW S3,001C (SP) ADDU S3,A3,R0 SRA A2,S2,0x8 SW RA,0020 (SP) JAL 80211374 ;print byte A2 as hex centered on line in colour A3 at {A0,A1} ANDI A2,A2,00FF ADDIU A0,S0,0010 ADDU A1,S1,R0 ANDI A2,S2,00FF JAL 80211374 ;print byte A2 as hex centered on line in colour A3 at {A0,A1} ADDU A3,S3,R0 LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8021143C print word A2 as hex centered on line in colour A3 at {A0,A1} accepts: A0=xpos, A1=ypos, A2=value, A3=colour ADDIU SP,SP,FFD8 SW S0,0010 (SP) ADDU S0,A0,R0 SW S1,0014 (SP) ADDU S1,A1,R0 SW S2,0018 (SP) ADDU S2,A2,R0 SW S3,001C (SP) ADDU S3,A3,R0 SW RA,0020 (SP) JAL 802113D8 ;print short A2 as hex centered on line in colour A3 at {A0,A1} SRA A2,S2,0x10 ADDIU A0,S0,0020 ADDU A1,S1,R0 ANDI A2,S2,FFFF JAL 802113D8 ;print short A2 as hex centered on line in colour A3 at {A0,A1} ADDU A3,S3,R0 LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8021149C ADDIU SP,SP,FFC8 SW S4,0030 (SP) ADDU S4,A0,R0 SW S3,002C (SP) ADDU S3,A1,R0 LUI V0,8022 ADDIU V0,V0,7590 LW V1,0048 (SP) SW S1,0024 (SP) ADDU S1,S4,A2 SW RA,0034 (SP) SW S2,0028 (SP) SW S0,0020 (SP) SLL S0,V1,0x1 ADDU S0,S0,V1 SLL S0,S0,0x2 ADDU S0,S0,V0 LW V0,0000 (S0) ADDU A2,S1,R0 SW V0,0010 (SP) LW V0,0004 (S0) ADDU S2,A3,R0 SW V0,0014 (SP) LW V0,0008 (S0) ADDU A3,S3,R0 JAL 80214754 ;unconditional return SW V0,0018 (SP) ADDU A0,S1,R0 ADDU A1,S3,R0 LW V0,0000 (S0) ADDU A2,S1,R0 SW V0,0010 (SP) LW V0,0004 (S0) ADDU S2,S3,S2 SW V0,0014 (SP) LW V0,0008 (S0) ADDU A3,S2,R0 JAL 80214754 ;unconditional return SW V0,0018 (SP) ADDU A0,S1,R0 LW V0,0000 (S0) ADDU A1,S2,R0 SW V0,0010 (SP) LW V0,0004 (S0) ADDU A2,S4,R0 SW V0,0014 (SP) LW V0,0008 (S0) ADDU A3,S2,R0 JAL 80214754 ;unconditional return SW V0,0018 (SP) ADDU A0,S4,R0 LW V0,0000 (S0) ADDU A1,S2,R0 SW V0,0010 (SP) LW V0,0004 (S0) ADDU A2,A0,R0 SW V0,0014 (SP) LW V0,0008 (S0) ADDU A3,S3,R0 JAL 80214754 ;unconditional return SW V0,0018 (SP) LW RA,0034 (SP) LW S4,0030 (SP) LW S3,002C (SP) LW S2,0028 (SP) LW S1,0024 (SP) LW S0,0020 (SP) JR RA ADDIU SP,SP,0038 802115B0 ADDIU SP,SP,FFD0 SW S0,0010 (SP) ADDU S0,A2,R0 SW S1,0014 (SP) ADDIU S1,A0,0080 ADDIU V0,R0,FFFD AND S1,S1,V0 ADDU A0,S1,R0 ADDU A1,R0,R0 SW RA,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S4,0020 (SP) SW S3,001C (SP) JAL 8021872C SW S2,0018 (SP) ADDIU S6,S1,0040 ADDU A0,S6,R0 ADDU A1,R0,R0 JAL 8021872C ADDU A2,S0,R0 ADDIU S5,S1,0080 ADDU A0,S5,R0 ADDU A1,R0,R0 JAL 8021872C ADDU A2,S0,R0 ADDIU S4,S1,00C0 ADDU A0,S4,R0 ADDU A1,R0,R0 JAL 8021872C ADDU A2,S0,R0 ADDIU S3,S1,0100 ADDU A0,S3,R0 ADDU A1,R0,R0 JAL 8021872C ADDU A2,S0,R0 ADDIU S2,S1,0140 ADDU A0,S2,R0 ADDU A1,R0,R0 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S1,R0 ADDIU A1,R0,0030 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S6,R0 ADDIU A1,R0,0030 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S5,R0 ADDIU A1,R0,0030 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S4,R0 ADDIU A1,R0,0030 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S3,R0 ADDIU A1,R0,0030 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S2,R0 ADDIU A1,R0,0030 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S1,R0 ADDIU A1,R0,0060 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S6,R0 ADDIU A1,R0,0060 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S5,R0 ADDIU A1,R0,0060 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S4,R0 ADDIU A1,R0,0060 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S3,R0 ADDIU A1,R0,0060 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S2,R0 ADDIU A1,R0,0060 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S1,R0 ADDIU A1,R0,0090 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S6,R0 ADDIU A1,R0,0090 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S5,R0 ADDIU A1,R0,0090 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S4,R0 ADDIU A1,R0,0090 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S3,R0 ADDIU A1,R0,0090 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S2,R0 ADDIU A1,R0,0090 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S1,R0 ADDIU A1,R0,00C0 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S6,R0 ADDIU A1,R0,00C0 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S5,R0 ADDIU A1,R0,00C0 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S4,R0 ADDIU A1,R0,00C0 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S3,R0 ADDIU A1,R0,00C0 JAL 8021872C ADDU A2,S0,R0 ADDU A0,S2,R0 ADDIU A1,R0,00C0 JAL 8021872C ADDU A2,S0,R0 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 802117FC waits until buttons A0 have been held for A1 or released accepts: A0=button/stick mask, A1=time, A2=nonzero increments A1 by 0xF ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A0,R0 ;S1=A0: mask SW S0,0010 (SP) ADDU S0,A1,R0 ;S0=A1: time BEQ A2,R0,8021181C ;do not increment S0 by 15 if A2 zero SW RA,0018 (SP) ADDIU S0,S0,000F ;S0+=F: count+15 //8021181C: catch if count already 0 BEQ S0,R0,80211848 ;return if S0=0 NOP //80211824: loop until time satisfied JAL 80210D30 ;V0=button and stick pos for controller 1 NOP AND V0,V0,S1 ;V0&=mask: nonzero if buttons pressed BEQ V0,R0,80211848 ;if buttons not pressed, return NOP JAL 8021110C ;unconditional return ADDIU S0,S0,FFFF ;S0-- count-- BNE S0,R0,80211824 ;loop while count still remains NOP //80211848: return LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 8021185C: DADDIU A1,V1,6620 ADDIU SP,SP,FFD8 LUI V0,8022 ADDIU V0,V0,43B4 LUI V1,8022 ADDIU V1,V1,7660 ;V1=80227660: string pointer table SW V0,0014 (SP) LUI V0,8022 ADDIU V0,V0,43B8 LUI A3,8022 SW RA,0020 (SP) LW A0,028C (V1) LW A1,0378 (V1) ADDIU A3,A3,43B0 SW V0,001C (SP) SW A0,0010 (SP) ADDIU A0,R0,0001 SW A1,0018 (SP) LW A2,00CC (V1) JAL 80214210 ADDIU A1,R0,0006 LW RA,0020 (SP) JR RA ADDIU SP,SP,0028 802118BC: LUI V0,8022 LUI V1,8025 SUBU A2,R0,A0 LW A0,7BF0 (V0) LW A1,90D8 (V1) ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 802118EC NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 802118EC: ADDIU SP,SP,FEB8 SW S7,013C (SP) ADDU S7,A0,R0 SW S8,0140 (SP) ADDU S8,A1,R0 SW S5,0134 (SP) ADDU S5,A2,R0 ADDIU A0,R0,0006 ADDIU A1,R0,00C8 LUI V0,8022 SW S0,0120 (SP) ADDIU S0,V0,7660 ;S0=80227660: string pointer table SW S6,0138 (SP) ADDIU S6,SP,0058 SW RA,0144 (SP) SW S4,0130 (SP) SW S3,012C (SP) SW S2,0128 (SP) SW S1,0124 (SP) LW A3,0010 (S0) ;A3=str+10: 80224368 "Main Menu" LW V0,7660 (V0) ;V0=str+0: 802243A4 "Start Game" LW V1,0004 (S0) ;V1=str+4: 80224390 "Select Cheat Codes" LW T0,0364 (S0) ;T0=str+364: 80223710 "Options" LW T1,04B8 (S0) ;T1=str+4B8: 80222F5C "Key Codes" LW T2,04F8 (S0) ;T2=str+4F8: 8022437C "Memory Card Manager" ADDU A2,S6,R0 SW V0,0010 (SP) SW V1,0014 (SP) SW T0,0018 (SP) SW T1,001C (SP) JAL 802137A4 SW T2,0020 (SP) BNE S5,R0,80211980 ADDIU A0,S5,000E JAL 80212B20 ADDIU A0,R0,0001 ADDIU A0,S5,000E ADDIU A1,R0,000E ADDIU A2,R0,001F ADDIU S2,R0,0006 ADDU S1,R0,R0 ADDU S3,S0,R0 ;S3=S0: string pointer table LW A3,00CC (S3) ;A3=str+CC: 802240C0 "GameShark Pro Version 3.30" ADDIU S4,R0,0001 JAL 80212C90 SW R0,0010 (SP) ADDIU S0,S5,003A ADDU A0,S0,R0 ADDIU A1,R0,0028 ADDIU A2,R0,0014 ADDIU A3,R0,0005 SW R0,0010 (SP) SW S7,0014 (SP) JAL 80212E3C SW S8,0018 (SP) ADDU A0,S0,R0 ADDIU A1,R0,0028 ADDIU A2,R0,0014 ADDIU A3,R0,0005 SW S7,0010 (SP) SW S8,0014 (SP) JAL 80213820 SW S6,0018 (SP) LUI V1,8022 SUBU V0,R0,S5 SW V0,7650 (V1) ADDIU V0,R0,0001 BNE S4,V0,80211A2C LUI T3,8022 SW R0,0010 (SP) ADDIU A0,R0,0010 SUBU A0,A0,S5 ADDIU A1,R0,0099 ADDIU A2,R0,0120 JAL 80213364 ADDIU A3,R0,0038 ADDU S2,R0,R0 LUI S1,FFC0 ORI S1,S1,FFC0 LUI T3,8022 LW A0,7BE8 (T3) LW A1,0020 (S3) ;A1=str+20: 80224318 "Games Supported" LW A2,0024 (S3) ;A2=str+24: 80224308 "Cheats In Total" ADDIU A3,R0,00A1 SW S1,0010 (SP) JAL 80210FA0 ;print (A0>1 ? A1:A2) centered on line A3 in colour SP+10 SW S2,0014 (SP) LUI T3,8022 LW A0,7BEC (T3) LW A1,0024 (S3) ;A1=str+24: 80224308 "Cheats In Total" ADDIU A3,R0,00AB SW S1,0010 (SP) SW S2,0014 (SP) JAL 80210FA0 ;print (A0>1 ? A1:A2) centered on line A3 in colour SP+10 ADDU A2,A1,R0 LUI V0,8022 LW A0,7BE4 (V0) BNE A0,R0,80211AA8 LUI V0,8022 ADDIU A0,R0,00B9 ADDU A2,S1,R0 LW A1,0014 (S3) ;A1=str+14: 80224354 "No Game Selected" JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S2,R0 ADDIU A0,R0,00C3 ADDU A2,S1,R0 LW A1,0018 (S3) ;A1=str+18: 8022433C "No Cheat Codes Are On" JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S2,R0 J 80211AE8 ADDIU S4,S4,0001 LW S0,7534 (V0) JAL 8020FB14 ADDIU A1,SP,0028 ADDIU A0,R0,00B9 ADDIU A1,SP,0028 ADDU A2,S1,R0 JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,S2,R0 ADDU A0,S0,R0 LW A1,001C (S3) ;A1=str+1C: 80224328 "Cheat Codes Are On" LW A2,00E8 (S3) ;A2=str+E8: 80224040 "Cheat Code Is On" ADDIU A3,R0,00C3 SW S1,0010 (SP) JAL 80210FA0 ;print (A0>1 ? A1:A2) centered on line A3 in colour SP+10 SW S2,0014 (SP) ADDIU S4,S4,0001 SLTI V0,S4,0002 BNE V0,R0,802119F8 ADDIU V0,R0,0001 JAL 8021433C SLTU A0,R0,S5 LW RA,0144 (SP) LW S8,0140 (SP) LW S7,013C (SP) LW S6,0138 (SP) LW S5,0134 (SP) LW S4,0130 (SP) LW S3,012C (SP) LW S2,0128 (SP) LW S1,0124 (SP) LW S0,0120 (SP) JR RA ADDIU SP,SP,0148 80211B2C: probably code list interpretter ADDIU SP,SP,FFA0 SW S8,0058 (SP) ADDU S8,R0,R0 ;S8=0: count LUI V1,8025 ADDIU V0,R0,FFFF SW S2,0040 (SP) LUI S2,8025 SW V0,B110 (V1) ;-1->8024B110: inicodelist LW V1,9124 (S2) ;V1=80249124: p->codelist LUI V0,8022 SW R0,7BD0 (V0) ;0->80227BD0: use normal entrypoint LUI V0,8022 SW R0,7BD4 (V0) ;0->80227BD4: LUI V0,8022 SW R0,7BD8 (V0) ;0->80227BD8: set to 1 by 20- command LUI V0,8025 //80211B6C: SW RA,005C (SP) SW S7,0054 (SP) SW S6,0050 (SP) SW S5,004C (SP) SW S4,0048 (SP) SW S3,0044 (SP) SW S1,003C (SP) SW S0,0038 (SP) SW R0,001C (SP) SW R0,9120 (V0) ;0->80249120: (set to 1 by CC command) //80211B94: SB R0,0000 (V1) ;0->code[0] LW V0,9124 (S2) ;V0=80249124: p->codelist ADDIU S0,R0,0004 SB R0,0001 (V0) ;0->code[1]: LW V0,9124 (S2) ;V0=80249124: p->codelist ADDU S1,S8,R0 SB R0,0002 (V0) ;0->code[2]: LW V0,9124 (S2) ;V0=80249124: p->codelist LUI S3,8022 SB R0,0003 (V0) ;0->code[3]: LW A0,7BE4 (S3) ;A0=80227BE4: ADDU S7,S8,R0 BEQ A0,R0,80211BE8 SW R0,0020 (SP) ;0->SP+20: reset inicode count JAL 8020F664 NOP LW V1,7BE4 (S3) BEQ V1,R0,80211BE8 SW V0,0018 (SP) BNE V0,R0,80211BF0 ADDU S3,R0,R0 //80211BE8: J 802120A8 ADDU V0,R0,R0 //80211BF0: ADDU V1,S2,R0 LW V0,9124 (V1) ;V0=80249124: p->codelist ADDU V0,V0,S3 ADDIU S3,S3,0001 SB R0,0000 (V0) SLTI V0,S3,003C BNE V0,R0,80211BF4 NOP //80211C10: LW T4,0018 (SP) BLEZ T4,8021202C ADDIU S3,R0,0001 LUI S2,8025 //80211C20: LUI T4,8022 LW A0,7BE4 (T4) JAL 8020EF78 ADDU A1,S3,R0 LUI T4,8022 LW A0,7BE4 (T4) JAL 8020EF78 ADDU A1,S3,R0 BEQ V0,R0,80212018 LUI T4,8022 LW A0,7BE4 (T4) ADDU A1,S3,R0 JAL 8020F874 ADDIU S5,R0,0001 ADDU T3,V0,R0 BLEZ T3,80212018 ADDU S1,S1,T3 LW T4,0020 (SP) ;T4=SP+20: #inicodes SLL V0,T4,0x2 ;V0=inicodes->offset LUI T4,8025 ADDIU T4,T4,B110 ;T4=8024B110: inicode list (codes activated before booting attached cart) ADDU S4,V0,T4 ;S4=p->next entry in inicode list ADDU A1,S3,R0 //80211C7C: ADDU A2,S5,R0 LUI T4,8022 LW A0,7BE4 (T4) ADDIU A3,SP,0010 ;A3=SP+10: p->target for code JAL 8020FBE0 SW T3,0030 (SP) //80211C94: handle CC command--use alternate interrupt hook LUI T4,FF00 ;T4=FF000000: LUI V0,CC00 ;V0=CC000000: LW T0,0010 (SP) ;T0=SP+10: code::command LW T3,0030 (SP) AND V1,T0,T4 ;V1=code::command & FF000000 BNE V1,V0,80211CC4 ;branch if not CC LUI V0,EE00 ADDIU S1,S1,FFFF ;S1-- LUI V0,8025 ADDIU T4,R0,0001 J 80212008 SW T4,9120 (V0) ;1->80249120: use alt.hook //80211CC4: handle EE command--do not correct size of RAM BNE V1,V0,80211CDC ;branch if not EE LUI V0,2000 ADDIU S1,S1,FFFF ;S1-- LUI V0,8025 J 80212008 SW R0,9100 (V0) ;0->80249100: do not correct RAM size //80211CDC: handle 20 command-- BNE V1,V0,80211CF8 ;branch if not 20 LUI V0,DE00 ADDIU S1,S1,FFFF ;S1-- LUI V0,8022 ADDIU T4,R0,0001 J 80212008 SW T4,7BD8 (V0) ;1->80227BD8: //80211CF8: handle DE command--special entrypoint BNE V1,V0,80211D30 LUI T4,FF00 ADDIU S1,S1,FFFF ;S1-- LUI V0,00FF ORI V0,V0,FFFF ;V0=FFFFFF: code::address mask LUI A0,8022 AND V0,T0,V0 ;V0=code & mask: code::address LUI V1,8000 OR V0,V0,V1 ;V0|=80000000: normal dram extension SW V0,7BD4 (A0) ;address->80227BD4: special entrypoint LUI V0,8022 ADDIU T4,R0,0001 J 80212008 SW T4,7BD0 (V0) ;1->80227BD0: use special entrypoint //80211D30: handle FF command--set code list location BNE V1,T4,80211D60 ;branch if not FF LUI V0,F000 LUI V0,00FF ORI V0,V0,FFFF ;V0=FFFFFF: code::address mask LUI A0,8022 AND V0,T0,V0 ;V0=code & mask: code::address LUI V1,A000 OR V0,V0,V1 ;V0|=A0000000: uncached dram extension SW V0,7BDC (A0) ;code::address->80227BDC: target for codelist LUI V0,8022 J 80212008 SW R0,7BF4 (V0) ;0->80227BF4: custom codelist location //80211D60: handle Fn commands-- AND V1,T0,V0 ;V1=code::command & F0000000 BNE V1,V0,80211D9C ;branch if not a Fn command LUI V0,D000 SW T0,0000 (S4) ;code->S4: add entry to inicode list ADDIU S4,S4,0004 ;S4+=4: next entry ADDIU S1,S1,FFFF ;S1-- LW T4,0020 (SP) ;T4=SP+20: #inicodes LHU V0,0016 (SP) ;V0=code::data ADDIU T4,T4,0002 ;T4+=2 SW T4,0020 (SP) ;update #inicodes SW V0,0000 (S4) ;code::data->inicode list ADDIU S4,S4,0004 ;S4+=4: next entry ADDIU V0,R0,FFFF J 80212008 SW V0,0000 (S4) ;-1->next inicode entry //80211D9C: handle Dn command--if {conditional} exec next code BNE V1,V0,80211DC8 LUI V0,E000 ADDIU S7,S7,0001 ;S7++ ADDU S8,T0,R0 ;S8=code SRA V0,S8,0x18 ;V0=code::type LW V1,9124 (S2) ;V1=80249124: p->codelist LW T4,0014 (SP) ;T4=SP+14: code::data ADDU V1,V1,S0 ADDIU S0,S0,0001 ;S0++ J 80211F98 SW T4,001C (SP) //80211DC8: removed commands BEQL V1,V0,8021200C ;branch if En command ADDIU S5,S5,0001 LUI V0,9000 BEQL V1,V0,8021200C ;branch if 9n command ADDIU S5,S5,0001 //80211DDC: handle 5n command--loop LUI V0,5000 BNEL V1,V0,80211F88 ADDU S7,R0,R0 ADDU A1,S3,R0 ADDIU A2,S5,0001 ADDIU A3,SP,0010 LUI T4,8022 ANDI V0,T0,FF00 SRA S6,V0,0x8 LW A0,7BE4 (T4) LW T1,0014 (SP) ANDI T2,T0,00FF SW T2,002C (SP) SW T3,0030 (SP) JAL 8020FBE0 SW T1,0028 (SP) ADDIU T4,R0,0001 LW T1,0028 (SP) LW T2,002C (SP) LW T3,0030 (SP) BEQL S7,T4,80211E34 ADDIU S0,S0,FFFA //80211E34: BEQ S6,R0,80211F6C ADDU A0,R0,R0 SRA T0,S8,0x18 SRA A3,S8,0x10 LW T4,001C (SP) SRA A2,S8,0x8 SRA A1,T4,0x8 //80211E50: ADDIU T4,R0,0001 BNEL S7,T4,80211EC8 ADDIU S1,S1,0001 LW V0,9124 (S2) ;V0=80249124: p->codelist ADDU S1,S1,T4 ADDU V0,V0,S0 SB T0,0000 (V0) LW V0,9124 (S2) ;V0=80249124: p->codelist ADDU S0,S0,T4 ADDU V0,V0,S0 SB A3,0000 (V0) LW V0,9124 (S2) ;V0=80249124: p->codelist ADDU S0,S0,T4 ADDU V0,V0,S0 SB A2,0000 (V0) LW V0,9124 (S2) ;V0=80249124: p->codelist ADDU S0,S0,T4 ADDU V0,V0,S0 SB S8,0000 (V0) LW V0,9124 (S2) ;V0=80249124: p->codelist ADDU S0,S0,T4 ADDU V0,V0,S0 ADDU S0,S0,T4 SB A1,0000 (V0) LW V0,9124 (S2) ;V0=80249124: p->codelist ADDU V0,V0,S0 ADDU S0,S0,T4 LBU T4,001F (SP) SB T4,0000 (V0) ADDIU S1,S1,0001 //80211EC8: ADDIU A0,A0,0001 LW V0,9124 (S2) ;V0=80249124: p->codelist LB V1,0010 (SP) ADDU V0,V0,S0 ADDIU S0,S0,0001 SB V1,0000 (V0) LW V0,9124 (S2) ;V0=80249124: p->codelist LH V1,0010 (SP) ADDU V0,V0,S0 ADDIU S0,S0,0001 SB V1,0000 (V0) LW V1,9124 (S2) ;V1=80249124: p->codelist LW V0,0010 (SP) ADDU V1,V1,S0 SRA V0,V0,0x8 ADDIU S0,S0,0001 SB V0,0000 (V1) LW V0,9124 (S2) ;V0=80249124: p->codelist LBU V1,0013 (SP) ADDU V0,V0,S0 ADDIU S0,S0,0001 SB V1,0000 (V0) LW V1,9124 (S2) ;V1=80249124: p->codelist LW V0,0014 (SP) ADDU V1,V1,S0 SRA V0,V0,0x8 ADDIU S0,S0,0001 SB V0,0000 (V1) LW V0,9124 (S2) ;V0=80249124: p->codelist LBU V1,0017 (SP) ADDU V0,V0,S0 ADDIU S0,S0,0001 SB V1,0000 (V0) LW V0,0010 (SP) LW V1,0014 (SP) ADDU V0,V0,T2 ADDU V1,V1,T1 SW V0,0010 (SP) SLT V0,A0,S6 BNE V0,R0,80211E50 SW V1,0014 (SP) //80211F6C ADDU S7,R0,R0 ANDI V0,S1,00FF SLTIU V0,V0,0002 BNE V0,R0,80212008 ADDIU S5,S5,0001 J 80212008 ADDIU S1,S1,FFFE //80211F88: handle "normal" code types LW V1,9124 (S2) ;V1=80249124: p->codelist SRA V0,T0,0x18 ;V0=code::type ADDU V1,V1,S0 ADDIU S0,S0,0001 ;S0++ SB V0,0000 (V1) ;code::type->codelist+0 LW V0,9124 (S2) ;V0=80249124: p->codelist LH V1,0010 (SP) ;V1=code::command ADDU V0,V0,S0 ADDIU S0,S0,0001 ;S0++ SB V1,0000 (V0) ;code[1]->codelist+1 LW V1,9124 (S2) ;V1=80249124: p->codelist LW V0,0010 (SP) ;V1=code::command ADDU V1,V1,S0 SRA V0,V0,0x8 ADDIU S0,S0,0001 ;S0++ SB V0,0000 (V1) ;code[2]->codelist+2 LW V0,9124 (S2) ;V0=80249124: p->codelist LBU V1,0013 (SP) ;V1=code::command ADDU V0,V0,S0 ADDIU S0,S0,0001 ;S0++ SB V1,0000 (V0) ;code[3]->codelist+3 LW V1,9124 (S2) ;V0=80249124: p->codelist LW V0,0014 (SP) ;V0=SP+14: code::data ADDU V1,V1,S0 SRA V0,V0,0x8 ADDIU S0,S0,0001 ;S0++ SB V0,0000 (V1) ;code[4]->codelist+4 LW V0,9124 (S2) ;V0=80249124: p->codelist LBU V1,0017 (SP) ;V0=SP+14: code::data ADDU V0,V0,S0 ADDIU S0,S0,0001 ;S0++ SB V1,0000 (V0) ;code[5]->codelist+5 //80212008: loop for current codes ADDIU S5,S5,0001 SLT V0,T3,S5 BEQ V0,R0,80211C7C ADDU A1,S3,R0 //80212018: loop for entire codelist LW T4,0018 (SP) ADDIU S3,S3,0001 SLT V0,T4,S3 BEQL V0,R0,80211C24 LUI T4,8022 //8021202C: ANDI V0,S1,00FF SLTIU V0,V0,000A BNE V0,R0,80212070 LUI V1,8025 LUI V0,8022 LW V1,7BF4 (V0) ADDIU V0,R0,0001 BNE V1,V0,80212070 LUI V1,8025 LUI V0,007F LUI V1,8025 LW V1,9110 (V1) ;V1=80249110: size of RAM ORI V0,V0,FFFF SLT V0,V0,V1 ;TRUE if 8MB exp.pak detected BEQL V0,R0,8021206C ;count = 10 if exp.pak not present ADDIU S1,R0,000A //8021206C: LUI V1,8025 LW V0,9124 (V1) ;V0=80249124: p->codelist SB S1,0003 (V0) LUI V0,8022 LW V0,7BF4 (V0) BNE V0,R0,802120A8 ANDI V0,S1,00FF LW V1,9124 (V1) ;V1=80249124: p->codelist LBU V0,0003 (V1) BEQ V0,R0,8021209C ADDIU V0,V0,FFFF SB V0,0003 (V1) //8021209C: LUI V0,8025 SB S1,9954 (V0) ANDI V0,S1,00FF //802120A8: return LW RA,005C (SP) LW S8,0058 (SP) LW S7,0054 (SP) LW S6,0050 (SP) LW S5,004C (SP) LW S4,0048 (SP) LW S3,0044 (SP) LW S2,0040 (SP) LW S1,003C (SP) LW S0,0038 (SP) JR RA ADDIU SP,SP,0060 802120D8: retrieve #games and total codes ADDIU SP,SP,FFE8 LUI V0,8022 SW RA,0010 (SP) JAL 8020E588 ;V0=#games in current codelist SW R0,7BE4 (V0) ;0->80227BE4: LUI V1,8022 JAL 8020ED6C ;V0=total #codes in all game headings SW V0,7BE8 (V1) ;V0->80227BE8: #games LW RA,0010 (SP) LUI V1,8022 SW V0,7BEC (V1) ;V0->80227BEC: #total codes JR RA ADDIU SP,SP,0018 8021210C: ADDIU SP,SP,FFC8 SW S7,002C (SP) ADDIU S7,R0,0001 SW S3,001C (SP) ADDU S3,R0,R0 SW S8,0030 (SP) ADDU S8,S3,R0 SW S1,0014 (SP) ADDU S1,S3,R0 SW RA,0034 (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S4,0020 (SP) SW S2,0018 (SP) JAL 80211860 SW S0,0010 (SP) LUI S0,8025 JAL 8020E588 ;V0=#games in current codelist SW R0,90D8 (S0) LUI V1,8022 JAL 8020ED6C ;V0=total #codes in all game headings SW V0,7BE8 (V1) ADDU A0,S3,R0 ADDU A1,S3,R0 ADDU A2,S3,R0 LUI V1,8022 JAL 802118EC SW V0,7BEC (V1) JAL 80211114 ;set VI buffer at next scan, then swap video buffers LUI S2,8022 JAL 80215A1C ;V0=button and stick pos for controller 1 ADDU S4,S0,R0 LUI S5,8021 ADDIU S6,S5,18BC JAL 80210D4C ;V0=button and stick pos NOP LUI V1,0800 ORI V1,V1,0002 ;V1=08000002: + up, stick up ADDU S0,V0,R0 AND V1,S0,V1 ;V1&=buttons: nonzero if buttons pressed BEQ V1,R0,802121D4 LUI V0,0400 LW V0,7BF0 (S2) BLEZ V0,802121D0 ADDIU V0,V0,FFFF ADDIU S3,R0,0001 SW V0,7BF0 (S2) JAL 802061C0 ADDU A0,R0,R0 //802121D0: LUI V0,0400 ORI V0,V0,0001 ;V0=04000001: + down, stick down AND V0,S0,V0 BEQ V0,R0,8021220C ADDIU T0,R0,0005 LW V1,7BF0 (S2) ADDIU V0,T0,FFFF SLT V0,V1,V0 BEQ V0,R0,80212210 LUI V0,1000 ADDIU S3,R0,0001 ADDU V0,V1,S3 SW V0,7BF0 (S2) JAL 802061C0 ADDU A0,R0,R0 //8021220C: LUI V0,1000 AND V0,S0,V0 ;V0=buttons & 1000000: Start button BNEL V0,R0,8021221C SW R0,7BF0 (S2) LUI V0,9000 AND V0,S0,V0 ;V0=buttons & 90000000: A, Start buttons BEQ V0,R0,802123C4 NOP JAL 802061C0 ADDU A0,R0,R0 ADDIU A1,R0,0001 ADDU A2,R0,R0 LW A0,7BF0 (S2) ADDU V0,A1,R0 JAL 802118EC SW V0,90D8 (S4) JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDIU A0,R0,000C ;A0=12 times JAL 8021120C ;call routine A1 A0 times ADDU A1,S6,R0 ;A1=802118BC LUI A0,8000 ;A0=A button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S6,R0 ;A1=802118BC LW V1,7BF0 (S2) SLTIU V0,V1,0005 BEQ V0,R0,802123C4 SLL V0,V1,0x2 LUI T0,8022 ADDIU T0,T0,43C0 ADDU V0,V0,T0 LW V0,0000 (V0) JR V0 NOP ADDIU T0,R0,0041 ADDIU A0,T0,0008 LUI A2,FFFE LUI T0,8022 LW A1,7660 (T0) ;A1=str+0: 802243A4 "Start Game" JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE LUI T0,8022 LW A0,7BE4 (T0) JAL 8020DFF8 ADDU A1,S6,R0 LUI V1,8025 LW V1,91DC (V1) ADDU S1,V0,R0 BEQ S1,V1,802122E4 SW R0,90D8 (S4) J 802123C4 ADDIU S8,R0,0001 LUI A0,8021 J 802123B4 ADDIU A0,A0,DFC0 ADDIU T0,R0,0041 ADDIU A0,T0,0024 LUI A2,FFFE LUI T0,8022 ADDIU T0,T0,7660 ;T0=80227660: string pointer table LW A1,0004 (T0) ;A1=str+4: 80224390 "Select Cheat Codes" JAL 80210EF4 ;print A1 centered on line A0 in colour A2 ORI A2,A2,FFFE LUI T0,8022 LW A0,7BE4 (T0) ;A0=80227BE4: JAL 8020C8A4 NOP ADDU S1,V0,R0 JAL 8020E588 ;V0=#games in current codelist SW R0,90D8 (S4) LUI V1,8022 JAL 8020ED6C ;V0=total #codes in all game headings SW V0,7BE8 (V1) LUI V1,8022 SW V0,7BEC (V1) ADDIU V0,S1,0002 SLTIU V0,V0,0002 BEQ V0,R0,80212358 LUI A0,8021 J 80212368 ADDIU S8,R0,0001 ADDIU A0,A0,BFB0 ADDIU A1,S5,18BC JAL 8021401C ADDIU A2,R0,0001 JAL 80211860 NOP J 802123C4 NOP JAL 80210ADC NOP SW R0,90D8 (S4) LUI A0,8021 J 802123B4 ADDIU A0,A0,07B8 JAL 802071F8 NOP J 802123C4 SW R0,90D8 (S4) JAL 80203E8C NOP SW R0,90D8 (S4) LUI A0,8020 ADDIU A0,A0,3E10 LUI A1,8021 ADDIU A1,A1,18BC JAL 8021401C ADDIU A2,R0,0001 LW A0,7BF0 (S2) ADDU A1,R0,R0 JAL 802118EC ADDU A2,A1,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BEQL S0,R0,802123EC ADDIU S7,R0,0001 BEQ S3,R0,8021240C ADDU A0,S0,R0 ADDIU A1,R0,0005 ADDU A2,S7,R0 JAL 802111A0 ADDIU A3,S5,18BC ADDU S3,R0,R0 ADDU S7,S3,R0 BEQ S8,R0,80212194 NOP JAL 80214EB8 ;fill entire video buffer with value A0 ADDU A0,R0,R0 ;A0=0: blank video buffer JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP JAL 80215804 ;V0=p->A0 bytes of allocated memory ADDIU A0,R0,4E20 ;A0=4E20 bytes ADDU A0,V0,R0 ADDU A1,R0,R0 ADDIU A2,R0,4E20 LUI V0,8025 JAL 80215758 ;V0=memset(A0,A1,A2) SW A0,9124 (V0) ;A0->80249124: p->codelist LUI V1,8025 ADDIU V0,R0,FFFF SW V0,B110 (V1) ;-1->8024B110: p->inicodelist LUI V0,8022 ADDIU V1,R0,0001 SW V1,7BF4 (V0) ADDU V0,S1,V1 SLTIU V0,V0,0002 BEQ V0,R0,802124A8 ADDIU V0,R0,FFFE JAL 80211B2C NOP LUI V1,8022 LW V1,7BD8 (V1) BEQ V1,R0,802124BC ADDU S1,V0,R0 LUI A0,A000 ORI A0,A0,0200 ADDU A1,R0,R0 JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,0100 JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP J 802124BC NOP BEQL S1,V0,802124BC ADDU S1,R0,R0 BNE S1,V1,802124C4 NOP ADDU S1,R0,R0 JAL 8020FE14 NOP BNE S1,R0,802124F0 ADDU V0,S1,R0 ADDU V1,R0,R0 LUI A0,8025 //80212DD4: LW V0,9124 (A0) ;V0=80249124: p->codelist ADDU V0,V0,V1 ADDIU V1,V1,0001 SB R0,0000 (V0) SLTI V0,V1,003C BNE V0,R0,802124D4 ;blank 60 bytes in table--whopping 10 codes ADDU V0,S1,R0 //80212DF0: LW RA,0034 (SP) LW S8,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 80212520: redirect to 8021502C accepts: A0=p->string ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8021502C ;print string A0 to screen NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8021253C: frees allocated memory at 80249960, 80227CD8, 80227CDC ADDIU SP,SP,FFE8 LUI V0,8025 ADDIU A0,V0,9960 ;A0=80249960: p->??? BEQ A0,R0,80212558 ;skip if NULL pointer SW RA,0010 (SP) JAL 802158AC ;free allocated memory A0 NOP //80212558: LUI V0,8022 LW A0,7CD8 (V0) ;A0=80227CD8: p->??? BEQ A0,R0,80212574 ;skip if NULL pointer LUI V0,8022 JAL 802158AC ;free allocated memory A0 NOP //80212574: LUI V0,8022 LW A0,7CDC (V0) ;A0=80227CDC: p->??? BEQ A0,R0,80212588 ;skip if NULL pointer NOP JAL 802158AC ;free allocated memory A0 NOP //80212588: return LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80212594: ADDIU SP,SP,FFE0 LUI V0,8022 SW RA,0018 (SP) SW S1,0014 (SP) SW S0,0010 (SP) SW R0,7C14 (V0) JAL 80215804 ;V0=p->A0 bytes of allocated memory ADDIU A0,R0,1800 ;A0=1800 bytes ADDIU A0,R0,1800 ;A0=1800 bytes LUI S1,8025 JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,90E0 (S1) ;V0->802490E0: p->memory ADDIU A0,R0,1800 ;A0=1800 bytes ADDIU S0,S1,90E0 JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0004 (S0) ;V0->802490E4: p->memory ADDIU A0,R0,1800 ;A0=1800 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0008 (S0) ;V0->802490E8: p->memory LUI A1,8022 LW A0,90E0 (S1) ;A0=802290E0: p->target ADDIU A1,A1,43E0 ;A1=802243E0: "tile1.tg~" JAL 80217444 ;load resource named A1 to A0 SW V0,000C (S0) ;V0->802490EC: p->memory ADDIU A1,R0,0040 ADDIU A2,R0,0030 LW A0,90E0 (S1) ;A0=802290E0: p->??? JAL 80215608 ;byteswap pixels in image A0 of size {A1,A2} ADDU A3,R0,R0 ADDIU A1,R0,0040 ADDIU A2,R0,0030 LW A0,90E0 (S1) JAL 8021564C ADDIU A3,R0,0002 JAL 802126B8 ADDU A0,R0,R0 LUI A1,8022 LW A0,90E0 (S1) ;A0=802490E0: p->target JAL 80217444 ;load resource named A1 to A0 ADDIU A1,A1,43EC ;A1=802243EC: "tile3.tg~" ADDIU A1,R0,0040 ADDIU A2,R0,0030 LW A0,90E0 (S1) JAL 80215608 ;byteswap pixels in image A0 of size {A1,A2} ADDU A3,R0,R0 ADDIU A1,R0,0040 ADDIU A2,R0,0030 LW A0,90E0 (S1) JAL 8021564C ADDIU A3,R0,0002 JAL 802126B8 ADDIU A0,R0,0001 LUI A1,8022 LW A0,90E0 (S1) ;A0=802490E0: p->target JAL 80217444 ;load resource named A1 to A0 ADDIU A1,A1,43F8 ;A1=802243F8: "tile4.tg~" ADDIU A1,R0,0040 ADDIU A2,R0,0030 LW A0,90E0 (S1) JAL 80215608 ;byteswap pixels in image A0 of size {A1,A2} ADDU A3,R0,R0 ADDIU A1,R0,0040 ADDIU A2,R0,0030 LW A0,90E0 (S1) JAL 8021564C ADDIU A3,R0,0002 JAL 802126B8 ADDIU A0,R0,0002 LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 802126B8: ADDIU SP,SP,FFC0 ADDU T0,R0,R0 ADDIU A3,R0,0004 LUI V0,8025 ADDIU T1,V0,90E0 ADDU A2,T1,R0 SW RA,003C (SP) SW S8,0038 (SP) SW S7,0034 (SP) SW S6,0030 (SP) SW S5,002C (SP) SW S4,0028 (SP) SW S3,0024 (SP) SW S2,0020 (SP) SW S1,001C (SP) SW S0,0018 (SP) SW A0,0040 (SP) ADDU S1,R0,R0 ADDU V0,A3,T1 LW V1,0000 (A2) LW S0,0000 (V0) LHU A1,0000 (V1) ADDIU V1,V1,0002 ADDU A0,R0,R0 LHU V0,0000 (V1) ADDIU V1,V1,0002 ADDIU A0,A0,0001 SH V0,0000 (S0) SLTI V0,A0,003F BNE V0,R0,80212718 ADDIU S0,S0,0002 SH A1,0000 (S0) ADDIU S1,S1,0001 SLTI V0,S1,0030 BNE V0,R0,8021270C ADDIU S0,S0,0002 ADDIU A3,A3,0004 ADDIU T0,T0,0001 SLTI V0,T0,0003 BNE V0,R0,802126FC ADDIU A2,A2,0004 ADDU S1,R0,R0 LUI V0,8025 ADDIU S6,V0,9960 LW T2,0040 (SP) LUI S8,8025 ADDIU S7,S8,90E0 ADDIU S5,R0,000C ADDIU S4,R0,0008 ADDIU S3,R0,0004 SLL V0,T2,0x3 SUBU V0,V0,T2 SLL S2,V0,0x4 JAL 80215804 ;V0=p->A0 bytes of allocated memory ADDIU A0,R0,1800 ;A0=1800 bytes ADDIU A0,R0,1800 ;A0=1800 bytes SLL S0,S1,0x2 ADDU S0,S0,S2 ADDU S0,S0,S6 JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0000 (S0) ADDIU A0,R0,1800 ;A0=1800 bytes ADDU V1,S3,S2 ADDU V1,V1,S6 JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0000 (V1) ADDIU A0,R0,1800 ;A0=1800 bytes ADDU V1,S4,S2 ADDU V1,V1,S6 JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0000 (V1) ADDU A0,R0,R0 ADDU V1,S5,S2 ADDU V1,V1,S6 SW V0,0000 (V1) LW V1,90E0 (S8) LW S0,0000 (S0) LHU V0,0000 (V1) ADDIU V1,V1,0002 ADDIU A0,A0,0001 SH V0,0000 (S0) SLTI V0,A0,0C00 BNE V0,R0,802127EC ADDIU S0,S0,0002 ADDU A0,R0,R0 ADDU V0,S3,S2 ADDU V0,V0,S6 LW V1,0004 (S7) LW S0,0000 (V0) LHU V0,0000 (V1) ADDIU V1,V1,0002 ADDIU A0,A0,0001 SH V0,0000 (S0) SLTI V0,A0,0C00 BNE V0,R0,8021281C ADDIU S0,S0,0002 ADDU A0,R0,R0 ADDU V0,S4,S2 ADDU V0,V0,S6 LW V1,0008 (S7) LW S0,0000 (V0) LHU V0,0000 (V1) ADDIU V1,V1,0002 ADDIU A0,A0,0001 SH V0,0000 (S0) SLTI V0,A0,0C00 BNE V0,R0,8021284C ADDIU S0,S0,0002 ADDU A0,R0,R0 ADDU V0,S5,S2 ADDU V0,V0,S6 LW V1,000C (S7) LW S0,0000 (V0) LHU V0,0000 (V1) ADDIU V1,V1,0002 ADDIU A0,A0,0001 SH V0,0000 (S0) SLTI V0,A0,0C00 BNE V0,R0,8021287C ADDIU S0,S0,0002 BGEZ S1,802128A4 ADDU A2,S1,R0 ADDIU A2,S1,0003 ADDU A0,R0,R0 ADDU A1,A0,R0 LW A3,0040 (SP) SRA A2,A2,0x2 JAL 80212904 SW R0,0010 (SP) ADDIU S5,S5,0010 ADDIU S4,S4,0010 ADDIU S1,S1,0004 SLTI V0,S1,001C BNE V0,R0,8021278C ADDIU S3,S3,0010 LW RA,003C (SP) LW S8,0038 (SP) LW S7,0034 (SP) LW S6,0030 (SP) LW S5,002C (SP) LW S4,0028 (SP) LW S3,0024 (SP) LW S2,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0040 80212904: accepts: A0=, A1=, A2=, A3=, SP+10= ADDIU SP,SP,FFE8 LW T0,0028 (SP) ;T0= SLTIU V0,A2,0007 BEQ V0,R0,80212984 SW RA,0010 (SP) LUI V0,8022 ADDIU V0,V0,4408 SLL V1,A2,0x2 ADDU V1,V1,V0 LW V0,0000 (V1) ;V0=80224408+offset: p->handler JR V0 NOP //80212934: LUI V1,0080 J 80212988 ORI V1,V1,8080 ;V1=00808080 //80212940: LUI V1,006A J 80212988 ORI V1,V1,7A93 ;V1=006A7A93 //8021294C: LUI V1,0093 J 80212988 ORI V1,V1,7A6A ;V1=00937A6A //80212958: LUI V1,006A J 80212988 ORI V1,V1,936A ;V1=006A936A //80212964: LUI V1,0059 J 80212988 ORI V1,V1,1676 ;V1=00591676 //80212970: J 80212988 ADDIU V1,R0,5878 ;V1=00005878 //80212978: LUI V1,0028 J 80212988 ORI V1,V1,2868 ;V1=00282868 //80212984: ADDU V1,R0,R0 ;V1=00000000 //80212988: BEQ T0,R0,80212A3C ANDI T6,V1,00FF ANDI V0,V1,FF00 SRA T5,V0,0x8 SRL T4,V1,0x10 ADDU T3,R0,R0 LUI V0,8025 LW T2,90E0 (V0) ;T2=802490E0: LUI V0,8025 LW T1,9960 (V0) ;T1=80249960: LHU V1,0000 (T2) ANDI V1,V1,FFFF SRL V0,V1,0xB MULT T6,V0 MFLO T0 SRL V0,V1,0x6 ANDI V0,V0,001F MULT T5,V0 ADDIU T2,T2,0002 ADDIU T3,T3,0001 MFLO A3 SRL V1,V1,0x1 ANDI V1,V1,001F MULT T4,V1 SLL V0,T0,0x3 ANDI T0,V0,F800 ;T0=V0&F800: red SRL V0,A3,0x2 ANDI A3,V0,07C0 ;A3=V0&07C0: green MFLO V1 SRL V0,V1,0x7 ANDI V1,V0,003E ;V1=V0&003E: blue OR V0,T0,A3 OR V0,V0,V1 SH V0,0000 (T1) SLTI V0,T3,0C00 BNE V0,R0,802129B0 ADDIU T1,T1,0002 LUI V0,8025 LW A2,9960 (V0) JAL 8021872C ADDIU A0,A0,0040 LUI V0,8022 SW R0,7C14 (V0) J 80212B14 NOP LUI V0,8022 LW V0,7C14 (V0) BNE V0,R0,80212B14 ANDI V0,V1,FF00 ANDI T6,V1,00FF SRA T5,V0,0x8 SRL T4,V1,0x10 ADDU A0,R0,R0 LUI V0,8025 ADDIU T8,V0,9960 SLL A2,A2,0x2 SLL V0,A3,0x3 SUBU V0,V0,A3 SLL T7,V0,0x4 LUI V0,8025 ADDIU A1,V0,90E0 ADDU T3,R0,R0 ADDU V0,A2,A0 SLL V0,V0,0x2 ADDU V0,V0,T7 ADDU V0,V0,T8 LW T2,0000 (A1) LW T1,0000 (V0) LHU V1,0000 (T2) ANDI V1,V1,FFFF SRL V0,V1,0xB MULT T6,V0 MFLO T0 SRL V0,V1,0x6 ANDI V0,V0,001F MULT T5,V0 ADDIU T2,T2,0002 ADDIU T3,T3,0001 MFLO A3 SRL V1,V1,0x1 ANDI V1,V1,001F MULT T4,V1 SLL V0,T0,0x3 ANDI T0,V0,F800 ;T0=V0&F800: red SRL V0,A3,0x2 ANDI A3,V0,07C0 ;A3=V0&07C0: green MFLO V1 SRL V0,V1,0x7 ANDI V1,V0,003E ;V1=V0&003E: blue OR V0,T0,A3 OR V0,V0,V1 SH V0,0000 (T1) SLTI V0,T3,0C00 BNE V0,R0,80212A98 ADDIU T1,T1,0002 ADDIU A0,A0,0001 SLTI V0,A0,0004 BNE V0,R0,80212A7C ADDIU A1,A1,0004 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80212B20: ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 BEQ S0,R0,80212B3C SW RA,0014 (SP) JAL 80215ADC NOP LUI V0,8022 LW V0,7C0C (V0) BEQ V0,R0,80212B64 LUI V1,8022 LW V0,7C08 (V1) ADDIU V0,V0,0001 SW V0,7C08 (V1) SLTI V0,V0,0040 BEQL V0,R0,80212B64 SW R0,7C08 (V1) LUI V0,8022 LUI A1,8025 LW A0,7C08 (V0) LUI V0,8022 ADDIU A1,A1,9960 LW V1,7C04 (V0) LUI V0,8022 SRA A2,A0,0x2 SLL A2,A2,0x2 SLL V1,V1,0x2 ANDI A0,A0,0003 ADDU V1,V1,A0 LW A0,7C00 (V0) SLL V1,V1,0x2 SLL V0,A0,0x3 SUBU V0,V0,A0 SLL V0,V0,0x4 ADDU V1,V1,V0 ADDU V1,V1,A1 ADDIU A0,R0,FFC0 SUBU A0,A0,A2 LW A2,0000 (V1) JAL 802115B0 ADDU A1,R0,R0 LUI V1,8022 ADDIU V0,R0,0001 SW V0,7C14 (V1) BEQ S0,R0,80212BE0 NOP JAL 80215B54 NOP JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80212BF8 unconditional return JR RA NOP 80212C00 unconditional return JR RA NOP 80212C08 ADDIU SP,SP,FFE8 ADDIU A0,R0,1860 ;A0=1860 bytes SW RA,0014 (SP) JAL 80215804 ;V0=p->A0 bytes of allocated memory SW S0,0010 (SP) ADDU A0,V0,R0 ;A0=V0: p->memory LUI A1,8022 ADDIU A1,A1,4424 ;A1=80224424: "menuf.tg~" LUI S0,8022 JAL 80217444 ;load resource named A1 to A0 SW A0,7CD8 (S0) ;A0->80227CD8: p->target //80212C34: byteswap image ADDIU A1,R0,0030 ;A1=30: width ADDIU A2,R0,0041 ;A2=41: hieght LW A0,7CD8 (S0) ;A0=80227CD8: p->menuf JAL 80215608 ;byteswap pixels in image A0 of size {A1,A2} ADDU A3,R0,R0 ;A3=0 //80212C48: ADDIU A1,R0,0030 ;A1=30: width ADDIU A2,R0,0041 ;A2=41: height LW A0,7CD8 (S0) ;A0=80227CD8: p->menuf JAL 8021564C ADDIU A3,R0,002A ;A3=2A //80212C5C: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80212C6C calls 80212C08, 80212594 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80212C08 NOP JAL 80212594 NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80212C90 print blue box w/ text A3 in region {A0,A1} to {A2,SP+10} accepts: A0=xpos, A1=ypos, A2=fit width in characters, A3=p->string, SP+10=y region ADDIU SP,SP,FFA0 SW S6,0050 (SP) ADDU S6,A0,R0 ;S6=A0: SW S7,0054 (SP) ADDU S7,A1,R0 ;S7=A1: ADDIU A0,S6,0006 ;A0+=6: ADDIU A1,S7,0006 ;A1+=6: SW S8,0058 (SP) SLL S8,A2,0x3 ;S8=A2*8: #chars->width ADDIU A2,S8,0028 ;A2=(A2+5)*8: width+offset SW S3,0044 (SP) LW S3,0070 (SP) ;S3=[SP+10 f/caller]: ADDIU V0,R0,0040 SW RA,005C (SP) SW S5,004C (SP) SW S4,0048 (SP) SW S2,0040 (SP) SW S1,003C (SP) SW S0,0038 (SP) SW V0,0010 (SP) ;SP+10= 40: red SW V0,0014 (SP) ;SP+14= 40: green SW V0,0018 (SP) ;SP+18= 40: blue SW A3,006C (SP) ;SP+6C= A3: p->string ADDIU S5,S3,000B JAL 8021475C ADDU A3,S5,R0 ;A3=[SP+10}+B: //80212CF8: ADDIU A1,R0,0030 ;A1=30: '0' ADDIU A2,R0,0041 ;A2=41: 'A' LUI A3,0080 LUI S4,8022 ORI A3,A3,8080 ;A3=00808080: colour=cyan ADDIU S0,R0,0015 LUI S1,8025 LW A0,7CD8 (S4) ;A0=80227CD8: LW V0,911C (S1) ;V0=8024911C: ADDIU S2,R0,000B SW S6,0010 (SP) ;SP+10= [A0 f/caller] SW S7,0014 (SP) ;SP+14= [A1 f/caller] SW S0,0018 (SP) ;SP+18= 15 SW S5,001C (SP) ;SP+1C= [SP+10 +B] SW R0,0020 (SP) ;SP+20= 0 SW R0,0028 (SP) ;SP+28= 0 SW R0,002C (SP) ;SP+2C= 0 SW S0,0030 (SP) ;SP+30= 15 SW S2,0034 (SP) ;SP+34= B JAL 80214488 SW V0,0024 (SP) ;SP+24= V0: //80212D4C: ADDU V0,S6,S0 ;V0=[A0]+15: ADDIU A1,R0,0030 ;A1=30: '0' ADDIU A2,R0,0041 ;A2=41: 'A' LUI A3,0080 LW A0,7CD8 (S4) ;A0=80227CD8: LW V1,911C (S1) ;V1=8024911C: ORI A3,A3,8080 ;A3=00808080: colour=cyan SW V0,0010 (SP) ;SP+10= V0: ADDIU V0,R0,0008 SW S7,0014 (SP) ;SP+14= [A1 f/caller] SW S8,0018 (SP) ;SP+18= [A2*8]: width SW S5,001C (SP) ;SP+1C= [SP+10 +B] SW R0,0020 (SP) ;SP+20= 0 SW S0,0028 (SP) ;SP+28= 15 SW R0,002C (SP) ;SP+2C= 0 SW V0,0030 (SP) ;SP+30= 8 SW S2,0034 (SP) ;SP+34= B JAL 80214488 SW V1,0024 (SP) ;SP+24= V1: //80212D98: ADDU V0,S6,S8 ;V0=[A0]+width: x max ADDU V0,V0,S0 ;V0+=15: x max+offset ADDIU A1,R0,0030 ;A1=30 ADDIU A2,R0,0041 ;A2=41 LUI A3,0080 ORI A3,A3,8080 ;A3=00808080: colour=cyan LW A0,7CD8 (S4) ;A0=80227CD8: LW T0,911C (S1) ;T0=8024911C: ADDIU V1,R0,0013 SW V0,0010 (SP) ;SP+10= x max ADDIU V0,R0,001D SW S7,0014 (SP) ;SP+14= [A1 f/caller] SW V1,0018 (SP) ;SP+18= 13 SW S5,001C (SP) ;SP+1C= [SP+10 +B] SW R0,0020 (SP) ;SP+20= 0 SW V0,0028 (SP) ;SP+28= 1D SW R0,002C (SP) ;SP+2C= 0 SW V1,0030 (SP) ;SP+30= 13 SW S2,0034 (SP) ;SP+34= B JAL 80214488 SW T0,0024 (SP) ;SP+24= T0: //80212DEC: display string in box ADDU A0,S6,S0 ;A0=[A0]+15: xpos+offset SRA S3,S3,0x1 ;S3=[SP+10]/2 ADDIU S3,S3,0002 ;S3=[SP+10]/2 +2: centering ADDU A1,S7,S3 ;A1=[A1]+centering: ypos LW A3,006C (SP) ;A3=SP+6C: p->string ADDU A2,S8,R0 ;A2=width JAL 802136DC ;display string A3 in colour SP+10 centered on line at {A2-A0,A1} SW R0,0010 (SP) ;SP+10= black //80212E0C: return LW RA,005C (SP) LW S8,0058 (SP) LW S7,0054 (SP) LW S6,0050 (SP) LW S5,004C (SP) LW S4,0048 (SP) LW S3,0044 (SP) LW S2,0040 (SP) LW S1,003C (SP) LW S0,0038 (SP) JR RA ADDIU SP,SP,0060 80212E3C ADDIU SP,SP,FF98 SW S7,005C (SP) ADDU S7,A0,R0 SW S3,004C (SP) ADDIU S3,R0,001C ADDIU A0,S7,0013 SW A1,006C (SP) ADDIU A1,A1,000B SW S4,0050 (SP) SW A2,0070 (SP) SLL S4,A2,0x3 ORI A2,S4,0003 SW A3,0074 (SP) LW T1,0074 (SP) ADDIU A3,R0,0005 SW S1,0044 (SP) ADDIU S1,R0,0040 SW RA,0064 (SP) SW S8,0060 (SP) SW S6,0058 (SP) SW S5,0054 (SP) SW S2,0048 (SP) SW S0,0040 (SP) SW S1,0010 (SP) SW S1,0014 (SP) SW S1,0018 (SP) SLL S0,T1,0x3 SUBU S0,S0,T1 JAL 8021475C SLL S0,S0,0x1 ADDIU T1,S4,0028 ADDU A0,S7,T1 ADDIU A0,A0,FFFE ADDIU A2,R0,0008 SW T1,0038 (SP) LW T1,006C (SP) ADDIU A3,S0,0010 SW S1,0010 (SP) SW S1,0014 (SP) SW S1,0018 (SP) JAL 8021475C ADDIU A1,T1,0006 ADDU S5,S7,R0 ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LUI S2,8022 ORI A3,A3,8080 SW S5,0010 (SP) ADDIU S5,S5,0015 ADDIU S0,R0,0015 LUI S8,8025 LW S6,006C (SP) LW A0,7CD8 (S2) LW V0,911C (S8) ADDIU S1,R0,0010 SW S0,0018 (SP) SW S1,001C (SP) SW R0,0020 (SP) SW R0,0028 (SP) SW R0,002C (SP) SW S0,0030 (SP) SW S1,0034 (SP) SW S6,0014 (SP) JAL 80214488 SW V0,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 ORI A3,A3,8080 SW S5,0010 (SP) ADDU S5,S5,S4 LW A0,7CD8 (S2) LW V1,911C (S8) ADDIU V0,R0,0008 SW S6,0014 (SP) SW S4,0018 (SP) SW S1,001C (SP) SW R0,0020 (SP) SW S0,0028 (SP) SW R0,002C (SP) SW V0,0030 (SP) SW S1,0034 (SP) JAL 80214488 SW V1,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 ORI A3,A3,8080 SW S6,0014 (SP) ADDU S6,S6,S1 ADDIU V1,R0,0013 LW A0,7CD8 (S2) LW T0,911C (S8) ADDIU V0,R0,001D SW S5,0010 (SP) SW V1,0018 (SP) SW S1,001C (SP) SW R0,0020 (SP) SW V0,0028 (SP) SW R0,002C (SP) SW V1,0030 (SP) SW S1,0034 (SP) JAL 80214488 SW T0,0024 (SP) LW T1,0074 (SP) BLEZ T1,80213188 ADDU S5,S7,R0 BLEZ T1,8021315C ADDU S1,R0,R0 ADDIU S2,R0,000E LW T1,0074 (SP) ADDIU V0,S1,0001 BEQ V0,T1,80213034 ADDIU A0,S7,0013 LW T1,006C (SP) ADDU A1,T1,S3 LW T1,0038 (SP) ADDIU A3,R0,0002 ADDIU A2,T1,FFDB ADDIU T1,R0,0040 SW T1,0010 (SP) SW T1,0014 (SP) JAL 8021475C SW T1,0018 (SP) ADDIU S3,S3,000E LW T1,007C (SP) BNE T1,S1,80213050 ADDIU S0,R0,0010 LW T1,0080 (SP) BEQ T1,R0,80213050 ADDIU S0,R0,001E ADDIU S0,R0,002C ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 ORI A3,A3,8080 SW S5,0010 (SP) ADDIU S5,S5,0015 LUI T1,8022 ADDIU S1,S1,0001 LW A0,7CD8 (T1) LW V0,911C (S8) ADDIU T1,R0,0015 SW S6,0014 (SP) SW T1,0018 (SP) SW S2,001C (SP) SW R0,0020 (SP) SW R0,0028 (SP) SW S0,002C (SP) SW T1,0030 (SP) SW S2,0034 (SP) JAL 80214488 SW V0,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LUI T1,8022 ORI A3,A3,8080 SW S5,0010 (SP) ADDU S5,S5,S4 LW A0,7CD8 (T1) ADDIU T1,R0,0015 LW V1,911C (S8) ADDIU V0,R0,0008 SW S6,0014 (SP) SW S4,0018 (SP) SW S2,001C (SP) SW R0,0020 (SP) SW T1,0028 (SP) SW S0,002C (SP) SW V0,0030 (SP) SW S2,0034 (SP) JAL 80214488 SW V1,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LUI T1,8022 ORI A3,A3,8080 SW S6,0014 (SP) ADDIU S6,S6,000E LW A0,7CD8 (T1) ADDIU T1,R0,0013 LW V1,911C (S8) ADDIU V0,R0,001D SW S5,0010 (SP) SW T1,0018 (SP) SW S2,001C (SP) SW R0,0020 (SP) SW V0,0028 (SP) SW S0,002C (SP) SW T1,0030 (SP) SW S2,0034 (SP) JAL 80214488 SW V1,0024 (SP) LW T1,0074 (SP) SLT V0,S1,T1 BNE V0,R0,80212FFC ADDU S5,S7,R0 ADDIU A0,S7,0013 LW T1,006C (SP) ADDIU A3,R0,0004 ADDU A1,T1,S3 LW T1,0038 (SP) ADDIU V0,R0,0040 SW V0,0010 (SP) SW V0,0014 (SP) SW V0,0018 (SP) JAL 8021475C ADDIU A2,T1,FFDB ADDIU A0,S7,0006 ADDIU A3,R0,0007 LW T1,006C (SP) LW A2,0038 (SP) ADDIU V0,R0,0040 SW V0,0010 (SP) SW V0,0014 (SP) SW V0,0018 (SP) ADDU A1,T1,S3 JAL 8021475C ADDIU A1,A1,0008 ADDU S5,S7,R0 ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LUI S4,8022 ORI A3,A3,8080 SW S5,0010 (SP) ADDIU S5,S5,0015 ADDIU S0,R0,0015 ADDIU S1,R0,0007 LUI S2,8025 LW T1,0074 (SP) LW A0,7CD8 (S4) SLL V0,T1,0x3 SUBU V0,V0,T1 SLL V0,V0,0x1 LW T1,006C (SP) ADDIU V0,V0,0010 ADDU S6,T1,V0 LW V0,911C (S2) ADDIU S3,R0,003A SW S0,0018 (SP) SW S1,001C (SP) SW R0,0020 (SP) SW R0,0028 (SP) SW S3,002C (SP) SW S0,0030 (SP) SW S1,0034 (SP) SW S6,0014 (SP) JAL 80214488 SW V0,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LW A0,7CD8 (S4) LW T1,0070 (SP) LW V1,911C (S2) ORI A3,A3,8080 SW S5,0010 (SP) SW S6,0014 (SP) SW S1,001C (SP) SW R0,0020 (SP) SW S0,0028 (SP) SW S3,002C (SP) SW S1,0034 (SP) SLL V0,T1,0x3 ADDU S5,S5,V0 SW V0,0018 (SP) ADDIU V0,R0,0008 SW V0,0030 (SP) JAL 80214488 SW V1,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 ORI A3,A3,8080 ADDIU V1,R0,0013 LW A0,7CD8 (S4) LW T0,911C (S2) ADDIU V0,R0,001D SW S5,0010 (SP) SW S6,0014 (SP) SW V1,0018 (SP) SW S1,001C (SP) SW R0,0020 (SP) SW V0,0028 (SP) SW S3,002C (SP) SW V1,0030 (SP) SW S1,0034 (SP) JAL 80214488 SW T0,0024 (SP) LW RA,0064 (SP) LW S8,0060 (SP) LW S7,005C (SP) LW S6,0058 (SP) LW S5,0054 (SP) LW S4,0050 (SP) LW S3,004C (SP) LW S2,0048 (SP) LW S1,0044 (SP) LW S0,0040 (SP) JR RA ADDIU SP,SP,0068 80213300: ADDIU SP,SP,FFD8 LUI V1,8022 LW T0,0038 (SP) ADDIU V1,V1,7C18 SW RA,0020 (SP) SLL V0,T0,0x1 ADDU V0,V0,T0 SLL V0,V0,0x2 ADDU V0,V0,V1 LW V1,0000 (V0) SW V1,0010 (SP) LW V1,0004 (V0) SW V1,0014 (SP) LUI V1,8025 LW T0,0008 (V0) LW V0,9780 (V1) SRL V1,V0,0x1F ADDU V0,V0,V1 SRA V0,V0,0x1 ADDU A0,A0,V0 JAL 80214778 SW T0,0018 (SP) LW RA,0020 (SP) JR RA ADDIU SP,SP,0028 80213364: ADDIU SP,SP,FF98 SW S2,0048 (SP) ADDU S2,A1,R0 SW S1,0044 (SP) SW A0,0068 (SP) ADDIU S1,A0,0006 ADDU A0,S1,R0 SW S4,0050 (SP) SW A3,0074 (SP) ADDU S4,S2,A3 ADDIU A1,S4,FFFC SW S0,0040 (SP) SW A2,0070 (SP) ADDIU S0,A2,FFF4 ADDU A2,S0,R0 ADDIU A3,R0,0001 SW S6,0058 (SP) ADDIU S6,R0,0002 SW RA,0064 (SP) SW S8,0060 (SP) SW S7,005C (SP) SW S5,0054 (SP) SW S3,004C (SP) JAL 80213300 SW S6,0010 (SP) ADDU A0,S1,R0 ADDIU A1,S4,FFFD ADDU A2,S0,R0 ADDIU A3,R0,0001 ADDU S3,A3,R0 JAL 80213300 SW S3,0010 (SP) ADDU A0,S1,R0 ADDIU A1,S4,FFFE ADDU A2,S0,R0 ADDIU A3,R0,0001 ADDIU S5,R0,0003 JAL 80213300 SW S5,0010 (SP) ADDU A0,S1,R0 ADDIU A1,S4,FFFF ADDU A2,S0,R0 ADDIU A3,R0,0001 JAL 80213300 SW S3,0010 (SP) ADDU A0,S1,R0 ADDU A1,S2,R0 ADDU A2,S0,R0 ADDIU A3,R0,0001 JAL 80213300 SW S6,0010 (SP) ADDU A0,S1,R0 ADDIU S7,S2,0001 ADDU A1,S7,R0 ADDU A2,S0,R0 ADDIU A3,R0,0001 JAL 80213300 SW S3,0010 (SP) ADDU A0,S1,R0 ADDU A1,S2,S6 ADDU A2,S0,R0 ADDIU A3,R0,0001 JAL 80213300 SW S5,0010 (SP) ADDU A0,S1,R0 ADDU V1,S2,S5 ADDU A1,V1,R0 ADDU A2,S0,R0 ADDIU A3,R0,0001 SW V1,0038 (SP) JAL 80213300 SW S3,0010 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LUI T0,8022 ORI A3,A3,8080 ADDIU S2,S2,0004 ADDIU S1,R0,000E LUI S5,8025 LW A0,7CD8 (T0) LW V1,0068 (SP) LW T0,0074 (SP) LW V0,911C (S5) ADDIU S0,R0,0007 SW S2,0014 (SP) SW S1,0018 (SP) SW R0,0020 (SP) SW R0,0028 (SP) SW S0,002C (SP) SW S1,0030 (SP) SW S3,0034 (SP) ADDIU S8,T0,FFF8 SW V1,0010 (SP) SW S8,001C (SP) JAL 80214488 SW V0,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LUI V1,8022 LW A0,7CD8 (V1) LW T0,0068 (SP) LW V1,0070 (SP) LW V0,911C (S5) ORI A3,A3,8080 SW S8,001C (SP) ADDIU S8,R0,0023 SW S2,0014 (SP) SW S1,0018 (SP) SW R0,0020 (SP) SW S8,0028 (SP) SW S0,002C (SP) SW S1,0030 (SP) SW S3,0034 (SP) ADDU S6,T0,V1 ADDIU S6,S6,FFF0 SW S6,0010 (SP) JAL 80214488 SW V0,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LUI T0,8022 ORI A3,A3,8080 LW A0,7CD8 (T0) LW V1,0068 (SP) LW V0,911C (S5) ADDIU S0,R0,0006 SW S7,0014 (SP) SW S1,0018 (SP) SW S0,001C (SP) SW R0,0020 (SP) SW R0,0028 (SP) SW R0,002C (SP) SW S1,0030 (SP) SW S0,0034 (SP) SW V1,0010 (SP) JAL 80214488 SW V0,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LUI T0,8022 LW A0,7CD8 (T0) LW V0,911C (S5) ORI A3,A3,8080 SW S6,0010 (SP) SW S7,0014 (SP) SW S1,0018 (SP) SW S0,001C (SP) SW R0,0020 (SP) SW S8,0028 (SP) SW R0,002C (SP) SW S1,0030 (SP) SW S0,0034 (SP) JAL 80214488 SW V0,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LUI V1,8022 ORI A3,A3,8080 ADDIU S4,S4,FFF8 ADDIU S0,R0,0007 LW A0,7CD8 (V1) LW T0,0068 (SP) LW V0,911C (S5) ADDIU S2,R0,0004 SW S4,0014 (SP) SW S1,0018 (SP) SW S0,001C (SP) SW R0,0020 (SP) SW R0,0028 (SP) SW S2,002C (SP) SW S1,0030 (SP) SW S0,0034 (SP) SW T0,0010 (SP) JAL 80214488 SW V0,0024 (SP) ADDIU A1,R0,0030 ADDIU A2,R0,0041 LUI A3,0080 LUI V1,8022 LW A0,7CD8 (V1) LW V0,911C (S5) ORI A3,A3,8080 SW S6,0010 (SP) SW S4,0014 (SP) SW S1,0018 (SP) SW S0,001C (SP) SW R0,0020 (SP) SW S8,0028 (SP) SW S2,002C (SP) SW S1,0030 (SP) SW S0,0034 (SP) JAL 80214488 SW V0,0024 (SP) LW T0,0068 (SP) LW A1,0038 (SP) LW V1,0070 (SP) ADDIU V0,R0,0014 SW R0,0010 (SP) SW V0,0014 (SP) SW S1,0018 (SP) ADDU A0,T0,S1 LW T0,0074 (SP) ADDIU A2,V1,FFE2 JAL 8021475C ADDIU A3,T0,FFF9 LW RA,0064 (SP) LW S8,0060 (SP) LW S7,005C (SP) LW S6,0058 (SP) LW S5,0054 (SP) LW S4,0050 (SP) LW S3,004C (SP) LW S2,0048 (SP) LW S1,0044 (SP) LW S0,0040 (SP) JR RA ADDIU SP,SP,0068 802136DC: display string A3 in colour SP+10 centered on line at {A2-A0,A1} accepts: A0=xpos left margin, A1=ypos, A2=xpos right margin, A3=p->string, SP+10=font colour LUI V0,8025 LW V0,9780 (V0) ;V0=80249780: ADDIU SP,SP,FFD8 SW S3,001C (SP) LW S3,0038 (SP) ;S3=SP+38: font colour [SP+10 from caller] SW S4,0020 (SP) ADDU S4,A1,R0 ;S4=A1: ypos SW S1,0014 (SP) ADDU S1,A2,R0 ;S1=A2: margin.r SW S2,0018 (SP) ADDU S2,A3,R0 ;S2=A3: p->string SW RA,0024 (SP) SW S0,0010 (SP) SRL V1,V0,0x1F ;V1=1 if negative ADDU V0,V0,V1 SRA V0,V0,0x1 ;V0/=2 ADDU S0,A0,V0 ;S0=A0+V0: xpos+correction JAL 802141F0 ;V0=strlen(A0) ADDU A0,S2,R0 ;A0=S2: p->string SRA S1,S1,0x1 ;S1/=2: r.margin/2 ADDU S0,S0,S1 ;S0+=S1: xpos+screen centerpoint SLL V0,V0,0x3 ;V0*=8: strlen*8 str.width SRA V0,V0,0x1 ;V0*=4: width/2 centerpoint SUBU S0,S0,V0 ;S0+=V0: xpos + centerpoint ADDU A0,S2,R0 ;A0=S2: p->string LUI V0,8025 LUI S1,8025 SW S4,B2AC (V0) ;S4->8024B2AC: ypos LUI V0,8025 SW S0,B2A8 (S1) ;S0->8024B2A8: xpos for centered text JAL 80212520 ;print string A0 to screen SW S3,9778 (V0) ;S3->80249778: font colour //8021375C: return LW RA,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) SW S0,B2A8 (S1) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80213780: V0=strchr(A0,'/0') accepts: A0=p->string LBU V0,0000 (A0) ;V0=char BEQ V0,R0,8021379C ;return if NULL NOP ADDIU A0,A0,0001 ;A0++ //80213790: find NULL terminator LBU V0,0000 (A0) ;V0=char BNEL V0,R0,80213790 ;loop until end of string ADDIU A0,A0,0001 ;A0++ //8021379C: return end of string JR RA ADDIU V0,A0,0001 ;V0=A0+1: p->end of string 802137A4: SW A3,000C (SP) ADDIU T0,SP,0010 SW A2,0008 (SP) SW A2,0008 (SP) SB R0,0000 (A2) LW A2,FFFC (T0) BLEZ A0,80213818 ADDU A3,R0,R0 ADDIU A1,A1,FFFF LBU V1,0000 (A2) BEQL V1,R0,802137FC ADDIU T0,T0,0004 SLT V0,A3,A1 BEQ V0,R0,802137F8 ADDIU A2,A2,0001 LW V0,0008 (SP) ADDU V0,V0,A3 SB V1,0000 (V0) LBU V1,0000 (A2) BNE V1,R0,802137D4 ADDIU A3,A3,0001 ADDIU T0,T0,0004 LW V0,0008 (SP) ADDIU A0,A0,FFFF ADDU V0,V0,A3 SB R0,0000 (V0) LW A2,FFFC (T0) BGTZ A0,802137C8 ADDIU A3,A3,0001 JR RA NOP 80213820: accepts: A0=xpos, A1=ypos, A2=#characters to offset, A3=#options, SP+10=, SP+14=, SP+18=p->string ADDIU SP,SP,FFC0 SW S3,0024 (SP) ADDU S3,A0,R0 ;S3=A0: xpos ADDIU A0,S3,0015 ;A0+=15: xpos offset SW S1,001C (SP) ADDU S1,R0,R0 ;S1=0 init.count SW S0,0018 (SP) ADDIU S0,A1,0001 ;S0=A1+1: ypos+1 SW S2,0020 (SP) LW S2,0058 (SP) ;S2=[SP+18 f/ caller] ADDU A1,S0,R0 ;A1++ ypos++ SW S8,0038 (SP) LW S8,0054 (SP) ;S8=[SP+14 f/ caller] SLL A2,A2,0x3 ;A2*=8: strlen->pixel offset SW RA,003C (SP) SW S7,0034 (SP) SW S6,0030 (SP) SW S5,002C (SP) SW S4,0028 (SP) SW R0,0010 (SP) ;0->SP+10: colour SW A3,004C (SP) ;SP+4C=A3: #options JAL 802136DC ;display string A3 in colour SP+10 centered on line at {A2-A0,A1} ADDU A3,S2,R0 ;A3=S2: p->string //8021387C: JAL 80213780 ;V0=strchr(A0,'/0') ADDU A0,S2,R0 ;A0=S2: p->string ADDU S2,V0,R0 ;S2=V0: p->end of string LUI V0,8025 LUI A0,8025 LW V0,9780 (V0) ;V0=80249780: LW T0,004C (SP) ;T0=SP+4C: #options ADDIU S0,S0,0011 ;S0+=11: next line SW S0,B2AC (A0) ;S0->8024B2AC: update ypos SRL V1,V0,0x1F ;V1=1 if negative ADDU V0,V0,V1 ;V0+=correction SRA V0,V0,0x1 ;V0/=2 ADDU S3,S3,V0 ;S3+=V0: xpos ADDIU S3,S3,0015 ;S3+=15: xpos + offset LUI V0,8025 BLEZ T0,80213958 ;return if no more options to display SW S3,B2A8 (V0) ;S3->8024B2A8: update xpos LUI S5,8025 LUI S7,003E ORI S7,S7,003E ;S7=003E003E: (0,0,255) LUI S6,001E ORI S6,S6,001E ;S6=001E001E: (0,0,128) ADDU S0,A0,R0 ADDU S4,V0,R0 //802138DC: determine colour and offset for shadow LW T0,0050 (SP) ;T0=[SP+10 f/ caller] BNE T0,S1,8021390C ;if T0=count, set colour black SW R0,9778 (S5) BEQ S8,R0,8021390C ;if SP+14 is 0, use bright blue SW S7,9778 (S5) LW V0,B2AC (S0) ;V0=8024B2AC: ypos LW V1,B2A8 (S4) ;V1=8024B2A8: xpos SW S6,9778 (S5) ;S6->80249778: colour = 50% blue for shadow ADDIU V0,V0,0001 ;V0++ ADDIU V1,V1,0001 ;V1++ SW V0,B2AC (S0) ;update ypos SW V1,B2A8 (S4) ;update xpos //8021390C: print line JAL 80212520 ;print string A0 to screen ADDU A0,S2,R0 ;A0=S2: p->string JAL 80213780 ;V0=strchr(A0,'/0') ADDU A0,S2,R0 ;A0=S2: p->string LW V1,B2AC (S0) ;V1=8024B2AC: ypos LW T0,0050 (SP) ;T0=[SP+10 f/ caller] ADDU S2,V0,R0 ;S2=V0: p->end of string SW S3,B2A8 (S4) ;S3->8024B2A8: update xpos ADDIU V0,V1,000E ;V0=V1+E: ypos+offset BNE T0,S1,80213944 ;if T0=count, don't offset further SW V0,B2AC (S0) ;update ypos BEQ S8,R0,80213944 ;if SP+14 is 0, don't offset further ADDIU V0,V1,000D ;V0=V1+D: ypos+offset SW V0,B2AC (S0) ;update with a shorter offset //80213944: loop for all options LW T0,004C (SP) ;T0=SP+4C: #options ADDIU S1,S1,0001 ;S1++ count++ SLT V0,S1,T0 BNE V0,R0,802138DC ;loop for each option NOP //80213958: return LW RA,003C (SP) LW S8,0038 (SP) LW S7,0034 (SP) LW S6,0030 (SP) LW S5,002C (SP) LW S4,0028 (SP) LW S3,0024 (SP) LW S2,0020 (SP) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0040 80213988: ADDIU SP,SP,FF70 SW S8,0088 (SP) ADDU S8,A0,R0 SW S6,0080 (SP) ADDU S6,A1,R0 SW S5,007C (SP) ADDU S5,A3,R0 ADDIU A0,S8,0004 ADDIU A1,S6,0004 SW A2,0098 (SP) ADDIU A2,A2,FFF8 ADDIU A3,S5,FFF8 SW S0,0068 (SP) LW S0,00A0 (SP) ADDIU V0,R0,0014 SW V0,0014 (SP) ADDIU V0,R0,000E SW RA,008C (SP) SW S7,0084 (SP) SW S4,0078 (SP) SW S3,0074 (SP) SW S2,0070 (SP) SW S1,006C (SP) SW R0,0010 (SP) JAL 8021475C SW V0,0018 (SP) BNE S0,R0,80213C18 ADDIU V1,S8,0003 ADDU A0,V1,R0 ADDU S0,S6,S5 ADDIU A1,S0,FFFC SW V1,0020 (SP) LW V1,0098 (SP) ADDIU A3,R0,0001 ADDIU V1,V1,FFFA ADDU A2,V1,R0 SW V1,0024 (SP) ADDIU V1,R0,0002 JAL 80213300 SW V1,0010 (SP) ADDIU V1,S8,0002 ADDU A0,V1,R0 ADDIU A1,S0,FFFD SW V1,0028 (SP) LW V1,0098 (SP) ADDIU A3,R0,0001 ADDIU V1,V1,FFFC ADDU A2,V1,R0 SW V1,002C (SP) ADDU V1,A3,R0 JAL 80213300 SW V1,0010 (SP) ADDIU S1,S8,0001 ADDU A0,S1,R0 ADDIU A1,S0,FFFE LW V1,0098 (SP) ADDIU A3,R0,0001 ADDIU V1,V1,FFFE ADDU A2,V1,R0 SW V1,0030 (SP) ADDIU V1,R0,0003 JAL 80213300 SW V1,0010 (SP) ADDU A0,S8,R0 ADDIU A1,S0,FFFF ADDIU A3,R0,0001 LW A2,0098 (SP) ADDU V1,A3,R0 JAL 80213300 SW V1,0010 (SP) ADDU A0,S8,R0 ADDU A1,S6,R0 ADDIU A2,R0,0001 ADDU A3,S5,R0 ADDIU V1,R0,0002 JAL 80213300 SW V1,0010 (SP) ADDU A0,S1,R0 ADDIU V1,S6,0001 ADDU A1,V1,R0 ADDIU A2,R0,0001 ADDIU S2,S5,FFFE ADDU A3,S2,R0 SW V1,0034 (SP) ADDU V1,A2,R0 JAL 80213300 SW V1,0010 (SP) ADDIU V1,S6,0002 ADDU A1,V1,R0 ADDIU A2,R0,0001 ADDIU S4,S5,FFFC LW A0,0028 (SP) ADDU A3,S4,R0 SW V1,0038 (SP) ADDIU V1,R0,0003 JAL 80213300 SW V1,0010 (SP) ADDIU V1,S6,0003 ADDU A1,V1,R0 ADDIU A2,R0,0001 ADDIU S7,S5,FFFA LW A0,0020 (SP) ADDU A3,S7,R0 SW V1,003C (SP) ADDU V1,A2,R0 JAL 80213300 SW V1,0010 (SP) ADDU A1,S6,R0 ADDIU A2,R0,0001 LW V1,0098 (SP) ADDU A3,S5,R0 ADDU S0,S8,V1 ADDIU A0,S0,FFFC ADDIU V1,R0,0002 JAL 80213300 SW V1,0010 (SP) ADDIU A0,S0,FFFD ADDIU A2,R0,0001 ADDU A3,S2,R0 LW A1,0034 (SP) ADDU V1,A2,R0 JAL 80213300 SW V1,0010 (SP) ADDIU A0,S0,FFFE ADDIU A2,R0,0001 ADDU A3,S4,R0 LW A1,0038 (SP) ADDIU V1,R0,0003 JAL 80213300 SW V1,0010 (SP) ADDIU A0,S0,FFFF ADDIU A2,R0,0001 ADDU A3,S7,R0 LW A1,003C (SP) ADDU V1,A2,R0 JAL 80213300 SW V1,0010 (SP) ADDU A0,S8,R0 ADDU A1,S6,R0 ADDIU A3,R0,0001 LW A2,0098 (SP) ADDIU V1,R0,0002 JAL 80213300 SW V1,0010 (SP) ADDU A0,S1,R0 ADDIU A3,R0,0001 LW A1,0034 (SP) LW A2,0030 (SP) ADDU V1,A3,R0 JAL 80213300 SW V1,0010 (SP) ADDIU A3,R0,0001 LW A0,0028 (SP) LW A1,0038 (SP) LW A2,002C (SP) ADDIU V1,R0,0003 JAL 80213300 SW V1,0010 (SP) ADDIU A3,R0,0001 LW A0,0020 (SP) LW A1,003C (SP) LW A2,0024 (SP) J 80213E3C ADDU V1,A3,R0 ADDU A0,V1,R0 ADDU S0,S6,S5 ADDIU A1,S0,FFFC SW V1,0040 (SP) LW V1,0098 (SP) ADDIU A3,R0,0001 ADDIU V1,V1,FFFA ADDU A2,V1,R0 SW V1,0044 (SP) ADDIU V1,R0,0009 JAL 80213300 SW V1,0010 (SP) ADDIU V1,S8,0002 ADDU A0,V1,R0 ADDIU A1,S0,FFFD SW V1,0048 (SP) LW V1,0098 (SP) ADDIU A3,R0,0001 ADDIU V1,V1,FFFC ADDU A2,V1,R0 SW V1,004C (SP) ADDIU V1,R0,0008 JAL 80213300 SW V1,0010 (SP) ADDIU V1,S8,0001 ADDU A0,V1,R0 ADDIU A1,S0,FFFE SW V1,0050 (SP) LW V1,0098 (SP) ADDIU A3,R0,0001 ADDIU V1,V1,FFFE ADDU A2,V1,R0 SW V1,0054 (SP) ADDIU V1,R0,0003 JAL 80213300 SW V1,0010 (SP) ADDU A0,S8,R0 ADDIU A1,S0,FFFF ADDIU A3,R0,0001 LW A2,0098 (SP) ADDIU V1,R0,0008 JAL 80213300 SW V1,0010 (SP) ADDU A0,S8,R0 ADDU A1,S6,R0 ADDIU A2,R0,0001 ADDU A3,S5,R0 ADDIU V1,R0,0009 JAL 80213300 SW V1,0010 (SP) ADDIU V1,S6,0001 ADDU A1,V1,R0 ADDIU A2,R0,0001 SW V1,0058 (SP) ADDIU V1,S5,FFFE LW A0,0050 (SP) ADDU A3,V1,R0 SW V1,005C (SP) ADDIU V1,R0,0008 JAL 80213300 SW V1,0010 (SP) ADDIU V1,S6,0002 ADDU A1,V1,R0 ADDIU A2,R0,0001 ADDIU S3,S5,FFFC LW A0,0048 (SP) ADDU A3,S3,R0 SW V1,0060 (SP) ADDIU V1,R0,0003 JAL 80213300 SW V1,0010 (SP) ADDIU V1,S6,0003 ADDU A1,V1,R0 ADDIU A2,R0,0001 ADDIU S7,S5,FFFA LW A0,0040 (SP) ADDU A3,S7,R0 SW V1,0064 (SP) ADDIU V1,R0,0008 JAL 80213300 SW V1,0010 (SP) ADDU A1,S6,R0 ADDIU A2,R0,0001 LW V1,0098 (SP) ADDU A3,S5,R0 ADDU S0,S8,V1 ADDIU A0,S0,FFFC ADDIU V1,R0,0009 JAL 80213300 SW V1,0010 (SP) ADDIU A0,S0,FFFD ADDIU A2,R0,0001 LW A1,0058 (SP) LW A3,005C (SP) ADDIU V1,R0,0008 JAL 80213300 SW V1,0010 (SP) ADDIU A0,S0,FFFE ADDIU A2,R0,0001 ADDU A3,S3,R0 LW A1,0060 (SP) ADDIU V1,R0,0003 JAL 80213300 SW V1,0010 (SP) ADDIU A0,S0,FFFF ADDIU A2,R0,0001 ADDU A3,S7,R0 LW A1,0064 (SP) ADDIU V1,R0,0008 JAL 80213300 SW V1,0010 (SP) ADDU A0,S8,R0 ADDU A1,S6,R0 ADDIU A3,R0,0001 LW A2,0098 (SP) ADDIU V1,R0,0009 JAL 80213300 SW V1,0010 (SP) ADDIU A3,R0,0001 LW A0,0050 (SP) LW A1,0058 (SP) LW A2,0054 (SP) ADDIU V1,R0,0008 JAL 80213300 SW V1,0010 (SP) ADDIU A3,R0,0001 LW A0,0048 (SP) LW A1,0060 (SP) LW A2,004C (SP) ADDIU V1,R0,0003 JAL 80213300 SW V1,0010 (SP) ADDIU A3,R0,0001 LW A0,0040 (SP) LW A1,0064 (SP) LW A2,0044 (SP) ADDIU V1,R0,0008 JAL 80213300 SW V1,0010 (SP) LW RA,008C (SP) LW S8,0088 (SP) LW S7,0084 (SP) LW S6,0080 (SP) LW S5,007C (SP) LW S4,0078 (SP) LW S3,0074 (SP) LW S2,0070 (SP) LW S1,006C (SP) LW S0,0068 (SP) JR RA ADDIU SP,SP,0090 80213E74: I'm stupid. This isn't even used... Some display routine, maybe for a box? accepts: A0=xpos, A1=ypos, A2=p->string, A3=y offset? zero displays in cyan, SP+10=right margin, used for centering ADDIU SP,SP,FFD0 SW S4,0020 (SP) ADDU S4,A0,R0 ;S4=A0: xpos ADDU T0,R0,R0 ;T0=0: black SW S5,0024 (SP) ADDU S5,A2,R0 ;S5=A2: p->string SW S0,0010 (SP) ADDU S0,A3,R0 ;S0=A3: y offset? ADDU A1,A1,S0 ;A1+=A3: ypos+offset? SW S2,0018 (SP) ADDIU S2,A1,FFFF ;S2=A1-1: ypos-1 ADDIU V0,S0,FFF8 SW S3,001C (SP) LUI S3,8022 LW V1,7650 (S3) ;V1=80227650: base x offset LW A0,0040 (SP) ;A0=[SP+10 f/caller]: region for centering ADDU V0,S4,V0 SW RA,0028 (SP) SW S1,0014 (SP) ADDU V0,V0,V1 BNE S0,R0,80213ED4 ;display cyan if !S0 SRA S1,A0,0x1 ;S1=A0/2: centerpoint of region LUI T0,0080 ORI T0,T0,8080 ;T0=00808080: cyan 50% //80213ED4: ADDU A0,V0,R0 ;A0=V0: ADDU A1,S2,R0 ;A1=S2: ypos ADDU A2,S1,R0 ;A2=S1: JAL 80212C00 ;unconditional return ADDU A3,T0,R0 ;A3=T0: colour //80213EE8: JAL 802141F0 ;V0=strlen(A0) ADDU A0,S5,R0 ;A0=S5: p->string ADDU A3,R0,R0 ;A3=0: black SLL V0,V0,0x3 ;V0*=8: string width ADDU V0,S4,V0 ;V0+=S4: width + LW V1,7650 (S3) ;V1=80227650: base x offset ADDU V0,V0,S0 ;V0+=S0: ADDIU A2,S1,0004 ;A2=S1+4: BNE S0,R0,80213F18 ;display in cyan if !S0 ADDU A0,V0,V1 ;A0=V0+V1: LUI A3,0080 ORI A3,A3,8080 ;A3=00808080: cyan 50% //80213F18: JAL 80212C00 ;unconditional return ADDU A1,S2,R0 ;A1=S2: ypos //80213F20: return LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 80213F44: ADDIU SP,SP,FFD0 SW S0,0010 (SP) ADDU S0,A0,R0 SW S5,0024 (SP) ADDU S5,A1,R0 SW S3,001C (SP) ADDU S3,A2,R0 SW S1,0014 (SP) ADDU S1,A3,R0 ADDU A0,S5,R0 SW RA,0028 (SP) SW S4,0020 (SP) JAL 802141F0 ;V0=strlen(A0) SW S2,0018 (SP) SLL V0,V0,0x2 ADDIU V1,R0,00A0 SUBU S2,V1,V0 ADDU S2,S2,S3 ADDU A3,R0,R0 ADDU S0,S0,S3 LUI S4,8022 ADDIU S0,S0,FFFF LW V0,7650 (S4) SRA S1,S1,0x1 ADDIU V0,V0,FFF8 BNE S3,R0,80213FB8 ADDU A0,S2,V0 LUI A3,0080 ORI A3,A3,8080 ADDU A1,S0,R0 JAL 80212C00 ;unconditional return ADDU A2,S1,R0 JAL 802141F0 ;V0=strlen(A0) ADDU A0,S5,R0 ADDU A3,R0,R0 SLL V0,V0,0x3 LW V1,7650 (S4) ADDU V0,S2,V0 ADDIU A2,S1,0004 BNE S3,R0,80213FF0 ADDU A0,V0,V1 LUI A3,0080 ORI A3,A3,8080 JAL 80212C00 ;unconditional return ADDU A1,S0,R0 LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8021401C: ADDIU SP,SP,FFD0 SW S3,001C (SP) ADDU S3,A0,R0 SW S4,0020 (SP) ADDU S4,A1,R0 SW S5,0024 (SP) ADDU S5,A2,R0 SW S1,0014 (SP) ADDIU S1,R0,0003 LUI V0,8022 LW V1,7C10 (V0) ADDIU V0,R0,0001 SW RA,0028 (SP) SW S2,0018 (SP) BNE V1,V0,802141B4 SW S0,0010 (SP) BNE S5,R0,80214100 ADDU S0,V0,R0 LUI S2,5555 ORI S2,S2,5556 JAL 80212B20 ADDU A0,R0,R0 JALR RA,S3 ADDU A0,S0,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP MULT S1,S2 SRA V0,S1,0x1F MFHI A3 SUBU V0,A3,V0 ADDU S0,S0,V0 SLTI V0,S0,0140 BNE V0,R0,8021406C ADDIU S1,S1,0001 ADDIU S1,R0,0003 ADDIU S0,R0,0001 LUI S2,5555 ORI S2,S2,5556 JAL 80212B20 ADDU A0,R0,R0 JALR RA,S4 ADDIU A0,S0,FEC0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP MULT S1,S2 SRA V0,S1,0x1F MFHI A3 SUBU V0,A3,V0 ADDU S0,S0,V0 SLTI V0,S0,0140 BNE V0,R0,802140BC ADDIU S1,S1,0001 ADDIU V0,R0,0001 BNE S5,V0,802141B4 LUI V0,5555 ORI V0,V0,5556 MULT S1,V0 LUI S2,5555 ORI S2,S2,5556 SRA V0,S1,0x1F ADDIU V1,R0,0140 MFHI A3 SUBU V0,A3,V0 SUBU S0,V1,V0 JAL 80212B20 ADDU A0,R0,R0 JALR RA,S3 ADDIU A0,S0,FEC0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP MULT S1,S2 SRA V0,S1,0x1F MFHI A3 SUBU V0,A3,V0 SUBU S0,S0,V0 BGTZ S0,8021412C ADDIU S1,S1,0001 ADDIU S1,R0,0003 ADDIU S0,R0,013F LUI S2,5555 ORI S2,S2,5556 JAL 80212B20 ADDU A0,R0,R0 JALR RA,S4 ADDU A0,S0,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP MULT S1,S2 SRA V0,S1,0x1F MFHI A3 SUBU V0,A3,V0 SUBU S0,S0,V0 BGTZ S0,80214178 ADDIU S1,S1,0001 JALR RA,S4 ADDU A0,R0,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 802141F0: V0=strlen(A0) accepts: A0=p->string J 802141FC ADDU V1,R0,R0 ;V1=0 init.count //802141F8: ADDIU V1,V1,0001 ;V1++ count++ //802141FC: LBU V0,0000 (A0) ;V0=char BNE V0,R0,802141F8 ;loop until end of string ADDIU A0,A0,0001 ;A0++ p->next char JR RA ADDU V0,V1,R0 ;V0=V1: strlen 80214210: SW A1,0004 (SP) SW A2,0008 (SP) SW A3,000C (SP) ADDIU SP,SP,FFE0 SW S1,0014 (SP) LUI S1,8022 LW V0,7CE4 (S1) SW S2,0018 (SP) ADDU S2,A0,R0 SW S0,0010 (SP) ADDU S0,R0,R0 SW RA,001C (SP) BNE V0,R0,80214254 SW A1,0024 (SP) JAL 80215804 ;V0=p->A0 bytes of allocated memory ADDIU A0,R0,0384 ;A0=384 bytes SW V0,7CE4 (S1) ADDIU A1,SP,002C ADDU V1,S1,R0 LW V0,7CE4 (V1) ADDIU A2,R0,0020 SB R0,0000 (V0) LW A0,FFFC (A1) LW V0,7CE4 (V1) ADDU V0,V0,S0 ADDIU S0,S0,0001 SB A2,0000 (V0) SLTI V0,S0,0028 BNE V0,R0,8021426C NOP LW V0,0024 (SP) BLEZ V0,802142DC LUI A2,8022 LBU V1,0000 (A0) BEQL V1,R0,802142C8 ADDIU A1,A1,0004 SLTI V0,S0,0383 BEQ V0,R0,802142C4 ADDIU A0,A0,0001 LW V0,7CE4 (A2) ADDU V0,V0,S0 SB V1,0000 (V0) LBU V1,0000 (A0) BNE V1,R0,802142A0 ADDIU S0,S0,0001 ADDIU A1,A1,0004 LW V0,0024 (SP) LW A0,FFFC (A1) ADDIU V0,V0,FFFF BGTZ V0,80214294 SW V0,0024 (SP) LUI S1,8022 LW V0,7CE4 (S1) LUI A1,8022 ADDU V0,V0,S0 SB R0,0000 (V0) LW A0,7CE4 (S1) JAL 802110C4 ;strcat(A0,A1) ADDIU A1,A1,4430 BNE S2,R0,80214310 LUI V0,8022 SW R0,7CE8 (V0) LUI V0,8022 SW R0,7CEC (V0) LW A0,7CE4 (S1) JAL 802141F0 ;V0=strlen(A0) NOP LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) LUI V1,8025 SW V0,90F4 (V1) JR RA ADDIU SP,SP,0020 8021433C: ADDIU SP,SP,FFB8 ADDIU V0,R0,0001 SW RA,0044 (SP) BNE A0,V0,8021436C SW S0,0040 (SP) LUI A0,8022 LW V1,7CEC (A0) SLTI V0,V1,002A BEQ V0,R0,8021436C ADDIU V0,V1,0001 J 80214380 SW V0,7CEC (A0) LUI V1,8022 LW V0,7CEC (V1) BLEZ V0,80214380 ADDIU V0,V0,FFFF SW V0,7CEC (V1) LUI V0,8022 LW V0,7CEC (V0) SLTI V0,V0,0021 BNE V0,R0,8021439C ADDU A1,R0,R0 J 80214454 ADDIU V0,R0,0001 ADDIU A2,SP,0010 LUI V0,8022 LW V1,7CE8 (V0) LUI A3,8022 SRA S0,V1,0x3 SLL V0,S0,0x3 SUBU T0,V1,V0 ADDU A0,A2,A1 LW V0,7CE4 (A3) ADDU V1,A1,S0 ADDU V0,V0,V1 LBU V0,0000 (V0) ADDIU A1,A1,0001 SB V0,0000 (A0) SLTI V0,A1,0029 BNEL V0,R0,802143BC ADDU A0,A2,A1 LUI V0,8022 LW V1,7CEC (V0) BEQ V1,R0,80214410 SB R0,0039 (SP) SLTI V0,V1,0029 BEQ V0,R0,8021440C ADDIU V0,R0,0029 SUBU V0,V0,V1 ADDU V0,SP,V0 J 80214410 SB R0,0010 (V0) SB R0,0010 (SP) LUI A3,FFFE ORI A3,A3,FFFE ADDIU A0,R0,FFF8 SUBU A0,A0,T0 ADDIU A1,R0,00DA JAL 80210D68 ;print A2 centered on line in colour A3 at {A0,A1} ADDIU A2,SP,0010 LUI A0,8022 LUI V1,8025 LW V0,7CE8 (A0) LW V1,90F4 (V1) ADDIU V0,V0,0001 SLT V1,S0,V1 BNE V1,R0,80214450 SW V0,7CE8 (A0) SW R0,7CE8 (A0) ADDU V0,R0,R0 LW RA,0044 (SP) LW S0,0040 (SP) JR RA ADDIU SP,SP,0048 80214464 likely data ;NOP ;JAL 80210BCC ;NOP 80213370 unconditional return JR RA ADDIU V0,R0,0041 80214478 unconditional return JR RA NOP 80214480 unconditional return JR RA NOP 80214488 accepts: A0=, A1=, A2=, A3=, SP+10=, SP+14=, SP+18=, SP+1C=, SP+20=, SP+24=, SP+28=, SP+2C=, SP+30=, SP+34= ADDIU SP,SP,FFB0 ADDU T3,A1,R0 LW A1,0068 (SP) LW T2,0080 (SP) ADDIU A1,A1,FFFF DIV A1,T2 BNE T2,R0,802144AC NOP BREAK 00001C00 ADDIU AT,R0,FFFF BNE T2,AT,802144C4 LUI AT,8000 BNE A1,AT,802144C4 NOP BREAK 00001800 MFLO A1 LW A2,006C (SP) SW S7,0044 (SP) LW S7,0084 (SP) ADDIU A2,A2,FFFF DIV A2,S7 BNE S7,R0,802144E8 NOP BREAK 00001C00 ADDIU AT,R0,FFFF BNE S7,AT,80214500 LUI AT,8000 BNE A2,AT,80214500 NOP BREAK 00001800 MFLO A2 LW T0,0060 (SP) LUI V0,8025 LW V1,9780 (V0) SW RA,004C (SP) SW S8,0048 (SP) SW S6,0040 (SP) SW S5,003C (SP) SW S4,0038 (SP) SW S3,0034 (SP) SW S2,0030 (SP) SW S1,002C (SP) SW S0,0028 (SP) SRL V0,V1,0x1F ADDU V1,V1,V0 LW V0,007C (SP) SRA V1,V1,0x1 MULT V0,T3 LW V0,0078 (SP) ADDU T0,T0,V1 SLL V0,V0,0x1 ADDU S4,A0,V0 MFLO T1 SLL V0,T1,0x1 ADDU S4,S4,V0 LW T1,0064 (SP) ADDIU S8,A2,0001 BNE A1,R0,802145C0 ADDIU S3,A1,0001 BNE S8,S3,802145C0 LUI A1,DFFF ORI A1,A1,FFFF ADDU A0,S4,R0 ADDU A2,T2,R0 ADDU A3,S7,R0 LUI V0,8025 LW V1,91D8 (V0) SLL V0,T0,0x1 SW T3,0010 (SP) ADDU V1,V1,V0 SLL V0,T1,0x2 ADDU V0,V0,T1 SLL V0,V0,0x8 ADDU S0,V1,V0 JAL 802186E0 AND A1,S0,A1 J 80214664 NOP BLEZ S8,80214664 ADDU S2,R0,R0 SLL T0,T0,0x1 LUI T4,DFFF ORI T4,T4,FFFF SLL S6,T2,0x1 SLL V0,T1,0x2 ADDU S5,V0,T1 SW T0,0018 (SP) SW T4,001C (SP) LUI T4,8025 ADDU S1,R0,R0 LW V1,91D8 (T4) LW T4,0018 (SP) SLL V0,S5,0x8 ADDU V1,V1,T4 LW T4,001C (SP) ADDU S0,V1,V0 BLEZ S3,80214648 AND S0,S0,T4 ADDU A0,S4,R0 ADDU A1,S0,R0 ADDU A2,T2,R0 ADDU A3,S7,R0 SW T3,0010 (SP) SW T2,0020 (SP) JAL 802186E0 SW T3,0024 (SP) ADDIU S1,S1,0001 SLT V0,S1,S3 LW T2,0020 (SP) LW T3,0024 (SP) BNE V0,R0,80214610 ADDU S0,S0,S6 SLL V0,S7,0x2 ADDU V0,V0,S7 ADDU S5,S5,V0 ADDIU S2,S2,0001 SLT V0,S2,S8 BNE V0,R0,802145EC LUI T4,8025 LW RA,004C (SP) LW S8,0048 (SP) LW S7,0044 (SP) LW S6,0040 (SP) LW S5,003C (SP) LW S4,0038 (SP) LW S3,0034 (SP) LW S2,0030 (SP) LW S1,002C (SP) LW S0,0028 (SP) JR RA ADDIU SP,SP,0050 80214694 unconditional return JR RA NOP 8021469C unconditional return JR RA NOP 802146A4 unconditional return JR RA NOP 802146AC SLTI V0,A0,0140 BEQ V0,R0,8021473C ADDIU A0,A0,0080 ADDU T2,R0,R0 LUI T4,8025 SLL V0,A1,0x2 ADDU V0,V0,A1 SLL T3,V0,0x8 ADDU T0,A2,R0 ADDU T1,R0,R0 LW V0,91D8 (T4) SLL V1,A0,0x1 ADDU V0,V0,V1 ADDU A1,V0,T3 ADDU A3,R0,R0 ADDIU V1,A1,0280 LHU V0,0000 (T0) ADDIU T0,T0,0002 ADDIU A3,A3,0001 SH V0,0000 (A1) SH V0,FE00 (V1) SH V0,FE80 (V1) SH V0,FF00 (V1) SH V0,FF80 (V1) SH V0,0000 (V1) ADDIU V1,V1,0002 SLTI V0,A3,0040 BNE V0,R0,802146EC ADDIU A1,A1,0002 ADDIU T1,T1,0001 SLTI V0,T1,0030 BNE V0,R0,802146E4 ADDIU A1,A1,0480 ADDIU T2,T2,0001 BLEZ T2,802146CC ADDIU A0,A0,0040 JR RA NOP 80214744 unconditional return JR RA NOP 8021474C unconditional return JR RA NOP 80214754 unconditional return JR RA NOP 8021475C redirect to 8021FCF0 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8021FCF0 NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80214778 ADDIU SP,SP,FFE8 LBU V1,002B (SP) LBU T2,002F (SP) LBU V0,0033 (SP) SW RA,0010 (SP) SRL V1,V1,0x3 SLL V1,V1,0xB SRL T2,T2,0x3 SLL T2,T2,0x6 OR V1,V1,T2 SRL V0,V0,0x3 SLL V0,V0,0x1 OR V1,V1,V0 ADDU T1,V1,R0 ADDU T0,R0,R0 SLL V0,T0,0x10 SRL T2,T1,0x10 OR V0,V0,T2 SLL V1,T1,0x10 OR V0,T0,V0 OR V1,T1,V1 SLL T2,T1,0x0 ADDU T3,R0,R0 OR V0,V0,T2 OR V1,V1,T3 SLL T0,T1,0x10 ADDU T1,R0,R0 OR V0,V0,T0 OR V1,V1,T1 LUI AT,8025 SW V0,91B8 (AT) LUI AT,8025 SW V1,91BC (AT) JAL 8021F880 ADDIU A0,A0,FFC0 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80214810 unconditional return JR RA NOP 80214818 unconditional return JR RA NOP 80214820 unconditional return JR RA NOP 80214828 ADDIU S1,S1,0001 SLTI V0,S1,0030 LUI V0,8022 LW A0,7D04 (V0) LW V0,0000 (A0) LUI V1,0100 AND V0,V0,V1 BEQ V0,R0,80214860 ADDU V1,A0,R0 LUI A0,0100 LW V0,0000 (V1) AND V0,V0,A0 BNE V0,R0,80214850 NOP LUI V0,8022 LW V1,7CF8 (V0) LUI A0,0400 LW V0,0000 (V1) AND V0,V0,A0 BEQ V0,R0,8021486C NOP JR RA NOP 80214884 LUI V0,8022 LW A0,7CF4 (V0) LW V0,0000 (A0) LUI V1,1000 AND V0,V0,V1 BNE V0,R0,802148B4 ADDU V1,A0,R0 LUI A0,1000 LW V0,0000 (V1) AND V0,V0,A0 BEQ V0,R0,802148A4 NOP JR RA NOP 802148BC ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A0,R0 LUI A0,06C8 LUI A1,8022 LW V1,7CF4 (A1) LUI V0,0300 SW RA,0018 (SP) SW S0,0010 (SP) SW V0,0000 (V1) LW V1,7CF4 (A1) LUI V0,0500 SW V0,0000 (V1) LW V0,7CF4 (A1) ORI A0,A0,0280 SW A0,0000 (V0) ADDIU V0,R0,0001 BNE S1,V0,80214914 LUI V1,0704 LW V0,7CF4 (A1) J 8021491C ORI V1,V1,8030 LW V0,7CF4 (A1) ORI V1,V1,0010 SW V1,0000 (V0) LUI V1,E100 ORI V1,V1,0400 LUI S0,8022 LW V0,7CF0 (S0) LUI A0,E407 SW V1,0000 (V0) LW V1,7CF0 (S0) LUI V0,E300 SW V0,0000 (V1) LW V0,7CF0 (S0) ORI A0,A0,FFFF SW A0,0000 (V0) LW V1,7CF0 (S0) LUI V0,E500 SW V0,0000 (V1) JAL 80214D28 NOP LUI V1,E407 LW V0,7CF0 (S0) ORI V1,V1,FD3F SW V1,0000 (V0) ADDIU V0,R0,0001 BNE S1,V0,80214990 LUI A0,0800 LUI V1,8022 LW V0,7CF4 (V1) J 8021499C ORI A0,A0,0009 LUI V1,8022 LW V0,7CF4 (V1) ORI A0,A0,0001 SW A0,0000 (V0) LW V0,7CF4 (V1) SW A0,0000 (V0) LUI A0,8024 LUI V0,8022 LW V1,7D04 (V0) ADDIU V0,R0,0001 SW V0,EFA0 (A0) LUI V0,8022 SW R0,0000 (V1) LW V1,7D08 (V0) ADDIU V0,R0,0800 SW V0,0000 (V1) LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 802149E4 ADDIU SP,SP,FFE8 SW S0,0010 (SP) LUI S0,8024 LW V0,EFA0 (S0) SW RA,0014 (SP) XORI V0,V0,0001 SW V0,EFA0 (S0) JAL 80214830 NOP LUI A0,0503 ORI A0,A0,C000 LUI V0,8022 LW V1,EFA0 (S0) LW V0,7CF4 (V0) BEQL V1,R0,80214A24 LUI A0,0500 SW A0,0000 (V0) LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80214A38 ADDIU SP,SP,FFD0 SW S3,001C (SP) ADDU S3,A0,R0 SW S2,0018 (SP) ADDU S2,A2,R0 SW S0,0010 (SP) ADDU S0,A3,R0 SW S4,0020 (SP) LW S4,0040 (SP) MULT S2,S0 SW S1,0014 (SP) ADDU S1,A1,R0 SW RA,0028 (SP) SW S5,0024 (SP) MFLO T0 ADDIU V0,T0,0001 SRL V1,V0,0x1F ADDU V0,V0,V1 JAL 80214830 SRA S5,V0,0x1 LUI V1,0400 ORI V1,V1,0002 LUI V0,8022 ADDU A0,R0,R0 LUI A1,8022 SLL S1,S1,0x10 LW V0,7CF4 (V0) OR S1,S1,S3 SW V1,0000 (V0) LW V1,7CF0 (A1) LUI V0,0100 SW V0,0000 (V1) LW V1,7CF0 (A1) LUI V0,A000 SW V0,0000 (V1) LW V0,7CF0 (A1) SLL S0,S0,0x10 SW S1,0000 (V0) LW V0,7CF0 (A1) OR S0,S0,S2 SW S0,0000 (V0) BLEZ S5,80214B04 NOP LW V1,0000 (S4) ADDIU S4,S4,0004 LW V0,7CF0 (A1) ADDIU A0,A0,0001 SW V1,0000 (V0) SLT V0,A0,S5 BNE V0,R0,80214AE4 NOP LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 80214B28 MULT A2,A3 ADDU T2,A0,R0 LW T0,0010 (SP) MFLO T3 ADDIU V0,T3,0001 SRL V1,V0,0x1F ADDU V0,V0,V1 LUI V1,8022 LW A0,7D04 (V1) SRA T1,V0,0x1 LW V0,0000 (A0) LUI V1,0100 AND V0,V0,V1 BEQ V0,R0,80214B78 ADDU V1,A0,R0 LUI A0,0100 LW V0,0000 (V1) AND V0,V0,A0 BNE V0,R0,80214B68 NOP LUI V0,8022 LW V1,7CF8 (V0) LUI A0,0400 LW V0,0000 (V1) AND V0,V0,A0 BEQ V0,R0,80214B84 LUI V0,8022 LW V1,7CF4 (V0) LUI V0,0400 LUI A0,8022 SW V0,0000 (V1) LW V1,7CF0 (A0) LUI V0,0100 SW V0,0000 (V1) LW V1,7CF0 (A0) LUI V0,C000 SW V0,0000 (V1) SLL V0,A1,0x10 LW V1,7CF0 (A0) OR V0,V0,T2 SW V0,0000 (V1) SLL V0,A3,0x10 LW V1,7CF0 (A0) OR V0,V0,A2 SW V0,0000 (V1) LUI V0,8022 LW A0,7CF8 (V0) LW V0,0000 (A0) LUI V1,0800 AND V0,V0,V1 BEQ V0,R0,80214C0C ADDU V1,A0,R0 LUI A0,0800 LW V0,0000 (V1) AND V0,V0,A0 BNE V0,R0,80214BFC NOP BLEZ T1,80214C34 ADDU V1,R0,R0 LUI A0,8022 LW V0,7CF0 (A0) LW V0,0000 (V0) ADDIU V1,V1,0001 SW V0,0000 (T0) SLT V0,V1,T1 BNE V0,R0,80214C18 ADDIU T0,T0,0004 JR RA NOP 80214C3C accepts: A0= LUI V1,0300 ORI V1,V1,0001 LUI V0,8022 LW V0,7CF4 (V0) ;V0=80227CF4: XOR A0,A0,V1 ;A0=A0^03000001: SW A0,0000 (V0) ;A0->V0: update JR RA NOP 80214C5C ADDIU SP,SP,FFD8 SW S3,001C (SP) ADDU S3,A0,R0 SW S1,0014 (SP) ADDU S1,A1,R0 SW S2,0018 (SP) ADDU S2,A2,R0 SW S0,0010 (SP) SW RA,0020 (SP) JAL 80214830 ADDU S0,A3,R0 ADDU A0,R0,R0 LUI V0,8022 LW V1,7CF4 (V0) LUI V0,0400 LUI A1,8022 SLL S1,S1,0x10 OR S1,S1,S3 MULT S2,S0 SLL S0,S0,0x10 SW V0,0000 (V1) LW V1,7CF0 (A1) LUI V0,0100 SW V0,0000 (V1) LW V1,7CF0 (A1) LUI V0,A000 SW V0,0000 (V1) LW V0,7CF0 (A1) OR S0,S0,S2 SW S1,0000 (V0) LW V0,7CF0 (A1) MFLO V1 SW S0,0000 (V0) SRL V0,V1,0x1F ADDU V1,V1,V0 SRA V1,V1,0x1 BLEZ V1,80214D0C NOP LW V0,7CF0 (A1) ADDIU A0,A0,0001 SW R0,0000 (V0) SLT V0,A0,V1 BNE V0,R0,80214CF4 NOP LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80214D28: ADDIU SP,SP,FFE8 LUI V0,8024 LW V0,EFA0 (V0) ADDU A1,R0,R0 BNE V0,R0,80214D44 SW RA,0010 (SP) ADDIU A1,R0,00F0 ADDU A0,R0,R0 ADDIU A2,R0,0140 JAL 80214C5C ADDIU A3,R0,00F0 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80214D60: LUI V0,8024 LW V0,EFA0 (V0) ADDIU SP,SP,FFD8 SW S3,001C (SP) ADDU S3,A0,R0 SW S0,0010 (SP) ADDU S0,A1,R0 SW S2,0018 (SP) ADDU S2,A2,R0 SW S1,0014 (SP) ADDU S1,A3,R0 BNE V0,R0,80214D98 SW RA,0020 (SP) ADDIU S0,S0,00F0 JAL 80214830 NOP LUI V0,8022 LW V1,7CF4 (V0) LUI V0,0400 LUI A1,8022 LUI A0,6800 SW V0,0000 (V1) LW V1,7CF0 (A1) LUI V0,0100 SW V0,0000 (V1) SLL V1,S1,0x8 LW V0,0038 (SP) OR V1,V1,A0 SLL V0,V0,0x10 OR V0,V0,V1 LW V1,7CF0 (A1) OR V0,V0,S2 SW V0,0000 (V1) SLL V0,S0,0x10 LW V1,7CF0 (A1) OR V0,V0,S3 SW V0,0000 (V1) LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80214E10: SLL A2,A2,0xB SLL A3,A3,0x6 OR A2,A2,A3 LUI V1,8025 LW V0,0010 (SP) LW V1,91D8 (V1) SLL V0,V0,0x1 OR A2,A2,V0 SLL V0,A1,0x2 ADDU V0,V0,A1 SLL V0,V0,0x7 ADDU V0,V0,A0 SLL V0,V0,0x1 ADDU V0,V0,V1 JR RA SH A2,0000 (V0) 80214E50: fill A2 pixels in A3 lines of video buffer with SP+10, starting at pixel A0, line A1 accepts: A0=initial hpos, A1=initial line, A2=pixel count, A3=line count, SP+10=fill value LW T3,0010 (SP) ;T3=SP+10: fill value BLEZ A3,80214EB0 ;return if A3 <= 0 ADDU T1,R0,R0 ;T1=0 init. count.line LUI V0,8025 LW T2,91D8 (V0) ;T2=802491D8: p->video buffer //80214E64: BLEZ A2,80214EA0 ;branch if A2 invalid count ADDU T0,R0,R0 ;T0=0 init.count.pixel ADDU V1,A1,T1 ;V1=A1+count.line SLL V0,V1,0x2 ADDU V0,V0,V1 SLL V1,V0,0x7 ;V1=line * 280: line->offset ADDU V0,A0,T0 ;V0=A0+count.pixel //80214E80: loop for each pixel in line ADDU V0,V1,V0 SLL V0,V0,0x1 ;V0=2(pixel + offset.line): offset to specific pixel in line ADDU V0,V0,T2 SH T3,0000 (V0) ;T3->video buffer+offset: set fill value to pixel ADDIU T0,T0,0001 ;T0++ count.pixel++ SLT V0,T0,A2 BNE V0,R0,80214E80 ;loop A2 times ADDU V0,A0,T0 ;V0=A0+count.pixel //80214EA0: loop for each line ADDIU T1,T1,0001 ;T1++ count.line++ SLT V0,T1,A3 BNE V0,R0,80214E64 ;loop A3 times NOP //80214EB0: return JR RA NOP 80214EB8: fill entire video buffer with A0 redirect to 80214E50: A0=0, A1=0, A2=280, A3=F0, SP+10=A0 from caller accepts: A0=fill value ADDIU SP,SP,FFE0 SW A0,0010 (SP) ;SP+10=A0: fill value ADDU A0,R0,R0 ;A0=0: initial pixel ADDU A1,A0,R0 ;A1=A0: 0 initial line ADDIU A2,R0,0280 ;A2=280: #pixels on line SW RA,0018 (SP) JAL 80214E50 ;fill A2 pixels in A3 lines of video buffer with SP+10, starting at pixel A0, line A1 ADDIU A3,R0,00F0 ;A3=F0: #lines LW RA,0018 (SP) JR RA ADDIU SP,SP,0020 80214EE4 wait for next scan to start LUI A0,A440 LW V0,0010 (A0) ;V0=V1 Current Line ADDIU V1,R0,0002 ANDI V0,V0,03FE ;V0=cur.line & 3FE BEQ V0,V1,80214F10 ;branch if on line 2 (just resetted) NOP //80214EFC: LW V0,0010 (A0) ;V0=V1 Current Line ANDI V0,V0,03FE ;V0=cur.line & 3FE BNE V0,V1,80214EFC ;loop until on line 2 (just resetted) NOP ADDIU V1,R0,0002 //80214F10: LW V0,0010 (A0) ;V0=V1 Current Line ANDI V0,V0,03FE ;V0=cur.line & 3FE BEQ V0,V1,80214F10 ;loop until cur.line moves onward NOP JR RA NOP 80214F28: A0->VI buffer address LUI V0,A440 SW A0,0004 (V0) ;A0->VI dram source address JR RA NOP 80214F38: set VI buffer at next scan, then swap video buffers ADDIU SP,SP,FFE8 SW RA,0014 (SP) JAL 80214EE4 ;wait for next VI scan to start SW S0,0010 (SP) LUI S0,8025 LUI V0,8025 LW V1,91D8 (S0) ;V1=802491D8: p->video buffer LW A0,9780 (V0) ;A0=80249780: JAL 80214F28 ;A0->VI buffer address ADDU A0,V1,A0 //80214F60: 'ol switcheroo LUI V0,8025 LW A0,B2A4 (V0) ;A0=8024B2A4: p->alt video buffer LW V1,91D8 (S0) ;V1=802491D8: p->video buffer LW RA,0014 (SP) SW A0,91D8 (S0) ;A0->802491D8: set p->video buffer to alt video buffer LW S0,0010 (SP) SW V1,B2A4 (V0) ;V1->8024B2A4: set p->alt video buffer to video buffer JR RA ADDIU SP,SP,0018 80214F84: set VI buffer, then swap video buffers ADDIU SP,SP,FFE8 SW S0,0010 (SP) LUI S0,8025 LUI V0,8025 LW V1,91D8 (S0) ;V1=802491D8: p->video buffer LW A0,9780 (V0) ;A0=80249780: SW RA,0014 (SP) JAL 80214F28 ;A0->VI buffer address ADDU A0,V1,A0 //80214FA8: 'ol switcheroo LUI V0,8025 LW A0,B2A4 (V0) ;A0=8024B2A4: p->alt video buffer LW V1,91D8 (S0) ;V1=802491D8: p->video buffer LW RA,0014 (SP) SW A0,91D8 (S0) ;A0->802491D8: set p->video buffer to alt video buffer LW S0,0010 (SP) SW V1,B2A4 (V0) ;V1->8024B2A4: set p->alt video buffer to video buffer JR RA ADDIU SP,SP,0018 80214FCC: print char A0 in-sequence to screen A0=char ADDIU SP,SP,FFE8 ADDU A2,A0,R0 ;A2=A0: char ADDIU V0,A2,FF80 ;V0=char-80 SLTIU V0,V0,0004 ;TRUE if 80-83: special characters SW RA,0014 (SP) BEQ V0,R0,80214FEC ;branch if normal character SW S0,0010 (SP) ADDIU A2,A2,0021 ;A2+=21: A1,A2,A3,A4; arrow.right, arrow.left, arrow.down, arrow.up //80214FEC: outsource printing the character LUI S0,8025 LUI V0,8025 LUI V1,8025 LW A0,B2A8 (S0) ;A0=8024B2A8: xpos LW A1,B2AC (V0) ;A1=8024B2AC: ypos LW A3,9778 (V1) ;A3=80249778: font colour ADDIU A0,A0,0040 ;A0+=40: offset xpos JAL 8021F460 ;print A2 in colour A3 to screen at {A0,A1} ADDIU A1,A1,0020 ;A1+=20: offset ypos //80215010: offset the x position LW V0,B2A8 (S0) ;V0=8024B2A8: xpos LW RA,0014 (SP) ADDIU V0,V0,0008 ;V0+=8: fixed-width 8px font... SW V0,B2A8 (S0) ;update xpos LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 8021502C: print string A0 in-sequence to screen accepts: A0=p->string ADDIU SP,SP,FFD8 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: p->string SW RA,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW S1,0014 (SP) LBU V0,0000 (S0) ;V0=char BEQ V0,R0,802150B8 ;return if NULL char LUI S1,8025 LUI S3,8025 LUI S2,8025 //8021505C: detect if writing off-screen (TV) LW A0,B2A8 (S1) ;A0=8024B2A8: xpos SLTI V0,A0,0039 BNEL V0,R0,80215094 ;skip displaying if within 0x38 bytes of margin. This would be off-screen ADDIU S0,S0,0001 LBU A2,0000 (S0) ;A2=char //80215070: detect and correct for arrows ADDIU V0,A2,FF80 ;V0=char-80 SLTIU V0,V0,0004 BEQ V0,R0,80215084 ;branch if not a special character ADDIU S0,S0,0001 ;S0++ p->next char in string ADDIU A2,A2,0021 ;A2+=21: A1,A2,A3,A4; arrow.right, arrow.left, arrow.down, arrow.up //80215084: print char to screen LW A1,B2AC (S3) ;A1=8024B2AC: ypos LW A3,9778 (S2) ;A3=80249778: font colour JAL 8021F460 ;print A2 in colour A3 to screen at {A0,A1} NOP //80215094: update xpos LW V0,B2A8 (S1) ;V0=8024B2A8: xpos ADDIU V0,V0,0008 ;V0+=8: fixed-width 8px font... SW V0,B2A8 (S1) ;update xpos //802150A0: loop until NULL or off-screen SLTI V0,V0,0180 BEQ V0,R0,802150B8 ;return if outside right margin: xpos > 180 NOP LBU V0,0000 (S0) ;V0=char BNE V0,R0,8021505C ;loop until NULL detected NOP //802150B8: return LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 802150D4: print text character for nibble A0 to string ADDIU SP,SP,FFE8 ANDI A0,A0,000F ;A0->nibble SLTI V0,A0,000A ;TRUE if A0<10: detect if alphabetical text correction necessary BNE V0,R0,802150F0 ;branch if numeric SW RA,0010 (SP) J 802150F4 ADDIU A0,A0,0037 ;A0+=37: '7'+numeral, which will return 'A'-'F' for 0xA-0xF //802150F0: numeral->text ADDIU A0,A0,0030 ;A0+=30: '0'+numeral //802150F4: JAL 80214FCC NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80215108: print byte A0 to string accepts: A0=value ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: value SW RA,0014 (SP) JAL 802150D4 SRA A0,S0,0x4 ;A0=upper nibble of byte JAL 802150D4 ADDU A0,S0,R0 ;A0=S0: value LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80215138: ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,0014 (SP) JAL 80215108 SRA A0,S0,0x8 JAL 80215108 ADDU A0,S0,R0 LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80215168: ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,0014 (SP) JAL 80215138 SRA A0,S0,0x10 JAL 80215138 ADDU A0,S0,R0 LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80215198 V0=long A0 to string, using base A1 accepts: A0=value, A1=base, A2=output mode (0:unsigned, 1:signed) ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: value SW S1,0014 (SP) ADDU S1,A1,R0 ;S1=A1: base LUI V0,8022 SW S2,0018 (SP) ADDIU S2,V0,4440 ;S2=80224440: p->hexadecimal character list //802151B8: handle signed, negative numbers BGEZ S0,802151D4 ;branch if positive value SW RA,001C (SP) BEQ A2,R0,802151D4 ;branch if unsigned values NOP JAL 80214FCC ADDIU A0,R0,002D ;A0=2D: '-' SUBU S0,R0,S0 ;S0=0-S0: invert number to refrain from constantly printing negatives //802151D4: DIVU S0,S1 BNE S1,R0,802151E4 ;detect division by zero NOP BREAK 00001C00 //802151E4: re-enter function to handle remaining values MFLO A0 ;A0=value % base MFHI S0 ;S0=value / base BEQ A0,R0,802151FC ;branch if nothing remains ADDU A1,S1,R0 ;A1=S1: base JAL 80215198 ;V0=ltoa(A0,A1,A2) ADDU A2,R0,R0 ;A2=0 unsigned //802151FC: ADDU V0,S2,S0 ;V0=string+offset LBU A0,0000 (V0) ;A0=alpha-numeric value to display JAL 80214FCC NOP //8021520C: return LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80215224 print formatted string A0 in predetermined colour to screen; accepts arguments A1,A2,A3,SP+10, etc. accepts: A0=p->string, A1=argument1...SP+n*4=argument n SW A0,0000 (SP) ;SP+0=A0: p->string SW A1,0004 (SP) ;SP+4=A1: argument1 SW A2,0008 (SP) ;SP+8=A2: argument2 SW A3,000C (SP) ;SP+C=A3: argument3 ADDIU SP,SP,FFD8 SW S1,0014 (SP) ADDU S1,R0,R0 ;S1=0 init.count SW RA,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW S0,0010 (SP) SW A0,0028 (SP) ;SP+28=A0: p->string, as above //80215254: LBU V0,0000 (A0) ;V0=char f/ string BEQ V0,R0,80215450 ;quit if NULL ADDIU S0,SP,002C ;S0=SP+2C: p->arguments LUI V0,8022 ADDIU S3,V0,4458 ;S3=80224458: table of format handlers LUI S2,8025 //8021526C: LW V1,0028 (SP) ;V1=p->string LBU A0,0000 (V1) ;A0=char ADDIU V0,R0,0025 ;V0=25: '%' BNE A0,V0,8021540C ;branch if normal character ADDIU V0,R0,000A ;V0=A: '\n' ADDIU V0,V1,0001 ;V0=string+1 SW V0,0028 (SP) ;SP+28=V0: p->next char LBU V0,0001 (V1) ;V0=next char ADDIU V1,V0,FFDB ;V1=char-25 SLTIU V0,V1,0054 ;TRUE if between characters 25-79 BEQ V0,R0,80215404 ;skip if not a known format SLL V0,V1,0x2 ADDU V0,V0,S3 LW V0,0000 (V0) ;V0=80224458+offset: p->handler for specific format type JR V0 NOP //802152AC: 32 '2' ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument JAL 80215108 ADDIU S1,S1,0001 ;S1++ count++ J 80215438 NOP //802152C4: 34 '4' ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument JAL 80215138 ADDIU S1,S1,0001 ;S1++ count++ J 80215438 NOP //802152DC: 38 '8' ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument JAL 80215168 ADDIU S1,S1,0001 ;S1++ count++ J 80215438 NOP //802152F4: 63 'c' ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument JAL 80214FCC ADDIU S1,S1,0001 ;S1++ count++ J 80215438 NOP //8021530C: 75 'u' ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument J 802153DC ADDIU A1,R0,000A ;A1=0xA (10) base=decimal //8021531C: 6F 'o' ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument J 802153DC ADDIU A1,R0,0008 ;A1=8 base=octal //8021532C: 73 's' ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument JAL 8021502C ;print string A0 to screen ADDIU S1,S1,0001 ;S1++ count++ J 80215438 NOP //80215344: 6C 'l' LW V0,0028 (SP) ;V0=SP+28: p->string ADDIU V1,V0,0001 ;V1=V0+1: p->next char in string SW V1,0028 (SP) ;V1->SP+28: update p->string LBU V1,0001 (V0) ;V1=char ADDIU V0,R0,006F ;V0=6F: 'o' BEQ V1,V0,802153C0 ;branch if "lo"--handle as octal int SLTI V0,V1,0070 ;TRUE if 'o' or less BEQ V0,R0,80215378 ;branch if unsigned or hex ADDIU V0,R0,0064 ;V0=64: 'd' BEQL V1,V0,80215398 ;branch if "ld"--handle as decimal int ADDIU S0,S0,0004 ;S0+=4: p->next argument J 80215438 ADDIU S1,S1,0001 ;S1++ count++ //80215378: more 'l' options ADDIU V0,R0,0075 ;V0=75: 'u' BEQ V1,V0,802153B0 ;branch if "lu"--handle as unsigned int ADDIU V0,R0,0078 ;V0=78: 'x' BEQL V1,V0,802153D4 ;branch if "lx"--handle as hexadecimal ADDIU S0,S0,0004 ;S0+=4: p->next argument J 80215438 ADDIU S1,S1,0001 ;S1++ count++ //80215394: 64 'd' signed decimal int ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument ADDIU A1,R0,000A ;A1=0xA (10) base=decimal JAL 80215198 ;V0=ltoa(A0,A1,A2) ADDIU A2,R0,0001 ;A1=1: signed J 80215438 ADDIU S1,S1,0001 ;S1++ count++ //802153B0: treat argument as unsigned decimal value ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument J 802153DC ADDIU A1,R0,000A ;A1=0xA (10) base=decimal //802153C0: treat argument as octal value ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument J 802153DC ADDIU A1,R0,0008 ;A1=8 base=octal //802153D0: 78 'x' hexadecimal value ADDIU S0,S0,0004 ;S0+=4: p->next argument LW A0,FFFC (S0) ;A0=argument ADDIU A1,R0,0010 ;A1=0x10 (16) base=hexadecimal //802153DC: general unsigned int JAL 80215198 ;V0=ltoa(A0,A1,A2) ADDU A2,R0,R0 ;A2=0 unsigned J 80215438 ADDIU S1,S1,0001 ;S1++ count++ //802153EC: 25 '%' print percentage character LW V0,0028 (SP) ;V0=SP+28: string LBU A0,0000 (V0) ;A0=char JAL 80214FCC ADDIU S1,S1,0001 ;S1++ count++ J 80215438 NOP //80215404: return INVALID J 80215454 ADDIU V0,R0,FFFF ;V0=-1 //8021540C: detect newlines BNE A0,V0,8021542C ;branch if not newline LUI A0,8025 LW V1,B2AC (S2) ;V1=8024B2AC: ypos ADDIU V0,R0,0010 SW V0,B2A8 (A0) ;10->8024B2A8: xpos ADDIU V1,V1,0008 ;V1+=8 J 80215438 SW V1,B2AC (S2) ;update ypos //8021542C: print normal characters LBU A0,0000 (V1) ;A0=char JAL 80214FCC NOP //80215438: loop until NULL terminator LW V0,0028 (SP) ;V0=SP+28: p->string ADDIU V1,V0,0001 ;V1=V0+1: p->next char in string SW V1,0028 (SP) ;V1->SP+28: update p->string LBU V0,0001 (V0) ;V0=char BNE V0,R0,8021526C ;loop until end of string NOP ADDU V0,S1,R0 ;V0=S1: count //80215454: return LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80215470: ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A0,R0 ADDU A0,R0,R0 ;A0=0: blank video buffer LUI V1,8025 ADDIU V0,R0,0080 SW S2,0018 (SP) LUI S2,8025 SW V0,9780 (V1) LUI V0,A030 SW S0,0010 (SP) LUI S0,8025 SW RA,001C (SP) SW V0,B2A4 (S2) JAL 80214EB8 ;fill entire video buffer with value A0 SW V0,91D8 (S0) ;A0300000->802491D8: set p->video buffer LUI V0,A034 ORI V0,V0,B000 ;V0=A034B000 ADDU A0,R0,R0 ;A0=0 blank video buffer JAL 80214EB8 ;fill entire video buffer with value A0 SW V0,91D8 (S0) ;A034B000->802491D8: set p->video buffer BNE S1,R0,80215540 LUI T2,A440 LUI V1,0001 ORI V1,V1,3002 LUI A0,03E5 ORI A0,A0,2239 LUI T0,0C15 ORI T0,T0,0C15 LUI A3,006C ORI A3,A3,02EC LUI A2,0025 ORI A2,A2,01FF LUI A1,000E LW V0,B2A4 (S2) ORI A1,A1,0204 SW V1,0000 (T2) SW V0,0004 (T2) ADDIU V0,R0,0280 SW V0,0008 (T2) ADDIU V0,R0,020D SW A0,0014 (T2) SW V0,0018 (T2) ADDIU V0,R0,0C15 SW V0,001C (T2) ADDIU V0,R0,0200 SW T0,0020 (T2) SW A3,0024 (T2) SW A2,0028 (T2) SW A1,002C (T2) J 802155AC NOP LUI A3,0454 ORI A3,A3,1E3A LUI T1,0017 ORI T1,T1,0C69 LUI T0,0C6F ORI T0,T0,0C6D LUI A2,0080 ORI A2,A2,0300 LUI A1,005F ORI A1,A1,0239 LUI A0,0009 ORI A0,A0,026B LW V1,B2A4 (S2) ADDIU V0,R0,3202 SW V0,0000 (T2) ADDIU V0,R0,0280 SW V1,0004 (T2) SW V0,0008 (T2) ADDIU V0,R0,0271 SW A3,0014 (T2) SW V0,0018 (T2) ADDIU V0,R0,0200 SW T1,001C (T2) SW T0,0020 (T2) SW A2,0024 (T2) SW A1,0028 (T2) SW A0,002C (T2) SW V0,0030 (T2) ADDIU V0,R0,0400 SW V0,0034 (T2) LUI A0,FFFE ORI A0,A0,FFFE LUI V1,8025 ADDIU V0,R0,0010 SW V0,B2A8 (V1) LUI V0,8025 SW R0,B2AC (V0) LUI V0,8025 SW A0,9778 (V0) LUI V0,8024 LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) LUI V1,8025 SW R0,2C8C (V0) ADDIU V0,R0,0001 SW V0,90FC (V1) JR RA ADDIU SP,SP,0020 80215608 byteswap pixels in image A0 accepts: A0=p->image, A1=width, A2=height, A3=unused MULT A1,A2 MFLO A1 ;A1=width*height: size BLEZ A1,80215644 ;return if strange size ADDU A2,R0,R0 ;A2=0 init.count //80215618: LHU V0,0000 (A0) ;V0=pixel ADDIU A2,A2,0001 ;A2++ count++ SRL V1,V0,0x8 ;V1=V0/1000: pixel.hi ANDI V0,V0,00FF ;V0&=FF: pixel.lo SLL V0,V0,0x8 ;V0*=100: pixel.lo->hi OR V1,V1,V0 ;V1=pixel byteswapped SLL V1,V1,0x1 ;V1*=2: acount for alpha SH V1,0000 (A0) ;update pixel SLT V0,A2,A1 BNE V0,R0,80215618 ;loop for image ADDIU A0,A0,0002 ;A0+=2: next pixel //80215644: return JR RA NOP 8021564C MULT A1,A2 MFLO V0 BLEZ V0,80215684 ADDU T0,R0,R0 ADDIU T2,R0,0002 ADDU T1,V0,R0 ADDU V1,A0,R0 LH V0,0000 (V1) BEQL V0,R0,80215674 SH T2,0000 (V1) ADDIU T0,T0,0001 SLT V0,T0,T1 BNE V0,R0,80215668 ADDIU V1,V1,0002 MULT A1,A2 MFLO A1 BLEZ A1,802156B8 ADDU T0,R0,R0 SLL V0,A3,0x10 SRA V1,V0,0x10 LH V0,0000 (A0) BEQL V0,V1,802156A8 SH R0,0000 (A0) ADDIU T0,T0,0001 SLT V0,T0,A1 BNE V0,R0,8021569C ADDIU A0,A0,0002 JR RA NOP 802156C0: LUI V0,A440 LW V1,0010 (V0) LUI V0,8025 JR RA SW V1,9AC0 (V0) 802156D4: LUI V0,8025 SW A0,B2A8 (V0) LUI V0,8025 JR RA SW A1,B2AC (V0) 802156E8: LW A0,7E28 (V1) LW T0,0068 (SP) BEQ A2,R0,80215710 NOP LBU V0,0000 (A1) ADDIU A1,A1,0001 ADDIU A2,A2,FFFF SB V0,0000 (A0) BNE A2,R0,802156F8 ADDIU A0,A0,0001 JR RA NOP 80215718 ADDU T0,A0,R0 BLEZ A2,80215750 ADDU A3,R0,R0 ADDU V0,T0,A3 ADDU V1,A1,A3 LBU A0,0000 (V0) LBU V0,0000 (V1) BEQ A0,V0,80215744 ADDIU A3,A3,0001 JR RA ADDIU V0,R0,FFFF SLT V0,A3,A2 BNE V0,R0,80215728 ADDU V0,T0,A3 JR RA ADDU V0,R0,R0 80215758 V0=memset(A0,A1,A2) accepts: A0=p->target, A1=fill value, A2=count ADDU A3,A0,R0 ;A3=A0: p->??? BLEZ A2,80215778 ADDU V1,R0,R0 ;V1=0 init.count //80215764: fill array SB A1,0000 (A3) ;A1->target+offset ADDIU V1,V1,0001 ;V1++ count++ SLT V0,V1,A2 BNE V0,R0,80215764 ;loop for count ADDIU A3,A3,0001 ;A3++ target++ //80215778: return JR RA ADDU V0,A0,R0 ;V0=A0: p->target 80215780 V0=A0+4: p->next entry accepts: A0=p->DM.entry LW V0,0004 (A0) JR RA NOP 8021578C V0=A0+8: p->data accepts: A0=p->DM.entry LW V0,0008 (A0) JR RA NOP 80215798 set up dynamic memory table spanning from A0 to A1 accepts: A0=p->header for mem. A1=p->end of memory chunk ADDIU A0,A0,000F ADDIU A1,A1,000F ADDIU V0,R0,FFF0 AND A0,A0,V0 ;A0 rounded up to quadword AND A1,A1,V0 ;A1 rounded up to quadword LUI V0,8024 ADDIU A3,R0,0044 ;A3=44: 'D': dynamic ADDIU A2,R0,004D ;A2=4D: 'M': memory SW A0,EFB0 (V0) ;A0->8023EFB0: ADDIU V0,R0,0046 ;V0=46: 'F': final ADDIU V1,A1,FFF0 ;V1=A1-10: V1=p->memory header entry for end of block SB V0,0002 (A0) ;'F'->A0+2: set as final block SUBU V0,A1,A0 ;V0=A1-A0: total size of block ADDIU V0,V0,FFE0 ;V0-=20: size accounting for two headers SW V0,000C (A0) ;V0->A0+C: size of block ADDIU V0,R0,0054 ;V0=54: 'T': terminator SB A3,0000 (A0) ;'D'->A0+0 SB A2,0001 (A0) ;'M'->A0+1 SW V1,0004 (A0) ;V1->A0+4: p->next entry SW R0,0008 (A0) ;0->A0+8: p->previous entry SB A3,FFF0 (A1) ;'D'->V1+0 SB A2,0001 (V1) ;'M'->V1+1 SB V0,0002 (V1) ;'T'->V1+2 SW R0,0004 (V1) ;0->V1+4: p->next entry SW A0,0008 (V1) ;A0->V1+8: p->previous entry JR RA SW R0,000C (V1) ;0->V1+C: size of block 80215804 add allocated memory entry to table; V0=p->allocated mem accepts: A0=size LUI V0,8024 LW A1,EFB0 (V0) ;A1=8023EFB0: p->memory allocation entry table ADDIU A2,A0,000F ;A2=size+F ADDIU V0,R0,FFF0 AND A2,A2,V0 ;A2=size rounded up to nearest quadword BNE A2,R0,80215828 ;continue if size valid ADDIU A0,R0,0054 ;A0=54: 'T': code for terminating entry //80215820: return FALSE JR RA ADDU V0,R0,R0 //80215828: find the final entry in list ADDIU V1,R0,0046 ;V1=46: 'F': code for final entry LBU V0,0002 (A1) ;V0=A1+2: entry type BEQ V0,A0,80215820 ;FAIL if V0 = 'T': terminator NOP BNE V0,V1,80215850 ;branch if V0 isn't 'F' NOP LW V0,000C (A1) ;V0=A1+C: entry size SLT V0,A2,V0 ;TRUE if total size < entry size BNEL V0,R0,8021585C ;branch if finished reading input ADDU A0,A1,A2 ;A0=p->target+size: p->end of data //80215850: loop and test next word in input LW A1,0004 (A1) ;A1=A1+4: p->next entry J 8021582C ;loopus NOP //8021585C: generate a new entry ADDIU V0,R0,0044 ;V0=44: 'D' SB V0,0010 (A0) ;'D'->A0+10: set header[0] ADDIU A0,A0,0010 ;A0+=10: ADDIU V0,R0,004D ;V0=4D: 'M' SB V0,0001 (A0) ;'M'->A0+1: set header[1] ADDIU V0,R0,0046 ;V0=46: 'F' SB V0,0002 (A0) ;'F'->A0+2: set header[2] SW A1,0008 (A0) ;A1->A0+8: header[8] = p->entry LW V0,0004 (A1) ;V0=entry+4: p->previous entry SW V0,0004 (A0) ;V0->A0+4: header[4] = p->previous entry LW V1,000C (A1) ;V1=entry+C: size ADDIU V0,A1,0010 ;V0=p->entry+10 SUBU V1,V1,A2 ;entry size-=total size ADDIU V1,V1,FFF0 ;V1-=10 SW V1,000C (A0) ;V1->A0+C: set header[C] = size ADDIU V1,R0,0052 ;V1=52: 'R' SB V1,0002 (A1) ;'R'->A1+2: set previous entry's header to "DMR" SW A2,000C (A1) ;size->entry+C JR RA SW A0,0004 (A1) ;p->next -> entry+4 802158AC either fills in header or frees given entry... accepts: A0=p->allocated data (not header!) BNE A0,R0,802158BC ;branch if pointer ADDIU V0,R0,0044 ;V0=44: 'D' //802158B4: return FAILED! JR RA ADDIU V0,R0,FFFF ;V0=-1 //802158BC: LBU V1,FFF0 (A0) ;V1=data-10: header[0] BNE V1,V0,802158B4 ;return FAILED if not 'D' ADDIU A1,A0,FFF0 ;A1=data-10: p->header LBU V1,0001 (A1) ;V1=header[1] ADDIU V0,R0,004D ;V0=4D: 'M' BNE V1,V0,802158B4 ;return FAILED if not 'M' ADDIU V0,R0,0052 ;V0=52: 'R' LBU V1,0002 (A1) ;V1=header[2]: type BNE V1,V0,802158B4 ;return FAILED if not 'R' ADDIU V0,R0,0046 ;V0=46: 'F' SB V0,0002 (A1) ;V0->header[2]: set as final entry ADDIU V1,R0,0046 ;V1=46: 'F' ADDU A0,A1,R0 ;A0=A1: p->header //802158F0: find final entry LW A1,0008 (A1) ;A1=header[8]: p->next entry BEQ A1,R0,80215908 ;branch if no entries follow NOP LBU V0,0002 (A1) ;V0=next.header[2]: type BEQL V0,V1,802158F0 ;loop if reads 'F' ADDU A0,A1,R0 ;A0=A1: p->next.header //80215908: ~ final entry if it doesn't read 'F' LBU V1,0002 (A0) ;V1=cur.header[2]: type ADDIU V0,R0,0046 ;V0=46: 'F' BNE V1,V0,80215934 ;branch if not 'F' ADDU A1,A0,R0 ;A1=A0: p->cur.header ADDIU A2,R0,007E ;A2=7E: '~' ADDU V1,V0,R0 ;V1=V0: 'F' SB A2,0002 (A1) ;set type as '~' //80215924: backtrack and make all 'F' entries '~' LW A1,0004 (A1) ;A1=p->prev.header LBU V0,0002 (A1) ;V0=prev.header[2]: type BEQL V0,V1,80215924 ;loop if 'F' SB A2,0002 (A1) ;set type as '~' //80215934: update size, previous, next entry markers ADDIU V0,R0,0001 ;V0=1 SUBU V1,A1,A0 ;V1=next-prev ADDIU V1,V1,FFF0 ;V1-=10: account for header SW V1,000C (A0) ;V1->header+C: size ADDIU V1,R0,0046 ;V1=46: 'F' SW A1,0004 (A0) ;A1->header+4: p->prev. SB V1,0002 (A0) ;'F'->header[2]: type JR RA SW A0,0008 (A1) ;A0->prev.header+8: p->next 80215958 send and recieve controller status SW S4,0028 (SP) SW R0,0010 (SP) ADDIU SP,SP,FFE8 LUI V0,8024 ADDIU V0,V0,EFC0 ;V0=8023EFC0: PIF buffer ADDIU V0,V0,000F ADDIU V1,R0,FFF0 AND V0,V0,V1 ;V0=PIF buffer rounded up to quadword LUI V1,FDFD ORI V1,V1,FDFD ;V1=FDFDFDFD LUI A1,FDFD SW S0,0010 (SP) LUI S0,8025 SW RA,0014 (SP) SW V0,910C (S0) ;V0->8024910C: p->PIF buffer SW V1,0000 (V0) ;FDFDFDFD -> PIF buffer+4 LW A0,910C (S0) ;A0=8024910C: p->PIF buffer ORI A1,A1,FE00 JAL 80218598 ;cache target SW A1,0004 (A0) ;FDFDFE00 -> PIF buffer+4 first word LW A0,910C (S0) ;A0=8024910C: p->PIF buffer JAL 80218598 ;cache target ADDIU A0,A0,0004 ;A0+=4: PIF buffer+4 second word LW A0,910C (S0) ;A0=8024910C: p->PIF buffer JAL 80218598 ;cache target ADDIU A0,A0,003C ;A0+=3C: PIF buffer+3C final trigger word LW A0,910C (S0) ;A0=8024910C: p->raw controller data JAL 80215C48 ;send SI write request to PIFram NOP ADDU V1,R0,R0 ;V1=0 init.count ORI A0,R0,80E7 ;A0=0x80E7 33000 ADDIU V1,V1,0001 ;V1++ count++ //802159D8: loop for an fashionable delay SLT V0,A0,V1 BEQ V0,R0,802159D8 ;loop 33000 times... ADDIU V1,V1,0001 //802159E4: read the data back after you "think" it may be processed LUI V0,8025 LW A0,910C (V0) ;A0=8024910C: p->PIF buffer JAL 80215C8C ;send SI read request to PIFram NOP ADDU V1,R0,R0 ;V1=0 init.count ORI A0,R0,80E7 ;A0=0x80E7 33000 ADDIU V1,V1,0001 ;V1++ count++ //80215A00: loop for an fashionable delay SLT V0,A0,V1 BEQL V0,R0,80215A00 ;loop 33000 times... ADDIU V1,V1,0001 ;V1++ count++ //80215A0C: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80215A1C V0=button and stick pos for controller 1 ADDIU SP,SP,FFE8 LUI V1,FF01 SW S0,0010 (SP) LUI S0,8025 LW V0,910C (S0) ;V0=8024910C: p->PIF buffer ORI V1,V1,0401 ;V1=FF010401: PIF controller 1 read SW RA,0014 (SP) SW V1,0000 (V0) ;save to PIF buffer LW A0,910C (S0) ;A0=8024910C: p->PIF buffer LUI V0,FE00 ;V0=FE000000: end commands SW V0,0008 (A0) ;save to PIF buffer ADDIU V0,R0,0001 JAL 80218598 ;cache target SW V0,003C (A0) ;1->PIF buffer+3F: process commands LW A0,910C (S0) ;A0=8024910C: p->PIF buffer JAL 80218598 ;cache target ADDIU A0,A0,0004 ;A0+=4: cache second word LW A0,910C (S0) ;A0=8024910C: p->PIF buffer JAL 80218598 ;cache target ADDIU A0,A0,0008 ;A0+=8: cache third word LW A0,910C (S0) ;A0=8024910C: p->PIF buffer JAL 80218598 ;cache target ADDIU A0,A0,003C ;A0+=3C: cache final word LW A0,910C (S0) ;A0=8024910C: p->PIF buffer JAL 80215C48 ;send SI write request to PIFram NOP //80215A84: wait around for an arbitrary amount of time ADDU V1,R0,R0 ;V1=0 init.count ORI A0,R0,A7F7 ;A0=A7F7: 43000 ADDIU V1,V1,0001 ;V1++ count++ //80215A90: loop 43000 times SLT V0,A0,V1 BEQ V0,R0,80215A90 ;loop until PIF "likely" to be done processing ADDIU V1,V1,0001 ;V1++ count++ LUI V0,8025 LW A0,910C (V0) ;A0=8024910C: p->PIF buffer JAL 80215C8C ;send SI read request to PIFram NOP ADDU V1,R0,R0 ;V1=0 init.count ORI A0,R0,A7F7 ;A0=A7F7: 43000 ADDIU V1,V1,0001 ;V1++ count++ //80215AB8: SLT V0,A0,V1 BEQ V0,R0,80215AB8 ;loop 43000 times ADDIU V1,V1,0001 ;V1++ count++ JAL 80215B78 ;V0=cur.button and stick pos for controller 1 NOP LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80215ADC send PIF controller 1 read request ADDIU SP,SP,FFE8 LUI V1,FF01 SW S0,0010 (SP) LUI S0,8025 LW V0,910C (S0) ;V0=8024910C: p->PIF buffer ORI V1,V1,0401 ;V1=FF010401: read controller 1 SW RA,0014 (SP) SW V1,0000 (V0) ;save to PIF buffer LW A0,910C (S0) ;A0=8024910C: p->PIF buffer LUI V0,FE00 ;V0=FE000000: end commands SW V0,0008 (A0) ;save to PIF buffer ADDIU V0,R0,0001 JAL 80218598 ;cache target SW V0,003C (A0) ;1->PIF buffer+3F: process commands LW A0,910C (S0) ;A0=8024910C: p->PIF buffer JAL 80218598 ;cache target ADDIU A0,A0,0004 ;A0+=4: cache second word LW A0,910C (S0) ;A0=8024910C: p->PIF buffer JAL 80218598 ;cache target ADDIU A0,A0,0008 ;A0+=8: cache third word LW A0,910C (S0) ;A0=8024910C: p->PIF buffer JAL 80218598 ;cache target ADDIU A0,A0,003C ;A0+=3C: cache final word LW A0,910C (S0) ;A0=8024910C: p->source JAL 80215C48 ;send SI write request to PIFram NOP LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80215B54 retrieve controller data from PIF LUI V0,8025 LW A0,910C (V0) ;A0=8024910C: p->SI target ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80215C8C ;send SI read request to PIFram NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80215B78 V0=button and stick pos for controller 1 f/ cur. PIF buffer ADDIU SP,SP,FFE8 SW RA,0014 (SP) JAL 80205FB4 ;initialize port, retrieve, and execute PC comms commands SW S0,0010 (SP) LUI V0,8025 LW V0,910C (V0) ;V0=8024910C: p->PIF buffer LW V0,0004 (V0) ;V0=PIF buffer+4: controller data word for channel 1 ANDI A0,V0,0080 BEQ A0,R0,80215BAC ;branch if positive vertical stick position ADDU S0,R0,R0 ;S0=0 ANDI V0,V0,00FF ;V0=vert.stick J 80215BBC SLTI S0,V0,00C0 ;S0=TRUE if pos < -1/4: down //80215BAC: S0 2 up, 1 down ANDI V0,V0,00FF ;V0=vert.stick SLTI V0,V0,0041 BEQL V0,R0,80215BBC ;S0=2 if pos > 1/4: up ADDIU S0,R0,0002 //80215BBC: LUI V0,8025 LW V0,910C (V0) ;V0=8024910C: p->PIF buffer LW V0,0004 (V0) ;V0=controller data word ANDI A0,V0,8000 BEQ A0,R0,80215BEC ;branch if positive horizontal stick position ANDI V1,V0,FF00 ;V1=horz.stick ORI V0,R0,BFFF SLT V0,V0,V1 BEQL V0,R0,80215BFC ;S0+=4 if pos < -1/4: left ADDIU S0,S0,0004 J 80215C00 LUI V0,8025 //80215BEC: S0 4 left, 8 right ANDI V0,V0,FF00 ;V0=horz.stick SLTI V0,V0,4001 BEQL V0,R0,80215BFC ;S0+=8 if pos > 1/4: right ADDIU S0,S0,0008 //80215BFC: return button mask and stick pos LUI V0,8025 LW V0,910C (V0) ;V0=8024910C: p->PIF buffer LUI V1,FFFF LW V0,0004 (V0) ;V0=controller data word LW RA,0014 (SP) AND V0,V0,V1 ;V0&=FFFF0000: button mask ADDU V0,V0,S0 ;V0+=S0: buttons + stick pos flags LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80215C24 wait until SI ready LUI V0,A480 LW V0,0018 (V0) ;V0= SI Status ANDI V0,V0,0003 BEQ V0,R0,80215C40 ;return if status clear NOP //80215C38: loop until status clear BNE V0,R0,80215C38 NOP //80215C40: return JR RA NOP 80215C48 send SI write request to PIFram accepts: A0=p->source ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 80215C24 ;wait until SI ready ADDU S0,A0,R0 ;S0=A0: p->dram source LUI V1,1FFF ORI V1,V1,FFFF ;V1=1FFFFFFF: address mask LUI A0,1FC0 ORI A0,A0,07C0 ;A0=1FC007C0: PIFram LUI V0,A480 AND S0,S0,V1 ;S0&=mask: dram address SW S0,0000 (V0) ;S0->A4800000: SI dram address SW A0,0010 (V0) ;A0->A4800010: SI write address -PIFram LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80215C8C send SI read request to PIFram accepts: A0=p->dram ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 80215C24 ;wait until SI ready ADDU S0,A0,R0 ;S0=A0: p->dram target LUI V1,1FFF ORI V1,V1,FFFF ;V1=1FFFFFFF: address mask LUI A0,1FC0 ORI A0,A0,07C0 ;A0=1FC007C0: PIFram LUI V0,A480 AND S0,S0,V1 ;S0&=mask: dram address SW S0,0000 (V0) ;S0->A4800000: SI dram address SW A0,0004 (V0) ;A0->A4800004: SI read address -PIFram LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80215CD0 ADDIU A0,R0,1001 LUI V0,8024 ADDIU A2,V0,2C90 ADDIU A1,R0,1000 SLL V0,A0,0x2 LW V1,0068 (A2) ADDIU A0,A0,0001 ADDU V0,V0,V1 SW A1,0000 (V0) SLTI V0,A0,1101 BNE V0,R0,80215CE4 SLL V0,A0,0x2 ADDU A0,R0,R0 LUI V0,8024 ADDIU A2,V0,2C90 ADDIU A1,R0,1000 SLL V0,A0,0x2 LW V1,006C (A2) ADDIU A0,A0,0001 ADDU V0,V0,V1 SW A1,0000 (V0) SLTI V0,A0,1000 BNE V0,R0,80215D14 SLL V0,A0,0x2 JR RA NOP 80215D38: ADDU T1,A0,R0 ADDIU T0,R0,0001 ADDIU T4,R0,1000 SLL V0,T1,0x2 ADDU T3,V0,R0 LUI V0,8024 ADDIU V0,V0,2C90 ADDU A3,V0,R0 ADDU T5,A3,R0 ADDU A0,T4,R0 LW V0,0060 (A3) LW V1,0064 (A3) ADDU T2,V0,T1 LBU A1,0000 (T2) LW V0,0068 (A3) ADDU V1,T3,V1 SW A0,0000 (V1) ADDU V0,T3,V0 ADDIU A2,A1,1001 SW A0,0000 (V0) SW R0,005C (A3) BLTZ T0,80215DBC SLL V0,A2,0x2 LW V1,0068 (A3) ADDU V0,V0,V1 LW V1,0000 (V0) BNEL V1,T4,80215DD4 ADDU A2,V1,R0 SW T1,0000 (V0) LW V0,006C (A3) ADDU V0,T3,V0 JR RA SW A2,0000 (V0) LW V1,0064 (T5) ADDU V0,V0,V1 LW V1,0000 (V0) BEQL V1,T4,80215F18 SW T1,0000 (V0) ADDU A2,V1,R0 ADDIU A0,R0,0001 LW A1,0060 (A3) ADDU V1,T2,A0 ADDU V0,A2,A0 ADDU V0,A1,V0 LBU V1,0000 (V1) LBU V0,0000 (V0) SUBU T0,V1,V0 BNE T0,R0,80215E10 SLTI V0,A0,0003 ADDIU A0,A0,0001 SLTI V0,A0,003C BNE V0,R0,80215DE0 ADDU V1,T2,A0 SLTI V0,A0,0003 BNE V0,R0,80215D8C NOP LW V1,005C (A3) SLT V0,V1,A0 BEQ V0,R0,80215E44 SUBU V0,T1,A2 ANDI V0,V0,0FFF SW V0,0058 (A3) SLTI V0,A0,003C BEQ V0,R0,80215E68 SW A0,005C (A3) J 80215D8C NOP BNE A0,V1,80215D8C SUBU V1,T1,A2 LW V0,0058 (A3) ANDI V1,V1,0FFF SLT V0,V1,V0 BNEL V0,R0,80215D8C SW V1,0058 (A3) J 80215D8C NOP LUI V0,8024 ADDIU A3,V0,2C90 SLL A1,T1,0x2 LW V0,006C (A3) SLL A0,A2,0x2 ADDU V1,A0,V0 LW V1,0000 (V1) ADDU V0,A1,V0 SW V1,0000 (V0) LW V0,0064 (A3) ADDU V1,A0,V0 LW V1,0000 (V1) ADDU V0,A1,V0 SW V1,0000 (V0) LW V1,0068 (A3) ADDU V0,A0,V1 LW V0,0000 (V0) ADDU A1,A1,V1 SW V0,0000 (A1) LW V0,0064 (A3) ADDU V0,A0,V0 LW V0,0000 (V0) LW V1,006C (A3) SLL V0,V0,0x2 ADDU V0,V0,V1 SW T1,0000 (V0) LW V0,0068 (A3) ADDU V0,A0,V0 LW V0,0000 (V0) LW V1,006C (A3) SLL V0,V0,0x2 ADDU V0,V0,V1 SW T1,0000 (V0) LW V0,006C (A3) ADDU A0,A0,V0 LW V0,0000 (A0) LW V1,0068 (A3) SLL A0,V0,0x2 ADDU V1,A0,V1 LW V0,0000 (V1) BNE V0,A2,80215F2C NOP J 80215F38 SW T1,0000 (V1) LW V1,006C (T5) SLL V0,T1,0x2 ADDU V0,V0,V1 JR RA SW A2,0000 (V0) LW V0,0064 (A3) ADDU V0,A0,V0 SW T1,0000 (V0) LUI V0,8024 LW V1,2CFC (V0) SLL V0,A2,0x2 ADDU V0,V0,V1 ADDIU V1,R0,1000 JR RA SW V1,0000 (V0) 80215F54: ADDU T1,A0,R0 LUI V0,8024 ADDIU A2,V0,2C90 LW V0,006C (A2) SLL V1,T1,0x2 ADDU V0,V1,V0 LW V0,0000 (V0) ADDIU T0,R0,1000 BEQ V0,T0,80216130 NOP LW A1,0068 (A2) ADDU V0,V1,A1 LW A0,0000 (V0) BNE A0,T0,80215FA4 NOP LW V0,0064 (A2) ADDU V0,V1,V0 LW A3,0000 (V0) J 802160C0 LUI V0,8024 LW V0,0064 (A2) ADDU V0,V1,V0 LW V0,0000 (V0) BEQ V0,T0,802160BC ADDU A3,A0,R0 ADDU A3,V0,R0 SLL V0,A3,0x2 ADDU V0,V0,A1 LW V0,0000 (V0) BEQ V0,T0,8021607C ADDU V1,A1,R0 ADDIU A0,R0,1000 SLL V0,A3,0x2 ADDU V0,V0,V1 LW A3,0000 (V0) SLL A2,A3,0x2 ADDU V0,A2,V1 LW V0,0000 (V0) BNE V0,A0,80215FD8 SLL V0,A3,0x2 LUI A1,8024 ADDIU A1,A1,2C90 LW V0,006C (A1) LW A0,0068 (A1) ADDU V0,A2,V0 LW V1,0000 (V0) LW V0,0064 (A1) SLL V1,V1,0x2 ADDU V0,A2,V0 LW V0,0000 (V0) ADDU V1,V1,A0 SW V0,0000 (V1) LW V0,0064 (A1) LW A0,006C (A1) ADDU V0,A2,V0 ADDU V1,A2,A0 LW V0,0000 (V0) LW V1,0000 (V1) SLL V0,V0,0x2 ADDU V0,V0,A0 SW V1,0000 (V0) LW V0,0064 (A1) SLL A0,T1,0x2 ADDU V1,A0,V0 LW V1,0000 (V1) ADDU V0,A2,V0 SW V1,0000 (V0) LW V0,0064 (A1) ADDU A0,A0,V0 LW V0,0000 (A0) LW V1,006C (A1) SLL V0,V0,0x2 ADDU V0,V0,V1 SW A3,0000 (V0) LUI A1,8024 ADDIU A1,A1,2C90 SLL A0,A3,0x2 LW A2,0068 (A1) SLL V1,T1,0x2 ADDU V0,V1,A2 LW V0,0000 (V0) ADDU A0,A0,A2 SW V0,0000 (A0) LW V0,0068 (A1) ADDU V1,V1,V0 LW V0,0000 (V1) LW V1,006C (A1) SLL V0,V0,0x2 ADDU V0,V0,V1 SW A3,0000 (V0) LUI V0,8024 ADDIU A2,V0,2C90 SLL A0,A3,0x2 LW A1,006C (A2) SLL V1,T1,0x2 ADDU V0,V1,A1 LW V0,0000 (V0) ADDU A0,A0,A1 SW V0,0000 (A0) LW V0,006C (A2) ADDU V1,V1,V0 LW V0,0000 (V1) LW V1,0068 (A2) SLL A0,V0,0x2 ADDU V1,A0,V1 LW V0,0000 (V1) BNE V0,T1,8021610C NOP J 80216118 SW A3,0000 (V1) LW V0,0064 (A2) ADDU V0,A0,V0 SW A3,0000 (V0) LUI V0,8024 LW V1,2CFC (V0) SLL V0,T1,0x2 ADDU V0,V0,V1 ADDIU V1,R0,1000 SW V1,0000 (V0) JR RA NOP 80216138: ADDIU A2,R0,013A LUI V0,8024 ADDIU V0,V0,2C90 ADDU A3,V0,R0 LW V0,0050 (A3) ADDIU T0,R0,0001 SW R0,04E8 (V0) ADDIU A1,A2,FFFF LW V1,0044 (A3) SLL V0,A1,0x2 ADDU V0,V0,V1 SW A2,0000 (V0) LW V0,0048 (A3) SLL V1,A2,0x2 ADDU V0,V1,V0 SW A1,0000 (V0) LW V0,004C (A3) ADDU V0,V1,V0 SW T0,0000 (V0) LW A0,0050 (A3) LW V0,004C (A3) ADDU A0,V1,A0 ADDU V1,V1,V0 LW V0,0000 (A0) LW V1,0000 (V1) ADDU A2,A1,R0 ADDU V0,V0,V1 BGTZ A2,80216154 SW V0,FFFC (A0) ADDIU A1,R0,1000 LUI V0,8024 ADDIU V0,V0,2C90 LW V1,004C (V0) ADDU A3,V0,R0 SW R0,0000 (V1) LW V0,0054 (A3) ADDIU A2,R0,2710 SW R0,4000 (V0) ADDIU A0,A1,00C8 DIV A2,A0 BNE A0,R0,802161E4 NOP BREAK 00001C00 ADDIU AT,R0,FFFF BNE A0,AT,802161FC LUI AT,8000 BNE A2,AT,802161FC NOP BREAK 00001800 MFLO A0 LW V0,0054 (A3) SLL V1,A1,0x2 ADDU V1,V1,V0 LW V0,0000 (V1) ADDIU A1,A1,FFFF ADDU V0,V0,A0 BGTZ A1,802161D0 SW V0,FFFC (V1) JR RA NOP 80216228: LUI V0,8024 ADDIU V1,V0,2C90 LW V0,0050 (V1) LW V0,0000 (V0) SLTIU V0,V0,7FFF BNE V0,R0,80216290 ADDU T1,A0,R0 ADDU A0,R0,R0 ADDIU T0,R0,013A ADDU A1,V1,R0 LW V0,0050 (A1) SLL V1,T0,0x2 ADDU V0,V1,V0 SW A0,0000 (V0) LW V0,004C (A1) ADDU V1,V1,V0 LW V0,0000 (V1) ADDIU T0,T0,FFFF ADDIU V0,V0,0001 SRL V0,V0,0x1 ADDU A0,A0,V0 BGTZ T0,80216250 SW V0,0000 (V1) LUI V0,8024 LW V0,2CE0 (V0) SW A0,0000 (V0) ADDU T0,T1,R0 LUI V0,8024 LW V1,2CDC (V0) SLL V0,T0,0x2 ADDU A0,V0,V1 LW V1,0000 (A0) LW V0,FFFC (A0) BNE V1,V0,802162CC SLT V0,T0,T1 ADDIU A0,A0,FFFC LW V1,0000 (A0) LW V0,FFFC (A0) BEQ V1,V0,802162B4 ADDIU T0,T0,FFFF SLT V0,T0,T1 BEQ V0,R0,80216324 LUI A3,8024 ADDIU A3,A3,2C90 SLL A0,T0,0x2 LW V0,0048 (A3) SLL A1,T1,0x2 ADDU A0,A0,V0 ADDU V0,A1,V0 LW A2,0000 (V0) LW V1,0000 (A0) SW A2,0000 (A0) LW V0,0048 (A3) ADDU A1,A1,V0 SW V1,0000 (A1) LW V0,0044 (A3) SLL V1,V1,0x2 ADDU V1,V1,V0 SW T1,0000 (V1) LW V0,0044 (A3) SLL A2,A2,0x2 ADDU A2,A2,V0 SW T0,0000 (A2) LUI V0,8024 ADDIU A0,V0,2C90 LW V0,004C (A0) J 80216340 SLL V1,T0,0x2 LW V0,0050 (A0) SLL V1,T0,0x2 ADDU V1,V1,V0 LW V0,0000 (V1) ADDIU T0,T0,FFFF ADDIU V0,V0,0001 BGEZ T0,80216338 SW V0,0000 (V1) JR RA NOP 80216360: ADDU A2,A0,R0 BEQ A2,R0,80216380 LUI V0,8024 ADDIU V0,V0,2C90 LW V1,0024 (V0) LW A0,0028 (V0) OR V1,V1,A0 SW V1,0024 (V0) LUI V0,8024 ADDIU A1,V0,2C90 LW V0,0028 (A1) SRL V0,V0,0x1 BNE V0,R0,802163CC SW V0,0028 (A1) LW V1,0004 (A1) LW V0,0014 (A1) LBU A0,0027 (A1) ADDU V0,V0,V1 SB A0,0000 (V0) LW V0,001C (A1) ADDIU V1,V1,0001 SW V1,0004 (A1) ADDIU V1,R0,0080 SW R0,0024 (A1) SW V1,0028 (A1) ADDIU V0,V0,0001 SW V0,001C (A1) LW V0,0040 (A1) BLEZ V0,80216444 SLTIU A2,A2,0001 ADDIU A3,R0,0080 BEQ A2,R0,802163F4 NOP LW V0,0024 (A1) LW V1,0028 (A1) OR V0,V0,V1 SW V0,0024 (A1) LW V0,0028 (A1) SRL V0,V0,0x1 BNE V0,R0,80216434 SW V0,0028 (A1) LW V1,0004 (A1) LW V0,0014 (A1) LBU A0,0027 (A1) ADDU V0,V0,V1 SB A0,0000 (V0) LW V0,001C (A1) ADDIU V1,V1,0001 SW V1,0004 (A1) SW R0,0024 (A1) SW A3,0028 (A1) ADDIU V0,V0,0001 SW V0,001C (A1) LW V0,0040 (A1) ADDIU V0,V0,FFFF BGTZ V0,802163DC SW V0,0040 (A1) JR RA NOP 8021644C: ADDIU SP,SP,FFD0 LUI V1,8024 ADDIU V1,V1,2C90 SLL A0,A0,0x2 SW RA,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S4,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW S1,0014 (SP) SW S0,0010 (SP) LW V0,0044 (V1) LW A3,0050 (V1) LW A2,0034 (V1) ADDU A0,A0,V0 LW S4,0000 (A0) LW A0,0038 (V1) SLL A1,S4,0x2 ADDU A1,A1,A3 LW V0,FFFC (A1) SUBU A0,A0,A2 MULT A0,V0 MFLO T0 LW V0,0000 (A3) NOP DIVU T0,V0 BNE V0,R0,802164C4 NOP BREAK 00001C00 MFLO V0 ADDU V0,A2,V0 SW V0,0038 (V1) LW V0,0000 (A1) MULT A0,V0 MFLO A1 LW V0,0000 (A3) NOP DIVU A1,V0 BNE V0,R0,802164F4 NOP BREAK 00001C00 MFLO V0 ADDU S0,V1,R0 LUI S1,0001 ORI S6,R0,FFFF ADDIU S5,R0,7FFF ADDU S3,S1,R0 ORI S3,S3,8000 ADDIU S2,R0,8000 ADDU A2,A2,V0 SW A2,0034 (S0) LW A0,0038 (S0) SLTU V0,S1,A0 BNE V0,R0,8021653C NOP JAL 80216360 ADDU A0,R0,R0 J 80216598 NOP LW V1,0034 (S0) SLTU V0,S6,V1 BEQ V0,R0,80216570 SLTU V0,S5,V1 JAL 80216360 ADDIU A0,R0,0001 LW V0,0034 (S0) LW V1,0038 (S0) SUBU V0,V0,S1 SUBU V1,V1,S1 SW V0,0034 (S0) J 80216598 SW V1,0038 (S0) BEQ V0,R0,802165B4 SLTU V0,S3,A0 BNE V0,R0,802165B4 ADDU V0,V1,S2 LW V1,0040 (S0) SW V0,0034 (S0) ADDU V0,A0,S2 SW V0,0038 (S0) ADDIU V1,V1,0001 SW V1,0040 (S0) LW V0,0034 (S0) LW V1,0038 (S0) SLL V0,V0,0x1 SLL V1,V1,0x1 SW V0,0034 (S0) J 8021651C SW V1,0038 (S0) JAL 80216228 ADDU A0,S4,R0 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 802165E4: ADDIU SP,SP,FFD0 LUI V1,8024 ADDIU V1,V1,2C90 SLL A0,A0,0x2 SW RA,0028 (SP) SW S5,0024 (SP) SW S4,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) SW S1,0014 (SP) SW S0,0010 (SP) LW A3,0054 (V1) LW A1,0038 (V1) LW A2,0034 (V1) ADDU A0,A0,A3 LW V0,0000 (A0) SUBU A1,A1,A2 MULT A1,V0 MFLO T0 LW V0,0000 (A3) NOP DIVU T0,V0 BNE V0,R0,80216648 NOP BREAK 00001C00 MFLO V0 ADDU V0,A2,V0 SW V0,0038 (V1) LW V0,0004 (A0) MULT A1,V0 MFLO A1 LW V0,0000 (A3) NOP DIVU A1,V0 BNE V0,R0,80216678 NOP BREAK 00001C00 MFLO V0 ADDU S0,V1,R0 LUI S1,0001 ORI S5,R0,FFFF ADDIU S4,R0,7FFF ADDU S3,S1,R0 ORI S3,S3,8000 ADDIU S2,R0,8000 ADDU A2,A2,V0 SW A2,0034 (S0) LW A0,0038 (S0) SLTU V0,S1,A0 BNE V0,R0,802166C0 NOP JAL 80216360 ADDU A0,R0,R0 J 8021671C NOP LW V1,0034 (S0) SLTU V0,S5,V1 BEQ V0,R0,802166F4 SLTU V0,S4,V1 JAL 80216360 ADDIU A0,R0,0001 LW V0,0034 (S0) LW V1,0038 (S0) SUBU V0,V0,S1 SUBU V1,V1,S1 SW V0,0034 (S0) J 8021671C SW V1,0038 (S0) BEQ V0,R0,80216738 SLTU V0,S3,A0 BNE V0,R0,80216738 ADDU V0,V1,S2 LW V1,0040 (S0) SW V0,0034 (S0) ADDU V0,A0,S2 SW V0,0038 (S0) ADDIU V1,V1,0001 SW V1,0040 (S0) LW V0,0034 (S0) LW V1,0038 (S0) SLL V0,V0,0x1 SLL V1,V1,0x1 SW V0,0034 (S0) J 802166A0 SW V1,0038 (S0) LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 8021675C: ADDIU SP,SP,FFE8 LUI V1,8024 ADDIU V1,V1,2C90 SW RA,0010 (SP) LW V0,0040 (V1) ADDIU V0,V0,0001 SW V0,0040 (V1) LW V1,0034 (V1) ADDIU V0,R0,7FFF SLTU V0,V0,V1 BNE V0,R0,80216790 ADDIU A0,R0,0001 ADDU A0,R0,R0 JAL 80216360 NOP ADDU A2,R0,R0 LUI V0,8024 ADDIU A1,V0,2C90 ADDIU A3,R0,0080 LW V0,0028 (A1) SRL V0,V0,0x1 BNE V0,R0,802167E8 SW V0,0028 (A1) LW V1,0004 (A1) LW V0,0014 (A1) LBU A0,0027 (A1) ADDU V0,V0,V1 SB A0,0000 (V0) LW V0,001C (A1) ADDIU V1,V1,0001 SW V1,0004 (A1) SW R0,0024 (A1) SW A3,0028 (A1) ADDIU V0,V0,0001 SW V0,001C (A1) ADDIU A2,A2,0001 SLTI V0,A2,0007 BNE V0,R0,802167A8 NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80216804: ADDIU A1,R0,0001 ADDIU A2,R0,013A LUI V0,8024 LW A3,2CE0 (V0) ADDU V0,A1,A2 SRL V1,V0,0x1F ADDU V0,V0,V1 SRA V1,V0,0x1 SLL V0,V1,0x2 ADDU V0,V0,A3 LW V0,0000 (V0) SLTU V0,A0,V0 BEQL V0,R0,80216840 ADDU A2,V1,R0 ADDIU A1,V1,0001 SLT V0,A1,A2 BNE V0,R0,80216818 ADDU V0,A1,A2 JR RA ADDU V0,A1,R0 80216854: ADDIU A1,R0,0001 ADDIU A2,R0,1000 LUI V0,8024 LW A3,2CE4 (V0) ADDU V0,A1,A2 SRL V1,V0,0x1F ADDU V0,V0,V1 SRA V1,V0,0x1 SLL V0,V1,0x2 ADDU V0,V0,A3 LW V0,0000 (V0) SLTU V0,A0,V0 BEQL V0,R0,80216890 ADDU A2,V1,R0 ADDIU A1,V1,0001 SLT V0,A1,A2 BNE V0,R0,80216868 ADDU V0,A1,A2 JR RA ADDIU V0,A1,FFFF 802168A4: ADDU A1,R0,R0 LUI A2,8024 ADDIU A0,A2,2C90 ADDIU A3,R0,0080 LW V0,0030 (A0) SRL V0,V0,0x1 BNE V0,R0,802168E4 SW V0,0030 (A0) LW V0,2C90 (A2) LW V1,0010 (A0) ADDU V1,V1,V0 LBU V1,0000 (V1) ADDIU V0,V0,0001 SW V0,2C90 (A2) SW A3,0030 (A0) SW V1,002C (A0) LW V1,002C (A0) LW V0,0030 (A0) ADDIU A1,A1,0001 AND V1,V1,V0 LW V0,003C (A0) SLTU V1,R0,V1 SLL V0,V0,0x1 ADDU V0,V0,V1 SW V0,003C (A0) SLTI V0,A1,0011 BNE V0,R0,802168B4 NOP JR RA NOP 8021691C: ADDIU SP,SP,FFE0 SW S2,0018 (SP) LUI S2,8024 SW S0,0010 (SP) ADDIU S0,S2,2C90 SW RA,001C (SP) SW S1,0014 (SP) LW A0,0034 (S0) LW V0,003C (S0) LW V1,0050 (S0) SUBU V0,V0,A0 LW V1,0000 (V1) ADDIU V0,V0,0001 MULT V0,V1 LW S1,0038 (S0) MFLO V1 SUBU S1,S1,A0 ADDIU A0,V1,FFFF DIVU A0,S1 BNE S1,R0,80216974 NOP BREAK 00001C00 MFLO A0 JAL 80216804 NOP ADDU T1,V0,R0 LW A0,0050 (S0) SLL V1,T1,0x2 ADDU V1,V1,A0 LW V0,FFFC (V1) MULT S1,V0 MFLO A1 LW V0,0000 (A0) NOP DIVU A1,V0 BNE V0,R0,802169B4 NOP BREAK 00001C00 MFLO V0 LW A1,0034 (S0) ADDU V0,A1,V0 SW V0,0038 (S0) LW V0,0000 (V1) MULT S1,V0 MFLO V1 LW V0,0000 (A0) NOP DIVU V1,V0 BNE V0,R0,802169E8 NOP BREAK 00001C00 MFLO V0 ORI T5,R0,FFFF LUI A3,FFFF ADDIU T4,R0,7FFF LUI T0,0001 ORI T0,T0,8000 ADDIU A2,R0,8000 LUI T3,0001 ADDIU T2,R0,0080 ADDU A1,A1,V0 SW A1,0034 (S0) LW V1,0034 (S0) SLTU V0,T5,V1 BEQ V0,R0,80216A44 ADDU V0,V1,A3 SW V0,0034 (S0) LW V0,003C (S0) LW V1,0038 (S0) ADDU V0,V0,A3 ADDU V1,V1,A3 SW V0,003C (S0) J 80216A8C SW V1,0038 (S0) SLTU V0,T4,V1 BEQ V0,R0,80216A7C NOP LW A0,0038 (S0) SLTU V0,T0,A0 BNE V0,R0,80216A7C ADDU V0,V1,A2 LW V1,003C (S0) SW V0,0034 (S0) ADDU V0,A0,A2 SW V0,0038 (S0) ADDU V1,V1,A2 J 80216A8C SW V1,003C (S0) LW V0,0038 (S0) SLTU V0,T3,V0 BNE V0,R0,80216AF8 ADDU A0,T1,R0 LW V0,0034 (S0) LW V1,0030 (S0) SLL V0,V0,0x1 SW V0,0034 (S0) LW V0,0038 (S0) SRL V1,V1,0x1 SW V1,0030 (S0) SLL V0,V0,0x1 BNE V1,R0,80216AD4 SW V0,0038 (S0) LW V0,2C90 (S2) LW V1,0010 (S0) ADDU V1,V1,V0 LBU V1,0000 (V1) ADDIU V0,V0,0001 SW V0,2C90 (S2) SW T2,0030 (S0) SW V1,002C (S0) LW V1,002C (S0) LW V0,0030 (S0) AND V1,V1,V0 LW V0,003C (S0) SLTU V1,R0,V1 SLL V0,V0,0x1 ADDU V0,V0,V1 J 80216A14 SW V0,003C (S0) LUI V0,8024 LW V1,2CD8 (V0) SLL V0,A0,0x2 ADDU V0,V0,V1 LW S0,0000 (V0) JAL 80216228 NOP LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) ADDU V0,S0,R0 LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80216B30: ADDIU SP,SP,FFE0 SW S2,0018 (SP) LUI S2,8024 SW S0,0010 (SP) ADDIU S0,S2,2C90 SW RA,001C (SP) SW S1,0014 (SP) LW A0,0034 (S0) LW V0,003C (S0) LW V1,0054 (S0) SUBU V0,V0,A0 LW V1,0000 (V1) ADDIU V0,V0,0001 MULT V0,V1 LW S1,0038 (S0) MFLO V1 SUBU S1,S1,A0 ADDIU A0,V1,FFFF DIVU A0,S1 BNE S1,R0,80216B88 NOP BREAK 00001C00 MFLO A0 JAL 80216854 NOP ADDU T1,V0,R0 LW A0,0054 (S0) SLL V1,T1,0x2 ADDU V1,V1,A0 LW V0,0000 (V1) MULT S1,V0 MFLO A1 LW V0,0000 (A0) NOP DIVU A1,V0 BNE V0,R0,80216BC8 NOP BREAK 00001C00 MFLO V0 LW A1,0034 (S0) ADDU V0,A1,V0 SW V0,0038 (S0) LW V0,0004 (V1) MULT S1,V0 MFLO V1 LW V0,0000 (A0) NOP DIVU V1,V0 BNE V0,R0,80216BFC NOP BREAK 00001C00 MFLO V0 ORI T5,R0,FFFF LUI A3,FFFF ADDIU T4,R0,7FFF LUI T0,0001 ORI T0,T0,8000 ADDIU A2,R0,8000 LUI T3,0001 ADDIU T2,R0,0080 ADDU A1,A1,V0 SW A1,0034 (S0) LW V1,0034 (S0) SLTU V0,T5,V1 BEQ V0,R0,80216C58 ADDU V0,V1,A3 SW V0,0034 (S0) LW V0,003C (S0) LW V1,0038 (S0) ADDU V0,V0,A3 ADDU V1,V1,A3 SW V0,003C (S0) J 80216CA0 SW V1,0038 (S0) SLTU V0,T4,V1 BEQ V0,R0,80216C90 NOP LW A0,0038 (S0) SLTU V0,T0,A0 BNE V0,R0,80216C90 ADDU V0,V1,A2 LW V1,003C (S0) SW V0,0034 (S0) ADDU V0,A0,A2 SW V0,0038 (S0) ADDU V1,V1,A2 J 80216CA0 SW V1,003C (S0) LW V0,0038 (S0) SLTU V0,T3,V0 BNE V0,R0,80216D0C ADDU V0,T1,R0 LW V0,0034 (S0) LW V1,0030 (S0) SLL V0,V0,0x1 SW V0,0034 (S0) LW V0,0038 (S0) SRL V1,V1,0x1 SW V1,0030 (S0) SLL V0,V0,0x1 BNE V1,R0,80216CE8 SW V0,0038 (S0) LW V0,2C90 (S2) LW V1,0010 (S0) ADDU V1,V1,V0 LBU V1,0000 (V1) ADDIU V0,V0,0001 SW V0,2C90 (S2) SW T2,0030 (S0) SW V1,002C (S0) LW V1,002C (S0) LW V0,0030 (S0) AND V1,V1,V0 LW V0,003C (S0) SLTU V1,R0,V1 SLL V0,V0,0x1 ADDU V0,V0,V1 J 80216C28 SW V0,003C (S0) LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80216D24 accepts: A0=, A1=, A2=, A3=unused, SP+10=unused, SP+14= ADDIU SP,SP,FFC8 SW S3,001C (SP) ADDU S3,A0,R0 ;S3=A0: SW S4,0020 (SP) ADDU S4,A1,R0 ;S4=A1: SW S1,0014 (SP) ADDU S1,A2,R0 ;S1=A2: SW S8,0030 (SP) LW S8,004C (SP) ;S8=[SP+14 f/caller]: ADDIU A0,R0,103B ;A0=103B bytes SW RA,0034 (SP) SW S7,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S2,0018 (SP) JAL 80215804 ;V0=p->A0 bytes of allocated memory SW S0,0010 (SP) ADDIU A0,R0,4004 ;A0=4004 bytes LUI S2,8024 ADDIU S0,S2,2C90 JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0060 (S0) ADDIU A0,R0,4404 ;A0=4404 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0064 (S0) ADDIU A0,R0,4004 ;A0=4004 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0068 (S0) ADDIU A0,R0,04E8 ;A0=4E8 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,006C (S0) ADDIU A0,R0,04EC ;A0=4EC bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0044 (S0) ADDIU A0,R0,04EC ;A0=4EC bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0048 (S0) ADDIU A0,R0,04EC ;A0=4EC bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,004C (S0) ADDIU A0,R0,4004 ;A0=4004 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0050 (S0) ADDU S5,R0,R0 SW V0,0054 (S0) ADDIU V0,R0,0080 SW V0,0028 (S0) LUI V0,0002 SW R0,0018 (S0) SW R0,001C (S0) SW R0,0020 (S0) SW R0,0024 (S0) SW R0,002C (S0) SW R0,0030 (S0) SW R0,0034 (S0) SW V0,0038 (S0) SW R0,003C (S0) SW S3,0014 (S0) SW S4,0010 (S0) SW S1,000C (S0) SW S1,0008 (S0) SW S1,0018 (S0) SW R0,2C90 (S2) SW R0,0004 (S0) SLL A1,S5,0x3 ADDIU S5,S5,0001 LW A0,0004 (S0) LW V1,0014 (S0) LW V0,0008 (S0) ADDU V1,V1,A0 ADDIU A0,A0,0001 SRAV V0,V0,A1 SB V0,0000 (V1) SLTI V0,S5,0004 BNE V0,R0,80216E24 SW A0,0004 (S0) LUI V0,8024 ADDIU S0,V0,2C90 LW V0,001C (S0) LW V1,0018 (S0) ADDIU V0,V0,0004 BNE V1,R0,80216E78 SW V0,001C (S0) J 802170F4 ADDU V0,R0,R0 JAL 80216138 SW R0,0018 (S0) JAL 80215CD0 ADDU S3,R0,R0 ADDIU S2,R0,0FC4 ADDU S5,S3,R0 ADDU A0,S0,R0 ADDIU V1,R0,0020 LW V0,0060 (A0) ADDU V0,V0,S5 ADDIU S5,S5,0001 SB V1,0000 (V0) SLT V0,S5,S2 BNE V0,R0,80216E98 ADDU S4,R0,R0 LUI A3,8024 ADDIU A2,A3,2C90 LW A1,2C90 (A3) LW V0,0008 (A2) SLT V0,A1,V0 BEQ V0,R0,80216EFC ADDU A0,S2,S4 ADDIU S4,S4,0001 LW V0,0010 (A2) LW V1,0060 (A2) ADDU V0,V0,A1 LBU S0,0000 (V0) ADDIU V0,A1,0001 ADDU V1,V1,A0 SW V0,2C90 (A3) SLTI V0,S4,003C BNE V0,R0,80216EBC SB S0,0000 (V1) SW S4,0018 (A2) ADDIU S5,R0,0001 JAL 80215D38 SUBU A0,S2,S5 ADDIU S5,S5,0001 SLTI V0,S5,003D BNE V0,R0,80216F04 NOP JAL 80215D38 ADDU A0,S2,R0 LUI S7,8024 ADDIU S1,S7,2C90 LW V0,005C (S1) SLT V0,S4,V0 BNEL V0,R0,80216F3C SW S4,005C (S1) LW A0,005C (S1) SLTI V0,A0,0003 BEQ V0,R0,80216F6C ADDIU V0,R0,0001 LW V1,0060 (S1) SW V0,005C (S1) ADDU V1,V1,S2 LBU A0,0000 (V1) JAL 8021644C NOP J 80216F80 NOP JAL 8021644C ADDIU A0,A0,00FD LW A0,0058 (S1) JAL 802165E4 ADDIU A0,A0,FFFF LW S6,005C (S1) BLEZ S6,80217008 ADDU S5,R0,R0 LW V1,2C90 (S7) LW V0,0008 (S1) SLT V0,V1,V0 BEQ V0,R0,80217008 NOP LW V0,0010 (S1) ADDU A0,S3,R0 ADDU V0,V0,V1 LBU S0,0000 (V0) ADDIU V0,V1,0001 JAL 80215F54 SW V0,2C90 (S7) LW V0,0060 (S1) ADDU V0,V0,S3 SB S0,0000 (V0) SLTI V0,S3,003B BEQ V0,R0,80216FE4 ADDIU V0,S3,0001 LW V0,0060 (S1) ADDU V0,S3,V0 SB S0,1000 (V0) ADDIU V0,S3,0001 ANDI S3,V0,0FFF ADDIU V0,S2,0001 ANDI S2,V0,0FFF JAL 80215D38 ADDU A0,S2,R0 ADDIU S5,S5,0001 SLT V0,S5,S6 BNE V0,R0,80216F8C NOP BLEZ S8,80217064 ADDU V0,S5,R0 LW V0,0018 (S1) LW V1,0020 (S1) ADDU V0,V0,S5 SW V0,0018 (S1) SLTU V0,V1,V0 BEQ V0,R0,80217064 ADDU V0,S5,R0 ADDIU V0,V1,0400 J 80217060 SW V0,0020 (S1) JAL 80215F54 ADDU A0,S3,R0 ADDIU V0,S3,0001 ANDI S3,V0,0FFF ADDIU V0,S2,0001 ADDIU S4,S4,FFFF BEQ S4,R0,80217060 ANDI S2,V0,0FFF JAL 80215D38 ADDU A0,S2,R0 ADDU V0,S5,R0 SLT V0,V0,S6 BNE V0,R0,80217038 ADDIU S5,S5,0001 BGTZ S4,80216F2C NOP JAL 8021675C LUI S0,8024 //80217080: free allocated memory ADDIU S0,S0,2C90 LW A0,0054 (S0) JAL 802158AC ;free allocated memory A0 NOP LW A0,0050 (S0) JAL 802158AC ;free allocated memory A0 NOP LW A0,004C (S0) JAL 802158AC ;free allocated memory A0 NOP LW A0,0048 (S0) JAL 802158AC ;free allocated memory A0 NOP LW A0,0044 (S0) JAL 802158AC ;free allocated memory A0 NOP LW A0,006C (S0) JAL 802158AC ;free allocated memory A0 NOP LW A0,0068 (S0) JAL 802158AC ;free allocated memory A0 NOP LW A0,0064 (S0) JAL 802158AC ;free allocated memory A0 NOP LW A0,0060 (S0) JAL 802158AC ;free allocated memory A0 NOP //802170F0: return LW V0,0004 (S0) LW RA,0034 (SP) LW S8,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 80217124 decompress compressed data A1 to A0 accepts: A0=p->target, A1=p->compressed data, A2=unused?, A3=unused?, SP+10= ADDIU SP,SP,FFD0 SW S4,0020 (SP) ADDU S4,A0,R0 ;S4=A0: p->target SW S3,001C (SP) ADDU S3,A1,R0 ;S3=A1: p->data SW S5,0024 (SP) LW S5,0040 (SP) ;S5=[SP+10 f/caller]: ADDIU A0,R0,103B ;A0=103B bytes SW S1,0014 (SP) LUI S1,8024 SW S0,0010 (SP) ADDIU S0,S1,2C90 ;S0=80242C90: SW S2,0018 (SP) LUI S2,0002 SW RA,0028 (SP) SW R0,0034 (S0) ;0->80242CC4: SW S2,0038 (S0) ;20000->80242CC8: SW R0,003C (S0) ;0->80242CCC: //8021716C: JAL 80215804 ;V0=p->A0 bytes of allocated memory SW R0,0040 (S0) ;0->80242CD0: ADDIU A0,R0,4004 ;A0=4004 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0060 (S0) ;V0->80242CF0: ADDIU A0,R0,4404 ;A0=4404 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0064 (S0) ;V0->80242CF4: ADDIU A0,R0,4004 ;A0=4004 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0068 (S0) ;V0->80242CF8: ADDIU A0,R0,04E8 ;A0=4E8 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,006C (S0) ;V0->80242CFC: ADDIU A0,R0,04EC ;A0=4EC bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0044 (S0) ;V0->80242CD4: ADDIU A0,R0,04EC ;A0=4EC bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0048 (S0) ;V0->80242CD8: ADDIU A0,R0,04EC ;A0=4EC bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,004C (S0) ;V0->80242CDC: ADDIU A0,R0,4004 ;A0=4004 bytes JAL 80215804 ;V0=p->A0 bytes of allocated memory SW V0,0050 (S0) ;V0->80242CE0: ADDU A2,R0,R0 ;A2=0 SW V0,0054 (S0) ;V0->80242CE4: ADDIU V0,R0,0080 //802171E0: SW R0,0018 (S0) SW R0,001C (S0) SW R0,0020 (S0) SW R0,0024 (S0) SW V0,0028 (S0) SW R0,002C (S0) SW R0,0030 (S0) SW R0,0034 (S0) SW S2,0038 (S0) SW R0,003C (S0) SW S4,0014 (S0) SW S3,0010 (S0) SW R0,2C90 (S1) SW R0,0004 (S0) SW R0,0018 (S0) //8021721C: SLL A1,A2,0x3 LW V1,2C90 (S1) ADDIU A2,A2,0001 ADDU V0,S3,V1 LBU A0,0000 (V0) ADDIU V1,V1,0001 SW V1,2C90 (S1) LW V0,0018 (S0) SLLV A0,A0,A1 OR V0,V0,A0 SW V0,0018 (S0) SLTI V0,A2,0004 BNEL V0,R0,80217220 SLL A1,A2,0x3 LUI V0,8024 ADDIU S0,V0,2C90 LW V0,0018 (S0) BNE V0,R0,80217270 SW V0,000C (S0) J 80217420 ADDU V0,R0,R0 //80217270: JAL 802168A4 NOP JAL 80216138 NOP ADDU A2,R0,R0 ADDU A0,S0,R0 ADDIU V1,R0,0020 //8021728C: LW V0,0060 (A0) ADDU V0,V0,A2 ADDIU A2,A2,0001 SB V1,0000 (V0) SLTI V0,A2,0FC4 BNE V0,R0,8021728C ADDIU S1,R0,0FC4 LUI V0,8024 ADDIU V1,V0,2C90 LW V0,0018 (V1) BEQ V0,R0,802173A8 ADDU S2,R0,R0 ADDU S3,V1,R0 JAL 8021691C NOP ADDU S0,V0,R0 SLTI V0,S0,0100 BEQ V0,R0,8021730C NOP LW V0,0004 (S3) LW V1,0014 (S3) ADDIU S2,S2,0001 ADDU V1,V1,V0 SB S0,0000 (V1) LW V1,0060 (S3) ADDIU V0,V0,0001 SW V0,0004 (S3) ADDU V1,V1,S1 ADDIU S1,S1,0001 ANDI S1,S1,0FFF J 8021737C SB S0,0000 (V1) //8021730C: JAL 80216B30 NOP SUBU V0,S1,V0 ADDIU V0,V0,FFFF ANDI A2,V0,0FFF ADDIU A3,S0,FF03 BLEZ A3,8021737C ADDU A1,R0,R0 ADDIU S2,S2,0001 ADDU V0,A2,A1 ADDIU A1,A1,0001 ANDI V0,V0,0FFF LW V1,0060 (S3) LW A0,0004 (S3) ADDU V1,V1,V0 LW V0,0014 (S3) LBU S0,0000 (V1) ADDU V0,V0,A0 SB S0,0000 (V0) LW V0,0060 (S3) ADDIU A0,A0,0001 SW A0,0004 (S3) ADDU V0,V0,S1 ADDIU S1,S1,0001 SB S0,0000 (V0) SLT V0,A1,A3 BNE V0,R0,8021732C ANDI S1,S1,0FFF //8021737C: BLEZ S5,80217398 NOP LW V1,0020 (S3) SLTU V0,V1,S2 BEQ V0,R0,80217398 ADDIU V0,V1,0400 SW V0,0020 (S3) //80217398: LW V0,0018 (S3) SLTU V0,S2,V0 BNE V0,R0,802172C0 NOP //802173A8: LUI S0,8024 ADDIU S0,S0,2C90 ;S0=80242C90 LW A0,0054 (S0) ;A0=80242CE4: JAL 802158AC ;free allocated memory A0 NOP LW A0,0050 (S0) ;A0=80242CE0: //802173C0: JAL 802158AC ;free allocated memory A0 NOP LW A0,004C (S0) ;A0=80242CDC: JAL 802158AC ;free allocated memory A0 NOP LW A0,0048 (S0) ;A0=80242CD8: JAL 802158AC ;free allocated memory A0 NOP LW A0,0044 (S0) ;A0=80242CD4: JAL 802158AC ;free allocated memory A0 NOP LW A0,006C (S0) ;A0=80242CFC: JAL 802158AC ;free allocated memory A0 NOP LW A0,0068 (S0) ;A0=80242CF8: JAL 802158AC ;free allocated memory A0 NOP LW A0,0064 (S0) ;A0=80242CF4: JAL 802158AC ;free allocated memory A0 NOP LW A0,0060 (S0) ;A0=80242CF0: JAL 802158AC ;free allocated memory A0 NOP //8021741C: return LW V0,0004 (S0) LW RA,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 80217444 load resource named A1 to A0 accepts: A0=p->target, A1=p->string ADDIU SP,SP,FFE0 SW RA,0018 (SP) ADDU A3,A1,R0 ;A3=A1: p->string LUI V0,8022 ADDIU A1,V0,7D40 ;A1=80227D40: p->resource binaries //80217458: check if source string NULL LBU V1,0000 (A3) ;V1=char.source BEQ V1,R0,802174B8 ;branch if NULL char ADDIU A2,R0,0001 ;A2=1 count //80217464: loop to compare filenames ADDU V0,A2,A1 ;V0=count+p->resource LBU V0,0003 (V0) ;V0=char.resname BNE V1,V0,80217480 ;branch if not a match ADDU V0,A3,A2 ;V0=A3+A2: count+p->string LBU V1,0000 (V0) ;V1=char.source BNE V1,R0,80217464 ;loop until end of string ADDIU A2,A2,0001 ;A2++ //80217480: check next resource if didn't match BEQL V1,R0,802174BC ;branch if strings matched ADDIU A1,A1,0010 LBU V1,0000 (A1) ;V1=resource+0: segments of resource size LBU V0,0001 (A1) SLL A2,V1,0x18 SLL V0,V0,0x10 OR A2,A2,V0 LBU V1,0002 (A1) LBU V0,0003 (A1) SLL V1,V1,0x8 OR A2,A2,V1 OR A2,A2,V0 ;A2=res.size J 80217458 ;loop through each resource until match found ADDU A1,A1,A2 ;A1+=res.size: p->next resource //802174B8: load match when found ADDIU A1,A1,0010 ;A1+=10: resource+10= p->data ADDU A2,R0,R0 ;A2=0 ADDU A3,A2,R0 ;A3=A2: 0 JAL 80217124 ;decompress compressed data A1 to A0 SW R0,0010 (SP) ;0->SP+10: //802174CC: return LW RA,0018 (SP) JR RA ADDIU SP,SP,0020 802174D8 unconditional return JR RA NOP 802174E0 BEQ A0,R0,802174FC LUI V0,8024 ADDIU V0,V0,2C90 LW V1,0024 (V0) LW A0,0028 (V0) OR V1,V1,A0 SW V1,0024 (V0) LUI V0,8024 ADDIU A1,V0,2C90 LW V0,0028 (A1) SRL V0,V0,0x1 BNE V0,R0,80217548 SW V0,0028 (A1) LW V1,0004 (A1) LW V0,0014 (A1) LBU A0,0027 (A1) ADDU V0,V0,V1 SB A0,0000 (V0) LW V0,001C (A1) ADDIU V1,V1,0001 SW V1,0004 (A1) ADDIU V1,R0,0080 SW R0,0024 (A1) SW V1,0028 (A1) ADDIU V0,V0,0001 SW V0,001C (A1) JR RA NOP 80217550 ADDU A2,R0,R0 LUI V0,8024 ADDIU A1,V0,2C90 ADDIU A3,R0,0080 LW V0,0028 (A1) SRL V0,V0,0x1 BNE V0,R0,802175A0 SW V0,0028 (A1) LW V1,0004 (A1) LW V0,0014 (A1) LBU A0,0027 (A1) ADDU V0,V0,V1 SB A0,0000 (V0) LW V0,001C (A1) ADDIU V1,V1,0001 SW V1,0004 (A1) SW R0,0024 (A1) SW A3,0028 (A1) ADDIU V0,V0,0001 SW V0,001C (A1) ADDIU A2,A2,0001 SLTI V0,A2,0007 BNE V0,R0,80217560 NOP JR RA NOP 802175B8 LUI A2,8024 ADDIU A1,A2,2C90 LW V0,0030 (A1) SRL V0,V0,0x1 BNE V0,R0,802175F4 SW V0,0030 (A1) LW V1,2C90 (A2) LW V0,0010 (A1) ADDU V0,V0,V1 ADDIU V1,V1,0001 LBU A0,0000 (V0) ADDIU V0,R0,0080 SW V1,2C90 (A2) SW V0,0030 (A1) SW A0,002C (A1) LW V0,002C (A1) LW V1,0030 (A1) AND V0,V0,V1 JR RA SLTU V0,R0,V0 80217608 likely data ;SW V0,0018 (T2) ;ADDIU V0,R0,0C15 80217610 clear LCD display ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 802176B4 ;save 0200 to hardware + 600 ADDIU A0,R0,0200 ;A0=200 JAL 80217654 ;reset LCD state to A0 ADDU A0,R0,R0 ;A0=0: reset state JAL 802067F0 ;display A0 to LCD screen ADDU A0,R0,R0 ;A0=0 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8021763C stall 190 cycles ADDIU V0,R0,00BF ;V0=BF ADDIU V0,V0,FFFF //80217644: BGEZ V0,80217644 ;loop 190 times ADDIU V0,V0,FFFF JR RA NOP 80217654 reset LCD state to A0 accepts: A0=state | nibble ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 80206228 ;V0=80227440: prev.w.port ADDU S0,A0,R0 ;S0=A0: flags LUI V1,E0E0 ORI V1,V1,E0E0 AND V0,V0,V1 ;V0&=E0E0E0E0: mask away 1F1F1F1F ANDI S0,S0,00FF ;S0->byte SLL V1,S0,0x18 SLL A0,S0,0x10 OR V1,V1,A0 SLL A0,S0,0x8 OR V1,V1,A0 OR V1,V1,S0 ;V1=[A0.A0.A0.A0] OR V0,V0,V1 ;V0|=V1: set flags in each byte of register LUI AT,BE60 SW V0,FFFC (AT) ;V0->BE5FFFFC: LCD controller JAL 8021763C ;stall 190 cycles NOP LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 802176B4 save A0 to hardware + 600 accepts: A0=value ADDIU SP,SP,FFE8 SLL A1,A0,0x10 ;A1=(short) A0 ADDIU A0,R0,0600 ;A0=600 SW RA,0010 (SP) JAL 80217C8C ;save A1->hardware + A0 SRA A1,A1,0x10 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 802176D8 read word from cur. hardware address; redirects to 80217C50: A0=0 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80217C50 ;V0=word from cur.hardware address + A0 ADDU A0,R0,R0 ;A0=0 LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 802176F4: V0=nibble read from port; A0->port ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: source nibble SW RA,0018 (SP) JAL 802185CC ;V0=COP0 Status SW S1,0014 (SP) ADDU S1,V0,R0 ;S1=COP0 Status ADDIU A0,R0,FFFE JAL 802185DC ;A0->COP0 Status AND A0,S1,A0 ;A0=Status & ~1 //8021771C: await "pending" flag set JAL 802176D8 ;V0=word at cur. hardware address NOP ANDI V0,V0,0010 BEQ V0,R0,8021771C ;loop until 0x10 set NOP //80217730: await "pending" flag set JAL 802176D8 ;V0=word at cur. hardware address NOP ANDI V0,V0,0010 BEQ V0,R0,80217730 ;loop until 0x10 set NOP //80217744: read nibble, then send your own JAL 802176D8 ;V0=word at cur. hardware address NOP ANDI A0,S0,000F ;A0=source & F: 1 nibble ORI A0,A0,0010 ;A0=1x: pending flag JAL 80217654 ;reset LCD state to A0 ANDI S0,V0,000F ;S0=(nibble) value from port //8021775C: await "pending" flag reset JAL 802176D8 ;V0=word at cur. hardware address NOP ANDI V0,V0,0010 BNE V0,R0,8021775C ;loop while 0x10 set NOP //80217770: await "pending" flag reset JAL 802176D8 ;V0=word at cur. hardware address NOP ANDI V0,V0,0010 BNE V0,R0,80217770 ;loop while 0x10 set NOP //80217784: reset Status JAL 80217654 ;reset LCD state to A0 ADDU A0,R0,R0 ;A0=0 JAL 802185DC ;A0->COP0 Status ADDU A0,S1,R0 ;A0=S1: Status //80217794: return ADDU V0,S0,R0 ;V0=S0: output nibble LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 802177AC V0=byte read from port; A0->port ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 ;S0=A0: source byte SW RA,0014 (SP) JAL 802176F4 ;read/write nibble to/from port SRA A0,S0,0x4 ;A0=upper nibble ADDU A0,S0,R0 ;A0=S0: source byte JAL 802176F4 ;read/write nibble to/from port ADDU S0,V0,R0 ;S0=V0: output byte--upper nibble SLL S0,S0,0x4 ;S0=set data as upper nibble OR V0,S0,V0 ;V0=upper nibble | lower nibble: output byte LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 802177E8 V0=short read from port; A0->port ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,0014 (SP) JAL 802177AC SRA A0,S0,0x8 ADDU A0,S0,R0 JAL 802177AC ADDU S0,V0,R0 SLL S0,S0,0x8 OR V0,S0,V0 LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80217824 V0=word read from port; A0->port ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,0014 (SP) JAL 802177E8 ;V0=read/write short to/from port SRA A0,S0,0x10 ADDU A0,S0,R0 JAL 802177E8 ;V0=read/write short to/from port ADDU S0,V0,R0 SLL S0,S0,0x10 OR V0,S0,V0 ;V0|=S0: word from PC LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80217860 ADDIU SP,SP,FFD8 SW S0,0010 (SP) ADDU S0,R0,R0 SW S3,001C (SP) ADDIU S3,R0,000F SW S2,0018 (SP) ADDIU S2,R0,000E SW S1,0014 (SP) ADDIU S1,R0,000A SW RA,0020 (SP) JAL 802176F4 ADDU A0,R0,R0 BNE V0,S3,802178C8 NOP JAL 802176F4 ADDIU A0,R0,000F BNE V0,R0,802178C8 NOP JAL 802176F4 ADDIU A0,R0,000A BNE V0,S2,802178C8 NOP JAL 802176F4 ADDIU A0,R0,000E BEQL V0,S1,802178C8 ADDIU S0,R0,0001 BEQ S0,R0,80217888 NOP LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 802178EC ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,0014 (SP) LBU V0,0000 (S0) BEQ V0,R0,80217920 NOP LBU A0,0000 (S0) JAL 802177AC ADDIU S0,S0,0001 LBU V0,0000 (S0) BNE V0,R0,80217908 NOP LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80217930 cycle GS activity display, returning V0=value on port or 0 ADDIU SP,SP,FFE8 LUI A0,8022 LW V0,7D14 (A0) ;V0=80227D14: LCD display timer ADDIU V1,R0,000B ;V1=0xB SW RA,0010 (SP) ADDIU V0,V0,0001 ;V0++ BNE V0,V1,8021798C ;branch if not 0xB; cycle from 0-10 with each letter SW V0,7D14 (A0) ;increment 80227D14: LCD display timer //80217950: cycle 80227D10 through 'a','b','c','g': LCD B,LL,M,LR LUI A1,8022 LBU V0,7D10 (A1) ;V0=80227D10: LCD display code ADDIU V1,R0,0064 ;V1=64: 'd' SW R0,7D14 (A0) ;0->80227D14: LCD display timer ADDIU V0,V0,0001 ;V0++ SB V0,7D10 (A1) ;increment 80227D10: LCD display code //80217968: skip from 'c' to 'g' ANDI V0,V0,00FF BNE V0,V1,80217978 ;if V0 is 'd', set to 'g' ADDIU V0,R0,0067 ;V0=67: 'g' SB V0,7D10 (A1) ;'g'->80227D10: LCD display code //80217978: wrap around from g->a LBU V1,7D10 (A1) ;V1=80227D10: LCD display code ADDIU V0,R0,0068 ;V0=68: 'h' BNE V1,V0,8021798C ;if V0 is 'h', set to 'a' ADDIU V0,R0,0061 SB V0,7D10 (A1) ;'a'->80227D10: LCD display code //8021798C: test "pending" flag set JAL 802176D8 ;V0=word at cur. hardware address NOP ANDI V0,V0,0010 BEQ V0,R0,802179AC ;skip if port not ready ADDU V0,R0,R0 ;return 0 by default //802179A0: retrieve value from port JAL 802176D8 ;V0=word at cur. hardware address NOP ANDI V0,V0,000F ;V0=nibble on port //802179AC: return LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 802179B8 LBU V1,0001 (A1) ADDIU V0,R0,004D ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,0014 (SP) LBU V0,0000 (S0) BEQ V0,R0,802179F4 NOP LBU A0,0000 (S0) JAL 802177AC ADDIU S0,S0,0001 LBU V0,0000 (S0) BNE V0,R0,802179DC NOP LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80217A04 ADDIU SP,SP,FFE8 ANDI A0,A0,000F SLTI V0,A0,000A BNE V0,R0,80217A20 SW RA,0010 (SP) J 80217A24 ADDIU A0,A0,0037 ADDIU A0,A0,0030 JAL 802177AC NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80217A38 ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,0014 (SP) JAL 80217A04 SRA A0,S0,0x4 JAL 80217A04 ADDU A0,S0,R0 LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80217A68 ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,0014 (SP) JAL 80217A38 SRA A0,S0,0x8 JAL 80217A38 ADDU A0,S0,R0 LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80217A98 ADDIU SP,SP,FFE8 SW S0,0010 (SP) ADDU S0,A0,R0 SW RA,0014 (SP) JAL 80217A68 SRA A0,S0,0x10 JAL 80217A68 ADDU A0,S0,R0 LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80217AC8 ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,A0,R0 SW S1,0014 (SP) ADDU S1,A1,R0 LUI V0,8022 SW S2,0018 (SP) ADDIU S2,V0,45C0 BGEZ S0,80217B04 SW RA,001C (SP) BEQ A2,R0,80217B04 NOP JAL 802177AC ADDIU A0,R0,002D SUBU S0,R0,S0 DIVU S0,S1 BNE S1,R0,80217B14 NOP BREAK 00001C00 MFLO A0 MFHI S0 BEQ A0,R0,80217B2C ADDU A1,S1,R0 JAL 80217AC8 ADDU A2,R0,R0 ADDU V0,S2,S0 LBU A0,0000 (V0) JAL 802177AC NOP LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80217B54 save A0-A3 to stack originally served as a formatted debug output, like printf(A0,A1,...) SW A0,0000 (SP) SW A1,0004 (SP) SW A2,0008 (SP) SW A3,000C (SP) ADDIU SP,SP,FFF0 JR RA ADDIU SP,SP,0010 80217B70 does nothing ADDIU SP,SP,FFF0 JR RA ADDIU SP,SP,0010 80217B7C initialize hardware address to parallel port register LUI V1,8022 LUI V0,0040 SW V0,7D30 (V1) ;400000->80227D30: bank = 4MB LUI V1,8022 LUI V0,BE00 JR RA SW V0,7D34 (V1) ;BE000000->80227D34: hardware address = GS/AR ROM 80217B98: likely unimportant ;NOP ;ADDU V1,R0,R0 80217BA0 V0=byte from hardware address A0 accepts: A0=hardware address ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A0,R0 ;S1=A0: p->hardware LUI V0,AFFF ORI V0,V0,FFFF SLTU V0,V0,S1 ;V0=hardware & AFFFFFFF: address mask SW RA,001C (SP) SW S2,0018 (SP) BNE V0,R0,80217BD4 ;branch if valid address SW S0,0010 (SP) //80217BC8: LBU V0,0000 (S1) ;V0=S1+0: byte from unmasked address J 80217C38 NOP //80217BD4: LUI A0,8022 LW V0,7D20 (A0) ;V0=80227D20: p->target BNE V0,R0,80217BFC ;branch if pointer already set LUI S2,8022 LUI V0,8024 ADDIU V0,V0,F010 ;V0=8023F010 ADDIU V0,V0,000F ADDIU V1,R0,FFF0 AND V0,V0,V1 ;V0=8023F010, technically rounded up to quadword which it already was SW V0,7D20 (A0) ;V0->80227D20: 8023F010 //80217BFC: LW V0,7D24 (S2) ;V0= 80227D24: previous hardware address LW S0,7D20 (A0) ;S0= 80227D20: p->target SUBU V1,S1,V0 ;V1=S1-V0: difference between current and previous hardware addresses SLTIU V0,V1,1000 BNE V0,R0,80217C34 ;branch if < 1000 bytes ADDU V0,S0,V1 ;V0=target+size //80217C14: ADDU A0,S0,R0 ;A0=S0: target ADDU A1,S1,R0 ;A1=S1: hardware source address JAL 80217D3C ;copy A2 bytes from A1 to A0 ADDIU A2,R0,1000 ;A2=1000 SW S1,7D24 (S2) ;S1->80227D24: save hardware address LBU V0,0000 (S0) ;V0=first byte of data J 80217C38 NOP //80217C34: LBU V0,0000 (V0) ;V0=value at target+size //80217C38: return LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80217C50 read word from current hardware address | A0 accepts: A0=offset to preset hardware target ADDIU SP,SP,FFE8 LUI V0,8022 LUI V1,8022 SW S0,0010 (SP) LW S0,7D34 (V0) ;S0=80227D34: hardware target LW V0,7D30 (V1) ;V0=80227D30: bank SW RA,0014 (SP) OR S0,S0,V0 ;S0=hardware | bank JAL 80217D20 ;wait until PI ready OR S0,S0,A0 ;S0=hardware | bank | offset: final address LW V0,0000 (S0) ;V0=hardware address: value from hardware address //80217C7C: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80217C8C save A1 to offset A0 at hardware target accepts: A0=offset, A1=(short) value ADDIU SP,SP,FFE8 ANDI A1,A1,FFFF SLL V1,A1,0x10 ;V1=A1*10000: short->upper half of word LUI V0,8022 LUI A2,8022 LW V0,7D34 (V0) ;V0=80227D34: hardware target LW A2,7D30 (A2) ;A2=80227D30: bank OR V1,V1,A1 ;V1|=A1: 00A100A1 SW RA,0010 (SP) OR V0,V0,A2 ;V0|=A2: target | bank OR V0,V0,A0 ;V0|=A0: target | bank | offset SW V1,0000 (V0) ;V1->hardware JAL 80217D20 ;wait until PI ready NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80217CD0 sets new hardware address A0; root of address saved to cur. hardware address+400 accepts: A0=p->hardware address ADDIU SP,SP,FFE8 LUI V0,0F00 SW S0,0010 (SP) AND S0,A0,V0 ;S0=addy & F000000: root of address LUI V0,1000 OR S0,S0,V0 ;S0|=10000000: normal hardware range, for sys access ADDIU A0,R0,0400 ;A0=400: offset in bank SW RA,0014 (SP) JAL 80217C8C ;save A1->hardware + A0 SRL A1,S0,0x18 ;A1=addy>>18: hardware address byte LUI V1,8022 LUI V0,B000 LW RA,0014 (SP) OR S0,S0,V0 ;S0|=B0000000: hardware address extension SW S0,7D34 (V1) ;S0->80227D34: save hardware target LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80217D18 probably fill ;LW V0,0018 (V0) ;ANDI V0,V0,0003 80217D20 wait for PI Status clear LUI V1,A460 LW V0,0010 (V1) ;V0=PI+10: Status ANDI V0,V0,0003 BNE V0,R0,80217D24 ;loop until ready NOP JR RA NOP 80217D3C copy A2 bytes from hardware A1 to dram A0 accepts: A0=p->dram target, A1=p->hardware source, A2=size ADDIU SP,SP,FFD8 SW S1,0014 (SP) ADDU S1,A0,R0 ;S1=A0: p->target SW S3,001C (SP) ADDU S3,A1,R0 ;S3=A1: p->source SW S2,0018 (SP) ADDU S2,A2,R0 ;S2=A2: size SW RA,0020 (SP) JAL 80217D20 ;wait for PI status to clear SW S0,0010 (SP) BLEZ S2,80217D84 ;branch if invalid size ADDU S0,R0,R0 ;S0=0 count //80217D6C: cache target JAL 80218598 ;cache target ADDU A0,S1,S0 ;A0=S1+S0: target+offset ADDIU S0,S0,0004 ;S0+=4 next word SLT V0,S0,S2 BNE V0,R0,80217D6C ;loop for size NOP //80217D84: LUI V1,1FFF ORI V1,V1,FFFF ;V1=1FFFFFFF: hardware mask ADDIU S0,R0,03E7 ;S0=999 count LUI A0,A460 AND V0,S1,V1 ;V0=target & mask AND V1,S3,V1 ;V1=source & mask SW V0,0000 (A0) ;V0->PI dram target ADDIU V0,S2,FFFF ;V0=size-- size for PI transfer SW V1,0004 (A0) ;V1->PI hardware source SW V0,000C (A0) ;V0->PI write length ADDIU S0,S0,FFFF //80217DB0: loop for 999 cycles BGEZ S0,80217DB0 ADDIU S0,S0,FFFF JAL 80217D20 ;wait for PI status to clear NOP //80217DC0: return LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80217DDC likely fill ;ADDU V0,V0,V1 80217DE0 set short #A0 in ROM to A1 accepts: A0=word within mirror &1 of GS ROM, A1=value ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A1,R0 ;S1=A1: value LUI V1,0001 ORI V1,V1,FFFE ;V1=1FFFE: mask for offset within bank LUI V0,8022 SW S0,0010 (SP) LW S0,7D34 (V0) ;S0=80227D34: hardware target LUI V0,00E0 SW RA,0018 (SP) OR S0,S0,V0 ;S0=hardware | E00000: GS ROM range, unless something funny happens ANDI V0,A0,0001 ;V0=offset&1: F0 bank flag SLL V0,V0,0x14 ;V0=flag * 100000: switch between F0 and E0 bank OR S0,S0,V0 ;S0=hardware | E00000 | 100000 AND A0,A0,V1 ;A0&=1FFFE SLL A0,A0,0x1 ;A0*=2: A0->word offset (3FFFC) JAL 80217D20 ;wait until PI ready OR S0,S0,A0 ;S0=hardware | E00000 | 100000 | 3FFFC: hardware address within GS ROM domain SLL S1,S1,0x10 ;S1*=10000: set short in upper half of word JAL 80217D20 ;wait until PI ready SW S1,0000 (S0) ;S1->target LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80217E48 V0=short #A0 in GS ROM accepts: A0=word within mirror &1 of GS ROM ADDIU SP,SP,FFE0 LUI A1,0001 ORI A1,A1,FFFE ;A1=1FFFE: mask for offset within bank LUI V0,8022 LW V1,7D34 (V0) ;V1=80227D34: hardware target LUI V0,00E0 SW S0,0010 (SP) ANDI S0,A0,0001 ;S0=offset&1: F0 bank flag AND A0,A0,A1 ;A0&=1FFFE SLL A0,A0,0x1 ;A0*=2: A0->word offset (3FFFC) SW RA,0018 (SP) SW S1,0014 (SP) OR S1,V1,V0 ;S1=hardware | E00000: bank# SLL V0,S0,0x14 ;V0=flag * 100000: switch between F0 and E0 bank OR S1,S1,V0 ;S1=hardware | E00000 | 100000 JAL 80217D20 ;wait until PI ready OR S1,S1,A0 ;S1=hardware | E00000 | 100000 | 3FFFC: hardware address within GS ROM domain LW S1,0000 (S1) ;S1=hardware+0: word at address BEQL S0,R0,80217E98 ;branch if E0 bank SRA S1,S1,0x10 ;S1>>10: upper short, because of the freaking psycho memory access method //80217E98: JAL 80217D20 ;wait until PI ready ANDI S1,S1,FFFF ;S1=short at address, BECAUSE INSTEAD OF SANE PI ACCESS THEY PULL UPPER AND LOWER SHORT... ADDU V0,S1,R0 ;V0=(short) at hardware address LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80217EB8 ADDIU SP,SP,FFE8 ADDIU V0,R0,03E7 ;V0=999 SW RA,0014 (SP) SW S0,0010 (SP) ADDIU V0,V0,FFFF ;V0-- //80217ECC: loop 999 times BGEZ V0,80217ECC ADDIU V0,V0,FFFF ;V0-- //80217ED4: JAL 80217E48 ;V0=short #A0 in GS ROM ADDU A0,R0,R0 ;A0=0: boot address ADDU A0,R0,R0 ;A0=0: boot address JAL 80217E48 ;V0=short #A0 in GS ROM ANDI S0,V0,4040 ANDI V0,V0,4040 BNE S0,V0,80217ED4 ;loop until two samples match NOP //80217EF4: return LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80217F04 write A2 bytes from A1 to hardware A0 accepts: A0=hardware address, A1=p->source, A2=size ADDIU SP,SP,FFD0 SW S3,001C (SP) ADDU S3,A0,R0 ;S3=A0: p->hardware SW S2,0018 (SP) ADDU S2,A2,R0 ;S2=A2: size SW S4,0020 (SP) ADDIU S4,R0,0061 ;S4=61: SW S1,0014 (SP) ADDU S1,A1,R0 ;S1=A1: p->source SW RA,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) JAL 802185CC ;V0=COP0 Status SW S0,0010 (SP) ADDU S5,V0,R0 ;S5=Status ADDIU A0,R0,FFFE JAL 802185DC ;A0->COP0 Status AND A0,S5,A0 ;A0=Status & ~1 ADDIU S2,S2,00FF ;S2+=FF: round up 0x100 SRA S2,S2,0x8 ;S2/=0x100 JAL 80217EB8 SRA S3,S3,0x1 ;S3/=2 BEQ S2,R0,80217FF4 ;quit if no data ADDIU S6,R0,0067 ;S6=67: 'g': letter code to loop at ANDI V0,S2,003F //80217F68: BNE V0,R0,80217F8C ADDIU A0,R0,5555 JAL 802067F0 ;display A0 to LCD screen ANDI A0,S4,00FF ADDIU S4,S4,0002 ANDI V0,S4,00FF BEQL V0,S6,80217F88 ADDIU S4,R0,0061 //80217F88: ADDIU A0,R0,5555 ;A0=5555: 1EF0AAA8 JAL 80217DE0 ;set short #A0 in ROM to A1 ORI A1,R0,AAAA ;A1=AAAA ADDIU A0,R0,2AAA ;A0=2AAA: 1EE05554 JAL 80217DE0 ;set short #A0 in ROM to A1 ADDIU A1,R0,5555 ;A1=5555 ADDIU A0,R0,5555 ;A0=5555: 1EF0AAA8 JAL 80217DE0 ;set short #A0 in ROM to A1 ORI A1,R0,A0A0 ;A1=A0A0 ADDU S0,R0,R0 ;S0=0 init.count //80217FB0: copy in 0x100 byte chunk LBU A1,0000 (S1) ;A1=byte f/ source ADDIU S1,S1,0001 ;S1++ source++ LBU V0,0000 (S1) ;V0=next byte f/ source ADDIU S1,S1,0001 ;S1++ ADDU A0,S3,R0 ;A0=S3: p->hardware ADDIU S3,S3,0001 ;S3++ target++ ADDIU S0,S0,0001 ;S0++ count++ SLL A1,A1,0x8 JAL 80217DE0 ;set short #A0 in ROM to A1 OR A1,A1,V0 ;A1=short value from source SLTI V0,S0,0080 BNE V0,R0,80217FB0 ;loop for 0x100 bytes NOP //80217FE4: loop for whole file JAL 80217EB8 ADDIU S2,S2,FFFF ;S2-- size-- BNE S2,R0,80217F68 ;loop for entire file ANDI V0,S2,003F //80217FF4: JAL 802185DC ;A0->COP0 Status ADDU A0,S5,R0 ;A0=S5: original Status //80217FFC: return LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 80218024 V0=0 if A2 bytes at hardware A0 and dram A1 match or -1 if failed accepts: A0=p->hardware, A1=p->dram, A2=size ADDIU SP,SP,FFE0 SW S2,0018 (SP) ADDU S2,A1,R0 ;S2=A1: p->dram SW S1,0014 (SP) ADDIU S1,A2,00FF ADDIU V0,R0,FF00 AND S1,S1,V0 ;S1=size->rounded up to 0x100 boundry LUI V1,00C0 LUI V0,8022 LW V0,7D34 (V0) ;V0=80227D34: p->hardware target OR A0,A0,V1 ;A0=hardware | C00000 SW RA,001C (SP) SW S0,0010 (SP) BEQ S1,R0,8021808C ;return SUCCESS if size zero OR S0,A0,V0 ;S0=A0|V0: hardware | C00000 | offset ADDU A0,S0,R0 ;A0=p->hardware //80218064: JAL 80217BA0 ;V0=byte from hardware address A0 ADDIU S0,S0,0001 ;S0++ hardware++ LBU V1,0000 (S2) ;V1=p->dram BEQ V0,V1,80218080 ;branch if equal ADDIU S2,S2,0001 ;S2++ dram++ J 80218090 ;return FAILED! (V0= -1) ADDIU V0,R0,FFFF //80218080: ADDIU S1,S1,FFFF ;S1-- size-- BNE S1,R0,80218064 ;loop for size ADDU A0,S0,R0 ;A0=S0: p->hardware //8021808C: return SUCCESS ADDU V0,R0,R0 //80218090: LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 802180A8 copy A2 bytes from hardware A0 to A1 accepts: A0=hardware offset, A1=p->target, A2=size ADDIU SP,SP,FFE0 SW S2,0018 (SP) ADDU S2,A1,R0 ;S2=A1: p->target SW S1,0014 (SP) ADDIU S1,A2,00FF ;S1=A2+FF ADDIU V0,R0,FF00 AND S1,S1,V0 ;S1=A2 to nearest 0x100 byte boundry LUI V1,00C0 LUI V0,8022 LW V0,7D34 (V0) ;V0=80227D34: p->hardware target OR A0,A0,V1 ;A0|=C00000 SW RA,001C (SP) SW S0,0010 (SP) BEQ S1,R0,80218100 ;skip if size invalid OR S0,A0,V0 ;S0=hardware | C00000 | offset //802180E4: loop to copy data from ROM to dram ADDU A0,S0,R0 ;A0=S0: p->hardware source JAL 80217BA0 ;V0=byte from hardware address A0 ADDIU S0,S0,0001 ;S0++ source++ SB V0,0000 (S2) ;V0->target ADDIU S1,S1,FFFF ;S1-- count-- BNE S1,R0,802180E4 ;loop for block of data ADDIU S2,S2,0001 ;S2++ target++ //80218100: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP //80218108: return LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80218120 ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80217EB8 NOP ADDIU A0,R0,5555 JAL 80217DE0 ;set short #A0 in ROM to A1 ORI A1,R0,AAAA ADDIU A0,R0,2AAA JAL 80217DE0 ;set short #A0 in ROM to A1 ADDIU A1,R0,5555 ADDIU A0,R0,5555 JAL 80217DE0 ;set short #A0 in ROM to A1 ORI A1,R0,8080 ADDIU A0,R0,5555 JAL 80217DE0 ;set short #A0 in ROM to A1 ORI A1,R0,AAAA ADDIU A0,R0,2AAA JAL 80217DE0 ;set short #A0 in ROM to A1 ADDIU A1,R0,5555 ADDIU A0,R0,5555 JAL 80217DE0 ;set short #A0 in ROM to A1 ADDIU A1,R0,1010 JAL 80217EB8 NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 8021818C probably filler ;SW V0,0000 (A0) 80218190 set normal GS hook LUI T0,8000 ORI T0,T0,0180 ;T0=80000180 LUI T1,8022 ADDIU T1,T1,81F0 ;T1=802181F0 ADDIU K0,R0,0014 ;K0=14 loop counter ADDIU K1,R0,FFFF ;K1=-1 //802181A8: LW T2,0000 (T1) ;T2=802181F0: NOP SW T2,0000 (T0) ;T2->80000180: ADDI T0,T0,0004 ;T0+=4: next ADDI T1,T1,0004 ;T1+=4: next ADD K0,K0,K1 ;K0-- BGTZ K0,802181A8 ;loop 20 times NOP //802181C8: set Watch to trigger GS interrupt ADDIU T0,R0,0181 MTC0 T0,WatchLo ;00000181->WatchLo NOP MTC0 R0,WatchHi ;0->WatchHi NOP JR RA NOP 802181E4 JR 80600000 LUI K0,8060 JR K0 NOP 802181F0 normal exception handler hook copied to 80000180 MFC0 K0,Cause/DPC-Buf.Busy ;K0=COP0 Cause ORI K1,R0,005C ANDI K0,K0,007C BEQ K0,K1,80218230 NOP BNE K0,R0,80218224 NOP LUI K0,A430 LW K0,0008 (K0) ;K0=A4300008: MIPS interrupt reg NOP ANDI K1,K0,0002 BNE K1,R0,8021822C ;branch if interrupt set NOP //80218224: J 80000120 NOP //8021822C: J 80000204 //80218230: jump to code in GS ROM LUI K0,BEC2 ORI K0,K0,F000 ;K0=BEC2F000 JR K0 NOP 80218240 set special hook CC type LUI T0,8000 ORI T0,T0,0180 ;T0=80000180 LUI T1,8022 ADDIU T1,T1,8308 ;T1=80218308 ADDIU K0,R0,0008 ADDIU K1,R0,FFFF //80218258: copy block LW T2,0000 (T1) ;T2=80218308+offset NOP SW T2,0000 (T0) ;T2->80000180+offset ADDI T0,T0,0004 ;T0+=4 ADDI T1,T1,0004 ;T1+=4 ADD K0,K0,K1 ;K0-- BGTZ K0,80218258 ;loop 8 times NOP //80218278: LUI T0,8000 ORI T0,T0,02C0 ;T0=800002C0 LUI T1,8022 ADDIU T1,T1,82CC ;T1=802182CC ADDIU K0,R0,0010 ;K0=10 ADDIU K1,R0,FFFF ;K1=-1 //80218290: copy block LW T2,0000 (T1) ;T2=802182CC+offset: NOP SW T2,0000 (T0) ;T2->800002C0+offset: ADDI T0,T0,0004 ;T0+=4 ADDI T1,T1,0004 ;T1+=4 ADD K0,K0,K1 ;K0-- BGTZ K0,80218290 ;loop 16 times NOP //802182B0: set Watch to trigger GS interrupt ADDIU T0,R0,0181 MTC0 T0,WatchLo ;00000181->WatchLo NOP MTC0 R0,WatchHi ;0->WatchHi NOP JR RA NOP 802182CC special exception handler hook copied to 800002C0 MFC0 K0,Cause/DPC-Buf.Busy ORI K1,R0,005C ANDI K0,K0,007C BEQ K0,K1,80218300 NOP BNE K0,R0,802182F8 LUI K0,A430 LW K0,0008 (K0) ;K0=MIPS interrupt mask ANDI K1,K0,0002 BNE K1,R0,802182F8 NOP //802182F8: J 80000204 NOP //80218300: redirect to GS ROM jump J 80000190 NOP 80218308 redirect to special exception hook copied to 80000180 LUI K0,8000 ORI K0,K0,02C0 ;K0=800002C0 JR K0 NOP //80218318: jump to code in GS ROM copied to 80000190 LUI K0,BEC2 ORI K0,K0,F000 ;K0=BEC2F000 JR K0 NOP 80218328 looks an awful lot like the "active code" handler found in the trainer... Executes a list of 8n and Dn code types. Active codelist found at 80000200. ADDIU SP,SP,FFEC SW A0,0000 (SP) SW A1,0004 (SP) SW A2,0008 (SP) SW A3,000C (SP) SW T6,0010 (SP) LUI A0,8000 LW A0,0200 (A0) ;A0=80000200: p->codelist LW A3,0000 (A0) ;A3=#codes BEQ A3,R0,802183F0 ;branch if none //80218350: test if conditional codetype LWL A1,0004 (A0) LWR A1,0007 (A0) ;A1=code::command LUI K0,D000 AND K1,A1,K0 BNE K1,K0,802183C0 ;branch if not Dn codetype LH A2,0008 (A0) ;A2=code::data LUI K0,0100 AND K1,A1,K0 ;K1=TRUE if data halfword, not byte LUI K0,80FF ORI K0,K0,FFFF ;K0=80FFFFFF: code address mask BGTZ K1,80218388 ;branch if halfword test AND A1,A1,K0 ;A1=code::address BEQ K1,K1,8021838C LB T6,0000 (A1) ;T6=byte at address //80218388: pull halfword LH T6,0000 (A1) ;T6=halfword at address LUI K0,0200 AND K1,A1,K0 BEQ K1,K0,802183AC ;branch if NOT test NOP BEQ T6,A2,802183E4 ;branch if data identical NOP BEQ K1,K1,802183B4 NOP //802183AC: handle NOT equal BNE T6,A2,802183E4 ;branch if data different NOP //802183B4: skip next code if strange ADDI A3,A3,FFFF ;A3-- count-- BEQ K1,K1,802183E4 ;loop for next code ADDI A0,A0,0006 ;A0+=6: next code //802183C0: assume 8n type LUI K0,0100 AND K1,A1,K0 LUI K0,80FF ORI K0,K0,FFFF ;K0=80FFFFFF: code::address mask BGTZ K1,802183E0 ;branch if halfword write AND A1,A1,K0 ;A1=code::address BEQ K1,K1,802183E4 ;byte write SB A2,0000 (A1) ;code::data->code::address //802183E0: halfword write SH A2,0000 (A1) //802183E4: next code ADDI A3,A3,FFFF ;A3-- count-- BGTZ A3,80218350 ;loop for all codes ADDI A0,A0,0006 ;A0+=6: next code //802183F0: return LW A0,0000 (SP) LW A1,0004 (SP) LW A2,0008 (SP) LW A3,000C (SP) LW T6,0010 (SP) J 80000120 ADDIU SP,SP,0014 8021840C start game with cheats ON accepts: A0=p->function, A1=p->source, A2=p->cheats at execution ADDU T3,A0,R0 ;T3=A0: p->function LUI K0,0004 //80218414: copy 1MB data from A1 to A0 LW A3,0000 (A1) ;A3=A1+0 NOP SW A3,0000 (A0) ;A3->A0+0 ADDI A0,A0,0004 ;A0+=4 next target ADDI A1,A1,0004 ;A1+=4 next source ADDIU K0,K0,FFFF ;K0-- count-- BGTZ K0,80218414 ;loop 40000 times NOP //80218434: apply Fn- cheats in table ADDIU K0,R0,FFFF LW A0,0000 (A2) ;A0=A2+0: code::command BEQ K0,A0,80218478 ;quit if invalid code NOP LW A1,0004 (A2) ;A1=code::data LUI K0,0100 AND K1,A0,K0 ;K1=nonzero if 2byte code LUI K0,80FF ORI K0,K0,FFFF ;K0=80FFFFFF: address mask BGTZ K1,80218468 ;branch if short write AND A0,A0,K0 ;A0&=mask: address BEQ K1,K1,8021846C SB A1,0000 (A0) ;(byte)code:data->address //80218468: short write SH A1,0000 (A0) ;code:data->address ADDI A2,A2,0008 ;A2+=8: next entry in table BEQ A3,A3,80218434 ;loop through list NOP //80218478: don't allow writeback in first 3K LUI T0,8000 ADDIU T1,T0,3000 ;T1=80003000 ADDIU T1,T1,FFF0 //80218484: cache for 80000000 through 80003000 CACHE 0000 (T0), D, Index Writeback Invalidate SLTU AT,T0,T1 BNE AT,R0,80218484 ;loop for 3K ADDIU T0,T0,0010 ;T0+=10 LUI T0,8000 ADDIU T1,T0,6000 ;T1=80006000 ADDIU T1,T1,FFE0 //802184A0: invalidate cache from 80000000 to 80006000 CACHE 0000 (T0), I, Index Invalidate SLTU AT,T0,T1 BNE AT,R0,802184A0 ;loop for 6k ADDIU T0,T0,0020 ;T0+=20 LUI SP,803F ORI SP,SP,FF00 ;SP=803FFF00: set stack at end of RAM JR T3 ;execute copied code NOP 802184C0 start game with cheats OFF accepts: A0=p->function, A1=p->source ADDU T3,A0,R0 ;T3=A0: p->function target LUI K0,0004 //802184C8: copy 1MB from A1 to A0 for later execution LW A3,0000 (A1) ;A3=A1+0 NOP SW A3,0000 (A0) ;A3->A0+0 ADDI A0,A0,0004 ;A0+=4 target++ ADDI A1,A1,0004 ;A1+=4 source++ ADDIU K0,K0,FFFF ;K0-- count-- BGTZ K0,802184C8 ;loop 40000 times NOP LUI T0,8000 ADDIU T1,T0,3000 ;T1=80003000 ADDIU T1,T1,FFF0 //802184F4: invalidate writeback from 80000000 to 80003000 CACHE 0000 (T0), D, Index Writeback Invalidate SLTU AT,T0,T1 BNE AT,R0,802184F4 ;loop for 3K bytes ADDIU T0,T0,0010 ;T0+=10 LUI T0,8000 ADDIU T1,T0,6000 ;T1=80006000 ADDIU T1,T1,FFE0 //80218510: invalidate cache from 80000000 to 80006000 CACHE 0000 (T0), I, Index Invalidate SLTU AT,T0,T1 BNE AT,R0,80218510 ;loop for 6K bytes ADDIU T0,T0,0020 ;T0+=20 LUI SP,803F ORI SP,SP,FF00 ;SP=803FFF00: set stack pointer JR T3 NOP 80218530 set stack pointer to A0 ADDU SP,A0,R0 ;SP=A0 JR RA NOP 8021853C: invalidate any CACHE work on first 6K of RAM ADDIU SP,SP,FFE4 SW T0,0010 (SP) SW T1,0014 (SP) SW AT,0018 (SP) LUI T0,8000 ADDIU T1,T0,3000 ADDIU T1,T1,FFF0 ;T1=80002FF0 //80218558: CACHE 0000 (T0), D, Index Writeback Invalidate SLTU AT,T0,T1 BNE AT,R0,80218558 ;loop from 80000000-80003000 ADDIU T0,T0,0010 ;T0+=10 LUI T0,8000 ADDIU T1,T0,6000 ADDIU T1,T1,FFE0 ;T1=80005FE0 //80218574: CACHE 0000 (T0), I, Index Invalidate SLTU AT,T0,T1 BNE AT,R0,80218574 ;loop from 80000000-80006000 ADDIU T0,T0,0020 ;T0+=20 //80218584: return LW T0,0010 (SP) LW T1,0014 (SP) LW AT,0018 (SP) JR RA ADDIU SP,SP,001C 80218598: cache target A0 for PI write CACHE 0000 (A0), D, Hit Writeback Invalidate JR RA NOP 802185A4: redirect to A0 JR A0 NOP 802185AC: JAL to A0 ADDIU SP,SP,FFEC SW RA,0010 (SP) JALR RA,A0 NOP LW RA,0010 (SP) ADDIU SP,SP,0014 JR RA NOP 802185CC: V0=COP0 Status MFC0 V0,Status/DPC-Clock NOP JR RA NOP 802185DC: A0->COP0 Status MTC0 A0,Status/DPC-Clock NOP JR RA NOP 802185EC: V0=COP0 Cause MFC0 V0,Cause/DPC-Buf.Busy JR RA NOP 802185F8: V0=COP0 ExpectPC MFC0 V0,ExpectPC/DPC-Pipe Busy JR RA NOP 80218604: ADDIU SP,SP,FFE4 SW RA,0010 (SP) SW T0,0014 (SP) SW T1,0018 (SP) LUI T0,8022 ADDIU T0,T0,8630 ;T0=80218630 LUI T1,4085 OR T1,T1,A0 ;T1=40850000 | A0 SW T1,0000 (T0) ;T1->80218630: JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP MTC0 A1,Index/SP-Memory Address LW T1,0018 (SP) LW T0,0014 (SP) LW RA,0010 (SP) ADDIU SP,SP,001C JR RA NOP 8021864C: ADDIU SP,SP,FFE4 SW RA,0010 (SP) SW T0,0014 (SP) SW T1,0018 (SP) LUI T0,8022 ADDIU T0,T0,8678 LUI T1,4002 OR T1,T1,A0 SW T1,0000 (T0) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP MFC0 V0,Index/SP-Memory Address LW T1,0018 (SP) LW T0,0014 (SP) LW RA,0010 (SP) ADDIU SP,SP,001C JR RA NOP 80218694: copy and execute code at 807C5C00 ADDIU SP,SP,FFE4 SW T0,0014 (SP) SW T1,0018 (SP) LUI K0,A05F ORI K0,K0,AE00 ;K0=A05FAE00 LUI T0,A07C ADDIU K1,R0,0040 ;K1=40 //802186B0: copy next 64 OPs LW T1,5C00 (T0) ;T1=A07C5C00: source--uncached ADDI K1,K1,FFFF ;K1-- SW T1,0000 (K0) ;T1->A05FAE00: target--uncached ADDI T0,T0,0004 ;T0+=4 next OP BGTZ K1,802186B0 ;loop 64 times ADDI K0,K0,0004 ;K0+=4 next target //802186C8: execute copied code LW T1,0018 (SP) LW T0,0014 (SP) LUI K0,A05F ORI K0,K0,AE00 ;K0=A05FAE00: continue execution from here JR K0 ADDIU SP,SP,001C 802186E0: LW T7,0010 (SP) SLL T7,T7,0x1 ADDI A3,A3,FFFF ADDU T0,A0,R0 ADD A0,A0,T7 ADDU T1,A1,R0 ADDI A1,A1,0500 ADDU T2,A2,R0 LH V0,0000 (T0) ADDI T0,T0,0002 BEQ V0,R0,80218714 ADDI T2,T2,FFFF SH V0,0000 (T1) BNE T2,R0,80218700 ADDI T1,T1,0002 BNE A3,R0,802186EC ADDI A3,A3,FFFF JR RA NOP 8021872C: ADDI SP,SP,FFFC SW S0,0000 (SP) ADDI SP,SP,FFFC SW S1,0000 (SP) ADDI SP,SP,FFFC SW S6,0000 (SP) ADDI SP,SP,FFFC SW S7,0000 (SP) ADDIU S0,R0,0500 MULT A1,S0 MFLO S0 LUI A1,8025 LW A1,91D8 (A1) ADDIU S6,R0,002F ADD A1,A1,S0 ADD A0,A0,A0 ADD A1,A1,A0 LUI S0,DFFF ORI S0,S0,FFF8 AND A2,A2,S0 //8021877C: LD S0,0000 (A2) LD S1,0008 (A2) SD S0,0000 (A1) LD S0,0010 (A2) SD S1,0008 (A1) LD S1,0018 (A2) SD S0,0010 (A1) LD S0,0020 (A2) SD S1,0018 (A1) LD S1,0028 (A2) SD S0,0020 (A1) LD S0,0030 (A2) SD S1,0028 (A1) LD S1,0038 (A2) SD S0,0030 (A1) LD S0,0040 (A2) SD S1,0038 (A1) LD S1,0048 (A2) SD S0,0040 (A1) LD S0,0050 (A2) SD S1,0048 (A1) LD S1,0058 (A2) SD S0,0050 (A1) LD S0,0060 (A2) SD S1,0058 (A1) LD S1,0068 (A2) SD S0,0060 (A1) LD S0,0070 (A2) SD S1,0068 (A1) LD S1,0078 (A2) SD S0,0070 (A1) SD S1,0078 (A1) ADDI A1,A1,0500 ADDI A2,A2,0080 BNE S6,R0,8021877C ADDI S6,S6,FFFF //8021880C: LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP 80218834-80218840 fill 80218840-8021D040 pointer table: line-by-line char printing routines; 9 pointers per char, alternating between even and odd alignment 8021D040: draw character: "........" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D050: draw character: "....+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D064: draw character: "...+...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D078: draw character: "...++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D090: draw character: "..+....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D0A4: draw character: "..+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D0BC: draw character: "..++...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D0D4: draw character: "..+++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D0F0: draw character: ".+......" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D104: draw character: ".+..+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D11C: draw character: ".+.+...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D134: draw character: ".+.++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D150: draw character: ".++....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D168: draw character: ".++.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D184: draw character: ".+++...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D1A0: draw character: ".++++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D1C0: draw character: "+......." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D1D4: draw character: "+...+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D1EC: draw character: "+..+...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D204: draw character: "+..++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D220: draw character: "+.+....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D238: draw character: "+.+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D254: draw character: "+.++...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D270: draw character: "+.+++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D290: draw character: "++......" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D2A8: draw character: "++..+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D2C4: draw character: "++.+...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D2E0: draw character: "++.++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D300: draw character: "+++....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D31C: draw character: "+++.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D33C: draw character: "++++...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D35C: draw character: "+++++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D380: draw character: "......+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D394: draw character: "....+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D3AC: draw character: "...+..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D3C4: draw character: "...++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D3E0: draw character: "..+...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D3F8: draw character: "..+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D414: draw character: "..++..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D430: draw character: "..+++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D450: draw character: ".+....+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D468: draw character: ".+..+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D484: draw character: ".+.+..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D4A0: draw character: ".+.++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D4C0: draw character: ".++...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D4DC: draw character: ".++.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D4FC: draw character: ".+++..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D51C: draw character: ".++++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D540: draw character: "+.....+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D558: draw character: "+...+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D574: draw character: "+..+..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D590: draw character: "+..++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D5B0: draw character: "+.+...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D5CC: draw character: "+.+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D5EC: draw character: "+.++..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D60C: draw character: "+.+++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D630: draw character: "++....+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D64C: draw character: "++..+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D66C: draw character: "++.+..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D68C: draw character: "++.++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D6B0: draw character: "+++...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D6D0: draw character: "+++.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D6F4: draw character: "++++..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D718: draw character: "+++++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D740: draw character: ".....+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D754: draw character: "....++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D76C: draw character: "...+.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D784: draw character: "...+++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D7A0: draw character: "..+..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D7B8: draw character: "..+.++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D7D4: draw character: "..++.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D7F0: draw character: "..++++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D810: draw character: ".+...+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D828: draw character: ".+..++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D844: draw character: ".+.+.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D860: draw character: ".+.+++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D880: draw character: ".++..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D89C: draw character: ".++.++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D8BC: draw character: ".+++.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D8DC: draw character: ".+++++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D900: draw character: "+....+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D918: draw character: "+...++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D934: draw character: "+..+.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D950: draw character: "+..+++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D970: draw character: "+.+..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D98C: draw character: "+.+.++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D9AC: draw character: "+.++.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D9CC: draw character: "+.++++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021D9F0: draw character: "++...+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DA0C: draw character: "++..++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DA2C: draw character: "++.+.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DA4C: draw character: "++.+++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DA70: draw character: "+++..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DA90: draw character: "+++.++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DAB4: draw character: "++++.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DAD8: draw character: "++++++.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DB00: draw character: ".....++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DB18: draw character: "....+++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DB34: draw character: "...+.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DB50: draw character: "...++++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DB70: draw character: "..+..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DB8C: draw character: "..+.+++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DBAC: draw character: "..++.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DBCC: draw character: "..+++++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DBF0: draw character: ".+...++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DC0C: draw character: ".+..+++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DC2C: draw character: ".+.+.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DC4C: draw character: ".+.++++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DC70: draw character: ".++..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DC90: draw character: ".++.+++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DCB4: draw character: ".+++.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DCD8: draw character: ".++++++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DD00: draw character: "+....++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DD1C: draw character: "+...+++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DD3C: draw character: "+..+.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DD5C: draw character: "+..++++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DD80: draw character: "+.+..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DDA0: draw character: "+.+.+++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DDC4: draw character: "+.++.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DDE8: draw character: "+.+++++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DE10: draw character: "++...++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DE30: draw character: "++..+++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DE54: draw character: "++.+.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DE78: draw character: "++.++++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DEA0: draw character: "+++..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DEC4: draw character: "+++.+++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DEEC: draw character: "++++.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DF14: draw character: "+++++++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DF40: return from drawing character LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP 8021DF58: draw character (odd): "........" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DF68: draw character (odd): "....+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DF7C: draw character (odd): "...+...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DF90: draw character (odd): "...++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DFA8: draw character (odd): "..+....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DFBC: draw character (odd): "..+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DFD4: draw character (odd): "..+....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021DFE8: draw character (odd): "..+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E000: draw character (odd): ".+......" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E014: draw character (odd): ".+..+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E02C: draw character (odd): ".+.+...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E044: draw character (odd): ".+.++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E060: draw character (odd): ".++....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E078: draw character (odd): ".++.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E094: draw character (odd): ".++....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E0AC: draw character (odd): ".++.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E0C8: draw character (odd): "+......." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E0DC: draw character (odd): "+...+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E0F4: draw character (odd): "+..+...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E10C: draw character (odd): "+..++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E128: draw character (odd): "+.+....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E140: draw character (odd): "+.+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E15C: draw character (odd): "+.+....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SW S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E174: draw character (odd): "+.+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SW S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E190: draw character (odd): "+......." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E1A4: draw character (odd): "+...+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E1BC: draw character (odd): "+..+...." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0006 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E1D4: draw character (odd): "+..++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0006 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E1F0: draw character (odd): "+.+....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E208: draw character (odd): "+.+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E224: draw character (odd): "+.+....." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0004 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E23C: draw character (odd): "+.+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0004 (A1) SH S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E258: draw character (odd): "......+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E26C: draw character (odd): "....+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E284: draw character (odd): "...+..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E29C: draw character (odd): "...++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E2B8: draw character (odd): "..+...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E2D0: draw character (odd): "..+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E2EC: draw character (odd): "..+...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E304: draw character (odd): "..+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E320: draw character (odd): ".+....+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E338: draw character (odd): ".+..+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E354: draw character (odd): ".+.+..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E370: draw character (odd): ".+.++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E390: draw character (odd): ".++...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E3AC: draw character (odd): ".++.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E3CC: draw character (odd): ".++...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E3E8: draw character (odd): ".++.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E408: draw character (odd): "+.....+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E420: draw character (odd): "+...+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E43C: draw character (odd): "+..+..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E458: draw character (odd): "+..++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E478: draw character (odd): "+.+...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E494: draw character (odd): "+.+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E4B4: draw character (odd): "+.+...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SW S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E4D0: draw character (odd): "+.+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SW S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E4F0: draw character (odd): "+.....+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E508: draw character (odd): "+...+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E524: draw character (odd): "+..+..+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0006 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E540: draw character (odd): "+..++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E560: draw character (odd): "+.+...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E57C: draw character (odd): "+.+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E59C: draw character (odd): "+.+...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0004 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E5B8: draw character (odd): "+.+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0004 (A1) SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E5D8: draw character (odd): ".....+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E5EC: draw character (odd): "....+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E600: draw character (odd): "...+.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E618: draw character (odd): "...++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E630: draw character (odd): "..+..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E648: draw character (odd): "..+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E660: draw character (odd): "..+..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E678: draw character (odd): "..+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E690: draw character (odd): ".+...+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E6A8: draw character (odd): ".+..+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E6C0: draw character (odd): ".+.+.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E6DC: draw character (odd): ".+.++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E6F8: draw character (odd): ".++..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E714: draw character (odd): ".++.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E730: draw character (odd): ".++..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E74C: draw character (odd): ".++.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E768: draw character (odd): "+....+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E780: draw character (odd): "+...+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E798: draw character (odd): "+..+.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E7B4: draw character (odd): "+..++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E7D0: draw character (odd): "+.+..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E7EC: draw character (odd): "+.+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E808: draw character (odd): "+.+..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SW S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E824: draw character (odd): "+.+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SW S1,0004 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E840: draw character (odd): "+....+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E858: draw character (odd): "+...+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E870: draw character (odd): "+..+.+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0006 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E88C: draw character (odd): "+..++..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0006 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E8A8: draw character (odd): "+.+..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E8C4: draw character (odd): "+.+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0004 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E8E0: draw character (odd): "+.+..+.." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0004 (A1) SH S1,000A (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E8FC: draw character (odd): "+.+.+..." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0004 (A1) SW S1,0008 (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E918: draw character (odd): ".....++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E930: draw character (odd): "....+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E948: draw character (odd): "...+.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E964: draw character (odd): "...++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E980: draw character (odd): "..+..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E99C: draw character (odd): "..+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E9B8: draw character (odd): "..+..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E9D4: draw character (odd): "..+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021E9F0: draw character (odd): ".+...++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EA0C: draw character (odd): ".+..+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EA28: draw character (odd): ".+.+.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EA48: draw character (odd): ".+.++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EA68: draw character (odd): ".++..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EA88: draw character (odd): ".++.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EAA8: draw character (odd): ".++..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EAC8: draw character (odd): ".++.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EAE8: draw character (odd): "+....++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EB04: draw character (odd): "+...+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EB20: draw character (odd): "+..+.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EB40: draw character (odd): "+..++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EB60: draw character (odd): "+.+..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EB80: draw character (odd): "+.+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0004 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EBA0: draw character (odd): "+.+..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SW S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EBC0: draw character (odd): "+.+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SW S1,0004 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EBE0: draw character (odd): "+....++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EBFC: draw character (odd): "+...+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EC18: draw character (odd): "+..+.++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EC38: draw character (odd): "+..++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0006 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EC58: draw character (odd): "+.+..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EC78: draw character (odd): "+.+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0004 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EC98: draw character (odd): "+.+..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021ECB8: draw character (odd): "+.+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0004 (A1) SW S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021ECD8: draw character (odd): "+.+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SW S1,0004 (A1) SW S1,0008 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021ECF8: draw character (odd): "+..++..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021ED18: draw character (odd): "......+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021ED2C: draw character (odd): ".......+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021ED40: draw character (odd): "...++..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021ED5C: draw character (odd): "+.+...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0000 (A1) SH S1,0004 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021ED78: draw character (odd): "...++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SW S1,0008 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021ED94: draw character (odd): ".++.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) SW S1,0008 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EDB4: draw character (odd): ".....++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000A (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EDCC: draw character (odd): "..+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SW S1,0008 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EDE8: draw character (odd): ".+.....+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EE00: draw character (odd): "....+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0008 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EE18: draw character (odd): "..+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SW S1,0008 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EE34: draw character (odd): "....+..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EE4C: draw character (odd): ".++..++." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) SH S1,000A (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EE6C: draw character (odd): "..+....+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EE84: draw character (odd): ".++.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SW S1,0008 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EEA4: draw character (odd): ".++..+.+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000A (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EEC4: draw character (odd): "..+.+.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SH S1,0008 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EEE0: draw character (odd): ".++...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EEFC: draw character (odd): ".++....+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EF18: draw character (odd): "..+..+.+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000A (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EF34: draw character (odd): ".++...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SW S1,0004 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EF50: draw character (odd): ".++.+..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EF70: draw character (odd): "..+.+..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SW S1,0004 (A1) SW S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EF8C: draw character (odd): ".++.+..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SW S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EFAC: draw character (odd): ".+.++.+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SW S1,0008 (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EFCC: draw character (odd): "..+....+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021EFE4: draw character (odd): ".+.+.+.+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F004: draw character (odd): "..+...+." LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000A (A1) SW S1,000C (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F020: draw character (odd): "..+.+..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F03C: draw character (odd): "+......+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F054: draw character (odd): "++++++++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F084: draw character (odd): "+..++..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F0A4: draw character (odd): "......++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F0BC: draw character (odd): ".......+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F0D0: draw character (odd): "...++..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F0EC: draw character (odd): "+++...++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F110: draw character (odd): "...+++++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F134: draw character (odd): ".+++++++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F160: draw character (odd): ".....+++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F17C: draw character (odd): "..++++++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F1A4: draw character (odd): ".+.....+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F1BC: draw character (odd): "....++++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F1DC: draw character (odd): "..+.++++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F200: draw character (odd): "....+..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F218: draw character (odd): ".+++++++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F240: draw character (odd): "..++...+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F25C: draw character (odd): ".++.++++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F284: draw character (odd): ".++..+.+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000A (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F2A4: draw character (odd): "..+++.++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F2C8: draw character (odd): ".++...++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F2E8: draw character (odd): ".++....+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F304: draw character (odd): "..+..+.+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000A (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F320: draw character (odd): ".+++..++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0006 (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F344: draw character (odd): ".++.+..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F364: draw character (odd): "..++++.+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F388: draw character (odd): ".++.++.+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F3AC: draw character (odd): ".+.+++++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,0008 (A1) SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F3D4: draw character (odd): "..+....+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F3EC: draw character (odd): ".+.+.+.+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0002 (A1) SH S1,0006 (A1) SH S1,000A (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F40C: draw character (odd): "..+..+++" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,000A (A1) SH S1,000C (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F42C: draw character (odd): "..+.+..+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0004 (A1) SH S1,0008 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F448: draw character (odd): "+......+" LW S0,0000 (A0) ;S0=A0+0: p->line draw handler ADDI A0,A0,0004 ;A0+=4: next handler SH S1,0000 (A1) SH S1,000E (A1) JR S0 ADDI A1,A1,0500 ;A1+=500: next line 8021F460: print char A2 to position {A0,A1} in colour A3 to screen accepts: A0=xpos, A1=ypos, A2=char, A3=colour ADDI SP,SP,FFFC SW S0,0000 (SP) ADDI SP,SP,FFFC SW S1,0000 (SP) ADDI SP,SP,FFFC SW A3,0000 (SP) ;A3->SP+0: colour ADDIU S0,R0,0500 ;S0=500 MULT A1,S0 LUI A1,8025 LW A1,91D8 (A1) ;A1=802491D8: p->video buffer LUI S0,DFFF ORI S0,S0,FFFF ;S0=DFFFFFFF: address mask AND A1,A1,S0 ;A1=address without 20000000 ADD A0,A0,A0 ;A0*=2 xpos pixel offset, accounting for 2byte pixel data ADD A1,A1,A0 ;A1+=xpos offset MFLO S0 ;S0=ypos * 500: #bytes to skip; incidentally, 280 pixels per line, *2 for size of pixel data ADD A1,A1,S0 ;A1+=ypos offset: p->position to copy image data to ADDI A2,A2,FFE0 ;A2-=20: first displayable character is space (' ') ADD A3,A2,A2 ADD A3,A3,A3 ;A3=A2*4: SLL A2,A2,0x5 ;A2*=20 ADD A2,A2,A3 ADD A2,A2,A2 ;A2*=48: char * 48 LUI S0,8021 ORI S0,S0,8864 ;S0=80218864: base address for pointer table ANDI A0,A0,0002 BEQ A0,R0,8021F4D8 ;branch if an even pixel NOP LUI S0,8021 ORI S0,S0,8840 ;S0=80218840: base address for pointer table //8021F4D8: use corresponding handler for each of the 9 lines in character image ADD A0,S0,A2 ;A0=table+offset: p->handling function LW S1,0000 (SP) ;S1=SP+0: colour ADDI SP,SP,0004 LW S0,0000 (A0) ;S0=p->handling function ADDI A0,A0,0004 ;A0+=4: next function JR S0 NOP 8021F4F4: SH S1,0008 (A1) SH S1,000C (A1) JR S0 ADDI SP,SP,FFFC 8021F504: SW S0,0000 (SP) ADDI SP,SP,FFFC SW S1,0000 (SP) ADDI SP,SP,FFFC SW S2,0000 (SP) ADDI SP,SP,FFFC SW S3,0000 (SP) ADDI SP,SP,FFFC SW S4,0000 (SP) ADDI SP,SP,FFFC SW S5,0000 (SP) ADDI SP,SP,FFFC SW S6,0000 (SP) ADDI SP,SP,FFFC SW S7,0000 (SP) ADDIU S0,R0,0500 MULT A1,S0 MFLO S0 LUI A1,8025 LW A1,91D8 (A1) ADD A0,A0,A0 ADD A1,A1,S0 ADD A1,A1,A0 LUI T9,8024 ORI T9,T9,91B8 LD T9,0000 (T9) ANDI A2,A2,FFF8 ADDIU V0,R0,0500 SUB V0,V0,A2 SUB V0,V0,A2 SRL A2,A2,0x2 LUI K0,8021 ORI K0,K0,F5AC ;K0=8021F5AC: p->pointer table ANDI A0,A0,0003 SLL A0,A0,0x2 ADD K0,K0,A0 LW K0,0000 (K0) ;K0=8021F5AC+offset: p->handling routine LUI A0,8024 ORI A0,A0,9AE0 LD A0,0000 (A0) ;A0=80249AE0: JR K0 ADDI A2,A2,FFFF //8021F5AC: pointer table ... //8021F5BC: 0 ADDI K0,A2,0000 LD K1,0000 (A1) ADDI A1,A1,0008 AND K1,K1,A0 DSRL K1,K1,0x1 OR K1,K1,T9 SD K1,FFF8 (A1) //8021F5D8: LD K1,0000 (A1) ADDI K0,K0,FFFF AND K1,K1,A0 DSRL K1,K1,0x1 OR K1,K1,T9 SD K1,0000 (A1) BNE K0,R0,8021F5D8 ADDI A1,A1,0008 ADDI A3,A3,FFFF BNE A3,R0,8021F5BC ADD A1,A1,V0 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP //8021F64C: 1 ADDI K0,A2,0000 LH K1,0000 (A1) ADDI A1,A1,0002 AND K1,K1,A0 SRL K1,K1,0x1 OR K1,K1,T9 SH K1,FFFE (A1) LW K1,0000 (A1) ADDI A1,A1,0004 AND K1,K1,A0 SRL K1,K1,0x1 OR K1,K1,T9 SW K1,FFFC (A1) LD K1,0000 (A1) ADDI K0,K0,FFFF AND K1,K1,A0 DSRL K1,K1,0x1 OR K1,K1,T9 SD K1,0000 (A1) BNE K0,R0,8021F680 ADDI A1,A1,0008 LH K1,0000 (A1) ADDI A3,A3,FFFF AND K1,K1,A0 SRL K1,K1,0x1 OR K1,K1,T9 SH K1,0000 (A1) ADDI A1,A1,0002 BNE A3,R0,8021F64C ADD A1,A1,V0 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP //8021F70C: 2 ADDI K0,A2,0000 LW K1,0000 (A1) ADDI A1,A1,0004 AND K1,K1,A0 SRL K1,K1,0x1 OR K1,K1,T9 SW K1,FFFC (A1) LD K1,0000 (A1) ADDI K0,K0,FFFF AND K1,K1,A0 DSRL K1,K1,0x1 OR K1,K1,T9 SD K1,0000 (A1) BNE K0,R0,8021F728 ADDI A1,A1,0008 LW K1,0000 (A1) ADDI A3,A3,FFFF AND K1,K1,A0 SRL K1,K1,0x1 OR K1,K1,T9 SW K1,0000 (A1) ADDI A1,A1,0004 BNE A3,R0,8021F70C ADD A1,A1,V0 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP //8021F7B4: 3 ADDI K0,A2,0000 LH K1,0000 (A1) ADDI A1,A1,0002 AND K1,K1,A0 SRL K1,K1,0x1 OR K1,K1,T9 SH K1,FFFE (A1) LD K1,0000 (A1) ADDI K0,K0,FFFF AND K1,K1,A0 DSRL K1,K1,0x1 OR K1,K1,T9 SD K1,0000 (A1) BNE K0,R0,8021F7D0 ADDI A1,A1,0008 LW K1,0000 (A1) ADDI A1,A1,0004 AND K1,K1,A0 SRL K1,K1,0x1 OR K1,K1,T9 SW K1,FFFC (A1) LH K1,0000 (A1) ADDI A3,A3,FFFF AND K1,K1,A0 SRL K1,K1,0x1 OR K1,K1,T9 SH K1,0000 (A1) ADDI A1,A1,0002 BNE A3,R0,8021F7B4 ADD A1,A1,V0 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP 8021F874: likely filler ;SW SP,0002 (R0) ;NOP ;SH S1,0006 (A1) 8021F880: ADDI SP,SP,FFFC SW S0,0000 (SP) ADDI SP,SP,FFFC SW S1,0000 (SP) ADDI SP,SP,FFFC SW S2,0000 (SP) ADDI SP,SP,FFFC SW S3,0000 (SP) ADDI SP,SP,FFFC SW S4,0000 (SP) ADDI SP,SP,FFFC SW S5,0000 (SP) ADDI SP,SP,FFFC SW S6,0000 (SP) ADDI SP,SP,FFFC SW S7,0000 (SP) ADDIU V0,R0,0140 SUB V0,V0,A2 SUB V0,V0,A0 BGEZ V0,8021F8D8 NOP ADD A2,A2,V0 AND A0,A0,A0 BGEZ A0,8021F8EC NOP ADD A2,A2,A0 XOR A0,A0,A0 ADDIU V0,R0,00F0 SUB V0,V0,A3 SUB V0,V0,A1 BGEZ V0,8021F904 NOP ADD A3,A3,V0 AND A1,A1,A1 BGEZ A1,8021F918 NOP ADD A3,A3,A1 XOR A1,A1,A1 BLEZ A2,8021FCA8 NOP BLEZ A3,8021FCA8 NOP ADDIU S0,R0,0500 MULT A1,S0 MFLO S0 LUI K1,8025 LW K1,91D8 (K1) ADDI A0,A0,0040 ADD K1,K1,S0 ADD K1,K1,A0 ADD K1,K1,A0 LUI V0,8021 ORI V0,V0,F98C ANDI A0,A0,0003 SLL A0,A0,0x2 ADD V0,V0,A0 ADDI A1,A2,0000 LUI A0,8024 ORI A0,A0,91B8 LD A0,0000 (A0) ANDI A2,A2,FFFC BEQ A2,R0,8021FC74 NOP LW V0,0000 (V0) NOP JR V0 NOP LB AT,F99C (AT) LB AT,FA3C (AT) LB AT,FB04 (AT) LB AT,FBBC (AT) ADDI A1,A1,0000 ADDI SP,SP,FFFC SW K1,0000 (SP) ADDI A2,A1,0000 SRL A2,A2,0x2 SRL A2,A1,0x2 BEQ A2,R0,8021F9C8 ADDI A2,A2,FFFF SD A0,0000 (K1) BNE A2,R0,8021F9B8 ADDI K1,K1,0008 ANDI A2,A1,0003 BEQ A2,R0,8021F9E0 ADDI A2,A2,FFFF SH A0,0000 (K1) BNE A2,R0,8021F9D0 ADDI K1,K1,0002 LW K1,0000 (SP) ADDI SP,SP,0004 ADDI A3,A3,FFFF BNE A3,R0,8021F9A0 ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP ADDI A1,A1,FFFD ADDI SP,SP,FFFC SW K1,0000 (SP) ADDIU A2,R0,0001 BEQ A2,R0,8021FA60 ADDI A2,A2,FFFF SH A0,0000 (K1) BNE A2,R0,8021FA50 ADDI K1,K1,0002 ADDIU A2,R0,0001 BEQ A2,R0,8021FA78 ADDI A2,A2,FFFF SW A0,0000 (K1) BNE A2,R0,8021FA68 ADDI K1,K1,0004 SRL A2,A1,0x2 BEQ A2,R0,8021FA90 ADDI A2,A2,FFFF SD A0,0000 (K1) BNE A2,R0,8021FA80 ADDI K1,K1,0008 ANDI A2,A1,0003 BEQ A2,R0,8021FAA8 ADDI A2,A2,FFFF SH A0,0000 (K1) BNE A2,R0,8021FA98 ADDI K1,K1,0002 LW K1,0000 (SP) ADDI SP,SP,0004 ADDI A3,A3,FFFF BNE A3,R0,8021FA40 ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP ADDI A1,A1,FFFE ADDI SP,SP,FFFC SW K1,0000 (SP) ADDIU A2,R0,0001 BEQ A2,R0,8021FB28 ADDI A2,A2,FFFF SW A0,0000 (K1) BNE A2,R0,8021FB18 ADDI K1,K1,0004 ADDI A2,A1,0000 SRL A2,A2,0x2 SRL A2,A1,0x2 BEQ A2,R0,8021FB48 ADDI A2,A2,FFFF SD A0,0000 (K1) BNE A2,R0,8021FB38 ADDI K1,K1,0008 ANDI A2,A1,0003 BEQ A2,R0,8021FB60 ADDI A2,A2,FFFF SH A0,0000 (K1) BNE A2,R0,8021FB50 ADDI K1,K1,0002 LW K1,0000 (SP) ADDI SP,SP,0004 ADDI A3,A3,FFFF BNE A3,R0,8021FB08 ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP ADDI A1,A1,FFFF ADDI SP,SP,FFFC SW K1,0000 (SP) ADDIU A2,R0,0001 BEQ A2,R0,8021FBE0 ADDI A2,A2,FFFF SH A0,0000 (K1) BNE A2,R0,8021FBD0 ADDI K1,K1,0002 ADDI A2,A1,0000 SRL A2,A2,0x2 SRL A2,A1,0x2 BEQ A2,R0,8021FC00 ADDI A2,A2,FFFF SD A0,0000 (K1) BNE A2,R0,8021FBF0 ADDI K1,K1,0008 ANDI A2,A1,0003 BEQ A2,R0,8021FC18 ADDI A2,A2,FFFF SH A0,0000 (K1) BNE A2,R0,8021FC08 ADDI K1,K1,0002 LW K1,0000 (SP) ADDI SP,SP,0004 ADDI A3,A3,FFFF BNE A3,R0,8021FBC0 ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP ADDI SP,SP,FFFC SW K1,0000 (SP) ADDI A2,A1,0000 BEQ A2,R0,8021FC94 ADDI A2,A2,FFFF SH A0,0000 (K1) BNE A2,R0,8021FC84 ADDI K1,K1,0002 LW K1,0000 (SP) ADDI SP,SP,0004 ADDI A3,A3,FFFF BNE A3,R0,8021FC74 ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP 8021FCF0: ADDI SP,SP,FFFC SW S0,0000 (SP) ADDI SP,SP,FFFC SW S1,0000 (SP) ADDI SP,SP,FFFC SW S2,0000 (SP) ADDI SP,SP,FFFC SW S3,0000 (SP) ADDI SP,SP,FFFC SW S4,0000 (SP) ADDI SP,SP,FFFC SW S5,0000 (SP) ADDI SP,SP,FFFC SW S6,0000 (SP) ADDI SP,SP,FFFC SW S7,0000 (SP) ADDIU V0,R0,0140 SUB V0,V0,A2 SUB V0,V0,A0 BGEZ V0,8021FD48 NOP ADD A2,A2,V0 AND A0,A0,A0 BGEZ A0,8021FD5C NOP ADD A2,A2,A0 XOR A0,A0,A0 ADDIU V0,R0,00F0 SUB V0,V0,A3 SUB V0,V0,A1 BGEZ V0,8021FD74 NOP ADD A3,A3,V0 AND A1,A1,A1 BGEZ A1,8021FD88 NOP ADD A3,A3,A1 XOR A1,A1,A1 BLEZ A2,80220250 NOP BLEZ A3,80220250 NOP ADDIU S0,R0,0500 MULT A1,S0 MFLO S0 LUI K1,8025 LW K1,91D8 (K1) ADDI A0,A0,0040 ADD K1,K1,S0 ADD K1,K1,A0 ADD K1,K1,A0 ADDU K0,K1,R0 LUI V0,DFFF ORI V0,V0,FFFF AND K0,K0,V0 LUI V0,8021 ORI V0,V0,FE08 ANDI A0,A0,0003 SLL A0,A0,0x2 ADD A0,A0,V0 LW A0,0000 (A0) ADDI A1,A2,0000 LUI V0,8024 ORI V0,V0,9AE0 LD V0,0000 (V0) ANDI A2,A2,FFFC BEQ A2,R0,802201F8 NOP JR A0 NOP LB AT,FE18 (AT) LB AT,FEE8 (AT) LB V0,0008 (AT) LB V0,0100 (AT) ADDI A1,A1,0000 ADDI SP,SP,FFFC SW K0,0000 (SP) ADDI SP,SP,FFFC SW K1,0000 (SP) ADDI A2,A1,0000 SRL A2,A2,0x2 BEQ A2,R0,8021FE58 ADDI A2,A2,FFFF LD A0,0000 (K0) ADDI K0,K0,0008 AND A0,A0,V0 DSRL A0,A0,0x1 SD A0,0000 (K1) BNE A2,R0,8021FE38 ADDI K1,K1,0008 ANDI A2,A1,0003 BEQ A2,R0,8021FE80 ADDI A2,A2,FFFF LH A0,0000 (K0) ADDI K0,K0,0002 AND A0,A0,V0 SRL A0,A0,0x1 SH A0,0000 (K1) BNE A2,R0,8021FE60 ADDI K1,K1,0002 LW K1,0000 (SP) ADDI SP,SP,0004 LW K0,0000 (SP) ADDI SP,SP,0004 ADDI A3,A3,FFFF ADDI K0,K0,0500 BNE A3,R0,8021FE1C ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP ADDI A1,A1,FFFD ADDI SP,SP,FFFC SW K0,0000 (SP) ADDI SP,SP,FFFC SW K1,0000 (SP) ADDIU A2,R0,0001 BEQ A2,R0,8021FF24 ADDI A2,A2,FFFF LH A0,0000 (K0) ADDI K0,K0,0002 AND A0,A0,V0 SRL A0,A0,0x1 SH A0,0000 (K1) BNE A2,R0,8021FF04 ADDI K1,K1,0002 ADDIU A2,R0,0001 BEQ A2,R0,8021FF4C ADDI A2,A2,FFFF LW A0,0000 (K0) ADDI K0,K0,0004 AND A0,A0,V0 SRL A0,A0,0x1 SW A0,0000 (K1) BNE A2,R0,8021FF2C ADDI K1,K1,0004 ADDI A2,A1,0000 SRL A2,A2,0x2 BEQ A2,R0,8021FF78 ADDI A2,A2,FFFF LD A0,0000 (K0) ADDI K0,K0,0008 AND A0,A0,V0 DSRL A0,A0,0x1 SD A0,0000 (K1) BNE A2,R0,8021FF58 ADDI K1,K1,0008 ANDI A2,A1,0003 BEQ A2,R0,8021FFA0 ADDI A2,A2,FFFF LH A0,0000 (K0) ADDI K0,K0,0002 AND A0,A0,V0 SRL A0,A0,0x1 SH A0,0000 (K1) BNE A2,R0,8021FF80 ADDI K1,K1,0002 LW K1,0000 (SP) ADDI SP,SP,0004 LW K0,0000 (SP) ADDI SP,SP,0004 ADDI A3,A3,FFFF ADDI K0,K0,0500 BNE A3,R0,8021FEEC ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP ADDI A1,A1,FFFE ADDI SP,SP,FFFC SW K0,0000 (SP) ADDI SP,SP,FFFC SW K1,0000 (SP) ADDIU A2,R0,0001 BEQ A2,R0,80220044 ADDI A2,A2,FFFF LW A0,0000 (K0) ADDI K0,K0,0004 AND A0,A0,V0 SRL A0,A0,0x1 SW A0,0000 (K1) BNE A2,R0,80220024 ADDI K1,K1,0004 ADDI A2,A1,0000 SRL A2,A2,0x2 BEQ A2,R0,80220070 ADDI A2,A2,FFFF LD A0,0000 (K0) ADDI K0,K0,0008 AND A0,A0,V0 DSRL A0,A0,0x1 SD A0,0000 (K1) BNE A2,R0,80220050 ADDI K1,K1,0008 ANDI A2,A1,0003 BEQ A2,R0,80220098 ADDI A2,A2,FFFF LH A0,0000 (K0) ADDI K0,K0,0002 AND A0,A0,V0 SRL A0,A0,0x1 SH A0,0000 (K1) BNE A2,R0,80220078 ADDI K1,K1,0002 LW K1,0000 (SP) ADDI SP,SP,0004 LW K0,0000 (SP) ADDI SP,SP,0004 ADDI A3,A3,FFFF ADDI K0,K0,0500 BNE A3,R0,8022000C ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP ADDI A1,A1,FFFF ADDI SP,SP,FFFC SW K0,0000 (SP) ADDI SP,SP,FFFC SW K1,0000 (SP) ADDIU A2,R0,0001 BEQ A2,R0,8022013C ADDI A2,A2,FFFF LH A0,0000 (K0) ADDI K0,K0,0002 AND A0,A0,V0 SRL A0,A0,0x1 SH A0,0000 (K1) BNE A2,R0,8022011C ADDI K1,K1,0002 ADDI A2,A1,0000 SRL A2,A2,0x2 BEQ A2,R0,80220168 ADDI A2,A2,FFFF LD A0,0000 (K0) ADDI K0,K0,0008 AND A0,A0,V0 DSRL A0,A0,0x1 SD A0,0000 (K1) BNE A2,R0,80220148 ADDI K1,K1,0008 ANDI A2,A1,0003 BEQ A2,R0,80220190 ADDI A2,A2,FFFF LH A0,0000 (K0) ADDI K0,K0,0002 AND A0,A0,V0 SRL A0,A0,0x1 SH A0,0000 (K1) BNE A2,R0,80220170 ADDI K1,K1,0002 LW K1,0000 (SP) ADDI SP,SP,0004 LW K0,0000 (SP) ADDI SP,SP,0004 ADDI A3,A3,FFFF ADDI K0,K0,0500 BNE A3,R0,80220104 ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP ADDI SP,SP,FFFC SW K0,0000 (SP) ADDI SP,SP,FFFC SW K1,0000 (SP) ADDI A2,A1,0000 BEQ A2,R0,80220230 ADDI A2,A2,FFFF LH A0,0000 (K0) ADDI K0,K0,0002 AND A0,A0,V0 SRL A0,A0,0x1 SH A0,0000 (K1) BNE A2,R0,80220210 ADDI K1,K1,0002 LW K1,0000 (SP) ADDI SP,SP,0004 LW K0,0000 (SP) ADDI SP,SP,0004 ADDI A3,A3,FFFF ADDI K0,K0,0500 BNE A3,R0,802201F8 ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP 80220298: accepts: A0=fill value,A1=#shorts filled (0-3),A2=total fill (0-140), A3=#loops, K1=p->??? ADDIU S1,R0,0140 SUB S1,S1,A2 LUI S0,8022 ADDIU S0,S0,02B4 ADD S0,S0,S1 ;S0=802203F4-offset: sets how many DWs at K1 are filled JR S0 NOP //802202B4: replace # DWs at K1 SD A0,0278 (K1) SD A0,0270 (K1) SD A0,0268 (K1) SD A0,0260 (K1) SD A0,0258 (K1) SD A0,0250 (K1) SD A0,0248 (K1) SD A0,0240 (K1) SD A0,0238 (K1) SD A0,0230 (K1) SD A0,0228 (K1) SD A0,0220 (K1) SD A0,0218 (K1) SD A0,0210 (K1) SD A0,0208 (K1) SD A0,0200 (K1) SD A0,01F8 (K1) SD A0,01F0 (K1) SD A0,01E8 (K1) SD A0,01E0 (K1) SD A0,01D8 (K1) SD A0,01D0 (K1) SD A0,01C8 (K1) SD A0,01C0 (K1) SD A0,01B8 (K1) SD A0,01B0 (K1) SD A0,01A8 (K1) SD A0,01A0 (K1) SD A0,0198 (K1) SD A0,0190 (K1) SD A0,0188 (K1) SD A0,0180 (K1) SD A0,0178 (K1) SD A0,0170 (K1) SD A0,0168 (K1) SD A0,0160 (K1) SD A0,0158 (K1) SD A0,0150 (K1) SD A0,0148 (K1) SD A0,0140 (K1) SD A0,0138 (K1) SD A0,0130 (K1) SD A0,0128 (K1) SD A0,0120 (K1) SD A0,0118 (K1) SD A0,0110 (K1) SD A0,0108 (K1) SD A0,0100 (K1) SD A0,00F8 (K1) SD A0,00F0 (K1) SD A0,00E8 (K1) SD A0,00E0 (K1) SD A0,00D8 (K1) SD A0,00D0 (K1) SD A0,00C8 (K1) SD A0,00C0 (K1) SD A0,00B8 (K1) SD A0,00B0 (K1) SD A0,00A8 (K1) SD A0,00A0 (K1) SD A0,0098 (K1) SD A0,0090 (K1) SD A0,0088 (K1) SD A0,0080 (K1) SD A0,0078 (K1) SD A0,0070 (K1) SD A0,0068 (K1) SD A0,0060 (K1) SD A0,0058 (K1) SD A0,0050 (K1) SD A0,0048 (K1) SD A0,0040 (K1) SD A0,0038 (K1) SD A0,0030 (K1) SD A0,0028 (K1) SD A0,0020 (K1) SD A0,0018 (K1) SD A0,0010 (K1) SD A0,0008 (K1) SD A0,0000 (K1) //802203F4: replace A1 shorts in first DW ADDIU S1,R0,0003 ANDI S0,A1,0003 ;S0=A1&3: #shorts to replace SUB S1,S1,S0 ;S1-=3: 3-0, not 0-3 SLL S1,S1,0x2 ;S1->offset LUI S0,8022 ADDIU S0,S0,0418 ADD S0,S0,S1 ;S0=80220418+offset: replace A1 shorts JR S0 NOP //80220418: replace variable #shorts SH A0,0006 (K1) SH A0,0004 (K1) SH A0,0002 (K1) //80220424: loop A3 times ADDI A3,A3,FFFF ;A3-- BNE A3,R0,80220298 ;loop until no more arrays to fill ADDI K1,K1,0500 ;K1+=500 //80220430: load variables from stack and return LW S7,0000 (SP) ;S7=SP+0: ADDI SP,SP,0004 LW S6,0000 (SP) ;S6=SP+4: ADDI SP,SP,0004 LW S5,0000 (SP) ;S5=SP+8: ADDI SP,SP,0004 LW S4,0000 (SP) ;S4=SP+C: ADDI SP,SP,0004 LW S3,0000 (SP) ;S3=SP+10: ADDI SP,SP,0004 LW S2,0000 (SP) ;S2=SP+14: ADDI SP,SP,0004 LW S1,0000 (SP) ;S1=SP+18: ADDI SP,SP,0004 LW S0,0000 (SP) ;S0=SP+1C: ADDI SP,SP,0004 ;SP+=20 JR RA NOP 80220478: fill? ;ADDI A1,A1,FFFD ;SH A0,0000 (K1) ;SW A0,0002 (K1) ;ADDI K1,K1,0006 ;ADDI A2,A2,FFFC 8022048C: accepts: A0=fill value,A1=#shorts filled (0-3),A2=total fill (0-140), A3=#loops, K1=p->??? ADDIU S1,R0,0140 SUB S1,S1,A2 ;S1=140-A2: sets how many SD ops are used to fill K1 LUI S0,8022 ADDIU S0,S0,04A8 ADD S0,S0,S1 ;S0=802205E8-offset: p->handler JR S0 NOP //802204A8: SD A0,0278 (K1) SD A0,0270 (K1) SD A0,0268 (K1) SD A0,0260 (K1) SD A0,0258 (K1) SD A0,0250 (K1) SD A0,0248 (K1) SD A0,0240 (K1) SD A0,0238 (K1) SD A0,0230 (K1) SD A0,0228 (K1) SD A0,0220 (K1) SD A0,0218 (K1) SD A0,0210 (K1) SD A0,0208 (K1) SD A0,0200 (K1) SD A0,01F8 (K1) SD A0,01F0 (K1) SD A0,01E8 (K1) SD A0,01E0 (K1) SD A0,01D8 (K1) SD A0,01D0 (K1) SD A0,01C8 (K1) SD A0,01C0 (K1) SD A0,01B8 (K1) SD A0,01B0 (K1) SD A0,01A8 (K1) SD A0,01A0 (K1) SD A0,0198 (K1) SD A0,0190 (K1) SD A0,0188 (K1) SD A0,0180 (K1) SD A0,0178 (K1) SD A0,0170 (K1) SD A0,0168 (K1) SD A0,0160 (K1) SD A0,0158 (K1) SD A0,0150 (K1) SD A0,0148 (K1) SD A0,0140 (K1) SD A0,0138 (K1) SD A0,0130 (K1) SD A0,0128 (K1) SD A0,0120 (K1) SD A0,0118 (K1) SD A0,0110 (K1) SD A0,0108 (K1) SD A0,0100 (K1) SD A0,00F8 (K1) SD A0,00F0 (K1) SD A0,00E8 (K1) SD A0,00E0 (K1) SD A0,00D8 (K1) SD A0,00D0 (K1) SD A0,00C8 (K1) SD A0,00C0 (K1) SD A0,00B8 (K1) SD A0,00B0 (K1) SD A0,00A8 (K1) SD A0,00A0 (K1) SD A0,0098 (K1) SD A0,0090 (K1) SD A0,0088 (K1) SD A0,0080 (K1) SD A0,0078 (K1) SD A0,0070 (K1) SD A0,0068 (K1) SD A0,0060 (K1) SD A0,0058 (K1) SD A0,0050 (K1) SD A0,0048 (K1) SD A0,0040 (K1) SD A0,0038 (K1) SD A0,0030 (K1) SD A0,0028 (K1) SD A0,0020 (K1) SD A0,0018 (K1) SD A0,0010 (K1) SD A0,0008 (K1) SD A0,0000 (K1) //802205E8: fill shorts in first DW ADDIU S1,R0,0003 ANDI S0,A1,0003 ;S0=A1&3: how many shorts to fill in K1 SUB S1,S1,S0 ;S1-=S0: reverse 0-3 to 3-0 SLL S1,S1,0x2 ;S1->offset LUI S0,8022 ADDIU S0,S0,060C ADD S0,S0,S1 ;S0=8022060C+offset: JR S0 NOP //8022060C: fill varying degree of shorts SH A0,0006 (K1) SH A0,0004 (K1) SH A0,0002 (K1) //80220618: ADDI A3,A3,FFFF ;A3-- BNE A3,R0,8022048C ;loop until 0 ADDI K1,K1,0500 ;K1+=500 //80220624: pull values off stack and return LW S7,0000 (SP) ;S7=SP+0: ADDI SP,SP,0004 LW S6,0000 (SP) ;S6=SP+4: ADDI SP,SP,0004 LW S5,0000 (SP) ;S5=SP+8: ADDI SP,SP,0004 LW S4,0000 (SP) ;S4=SP+C: ADDI SP,SP,0004 LW S3,0000 (SP) ;S3=SP+10: ADDI SP,SP,0004 LW S2,0000 (SP) ;S2=SP+14: ADDI SP,SP,0004 LW S1,0000 (SP) ;S1=SP+18: ADDI SP,SP,0004 LW S0,0000 (SP) ;S0=SP+1C: ADDI SP,SP,0004 ;SP+=20 JR RA NOP 8022066C: ADDI A1,A1,FFFE SW A0,0000 (K1) ADDI K1,K1,0004 ADDIU S1,R0,0140 SUB S1,S1,A2 LUI S0,8022 ADDIU S0,S0,0694 ADD S0,S0,S1 JR S0 NOP SD A0,0278 (K1) SD A0,0270 (K1) SD A0,0268 (K1) SD A0,0260 (K1) SD A0,0258 (K1) SD A0,0250 (K1) SD A0,0248 (K1) SD A0,0240 (K1) SD A0,0238 (K1) SD A0,0230 (K1) SD A0,0228 (K1) SD A0,0220 (K1) SD A0,0218 (K1) SD A0,0210 (K1) SD A0,0208 (K1) SD A0,0200 (K1) SD A0,01F8 (K1) SD A0,01F0 (K1) SD A0,01E8 (K1) SD A0,01E0 (K1) SD A0,01D8 (K1) SD A0,01D0 (K1) SD A0,01C8 (K1) SD A0,01C0 (K1) SD A0,01B8 (K1) SD A0,01B0 (K1) SD A0,01A8 (K1) SD A0,01A0 (K1) SD A0,0198 (K1) SD A0,0190 (K1) SD A0,0188 (K1) SD A0,0180 (K1) SD A0,0178 (K1) SD A0,0170 (K1) SD A0,0168 (K1) SD A0,0160 (K1) SD A0,0158 (K1) SD A0,0150 (K1) SD A0,0148 (K1) SD A0,0140 (K1) SD A0,0138 (K1) SD A0,0130 (K1) SD A0,0128 (K1) SD A0,0120 (K1) SD A0,0118 (K1) SD A0,0110 (K1) SD A0,0108 (K1) SD A0,0100 (K1) SD A0,00F8 (K1) SD A0,00F0 (K1) SD A0,00E8 (K1) SD A0,00E0 (K1) SD A0,00D8 (K1) SD A0,00D0 (K1) SD A0,00C8 (K1) SD A0,00C0 (K1) SD A0,00B8 (K1) SD A0,00B0 (K1) SD A0,00A8 (K1) SD A0,00A0 (K1) SD A0,0098 (K1) SD A0,0090 (K1) SD A0,0088 (K1) SD A0,0080 (K1) SD A0,0078 (K1) SD A0,0070 (K1) SD A0,0068 (K1) SD A0,0060 (K1) SD A0,0058 (K1) SD A0,0050 (K1) SD A0,0048 (K1) SD A0,0040 (K1) SD A0,0038 (K1) SD A0,0030 (K1) SD A0,0028 (K1) SD A0,0020 (K1) SD A0,0018 (K1) SD A0,0010 (K1) SD A0,0008 (K1) SD A0,0000 (K1) ADDIU S1,R0,0003 ANDI S0,A1,0003 SUB S1,S1,S0 SLL S1,S1,0x2 LUI S0,8022 ADDIU S0,S0,07F8 ADD S0,S0,S1 JR S0 NOP SH A0,0006 (K1) SH A0,0004 (K1) SH A0,0002 (K1) ADDI A3,A3,FFFF BNE A3,R0,80220678 ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP 80220858: ADDI A1,A1,FFFF SH A0,0000 (K1) ADDI K1,K1,0002 ADDIU S1,R0,0140 SUB S1,S1,A2 LUI S0,8022 ADDIU S0,S0,0880 ADD S0,S0,S1 JR S0 NOP SD A0,0278 (K1) SD A0,0270 (K1) SD A0,0268 (K1) SD A0,0260 (K1) SD A0,0258 (K1) SD A0,0250 (K1) SD A0,0248 (K1) SD A0,0240 (K1) SD A0,0238 (K1) SD A0,0230 (K1) SD A0,0228 (K1) SD A0,0220 (K1) SD A0,0218 (K1) SD A0,0210 (K1) SD A0,0208 (K1) SD A0,0200 (K1) SD A0,01F8 (K1) SD A0,01F0 (K1) SD A0,01E8 (K1) SD A0,01E0 (K1) SD A0,01D8 (K1) SD A0,01D0 (K1) SD A0,01C8 (K1) SD A0,01C0 (K1) SD A0,01B8 (K1) SD A0,01B0 (K1) SD A0,01A8 (K1) SD A0,01A0 (K1) SD A0,0198 (K1) SD A0,0190 (K1) SD A0,0188 (K1) SD A0,0180 (K1) SD A0,0178 (K1) SD A0,0170 (K1) SD A0,0168 (K1) SD A0,0160 (K1) SD A0,0158 (K1) SD A0,0150 (K1) SD A0,0148 (K1) SD A0,0140 (K1) SD A0,0138 (K1) SD A0,0130 (K1) SD A0,0128 (K1) SD A0,0120 (K1) SD A0,0118 (K1) SD A0,0110 (K1) SD A0,0108 (K1) SD A0,0100 (K1) SD A0,00F8 (K1) SD A0,00F0 (K1) SD A0,00E8 (K1) SD A0,00E0 (K1) SD A0,00D8 (K1) SD A0,00D0 (K1) SD A0,00C8 (K1) SD A0,00C0 (K1) SD A0,00B8 (K1) SD A0,00B0 (K1) SD A0,00A8 (K1) SD A0,00A0 (K1) SD A0,0098 (K1) SD A0,0090 (K1) SD A0,0088 (K1) SD A0,0080 (K1) SD A0,0078 (K1) SD A0,0070 (K1) SD A0,0068 (K1) SD A0,0060 (K1) SD A0,0058 (K1) SD A0,0050 (K1) SD A0,0048 (K1) SD A0,0040 (K1) SD A0,0038 (K1) SD A0,0030 (K1) SD A0,0028 (K1) SD A0,0020 (K1) SD A0,0018 (K1) SD A0,0010 (K1) SD A0,0008 (K1) SD A0,0000 (K1) ADDIU S1,R0,0003 ANDI S0,A1,0003 SUB S1,S1,S0 SLL S1,S1,0x2 LUI S0,8022 ADDIU S0,S0,09E4 ADD S0,S0,S1 JR S0 NOP SH A0,0006 (K1) SH A0,0004 (K1) SH A0,0002 (K1) ADDI A3,A3,FFFF BNE A3,R0,80220864 ADDI K1,K1,0500 LW S7,0000 (SP) ADDI SP,SP,0004 LW S6,0000 (SP) ADDI SP,SP,0004 LW S5,0000 (SP) ADDI SP,SP,0004 LW S4,0000 (SP) ADDI SP,SP,0004 LW S3,0000 (SP) ADDI SP,SP,0004 LW S2,0000 (SP) ADDI SP,SP,0004 LW S1,0000 (SP) ADDI SP,SP,0004 LW S0,0000 (SP) ADDI SP,SP,0004 JR RA NOP 80220A44 likely data ;SH S1,000A (A1) ;SH S1,000C (A1) ;JR S0 80220A50 LUI V0,8025 LW V0,9950 (V0) ;V0=80249950: SB R0,0000 (V0) ;0->???: kill allocation LUI V0,8025 LW V0,9AEC (V0) ;V0=80249AEC: SB R0,0000 (V0) ;0->???: kill allocation LUI V0,8025 LW V0,9AF0 (V0) ;V0=80249AF0: SB R0,0000 (V0) ;0->???: kill allocation LUI V0,8025 LW V0,A6F8 (V0) ;V0=8024A6F8: JR RA SB R0,0000 (V0) ;0->???: kill allocation 80220A84 ADDIU SP,SP,FF08 SW S0,00E8 (SP) ADDU S0,A0,R0 SW S1,00EC (SP) ADDU S1,A1,R0 ADDIU A0,R0,0003 ADDIU A1,R0,00C8 LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table SW RA,00F0 (SP) LW A3,0364 (V0) ;A3=str+364: 80223710 "Options" LW V1,0468 (V0) ;V1=str+468: 80223088 "Add Codes" LW V0,00A4 (V0) ;V0=str+A4: 80222FE8 "Use Left/Right to select." ADDIU A2,SP,0020 SW V1,0010 (SP) JAL 802137A4 SW V0,0014 (SP) ADDIU A0,R0,003F ADDIU A1,R0,0082 ADDIU A2,R0,0014 ADDIU A3,R0,0002 SW R0,0010 (SP) SW S0,0014 (SP) JAL 80212E3C SW S1,0018 (SP) ADDIU A0,R0,003F ADDIU A1,R0,0082 ADDIU A2,R0,0014 ADDIU A3,R0,0002 ADDIU V0,SP,0020 SW S0,0010 (SP) SW S1,0014 (SP) JAL 80213820 SW V0,0018 (SP) LW RA,00F0 (SP) LW S1,00EC (SP) LW S0,00E8 (SP) JR RA ADDIU SP,SP,00F8 80220B20 accepts: A0=button/stick mask, A1=, A2= ADDIU SP,SP,FFD0 SW S0,0018 (SP) ADDU S0,A0,R0 ;S0=A0: button/stick mask SW S2,0020 (SP) ADDU S2,A1,R0 ;S2=A1: SW S3,0024 (SP) ADDU S3,A2,R0 ;S3=A2: SW RA,0028 (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM SW S1,001C (SP) BNE S0,R0,80220B5C ;if some controller input, branch ADDIU A0,S0,000E ;A0=S0+E: JAL 80212B20 XORI A0,S2,0001 ;A0=S2^1: ADDIU A0,S0,000E ;A0=S0+E: //80220B5C: ADDIU A1,R0,000E ;A1=E: LUI V0,8022 ADDIU S1,V0,7660 ;S1=80227660: string pointer table LW A3,00CC (S1) ;A3=str+CC: 802240C0 "GameShark Pro Version 3.30" ADDIU A2,R0,001F JAL 80212C90 SW R0,0010 (SP) BNE S2,R0,80220BA0 ADDIU A0,R0,0010 ADDIU A0,R0,000E SUBU A0,A0,S0 ADDIU A1,R0,0022 LW A3,0448 (S1) ;A3=str+448: 80223114 "Save/Load Cheats" ADDIU A2,R0,001F JAL 80212C90 SW R0,0010 (SP) ADDIU A0,R0,0010 //80220BA0: SUBU A0,A0,S0 ADDIU A1,R0,003C ADDIU A2,R0,0120 ADDIU A3,R0,0038 LUI S1,8022 SUBU S0,R0,S0 ;S0*=-1 SW S0,7650 (S1) ;S0->80227650: base x offset JAL 80213364 SW R0,0010 (SP) BNE S3,R0,80220C08 ;skip if [A2 f/ caller] set LUI V0,8024 //80220BCC: ADDIU A0,R0,0050 ;A0=50: ypos LUI A2,FFC0 ORI A2,A2,FFC0 LUI V0,8025 LW A1,9AF0 (V0) ;A1=80249AF0: JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 //80220BE8: ADDIU A0,R0,005A :A0=5A: ypos LUI A2,FFC0 ORI A2,A2,FFC0 LUI V0,8025 LW A1,A6F8 (V0) ;A1=8024A6F8: JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 LUI V0,8024 //80220C08: LW A0,EF70 (V0) ;A0=8023EF70: ADDIU V0,R0,FFFF BEQ A0,V0,80220C30 ;return if A0= -1 SW S0,7650 (S1) ;S0->80227650: base x offset LUI V0,8024 LW A1,2D18 (V0) ;A1=80242D18: LUI V0,8025 LW A2,9118 (V0) ;A2=80249118: JAL 80220A84 NOP //80220C30: return LW RA,0028 (SP) LW S3,0024 (SP) LW S2,0020 (SP) SW S0,7650 (S1) LW S1,001C (SP) LW S0,0018 (SP) JR RA ADDIU SP,SP,0030 80220C50 accepts: A0=button/stick mask ADDIU SP,SP,FFE8 SW S0,0010 (SP) SW RA,0014 (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM ADDU S0,A0,R0 ;S0=A0: button/stick mask SUBU A0,R0,S0 ;A0=S0: button/stick mask ADDU A1,R0,R0 ;A1=0 JAL 80220B20 ADDU A2,A1,R0 ;A2=A1: 0 LW RA,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0018 80220C84 LUI V0,8025 LW A0,A6F8 (V0) ;A0=8024A6F8: LUI V0,8022 LW A1,7AC4 (V0) ;A1=80227AC4: ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,R0,R0 ;S0=0 SW S2,0018 (SP) LUI S2,8000 ;S2=A button SW S1,0014 (SP) SW RA,001C (SP) JAL 8021109C ;strcpy(A0,A1) LUI S1,4000 ;S1=B button //80220CB8: BEQ S0,S2,80220CEC ;branch if A pressed LUI A0,4000 ;A0=B button JAL 80210D4C ;V0=button and stick pos NOP ADDU S0,V0,R0 ;S0=V0: button/stick JAL 80220C50 ADDU A0,R0,R0 ;A0=0 no buttons JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BNE S0,S1,80220CB8 ;loop if B not pressed LUI A0,4000 ;A0=B button //80220CEC: use handler when A or B pressed LUI S0,8022 ADDIU S0,S0,0C50 ;S0=80220C50 JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=80220C50: handler LUI A0,8000 ;A0=A button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=80220C50: handler //80220D08: return LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80220D20 LUI V0,8025 LUI V1,8022 LW A0,9AF0 (V0) ;A0=80249AF0: LW A1,7AC0 (V1) ;A1=80227AC0: ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8021109C ;strcpy(A0,A1) NOP LUI V0,8025 LW V0,A6F8 (V0) ;A0=8024A6F8: JAL 80220C84 SB R0,0000 (V0) ;NULL->V0: LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80220D5C LUI V0,8025 LUI V1,8022 LW A0,9AF0 (V0) ;A0=80249AF0: LW A1,7ADC (V1) ;A1=80227ADC: ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8021109C ;strcpy(A0,A1) NOP LUI V0,8025 LW V0,A6F8 (V0) ;A0=8024A6F8: JAL 80220C84 SB R0,0000 (V0) ;NULL->V0: LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80220D98 LUI V0,8025 LUI V1,8022 LW A0,9AF0 (V0) ;A0=80249AF0: LW A1,7AE0 (V1) ;A1=80227AE0: ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8021109C ;strcpy(A0,A1) NOP LUI V0,8025 LW V0,A6F8 (V0) ;V0=8024A6F8: JAL 80220C84 SB R0,0000 (V0) ;NULL->V0: LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80220DD4 LUI V0,8025 LUI V1,8022 LW A0,9AF0 (V0) ;A0=80249AF0: LW A1,7AE4 (V1) ;A1=80227AE4: ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 8021109C ;strcpy(A0,A1) NOP LUI V0,8025 LW V0,A6F8 (V0) ;V0=8024A6F8: JAL 80220C84 SB R0,0000 (V0) ;NULL-> LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80220E10 ADDIU SP,SP,FFD0 SW S0,0010 (SP) ADDU S0,A0,R0 SW S3,001C (SP) LUI S3,0800 ORI S3,S3,0002 ;S3=08000002: + up, stick up SW S2,0018 (SP) LUI S2,0400 LUI V0,8025 LW A0,9AF0 (V0) LUI V0,8022 LW A1,7AD0 (V0) ORI S2,S2,0001 ;S2=04000001: + down, stick down SW S6,0028 (SP) LUI S6,4000 ;S6=40000000: B button SW S5,0024 (SP) ADDIU S5,R0,0001 SW S4,0020 (SP) LUI S4,8000 ;S4=80000000: A button SW RA,002C (SP) JAL 8021109C ;strcpy(A0,A1) SW S1,0014 (SP) LUI V0,8025 LW A0,A6F8 (V0) JAL 802110C4 ;strcat(A0,A1) ADDU A1,S0,R0 LUI V0,8024 ADDU S1,V0,R0 LUI V0,8024 SW R0,2D18 (V0) LUI V0,8025 SW R0,EF70 (S1) SW R0,9118 (V0) JAL 80210D4C ;V0=button and stick pos NOP ADDU S0,V0,R0 ;S0=V0: button/stick AND V0,S0,S3 ;V0=nonzero if up pressed BEQ V0,R0,80220EC0 AND V0,S0,S2 ;V0=nonzero if down pressed LW V0,EF70 (S1) BLEZ V0,80220EBC ADDIU V0,V0,FFFF SW V0,EF70 (S1) AND V0,S0,S2 ;V0=nonzero if down pressed BEQ V0,R0,80220EE0 AND V0,S0,S6 ;V0=nonzero if B pressed LW V0,EF70 (S1) BGTZL V0,80220EE0 AND V0,S0,S6 ADDIU V0,V0,0001 SW V0,EF70 (S1) //80220EDC: AND V0,S0,S6 ;V0=nonzero if B pressed BEQ V0,R0,80220EF0 NOP LUI S0,8000 SW S5,EF70 (S1) JAL 80220C50 ADDU A0,R0,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP AND V0,S0,S4 ;V0=nonzero if A pressed BEQ V0,R0,80220E94 ADDIU A0,R0,000C ;A0=12 times LUI S0,8022 ADDIU S0,S0,0C50 ADDU A1,S0,R0 ;A1=80220C50 LUI V0,8024 ADDIU S1,R0,0001 JAL 8021120C ;call routine A1 A0 times SW S1,2D18 (V0) LUI A0,8000 ;A0=80000000: A button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=80220C50 LUI A0,4000 ;A0=40000000: B button JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S0,R0 ;A1=80220C50 LUI V1,8024 LW V0,EF70 (V1) BEQ V0,S1,80220F64 ADDIU V0,R0,FFFF SW V0,EF70 (V1) J 80220F6C ADDU V0,S1,R0 SW V0,EF70 (V1) ADDU V0,R0,R0 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 80220F94 ADDIU SP,SP,FFE0 ORI A0,R0,8000 ;A0=8000 bytes SW RA,001C (SP) SW S2,0018 (SP) SW S1,0014 (SP) JAL 80215804 ;V0=p->A0 bytes of allocated memory SW S0,0010 (SP) LUI V1,8025 LW A0,9AF0 (V1) LUI V1,8022 LW A1,7AB0 (V1) JAL 8021109C ;strcpy(A0,A1) ADDU S0,V0,R0 LUI V0,8025 LW V0,A6F8 (V0) ADDU S1,R0,R0 JAL 80201D44 ;reset controller and cart eeprom status SB R0,0000 (V0) JAL 80201E64 ;V0=TRUE if controller 1 slot filled NOP LUI A0,8024 ADDIU A0,A0,2050 ADDU A1,S1,R0 LUI V0,8025 LW S2,9128 (V0) ;S2=80249128: p->PIFram buffer JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,0A00 ADDU A2,S1,R0 LUI V0,8024 ADDIU A1,V0,0020 LUI V0,8024 ADDIU A0,V0,2038 LUI V0,8024 ADDIU V1,V0,2D00 SW R0,0000 (V1) SW R0,0000 (A0) SW R0,0000 (A1) ADDIU A1,A1,0004 ADDIU A0,A0,0004 ADDIU A2,A2,0001 SLTI V0,A2,0006 BNE V0,R0,8022101C ADDIU V1,V1,0004 LUI V1,8025 LUI V0,8024 ADDIU T2,V0,EF78 ADDIU T1,V1,9130 LWL A3,0000 (T2) LWR A3,0003 (T2) LWL T0,0004 (T2) LWR T0,0007 (T2) SWL A3,0000 (T1) SWR A3,0003 (T1) SWL T0,0004 (T1) SWR T0,0007 (T1) LWL A3,0008 (T2) LWR A3,000B (T2) LB T0,000C (T2) SWL A3,0008 (T1) SWR A3,000B (T1) SB T0,000C (T1) LUI V1,8022 LUI V0,8024 ADDIU T2,V0,EF88 ADDIU T1,V1,537C LWL A3,0000 (T2) LWR A3,0003 (T2) LB T0,0004 (T2) SWL A3,0000 (T1) SWR A3,0003 (T1) SB T0,0004 (T1) LB A3,0005 (T2) SB A3,0005 (T1) LUI V0,8022 SB R0,5374 (V0) ADDIU V0,V0,5374 SB R0,0001 (V0) SB R0,0002 (V0) SB R0,0003 (V0) LBU V0,0006 (S2) ANDI V0,V0,0001 BEQ V0,R0,8022114C NOP JAL 80201EE0 ADDIU A0,R0,0001 JAL 80201164 ;generate table of note entry names for mempak A0 ADDIU A0,R0,0001 ADDU A0,S0,R0 JAL 802216B4 ADDIU A1,R0,0001 BLEZ V0,8022114C LUI V1,4E36 LW V0,0000 (S0) ORI V1,V1,3400 BNE V0,V1,8022114C NOP LW A1,0004 (S0) JAL 802217F4 ADDIU A0,S0,0008 JAL 8020E39C ;replace codelist on ROM with revised copy ADDU S1,V0,R0 LUI A0,0003 ;A0=30000: ROM codelist location LUI V0,8022 LW A1,7570 (V0) ;A1=80227570: p->cur.codelist JAL 80218024 ;V0=0 if A2 bytes at hardware A0 and dram A1 match or -1 if failed LUI A2,0001 ;A2=10000: size BEQ V0,R0,8022114C ;branch if files match NOP JAL 8020E39C ;replace codelist on ROM with revised copy NOP JAL 802158AC ;free allocated memory A0 ADDU A0,S0,R0 BGTZ S1,80221160 ADDU V0,S1,R0 ADDU V0,R0,R0 LW RA,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 80221178 ADDIU SP,SP,FFD8 SW S0,0010 (SP) ADDU S0,A0,R0 LUI V0,8025 LW A0,9AEC (V0) LUI V0,8022 LW A1,7AF0 (V0) SW RA,0020 (SP) SW S3,001C (SP) SW S2,0018 (SP) JAL 8021109C ;strcpy(A0,A1) SW S1,0014 (SP) JAL 80215804 ;V0=p->A0 bytes of allocated memory ORI A0,R0,8000 ;A0=8000 bytes ADDU A0,S0,R0 JAL 8020E454 ;V0=p->game A0 entry in codelist ADDU S2,V0,R0 ADDU S0,V0,R0 BEQ S0,R0,80221340 NOP JAL 8020E4AC ADDU A0,S0,R0 LUI V1,4E36 ORI V1,V1,3400 ADDIU A0,S2,0008 ADDU A1,S0,R0 SUBU S1,V0,A1 ADDU A2,S1,R0 SW V1,0000 (S2) JAL 802156F0 SW S1,0004 (S2) JAL 80201D44 ;reset controller and cart eeprom status NOP JAL 80201E64 ;V0=TRUE if controller 1 slot filled NOP LUI A0,8024 ADDIU A0,A0,2050 ADDU A1,R0,R0 LUI V0,8025 LW S3,9128 (V0) ;S3=80249128: p->PIFram buffer JAL 80215758 ;V0=memset(A0,A1,A2) ADDIU A2,R0,0A00 ADDU A2,R0,R0 LUI V0,8024 ADDIU A1,V0,0020 LUI V0,8024 ADDIU A0,V0,2038 LUI V0,8024 ADDIU V1,V0,2D00 SW R0,0000 (V1) SW R0,0000 (A0) SW R0,0000 (A1) ADDIU A1,A1,0004 ADDIU A0,A0,0004 ADDIU A2,A2,0001 SLTI V0,A2,0006 BNE V0,R0,8022123C ADDIU V1,V1,0004 LUI V1,8025 LUI V0,8024 ADDIU T3,V0,EF78 ADDIU T2,V1,9130 LWL T0,0000 (T3) LWR T0,0003 (T3) LWL T1,0004 (T3) LWR T1,0007 (T3) SWL T0,0000 (T2) SWR T0,0003 (T2) SWL T1,0004 (T2) SWR T1,0007 (T2) LWL T0,0008 (T3) LWR T0,000B (T3) LB T1,000C (T3) SWL T0,0008 (T2) SWR T0,000B (T2) SB T1,000C (T2) LUI V1,8022 LUI V0,8024 ADDIU T3,V0,EF88 ADDIU T2,V1,537C LWL T0,0000 (T3) LWR T0,0003 (T3) LB T1,0004 (T3) SWL T0,0000 (T2) SWR T0,0003 (T2) SB T1,0004 (T2) LB T0,0005 (T3) SB T0,0005 (T2) LUI V0,8022 ADDIU S0,V0,5374 SB R0,5374 (V0) SB R0,0001 (S0) SB R0,0002 (S0) SB R0,0003 (S0) LBU V0,0006 (S3) ANDI V0,V0,0001 BEQ V0,R0,80221338 NOP JAL 80201EE0 ADDIU A0,R0,0001 JAL 80201164 ;generate table of note entry names for mempak A0 ADDIU A0,R0,0001 ADDIU A1,S1,0100 BLTZL A1,8022131C ADDIU A1,S1,01FF ADDU A0,S2,R0 SRA A1,A1,0x8 ADDU A2,S0,R0 JAL 802018CC ADDIU A3,R0,0001 BNE V0,R0,80221340 NOP JAL 80220D98 NOP JAL 802158AC ;free allocated memory A0 ADDU A0,S2,R0 LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80221364 ADDIU SP,SP,FFD0 SW S1,0014 (SP) ADDU S1,A0,R0 SW S2,0018 (SP) ADDU S2,R0,R0 SW RA,002C (SP) SW S6,0028 (SP) SW S5,0024 (SP) SW S4,0020 (SP) SW S3,001C (SP) SW S0,0010 (SP) LW V0,0004 (S1) ADDIU V1,R0,FF00 ADDIU V0,V0,0107 AND S0,V0,V1 BGEZ S0,802213AC ADDU V0,S0,R0 ADDIU V0,S0,00FF SRA S4,V0,0x8 JAL 802014F4 ADDIU A0,R0,0001 JAL 802017E4 ADDU S6,V0,R0 ADDIU V1,R0,0010 BEQL V0,V1,802213CC ADDU S6,R0,R0 BLEZ S6,80221678 ADDU S3,S1,R0 JAL 8020237C ADDIU A0,R0,0001 ADDU S0,V0,R0 BEQ S0,R0,802215AC ANDI S5,S6,00FF LH S0,0008 (S0) BNE S4,S0,80221434 SLT V0,S4,S0 BEQ S4,R0,80221678 LUI V0,8024 ADDIU S1,V0,0038 LH S2,0000 (S1) ADDIU S1,S1,0002 ADDU A0,S3,R0 ADDIU A2,R0,0100 ADDIU A3,R0,0001 ADDIU S0,S0,FFFF ADDU S3,S3,A2 JAL 80202548 SLL A1,S2,0x8 BEQ S0,R0,80221678 NOP J 80221400 NOP BEQ V0,R0,8022152C NOP BEQ S4,R0,80221480 ADDU S5,R0,R0 LUI V0,8024 ADDIU S1,V0,0038 LH S2,0000 (S1) ADDIU S1,S1,0002 ADDIU S5,S5,0001 ADDU A0,S3,R0 ADDIU A2,R0,0100 ADDIU A3,R0,0001 ADDIU S0,S0,FFFF ADDIU S4,S4,FFFF ADDU S3,S3,A2 JAL 80202548 SLL A1,S2,0x8 BNE S4,R0,8022144C NOP LUI V0,8024 ADDIU A0,V0,4F90 SLL V0,S2,0x1 ADDU V0,V0,A0 ADDIU V1,R0,0001 SH V1,2000 (V0) BEQ S0,R0,802214D8 SH V1,0000 (V0) ADDU A1,A0,R0 ADDIU A0,R0,0003 LUI V0,8024 ADDIU V0,V0,0038 SLL V1,S5,0x1 ADDU V1,V1,V0 LH S2,0000 (V1) ADDIU V1,V1,0002 ADDIU S0,S0,FFFF SLL V0,S2,0x1 ADDU V0,V0,A1 SH A0,2000 (V0) BNE S0,R0,802214B8 SH A0,0000 (V0) ADDU S2,R0,R0 ADDIU A0,R0,0005 LUI V0,8024 ADDIU V0,V0,4F90 ADDIU V1,V0,000A LH V0,0000 (V1) ADDIU A0,A0,0001 ADDU S2,S2,V0 SLTI V0,A0,0080 BNE V0,R0,802214EC ADDIU V1,V1,0002 LUI V0,8024 ADDIU A0,V0,4F90 ADDIU A1,R0,0200 ADDIU A2,R0,0100 ADDIU A3,R0,0001 SH S2,2000 (A0) JAL 80202548 SH S2,4F90 (V0) J 80221678 NOP JAL 802021C4 NOP SUBU V1,S4,S0 SLT V0,V0,V1 BNEL V0,R0,80221678 ADDU S6,R0,R0 BEQ S0,R0,80221580 LUI V0,8024 ADDIU S1,V0,0038 LH S2,0000 (S1) ADDIU S1,S1,0002 ADDU A0,S3,R0 ADDIU A2,R0,0100 ADDIU A3,R0,0001 ADDIU S0,S0,FFFF ADDIU S4,S4,FFFF ADDU S3,S3,A2 JAL 80202548 SLL A1,S2,0x8 BNE S0,R0,80221550 NOP ADDU A0,S4,R0 ADDU A1,S5,R0 ADDU A2,S3,R0 ADDIU A3,R0,0001 LUI V1,8024 ADDIU V1,V1,4F90 SLLV V0,S2,A3 ADDU V0,V0,V1 SH A1,2000 (V0) J 80221670 SH A1,0000 (V0) JAL 802021C4 NOP SLT V0,V0,S4 BEQ V0,R0,802215C8 ADDIU V1,R0,00FF J 80221678 ADDU S6,R0,R0 ADDU A0,R0,R0 ADDU A2,V1,R0 LUI V0,8025 ADDIU A1,V0,A708 BNEL V1,A2,802215F0 ADDIU A0,A0,0001 LBU V0,0010 (A1) BEQL V0,R0,802215EC ADDU V1,A0,R0 ADDIU A0,A0,0001 SLTI V0,A0,0010 BNE V0,R0,802215D8 ADDIU A1,A1,0020 ADDIU V0,R0,00FF BNE V1,V0,80221610 SLL V1,V1,0x5 J 8022168C ADDU V0,R0,R0 LUI V0,8025 ADDIU V0,V0,A708 ADDU S0,V1,V0 ADDIU A0,S0,0010 LUI A1,8025 JAL 8021109C ;strcpy(A0,A1) ADDIU A1,A1,9130 ADDU A0,S4,R0 ADDU A1,S5,R0 ADDU A2,S3,R0 ADDIU A3,R0,0001 SLL V0,A0,0x8 SH V0,0008 (S0) LUI V0,8022 SH A1,0006 (S0) ADDIU T3,V0,537C LWL T0,0000 (T3) LWR T0,0003 (T3) LB T1,0004 (T3) LB T2,0005 (T3) SWL T0,0000 (S0) SWR T0,0003 (S0) SB T1,0004 (S0) SB T2,0005 (S0) JAL 80202728 NOP BGEZ S6,8022168C ADDU V0,S6,R0 JAL 80220DD4 NOP ADDU V0,S6,R0 LW RA,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0030 802216B4 ADDIU SP,SP,FFD8 SW S4,0020 (SP) ADDU S4,A0,R0 SW S3,001C (SP) ADDU S3,A1,R0 ADDU A0,S3,R0 SW RA,0024 (SP) SW S2,0018 (SP) SW S1,0014 (SP) JAL 802014F4 SW S0,0010 (SP) BLEZ V0,80221750 NOP JAL 8020237C ADDU A0,S3,R0 BEQ V0,R0,80221758 ADDU S0,R0,R0 LH S0,0008 (V0) BEQ S0,R0,80221738 ADDU S2,S4,R0 LUI V0,8024 ADDIU S1,V0,0038 LH A1,0000 (S1) ADDIU S1,S1,0002 ADDU A0,S2,R0 ADDIU S0,S0,FFFF ADDIU S2,S2,0100 ADDIU A2,R0,0100 ADDU A3,S3,R0 JAL 8020222C ;copy data from controller A3's mempak blocks A1-A2 to A0 SLL A1,A1,0x8 BNE S0,R0,8022170C NOP JAL 80220E10 ADDIU A0,S4,0008 BEQ V0,R0,80221758 ADDIU S0,R0,FFFE J 80221758 ADDIU S0,R0,0001 JAL 80220DD4 ADDIU S0,R0,FFFF BNE S0,R0,8022176C ADDU V0,S0,R0 JAL 80220D5C NOP ADDU V0,S0,R0 LW RA,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8022178C ADDIU SP,SP,FFE0 SW S1,0014 (SP) ADDU S1,A1,R0 SW RA,0018 (SP) SW S0,0010 (SP) LBU V0,0000 (A0) BEQ V0,R0,802217BC ADDIU S0,R0,0001 ADDU V0,A0,S0 LBU V0,0000 (V0) BNE V0,R0,802217AC ADDIU S0,S0,0001 ADDIU V0,S0,0001 ADDIU S0,R0,0001 BEQ S1,S0,802217DC ADDU A0,A0,V0 JAL 8020EAE8 ADDIU S0,S0,0001 BNE S0,S1,802217CC ADDU A0,V0,R0 LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) ADDU V0,A0,R0 JR RA ADDIU SP,SP,0020 802217F4 ADDIU SP,SP,FF58 SW S2,0088 (SP) ADDU S2,R0,R0 SW S1,0084 (SP) ADDU S1,S2,R0 SW RA,00A4 (SP) SW S8,00A0 (SP) SW S7,009C (SP) SW S6,0098 (SP) SW S5,0094 (SP) SW S4,0090 (SP) SW S3,008C (SP) SW S0,0080 (SP) SW A0,00A8 (SP) JAL 8020E588 ;V0=#games in current codelist SW A1,00AC (SP) SW V0,0070 (SP) LW A3,0070 (SP) ADDIU V0,R0,03E8 BEQ A3,V0,80221B54 ADDIU V0,R0,FFFF LW A0,00A8 (SP) JAL 802141F0 ;V0=strlen(A0) NOP JAL 8020E6B8 NOP JAL 8020E588 ;V0=#games in current codelist ADDU S7,V0,R0 BNE V0,R0,80221894 LUI V0,8022 ADDIU S1,R0,0001 LW A1,00A8 (SP) LW A0,7570 (V0) ;A0=80227570: p->cur.codelist LW A2,00AC (SP) JAL 802156F0 ADDIU A0,A0,0004 J 80221B40 NOP J 80221B54 ADDIU V0,R0,FFFE LW T0,0070 (SP) BEQ T0,R0,80221B40 ADDIU S8,R0,0001 ADDIU A3,SP,0010 ADDIU T0,SP,0040 SW A3,0078 (SP) SW T0,0074 (SP) JAL 8020E454 ;V0=p->game A0 entry in codelist ADDU A0,S8,R0 ADDU S4,V0,R0 ADDU A0,R0,R0 LBU V1,0000 (S4) BEQ V1,R0,802218FC ADDIU S0,S4,0001 ADDIU V0,V1,FF9F ANDI V0,V0,00FF SLTIU V0,V0,001A BNEL V0,R0,802218E0 ADDIU V1,V1,FFE0 LW A3,0078 (SP) ADDU V0,A3,A0 ADDIU A0,A0,0001 SB V1,0000 (V0) LBU V1,0000 (S0) BNE V1,R0,802218CC ADDIU S0,S0,0001 LW T0,0078 (SP) LW S0,00A8 (SP) ADDU V0,T0,A0 ADDU A0,R0,R0 J 80221938 SB R0,0000 (V0) ADDIU V0,V1,FF9F ANDI V0,V0,00FF SLTIU V0,V0,001A BNEL V0,R0,80221928 ADDIU V1,V1,FFE0 LW A3,0074 (SP) ADDU V0,A3,A0 ADDIU A0,A0,0001 SB V1,0000 (V0) LBU V1,0000 (S0) BNE V1,R0,80221914 ADDIU S0,S0,0001 LW T0,0074 (SP) ADDU V0,T0,A0 SB R0,0000 (V0) LW A0,0074 (SP) JAL 80211028 ADDIU A1,SP,0010 BGEZ V0,802219C4 NOP JAL 8020E6B8 NOP ADDU S7,V0,R0 LUI A3,8022 LW V0,7570 (A3) ;V0=80227570: p->cur.codelist LW T0,00AC (SP) LUI A3,0001 ADDU V1,S7,T0 ADDU V0,V0,A3 ;V0+=10000: p->end of codelist SLTU V1,V1,V0 BEQ V1,R0,8022188C ADDU A0,S4,T0 ADDU A1,S4,R0 JAL 8020FB70 SUBU A2,S7,S4 LW A1,00A8 (SP) LW A2,00AC (SP) JAL 802156F0 ADDU A0,S4,R0 JAL 8020E550 ;V0=0 if successfully increased #games by 1; else -1 ADDU A0,S4,R0 ADDIU S2,R0,0001 J 80221B24 ADDU S1,S8,R0 BLEZ V0,80221A38 NOP LW T0,0070 (SP) SLT V0,S8,T0 BNE V0,R0,80221B24 NOP JAL 8020E4AC ADDU A0,S4,R0 ADDU S4,V0,R0 LUI T0,8022 LW A3,00AC (SP) LW V0,7570 (T0) ;V0=80227570: p->cur.codelist ADDU S0,S4,A3 ADDIU V1,S0,0001 LUI A3,0001 ADDU V0,V0,A3 ;V0+=10000: p->end of codelist SLTU V1,V1,V0 BEQ V1,R0,80221B54 ADDIU V0,R0,FFFE LW A1,00A8 (SP) LW A2,00AC (SP) JAL 802156F0 ADDU A0,S4,R0 JAL 8020E550 ;V0=0 if successfully increased #games by 1; else -1 SB R0,0001 (S0) LW T0,0070 (SP) ADDIU S2,R0,0001 J 80221B24 ADDU S1,T0,S2 BNE V0,R0,80221B24 NOP LW A0,00A8 (SP) JAL 8020ED10 ;V0=#codes for game entry A0 ADDIU S2,R0,0001 ADDU S6,V0,R0 BLEZL S6,80221B20 ADDU S1,S8,R0 LW A0,00A8 (SP) JAL 8022178C ADDU A1,S2,R0 ADDU A0,S4,R0 ADDU S5,V0,R0 JAL 80221B84 ADDU A1,S5,R0 BNEL V0,R0,80221B10 ADDIU S2,S2,0001 SLT V0,S2,S6 BEQ V0,R0,80221A9C NOP LW A0,00A8 (SP) JAL 8022178C ADDIU A1,S2,0001 J 80221AA8 ADDU S0,V0,R0 LW A3,00A8 (SP) LW T0,00AC (SP) ADDU S0,A3,T0 SUBU S1,S0,S5 LUI A3,8022 LW V0,7570 (A3) ;V0=80227570: p->cur.codelist ADDU S3,S7,S1 LUI T0,0001 ADDU V0,V0,T0 ;V0+=10000: p->end of codelist SLTU V0,S3,V0 BEQ V0,R0,80221B54 ADDIU V0,R0,FFFE JAL 8020E4AC ADDU A0,S4,R0 ADDU S0,V0,R0 ADDU A0,S0,S1 ADDU A1,S0,R0 JAL 8020FB70 SUBU A2,S7,S0 ADDU A0,S0,R0 ADDU A1,S5,R0 JAL 802156F0 ADDU A2,S1,R0 ADDU S7,S3,R0 ADDU A0,S4,R0 SB R0,0000 (S7) JAL 8020EE10 SB R0,0001 (S7) ADDIU S2,S2,0001 SLT V0,S6,S2 BEQ V0,R0,80221A58 NOP ADDU S1,S8,R0 ADDIU S2,R0,0001 LW A3,0070 (SP) ADDIU S8,S8,0001 ADDIU V0,A3,0001 BEQ S8,V0,80221B40 NOP BEQ S2,R0,802218B0 NOP JAL 8020E3C4 NOP JAL 8020F664 ADDU A0,S1,R0 ADDU V0,S1,R0 LW RA,00A4 (SP) LW S8,00A0 (SP) LW S7,009C (SP) LW S6,0098 (SP) LW S5,0094 (SP) LW S4,0090 (SP) LW S3,008C (SP) LW S2,0088 (SP) LW S1,0084 (SP) LW S0,0080 (SP) JR RA ADDIU SP,SP,00A8 80221B84 ADDIU SP,SP,FFD8 SW S2,0018 (SP) ADDU S2,A0,R0 SW S3,001C (SP) ADDU S3,A1,R0 SW RA,0020 (SP) SW S1,0014 (SP) JAL 8020ED10 ;V0=#codes for game entry A0 SW S0,0010 (SP) ADDU S1,V0,R0 BLEZ S1,80221BE8 ADDIU S0,R0,0001 ADDU A0,S2,R0 JAL 8022178C ADDU A1,S0,R0 ADDU A0,V0,R0 JAL 80211028 ADDU A1,S3,R0 BNE V0,R0,80221BDC ADDIU S0,S0,0001 J 80221BEC ADDIU V0,R0,0001 SLT V0,S1,S0 BEQ V0,R0,80221BB8 ADDU A0,S2,R0 ADDU V0,R0,R0 LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 80221C08 V0=0 JR RA ADDU V0,R0,R0 80221C10 accepts: A0=, A1=, A2= ADDIU SP,SP,FF90 SW S6,0068 (SP) ADDU S6,A0,R0 SW S5,0064 (SP) ADDU S5,A1,R0 SW S4,0060 (SP) ADDU S4,A2,R0 SW S3,005C (SP) ADDU S3,A3,R0 SW RA,006C (SP) SW S2,0058 (SP) SW S1,0054 (SP) BEQ S6,R0,80221C8C SW S0,0050 (SP) ADDIU S2,R0,0003 ADDIU A0,R0,0004 ADDIU A1,R0,00C8 LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table LUI A2,8025 LW A3,048C (V0) ;A3=str+48C: 80224030 "\0" LW V1,0494 (V0) ;V1=str+494: 80224030 "\0" LW T0,0490 (V0) ;T0=str+490: 80224030 "\0" LW V0,0498 (V0) ;V0=str+498: 80223020 "Press 'B' To Continue" ADDIU A2,A2,9888 SW V1,0010 (SP) SW T0,0014 (SP) JAL 802137A4 SW V0,0018 (SP) J 80221CC0 NOP ADDIU S2,R0,0002 ADDIU A0,R0,0003 ADDIU A1,R0,00C8 LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: string pointer table LUI A2,8025 LW A3,048C (V0) ;A3=str+48C: 80224030 "\0" LW V1,0494 (V0) ;V1=str+494: 80224030 "\0" LW V0,0498 (V0) ;V0=str+498: 80223020 "Press 'B' To Continue" ADDIU A2,A2,9888 SW V1,0010 (SP) JAL 802137A4 SW V0,0014 (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP BNE S3,R0,80221CDC ADDIU A0,S3,000E JAL 80212B20 ADDIU A0,R0,0001 ADDIU A0,S3,000E ADDIU A1,R0,000E LUI V0,8022 LW A3,772C (V0) ADDIU A2,R0,001F JAL 80212C90 SW R0,0010 (SP) BEQ S6,R0,80221D3C ADDIU A1,R0,003C ADDIU S0,S3,0010 ADDU A0,S0,R0 ADDIU A2,R0,001F ADDU A3,S2,R0 SW R0,0010 (SP) SW S5,0014 (SP) JAL 80212E3C SW S4,0018 (SP) ADDU A0,S0,R0 ADDIU A1,R0,003C ADDIU A2,R0,001F ADDU A3,S2,R0 LUI V0,8025 ADDIU V0,V0,9888 J 80221D7C SW S5,0010 (SP) ADDIU S1,S3,0010 ADDU A0,S1,R0 ADDIU A2,R0,001F ADDU A3,S2,R0 ADDIU S0,S5,FFFF SW R0,0010 (SP) SW S0,0014 (SP) JAL 80212E3C SW S4,0018 (SP) ADDU A0,S1,R0 ADDIU A1,R0,003C ADDIU A2,R0,001F ADDU A3,S2,R0 LUI V0,8025 ADDIU V0,V0,9888 SW S0,0010 (SP) SW S4,0014 (SP) JAL 80213820 SW V0,0018 (SP) ADDIU A0,R0,0010 SUBU A0,A0,S3 ADDIU A1,R0,0099 ADDIU A2,R0,0120 ADDIU A3,R0,0038 LUI V1,8022 SUBU V0,R0,S3 SW V0,7650 (V1) JAL 80213364 SW R0,0010 (SP) LUI S0,FFC0 BEQ S6,R0,80221E10 ORI S0,S0,FFC0 ;S0=FFC0FFC0: RGBA ADDU A0,S6,R0 JAL 8020FB14 ADDIU A1,SP,0020 // ADDIU A0,R0,00AA ;A0=AA: ypos? ADDIU A1,SP,0020 ;A1=SP+20: LUI A2,FFC0 ORI A2,A2,FFC0 ;A2=FFC0FFC0: RGBA JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 ;A3=0 // LUI V0,8025 LW A0,A90C (V0) ;A0=8024A90C: #activated codes LUI V0,8022 ADDIU V0,V0,7660 ;V0=80227660: base address for string table LW A1,001C (V0) ;A1=str+1C: 80224328 "Cheat Codes Are On" LW A2,00E8 (V0) ;A2=str+E8: 80224040 "Cheat Code Is On" ADDIU A3,R0,00B4 ;A3=B4: ypos? SW S0,0010 (SP) ;SP+10=S0: RGBA JAL 80210FA0 ;print (A0>1 ? A1:A2) centered on line A3 in colour SP+10 SW R0,0014 (SP) ;SP+14=0: J 80221E48 NOP //80221E10: default selected cheat code message ADDIU A0,R0,00AA ;A0=AA: ypos? LUI A2,FFC0 ORI A2,A2,FFC0 ;A2=FFC0FFC0: RGBA LUI S0,8022 ADDIU S0,S0,7660 ;S0=80227660: base address for string table LW A1,0014 (S0) ;A1=str+14: 80224354 "No Game Selected" JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 ;A3=0 //80221E30: ADDIU A0,R0,00B4 ;A0=B4: ypos? LUI A2,FFC0 ORI A2,A2,FFC0 ;A2=FFC0FFC0: RGBA LW A1,0018 (S0) ;A1=str+18: 8022433C "No Cheat Codes Are On" JAL 80210E8C ;print A1 centered on line A0 in colour A2 ADDU A3,R0,R0 ;A3=0 //80221E48: LW RA,006C (SP) LW S6,0068 (SP) LW S5,0064 (SP) LW S4,0060 (SP) LW S3,005C (SP) LW S2,0058 (SP) LW S1,0054 (SP) LW S0,0050 (SP) LUI V0,8022 SW R0,7650 (V0) ;0->80227650: base x offset JR RA ADDIU SP,SP,0070 80221E78: LUI V0,8025 LUI V1,8025 LUI A2,8025 SUBU A3,R0,A0 LW A0,9958 (V0) ;A0=80249958: LW A1,9114 (V1) ;A1=80249114: LW A2,8F9C (A2) ;A2=80248F9C: ADDIU SP,SP,FFE8 SW RA,0010 (SP) JAL 80221C10 NOP LW RA,0010 (SP) JR RA ADDIU SP,SP,0018 80221EB0: ADDIU SP,SP,FFC8 SW S5,0024 (SP) ADDU S5,A0,R0 SW S0,0010 (SP) ADDU S0,A1,R0 SW S7,002C (SP) ADDIU S7,R0,0001 SW S3,001C (SP) ADDU S3,R0,R0 SW S2,0018 (SP) ADDU S2,S3,R0 SW RA,0034 (SP) SW S8,0030 (SP) SW S6,0028 (SP) SW S4,0020 (SP) BLEZ S5,80221F08 SW S1,0014 (SP) JAL 8020F9B0 NOP LUI V1,8025 J 80221F10 SW V0,A90C (V1) LUI V0,8025 SW R0,A90C (V0) LUI V0,8025 LUI S8,8025 LUI S6,8025 SW S5,9958 (V0) LW V0,A90C (S6) LUI S1,8025 SW R0,8F9C (S8) SLTIU V0,V0,0001 JAL 8021084C SW V0,9114 (S1) ADDU A0,S0,R0 LUI S4,8022 ADDIU S0,S4,1E78 ADDU A1,S0,R0 JAL 8021401C ADDU A2,R0,R0 JAL 80215A1C ;V0=button and stick pos for controller 1 NOP BNE S2,R0,802220DC LUI V0,8025 ADDU S6,S8,R0 ADDU S8,S4,R0 ADDU S4,S0,R0 JAL 80210D4C ;V0=button and stick pos NOP LUI V1,0800 ORI V1,V1,0002 ;V1=08000002: + up, stick up ADDU S0,V0,R0 ;S0=V0: button/stick AND V1,S0,V1 ;V1=nonzero if up pressed BEQ V1,R0,80221FB4 LUI V0,0400 LUI T0,8025 LW V0,A90C (T0) LW V1,9114 (S1) SLTIU V0,V0,0001 SLT V0,V0,V1 BEQ V0,R0,80221FB0 ADDIU V0,V1,FFFF ADDIU S3,R0,0001 SW V0,9114 (S1) LUI V0,0400 ORI V0,V0,0001 ;V0=04000001: + down, stick down AND V0,S0,V0 ;V0=nonzero if down pressed BEQ V0,R0,80221FE4 LUI V0,1000 LW V1,9114 (S1) SLTI V0,V1,0002 BEQ V0,R0,80221FE4 LUI V0,1000 ADDIU S3,R0,0001 ADDU V0,V1,S3 SW V0,9114 (S1) LUI V0,1000 AND V0,S0,V0 ;V0=nonzero if Start pressed BEQ V0,R0,80222034 ADDU A0,S5,R0 ADDIU S2,R0,0001 ADDU A2,S2,R0 LUI T0,8025 LW A1,A90C (T0) ADDU A3,R0,R0 SW S2,8F9C (S6) SLTU A1,A1,S2 JAL 80221C10 SW A1,9114 (S1) JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDIU A0,R0,000C ;A0=12 times JAL 8021120C ;call routine A1 A0 times ADDU A1,S4,R0 ;A1=80221E78 LUI A0,0002 ;A0=00020000: c left JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S4,R0 ;A1=80221E78 LUI V0,4000 AND V0,S0,V0 ;V0=nonzero if B pressed BEQ V0,R0,80222048 ADDIU V0,R0,0002 SW V0,9114 (S1) LUI V0,C000 AND V0,S0,V0 ;V0= nonzero if A or B pressed BEQ V0,R0,80222090 ADDU A0,S5,R0 ADDIU S2,R0,0001 ADDU A2,S2,R0 LW A1,9114 (S1) ADDU A3,R0,R0 JAL 80221C10 SW S2,8F9C (S6) JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP ADDIU A0,R0,000C ;A0=12 times JAL 8021120C ;call routine A1 A0 times ADDU A1,S4,R0 ;A1=80221E78 LUI A0,0002 ;A0=00020000: c left JAL 80211130 ;use handler A1 if buttons A0 pressed ADDU A1,S4,R0 ;A1=80221E78 ADDU A0,S5,R0 LW A1,9114 (S1) LW A2,8F9C (S6) JAL 80221C10 ADDU A3,R0,R0 JAL 8021110C ;unconditional return NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP BEQ S3,R0,802220D4 ADDU A0,S0,R0 ADDIU A1,R0,0005 ADDU A2,S7,R0 JAL 802111A0 ADDIU A3,S8,1E78 ADDU S3,R0,R0 ADDU S7,S3,R0 BEQ S2,R0,80221F6C LUI V0,8025 LW V0,9114 (V0) LW RA,0034 (SP) LW S8,0030 (SP) LW S7,002C (SP) LW S6,0028 (SP) LW S5,0024 (SP) LW S4,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 80222110 read eeprom block A0 accepts: A0=block# ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,R0,R0 ;S0=0 init.count LUI V1,8025 SW S1,0014 (SP) ADDU S1,V1,R0 ;S1=V1: 80250000 LW V0,9128 (V1) ;V0=80249128: p->PIFram buffer ADDIU V1,R0,0002 SW RA,0018 (SP) SB V1,0004 (V0) ;02->buffer+4: bytes written ADDIU V1,R0,0008 SB V1,0005 (V0) ;08->buffer+5: bytes read ADDIU V1,R0,0004 SB V1,0006 (V0) ;04->buffer+6: command: read eeprom ADDIU V1,R0,00FE SB V1,0010 (V0) ;FE->buffer+10: skip remaining channels ADDIU V1,R0,0001 SB R0,0000 (V0) ;00->buffer+0: skip channel 0 SB R0,0001 (V0) ;00->buffer+1: skip channel 1 SB R0,0002 (V0) ;00->buffer+2: skip channel 2 SB R0,0003 (V0) ;00->buffer+3: skip channel 3 SB A0,0007 (V0) ;A0->block SB V1,003F (V0) ;1->buffer+3F: process PIF commands SLL V0,S0,0x2 ;V0=count->offset //80222170: set cache for entire PIFram buffer LW A0,9128 (S1) ;A0=80249128: p->PIFram buffer ADDIU S0,S0,0001 ;S0++ count++ JAL 80218598 ;cache target ADDU A0,A0,V0 ;A0=buffer+offset SLTI V0,S0,0010 BNE V0,R0,80222170 ;loop for entire buffer SLL V0,S0,0x2 //8022218C: LUI V0,8025 LW A0,9128 (V0) ;A0=80249128: p->PIFram buffer JAL 802026E4 ;write buffer A0 to PIFram ADDU S0,R0,R0 ;S0=0 init.count LUI V1,0005 ORI V1,V1,090F ;V1=5090F: 329999 ADDIU S0,S0,0001 ;S0++ count++ //802221A8: wait an arbitrary amount of time SLT V0,V1,S0 BEQ V0,R0,802221A8 ;loop 330000 times ADDIU S0,S0,0001 ;S0++ count++ LUI V0,8025 LW A0,9128 (V0) ;A0=80249128: p->PIFram buffer JAL 80202BAC ;read PIFram to buffer A0 ADDU S0,R0,R0 ;S0=0 init.count LUI V1,0005 ORI V1,V1,090F ;V1=5090F: 329999 ADDIU S0,S0,0001 ;S0++ count++ //802221D0: wait an arbitrary amount of time SLT V0,V1,S0 BEQ V0,R0,802221D0 ;loop 330000 times ADDIU S0,S0,0001 ;S0++ count++ //802221DC: return LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 802221F0 write preset data to eeprom block A0 accepts: A0=block ADDIU SP,SP,FFE0 SW S0,0010 (SP) ADDU S0,R0,R0 ;S0=0 init.count LUI V1,8025 SW S1,0014 (SP) ADDU S1,V1,R0 ;S1=V1: 80250000 LW V0,9128 (V1) ;V0=80249128: p->PIFram buffer ADDIU V1,R0,000A ADDIU A1,R0,0001 SW RA,0018 (SP) SB V1,0004 (V0) ;0A->buffer+4: #bytes written ADDIU V1,R0,0005 SB V1,0006 (V0) ;05->buffer+6: command: write eeprom ADDIU V1,R0,00FE SB R0,0000 (V0) ;00->buffer+0: ignore channel 0 SB R0,0001 (V0) ;00->buffer+1: ignore channel 1 SB R0,0002 (V0) ;00->buffer+2: ignore channel 2 SB R0,0003 (V0) ;00->buffer+3: ignore channel 3 SB A1,0005 (V0) ;01->buffer+5: #bytes read SB A0,0007 (V0) ;A0->buffer+7: block# SB V1,0011 (V0) ;FE->buffer+11: ignore other channels SB A1,003F (V0) ;1->buffer+3F: process PIF commands SLL V0,S0,0x2 //8022224C: set cache for PIFram buffer LW A0,9128 (S1) ;A0=80249128: p->PIFram buffer ADDIU S0,S0,0001 ;S0++ count++ JAL 80218598 ;cache target ADDU A0,A0,V0 ;A0+=V0: buffer+offset SLTI V0,S0,0010 BNE V0,R0,8022224C ;loop through entire buffer SLL V0,S0,0x2 //80222268: copy buffer to PIFram LUI V0,8025 LW A0,9128 (V0) ;A0=80249128: p->PIFram buffer JAL 802026E4 ;write buffer A0 to PIFram ADDU S0,R0,R0 ;S0=0 init.count LUI V1,0005 ORI V1,V1,090F ;V1=5090F: 329999 ADDIU S0,S0,0001 ;S0++ count++ //80222284: wait an arbitrary amount of time SLT V0,V1,S0 BEQ V0,R0,80222284 ;loop 330000 times ADDIU S0,S0,0001 ;S0++ count++ LUI V0,8025 LW A0,9128 (V0) ;A0=80249128: p->PIFram buffer JAL 80202BAC ;read PIFram to buffer A0 ADDU S0,R0,R0 ;S0=0 init.count LUI V1,0005 ORI V1,V1,090F ;V1=5090F: 329999 ADDIU S0,S0,0001 ;S0++ count++ //802222AC: wait an arbitrary amount of time SLT V0,V1,S0 BEQ V0,R0,802222AC ;loop 330000 times ADDIU S0,S0,0001 ;S0++ count++ //802222B8: return LW RA,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0020 802222CC ADDIU SP,SP,FFD8 SW S3,001C (SP) ADDU S3,A1,R0 SW S1,0014 (SP) ADDU S1,R0,R0 ADDU A0,S3,R0 SW RA,0020 (SP) SW S2,0018 (SP) JAL 802014F4 SW S0,0010 (SP) BLEZ V0,80222400 ADDU V0,S1,R0 JAL 8020237C ADDU A0,S3,R0 ADDU A0,V0,R0 ADDU A1,R0,R0 LUI V1,8024 LH V0,0006 (A0) ADDIU S2,V1,4F90 SLL V0,V0,0x1 ADDU V0,V0,S2 LHU S0,0000 (V0) ADDIU V1,R0,0003 SH V1,0000 (V0) LH V0,0006 (A0) ADDIU A2,R0,0020 SLL V0,V0,0x1 ADDU V0,V0,S2 JAL 80215758 ;V0=memset(A0,A1,A2) SH V1,2000 (V0) SLL A0,S0,0x10 SRA V1,A0,0x10 ADDIU V0,R0,0001 BEQ V1,V0,80222384 ADDIU A1,R0,0003 ADDU A3,S2,R0 ADDU A2,V0,R0 SRA V0,A0,0xF ADDU V0,V0,A3 LHU V1,0000 (V0) SH A1,0000 (V0) SH A1,2000 (V0) SLL A0,V1,0x10 SRA V0,A0,0x10 BNE V0,A2,80222364 SRA V0,A0,0xF SLL V0,S1,0x1 ADDU S1,R0,R0 ADDIU A1,R0,0005 LUI V1,8024 ADDIU V1,V1,4F90 ADDIU A0,V1,000A ADDU V0,V0,V1 ADDIU V1,R0,0001 SH V1,2000 (V0) SH V1,0000 (V0) LH V0,0000 (A0) ADDIU A1,A1,0001 ADDU S1,S1,V0 SLTI V0,A1,0080 BNE V0,R0,802223AC ADDIU A0,A0,0002 LUI V0,8024 ADDIU A0,V0,4F90 ADDIU A1,R0,0100 ADDIU A2,R0,0200 ADDU A3,S3,R0 SH S1,2000 (A0) JAL 80202548 SH S1,4F90 (V0) LUI A0,8025 ADDIU A0,A0,A708 ADDIU A1,R0,0300 ADDIU A2,R0,0200 JAL 80202548 ADDU A3,S3,R0 ADDIU V0,R0,0001 LW RA,0020 (SP) LW S3,001C (SP) LW S2,0018 (SP) LW S1,0014 (SP) LW S0,0010 (SP) JR RA ADDIU SP,SP,0028 8022241C: LUI V0,8024 LW V0,EF74 (V0) ADDIU SP,SP,FFD8 SW S0,0020 (SP) ADDU S0,A0,R0 BEQ V0,R0,8022247C SW RA,0024 (SP) ADDIU A0,R0,0001 JAL 802030A0 ADDU A1,R0,R0 ADDIU A0,R0,00DD ADDIU A1,R0,00CC SUBU A1,A1,S0 ADDIU V0,R0,00FF ADDIU A2,R0,0006 ADDU A3,S0,R0 SW R0,0010 (SP) SW V0,0014 (SP) JAL 80214778 SW R0,0018 (SP) JAL 8021853C ;invalidate any CACHE work on first 6K of RAM NOP JAL 80211114 ;set VI buffer at next scan, then swap video buffers NOP LW RA,0024 (SP) LW S0,0020 (SP) JR RA ADDIU SP,SP,0028 8022248C-80222490 "ray," 80222490-802224A8 "Conrollers found = %d\n" 802224A8-802224BC "invalid checksum\n" 802224BC-802224CC "ReadSize %8\n" 802224CC-802224E0 "error in format\n" 802224E0-80222500 "MemCard_Delete - gotfile=%d\n" 80222500-8022251A "MemCard_Delete - game=%8\n" 8022251A-80222520 "y, lon" 80222520-80222538 "Conrollers found = %d\n" 80222538-80222544 "B:Exit, " 80222544-80222550 "A:select, " 80222550-8022255C "R:Re-read." 8022255C-8022256C "padstore[0]=%4\n" 8022256C-8022257C "mempak error 1\n" 8022257C-8022258C "mempak error 2\n" 8022258C-8022259C "mempak error 3\n" 8022259C-802225AC "mempak error 4\n" 802225AC-802225BC "mempak error 5\n" 802225BC-802225D0 "THE LEGEND OF ZELDA" 802225D0-80222610 decryption seeds for .enc files 80222610-80222620 "num games=%8\n" 80222620-80222690 pointer table 80222690-802226A3 "Key Code Selection" 802226A3 '(' 802226A4 ')' 802226A5 ';' 802226A6 '\r' 802226A7 '\n' 802226A8-802226B0 "void set" 802226B0-802226C0 "\n\nINTERACT\n\n" 802226C0-802226D4 "ROM Flasher v2.0\n" 802226D4-802226E8 "Scousers 1999\n\n\n" 802226E8-802226FC "N64 cart check..." 802226FC-80222704 "PASS\n" 80222704-80222718 "Flash program...." 80222718-80222720 "DONE\n" 80222720-80222734 "Flash verify....." 80222734-8022273C "FAIL\n" 8022273C-80222754 "Checksums = %8x, %8x\n" 80222754-8022276A " = %8x, %8x\n" 8022276A-80222770 "\n\r\n\r\nv" 802251F4: LW S0,0010 (SP) JR RA ADDIU SP,SP,0038 +_+ A0000200 pointer to codelist location, probably for tools to read A0000204 default 4MB codelist location; otherwise, jump to alternate codelist location 80218840-8021D040 pointer table: line-by-line char printing routines; 9 pointers per char, alternating between even and odd alignment 80222D00 #controllers 802243C0-802243D4 pointer table: 8021229C 802122F0 80212378 80212390 802123A0 802243D4 A2000001 802243D8 A2000002 802243DC A2000003 802243E0 "tile1.tg~" 802243EC "tile3.tg~" 802243F8 "tile4.tg~" 80224408-80224424 pointer table: 80212934 80212940 8021294C 80212958 80212964 80212970 80212978 80224424 "menuf.tg~" 80224430 80224440-80224450 "0123456789ABCDEF" 80224450 80224454 80224458-802245A8 pointer table: formatted string specifiers 802245B0 "Write Error" 802245BC 802245C0 "0123456789ABCDEF" 802245D0 80225200-80225300? mempak ->GS internal char conversion table; lacks a few entries... 8022539C-802253B4 [mempak+3A] 802253B4-802253CC [mempak+3A]*80 802253CC-802253E4 [mempak+3A]*2+1 802253E4-802253FC [mempak+3A]*2+3 80227450-80227480 LCD screen bitpatterns 0x0 1 ID; final entry FF 0x1 1 bitsample ' ' 00000000 '.' 11111110 '0' 00100001 '1' 11111001 '2' 00010011 '3' 01010001 '4' 11001001 '5' 01000101 '6' 00000101 '7' 11110001 '8' 00000001 '9' 01000001 'E' 00000111 'F' 10000111 'H' 10001001 'L' 00101111 'O' 00100001 'P' 10000011 'R' 10000001 'a' 01111111 'b' 10111111 'c' 11011111 'd' 11101111 'e' 11110111 'f' 11111011 'g' 11111101 'z' 01010111 00 11111111 default value FF 00000000 end if list marker 802274C0 #keycodes in table 802274C4 p->"keycode" ROM checksum correction value 802274C8 p->keycode table 80227570 p->current codelist 80227574 p->table of game entries in codelist 80227578 8022757C 80227580 ??? settings[2] 80227660 pointer table: text 80227BC8 80227BD0 TRUE if using special entrypoint 80227BD4 special entrypoint (normally ROM+8) 80227BD8 80227BDC p->target location for codelist 80227BE4 80227BE8 #games 80227BEC #total codes 80227BF4 FALSE if using custom codelist location (8MB only) 80227C00 ??? (0-2) settings[3] 80227C04 ??? (0-6) settings[4] 80227D10 LCD display code (see 80227450) 80227D14 LCD display timer 0-0xA (0-10) 80227D30 hardware bank 80227D34 80227D40 table of compressed resource binaries 0x0 4 data size 0x4 C string ID 0x10 4 decompressed size, byteswapped 0x14 var. compressed data 8022CFBC codelist 8023EFC0-80240000 PIF buffer 80242050-80242A50 mempak savefile list 0x200 each entry 80242D00-80242D18 device present flags 80242D20-80242D60 PIFram buffer for mempak routines 80248FD8-802490D8 active codelist 8024910C p->data sent and recieved from PIFram (raw controller data block) 80249110 size of RAM, initially copied from 80000318 80249128 p->PIFram buffer for controller status 802491E0-802495E0 keycode list 0x2C each entry 0x0 8 CRC correction value 0x8 4 boot address 0xC 1 ??? 0xD 1F string 80249778 font colour 80249AF8-8024A2F8 controllers 1-4 mempak paging files 0x200 each 8024B2A8 text xpos 8024B2AC text ypos