Last active
June 28, 2026 14:53
-
-
Save m0rb/b19859cbb0aad37e456beb261d80f356 to your computer and use it in GitHub Desktop.
GG Aleste 3 SMS Conversion
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ; GG Aleste 3 - Game Gear to Master System patchset | |
| ; Version 1.3 - 06/28/2026 - by morb | |
| ; CHANGES: | |
| ; v1.3 - Revised Genesis pad handler: force pin TH high every read. | |
| ; Accidentally left out of v1.2 by means of a copy/paste error. | |
| ; v1.2 - Look-up table improvements, gradients, and effects | |
| ; v1.1 - Original Genesis pad handler | |
| ; v1.0 - Initial release | |
| ; NOTES: | |
| ; Bank-56 code at logical $8000+ (romfile $E0000+) | |
| ; Run-time LUT in WRAM $DF00 | |
| ;========================== | |
| ; Patch 0: SMS region byte | |
| ;========================== | |
| 7FFF 40 db $40 | |
| ;=============================================================== | |
| ; Patch 1: Palette Conversion (Revised for v1.2 - Patches 4, 5) | |
| ;=============================================================== | |
| ; save bank, page bank 56 to slot 2, jump to lutgen | |
| 017F 3A FF FF ld a,($FFFF) ; BG16 upload entry | |
| 0182 F5 push af | |
| 0183 3E 38 ld a,$38 | |
| 0185 32 FF FF ld ($FFFF),a | |
| 0188 C3 50 80 jp $8050 ; lutgen | |
| 018D 3A FF FF ld a,($FFFF) ; spr16 upload entry | |
| 0190 F5 push af | |
| 0191 3E 38 ld a,$38 | |
| 0193 32 FF FF ld ($FFFF),a | |
| 0196 C3 50 80 jp $8050 ; lutgen | |
| 019B 3A FF FF ld a,($FFFF) ; full32 upload entry | |
| 019E F5 push af | |
| 019F 3E 38 ld a,$38 | |
| 01A1 32 FF FF ld ($FFFF),a | |
| 01A4 C3 50 80 jp $8050 ; lutgen | |
| restore_bank: | |
| 0057 F1 pop af ; restore saved bank ($FFFF) | |
| 0058 32 FF FF ld ($FFFF),a | |
| 005B C9 ret | |
| ; GG buffer $C180 -> CRAM, via LUT in WRAM $DF00 | |
| converter: | |
| 8000 3E 00 ld a,$00 ; CRAM addr lo=$00 | |
| 8002 D3 BF out ($BF),a | |
| 8004 3E C0 ld a,$C0 ; CRAM addr hi=$C0 (write) | |
| 8006 D3 BF out ($BF),a | |
| 8008 21 80 C1 ld hl,$C180 ; src palette buffer | |
| 800B 16 DF ld d,$DF ; D=$DF : LUT page (WRAM) | |
| 800D 06 20 ld b,$20 ; 32 colours | |
| 800F 7E ld a,(hl) ; GGGGRRRR | |
| 8010 E6 0F and $0F ; R | |
| 8012 5F ld e,a | |
| 8013 1A ld a,(de) ; LUT[R] | |
| 8014 4F ld c,a | |
| 8015 7E ld a,(hl) | |
| 8016 0F rrca ; >> to G | |
| 8017 0F rrca | |
| 8018 0F rrca | |
| 8019 0F rrca | |
| 801A E6 0F and $0F | |
| 801C 5F ld e,a | |
| 801D 1A ld a,(de) ; LUT[G] | |
| 801E 07 rlca ; <<2 | |
| 801F 07 rlca | |
| 8020 B1 or c | |
| 8021 4F ld c,a | |
| 8022 23 inc hl | |
| 8023 7E ld a,(hl) ; ----BBBB | |
| 8024 E6 0F and $0F | |
| 8026 5F ld e,a | |
| 8027 1A ld a,(de) ; LUT[B] | |
| 8028 07 rlca ; <<4 | |
| 8029 07 rlca | |
| 802A 07 rlca | |
| 802B 07 rlca | |
| 802C B1 or c | |
| 802D D3 BE out ($BE),a ; write CRAM | |
| 802F 23 inc hl | |
| 8030 10 DD djnz $800F ; loop 32 | |
| 8032 C3 57 00 jp $0057 ; restore bank & ret | |
| ;==================================== | |
| ; Patch 2: GG START -> SMS PAUSE | |
| ;==================================== | |
| pause: | |
| 005C 3A 07 C3 ld a,($C307) ; read PAUSE flag | |
| 005F F5 push af | |
| 0060 AF xor a ; clear it | |
| 0061 32 07 C3 ld ($C307),a | |
| 0064 F1 pop af ; return flag in A | |
| 0065 C9 ret | |
| nmi: | |
| 0066 F5 push af ; SMS PAUSE -> /NMI | |
| 0067 3E 80 ld a,$80 ; set flag $C307=$80 | |
| 0069 32 07 C3 ld ($C307),a | |
| 006C F1 pop af ; return | |
| 006D ED 45 retn | |
| ; START read replacement | |
| 051E CD 5C 00 call $005C ; prev: `in a,($00)` | |
| 0521 00 00 00 nop x3 ; padding | |
| ;======================================================================== | |
| ; Patch 3: Disable stereo audio (for now) | |
| ; 'out ($06),a' aliases SMS port $3E (mem ctrl!), bit6 disables the cart | |
| ; resulting in an infinite nop sled and godawful noise emitting from the | |
| ; speaker. | |
| ;======================================================================== | |
| 4692 00 00 nop ; nop ; was D3 06 out($06),a [bank 3] | |
| 474A 00 00 nop ; nop ; was D3 06 out($06),a [bank 51] | |
| ;====================================================================== | |
| ; Patch 4: Palette effects | |
| ;====================================================================== | |
| ; colour-cycle/flash routines | |
| 1B30 3A FF FF ld a,($FFFF) ; entry | |
| 1B33 F5 push af | |
| 1B34 3E 38 ld a,$38 | |
| 1B36 32 FF FF ld ($FFFF),a | |
| 1B39 C3 50 81 jp $8150 ; routine | |
| 1BB1 3A FF FF ld a,($FFFF) ; entry | |
| 1BB4 F5 push af | |
| 1BB5 3E 38 ld a,$38 | |
| 1BB7 32 FF FF ld ($FFFF),a | |
| 1BBA C3 5A 81 jp $815A ; routine | |
| 1DE2 3A FF FF ld a,($FFFF) ; entry | |
| 1DE5 F5 push af | |
| 1DE6 3E 38 ld a,$38 | |
| 1DE8 32 FF FF ld ($FFFF),a | |
| 1DEB C3 64 81 jp $8164 ; routine | |
| 1DEE 3A FF FF ld a,($FFFF) ; entry | |
| 1DF1 F5 push af | |
| 1DF2 3E 38 ld a,$38 | |
| 1DF4 32 FF FF ld ($FFFF),a | |
| 1DF7 C3 6E 81 jp $816E ; routine | |
| 1DFE 3A FF FF ld a,($FFFF) ; entry | |
| 1E01 F5 push af | |
| 1E02 3E 38 ld a,$38 | |
| 1E04 32 FF FF ld ($FFFF),a | |
| 1E07 C3 78 81 jp $8178 ; routine | |
| ; conv_partial (bank 56): convert B colours HL->CRAM addr C, via WRAM LUT | |
| conv_partial: | |
| 8110 79 ld a,c ; C=CRAM addr | |
| 8111 D3 BF out ($BF),a | |
| 8113 3E C0 ld a,$C0 ; write mode | |
| 8115 D3 BF out ($BF),a | |
| 8117 16 DF ld d,$DF ; D=$DF LUT page | |
| 8119 7E ld a,(hl) | |
| 811A E6 0F and $0F | |
| 811C 5F ld e,a | |
| 811D 1A ld a,(de) | |
| 811E 4F ld c,a | |
| 811F 7E ld a,(hl) | |
| 8120 0F rrca | |
| 8121 0F rrca | |
| 8122 0F rrca | |
| 8123 0F rrca | |
| 8124 E6 0F and $0F | |
| 8126 5F ld e,a | |
| 8127 1A ld a,(de) | |
| 8128 07 rlca | |
| 8129 07 rlca | |
| 812A B1 or c | |
| 812B 4F ld c,a | |
| 812C 23 inc hl | |
| 812D 7E ld a,(hl) | |
| 812E E6 0F and $0F | |
| 8130 5F ld e,a | |
| 8131 1A ld a,(de) | |
| 8132 07 rlca | |
| 8133 07 rlca | |
| 8134 07 rlca | |
| 8135 07 rlca | |
| 8136 B1 or c | |
| 8137 D3 BE out ($BE),a | |
| 8139 23 inc hl | |
| 813A 10 DD djnz $8119 ; loop | |
| 813C 0E BE ld c,$BE ; C=$BE for queue proc | |
| 813E C3 57 00 jp $0057 ; restore bank & ret | |
| ; effects stub table: set src/count/CRAM-addr, jump to conv_partial | |
| effects: | |
| 8150 21 90 C1 ld hl,$C190 | |
| 8153 06 01 ld b,$01 | |
| 8155 0E 08 ld c,$08 | |
| 8157 C3 10 81 jp $8110 | |
| 815A 21 96 C1 ld hl,$C196 | |
| 815D 06 02 ld b,$02 | |
| 815F 0E 0B ld c,$0B | |
| 8161 C3 10 81 jp $8110 | |
| 8164 21 80 C1 ld hl,$C180 | |
| 8167 06 01 ld b,$01 | |
| 8169 0E 00 ld c,$00 | |
| 816B C3 10 81 jp $8110 | |
| 816E 21 9A C1 ld hl,$C19A | |
| 8171 06 02 ld b,$02 | |
| 8173 0E 0D ld c,$0D | |
| 8175 C3 10 81 jp $8110 | |
| 8178 21 98 C1 ld hl,$C198 | |
| 817B 06 03 ld b,$03 | |
| 817D 0E 0C ld c,$0C | |
| 817F C3 10 81 jp $8110 | |
| ;====================================================================== | |
| ; Patch 5: Palette LUT in WRAM | |
| ; build per-scene LUT | |
| ; M = max channel val over BG cols 1-7 | |
| ; round if M<6 | |
| ; thresholds from tables | |
| ; drop t1 to backdrop brightness | |
| ; build 16-byte LUT in $DF00. | |
| ;====================================================================== | |
| lutgen: | |
| 8050 21 82 C1 ld hl,$C182 ; HL->BG col1 | |
| 8053 06 07 ld b,$07 ; 7 cols | |
| 8055 0E 00 ld c,$00 ; M=0 | |
| 8057 7E ld a,(hl) ; low byte | |
| 8058 5F ld e,a | |
| 8059 E6 0F and $0F ; R | |
| 805B B9 cp c ; max? | |
| 805C 38 01 jr c,$805F | |
| 805E 4F ld c,a | |
| 805F 7B ld a,e ; >> to G | |
| 8060 0F rrca | |
| 8061 0F rrca | |
| 8062 0F rrca | |
| 8063 0F rrca | |
| 8064 E6 0F and $0F | |
| 8066 B9 cp c | |
| 8067 38 01 jr c,$806A | |
| 8069 4F ld c,a | |
| 806A 23 inc hl | |
| 806B 7E ld a,(hl) ; high=B | |
| 806C E6 0F and $0F | |
| 806E B9 cp c | |
| 806F 38 01 jr c,$8072 | |
| 8071 4F ld c,a | |
| 8072 23 inc hl | |
| 8073 10 E2 djnz $8057 ; loop cols | |
| 8075 79 ld a,c ; M<6? | |
| 8076 FE 06 cp $06 | |
| 8078 30 02 jr nc,$807C ; >=6 keep | |
| 807A 0E 0F ld c,$0F ; <6: M=15 (round) | |
| 807C 3A 80 C1 ld a,($C180) ; col0 low | |
| 807F 5F ld e,a | |
| 8080 E6 0F and $0F | |
| 8082 57 ld d,a ; c0=R | |
| 8083 7B ld a,e | |
| 8084 0F rrca | |
| 8085 0F rrca | |
| 8086 0F rrca | |
| 8087 0F rrca | |
| 8088 E6 0F and $0F | |
| 808A BA cp d | |
| 808B 38 01 jr c,$808E | |
| 808D 57 ld d,a | |
| 808E 3A 81 C1 ld a,($C181) ; col0 high B | |
| 8091 E6 0F and $0F | |
| 8093 BA cp d | |
| 8094 38 01 jr c,$8097 | |
| 8096 57 ld d,a ; D=c0 backdrop | |
| 8097 21 00 DF ld hl,$DF00 ; clear LUT $DF00 | |
| 809A 06 10 ld b,$10 | |
| 809C AF xor a | |
| 809D 77 ld (hl),a | |
| 809E 23 inc hl | |
| 809F 10 FC djnz $809D | |
| 80A1 26 82 ld h,$82 ; T1 page | |
| 80A3 79 ld a,c | |
| 80A4 6F ld l,a | |
| 80A5 7E ld a,(hl) ; t1=T1[M] | |
| 80A6 5F ld e,a | |
| 80A7 7A ld a,d | |
| 80A8 B7 or a ; c0==0? | |
| 80A9 28 04 jr z,$80AF | |
| 80AB BB cp e ; c0<t1? | |
| 80AC 30 01 jr nc,$80AF | |
| 80AE 5F ld e,a ; t1=min(t1,c0) backdrop-aware | |
| 80AF 7B ld a,e | |
| 80B0 CD CA 80 call $80CA ; add-pass t1 | |
| 80B3 79 ld a,c | |
| 80B4 C6 10 add a,$10 ; T2[M] | |
| 80B6 26 82 ld h,$82 | |
| 80B8 6F ld l,a | |
| 80B9 7E ld a,(hl) | |
| 80BA CD CA 80 call $80CA ; add-pass t2 | |
| 80BD 79 ld a,c | |
| 80BE C6 20 add a,$20 ; T3[M] | |
| 80C0 26 82 ld h,$82 | |
| 80C2 6F ld l,a | |
| 80C3 7E ld a,(hl) | |
| 80C4 CD CA 80 call $80CA ; add-pass t3 | |
| 80C7 C3 00 80 jp $8000 ; -> converter | |
| addpass: | |
| 80CA 6F ld l,a ; LUT[v]++ for all v>=A | |
| 80CB 26 DF ld h,$DF | |
| 80CD 3E 10 ld a,$10 | |
| 80CF 95 sub l | |
| 80D0 C8 ret z | |
| 80D1 47 ld b,a | |
| 80D2 34 inc (hl) | |
| 80D3 23 inc hl | |
| 80D4 10 FC djnz $80D2 | |
| 80D6 C9 ret ; ret | |
| ; threshold tables | |
| 8200 db 00 00 00 01 01 01 01 01 02 02 02 02 02 02 02 02 ; T1[M] low threshold | |
| 8210 db 00 01 01 02 02 03 03 04 04 05 05 06 06 07 07 08 ; T2[M] mid threshold | |
| 8220 db 00 01 02 03 03 04 05 06 07 08 09 0A 0A 0B 0C 0D ; T3[M] high threshold | |
| ;====================================================================== | |
| ; Patch 6: Genesis pad handler | |
| ; Genesis pads multiplex the d-pad on pin TH. Force $3F=$F5 (TH high) | |
| ; before the read so we can get the horizontal direction. | |
| ;====================================================================== | |
| 0516 C3 4E 0E jp $0E4E ; pinhandle | |
| 0519 FF -- ; orphaned byte | |
| noop: | |
| 0E4D C9 ret ; no-op RET | |
| pinhandle: | |
| 0E4E 3E F5 ld a,$F5 ; TH high | |
| 0E50 D3 3F out ($3F),a | |
| 0E52 DB DC in a,($DC) ; read d-pad | |
| 0E54 EE FF xor $FF ; invert | |
| 0E56 C3 1A 05 jp $051A ; back to input routine |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment