Skip to content

Instantly share code, notes, and snippets.

@m0rb
Last active June 28, 2026 14:53
Show Gist options
  • Select an option

  • Save m0rb/b19859cbb0aad37e456beb261d80f356 to your computer and use it in GitHub Desktop.

Select an option

Save m0rb/b19859cbb0aad37e456beb261d80f356 to your computer and use it in GitHub Desktop.
GG Aleste 3 SMS Conversion
; 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