IPB

Welcome Guest ( Log In | Register )


 

Recent Changes | Random | Help | Special Pages | Upload
home | info | forums | svn | irc | podcast | about

We've managed to restore 99% of our file loss earlier in the year, but it's now THE FINAL COUNTDOWN. Visit the wiki file request topic to help make Sonic Retro better than ever.

SCHG How-to:Extend the level index past $10 in Sonic 2

From Sonic Retro

(Original guide by kram, current revision that fixes major bugs and extends properly by GARY 'M 9) (Updated again by kram, adding back custom titlecard mappings howto, due to guide being unfinished, thus finally fixing the "ZONE ZONE" bug. Replace all the empty levels with your new ones.)

WARNING: Unless you are working with Xenowhirl's 2007 Sonic 2 disassembly, I strongly recommend you port the Sonic 1 sound driver first before proceeding. A lot of major data shifting will occur in this tutorial and it will make the rom size a lot bigger than it was before. This will break the sonic2 or even sonic2 beta sound driver, thus so you definitely want the sonic 1 sound driver due to the fact that it can take the shifting and still work properly. However, if you are using Xenowhirl's 2007 Sonic 2 disassembly, it is not necessary to port any other sound driver, since that uses disassembled Z80 code which automatically references the correct locations and can thus work properly even if there are massive location shifts.

You probably noticed that all the indexes in the game stop at $10 and when you try to extend it, by extending the MLLB, you get weird glitches or even crashes, that is because you haven't extended all the indexes that need to be extended.

Contents

Extending the Titlecard index

First we find:

 
Obj34_TitleCardData:
	dc.b    8,    0, $80, $1B
	dc.w $240, $120, $B8
 
	dc.b   $A,  $11, $40, $1C
	dc.w  $28, $148, $D0
 
	dc.b   $C,  $12, $18, $1C
	dc.w  $68, $188, $D0
 
	dc.b    2,    0,   0,   0
	dc.w    0,    0,   0
 
	dc.b    4,  $15, $48,   8
	dc.w $2A8, $168,$120
 
	dc.b    6,  $16,   8, $15
	dc.w  $80,  $F0, $F0
 

and change it to:

 
Obj34_TitleCardData:
	dc.b    8,    0, $80, $1B ; this is the zone string start index and  placement
	dc.w $240, $120, $B8
 
	dc.b   $A, $21, $40, $1C ; "ZONE" string index number and placement
	dc.w  $28, $148, $D0
 
	dc.b   $C,  $22, $18, $1C ; act number start index and placement
	dc.w  $68, $188, $D0
 
	dc.b    2,    0,   0,   0 ; this part of the titlecard is totally unknown, colored backdrop possibly
	dc.w    0,    0,   0
 
	dc.b    4,  $25, $48,   8 ; red strip edge index and placement
	dc.w $2A8, $168,$120
 
	dc.b    6,  $26,   8, $15 ; red "Sonic The Hedgehog" string and placement
	dc.w  $80,  $F0, $F0
 

next, find:

 
    jsr       sub_13D10(pc)
    move.b    (Current_Zone).w,d0
    cmpi.b    #$10,d0
    beq.s     BranchTo9_DeleteObject
    cmpi.b    #6,d0
    beq.s     BranchTo9_DeleteObject
    cmpi.b    #$E,d0
    beq.s     BranchTo9_DeleteObject
    move.b    (Current_Act).w,d1
    addi.b    #$12,d1
    cmpi.b    #5,d0
    bne.s     loc_13E18
    moveq     #$14,d1
 

and change it to:

 
    jsr       sub_13D10(pc)
    move.b    (Current_Zone).w,d0
    cmpi.b    #$10,d0
    beq.s     BranchTo9_DeleteObject
    cmpi.b    #6,d0
    beq.s     BranchTo9_DeleteObject
    cmpi.b    #$E,d0
    beq.s     BranchTo9_DeleteObject
    move.b    (Current_Act).w,d1
    addi.b    #$22,d1                  ; Act number mappings (Act 1)
    cmpi.b    #5,d0
    bne.s     loc_13E18
    moveq     #$24,d1                  ; Act number mappings (Act 3).  Used for drawing MTZ (0x05) titlecard only
 

Now we have the offset data of where to load the mappings for the titlecards shifted so that we can now start working on updating the mappings and not have that strange "ZONE ZONE" bug that GARY 'M 9 left behind and I intended to correct.

Next, another thing I wanted to see others correct. this time, I will explain why I changed byte_15820 into a 16-bit relative offset index as opposed to it staying as a byte-by-byte relative offset that does not point correctly, and to appropriately handle the string data in word_15832, as well as allow that string data to be properly represented. This time I will make it even clearer too.

Next off, in this part of the hack the first thing before converting to a better manageable datatype, we want to replace the byte_15820 handler with a better one.

look for:

 
; loc_157D2:
LoadTitleCard:
	bsr.s	LoadTitleCard0
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	move.b	byte_15820(pc,d0.w),d0
	lea	word_15832(pc),a0
	lea	(a0,d0.w),a0
	move.l	#$7BC00002,d0
 

and we want to replace it with:

 
; loc_157D2:
LoadTitleCard:
	bsr.s	LoadTitleCard0
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	add.w	d0,d0
	move.w	Off_Titlecardtext(pc,d0.w),d0
	lea	Off_Titlecardtext(pc,d0.w),a0
	move.l	#$7BC00002,d0
 

That takes care of the loader, now time to update the string data.

find:

 
; unknown
byte_15820:
	dc.b   0,  0,  0,  0,$10,$10,$98,$20,$2C,  0,$3C,$46,$58,$68,$A8,$7A
	dc.b $8A,  0	; 16
; unknown
word_15832:
	dc.w $2A06,$3804,    4,$2604, $C04,$1804,$1C02,$FFFF
	dc.w $2A06,$4004,$3804,$3004,$2604,$1C02,$3C04,$FFFF; 8
	dc.w $1804,$1C02,$2604,$4004,$3004,$FFFF,$1804,$1C02; 16
	dc.w  $C04,$3004,    4,$2604, $804,$FFFF,$1C02,$2604; 24
	dc.w  $804,    4,$FFFF,$2A06,$5604,$3C04,$4004,$1C02; 32
	dc.w  $804,    4,$4804,$FFFF, $804,    4,$3C04,$1C02; 40
	dc.w $1404,$1804,$4004,$FFFF, $804,$1804,$2A06,$1C02; 48
	dc.w	 4,$2604,$3004,$4004,$FFFF,    4,$3404,$4404; 56
	dc.w $4004,$1C02, $804,$3804,$FFFF,$3C04,$2204,$5604; 64
	dc.w  $804,$1804,    4,$FFFF,$4C06,$1C02,$1404,$1004; 72
	dc.w $3804,$4004,$3C04,$FFFF, $C04,    4,$4004,$1804; 80
	dc.w $1404,$FFFF	; 88
 

and replace it with:

 
;byte_15820
Off_Titlecardtext:
	dc.w   Text_EHZ-Off_Titlecardtext ; EHZ Titlecard 00
	dc.w   Text_LZ-Off_Titlecardtext  ;  LZ Titlecard 01
	dc.w   Text_WZ-Off_Titlecardtext  ;  WZ Titlecard 02
	dc.w   Text_DHZ-Off_Titlecardtext ; DHZ Titlecard 03
	dc.w   Text_MTZ-Off_Titlecardtext ; MTZ Titlecard 04
	dc.w   Text_MTZ-Off_Titlecardtext ; MTZ Titlecard 05
	dc.w   Text_WFZ-Off_Titlecardtext ; WFZ Titlecard 06
	dc.w   Text_HTZ-Off_Titlecardtext ; HTZ Titlecard 07
	dc.w   Text_HPZ-Off_Titlecardtext ; HPZ Titlecard 08
	dc.w   Text_GCZ-Off_Titlecardtext ; GCZ Titlecard 09
	dc.w   Text_OOZ-Off_Titlecardtext ; OOZ Titlecard 0A
	dc.w   Text_MCZ-Off_Titlecardtext ; MCZ Titlecard 0B
	dc.w   Text_CNZ-Off_Titlecardtext ; CNZ Titlecard 0C
	dc.w   Text_CPZ-Off_Titlecardtext ; CPZ Titlecard 0D
	dc.w   Text_DEZ-Off_Titlecardtext ; DEZ Titlecard 0E
	dc.w   Text_ARZ-Off_Titlecardtext ; ARZ Titlecard 0F
	dc.w   Text_SCZ-Off_Titlecardtext ; SCZ Titlecard 10
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 11
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 12
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 13
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 14
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 15
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 16
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 17
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 18
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 19
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 1A
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 1B
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 1C
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 1D
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 1E
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 1F
	dc.w   Text_NZ-Off_Titlecardtext  ;  NZ Titlecard 20
 
;word_15832
Text_EHZ: dc.b $2A,$38,$00,$26,$0C,$18,$1C ; 'MRALDHI'
	  dc.w $FFFF ; '<EOF>'
Text_LZ:  dc.b $26,$00,$04,$56,$38,$1C,$40,$18 ; 'LABYRITH'
	  dc.w $FFFF ; '<EOF>'
Text_WZ:  dc.b $4C,$0C ; 'WD'
	  dc.w $FFFF ; '<EOF>'
Text_DHZ: dc.b $0C,$44,$3C,$40,$18,$1C,$26 ; 'DUSTHIL'
	  dc.w $FFFF ; '<EOF>'
Text_MTZ: dc.b $2A,$40,$38,$30,$26,$1C,$3C ; 'MTRPLIS'
	  dc.w $FFFF ; '<EOF>'
Text_WFZ: dc.b $4C,$1C,$14,$10,$38,$40,$3C ; 'WIGFRTS'
	  dc.w $FFFF ; '<EOF>'
Text_HTZ: dc.b $18,$1C,$26,$40,$30 ; 'HILTP'
	  dc.w $FFFF ; '<EOF>'
Text_HPZ: dc.b $18,$1C,$0C,$30,$00,$26,$08 ; 'HIDPALCE'
	  dc.w $FFFF ; '<EOF>'
Text_GCZ: dc.b $14,$08,$1C,$0C,$40,$56 ; 'GCIDTY'
	  dc.w $FFFF ; '<EOF>'
Text_OOZ: dc.b $1C,$26,$08,$00 ; 'ILCAN'
	  dc.w $FFFF ; '<EOF>'
Text_MCZ: dc.b $2A,$56,$3C,$40,$1C,$08,$00,$48 ; 'MYSTICAV'
	  dc.w $FFFF ; '<EOF>'
Text_CNZ: dc.b $08,$00,$3C,$1C,$14,$18,$40 ; 'CASIGHT'
	  dc.w $FFFF ; '<EOF>'
Text_CPZ: dc.b $08,$18,$2A,$1C,$00,$26,$30,$40 ; 'CHMICALPT'
	  dc.w $FFFF ; '<EOF>'
Text_DEZ: dc.b $0C,$00,$40,$18,$14 ; 'DATHG'
	  dc.w $FFFF ; '<EOF>'
Text_ARZ: dc.b $00,$34,$44,$40,$1C,$08,$38 ; 'AQUTICR'
	  dc.w $FFFF ; '<EOF>'
Text_SCZ: dc.b $3C,$22,$56,$08,$18,$00,$3C ; 'SKYCHAS'
	  dc.w $FFFF ; '<EOF>'
Text_NZ:  dc.b $4C ; 'W'
	  dc.w $FFFF ; '<EOF>'
 

This extends the title card index to $20, adds titlecards for Wood Zone, Labyrinth Zone, Dust Hill Zone, Genocide City Zone, and an empty New Zone titlecard for every single level above SCZ, compacts the titlecard text data for all titlecards, and makes it more easier to manage. you will be wondering probably what to do with the mappings. Well that is what is next.

find:

 
; -------------------------------------------------------------------------------
; sprite mappings
; -------------------------------------------------------------------------------
Obj34_MapUnc_147BA:	BINCLUDE "mappings/sprite/obj34.bin"
; -------------------------------------------------------------------------------
 

and replace it with:

 
; -------------------------------------------------------------------------------
; sprite mappings
; -------------------------------------------------------------------------------
Obj34_MapUnc_147BA: dc.w Titlecard_EHZ-Obj34_MapUnc_147BA ; EHZ 00 
		    dc.w Titlecard_LZ-Obj34_MapUnc_147BA  ; LZ  01
		    dc.w Titlecard_WZ-Obj34_MapUnc_147BA  ; WZ  02
		    dc.w Titlecard_DHZ-Obj34_MapUnc_147BA ; DHZ 03
		    dc.w Titlecard_MTZ-Obj34_MapUnc_147BA ; MTZ 04
		    dc.w Titlecard_MTZ-Obj34_MapUnc_147BA ; MTZ 05
		    dc.w Titlecard_WFZ-Obj34_MapUnc_147BA ; WFZ 06
		    dc.w Titlecard_HTZ-Obj34_MapUnc_147BA ; HTZ 07
		    dc.w Titlecard_HPZ-Obj34_MapUnc_147BA ; HPZ 08
		    dc.w Titlecard_GCZ-Obj34_MapUnc_147BA ; GCZ 09 
		    dc.w Titlecard_OOZ-Obj34_MapUnc_147BA ; OOZ 0A
		    dc.w Titlecard_MCZ-Obj34_MapUnc_147BA ; MCZ 0B
		    dc.w Titlecard_CNZ-Obj34_MapUnc_147BA ; CNZ 0C
		    dc.w Titlecard_CPZ-Obj34_MapUnc_147BA ; CPZ 0D
		    dc.w Titlecard_DEZ-Obj34_MapUnc_147BA ; DEZ 0E
		    dc.w Titlecard_ARZ-Obj34_MapUnc_147BA ; ARZ 0F
		    dc.w Titlecard_SCZ-Obj34_MapUnc_147BA ; SCZ 10
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  11
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  12
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  13
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  14
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  15
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  16
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  17
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  18
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  19 
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1A
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1B
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1C
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1D
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1E
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1F
		    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  20
		    dc.w T_ZONE-Obj34_MapUnc_147BA        ; "ZONE"
		    dc.w T_ACT1-Obj34_MapUnc_147BA        ; "1"
		    dc.w T_ACT2-Obj34_MapUnc_147BA        ; "2"
		    dc.w T_ACT3-Obj34_MapUnc_147BA        ; "3"
		    dc.w T_STH-Obj34_MapUnc_147BA         ; "SONIC THE HEDGEHOG"
		    dc.w T_STRIPEDGE-Obj34_MapUnc_147BA   ; ">"
 
Titlecard_EHZ:	    dc.w $b ; number of letters
		    dc.w $0005, $8580, $82C0, $FFC0 ;E
		    dc.w $0009, $85DE, $82EF, $FFD0 ;M
		    dc.w $0005, $8580, $82C0, $FFE8 ;E
		    dc.w $0005, $85E4, $82F2, $FFF8 ;R
		    dc.w $0005, $85E8, $82F4, $0008 ;A
		    dc.w $0005, $85EC, $82F6, $0018 ;L
		    dc.w $0005, $85F0, $82F8, $0028 ;D
 
		    dc.w $0005, $85F4, $82FA, $0048 ;H
		    dc.w $0001, $85F8, $82F2, $0058 ;I
		    dc.w $0005, $85EC, $82F6, $0060 ;L
		    dc.w $0005, $85EC, $82F6, $0070 ;L
 
Titlecard_LZ:	    dc.w $9 ; number of letters
		    dc.w $0005, $85DE, $82EF, $FFE8 ;L
		    dc.w $0005, $85E2, $82F1, $FFF8 ;A
		    dc.w $0005, $85E6, $82F3, $0008 ;B
		    dc.w $0005, $85EA, $82F5, $0018 ;Y
		    dc.w $0005, $85EE, $82F7, $0028 ;R
		    dc.w $0001, $85F2, $82F9, $0038 ;I
		    dc.w $0005, $8584, $82C2, $0040 ;N
		    dc.w $0005, $85F4, $82FA, $0050 ;T
		    dc.w $0005, $85F8, $82FC, $0060 ;H
 
Titlecard_WZ:	    dc.w $4 ; number of letters
		    dc.w $0009, $85DE, $82EF, $0008 ;W
		    dc.w $0005, $8588, $82C4, $0010 ;O
		    dc.w $0005, $8588, $82C4, $0020 ;O
		    dc.w $0005, $85E4, $82F2, $0030 ;D
 
 
Titlecard_DHZ:	    dc.w $8 ; number of letters
		    dc.w $0005, $85DE, $82EF, $FFE8 ;D
		    dc.w $0005, $85E2, $82F1, $FFF8 ;U
		    dc.w $0005, $85E6, $82F3, $0008 ;S
		    dc.w $0005, $85EA, $82F5, $0018 ;T
 
		    dc.w $0005, $85EE, $82F7, $0038 ;H
		    dc.w $0001, $85F2, $82F9, $0048 ;I
		    dc.w $0005, $85F4, $82FA, $0050 ;L
		    dc.w $0005, $85F4, $82FA, $0060 ;L
 
Titlecard_MTZ:	    dc.w $a ; number of letters
		    dc.w $0009, $85DE, $82EF, $FFE8 ;M
		    dc.w $0005, $8580, $82C0, $FFF8 ;E
		    dc.w $0005, $85E4, $82F2, $0008 ;T
		    dc.w $0005, $85E8, $82F4, $0018 ;R
		    dc.w $0005, $8588, $82C4, $0028 ;O
		    dc.w $0005, $85EC, $82F6, $0038 ;P
		    dc.w $0005, $8588, $82C4, $0048 ;O
		    dc.w $0005, $85F0, $82F8, $0058 ;L
		    dc.w $0001, $85F4, $82FA, $0068 ;I
		    dc.w $0005, $85F6, $82FB, $0070 ;S
 
Titlecard_WFZ:	    dc.w $c ; number of letters
		    dc.w $0009, $85DE, $82EF, $FFB0 ;W
		    dc.w $0001, $85E4, $82F2, $FFC8 ;I
		    dc.w $0005, $8584, $82C2, $FFD0 ;N
		    dc.w $0005, $85E6, $82F3, $FFE0 ;G
 
		    dc.w $0005, $85EA, $82F5, $0000 ;F
		    dc.w $0005, $8588, $82C4, $0010 ;O
		    dc.w $0005, $85EE, $82F7, $0020 ;R
		    dc.w $0005, $85F2, $82F9, $0030 ;T
		    dc.w $0005, $85EE, $82F7, $0040 ;R
		    dc.w $0005, $8580, $82C0, $0050 ;E
		    dc.w $0005, $85F6, $82FB, $0060 ;S
		    dc.w $0005, $85F6, $82FB, $0070 ;S
 
Titlecard_HTZ:	    dc.w $7 ; number of letters
		    dc.w $0005, $85DE, $82EF, $0008 ;H
		    dc.w $0001, $85E2, $82F1, $0018 ;I
		    dc.w $0005, $85E4, $82F2, $0020 ;L
		    dc.w $0005, $85E4, $82F2, $0030 ;L
 
		    dc.w $0005, $85E8, $82F4, $0050 ;T
		    dc.w $0005, $8588, $82C4, $0060 ;O
		    dc.w $0005, $85EC, $82F6, $0070 ;P
 
Titlecard_HPZ:	    dc.w $c ; number of letters
		    dc.w $0005, $85DE, $82EF, $FFB8 ;H
		    dc.w $0001, $85E2, $82F1, $FFC8 ;I
		    dc.w $0005, $85E4, $82F2, $FFD0 ;D
		    dc.w $0005, $85E4, $82F2, $FFE0 ;D
		    dc.w $0005, $8580, $82C0, $FFF0 ;E
		    dc.w $0005, $8584, $82C4, $0000 ;N
 
		    dc.w $0005, $85E8, $82F4, $0020 ;P
		    dc.w $0005, $85EC, $82F6, $0030 ;A
		    dc.w $0005, $85F0, $82F8, $0040 ;L
		    dc.w $0005, $85EC, $82F6, $0050 ;A
		    dc.w $0005, $85F4, $82FA, $0060 ;C
		    dc.w $0005, $8580, $82C0, $0070 ;E
 
Titlecard_GCZ:	    dc.w $c ; number of letters
		    dc.w $0005, $85DE, $82EF, $FFB8 ;G
		    dc.w $0005, $8580, $82C0, $FFC8 ;E
		    dc.w $0005, $8584, $82C2, $FFD8 ;N
		    dc.w $0005, $8588, $82C4, $FFE8 ;O
		    dc.w $0005, $85E2, $82F1, $FFF8 ;C
		    dc.w $0001, $85E6, $82F3, $0008 ;I
		    dc.w $0005, $85E8, $82F4, $0010 ;D
		    dc.w $0005, $8580, $82C0, $0020 ;E
 
		    dc.w $0005, $85E2, $82F1, $0040 ;C
		    dc.w $0001, $85E6, $82F3, $0050 ;I
		    dc.w $0005, $85EC, $82F6, $0058 ;T
		    dc.w $0005, $85F0, $82F8, $0068 ;Y
 
Titlecard_OOZ:	    dc.w $8 ; number of letters
		    dc.w $0005, $8588, $82C4, $FFF8 ;O
		    dc.w $0001, $85DE, $82EF, $0008 ;I
		    dc.w $0005, $85E0, $82F0, $0010 ;L
 
		    dc.w $0005, $8588, $82C4, $0030 ;O
		    dc.w $0005, $85E4, $82F2, $0040 ;C
		    dc.w $0005, $8580, $82C0, $0050 ;E
		    dc.w $0005, $85E8, $82F4, $0060 ;A
		    dc.w $0005, $8584, $82C2, $0070 ;N
 
Titlecard_MCZ:	    dc.w $a ; number of letters
		    dc.w $0009, $85DE, $82EF, $FFD0 ;M
		    dc.w $0005, $85E4, $82F2, $FFE8 ;Y
		    dc.w $0005, $85E8, $82F4, $FFF8 ;S
		    dc.w $0005, $85EC, $82F6, $0008 ;T
		    dc.w $0001, $85F0, $82F8, $0018 ;I
		    dc.w $0005, $85F2, $82F9, $0020 ;C
 
		    dc.w $0005, $85F2, $82F9, $0040 ;C
		    dc.w $0005, $85F6, $82FB, $0050 ;A
		    dc.w $0005, $85FA, $82FD, $0060 ;V
		    dc.w $0005, $8580, $82C0, $0070 ;E
 
Titlecard_CNZ:	    dc.w $b ; number of letters
		    dc.w $0005, $85DE, $82EF, $FFD0 ;C
		    dc.w $0005, $85E2, $82F1, $FFE0 ;A
		    dc.w $0005, $85E6, $82F3, $FFF0 ;S
		    dc.w $0001, $85EA, $82F5, $0000 ;I
		    dc.w $0005, $8584, $82C2, $0008 ;N
		    dc.w $0005, $8588, $82C4, $0018 ;O
 
		    dc.w $0005, $8584, $82C2, $0038 ;N
		    dc.w $0001, $85EA, $82F5, $0048 ;I
		    dc.w $0005, $85EC, $82F6, $0050 ;G
		    dc.w $0005, $85F0, $82F8, $0060 ;H
		    dc.w $0005, $85F4, $82FA, $0070 ;T
 
Titlecard_CPZ:	    dc.w $d ; number of letters
		    dc.w $0005, $85DE, $82EF, $FFA0 ;C
		    dc.w $0005, $85E2, $82F1, $FFB0 ;H
		    dc.w $0005, $8580, $82C0, $FFC0 ;E
		    dc.w $0009, $85E6, $82F3, $FFD0 ;M
		    dc.w $0001, $85EC, $82F6, $FFE8 ;I
		    dc.w $0005, $85DE, $82EF, $FFF0 ;C
		    dc.w $0005, $85EE, $82F7, $0000 ;A
		    dc.w $0005, $85F2, $82F9, $0010 ;L
 
		    dc.w $0005, $85F6, $82FB, $0030 ;P
		    dc.w $0005, $85F2, $82F9, $0040 ;L
		    dc.w $0005, $85EE, $82F7, $0050 ;A
		    dc.w $0005, $8584, $82C2, $0060 ;N
		    dc.w $0005, $85FA, $82FD, $0070 ;T
 
Titlecard_DEZ:	    dc.w $8 ; number of letters
		    dc.w $0005, $85DE, $82EF, $FFF0 ;D
		    dc.w $0005, $8580, $82C0, $0000 ;E
		    dc.w $0005, $85E2, $82F1, $0010 ;A
		    dc.w $0005, $85E6, $82F3, $0020 ;T
		    dc.w $0005, $85EA, $82F5, $0030 ;H
 
		    dc.w $0005, $8580, $82C0, $0050 ;E
		    dc.w $0005, $85EE, $82F7, $0060 ;G
		    dc.w $0005, $85EE, $82F7, $0070 ;G
 
Titlecard_ARZ:	    dc.w $c ; number of letters
		    dc.w $0005, $85DE, $82EF, $FFD0 ;A
		    dc.w $0005, $85E2, $82F1, $FFE0 ;Q
		    dc.w $0005, $85E6, $82F3, $FFF0 ;U
		    dc.w $0005, $85DE, $82EF, $0000 ;A
		    dc.w $0005, $85EA, $82F5, $0010 ;T
		    dc.w $0001, $85EE, $82F7, $0020 ;I
		    dc.w $0005, $85F0, $82F8, $0028 ;C
 
		    dc.w $0005, $85F4, $82FA, $0048 ;R
		    dc.w $0005, $85E6, $82F3, $0058 ;U
		    dc.w $0001, $85EE, $82F7, $0068 ;I
		    dc.w $0005, $8584, $82C2, $0070 ;N
 
Titlecard_SCZ:	    dc.w $8 ; number of letters
		    dc.w $0005, $85DE, $82EF, $FFF0 ;S
		    dc.w $0005, $85E2, $82F1, $0000 ;K
		    dc.w $0005, $85E6, $82F3, $0010 ;Y
 
		    dc.w $0005, $85EA, $82F5, $0030 ;C
		    dc.w $0005, $85EE, $82F7, $0040 ;H
		    dc.w $0005, $85F2, $82F7, $0050 ;A
		    dc.w $0005, $85DE, $82EF, $0060 ;S
		    dc.w $0005, $8580, $82C0, $0070 ;E
 
Titlecard_NZ:	    dc.w $3 ; number of letters
		    dc.w $0005, $8584, $82C2, $0048 ;N
		    dc.w $0005, $8580, $82C0, $0058 ;E
		    dc.w $0009, $85DE, $82EF, $0068 ;W
 
T_ZONE:		    dc.w $4 ; number of letters
		    dc.w $0005, $858C, $82C6, $0000 ;Z
		    dc.w $0005, $8588, $82C4, $0010 ;O
		    dc.w $0005, $8584, $82C2, $0020 ;N
		    dc.w $0005, $8580, $82C0, $0030 ;E
 
 
T_ACT1:	            dc.w $1 ; number of letters
		    dc.w $0007, $A590, $A2C8, $0000 ;1
 
T_ACT2:		    dc.w $1 ; number of letters
		    dc.w $000B, $A598, $A2CC, $0000 ;2
 
T_ACT3:		    dc.w $1 ; number of letters
		    dc.w $000B, $A5A4, $A2D2, $0000 ;3
 
T_STH:       	    dc.w $5 ; number of letters
		    dc.w $000D, $85B0, $82DE, $FFB8 ;SONI
		    dc.w $000D, $85B8, $82DC, $FFD8 ;C TH
		    dc.w $000D, $85C0, $82E0, $FFF8 ;E HE
		    dc.w $000D, $85C8, $82E4, $0018 ;DGEH
		    dc.w $0005, $85D0, $82E8, $0038 ;OG
 
T_STRIPEDGE:		    dc.w $7 ; number of letters
		    dc.w $9003, $85D4, $82EA, $0000 ;>
		    dc.w $B003, $85D4, $82EA, $0000 ;>
		    dc.w $D003, $85D4, $82EA, $0000 ;>
		    dc.w $F003, $85D4, $82EA, $0000 ;>
		    dc.w $1003, $85D4, $82EA, $0000 ;>
		    dc.w $3003, $85D4, $82EA, $0000 ;>
		    dc.w $5003, $85D4, $82EA, $0000 ;>
 
; -------------------------------------------------------------------------------
 

Extending the cycling palette information

Now we want to locate:

 
; off_19F4:
PalCycle:
	dc.w PalCycle_EHZ - PalCycle	; 0
	dc.w PalCycle_Null - PalCycle	; 1
	dc.w PalCycle_Level2 - PalCycle	; 2
	dc.w PalCycle_Null - PalCycle	; 3
	dc.w PalCycle_MTZ - PalCycle	; 4
	dc.w PalCycle_MTZ - PalCycle	; 5
	dc.w PalCycle_WFZ - PalCycle	; 6
	dc.w PalCycle_HTZ - PalCycle	; 7
	dc.w PalCycle_HPZ - PalCycle	; 8
	dc.w PalCycle_Null - PalCycle	; 9
	dc.w PalCycle_OOZ - PalCycle	; 10
	dc.w PalCycle_MCZ - PalCycle	; 11
	dc.w PalCycle_CNZ - PalCycle	; 12
	dc.w PalCycle_CPZ - PalCycle	; 13
	dc.w PalCycle_CPZ - PalCycle	; 14
	dc.w PalCycle_ARZ - PalCycle	; 15
	dc.w PalCycle_WFZ - PalCycle	; 16
 

and replace it with:

 
; off_19F4:
PalCycle:
	dc.w PalCycle_EHZ - PalCycle	; 00
	dc.w PalCycle_Null - PalCycle	; 01
	dc.w PalCycle_Level2 - PalCycle	; 02
	dc.w PalCycle_Null - PalCycle	; 03
	dc.w PalCycle_MTZ - PalCycle	; 04
	dc.w PalCycle_MTZ - PalCycle	; 05
	dc.w PalCycle_WFZ - PalCycle	; 06
	dc.w PalCycle_HTZ - PalCycle	; 07
	dc.w PalCycle_HPZ - PalCycle	; 08
	dc.w PalCycle_Null - PalCycle	; 09
	dc.w PalCycle_OOZ - PalCycle	; 0A
	dc.w PalCycle_MCZ - PalCycle	; 0B
	dc.w PalCycle_CNZ - PalCycle	; 0C
	dc.w PalCycle_CPZ - PalCycle	; 0D
	dc.w PalCycle_CPZ - PalCycle	; 0E
	dc.w PalCycle_ARZ - PalCycle	; 0F
	dc.w PalCycle_WFZ - PalCycle	; 10
	dc.w PalCycle_Null - PalCycle	; 11
	dc.w PalCycle_Null - PalCycle	; 12
	dc.w PalCycle_Null - PalCycle	; 13
	dc.w PalCycle_Null - PalCycle	; 14
	dc.w PalCycle_Null - PalCycle	; 15
	dc.w PalCycle_Null - PalCycle	; 16
	dc.w PalCycle_Null - PalCycle	; 17
	dc.w PalCycle_Null - PalCycle	; 18
	dc.w PalCycle_Null - PalCycle	; 19
	dc.w PalCycle_Null - PalCycle	; 1A
	dc.w PalCycle_Null - PalCycle	; 1B
	dc.w PalCycle_Null - PalCycle	; 1C
	dc.w PalCycle_Null - PalCycle	; 1D
	dc.w PalCycle_Null - PalCycle	; 1E
	dc.w PalCycle_Null - PalCycle	; 1F
	dc.w PalCycle_Null - PalCycle	; 20
 

That inserts empty slots for the cycling palettes of out new levels.

Extending the static palette list

Next we locate:

 
PalPointers:
	palptr Pal_SEGA,  Normal_palette, $1F
	palptr Pal_Title, Normal_palette_line2, 7
	palptr Pal_UNK1,  Normal_palette, $1F
	palptr Pal_BGND,  Normal_palette, $F
	palptr Pal_EHZ,   Normal_palette_line2, $17
	palptr Pal_EHZ,   Normal_palette_line2, $17
	palptr Pal_WZ,    Normal_palette_line2, $17
	palptr Pal_EHZ,   Normal_palette_line2, $17
	palptr Pal_MTZ,   Normal_palette_line2, $17
	palptr Pal_MTZ,   Normal_palette_line2, $17
	palptr Pal_WFZ,   Normal_palette_line2, $17
	palptr Pal_HTZ,   Normal_palette_line2, $17
	palptr Pal_HPZ,   Normal_palette_line2, $17
	palptr Pal_EHZ,   Normal_palette_line2, $17
	palptr Pal_OOZ,   Normal_palette_line2, $17
	palptr Pal_MCZ,   Normal_palette_line2, $17
	palptr Pal_CNZ,   Normal_palette_line2, $17
	palptr Pal_CPZ,   Normal_palette_line2, $17
	palptr Pal_DEZ,   Normal_palette_line2, $17
	palptr Pal_ARZ,   Normal_palette_line2, $17
	palptr Pal_SCZ,   Normal_palette_line2, $17
	palptr Pal_HPZ_U, Normal_palette, $1F
	palptr Pal_CPZ_U, Normal_palette, $1F
	palptr Pal_ARZ_U, Normal_palette, $1F
	palptr Pal_SS,    Normal_palette, $17
	palptr Pal_UNK2,  Normal_palette_line2, 7
	palptr Pal_UNK3,  Normal_palette_line2, 7
	palptr Pal_SS1,   Normal_palette_line4, 7
	palptr Pal_SS2,   Normal_palette_line4, 7
	palptr Pal_SS3,   Normal_palette_line4, 7
	palptr Pal_SS4,   Normal_palette_line4, 7
	palptr Pal_SS5,   Normal_palette_line4, 7
	palptr Pal_SS6,   Normal_palette_line4, 7
	palptr Pal_SS7,   Normal_palette_line4, 7
	palptr Pal_UNK4,  Normal_palette_line4, 7
	palptr Pal_UNK5,  Normal_palette_line4, 7
	palptr Pal_UNK6,  Normal_palette_line4, 7
	palptr Pal_OOZ_B, Normal_palette_line2, 7
	palptr Pal_Menu,  Normal_palette, $1F
	palptr Pal_UNK7,  Normal_palette, $1F
 
; ----------------------------------------------------------------------------
Pal_SEGA:  BINCLUDE "art/palettes/Sega screen.bin" ; SEGA screen palette (Sonic and initial background)
Pal_Title: BINCLUDE "art/palettes/Title screen.bin" ; Title screen Palette
Pal_UNK1:  BINCLUDE "art/palettes/Unknown 1.bin" ; Unknown palette 1 (leftover S1 level select palette?)
Pal_BGND:  BINCLUDE "art/palettes/SonicAndTails.bin" ; "Sonic and Miles" background palette (also usually the primary palette line)
Pal_EHZ:   BINCLUDE "art/palettes/EHZ.bin" ; Emerald Hill Zone palette
Pal_WZ:    BINCLUDE "art/palettes/Wood Zone.bin" ; Wood Zone palette
Pal_MTZ:   BINCLUDE "art/palettes/MTZ.bin" ; Metropolis Zone palette
Pal_WFZ:   BINCLUDE "art/palettes/WFZ.bin" ; Wing Fortress Zone palette
Pal_HTZ:   BINCLUDE "art/palettes/HTZ.bin" ; Hill Top Zone palette
Pal_HPZ:   BINCLUDE "art/palettes/HPZ.bin" ; Hidden Palace Zone palette
Pal_HPZ_U: BINCLUDE "art/palettes/HPZ underwater.bin" ; Hidden Palace Zone underwater palette
Pal_OOZ:   BINCLUDE "art/palettes/OOZ.bin" ; Oil Ocean Zone palette
Pal_MCZ:   BINCLUDE "art/palettes/MCZ.bin" ; Mystic Cave Zone palette
Pal_CNZ:   BINCLUDE "art/palettes/CNZ.bin" ; Casino Night Zone palette
Pal_CPZ:   BINCLUDE "art/palettes/CPZ.bin" ; Chemical Plant Zone palette
Pal_CPZ_U: BINCLUDE "art/palettes/CPZ underwater.bin" ; Chemical Plant Zone underwater palette
Pal_DEZ:   BINCLUDE "art/palettes/DEZ.bin" ; Death Egg Zone palette
Pal_ARZ:   BINCLUDE "art/palettes/ARZ.bin" ; Aquatic Ruin Zone palette
Pal_ARZ_U: BINCLUDE "art/palettes/ARZ underwater.bin" ; Aquatic Ruin Zone underwater palette
Pal_SCZ:   BINCLUDE "art/palettes/SCZ.bin" ; Sky Chase Zone palette
Pal_UNK2:  BINCLUDE "art/palettes/Unknown 2.bin" ; Unknown palette 2
Pal_UNK3:  BINCLUDE "art/palettes/Unknown 3.bin" ; Unknown palette 3
Pal_OOZ_B: BINCLUDE "art/palettes/OOZ Boss.bin" ; Oil Ocean Zone boss palette
Pal_Menu:  BINCLUDE "art/palettes/Menu.bin" ; Menu palette
Pal_SS:    BINCLUDE "art/palettes/Special Stage Main.bin" ; Special Stage palette
Pal_SS1:   BINCLUDE "art/palettes/Special Stage 1.bin" ; Special Stage 1 palette
Pal_SS2:   BINCLUDE "art/palettes/Special Stage 2.bin" ; Special Stage 2 palette
Pal_SS3:   BINCLUDE "art/palettes/Special Stage 3.bin" ; Special Stage 3 palette
Pal_SS4:   BINCLUDE "art/palettes/Special Stage 4.bin" ; Special Stage 4 palette
Pal_SS5:   BINCLUDE "art/palettes/Special Stage 5.bin" ; Special Stage 5 palette
Pal_SS6:   BINCLUDE "art/palettes/Special Stage 6.bin" ; Special Stage 6 palette
Pal_SS7:   BINCLUDE "art/palettes/Special Stage 7.bin" ; Special Stage 7 palette
Pal_UNK4:  BINCLUDE "art/palettes/Special Stage 1 2p.bin" ; Special Stage 1 2p palette
Pal_UNK5:  BINCLUDE "art/palettes/Special Stage 2 2p.bin" ; Special Stage 2 2p palette
Pal_UNK6:  BINCLUDE "art/palettes/Special Stage 3 2p.bin" ; Special Stage 3 2p palette
Pal_UNK7:  BINCLUDE "art/palettes/Special Stage Results Screen.bin" ; Special Stage Results Screen palette
 

and replace it with:

 
PalPointers:
	palptr Pal_SEGA,  Normal_palette, $1F
	palptr Pal_Title, Normal_palette_line2, 7
	palptr Pal_UNK1,  Normal_palette, $1F
	palptr Pal_BGND,  Normal_palette, $F
	palptr Pal_EHZ,   Normal_palette_line2, $17
	palptr Pal_EHZ,   Normal_palette_line2, $17
	palptr Pal_WZ,    Normal_palette_line2, $17
	palptr Pal_EHZ,   Normal_palette_line2, $17
	palptr Pal_MTZ,   Normal_palette_line2, $17
	palptr Pal_MTZ,   Normal_palette_line2, $17
	palptr Pal_WFZ,   Normal_palette_line2, $17
	palptr Pal_HTZ,   Normal_palette_line2, $17
	palptr Pal_HPZ,   Normal_palette_line2, $17
	palptr Pal_EHZ,   Normal_palette_line2, $17
	palptr Pal_OOZ,   Normal_palette_line2, $17
	palptr Pal_MCZ,   Normal_palette_line2, $17
	palptr Pal_CNZ,   Normal_palette_line2, $17
	palptr Pal_CPZ,   Normal_palette_line2, $17
	palptr Pal_DEZ,   Normal_palette_line2, $17
	palptr Pal_ARZ,   Normal_palette_line2, $17
	palptr Pal_SCZ,   Normal_palette_line2, $17
	palptr Pal_HPZ_U, Normal_palette, $1F
	palptr Pal_CPZ_U, Normal_palette, $1F
	palptr Pal_ARZ_U, Normal_palette, $1F
	palptr Pal_SS,    Normal_palette, $17
	palptr Pal_UNK2,  Normal_palette_line2, 7
	palptr Pal_UNK3,  Normal_palette_line2, 7
	palptr Pal_SS1,   Normal_palette_line4, 7
	palptr Pal_SS2,   Normal_palette_line4, 7
	palptr Pal_SS3,   Normal_palette_line4, 7
	palptr Pal_SS4,   Normal_palette_line4, 7
	palptr Pal_SS5,   Normal_palette_line4, 7
	palptr Pal_SS6,   Normal_palette_line4, 7
	palptr Pal_SS7,   Normal_palette_line4, 7
	palptr Pal_UNK4,  Normal_palette_line4, 7
	palptr Pal_UNK5,  Normal_palette_line4, 7
	palptr Pal_UNK6,  Normal_palette_line4, 7
	palptr Pal_OOZ_B, Normal_palette_line2, 7
	palptr Pal_Menu,  Normal_palette, $1F
	palptr Pal_UNK7,  Normal_palette, $1F
	palptr Pal_Lev11,   Normal_palette_line2, $17
	palptr Pal_Lev12,   Normal_palette_line2, $17
	palptr Pal_Lev13,   Normal_palette_line2, $17
	palptr Pal_Lev14,   Normal_palette_line2, $17
	palptr Pal_Lev15,   Normal_palette_line2, $17
	palptr Pal_Lev16,   Normal_palette_line2, $17
	palptr Pal_Lev17,   Normal_palette_line2, $17
	palptr Pal_Lev18,   Normal_palette_line2, $17
	palptr Pal_Lev19,   Normal_palette_line2, $17
	palptr Pal_Lev1A,   Normal_palette_line2, $17
	palptr Pal_Lev1B,   Normal_palette_line2, $17
	palptr Pal_Lev1C,   Normal_palette_line2, $17
	palptr Pal_Lev1D,   Normal_palette_line2, $17
	palptr Pal_Lev1E,   Normal_palette_line2, $17
	palptr Pal_Lev1F,   Normal_palette_line2, $17
	palptr Pal_Lev20,   Normal_palette_line2, $17
 
; ----------------------------------------------------------------------------
Pal_SEGA:  BINCLUDE "art/palettes/Sega screen.bin" ; SEGA screen palette (Sonic and initial background)
Pal_Title: BINCLUDE "art/palettes/Title screen.bin" ; Title screen Palette
Pal_UNK1:  BINCLUDE "art/palettes/Unknown 1.bin" ; Unknown palette 1 (leftover S1 level select palette?)
Pal_BGND:  BINCLUDE "art/palettes/SonicAndTails.bin" ; "Sonic and Miles" background palette (also usually the primary palette line)
Pal_EHZ:   BINCLUDE "art/palettes/EHZ.bin" ; Emerald Hill Zone palette
Pal_WZ:    BINCLUDE "art/palettes/Wood Zone.bin" ; Wood Zone palette
Pal_MTZ:   BINCLUDE "art/palettes/MTZ.bin" ; Metropolis Zone palette
Pal_WFZ:   BINCLUDE "art/palettes/WFZ.bin" ; Wing Fortress Zone palette
Pal_HTZ:   BINCLUDE "art/palettes/HTZ.bin" ; Hill Top Zone palette
Pal_HPZ:   BINCLUDE "art/palettes/HPZ.bin" ; Hidden Palace Zone palette
Pal_HPZ_U: BINCLUDE "art/palettes/HPZ underwater.bin" ; Hidden Palace Zone underwater palette
Pal_OOZ:   BINCLUDE "art/palettes/OOZ.bin" ; Oil Ocean Zone palette
Pal_MCZ:   BINCLUDE "art/palettes/MCZ.bin" ; Mystic Cave Zone palette
Pal_CNZ:   BINCLUDE "art/palettes/CNZ.bin" ; Casino Night Zone palette
Pal_CPZ:   BINCLUDE "art/palettes/CPZ.bin" ; Chemical Plant Zone palette
Pal_CPZ_U: BINCLUDE "art/palettes/CPZ underwater.bin" ; Chemical Plant Zone underwater palette
Pal_DEZ:   BINCLUDE "art/palettes/DEZ.bin" ; Death Egg Zone palette
Pal_ARZ:   BINCLUDE "art/palettes/ARZ.bin" ; Aquatic Ruin Zone palette
Pal_ARZ_U: BINCLUDE "art/palettes/ARZ underwater.bin" ; Aquatic Ruin Zone underwater palette
Pal_SCZ:   BINCLUDE "art/palettes/SCZ.bin" ; Sky Chase Zone palette
Pal_Lev11:   BINCLUDE "art/palettes/Lev11.bin" ; New Level palette
Pal_Lev12:   BINCLUDE "art/palettes/Lev12.bin" ; New Level palette
Pal_Lev13:   BINCLUDE "art/palettes/Lev13.bin" ; New Level palette
Pal_Lev14:   BINCLUDE "art/palettes/Lev14.bin" ; New Level palette
Pal_Lev15:   BINCLUDE "art/palettes/Lev15.bin" ; New Level palette
Pal_Lev16:   BINCLUDE "art/palettes/Lev16.bin" ; New Level palette
Pal_Lev17:   BINCLUDE "art/palettes/Lev17.bin" ; New Level palette
Pal_Lev18:   BINCLUDE "art/palettes/Lev18.bin" ; New Level palette
Pal_Lev19:   BINCLUDE "art/palettes/Lev19.bin" ; New Level palette
Pal_Lev1A:   BINCLUDE "art/palettes/Lev1A.bin" ; New Level palette
Pal_Lev1B:   BINCLUDE "art/palettes/Lev1B.bin" ; New Level palette
Pal_Lev1C:   BINCLUDE "art/palettes/Lev1C.bin" ; New Level palette
Pal_Lev1D:   BINCLUDE "art/palettes/Lev1D.bin" ; New Level palette
Pal_Lev1E:   BINCLUDE "art/palettes/Lev1E.bin" ; New Level palette
Pal_Lev1F:   BINCLUDE "art/palettes/Lev1F.bin" ; New Level palette
Pal_Lev20:   BINCLUDE "art/palettes/Lev20.bin" ; New Level palette
Pal_UNK2:  BINCLUDE "art/palettes/Unknown 2.bin" ; Unknown palette 2
Pal_UNK3:  BINCLUDE "art/palettes/Unknown 3.bin" ; Unknown palette 3
Pal_OOZ_B: BINCLUDE "art/palettes/OOZ Boss.bin" ; Oil Ocean Zone boss palette
Pal_Menu:  BINCLUDE "art/palettes/Menu.bin" ; Menu palette
Pal_SS:    BINCLUDE "art/palettes/Special Stage Main.bin" ; Special Stage palette
Pal_SS1:   BINCLUDE "art/palettes/Special Stage 1.bin" ; Special Stage 1 palette
Pal_SS2:   BINCLUDE "art/palettes/Special Stage 2.bin" ; Special Stage 2 palette
Pal_SS3:   BINCLUDE "art/palettes/Special Stage 3.bin" ; Special Stage 3 palette
Pal_SS4:   BINCLUDE "art/palettes/Special Stage 4.bin" ; Special Stage 4 palette
Pal_SS5:   BINCLUDE "art/palettes/Special Stage 5.bin" ; Special Stage 5 palette
Pal_SS6:   BINCLUDE "art/palettes/Special Stage 6.bin" ; Special Stage 6 palette
Pal_SS7:   BINCLUDE "art/palettes/Special Stage 7.bin" ; Special Stage 7 palette
Pal_UNK4:  BINCLUDE "art/palettes/Special Stage 1 2p.bin" ; Special Stage 1 2p palette
Pal_UNK5:  BINCLUDE "art/palettes/Special Stage 2 2p.bin" ; Special Stage 2 2p palette
Pal_UNK6:  BINCLUDE "art/palettes/Special Stage 3 2p.bin" ; Special Stage 3 2p palette
Pal_UNK7:  BINCLUDE "art/palettes/Special Stage Results Screen.bin" ; Special Stage Results Screen palette
 

That inserts our new palettes, which we will be using when we start on the main level load block.

Extending Zone Procedures and Scripts

Now we need to add the zone scripts.

Find:

 
PLC_DYNANM:				; Zone ID
	dc.w Dynamic_Normal-PLC_DYNANM	; $00
	dc.w Animated_EHZ-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM	; $01
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM	; $02
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM	; $03
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Normal-PLC_DYNANM	; $04
	dc.w Animated_MTZ-PLC_DYNANM
 
	dc.w Dynamic_Normal-PLC_DYNANM	; $05
	dc.w Animated_MTZ-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM	; $06
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_HTZ-PLC_DYNANM	; $07
	dc.w Animated_HTZ-PLC_DYNANM
 
	dc.w Dynamic_Normal-PLC_DYNANM	; $08
	dc.w Animated_OOZ-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM	; $09
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Normal-PLC_DYNANM	; $0A
	dc.w Animated_OOZ2-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM	; $0B
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_CNZ-PLC_DYNANM	; $0C
	dc.w Animated_CNZ-PLC_DYNANM
 
	dc.w Dynamic_Normal-PLC_DYNANM	; $0D
	dc.w Animated_CPZ-PLC_DYNANM
 
	dc.w Dynamic_Normal-PLC_DYNANM	; $0F
	dc.w Animated_DEZ-PLC_DYNANM
 
	dc.w Dynamic_ARZ-PLC_DYNANM	; $10
	dc.w Animated_ARZ-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM	; $11
	dc.w Animated_Null-PLC_DYNANM	; yes, level $11
 

and add to the end of it:

 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 
	dc.w Dynamic_Null-PLC_DYNANM
	dc.w Animated_Null-PLC_DYNANM
 

This creates scripts for the new levels. To make complex animations (like the HPZ pulsing ball) you will need to create a Anim*level*.bin and add it to the Anim*level*.bin files and add it to the animated pattern mappings. See the section below.

Extending Animated Pattern Mappings

Find:

 
AnimPatMaps:
	dc.w APM16_EHZ - AnimPatMaps ;  0
	dc.w APM_Null - AnimPatMaps  ;  1
	dc.w APM_Null - AnimPatMaps  ;  2
	dc.w APM_Null - AnimPatMaps  ;  3
	dc.w APM16_MTZ - AnimPatMaps ;  4
	dc.w APM16_MTZ - AnimPatMaps ;  5
	dc.w APM_Null - AnimPatMaps  ;  6
	dc.w APM16_EHZ - AnimPatMaps ;  7
	dc.w APM_HPZ - AnimPatMaps   ;  8
	dc.w APM_Null - AnimPatMaps  ;  9
	dc.w APM_OOZ - AnimPatMaps   ; $A
	dc.w APM_Null - AnimPatMaps  ; $B
	dc.w APM_CNZ - AnimPatMaps   ; $C
	dc.w APM_CPZ - AnimPatMaps   ; $D
	dc.w APM_DEZ - AnimPatMaps   ; $E
	dc.w APM_ARZ - AnimPatMaps   ; $F
	dc.w APM_Null - AnimPatMaps  ;$10
 

then add this to the end

 
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
	dc.w APM_Null - AnimPatMaps
 

then edit and change as needed. Add the new .bin files to below here:

 
; byte_40372:
APM16_EHZ:	BINCLUDE	"mappings/16x16/AnimEHZ.bin"
 
; byte_403EE:
APM16_MTZ:	BINCLUDE	"mappings/16x16/AnimMTZ.bin"
 
; byte_404C2:
APM_HPZ:	BINCLUDE	"mappings/16x16/AnimHPZ.bin"
 
; byte_405B6:
APM_OOZ:	BINCLUDE	"mappings/16x16/AnimOOZ.bin"
 
; byte_4061A:
APM_CNZ:	BINCLUDE	"mappings/16x16/AnimCNZ.bin"
 
; byte_406BE:
APM_CNZ2P:	BINCLUDE	"mappings/16x16/AnimCNZ2P.bin"
 
; byte_40762:
APM_CPZ:	BINCLUDE	"mappings/16x16/AnimCPZ.bin"
 
; byte_4076E:
APM_DEZ:	BINCLUDE	"mappings/16x16/AnimDEZ.bin"
 
; byte_4077A:
APM_ARZ:	BINCLUDE	"mappings/16x16/AnimARZ.bin"
 
; byte_407BE:
APM_Null:	dc.w   0
 

and then possibly create the nessisary load queries for them. (If so, you need to know what you're doing here.)

Extending the 1 Player and 2 Player music playlists

next we find:

 
; loc_40AE:
Level_GetBgm:
	tst.w	(Demo_mode_flag).w
	bmi.s	loc_4114
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	lea	MusicList(pc),a1
	tst.w	(Two_player_mode).w
	beq.s	Level_PlayBgm
	lea	MusicList2(pc),a1
 

and replace it with:

 
; loc_40AE:
Level_GetBgm:
	tst.w	(Demo_mode_flag).w
	bmi.s	loc_4114
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	lea	MusicList(pc),a1
	tst.w	(Two_player_mode).w
	beq.s	Level_PlayBgm
	jsr	Level_2PlayerBGMList
 


now we want to find:

 
;----------------------------------------------------------------------------
; 1P Music Playlist
;----------------------------------------------------------------------------
; byte_3EA0:
MusicList:
	dc.b   2+$80	; 0 ; EHZ
	dc.b   2+$80	; 1
	dc.b   5+$80	; 2
	dc.b   4+$80	; 3
	dc.b   5+$80	; 4 ; MTZ1,2
	dc.b   5+$80	; 5 ; MTZ3
	dc.b  $F+$80	; 6 ; WFZ
	dc.b   6+$80	; 7 ; HTZ
	dc.b $10+$80	; 8
	dc.b  $D+$80	; 9
	dc.b   4+$80	; 10 ; OOZ
	dc.b  $B+$80	; 11 ; MCZ
	dc.b  $9+$80	; 12 ; CNZ
	dc.b  $E+$80	; 13 ; CPZ
	dc.b  $A+$80	; 14 ; DEZ
	dc.b   7+$80	; 15 ; ARZ
	dc.b  $D+$80	; 16 ; SCZ
	dc.b   0	; 17
;----------------------------------------------------------------------------
; 2P Music Playlist
;----------------------------------------------------------------------------
; byte_3EB2:
MusicList2:
	dc.b  $C+$80	; 0  ; EHZ 2P
	dc.b   2+$80	; 1
	dc.b   5+$80	; 2
	dc.b   4+$80	; 3
	dc.b   5+$80	; 4
	dc.b   5+$80	; 5
	dc.b  $F+$80	; 6
	dc.b   6+$80	; 7
	dc.b $10+$80	; 8
	dc.b  $D+$80	; 9
	dc.b   4+$80	; 10
	dc.b   3+$80	; 11 ; MCZ 2P
	dc.b   8+$80	; 12 ; CNZ 2P
	dc.b  $E+$80	; 13
	dc.b  $A+$80	; 14
	dc.b   7+$80	; 15
	dc.b  $D+$80	; 16
	dc.b   0	; 17
 

and replace it with:

 
;----------------------------------------------------------------------------
; 2P Music Playlist
;----------------------------------------------------------------------------
; byte_3EB2:
MusicList2:
	dc.b  $C+$80	; 00  ; EHZ 2P
	dc.b   2+$80	; 01
	dc.b   5+$80	; 02
	dc.b   4+$80	; 03
	dc.b   5+$80	; 04
	dc.b   5+$80	; 05
	dc.b  $F+$80	; 06
	dc.b   6+$80	; 07
	dc.b $10+$80	; 08
	dc.b  $D+$80	; 09
	dc.b   4+$80	; 0A
	dc.b   3+$80	; 0B ; MCZ 2P
	dc.b   8+$80	; 0C ; CNZ 2P
	dc.b  $E+$80	; 0D
	dc.b  $A+$80	; 0E
	dc.b   7+$80	; 0F
	dc.b  $D+$80	; 10
	dc.b   2+$80	; 11
	dc.b   2+$80	; 12
	dc.b   2+$80	; 13
	dc.b   2+$80	; 14
	dc.b   2+$80	; 15
	dc.b   2+$80	; 16
	dc.b   2+$80	; 17
	dc.b   2+$80	; 18
	dc.b   2+$80	; 19
	dc.b   2+$80	; 1A
	dc.b   2+$80	; 1B
	dc.b   2+$80	; 1C
	dc.b   2+$80	; 1D
	dc.b   2+$80	; 1E
	dc.b   2+$80	; 1F
	dc.b   2+$80	; 20
	dc.b   0
 
Level_2PlayerBGMList:
	lea	MusicList2(pc),a1
	rts
 
;----------------------------------------------------------------------------
; 1P Music Playlist
;----------------------------------------------------------------------------
; byte_3EA0:
MusicList:
	dc.b   2+$80	; 00 ; EHZ
	dc.b   2+$80	; 01
	dc.b   5+$80	; 02
	dc.b   4+$80	; 03
	dc.b   5+$80	; 04 ; MTZ1,2
	dc.b   5+$80	; 05 ; MTZ3
	dc.b  $F+$80	; 06 ; WFZ
	dc.b   6+$80	; 07 ; HTZ
	dc.b $10+$80	; 08
	dc.b  $D+$80	; 09
	dc.b   4+$80	; 0A ; OOZ
	dc.b  $B+$80	; 0B ; MCZ
	dc.b  $9+$80	; 0C; CNZ
	dc.b  $E+$80	; 0D ; CPZ
	dc.b  $A+$80	; 0E ; DEZ
	dc.b   7+$80	; 0F ; ARZ
	dc.b  $D+$80	; 10 ; SCZ
	dc.b   2+$80	; 11
	dc.b   2+$80	; 12
	dc.b   2+$80	; 13
	dc.b   2+$80	; 14
	dc.b   2+$80	; 15
	dc.b   2+$80	; 16
	dc.b   2+$80	; 17
	dc.b   2+$80	; 18
	dc.b   2+$80	; 19
	dc.b   2+$80	; 1A
	dc.b   2+$80	; 1B
	dc.b   2+$80	; 1C
	dc.b   2+$80	; 1D
	dc.b   2+$80	; 1E
	dc.b   2+$80	; 1F
	dc.b   2+$80	; 20
	dc.b   0
 

That updates our music list for both 2 player and 1 player modes, and fixes an error that sometimes occurs during the build process relating to somwthing not fitting in a signed byte, which can easily happen when you have a lot of added zones.


Branch fixes

Before we go any further, I will note that if you tried to compile now, you would have some "jump distance too big" errors, lets fix them:

first, we will find:

 
GameModesArray: ;;
	bra.w	SegaScreen		; $00 SEGA screen mode
	bra.w	TitleScreen		; $04 Title screen mode
	bra.w	Level			; $08 Demo mode
	bra.w	Level			; $0C Zone play mode
	bra.w	SpecialStage		; $10 Special stage play mode
	bra.w	ContinueScreen		; $14 Continue mode
	bra.w	TwoPlayerResults	; $18 2P results mode
	bra.w	LevelSelectMenu2P	; $1C 2P level select mode
	bra.w	JmpTo_EndingSequence	; $20 End sequence mode
	bra.w	OptionsMenu		; $24 Options mode
	bra.w	LevelSelectMenu		; $28 Level select mode
; ===========================================================================
 

and replace it with:

 
GameModesArray: ;;
	bra.w	SegaScreen		; $00 SEGA screen mode
	bra.w	TitleScreen		; $04 Title screen mode
	bra.w	Level			; $08 Demo mode
	bra.w	Level			; $0C Zone play mode
	bra.w	SpecialStage		; $10 Special stage play mode
	bra.w	ContinueScreen		; $14 Continue mode
	bra.w	Jmpto_TwoPlayerResults	; $18 2P results mode
	bra.w	LevelSelectMenu2P	; $1C 2P level select mode
	bra.w	JmpTo_EndingSequence	; $20 End sequence mode
	bra.w	OptionsMenu		; $24 Options mode
	bra.w	LevelSelectMenu		; $28 Level select mode
; ===========================================================================
Jmpto_TwoPlayerResults:
	jmp	TwoPlayerResults
 

then we we will find:

 
MenuScreen:
	bsr.w	Pal_FadeFrom
	move	#$2700,sr
	move.w	($FFFFF60C).w,d0
	andi.b	#-$41,d0
	move.w	d0,(VDP_control_port).l
	bsr.w	ClearScreen
	lea	(VDP_control_port).l,a6
	move.w	#$8004,(a6)
	move.w	#$8230,(a6)
	move.w	#$8407,(a6)
	move.w	#$8230,(a6)
	move.w	#$8700,(a6)
	move.w	#$8C81,(a6)
	move.w	#$9001,(a6)
	clearRAM Sprite_Table_Input,$400
	clearRAM Object_RAM,$2000
 
	clr.w	(VDP_Command_Buffer).w
	move.l	#VDP_Command_Buffer,(VDP_Command_Buffer_Slot).w
	move.l	#$42000000,(VDP_control_port).l
	lea	(ArtNem_FontStuff).l,a0
	bsr.w	NemDec
	move.l	#$4E000000,(VDP_control_port).l
	lea	(ArtNem_MenuBox).l,a0
	bsr.w	NemDec
	move.l	#$52000000,(VDP_control_port).l
	lea	(ArtNem_LevelSelectPics).l,a0
	bsr.w	NemDec
 

we want to change it to:

 
MenuScreen:
	bsr.w	Pal_FadeFrom
	move	#$2700,sr
	move.w	($FFFFF60C).w,d0
	andi.b	#-$41,d0
	move.w	d0,(VDP_control_port).l
	bsr.w	JumpTo_ClearScreen
	lea	(VDP_control_port).l,a6
	move.w	#$8004,(a6)
	move.w	#$8230,(a6)
	move.w	#$8407,(a6)
	move.w	#$8230,(a6)
	move.w	#$8700,(a6)
	move.w	#$8C81,(a6)
	move.w	#$9001,(a6)
	jmp	Cont_MenuScreen
 
 
JumpTo_ClearScreen:
	jmp	ClearScreen
JumpTo_NemDec000:
	jmp	ClearScreen
 
Cont_MenuScreen:
 
	clearRAM Sprite_Table_Input,$400
	clearRAM Object_RAM,$2000
 
	clr.w	(VDP_Command_Buffer).w
	move.l	#VDP_Command_Buffer,(VDP_Command_Buffer_Slot).w
	move.l	#$42000000,(VDP_control_port).l
	lea	(ArtNem_FontStuff).l,a0
	bsr.w	JumpTo_NemDec000
	move.l	#$4E000000,(VDP_control_port).l
	lea	(ArtNem_MenuBox).l,a0
	bsr.w	JumpTo_NemDec000
	move.l	#$52000000,(VDP_control_port).l
	lea	(ArtNem_LevelSelectPics).l,a0
	bsr.w	JumpTo_NemDec000
 

now we want to locate:

 
MenuScreen_LevelSelect:
	lea	(Metablock_Table).l,a1
	lea	(MapEng_LevSel).l,a0
	move.w	#0,d0
	bsr.w	EniDec
	lea	(Metablock_Table).l,a1
	move.l	#$40000003,d0
	moveq	#$27,d1
	moveq	#$1B,d2
	bsr.w	JmpTo_ShowVDPGraphics
	moveq	#0,d3
	bsr.w	loc_965A
	lea	($FFFF08C0).l,a1
	lea	(MapEng_LevSelIcon).l,a0
	move.w	#$90,d0
	bsr.w	EniDec
	bsr.w	loc_9688
	clr.w	(Player_mode).w
	clr.w	(Results_Screen_2P).w
	clr.b	(Level_started_flag).w
	clr.w	($FFFFF7F0).w
	lea	(word_87C6).l,a2
	bsr.w	JmpTo2_Dynamic_Normal
	moveq	#$26,d0
	bsr.w	PalLoad1
	lea	(Normal_palette_line3).w,a1
	lea	(Second_palette_line3).w,a2
	moveq	#7,d1
 

and change it to:

 
MenuScreen_LevelSelect:
	lea	(Metablock_Table).l,a1
	lea	(MapEng_LevSel).l,a0
	move.w	#0,d0
	bsr.w	JumpTo_EniDec
	lea	(Metablock_Table).l,a1
	move.l	#$40000003,d0
	moveq	#$27,d1
	moveq	#$1B,d2
	bsr.w	JmpTo_ShowVDPGraphics
	moveq	#0,d3
	bsr.w	loc_965A
	lea	($FFFF08C0).l,a1
	lea	(MapEng_LevSelIcon).l,a0
	move.w	#$90,d0
	bsr.w	JumpTo_EniDec
	bsr.w	loc_9688
	clr.w	(Player_mode).w
	clr.w	(Results_Screen_2P).w
	clr.b	(Level_started_flag).w
	clr.w	($FFFFF7F0).w
	lea	(word_87C6).l,a2
	bsr.w	JmpTo2_Dynamic_Normal
	moveq	#$26,d0
	bsr.w	PalLoad1
	lea	(Normal_palette_line3).w,a1
	lea	(Second_palette_line3).w,a2
	moveq	#7,d1
	jmp	loc_9366
 
JumpTo_EniDec:
	jmp	EniDec
 

next we want to find:

 
; loc_8FCC:
MenuScreen_Options:
	lea	(Metablock_Table).l,a1
	lea	(MapEng_Options).l,a0
	move.w	#$70,d0
	bsr.w	EniDec
	lea	($FFFF0160).l,a1
	lea	(MapEng_Options).l,a0
	move.w	#$2070,d0
	bsr.w	EniDec
	clr.b	(Options_menu_box).w
	bsr.w	sub_9186
	addq.b	#1,(Options_menu_box).w
	bsr.w	loc_91F8
	addq.b	#1,(Options_menu_box).w
	bsr.w	loc_91F8
	clr.b	(Options_menu_box).w
	clr.b	(Level_started_flag).w
	clr.w	($FFFFF7F0).w
	lea	(word_87C6).l,a2
	bsr.w	JmpTo2_Dynamic_Normal
	moveq	#$26,d0
	bsr.w	PalLoad1
	move.b	#-$6F,d0
	bsr.w	JmpTo_PlayMusic
	clr.w	(Two_player_mode).w
	clr.l	(Camera_X_pos).w
	clr.l	(Camera_Y_pos).w
	clr.w	(Correct_cheat_entries).w
	clr.w	(Correct_cheat_entries_2).w
	move.b	#$16,(Delay_Time).w
	bsr.w	DelayProgram
	move.w	($FFFFF60C).w,d0
	ori.b	#$40,d0
	move.w	d0,(VDP_control_port).l
	bsr.w	Pal_FadeTo
 

and change it to:

 
MenuScreen_Options:
	lea	(Metablock_Table).l,a1
	lea	(MapEng_Options).l,a0
	move.w	#$70,d0
	bsr.w	JmpTo_EniDec
	lea	($FFFF0160).l,a1
	lea	(MapEng_Options).l,a0
	move.w	#$2070,d0
	bsr.w	JmpTo_EniDec
	clr.b	(Options_menu_box).w
	bsr.w	sub_9186
	addq.b	#1,(Options_menu_box).w
	bsr.w	loc_91F8
	addq.b	#1,(Options_menu_box).w
	bsr.w	loc_91F8
	clr.b	(Options_menu_box).w
	clr.b	(Level_started_flag).w
	clr.w	($FFFFF7F0).w
	lea	(word_87C6).l,a2
	bsr.w	JmpTo2_Dynamic_Normal
	moveq	#$26,d0
	bsr.w	PalLoad1
	move.b	#-$6F,d0
	bsr.w	JmpTo_PlayMusic
	clr.w	(Two_player_mode).w
	clr.l	(Camera_X_pos).w
	clr.l	(Camera_Y_pos).w
	clr.w	(Correct_cheat_entries).w
	clr.w	(Correct_cheat_entries_2).w
	move.b	#$16,(Delay_Time).w
	bsr.w	DelayProgram
	move.w	($FFFFF60C).w,d0
	ori.b	#$40,d0
	move.w	d0,(VDP_control_port).l
	bsr.w	Pal_FadeTo
 

Find:

 
loc_4114:
	moveq	#3,d0
	bsr.w	PalLoad1	; load Sonic's palette line
	bsr.w	LevelSizeLoad
	bsr.w	JmpTo_DeformBgLayer
	clr.w	(Vscroll_Factor).w
	move.w	#-$E0,($FFFFF61E).w
 
	clearRAM Horiz_Scroll_Buf,$400
 
	bsr.w	sub_4E98
	bsr.w	JmpTo_loadZoneBlockMaps
	jsr	(loc_402D4).l
	bsr.w	JmpTo_loc_E300
	jsr	(FloorLog_Unk).l
	bsr.w	LoadCollisionIndexes
	bsr.w	WaterEffects
	bsr.w	InitPlayers
	move.w	#0,(Ctrl_1_Logical).w
	move.w	#0,(Ctrl_2_Logical).w
	move.w	#0,(Ctrl_1).w
	move.w	#0,(Ctrl_2).w
	move.b	#1,(Control_Locked).w
	move.b	#1,($FFFFF7CF).w
	move.b	#0,(Level_started_flag).w
; Level_ChkWater:
	tst.b	(Water_flag).w	; does level have water?
	beq.s	+	; if not, branch
	move.b	#4,(Object_RAM+$380).w ; load Obj04 (water surface) at $FFFFB380
	move.w	#$60,(Object_RAM+$380+x_pos).w ; set horizontal offset
	move.b	#4,(Object_RAM+$3C0).w ; load Obj04 (water surface) at $FFFFB3C0
	move.w	#$120,(Object_RAM+$3C0+x_pos).w ; set different horizontal offset
+
	cmpi.b	#$D,(Current_Zone).w	; check if zone == CPZ
	bne.s	+			; branch if not
	move.b	#$7C,(Object_RAM+$340).w ; load Obj7C (CPZ pylon) at $FFFFB340
+
	cmpi.b	#$A,(Current_Zone).w	; check if zone == OOZ
	bne.s	Level_ClrHUD		; branch if not
	move.b	#7,(Object_RAM+$380).w ; load Obj07 (OOZ oil) at $FFFFB380
 

and replace it with:

 
loc_4114:
	moveq	#3,d0
	bsr.w	PalLoad1	; load Sonic's palette line
	bsr.w	JmpTo_LevelSizeLoad
	bsr.w	JmpTo_DeformBgLayer
	clr.w	(Vscroll_Factor).w
	move.w	#-$E0,($FFFFF61E).w
 
	clearRAM Horiz_Scroll_Buf,$400
 
	bsr.w	sub_4E98
	bsr.w	JmpTo_loadZoneBlockMaps
	jsr	(loc_402D4).l
	bsr.w	JmpTo_loc_E300
	jsr	(FloorLog_Unk).l
	bsr.w	LoadCollisionIndexes
	bsr.w	WaterEffects
	bsr.w	InitPlayers
	move.w	#0,(Ctrl_1_Logical).w
	move.w	#0,(Ctrl_2_Logical).w
	move.w	#0,(Ctrl_1).w
	move.w	#0,(Ctrl_2).w
	move.b	#1,(Control_Locked).w
	move.b	#1,($FFFFF7CF).w
	move.b	#0,(Level_started_flag).w
; Level_ChkWater:
	tst.b	(Water_flag).w	; does level have water?
	beq.s	+	; if not, branch
	move.b	#4,(Object_RAM+$380).w ; load Obj04 (water surface) at $FFFFB380
	move.w	#$60,(Object_RAM+$380+x_pos).w ; set horizontal offset
	move.b	#4,(Object_RAM+$3C0).w ; load Obj04 (water surface) at $FFFFB3C0
	move.w	#$120,(Object_RAM+$3C0+x_pos).w ; set different horizontal offset
+
	cmpi.b	#$D,(Current_Zone).w	; check if zone == CPZ
	bne.s	+			; branch if not
	move.b	#$7C,(Object_RAM+$340).w ; load Obj7C (CPZ pylon) at $FFFFB340
+
	cmpi.b	#$A,(Current_Zone).w	; check if zone == OOZ
	bne.s	Level_ClrHUD		; branch if not
	move.b	#7,(Object_RAM+$380).w ; load Obj07 (OOZ oil) at $FFFFB380
 
JmpTo_LevelSizeLoad:
	jmp	LevelSizeLoad
 

Now we find:

 
sub_9EF4:
	tst.b	($FFFFF660).w
	beq.w	return_A0BE
	bsr.w	Pal_FadeFrom
	lea	(VDP_control_port).l,a6
	move.w	#$8004,(a6)
	move.w	#$8230,(a6)
	move.w	#$8407,(a6)
	move.w	#$9001,(a6)
	move.w	#$9200,(a6)
	move.w	#$8B03,(a6)
	move.w	#$8700,(a6)
	clr.b	(Water_move).w
	move.w	#$8C81,(a6)
	bsr.w	JmpTo_ClearScreen
 

and change it to:

 
JmpTo_Pal_FadeFrom:
	jmp	Pal_FadeFrom
 
sub_9EF4:
	tst.b	($FFFFF660).w
	beq.w	return_A0BE
	bsr.w	JmpTo_Pal_FadeFrom
	lea	(VDP_control_port).l,a6
	move.w	#$8004,(a6)
	move.w	#$8230,(a6)
	move.w	#$8407,(a6)
	move.w	#$9001,(a6)
	move.w	#$9200,(a6)
	move.w	#$8B03,(a6)
	move.w	#$8700,(a6)
	clr.b	(Water_move).w
	move.w	#$8C81,(a6)
	bsr.w	JmpTo_ClearScreen
 

now we want to find:

 
loc_9FE6:
	bsr.w	JmpTo_ClearScreen
	bsr.w	sub_B262
	bsr.w	Pal_FadeTo
	move.w	#$18E,d0
	btst	#6,(Graphics_Flags).w
	beq.s	loc_A002
	move.w	#$144,d0
 

and change it to:

 
loc_9FE6:
	bsr.w	JmpTo_ClearScreen
	bsr.w	sub_B262
	bsr.w	JmpTo_Pal_FadeTo
	move.w	#$18E,d0
	btst	#6,(Graphics_Flags).w
	beq.s	loc_A002
	move.w	#$144,d0
	jmp	loc_A002
 
JmpTo_Pal_FadeTo:
	jmp	Pal_FadeTo
 

now we want to find:

 
loc_A002:
	move.b	#$18,(Delay_Time).w
	bsr.w	DelayProgram
	dbf	d0,loc_A002
	bsr.w	Pal_FadeFrom
	lea	(off_B2CA).l,a1
	addq.w	#1,($FFFFFF4C).w
	move.w	($FFFFFF4C).w,d0
	lsl.w	#2,d0
	move.l	(a1,d0.w),d0
	bpl.s	loc_9FE6
	bsr.w	Pal_FadeFrom
	bsr.w	JmpTo_ClearScreen
 

and we want to to change it to:

 
loc_A002:
	move.b	#$18,(Delay_Time).w
	bsr.w	DelayProgram
	dbf	d0,loc_A002
	bsr.w	JmpTo_Pal_FadeFrom
	lea	(off_B2CA).l,a1
	addq.w	#1,($FFFFFF4C).w
	move.w	($FFFFFF4C).w,d0
	lsl.w	#2,d0
	move.l	(a1,d0.w),d0
	bpl.s	loc_9FE6
	bsr.w	JmpTo_Pal_FadeFrom
	bsr.w	JmpTo_ClearScreen
 

now we find:

 
	bcs.s	Obj17_Main
	moveq	#0,d6
; loc_10372:
Obj17_MakeHelix:
	bsr.w	SingleObjLoad2
 

and change it to:

 
	bcs.s	JumpTo_Obj17_Main
	moveq	#0,d6
	jmp	Obj17_MakeHelix
 
JumpTo_Obj17_Main:
	jmp	Obj17_Main
JumpTo_SingleObjLoad2:
	jmp	SingleObjLoad2
 
; loc_10372:
Obj17_MakeHelix:
	bsr.w	JumpTo_SingleObjLoad2
 

after that, your rom will build correctly for jump issues, but for addressing, that's different.

Fixing Addressing

Find:

 
loc_A5A6:
	bsr.s	sub_A58C
	subq.w	#1,objoff_3C(a0)
	bpl.s	return_A5E6
	move.w	#2,objoff_3C(a0)
	move.w	objoff_32(a0),d0
	cmpi.w	#$1C,d0
	bcc.s	loc_A5E8
	addq.w	#1,objoff_32(a0)
	move.w	($FFFFF750).w,d1
	move.w	off_A5FC(pc,d1.w),d1
	lea	off_A5FC(pc,d1.w),a1
	move.b	(a1,d0.w),mapping_frame(a0)
	add.w	d0,d0
	add.w	d0,d0
	move.l	word_A656(pc,d0.w),d1
	move.w	d1,y_pos(a0)
	swap	d1
	move.w	d1,x_pos(a0)
 

and replace it with:

 
loc_A5A6:
	bsr.s	sub_A58C
	subq.w	#1,objoff_3C(a0)
	bpl.s	return_A5E6
	move.w	#2,objoff_3C(a0)
	move.w	objoff_32(a0),d0
	cmpi.w	#$1C,d0
	bcc.s	loc_A5E8
	addq.w	#1,objoff_32(a0)
	move.w	($FFFFF750).w,d1
	move.w	off_A5FC(pc,d1.w),d1
	lea	off_A5FC(pc,d1.w),a1
	move.b	(a1,d0.w),mapping_frame(a0)
	add.w	d0,d0
	add.w	d0,d0
	jmp	loc2_A5A6
 

Now find:

 
loc_A6C6:
	subq.w	#1,objoff_3C(a0)
	bmi.s	loc_A720
	tst.b	(Super_Sonic_flag).w
	beq.s	return_A70A
	subq.b	#1,objoff_31(a0)
	bpl.s	return_A70A
	addq.b	#3,objoff_31(a0)
	move.w	objoff_32(a0),d0
	addq.w	#4,objoff_32(a0)
	cmpi.w	#$78,d0
	bcc.s	return_A70A
	cmpi.w	#$C,d0
	bcs.s	loc_A70C
	bsr.w	loc_A594
	move.l	word_A766(pc,d0.w),d1
	move.w	d1,y_pos(a0)
	swap	d1
	move.w	d1,x_pos(a0)
	lsr.w	#2,d0
	move.b	byte_A748(pc,d0.w),mapping_frame(a0)
 

and replace it with:

 
loc_A6C6:
	subq.w	#1,objoff_3C(a0)
	bmi.s	loc_A720
	tst.b	(Super_Sonic_flag).w
	beq.s	return_A70A
	subq.b	#1,objoff_31(a0)
	bpl.s	return_A70A
	addq.b	#3,objoff_31(a0)
	move.w	objoff_32(a0),d0
	addq.w	#4,objoff_32(a0)
	cmpi.w	#$78,d0
	bcc.s	return_A70A
	cmpi.w	#$C,d0
	bcs.s	loc_A70C
	bsr.w	loc_A594
	jmp	loc2_A6C6
 

Then find:

 
loc_A70C:
	move.l	word_A766(pc,d0.w),d0
	lea	(MainCharacter).w,a1 ; a1=character
	move.w	d0,y_pos(a1)
	swap	d0
	move.w	d0,x_pos(a1)
	rts
 

and replace it with:

 
loc_A70C:
	jmp	loc2_A70C
 

Now find:

 
loc_285D2:
	moveq	#7,d1
	moveq	#0,d4
	lea	(byte_28726).l,a2
	movea.l	a0,a1
	move.w	x_pos(a0),d2
	move.w	y_pos(a0),d3
	bset	#7,status(a0)
	bra.s	loc_285F4
 

and replace it with:

 
loc_285D2:
	moveq	#7,d1
	moveq	#0,d4
	jmp	loc2_285D2
 

Then find:

 
loc_286A2:
	move.w	d1,objoff_36(a0)
	add.w	objoff_34(a0),d1
	lea	byte_28726(pc,d1.w),a1
	move.b	(a1)+,d0
	ext.w	d0
	add.w	objoff_32(a0),d0
	move.w	d0,x_pos(a0)
	move.b	(a1)+,d0
	ext.w	d0
	add.w	objoff_30(a0),d0
	move.w	d0,y_pos(a0)
	move.b	(a1)+,mapping_frame(a0)
 

and change it to:

 
loc_286A2:
	move.w	d1,objoff_36(a0)
	add.w	objoff_34(a0),d1
	jmp	loc2_286A2
 

Now add this to the end of your ROM:

 
; ===========================================================================
 
loc2_A5A6:
	move.l	word_A656(pc,d0.w),d1
	move.w	d1,y_pos(a0)
	swap	d1
	move.w	d1,x_pos(a0)
; ===========================================================================
 
word_A656:
	dc.w   $A0,  $70,  $B0,	 $70,  $B6,  $71,  $BC,	 $72
	dc.w   $C4,  $74,  $C8,	 $75,  $CA,  $76,  $CC,	 $77; 8
	dc.w   $CE,  $78,  $D0,	 $79,  $D2,  $7A,  $D4,	 $7B; 16
	dc.w   $D6,  $7C,  $D9,	 $7E,  $DC,  $81,  $DE,	 $84; 24
	dc.w   $E1,  $87,  $E4,	 $8B,  $E7,  $8F,  $EC,	 $94; 32
	dc.w   $F0,  $99,  $F5,	 $9D,  $F9,  $A4, $100,	 $AC; 40
	dc.w  $108,  $B8, $112,	 $C4, $11F,  $D3, $12C,	 $FA; 48
; ===========================================================================
 
loc2_A6C6:
	move.l	word_A766(pc,d0.w),d1
	move.w	d1,y_pos(a0)
	swap	d1
	move.w	d1,x_pos(a0)
	lsr.w	#2,d0
	move.b	byte_A748(pc,d0.w),mapping_frame(a0)
; ===========================================================================
 
loc2_A70C:
	move.l	word_A766(pc,d0.w),d0
	lea	(MainCharacter).w,a1 ; a1=character
	move.w	d0,y_pos(a1)
	swap	d0
	move.w	d0,x_pos(a1)
	rts
; ===========================================================================
 
byte_A748:
	dc.b $12,$12,$12,$12,$12,$12,$12,$13,$13,$13,$13,$13,$13,$14,$14,$14
	dc.b $14,$15,$15,$15,$16,$16,$16,$16,$16,$16,$16,$16,$16,  0; 16
; ===========================================================================
 
word_A766:
	dc.w   $C0
	dc.w   $90	; 1
	dc.w   $B0	; 2
	dc.w   $91	; 3
	dc.w   $A8	; 4
	dc.w   $92	; 5
	dc.w   $9B	; 6
	dc.w   $96	; 7
	dc.w   $99	; 8
	dc.w   $98	; 9
	dc.w   $98	; 10
	dc.w   $99	; 11
	dc.w   $99	; 12
	dc.w   $9A	; 13
	dc.w   $9B	; 14
	dc.w   $9C	; 15
	dc.w   $9F	; 16
	dc.w   $9E	; 17
	dc.w   $A4	; 18
	dc.w   $A0	; 19
	dc.w   $AC	; 20
	dc.w   $A2	; 21
	dc.w   $B7	; 22
	dc.w   $A5	; 23
	dc.w   $C4	; 24
	dc.w   $A8	; 25
	dc.w   $D3	; 26
	dc.w   $AB	; 27
	dc.w   $DE	; 28
	dc.w   $AE	; 29
	dc.w   $E8	; 30
	dc.w   $B0	; 31
	dc.w   $EF	; 32
	dc.w   $B2	; 33
	dc.w   $F4	; 34
	dc.w   $B5	; 35
	dc.w   $F9	; 36
	dc.w   $B8	; 37
	dc.w   $FC	; 38
	dc.w   $BB	; 39
	dc.w   $FE	; 40
	dc.w   $BE	; 41
	dc.w   $FF	; 42
	dc.w   $C0	; 43
	dc.w  $100	; 44
	dc.w   $C2	; 45
	dc.w  $101	; 46
	dc.w   $C5	; 47
	dc.w  $102	; 48
	dc.w   $C8	; 49
	dc.w  $102	; 50
	dc.w   $CC	; 51
	dc.w  $101	; 52
	dc.w   $D1	; 53
	dc.w   $FD	; 54
	dc.w   $D7	; 55
	dc.w   $F9	; 56
	dc.w   $DE	; 57
	dc.w   $F9	; 58
	dc.w  $118	; 59
; ===========================================================================
 
loc2_285D2:
	lea	(byte_28726).l,a2
	movea.l	a0,a1
	move.w	x_pos(a0),d2
	move.w	y_pos(a0),d3
	bset	#7,status(a0)
	bra.s	JmpTo_loc_285F4
 
JmpTo_loc_285F4
	jmp	loc_285F4
; ===========================================================================
 
loc2_286A2
	lea	byte_28726(pc,d1.w),a1	; addressing not needed
	move.b	(a1)+,d0
	ext.w	d0
	add.w	objoff_32(a0),d0
	move.w	d0,x_pos(a0)
	move.b	(a1)+,d0
	ext.w	d0
	add.w	objoff_30(a0),d0
	move.w	d0,y_pos(a0)
	move.b	(a1)+,mapping_frame(a0)
; ===========================================================================
 
byte_28726:
	dc.b   0,$B8,  0,$32,$CE,  4,$48,  0,  8,$32,$32, $C,  0,$48,$10,$CE; 16
	dc.b $32,$14,$B8,  0,$18,$CE,$CE,$1C, $D,$B8,  1,$3F,$DA,  5,$48, $C; 32
	dc.b   9,$27,$3C, $D,$F3,$48,$11,$C1,$26,$15,$B8,$F4,$19,$D9,$C4,$1D; 48
	dc.b $19,$BC,  2,$46,$E9,  6,$46,$17, $A,$19,$44, $E,$E7,$44,$12,$BA; 64
	dc.b $17,$16,$BA,$E9,$1A,$E7,$BC,$1E,$27,$C4,  3,$48,$F4,  7,$3F,$26; 80
	dc.b  $B, $D,$48, $F,$D9,$3C,$13,$B8, $C,$17,$C1,$DA,$1B,$F3,$B8,$1F; 96
; ===========================================================================
 

Then delete any index pasted here to prevent a double defined error while building.

Extending the demo list

now we will prepare everything so that we can put in new demo files for our new levels.

find:

; off_4948:
DemoScriptPointers:
	dc.l Demo_EHZ	; $00
	dc.l Demo_EHZ	; $01
	dc.l Demo_EHZ	; $02
	dc.l Demo_EHZ	; $03
	dc.l Demo_EHZ	; $04
	dc.l Demo_EHZ	; $05
	dc.l Demo_EHZ	; $06
	dc.l Demo_EHZ	; $07
	dc.l Demo_EHZ	; $08
	dc.l Demo_EHZ	; $09
	dc.l Demo_EHZ	; $0A
	dc.l Demo_EHZ	; $0B
	dc.l Demo_CNZ	; $0C
	dc.l Demo_CPZ	; $0D
	dc.l Demo_EHZ	; $0E
	dc.l Demo_ARZ	; $0F
	dc.l Demo_EHZ	; $10
 

and insert after it:

 
	dc.l Demo_EHZ	; $11
	dc.l Demo_EHZ	; $12
	dc.l Demo_EHZ	; $13
	dc.l Demo_EHZ	; $14
	dc.l Demo_EHZ	; $15
	dc.l Demo_EHZ	; $16
	dc.l Demo_EHZ	; $17
	dc.l Demo_EHZ	; $18
	dc.l Demo_EHZ	; $19
	dc.l Demo_EHZ	; $1A
	dc.l Demo_EHZ	; $1B
	dc.l Demo_EHZ	; $1C
	dc.l Demo_EHZ	; $1D
	dc.l Demo_EHZ	; $1E
	dc.l Demo_EHZ	; $1F
	dc.l Demo_EHZ	; $20
 

Extending the Collision index

You would want solidity in your new zones, wouldn't you? Here we will extend the solidity list so that our extra levels can have solid ground for that blue hedgehog to walk on.

lets start off by extending the primary collision index. find:

 
Off_ColP:
	dc.l ColP_EHZHTZ
	dc.l Off_Level		; 1
	dc.l ColP_MTZ		; 2
	dc.l Off_Level		; 3
	dc.l ColP_MTZ		; 4
	dc.l ColP_MTZ		; 5
	dc.l ColP_WFZSCZ	; 6
	dc.l ColP_EHZHTZ	; 7
	dc.l ColP_OOZ		; 8
	dc.l Off_Level		; 9
	dc.l ColP_OOZ		; 10
	dc.l ColP_MCZ		; 11
	dc.l ColP_CNZ		; 12
	dc.l ColP_CPZDEZ	; 13
	dc.l ColP_CPZDEZ	; 14
	dc.l ColP_ARZ		; 15
	dc.l ColP_WFZSCZ	; 16
 

and replace it with:

 
Off_ColP:
	dc.l ColP_EHZHTZ		;00
	dc.l ColP_EHZHTZ		;01
	dc.l ColP_MTZ		;02
	dc.l ColP_MTZ		;03
	dc.l ColP_MTZ		;04
	dc.l ColP_MTZ		;05
	dc.l ColP_WFZSCZ		;06
	dc.l ColP_EHZHTZ		;07
	dc.l ColP_OOZ		;08
	dc.l ColP_OOZ		;09
	dc.l ColP_OOZ		;0A
	dc.l ColP_MCZ		;0B
	dc.l ColP_CNZ		;0C
	dc.l ColP_CPZDEZ		;0D
	dc.l ColP_CPZDEZ		;0E
	dc.l ColP_ARZ		;0F
	dc.l ColP_WFZSCZ		;10
	dc.l ColP_Lev11		;11
	dc.l ColP_Lev12		;12
	dc.l ColP_Lev13		;13
	dc.l ColP_Lev14		;14
	dc.l ColP_Lev15		;15
	dc.l ColP_Lev16		;16
	dc.l ColP_Lev17		;17
	dc.l ColP_Lev18		;18
	dc.l ColP_Lev19		;19
	dc.l ColP_Lev1A		;1A
	dc.l ColP_Lev1B		;1B
	dc.l ColP_Lev1C		;1C
	dc.l ColP_Lev1D		;1D
	dc.l ColP_Lev1E		;1E
	dc.l ColP_Lev1F		;1F
	dc.l ColP_Lev20		;20
 

now we will extend the secondary collision index. find:

 
Off_ColS:
	dc.l ColS_EHZHTZ
	dc.l Off_Level	; 1
	dc.l ColP_MTZ	; 2
	dc.l Off_Level	; 3
	dc.l ColP_MTZ	; 4
	dc.l ColP_MTZ	; 5
	dc.l ColS_WFZSCZ	; 6
	dc.l ColS_EHZHTZ	; 7
	dc.l ColP_OOZ	; 8
	dc.l Off_Level	; 9
	dc.l ColP_OOZ	; 10
	dc.l ColP_MCZ	; 11
	dc.l ColS_CNZ	; 12
	dc.l ColS_CPZDEZ	; 13
	dc.l ColS_CPZDEZ	; 14
	dc.l ColS_ARZ	; 15
	dc.l ColS_WFZSCZ	; 16
 

we will replace it with:

 
Off_ColS:
	dc.l ColS_EHZHTZ		;00
	dc.l ColP_EHZHTZ		;01
	dc.l ColP_MTZ		;02
	dc.l Off_Level		;03
	dc.l ColP_MTZ		;04
	dc.l ColP_MTZ		;05
	dc.l ColS_WFZSCZ		;06
	dc.l ColS_EHZHTZ		;07
	dc.l ColP_OOZ		;08
	dc.l Off_Level		;09
	dc.l ColP_OOZ		;0A
	dc.l ColP_MCZ		;0B
	dc.l ColS_CNZ		;0C
	dc.l ColS_CPZDEZ		;0D
	dc.l ColS_CPZDEZ		;0E
	dc.l ColS_ARZ		;0F
	dc.l ColS_WFZSCZ		;10
	dc.l ColS_Lev11		;11
	dc.l ColS_Lev12		;12
	dc.l ColS_Lev13		;13
	dc.l ColS_Lev14		;14
	dc.l ColS_Lev15		;15
	dc.l ColS_Lev16		;16
	dc.l ColS_Lev17		;17
	dc.l ColS_Lev18		;18
	dc.l ColS_Lev19		;19
	dc.l ColS_Lev1A		;1A
	dc.l ColS_Lev1B		;1B
	dc.l ColS_Lev1C		;1C
	dc.l ColS_Lev1D		;1D
	dc.l ColS_Lev1E		;1E
	dc.l ColS_Lev1F		;1F
	dc.l ColS_Lev20		;20
 

Now, in order to fix a bug that makes collision swaps more buggy than a savestate loaded from another game, we need to do some splitting and moving.

Find:

 
LoadCollisionIndexes:
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	lsl.w	#2,d0
	move.l	#Primary_Collision,(Collision_addr).w
	move.w	d0,-(sp)
	movea.l	Off_ColP(pc,d0.w),a0
	lea	(Primary_Collision).w,a1
	bsr.w	KosDec
	move.w	(sp)+,d0
	movea.l	Off_ColS(pc,d0.w),a0
	lea	(Secondary_Collision).w,a1
	bra.w	KosDec
 

and replace it with:

 
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	lsl.w	#2,d0
	move.l	#Primary_Collision,(Collision_addr).w
	move.w	d0,-(sp)
	movea.l	Off_ColP(pc,d0.w),a0
	lea	(Primary_Collision).w,a1
	bsr.w	KosDec
	move.w	(sp)+,d0
	jsr	LoadSecondaryCollisionIndexes
 

Then go to the end of the ROM and add the following:

 
LoadSecondaryCollisionIndexes:
	movea.l	Off_ColS(pc,d0.w),a0
	lea	(Secondary_Collision).w,a1
	bra.w	JmpTo3_KosDec
 
JmpTo3_KosDec:
	jmp	KosDec
 

then Off_ColS index directly below that location.

next we need to define the symbols (duh). find:

 
; WFZ/SCZ secondary 16x16 collision index (Kozinski compression)
ColS_WFZSCZ:	BINCLUDE	"collision/WFZ and SCZ secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
 

and we will insert the new collision entries after that as follows:

 
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev11:	BINCLUDE	"collision/Lev11 primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev11:	BINCLUDE	"collision/Lev11 secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev12:	BINCLUDE	"collision/Lev12 primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev12:	BINCLUDE	"collision/Lev12 secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev13:	BINCLUDE	"collision/Lev13 primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev13:	BINCLUDE	"collision/Lev13 secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev14:	BINCLUDE	"collision/Lev14 primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev14:	BINCLUDE	"collision/Lev14 secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev15:	BINCLUDE	"collision/Lev15 primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev15:	BINCLUDE	"collision/Lev15 secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev16:	BINCLUDE	"collision/Lev16 primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev16:	BINCLUDE	"collision/Lev16 secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev17:	BINCLUDE	"collision/Lev17 primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev17:	BINCLUDE	"collision/Lev17 secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev18:	BINCLUDE	"collision/Lev18 primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev18:	BINCLUDE	"collision/Lev18 secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev19:	BINCLUDE	"collision/Lev19 primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev19:	BINCLUDE	"collision/Lev19 secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev1A:	BINCLUDE	"collision/Lev1A primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev1A:	BINCLUDE	"collision/Lev1A secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev1B:	BINCLUDE	"collision/Lev1B primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev1B:	BINCLUDE	"collision/Lev1B secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev1C:	BINCLUDE	"collision/Lev1C primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev1C:	BINCLUDE	"collision/Lev1C secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev1D:	BINCLUDE	"collision/Lev1D primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev1D:	BINCLUDE	"collision/Lev1D secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev1E:	BINCLUDE	"collision/Lev1E primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev1E:	BINCLUDE	"collision/Lev1E secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev1F:	BINCLUDE	"collision/Lev1F primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev1F:	BINCLUDE	"collision/Lev1F secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
ColP_Lev20:	BINCLUDE	"collision/Lev20 primary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
ColS_Lev20:	BINCLUDE	"collision/Lev20 secondary 16x16 collision index.bin"
;---------------------------------------------------------------------------------------
 

Extending Rings Index

Now we add rings to our new levels.

Find:

 
Off_Rings:
	dc.w	Rings_EHZ_1 - Off_Rings	; 0  $00
	dc.w	Rings_EHZ_2 - Off_Rings	; 1
	dc.w	Rings_Lev1_1 - Off_Rings	; 2  $01
	dc.w	Rings_Lev1_2 - Off_Rings	; 3
	dc.w	Rings_Lev2_1 - Off_Rings	; 4  $02
	dc.w	Rings_Lev2_2 - Off_Rings	; 5
	dc.w	Rings_Lev3_1 - Off_Rings	; 6  $03
	dc.w	Rings_Lev3_2 - Off_Rings	; 7
	dc.w	Rings_MTZ_1 - Off_Rings	; 8  $04
	dc.w	Rings_MTZ_2 - Off_Rings	; 9
	dc.w	Rings_MTZ_3 - Off_Rings	; 10 $05
	dc.w	Rings_MTZ_4 - Off_Rings	; 11
	dc.w	Rings_WFZ_1 - Off_Rings	; 12 $06
	dc.w	Rings_WFZ_2 - Off_Rings	; 13
	dc.w	Rings_HTZ_1 - Off_Rings	; 14 $07
	dc.w	Rings_HTZ_2 - Off_Rings	; 15
	dc.w	Rings_HPZ_1 - Off_Rings	; 16 $08
	dc.w	Rings_HPZ_2 - Off_Rings	; 17
	dc.w	Rings_Lev9_1 - Off_Rings	; 18 $09
	dc.w	Rings_Lev9_2 - Off_Rings	; 19
	dc.w	Rings_OOZ_1 - Off_Rings	; 20 $0A
	dc.w	Rings_OOZ_2 - Off_Rings	; 21
	dc.w	Rings_MCZ_1 - Off_Rings	; 22 $0B
	dc.w	Rings_MCZ_2 - Off_Rings	; 23
	dc.w	Rings_CNZ_1 - Off_Rings	; 24 $0C
	dc.w	Rings_CNZ_2 - Off_Rings	; 25
	dc.w	Rings_CPZ_1 - Off_Rings	; 26 $0D
	dc.w	Rings_CPZ_2 - Off_Rings	; 27
	dc.w	Rings_DEZ_1 - Off_Rings	; 28 $0E
	dc.w	Rings_DEZ_2 - Off_Rings	; 29
	dc.w	Rings_ARZ_1 - Off_Rings	; 30 $0F
	dc.w	Rings_ARZ_2 - Off_Rings	; 31
	dc.w	Rings_SCZ_1 - Off_Rings	; 32 $10
	dc.w	Rings_SCZ_2 - Off_Rings	; 33
 

and add this to the end:

 
	dc.w	Rings_Lev_11_1 - Off_Rings	; 34 $11
	dc.w	Rings_Lev_11_2 - Off_Rings	; 35
	dc.w	Rings_Lev_12_1 - Off_Rings	; 36 $12
	dc.w	Rings_Lev_12_2 - Off_Rings	; 37
	dc.w	Rings_Lev_13_1 - Off_Rings	; 38 $13
	dc.w	Rings_Lev_13_2 - Off_Rings	; 39
	dc.w	Rings_Lev_14_1 - Off_Rings	; 40 $14
	dc.w	Rings_Lev_14_2 - Off_Rings	; 41
	dc.w	Rings_Lev_15_1 - Off_Rings	; 42 $15
	dc.w	Rings_Lev_15_2 - Off_Rings	; 43
	dc.w	Rings_Lev_16_1 - Off_Rings	; 44 $16
	dc.w	Rings_Lev_16_2 - Off_Rings	; 45
	dc.w	Rings_Lev_17_1 - Off_Rings	; 46 $17
	dc.w	Rings_Lev_17_2 - Off_Rings	; 47
	dc.w	Rings_Lev_18_1 - Off_Rings	; 48 $18
	dc.w	Rings_Lev_18_2 - Off_Rings	; 49
	dc.w	Rings_Lev_19_1 - Off_Rings	; 50 $19
	dc.w	Rings_Lev_19_2 - Off_Rings	; 51
	dc.w	Rings_Lev_1A_1 - Off_Rings	; 52 $1A
	dc.w	Rings_Lev_1A_2 - Off_Rings	; 53
	dc.w	Rings_Lev_1B_1 - Off_Rings	; 54 $1B
	dc.w	Rings_Lev_1B_2 - Off_Rings	; 55
	dc.w	Rings_Lev_1C_1 - Off_Rings	; 56 $1C
	dc.w	Rings_Lev_1C_2 - Off_Rings	; 57
	dc.w	Rings_Lev_1D_1 - Off_Rings	; 58 $1D
	dc.w	Rings_Lev_1D_2 - Off_Rings	; 59
	dc.w	Rings_Lev_1E_1 - Off_Rings	; 60 $1E
	dc.w	Rings_Lev_1E_2 - Off_Rings	; 61
	dc.w	Rings_Lev_1F_1 - Off_Rings	; 62 $1F
	dc.w	Rings_Lev_1F_2 - Off_Rings	; 63
	dc.w	Rings_Lev_20_1 - Off_Rings	; 64 $20
	dc.w	Rings_Lev_20_2 - Off_Rings	; 65
 

Now find:

 
Rings_EHZ_1:	BINCLUDE	"level/rings/EHZ_1.bin"
Rings_EHZ_2:	BINCLUDE	"level/rings/EHZ_2.bin"
Rings_Lev1_1:	BINCLUDE	"level/rings/01_1.bin"
Rings_Lev1_2:	BINCLUDE	"level/rings/01_2.bin"
Rings_Lev2_1:	BINCLUDE	"level/rings/02_1.bin"
Rings_Lev2_2:	BINCLUDE	"level/rings/02_2.bin"
Rings_Lev3_1:	BINCLUDE	"level/rings/03_1.bin"
Rings_Lev3_2:	BINCLUDE	"level/rings/03_2.bin"
Rings_MTZ_1:	BINCLUDE	"level/rings/MTZ_1.bin"
Rings_MTZ_2:	BINCLUDE	"level/rings/MTZ_2.bin"
Rings_MTZ_3:	BINCLUDE	"level/rings/MTZ_3.bin"
Rings_MTZ_4:	BINCLUDE	"level/rings/MTZ_4.bin"
Rings_HTZ_1:	BINCLUDE	"level/rings/HTZ_1.bin"
Rings_HTZ_2:	BINCLUDE	"level/rings/HTZ_2.bin"
Rings_HPZ_1:	BINCLUDE	"level/rings/HPZ_1.bin"
Rings_HPZ_2:	BINCLUDE	"level/rings/HPZ_2.bin"
Rings_Lev9_1:	BINCLUDE	"level/rings/09_1.bin"
Rings_Lev9_2:	BINCLUDE	"level/rings/09_2.bin"
Rings_OOZ_1:	BINCLUDE	"level/rings/OOZ_1.bin"
Rings_OOZ_2:	BINCLUDE	"level/rings/OOZ_2.bin"
Rings_MCZ_1:	BINCLUDE	"level/rings/MCZ_1.bin"
Rings_MCZ_2:	BINCLUDE	"level/rings/MCZ_2.bin"
Rings_CNZ_1:	BINCLUDE	"level/rings/CNZ_1.bin"
Rings_CNZ_2:	BINCLUDE	"level/rings/CNZ_2.bin"
Rings_CPZ_1:	BINCLUDE	"level/rings/CPZ_1.bin"
Rings_CPZ_2:	BINCLUDE	"level/rings/CPZ_2.bin"
Rings_DEZ_1:	BINCLUDE	"level/rings/DEZ_1.bin"
Rings_DEZ_2:	BINCLUDE	"level/rings/DEZ_2.bin"
Rings_WFZ_1:	BINCLUDE	"level/rings/WFZ_1.bin"
Rings_WFZ_2:	BINCLUDE	"level/rings/WFZ_2.bin"
Rings_ARZ_1:	BINCLUDE	"level/rings/ARZ_1.bin"
Rings_ARZ_2:	BINCLUDE	"level/rings/ARZ_2.bin"
Rings_SCZ_1:	BINCLUDE	"level/rings/SCZ_1.bin"
Rings_SCZ_2:	BINCLUDE	"level/rings/SCZ_2.bin"
 

and add this to the end:

 
Rings_Lev_11_1:	BINCLUDE	"level/rings/Lev_11_1.bin"
Rings_Lev_11_2:	BINCLUDE	"level/rings/Lev_11_2.bin"
Rings_Lev_12_1:	BINCLUDE	"level/rings/Lev_12_1.bin"
Rings_Lev_12_2:	BINCLUDE	"level/rings/Lev_12_2.bin"
Rings_Lev_13_1:	BINCLUDE	"level/rings/Lev_13_1.bin"
Rings_Lev_13_2:	BINCLUDE	"level/rings/Lev_13_2.bin"
Rings_Lev_14_1:	BINCLUDE	"level/rings/Lev_14_1.bin"
Rings_Lev_14_2:	BINCLUDE	"level/rings/Lev_14_2.bin"
Rings_Lev_15_1:	BINCLUDE	"level/rings/Lev_15_1.bin"
Rings_Lev_15_2:	BINCLUDE	"level/rings/Lev_15_2.bin"
Rings_Lev_16_1:	BINCLUDE	"level/rings/Lev_16_1.bin"
Rings_Lev_16_2:	BINCLUDE	"level/rings/Lev_16_2.bin"
Rings_Lev_17_1:	BINCLUDE	"level/rings/Lev_17_1.bin"
Rings_Lev_17_2:	BINCLUDE	"level/rings/Lev_17_2.bin"
Rings_Lev_18_1:	BINCLUDE	"level/rings/Lev_18_1.bin"
Rings_Lev_18_2:	BINCLUDE	"level/rings/Lev_18_2.bin"
Rings_Lev_19_1:	BINCLUDE	"level/rings/Lev_19_1.bin"
Rings_Lev_19_2:	BINCLUDE	"level/rings/Lev_19_2.bin"
Rings_Lev_1A_1:	BINCLUDE	"level/rings/Lev_1A_1.bin"
Rings_Lev_1A_2:	BINCLUDE	"level/rings/Lev_1A_2.bin"
Rings_Lev_1B_1:	BINCLUDE	"level/rings/Lev_1B_1.bin"
Rings_Lev_1B_2:	BINCLUDE	"level/rings/Lev_1B_2.bin"
Rings_Lev_1C_1:	BINCLUDE	"level/rings/Lev_1C_1.bin"
Rings_Lev_1C_2:	BINCLUDE	"level/rings/Lev_1C_2.bin"
Rings_Lev_1D_1:	BINCLUDE	"level/rings/Lev_1D_1.bin"
Rings_Lev_1D_2:	BINCLUDE	"level/rings/Lev_1D_2.bin"
Rings_Lev_1E_1:	BINCLUDE	"level/rings/Lev_1E_1.bin"
Rings_Lev_1E_2:	BINCLUDE	"level/rings/Lev_1E_2.bin"
Rings_Lev_1F_1:	BINCLUDE	"level/rings/Lev_1F_1.bin"
Rings_Lev_1F_2:	BINCLUDE	"level/rings/Lev_1F_2.bin"
Rings_Lev_20_1:	BINCLUDE	"level/rings/Lev_20_1.bin"
Rings_Lev_20_2:	BINCLUDE	"level/rings/Lev_20_2.bin"
 

Create the necessary blank files then edit them as needed.

Extending the object index

This is similar to extending the ring index.

Find:

 
Off_Objects:
	dc.w	Objects_EHZ_1 - Off_Objects	; 0  $00
	dc.w	Objects_EHZ_2 - Off_Objects	; 1
	dc.w	Objects_Null3 - Off_Objects	; 2  $01
	dc.w	Objects_Null3 - Off_Objects	; 3
	dc.w	Objects_Null3 - Off_Objects	; 4  $02
	dc.w	Objects_Null3 - Off_Objects	; 5
	dc.w	Objects_Null3 - Off_Objects	; 6  $03
	dc.w	Objects_Null3 - Off_Objects	; 7
	dc.w	Objects_MTZ_1 - Off_Objects	; 8  $04
	dc.w	Objects_MTZ_2 - Off_Objects	; 9
	dc.w	Objects_MTZ_3 - Off_Objects	; 10 $05
	dc.w	Objects_MTZ_3 - Off_Objects	; 11
	dc.w	Objects_WFZ_1 - Off_Objects	; 12 $06
	dc.w	Objects_WFZ_2 - Off_Objects	; 13
	dc.w	Objects_HTZ_1 - Off_Objects	; 14 $07
	dc.w	Objects_HTZ_2 - Off_Objects	; 15
	dc.w	Objects_HPZ_1 - Off_Objects	; 16 $08
	dc.w	Objects_HPZ_2 - Off_Objects	; 17
	dc.w	Objects_Null3 - Off_Objects	; 18 $09
	dc.w	Objects_Null3 - Off_Objects	; 19
	dc.w	Objects_OOZ_1 - Off_Objects	; 20 $0A
	dc.w	Objects_OOZ_2 - Off_Objects	; 21
	dc.w	Objects_MCZ_1 - Off_Objects	; 22 $0B
	dc.w	Objects_MCZ_2 - Off_Objects	; 23
	dc.w	Objects_CNZ_1 - Off_Objects	; 24 $0C
	dc.w	Objects_CNZ_2 - Off_Objects	; 25
	dc.w	Objects_CPZ_1 - Off_Objects	; 26 $0D
	dc.w	Objects_CPZ_2 - Off_Objects	; 27
	dc.w	Objects_DEZ_1 - Off_Objects	; 28 $0E
	dc.w	Objects_DEZ_2 - Off_Objects	; 29
	dc.w	Objects_ARZ_1 - Off_Objects	; 30 $0F
	dc.w	Objects_ARZ_2 - Off_Objects	; 31
	dc.w	Objects_SCZ_1 - Off_Objects	; 32 $10
	dc.w	Objects_SCZ_2 - Off_Objects	; 33
 

then add this to the end:

 
	dc.w	Objects_Lev_11_1 - Off_Objects	; 34 $11
	dc.w	Objects_Lev_11_2 - Off_Objects	; 35
	dc.w	Objects_Lev_12_1 - Off_Objects	; 36 $12
	dc.w	Objects_Lev_12_2 - Off_Objects	; 17
	dc.w	Objects_Lev_13_1 - Off_Objects	; 38 $13
	dc.w	Objects_Lev_13_2 - Off_Objects	; 39
	dc.w	Objects_Lev_14_1 - Off_Objects	; 40 $14
	dc.w	Objects_Lev_14_2 - Off_Objects	; 41
	dc.w	Objects_Lev_15_1 - Off_Objects	; 42 $15
	dc.w	Objects_Lev_15_2 - Off_Objects	; 43
	dc.w	Objects_Lev_16_1 - Off_Objects	; 44 $16
	dc.w	Objects_Lev_16_2 - Off_Objects	; 45
	dc.w	Objects_Lev_17_1 - Off_Objects	; 46 $17
	dc.w	Objects_Lev_17_2 - Off_Objects	; 47
	dc.w	Objects_Lev_18_1 - Off_Objects	; 48 $18
	dc.w	Objects_Lev_18_2 - Off_Objects	; 49
	dc.w	Objects_Lev_19_1 - Off_Objects	; 50 $19
	dc.w	Objects_Lev_19_2 - Off_Objects	; 51
	dc.w	Objects_Lev_1A_1 - Off_Objects	; 52 $1A
	dc.w	Objects_Lev_1A_2 - Off_Objects	; 53
	dc.w	Objects_Lev_1B_1 - Off_Objects	; 54 $1B
	dc.w	Objects_Lev_1B_2 - Off_Objects	; 55
	dc.w	Objects_Lev_1C_1 - Off_Objects	; 56 $1C
	dc.w	Objects_Lev_1C_2 - Off_Objects	; 57
	dc.w	Objects_Lev_1D_1 - Off_Objects	; 58 $1D
	dc.w	Objects_Lev_1D_2 - Off_Objects	; 59
	dc.w	Objects_Lev_1E_1 - Off_Objects	; 60 $1E
	dc.w	Objects_Lev_1E_2 - Off_Objects	; 61
	dc.w	Objects_Lev_1F_1 - Off_Objects	; 62 $1F
	dc.w	Objects_Lev_1F_2 - Off_Objects	; 63
	dc.w	Objects_Lev_20_1 - Off_Objects	; 64 $20
	dc.w	Objects_Lev_20_2 - Off_Objects	; 65
 

Then find:

 
;Objects_Null1: ; unused
		BINCLUDE	"level/objects/Null_1.bin"
 
Objects_EHZ_1:	BINCLUDE	"level/objects/EHZ_1.bin"
Objects_EHZ_2:	BINCLUDE	"level/objects/EHZ_2.bin"
Objects_MTZ_1:	BINCLUDE	"level/objects/MTZ_1.bin"
Objects_MTZ_2:	BINCLUDE	"level/objects/MTZ_2.bin"
Objects_MTZ_3:	BINCLUDE	"level/objects/MTZ_3.bin"
Objects_WFZ_1:	BINCLUDE	"level/objects/WFZ_1.bin"
Objects_WFZ_2:	BINCLUDE	"level/objects/WFZ_2.bin"
Objects_HTZ_1:	BINCLUDE	"level/objects/HTZ_1.bin"
Objects_HTZ_2:	BINCLUDE	"level/objects/HTZ_2.bin"
Objects_HPZ_1:	BINCLUDE	"level/objects/HPZ_1.bin"
Objects_HPZ_2:	BINCLUDE	"level/objects/HPZ_2.bin"
 
;Objects_Null2: ; unused
		BINCLUDE	"level/objects/Null_2.bin"
 
Objects_OOZ_1:	BINCLUDE	"level/objects/OOZ_1.bin"
Objects_OOZ_2:	BINCLUDE	"level/objects/OOZ_2.bin"
Objects_MCZ_1:	BINCLUDE	"level/objects/MCZ_1.bin"
Objects_MCZ_2:	BINCLUDE	"level/objects/MCZ_2.bin"
Objects_CNZ_1:	BINCLUDE	"level/objects/CNZ_1.bin"
Objects_CNZ_2:	BINCLUDE	"level/objects/CNZ_2.bin"
Objects_CPZ_1:	BINCLUDE	"level/objects/CPZ_1.bin"
Objects_CPZ_2:	BINCLUDE	"level/objects/CPZ_2.bin"
Objects_DEZ_1:	BINCLUDE	"level/objects/DEZ_1.bin"
Objects_DEZ_2:	BINCLUDE	"level/objects/DEZ_2.bin"
Objects_ARZ_1:	BINCLUDE	"level/objects/ARZ_1.bin"
Objects_ARZ_2:	BINCLUDE	"level/objects/ARZ_2.bin"
Objects_SCZ_1:	BINCLUDE	"level/objects/SCZ_1.bin"
Objects_SCZ_2:	BINCLUDE	"level/objects/SCZ_2.bin"
Objects_Null3:	BINCLUDE	"level/objects/Null_3.bin"
 
;Objects_Null4: ; unused
		BINCLUDE	"level/objects/Null_4.bin"
;Objects_Null5: ; unused
		BINCLUDE	"level/objects/Null_5.bin"
;Objects_Null6: ; unused
		BINCLUDE	"level/objects/Null_6.bin"
 

then add this to the end:

 
Objects_Lev_11_1:	BINCLUDE	"level/objects/Lev_11_1.bin"
Objects_Lev_11_2:	BINCLUDE	"level/objects/Lev_11_2.bin"
Objects_Lev_12_1:	BINCLUDE	"level/objects/Lev_12_1.bin"
Objects_Lev_12_2:	BINCLUDE	"level/objects/Lev_12_2.bin"
Objects_Lev_13_1:	BINCLUDE	"level/objects/Lev_13_1.bin"
Objects_Lev_13_2:	BINCLUDE	"level/objects/Lev_13_2.bin"
Objects_Lev_14_1:	BINCLUDE	"level/objects/Lev_14_1.bin"
Objects_Lev_14_2:	BINCLUDE	"level/objects/Lev_14_2.bin"
Objects_Lev_15_1:	BINCLUDE	"level/objects/Lev_15_1.bin"
Objects_Lev_15_2:	BINCLUDE	"level/objects/Lev_15_2.bin"
Objects_Lev_16_1:	BINCLUDE	"level/objects/Lev_16_1.bin"
Objects_Lev_16_2:	BINCLUDE	"level/objects/Lev_16_2.bin"
Objects_Lev_17_1:	BINCLUDE	"level/objects/Lev_17_1.bin"
Objects_Lev_17_2:	BINCLUDE	"level/objects/Lev_17_2.bin"
Objects_Lev_18_1:	BINCLUDE	"level/objects/Lev_18_1.bin"
Objects_Lev_18_2:	BINCLUDE	"level/objects/Lev_18_2.bin"
Objects_Lev_19_1:	BINCLUDE	"level/objects/Lev_19_1.bin"
Objects_Lev_19_2:	BINCLUDE	"level/objects/Lev_19_2.bin"
Objects_Lev_1A_1:	BINCLUDE	"level/objects/Lev_1A_1.bin"
Objects_Lev_1A_2:	BINCLUDE	"level/objects/Lev_1A_2.bin"
Objects_Lev_1B_1:	BINCLUDE	"level/objects/Lev_1B_1.bin"
Objects_Lev_1B_2:	BINCLUDE	"level/objects/Lev_1B_2.bin"
Objects_Lev_1C_1:	BINCLUDE	"level/objects/Lev_1C_1.bin"
Objects_Lev_1C_2:	BINCLUDE	"level/objects/Lev_1C_2.bin"
Objects_Lev_1D_1:	BINCLUDE	"level/objects/Lev_1D_1.bin"
Objects_Lev_1D_2:	BINCLUDE	"level/objects/Lev_1D_2.bin"
Objects_Lev_1E_1:	BINCLUDE	"level/objects/Lev_1E_1.bin"
Objects_Lev_1E_2:	BINCLUDE	"level/objects/Lev_1E_2.bin"
Objects_Lev_1F_1:	BINCLUDE	"level/objects/Lev_1F_1.bin"
Objects_Lev_1F_2:	BINCLUDE	"level/objects/Lev_1F_2.bin"
Objects_Lev_20_1:	BINCLUDE	"level/objects/Lev_20_1.bin"
Objects_Lev_20_2:	BINCLUDE	"level/objects/Lev_20_2.bin"
 

Extending tiles and patterns index

Find:

 
;----------------------------------------------------------------------------------
; EHZ 16x16 block mappings (Kosinski compression) ; was: (Kozinski compression)
BM16_EHZ:	BINCLUDE	"mappings/16x16/EHZ.bin"
;-----------------------------------------------------------------------------------
; EHZ/HTZ main level patterns (Kosinski compression)
; ArtKoz_95C24:
ArtKos_EHZ:	BINCLUDE	"art/kosinski/EHZ_HTZ.bin"
;-----------------------------------------------------------------------------------
; HTZ 16x16 block mappings (Kosinski compression)
BM16_HTZ:	BINCLUDE	"mappings/16x16/HTZ.bin"
;-----------------------------------------------------------------------------------
; HTZ pattern suppliment to EHZ level patterns (Kosinski compression)
; ArtKoz_98AB4:
ArtKos_HTZ:	BINCLUDE	"art/kosinski/HTZ_Supp.bin"
;-----------------------------------------------------------------------------------
; EHZ/HTZ 128x128 block mappings (Kosinski compression)
BM128_EHZ:	BINCLUDE	"mappings/128x128/EHZ_HTZ.bin"
;-----------------------------------------------------------------------------------
; MTZ 16x16 block mappings (Kosinski compression)
BM16_MTZ:	BINCLUDE	"mappings/16x16/MTZ.bin"
;-----------------------------------------------------------------------------------
; MTZ main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_MTZ:	BINCLUDE	"art/kosinski/MTZ.bin"
;-----------------------------------------------------------------------------------
; MTZ 128x128 block mappings (Kosinski compression)
BM128_MTZ:	BINCLUDE	"mappings/128x128/MTZ.bin"
;-----------------------------------------------------------------------------------
; OOZ 16x16 block mappings (Kosinski compression)
BM16_OOZ:	BINCLUDE	"mappings/16x16/OOZ.bin"
;-----------------------------------------------------------------------------------
; OOZ main level patterns (Kosinski compression)
; ArtKoz_A4204:
ArtKos_OOZ:	BINCLUDE	"art/kosinski/OOZ.bin"
;-----------------------------------------------------------------------------------
; OOZ 128x128 block mappings (Kosinski compression)
BM128_OOZ:	BINCLUDE	"mappings/128x128/OOZ.bin"
;-----------------------------------------------------------------------------------
; MCZ 16x16 block mappings (Kosinski compression)
BM16_MCZ:	BINCLUDE	"mappings/16x16/MCZ.bin"
;-----------------------------------------------------------------------------------
; MCZ main level patterns (Kosinski compression)
; ArtKoz_A9D74:
ArtKos_MCZ:	BINCLUDE	"art/kosinski/MCZ.bin"
;-----------------------------------------------------------------------------------
; MCZ 128x128 block mappings (Kosinski compression)
BM128_MCZ:	BINCLUDE	"mappings/128x128/MCZ.bin"
;-----------------------------------------------------------------------------------
; CNZ 16x16 block mappings (Kosinski compression)
BM16_CNZ:	BINCLUDE	"mappings/16x16/CNZ.bin"
;-----------------------------------------------------------------------------------
; CNZ main level patterns (Kosinski compression)
; ArtKoz_B0894:
ArtKos_CNZ:	BINCLUDE	"art/kosinski/CNZ.bin"
;-----------------------------------------------------------------------------------
; CNZ 128x128 block mappings (Kosinski compression)
BM128_CNZ:	BINCLUDE	"mappings/128x128/CNZ.bin"
;-----------------------------------------------------------------------------------
; CPZ/DEZ 16x16 block mappings (Kosinski compression)
BM16_CPZ:	BINCLUDE	"mappings/16x16/CPZ_DEZ.bin"
;-----------------------------------------------------------------------------------
; CPZ/DEZ main level patterns (Kosinski compression)
; ArtKoz_B6174:
ArtKos_CPZ:	BINCLUDE	"art/kosinski/CPZ_DEZ.bin"
;-----------------------------------------------------------------------------------
; CPZ/DEZ 128x128 block mappings (Kosinski compression)
BM128_CPZ:	BINCLUDE	"mappings/128x128/CPZ_DEZ.bin"
;-----------------------------------------------------------------------------------
; ARZ 16x16 block mappings (Kosinski compression)
BM16_ARZ:	BINCLUDE	"mappings/16x16/ARZ.bin"
;-----------------------------------------------------------------------------------
; ARZ main level patterns (Kosinski compression)
; ArtKoz_BCC24:
ArtKos_ARZ:	BINCLUDE	"art/kosinski/ARZ.bin"
;-----------------------------------------------------------------------------------
; ARZ 128x128 block mappings (Kosinski compression)
BM128_ARZ:	BINCLUDE	"mappings/128x128/ARZ.bin"
;-----------------------------------------------------------------------------------
; WFZ/SCZ 16x16 block mappings (Kosinski compression)
BM16_WFZ:	BINCLUDE	"mappings/16x16/WFZ_SCZ.bin"
;-----------------------------------------------------------------------------------
; WFZ/SCZ main level patterns (Kosinski compression)
; ArtKoz_C5004:
ArtKos_SCZ:	BINCLUDE	"art/kosinski/WFZ_SCZ.bin"
;-----------------------------------------------------------------------------------
; WFZ pattern suppliment to SCZ tiles (Kosinski compression)
; ArtKoz_C7EC4:
ArtKos_WFZ:	BINCLUDE	"art/kosinski/WFZ_Supp.bin"
;-----------------------------------------------------------------------------------
; WFZ/SCZ 128x128 block mappings (Kosinski compression)
BM128_WFZ:	BINCLUDE	"mappings/128x128/WFZ_SCZ.bin"
 

then add this to the end:

 
;-----------------------------------------------------------------------------------
; Lev_11 16x16 block mappings (Kosinski compression)
BM16_Lev_11:	BINCLUDE	"mappings/16x16/Lev_11.bin"
;-----------------------------------------------------------------------------------
; Lev_11 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_11:	BINCLUDE	"art/kosinski/Lev_11.bin"
;-----------------------------------------------------------------------------------
; Lev_11 128x128 block mappings (Kosinski compression)
BM128_Lev_11:	BINCLUDE	"mappings/128x128/Lev_11.bin"
;-----------------------------------------------------------------------------------
; Lev_12 16x16 block mappings (Kosinski compression)
BM16_Lev_12:	BINCLUDE	"mappings/16x16/Lev_12.bin"
;-----------------------------------------------------------------------------------
; Lev_12 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_12:	BINCLUDE	"art/kosinski/Lev_12.bin"
;-----------------------------------------------------------------------------------
; Lev_12 128x128 block mappings (Kosinski compression)
BM128_Lev_12:	BINCLUDE	"mappings/128x128/Lev_12.bin"
;-----------------------------------------------------------------------------------
; Lev_13 16x16 block mappings (Kosinski compression)
BM16_Lev_13:	BINCLUDE	"mappings/16x16/Lev_13.bin"
;-----------------------------------------------------------------------------------
; Lev_13 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_13:	BINCLUDE	"art/kosinski/Lev_13.bin"
;-----------------------------------------------------------------------------------
; Lev_13 128x128 block mappings (Kosinski compression)
BM128_Lev_13:	BINCLUDE	"mappings/128x128/Lev_13.bin"
;-----------------------------------------------------------------------------------
; Lev_14 16x16 block mappings (Kosinski compression)
BM16_Lev_14:	BINCLUDE	"mappings/16x16/Lev_14.bin"
;-----------------------------------------------------------------------------------
; Lev_14 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_14:	BINCLUDE	"art/kosinski/Lev_14.bin"
;-----------------------------------------------------------------------------------
; Lev_14 128x128 block mappings (Kosinski compression)
BM128_Lev_14:	BINCLUDE	"mappings/128x128/Lev_14.bin"
;-----------------------------------------------------------------------------------
; Lev_15 16x16 block mappings (Kosinski compression)
BM16_Lev_15:	BINCLUDE	"mappings/16x16/Lev_15.bin"
;-----------------------------------------------------------------------------------
; Lev_15 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_15:	BINCLUDE	"art/kosinski/Lev_15.bin"
;-----------------------------------------------------------------------------------
; Lev_15 128x128 block mappings (Kosinski compression)
BM128_Lev_15:	BINCLUDE	"mappings/128x128/Lev_15.bin"
;-----------------------------------------------------------------------------------
; Lev_16 16x16 block mappings (Kosinski compression)
BM16_Lev_16:	BINCLUDE	"mappings/16x16/Lev_16.bin"
;-----------------------------------------------------------------------------------
; Lev_16 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_16:	BINCLUDE	"art/kosinski/Lev_16.bin"
;-----------------------------------------------------------------------------------
; Lev_16 128x128 block mappings (Kosinski compression)
BM128_Lev_16:	BINCLUDE	"mappings/128x128/Lev_16.bin"
;-----------------------------------------------------------------------------------
; Lev_17 16x16 block mappings (Kosinski compression)
BM16_Lev_17:	BINCLUDE	"mappings/16x16/Lev_17.bin"
;-----------------------------------------------------------------------------------
; Lev_17 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_17:	BINCLUDE	"art/kosinski/Lev_17.bin"
;-----------------------------------------------------------------------------------
; Lev_17 128x128 block mappings (Kosinski compression)
BM128_Lev_17:	BINCLUDE	"mappings/128x128/Lev_17.bin"
;-----------------------------------------------------------------------------------
; Lev_18 16x16 block mappings (Kosinski compression)
BM16_Lev_18:	BINCLUDE	"mappings/16x16/Lev_18.bin"
;-----------------------------------------------------------------------------------
; Lev_18 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_18:	BINCLUDE	"art/kosinski/Lev_18.bin"
;-----------------------------------------------------------------------------------
; Lev_18 128x128 block mappings (Kosinski compression)
BM128_Lev_18:	BINCLUDE	"mappings/128x128/Lev_18.bin"
;-----------------------------------------------------------------------------------
; Lev_19 16x16 block mappings (Kosinski compression)
BM16_Lev_19:	BINCLUDE	"mappings/16x16/Lev_19.bin"
;-----------------------------------------------------------------------------------
; Lev_19 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_19:	BINCLUDE	"art/kosinski/Lev_19.bin"
;-----------------------------------------------------------------------------------
; Lev_19 128x128 block mappings (Kosinski compression)
BM128_Lev_19:	BINCLUDE	"mappings/128x128/Lev_19.bin"
;-----------------------------------------------------------------------------------
; Lev_1A 16x16 block mappings (Kosinski compression)
BM16_Lev_1A:	BINCLUDE	"mappings/16x16/Lev_1A.bin"
;-----------------------------------------------------------------------------------
; Lev_1A main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1A:	BINCLUDE	"art/kosinski/Lev_1A.bin"
;-----------------------------------------------------------------------------------
; Lev_1A 128x128 block mappings (Kosinski compression)
BM128_Lev_1A:	BINCLUDE	"mappings/128x128/Lev_1A.bin"
;-----------------------------------------------------------------------------------
; Lev_1B 16x16 block mappings (Kosinski compression)
BM16_Lev_1B:	BINCLUDE	"mappings/16x16/Lev_1B.bin"
;-----------------------------------------------------------------------------------
; Lev_1B main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1B:	BINCLUDE	"art/kosinski/Lev_1B.bin"
;-----------------------------------------------------------------------------------
; Lev_1B 128x128 block mappings (Kosinski compression)
BM128_Lev_1B:	BINCLUDE	"mappings/128x128/Lev_1B.bin"
;-----------------------------------------------------------------------------------
; Lev_1C 16x16 block mappings (Kosinski compression)
BM16_Lev_1C:	BINCLUDE	"mappings/16x16/Lev_1C.bin"
;-----------------------------------------------------------------------------------
; Lev_1C main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1C:	BINCLUDE	"art/kosinski/Lev_1C.bin"
;-----------------------------------------------------------------------------------
; Lev_1C 128x128 block mappings (Kosinski compression)
BM128_Lev_1C:	BINCLUDE	"mappings/128x128/Lev_1C.bin"
;-----------------------------------------------------------------------------------
; Lev_1D 16x16 block mappings (Kosinski compression)
BM16_Lev_1D:	BINCLUDE	"mappings/16x16/Lev_1D.bin"
;-----------------------------------------------------------------------------------
; Lev_1D main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1D:	BINCLUDE	"art/kosinski/Lev_1D.bin"
;-----------------------------------------------------------------------------------
; Lev_1D 128x128 block mappings (Kosinski compression)
BM128_Lev_1D:	BINCLUDE	"mappings/128x128/Lev_1D.bin"
;-----------------------------------------------------------------------------------
; Lev_1E 16x16 block mappings (Kosinski compression)
BM16_Lev_1E:	BINCLUDE	"mappings/16x16/Lev_1E.bin"
;-----------------------------------------------------------------------------------
; Lev_1E main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1E:	BINCLUDE	"art/kosinski/Lev_1E.bin"
;-----------------------------------------------------------------------------------
; Lev_1E 128x128 block mappings (Kosinski compression)
BM128_Lev_1E:	BINCLUDE	"mappings/128x128/Lev_1E.bin"
;-----------------------------------------------------------------------------------
; Lev_1F 16x16 block mappings (Kosinski compression)
BM16_Lev_1F:	BINCLUDE	"mappings/16x16/Lev_1F.bin"
;-----------------------------------------------------------------------------------
; Lev_1F main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1F:	BINCLUDE	"art/kosinski/Lev_1F.bin"
;-----------------------------------------------------------------------------------
; Lev_1F 128x128 block mappings (Kosinski compression)
BM128_Lev_1F:	BINCLUDE	"mappings/128x128/Lev_1F.bin"
;-----------------------------------------------------------------------------------
; Lev_20 16x16 block mappings (Kosinski compression)
BM16_Lev_20:	BINCLUDE	"mappings/16x16/Lev_20.bin"
;-----------------------------------------------------------------------------------
; Lev_20 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_20:	BINCLUDE	"art/kosinski/Lev_20.bin"
;-----------------------------------------------------------------------------------
; Lev_20 128x128 block mappings (Kosinski compression)
BM128_Lev_20:	BINCLUDE	"mappings/128x128/Lev_20.bin"
 

Then add optional pattern supplements to suit your hack's needs.

Now find:

 
LevelArtPointers:
	levartptrs   4,  5,  4, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   0 ; EHZ  ; EMERALD HILL ZONE
	levartptrs   6,  7,  5, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   1 ; LEV1 ; LEVEL 1 (UNUSED)
	levartptrs   8,  9,  6, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   2 ; LEV2 ; LEVEL 2 (UNUSED)
	levartptrs  $A, $B,  7, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   3 ; LEV3 ; LEVEL 3 (UNUSED)
	levartptrs  $C, $D,  8, ArtKos_MTZ, BM16_MTZ, BM128_MTZ ;   4 ; MTZ  ; METROPOLIS ZONE ACTS 1 & 2
	levartptrs  $C, $D,  8, ArtKos_MTZ, BM16_MTZ, BM128_MTZ ;   5 ; MTZ3 ; METROPOLIS ZONE ACT 3
	levartptrs $10,$11, $A, ArtKos_SCZ, BM16_WFZ, BM128_WFZ ;   6 ; WFZ  ; WING FORTRESS ZONE
	levartptrs $12,$13, $B, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   7 ; HTZ  ; HILL TOP ZONE
	levartptrs $14,$15, $C,   BM16_OOZ,   BM16_OOZ,  BM16_OOZ ;   8 ; HPZ  ; HIDDEN PALACE ZONE (UNUSED)
	levartptrs $16,$17, $D, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   9 ; LEV9 ; LEVEL 9 (UNUSED)
	levartptrs $18,$19, $E, ArtKos_OOZ, BM16_OOZ, BM128_OOZ ;  $A ; OOZ  ; OIL OCEAN ZONE
	levartptrs $1A,$1B, $F, ArtKos_MCZ, BM16_MCZ, BM128_MCZ ;  $B ; MCZ  ; MYSTIC CAVE ZONE
	levartptrs $1C,$1D,$10, ArtKos_CNZ, BM16_CNZ, BM128_CNZ ;  $C ; CNZ  ; CASINO NIGHT ZONE
	levartptrs $1E,$1F,$11, ArtKos_CPZ, BM16_CPZ, BM128_CPZ ;  $D ; CPZ  ; CHEMICAL PLANT ZONE
	levartptrs $20,$21,$12, ArtKos_CPZ, BM16_CPZ, BM128_CPZ ;  $E ; DEZ  ; DEATH EGG ZONE
	levartptrs $22,$23,$13, ArtKos_ARZ, BM16_ARZ, BM128_ARZ ;  $F ; ARZ  ; AQUATIC RUIN ZONE
	levartptrs $24,$25,$14, ArtKos_SCZ, BM16_WFZ, BM128_WFZ ; $10 ; SCZ  ; SKY CHASE ZONE
 

then add this to the end:

 
	levartptrs   $26,  $27,  $15, ArtKos_Lev_11, BM16_Lev_11, BM128_Lev_11 ;   0 ; Lev_11  ; LEV_11 ZONE
	levartptrs   $28,  $29,  $16, ArtKos_Lev_12, BM16_Lev_12, BM128_Lev_12 ;   0 ; Lev_12  ; LEV_12 ZONE
	levartptrs   $2A,  $2B,  $17, ArtKos_Lev_13, BM16_Lev_13, BM128_Lev_13 ;   0 ; Lev_13  ; LEV_13 ZONE
	levartptrs   $2C,  $2D,  $18, ArtKos_Lev_14, BM16_Lev_14, BM128_Lev_14 ;   0 ; Lev_14  ; LEV_14 ZONE
	levartptrs   $2E,  $2F,  $19, ArtKos_Lev_15, BM16_Lev_15, BM128_Lev_15 ;   0 ; Lev_15  ; LEV_15 ZONE
	levartptrs   $30,  $31,  $1A, ArtKos_Lev_16, BM16_Lev_16, BM128_Lev_16 ;   0 ; Lev_16  ; LEV_16 ZONE
	levartptrs   $32,  $33,  $1B, ArtKos_Lev_17, BM16_Lev_17, BM128_Lev_17 ;   0 ; Lev_17  ; LEV_17 ZONE
	levartptrs   $34,  $35,  $1C, ArtKos_Lev_18, BM16_Lev_18, BM128_Lev_18 ;   0 ; Lev_18  ; LEV_18 ZONE
	levartptrs   $36,  $37,  $1D, ArtKos_Lev_19, BM16_Lev_19, BM128_Lev_19 ;   0 ; Lev_19  ; LEV_19 ZONE
	levartptrs   $38,  $39,  $1E, ArtKos_Lev_1A, BM16_Lev_1A, BM128_Lev_1A ;   0 ; Lev_1A  ; LEV_1A ZONE
	levartptrs   $3A,  $3B,  $1F, ArtKos_Lev_1B, BM16_Lev_1B, BM128_Lev_1B ;   0 ; Lev_1B  ; LEV_1B ZONE
	levartptrs   $3C,  $3D,  $20, ArtKos_Lev_1C, BM16_Lev_1C, BM128_Lev_1C ;   0 ; Lev_1C  ; LEV_1C ZONE
	levartptrs   $3E,  $3F,  $21, ArtKos_Lev_1D, BM16_Lev_1D, BM128_Lev_1D ;   0 ; Lev_1D  ; LEV_1D ZONE
	levartptrs   $40,  $41,  $22, ArtKos_Lev_1E, BM16_Lev_1E, BM128_Lev_1E ;   0 ; Lev_1E  ; LEV_1E ZONE
	levartptrs   $42,  $43,  $23, ArtKos_Lev_1F, BM16_Lev_1F, BM128_Lev_1F ;   0 ; Lev_1F  ; LEV_1F ZONE
	levartptrs   $44,  $45,  $24, ArtKos_Lev_20, BM16_Lev_20, BM128_Lev_20 ;   0 ; Lev_20  ; LEV_20 ZONE
 

After this is added, you possibly need to add loading queries to the texture load index. Create the .bin files and you're finished.

Extending level and tile layout indexes

Now you need to extend the layout index and we're done extending most level essentials.

Find:

 
Off_Level:
	dc.w Level_EHZ1-Off_Level
	dc.w Level_EHZ2-Off_Level; 1
	dc.w Level_EHZ1-Off_Level; 2
	dc.w Level_EHZ1-Off_Level; 3
	dc.w Level_EHZ1-Off_Level; 4
	dc.w Level_EHZ1-Off_Level; 5
	dc.w Level_EHZ1-Off_Level; 6
	dc.w Level_EHZ1-Off_Level; 7
	dc.w Level_MTZ1-Off_Level; 8
	dc.w Level_MTZ2-Off_Level; 9
	dc.w Level_MTZ3-Off_Level; 10
	dc.w Level_MTZ3-Off_Level; 11
	dc.w Level_WFZ-Off_Level; 12
	dc.w Level_WFZ-Off_Level; 13
	dc.w Level_HTZ1-Off_Level; 14
	dc.w Level_HTZ2-Off_Level; 15
	dc.w Level_OOZ1-Off_Level; 16
	dc.w Level_OOZ1-Off_Level; 17
	dc.w Level_EHZ1-Off_Level; 18
	dc.w Level_EHZ1-Off_Level; 19
	dc.w Level_OOZ1-Off_Level; 20
	dc.w Level_OOZ2-Off_Level; 21
	dc.w Level_MCZ1-Off_Level; 22
	dc.w Level_MCZ2-Off_Level; 23
	dc.w Level_CNZ1-Off_Level; 24
	dc.w Level_CNZ2-Off_Level; 25
	dc.w Level_CPZ1-Off_Level; 26
	dc.w Level_CPZ2-Off_Level; 27
	dc.w Level_DEZ-Off_Level; 28
	dc.w Level_DEZ-Off_Level; 29
	dc.w Level_ARZ1-Off_Level; 30
	dc.w Level_ARZ2-Off_Level; 31
	dc.w Level_SCZ-Off_Level; 32
	dc.w Level_SCZ-Off_Level; 33
 

and add this to the end:

 
	dc.w Level_Lev11_1-Off_Level
	dc.w Level_Lev11_2-Off_Level
	dc.w Level_Lev12_1-Off_Level
	dc.w Level_Lev12_2-Off_Level
	dc.w Level_Lev13_1-Off_Level
	dc.w Level_Lev13_2-Off_Level
	dc.w Level_Lev14_1-Off_Level
	dc.w Level_Lev14_2-Off_Level
	dc.w Level_Lev15_1-Off_Level
	dc.w Level_Lev15_2-Off_Level
	dc.w Level_Lev16_1-Off_Level
	dc.w Level_Lev16_2-Off_Level
	dc.w Level_Lev17_1-Off_Level
	dc.w Level_Lev17_2-Off_Level
	dc.w Level_Lev18_1-Off_Level
	dc.w Level_Lev18_2-Off_Level
	dc.w Level_Lev19_1-Off_Level
	dc.w Level_Lev19_2-Off_Level
	dc.w Level_Lev1A_1-Off_Level
	dc.w Level_Lev1A_2-Off_Level
	dc.w Level_Lev1B_1-Off_Level
	dc.w Level_Lev1B_2-Off_Level
	dc.w Level_Lev1C_1-Off_Level
	dc.w Level_Lev1C_2-Off_Level
	dc.w Level_Lev1D_1-Off_Level
	dc.w Level_Lev1D_2-Off_Level
	dc.w Level_Lev1E_1-Off_Level
	dc.w Level_Lev1E_2-Off_Level
	dc.w Level_Lev1F_1-Off_Level
	dc.w Level_Lev1F_2-Off_Level
	dc.w Level_Lev20_1-Off_Level
	dc.w Level_Lev20_2-Off_Level
 

Then find:

 
;---------------------------------------------------------------------------------------
; EHZ act 1 level layout (Kosinski compression)
Level_EHZ1:	BINCLUDE	"level/layout/EHZ_1.bin"
;---------------------------------------------------------------------------------------
; EHZ act 2 level layout (Kosinski compression)
Level_EHZ2:	BINCLUDE	"level/layout/EHZ_2.bin"
;---------------------------------------------------------------------------------------
; MTZ act 1 level layout (Kosinski compression)
Level_MTZ1:	BINCLUDE	"level/layout/MTZ_1.bin"
;---------------------------------------------------------------------------------------
; MTZ act 2 level layout (Kosinski compression)
Level_MTZ2:	BINCLUDE	"level/layout/MTZ_2.bin"
;---------------------------------------------------------------------------------------
; MTZ act 3 level layout (Kosinski compression)
Level_MTZ3:	BINCLUDE	"level/layout/MTZ_3.bin"
;---------------------------------------------------------------------------------------
; WFZ level layout (Kosinski compression)
Level_WFZ:	BINCLUDE	"level/layout/WFZ.bin"
;---------------------------------------------------------------------------------------
; HTZ act 1 level layout (Kosinski compression)
Level_HTZ1:	BINCLUDE	"level/layout/HTZ_1.bin"
;---------------------------------------------------------------------------------------
; HTZ act 2 level layout (Kosinski compression)
Level_HTZ2:	BINCLUDE	"level/layout/HTZ_2.bin"
;---------------------------------------------------------------------------------------
; OOZ act 1 level layout (Kosinski compression)
Level_OOZ1:	BINCLUDE	"level/layout/OOZ_1.bin"
;---------------------------------------------------------------------------------------
; OOZ act 2 level layout (Kosinski compression)
Level_OOZ2:	BINCLUDE	"level/layout/OOZ_2.bin"
;---------------------------------------------------------------------------------------
; MCZ act 1 level layout (Kosinski compression)
Level_MCZ1:	BINCLUDE	"level/layout/MCZ_1.bin"
;---------------------------------------------------------------------------------------
; MCZ act 2 level layout (Kosinski compression)
Level_MCZ2:	BINCLUDE	"level/layout/MCZ_2.bin"
;---------------------------------------------------------------------------------------
; CNZ act 1 level layout (Kosinski compression)
Level_CNZ1:	BINCLUDE	"level/layout/CNZ_1.bin"
;---------------------------------------------------------------------------------------
; CNZ act 2 level layout (Kosinski compression)
Level_CNZ2:	BINCLUDE	"level/layout/CNZ_2.bin"
;---------------------------------------------------------------------------------------
; CPZ act 1 level layout (Kosinski compression)
Level_CPZ1:	BINCLUDE	"level/layout/CPZ_1.bin"
;---------------------------------------------------------------------------------------
; CPZ act 2 level layout (Kosinski compression)
Level_CPZ2:	BINCLUDE	"level/layout/CPZ_2.bin"
;---------------------------------------------------------------------------------------
; DEZ level layout (Kosinski compression)
Level_DEZ:	BINCLUDE	"level/layout/DEZ.bin"
;---------------------------------------------------------------------------------------
; ARZ act 1 level layout (Kosinski compression)
Level_ARZ1:	BINCLUDE	"level/layout/ARZ_1.bin"
;---------------------------------------------------------------------------------------
; ARZ act 2 level layout (Kosinski compression)
Level_ARZ2:	BINCLUDE	"level/layout/ARZ_2.bin"
;---------------------------------------------------------------------------------------
; SCZ level layout (Kosinski compression)
Level_SCZ:	BINCLUDE	"level/layout/SCZ.bin"
 

then add this at the end:

 
;---------------------------------------------------------------------------------------
; Lev11 act 1 level layout (Kosinski compression)
Level_Lev11_1:	BINCLUDE	"level/layout/Lev11_1.bin"
;---------------------------------------------------------------------------------------
; Lev11 act 2 level layout (Kosinski compression)
Level_Lev11_2:	BINCLUDE	"level/layout/Lev11_2.bin"
;---------------------------------------------------------------------------------------
; Lev12_1 level layout (Kosinski compression)
Level_Lev12_1:	BINCLUDE	"level/layout/Lev12_1.bin"
;---------------------------------------------------------------------------------------
; Lev12_2 level layout (Kosinski compression)
Level_Lev12_1:	BINCLUDE	"level/layout/Lev12_2.bin"
;---------------------------------------------------------------------------------------
; Lev13_1 level layout (Kosinski compression)
Level_Lev13_1:	BINCLUDE	"level/layout/Lev13_1.bin"
;---------------------------------------------------------------------------------------
; Lev13_2 level layout (Kosinski compression)
Level_Lev13_2:	BINCLUDE	"level/layout/Lev13_2.bin"
;---------------------------------------------------------------------------------------
; Lev14_1 level layout (Kosinski compression)
Level_Lev14_1:	BINCLUDE	"level/layout/Lev14_1.bin"
;---------------------------------------------------------------------------------------
; Lev14_2 level layout (Kosinski compression)
Level_Lev14_2:	BINCLUDE	"level/layout/Lev14_2.bin"
;---------------------------------------------------------------------------------------
; Lev15_1 level layout (Kosinski compression)
Level_Lev15_1:	BINCLUDE	"level/layout/Lev15_1.bin"
;---------------------------------------------------------------------------------------
; Lev15_2 level layout (Kosinski compression)
Level_Lev15_2:	BINCLUDE	"level/layout/Lev15_2.bin"
;---------------------------------------------------------------------------------------
; Lev16_1 level layout (Kosinski compression)
Level_Lev16_1:	BINCLUDE	"level/layout/Lev16_1.bin"
;---------------------------------------------------------------------------------------
; Lev16_2 level layout (Kosinski compression)
Level_Lev16_2:	BINCLUDE	"level/layout/Lev16_2.bin"
;---------------------------------------------------------------------------------------
; Lev17_1 level layout (Kosinski compression)
Level_Lev17_1:	BINCLUDE	"level/layout/Lev17_1.bin"
;---------------------------------------------------------------------------------------
; Lev17_2 level layout (Kosinski compression)
Level_Lev17_2:	BINCLUDE	"level/layout/Lev17_2.bin"
;---------------------------------------------------------------------------------------
; Lev18_1 level layout (Kosinski compression)
Level_Lev18_1:	BINCLUDE	"level/layout/Lev18_1.bin"
;---------------------------------------------------------------------------------------
; Lev18_2 level layout (Kosinski compression)
Level_Lev18_2:	BINCLUDE	"level/layout/Lev18_2.bin"
;---------------------------------------------------------------------------------------
; Lev19_1 level layout (Kosinski compression)
Level_Lev19_1:	BINCLUDE	"level/layout/Lev19_1.bin"
;---------------------------------------------------------------------------------------
; Lev19_2 level layout (Kosinski compression)
Level_Lev19_2:	BINCLUDE	"level/layout/Lev19_2.bin"
;---------------------------------------------------------------------------------------
; Lev1A_1 level layout (Kosinski compression)
Level_Lev1A_1:	BINCLUDE	"level/layout/Lev1A_1.bin"
;---------------------------------------------------------------------------------------
; Lev1A_2 level layout (Kosinski compression)
Level_Lev1A_2:	BINCLUDE	"level/layout/Lev1A_2.bin"
;---------------------------------------------------------------------------------------
; Lev1B_1 level layout (Kosinski compression)
Level_Lev1B_1: BINCLUDE	"level/layout/Lev1B_1.bin"
;---------------------------------------------------------------------------------------
; Lev1B_2 level layout (Kosinski compression)
Level_Lev1B_2:	BINCLUDE	"level/layout/Lev1B_2.bin"
;---------------------------------------------------------------------------------------
; Lev1C_1 level layout (Kosinski compression)
Level_Lev1C_1:	BINCLUDE	"level/layout/Lev1C_1.bin"
;---------------------------------------------------------------------------------------
; Lev1C_2 level layout (Kosinski compression)
Level_Lev1C_2:	BINCLUDE	"level/layout/Lev1C_2.bin"
;---------------------------------------------------------------------------------------
; Lev1D_1 level layout (Kosinski compression)
Level_Lev1D_1:	BINCLUDE	"level/layout/Lev1D_1.bin"
;---------------------------------------------------------------------------------------
; Lev1D_2 level layout (Kosinski compression)
Level_Lev1D_2:	BINCLUDE	"level/layout/Lev1D_2.bin"
;---------------------------------------------------------------------------------------
; Lev1E_1 level layout (Kosinski compression)
Level_Lev1E_1:	BINCLUDE	"level/layout/Lev1E_1.bin"
;---------------------------------------------------------------------------------------
; Lev1E_2 level layout (Kosinski compression)
Level_Lev1E_2:	BINCLUDE	"level/layout/Lev1E_2.bin"
;---------------------------------------------------------------------------------------
; Lev1F_1 level layout (Kosinski compression)
Level_Lev1F_1:	BINCLUDE	"level/layout/Lev1F_1.bin"
;---------------------------------------------------------------------------------------
; Lev1F_2 level layout (Kosinski compression)
Level_Lev1F_2:	BINCLUDE	"level/layout/Lev1F_2.bin"
;---------------------------------------------------------------------------------------
; Lev20_1 level layout (Kosinski compression)
Level_Lev20_1:	BINCLUDE	"level/layout/Lev20_1.bin"
;---------------------------------------------------------------------------------------
; Lev20_2 level layout (Kosinski compression)
Level_Lev20_2:	BINCLUDE	"level/layout/Lev20_2.bin"
 

Now create the .bin files.

Extending the definition of act 2 (setting up our new levels so that they can have bosses in other words)

just being able to use sign posts in your new levels can be boring after a while, so we will make those changes so that we can put custom bosses in our new levels, actually extending the sprite pointer list is not within the scope of the tutorial, though highly recommended.

find:

SetLevelEndType:
	move.w	#0,(Level_Has_Signpost).w	; set level type to non-signpost
	tst.w	(Two_player_mode).w	; is it two-player competitive mode?
	bne.s	LevelEnd_SetSignpost	; if yes, branch
	cmpi.w	#$001,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if EHZ2, return
	cmpi.w	#$500,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if MTZ3, return
	cmpi.w	#$600,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if WFZ, return
	cmpi.w	#$701,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if HTZ2, return
	cmpi.w	#$A01,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if OOZ2, return
	cmpi.w	#$B01,(Current_ZoneAndAct).w
	beq.s	return_4C46		; if MCZ2, return
	cmpi.w	#$C01,(Current_ZoneAndAct).w
	beq.s	return_4C46		; if CNZ2, return
	cmpi.w	#$D01,(Current_ZoneAndAct).w
	beq.s	return_4C46		; if CPZ2, return
	cmpi.w	#$E00,(Current_ZoneAndAct).w
	beq.s	return_4C46		; if DEZ, return
	cmpi.w	#$F01,(Current_ZoneAndAct).w
	beq.s	return_4C46		; if ARZ2, return
	cmpi.w	#$1000,(Current_ZoneAndAct).w
	beq.s	return_4C46		; if SCZ, return
 

we will change it to:

 
JmpTo_LevelEnd_SetSignpost
	jmp	LevelEnd_SetSignpost
 
SetLevelEndType:
	move.w	#0,(Level_Has_Signpost).w	; set level type to non-signpost
	tst.w	(Two_player_mode).w	; is it two-player competitive mode?
	bne.s	JmpTo_LevelEnd_SetSignpost	; if yes, branch
	cmpi.w	#$001,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if EHZ2, return
	cmpi.w	#$101,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if LZ2, return
	cmpi.w	#$201,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if WZ2, return
	cmpi.w	#$301,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if DHZ2, return
	cmpi.w	#$500,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if MTZ3, return
	cmpi.w	#$600,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if WFZ, return
	cmpi.w	#$701,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if HTZ2, return
	cmpi.w	#$801,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if HPZ2, return
	cmpi.w	#$901,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if GCZ2, return
	cmpi.w	#$A01,(Current_ZoneAndAct).w
	beq.w	return_4C46		; if OOZ2, return
	bra.s	SetLevelEndType2
 
return_4C46:
	rts
 
SetLevelEndType2:
	cmpi.w	#$B01,(Current_ZoneAndAct).w
	beq.s	return2_4C46		; if MCZ2, return
	cmpi.w	#$C01,(Current_ZoneAndAct).w
	beq.s	return2_4C46		; if CNZ2, return
	cmpi.w	#$D01,(Current_ZoneAndAct).w
	beq.s	return2_4C46		; if CPZ2, return
	cmpi.w	#$E00,(Current_ZoneAndAct).w
	beq.s	return2_4C46		; if DEZ, return
	cmpi.w	#$F01,(Current_ZoneAndAct).w
	beq.s	return2_4C46		; if ARZ2, return
	cmpi.w	#$1000,(Current_ZoneAndAct).w
	beq.s	return2_4C46		; if SCZ, return
	cmpi.w	#$1000,(Current_ZoneAndAct).w
	beq.s	return2_4C46		; if SCZ, return
	cmpi.w	#$1101,(Current_ZoneAndAct).w
	beq.s	return2_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1201,(Current_ZoneAndAct).w
	beq.s	return2_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1301,(Current_ZoneAndAct).w
	beq.s	return2_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1401,(Current_ZoneAndAct).w
	bra.s	SetLevelEndType3
 
return2_4C46:
	rts
 
SetLevelEndType3:
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1501,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1601,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1701,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1801,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1901,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1A01,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1B01,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1C01,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1D01,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1E01,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$1F01,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
	cmpi.w	#$2001,(Current_ZoneAndAct).w
	beq.s	return3_4C46		; if one of our new levels in act 2, return
 
; loc_4C40:
LevelEnd_SetSignpost:
	move.w	#1,(Level_Has_Signpost).w	; set level type to signpost
 
return3_4C46:
	rts
 

Extend Level Size Array

our levels need a size, right? This part of the guide gives us just that.

what we need to find is:

 
WrdArr_LvlSize:
	dc.w	$0,	$29A0,	$0,	$320	; $00  ; EHZ act 2
	dc.w	$0,	$2940,	$0,	$420		; EHZ act 2
	dc.w	$0,	$3FFF,	$0,	$720	; $01
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$3FFF,	$0,	$720	; $02
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$3FFF,	$0,	$720	; $03
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$2280,	-$100,	$800	; $04 ; MTZ act 1
	dc.w	$0,	$1E80,	-$100,	$800		; MTZ act 2
	dc.w	$0,	$2A80,	-$100,	$800	; $05 ; MTZ act 3
	dc.w	$0,	$3FFF,	-$100,	$800
	dc.w	$0,	$3FFF,	$0,	$720	; $06 ; WFZ
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$2800,	$0,	$720	; $07 ; HTZ act 1
	dc.w	$0,	$3280,	$0,	$720		; HTZ act 2
	dc.w	$0,	$3FFF,	$0,	$720	; $08
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$3FFF,	$0,	$720	; $09
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$2F80,	$0,	$680	; $0A ; OOZ act 1
	dc.w	$0,	$2D00,	$0,	$680		; OOZ act 2
	dc.w	$0,	$2380,	$3C0,	$720	; $0B ; MCZ act 1
	dc.w	$0,	$3FFF,	$60,	$720		; MCZ act 2
	dc.w	$0,	$27A0,	$0,	$720	; $0C ; CNZ act 1
	dc.w	$0,	$2A80,	$0,	$720		; CNZ act 2
	dc.w	$0,	$2780,	$0,	$720	; $0D ; CPZ act 1
	dc.w	$0,	$2A80,	$0,	$720		; CPZ act 2
	dc.w	$0,	$1000,	$C8,	 $C8	; $0F ; DEZ
	dc.w	$0,	$1000,  $C8,	 $C8
	dc.w	$0,	$28C0,	$200,	$600	; $10 ; ARZ act 1
	dc.w	$0,	$3FFF,	$180,	$710		; ARZ act 2
	dc.w	$0,	$3FFF,	$0,	$000	; $11 ; SCZ
	dc.w	$0,	$3FFF,	$0,	$720
 

and we will change it to:

 
WrdArr_LvlSize:
	dc.w	$0,	$29A0,	$0,	$320	; $00  ; EHZ act 2
	dc.w	$0,	$2940,	$0,	$420		; EHZ act 2
	dc.w	$0,	$3FFF,	$0,	$720	; $01
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$3FFF,	$0,	$720	; $02
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$3FFF,	$0,	$720	; $03
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$2280,	-$100,	$800	; $04 ; MTZ act 1
	dc.w	$0,	$1E80,	-$100,	$800		; MTZ act 2
	dc.w	$0,	$2A80,	-$100,	$800	; $05 ; MTZ act 3
	dc.w	$0,	$3FFF,	-$100,	$800
	dc.w	$0,	$3FFF,	$0,	$720	; $06 ; WFZ
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$2800,	$0,	$720	; $07 ; HTZ act 1
	dc.w	$0,	$3280,	$0,	$720		; HTZ act 2
	dc.w	$0,	$3FFF,	$0,	$720	; $08
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$3FFF,	$0,	$720	; $09
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$2F80,	$0,	$680	; $0A ; OOZ act 1
	dc.w	$0,	$2D00,	$0,	$680		; OOZ act 2
	dc.w	$0,	$2380,	$3C0,	$720	; $0B ; MCZ act 1
	dc.w	$0,	$3FFF,	$60,	$720		; MCZ act 2
	dc.w	$0,	$27A0,	$0,	$720	; $0C ; CNZ act 1
	dc.w	$0,	$2A80,	$0,	$720		; CNZ act 2
	dc.w	$0,	$2780,	$0,	$720	; $0D ; CPZ act 1
	dc.w	$0,	$2A80,	$0,	$720		; CPZ act 2
	dc.w	$0,	$1000,	$C8,	 $C8	; $0E ; DEZ
	dc.w	$0,	$1000,  $C8,	 $C8
	dc.w	$0,	$28C0,	$200,	$600	; $0F ; ARZ act 1
	dc.w	$0,	$3FFF,	$180,	$710		; ARZ act 2
	dc.w	$0,	$3FFF,	$0,	$000	; $10 ; SCZ
	dc.w	$0,	$3FFF,	$0,	$720
	dc.w	$0,	$3FFF,	$0,	$720	; $11 ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $12 ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $13 ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $14 ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $15 ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $16 ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $17 ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $18 ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $19 ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $1A ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $1B ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $1C ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $1D ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $1E ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $1F ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	dc.w	$0,	$3FFF,	$0,	$720	; $20 ;one of our new levels (act 1)
	dc.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
 

Extending the Start Location Index

Sonic has to start somewhere right?

Find this:

 
WrdArr_StartLoc:
	dc.w	$60,	$28F	; $00
	dc.w	$60,	$2AF
	dc.w	$60,	$28F	; $01
	dc.w	$60,	$2AF
	dc.w	$60,	$1AC	; $02
	dc.w	$60,	$1AC
	dc.w	$60,	$28F	; $03
	dc.w	$60,	$2AF
	dc.w	$60,	$28C	; $04
	dc.w	$60,	$5EC
	dc.w	$60,	$20C	; $05
	dc.w	$60,	$2AF
	dc.w	$60,	$4CC	; $06
	dc.w	$1E0,	$4CC
	dc.w	$60,	$3EF	; $07
	dc.w	$60,	$6AF
	dc.w	$230,	$1AC	; $08
	dc.w	$230,	$1AC
	dc.w	$60,	$28F	; $09
	dc.w	$60,	$2AF
	dc.w	$60,	$6AC	; $0A
	dc.w	$60,	$56C
	dc.w	$60,	$6AC	; $0B
	dc.w	$60,	$5AC
	dc.w	$60,	$2AC	; $0C
	dc.w	$60,	$58C
	dc.w	$60,	$1EC	; $0D
	dc.w	$60,	$12C
	dc.w	$60,	$12D	; $0E
	dc.w	$60,	$12D
	dc.w	$60,	$37E	; $0F
	dc.w	$60,	$37E
	dc.w	$120,	$70	; $10
	dc.w	$140,	$70
 

then add this to the end:

 
	dc.w	0,	0	; $11
	dc.w	0,	0
	dc.w	0,	0	; $12
	dc.w	0,	0
	dc.w	0,	0	; $13
	dc.w	0,	0
	dc.w	0,	0	; $14
	dc.w	0,	0
	dc.w	0,	0	; $15
	dc.w	0,	0
	dc.w	0,	0	; $16
	dc.w	0,	0
	dc.w	0,	0	; $17
	dc.w	0,	0
	dc.w	0,	0	; $18
	dc.w	0,	0
	dc.w	0,	0	; $19
	dc.w	0,	0
	dc.w	0,	0	; $1A
	dc.w	0,	0
	dc.w	0,	0	; $1B
	dc.w	0,	0
	dc.w	0,	0	; $1C
	dc.w	0,	0
	dc.w	0,	0	; $1D
	dc.w	0,	0
	dc.w	0,	0	; $1E
	dc.w	0,	0
	dc.w	0,	0	; $1F
	dc.w	0,	0
	dc.w	0,	0	; $20
	dc.w	0,	0
 

then replace the 0s with the desired x and y co-ordinance.

Notes

All new .bin files need to be created in order for the ROM to build. If something doesn't load correctly (besides new animated patterns that you have just made by youself, only major things like ROM crashes) please don't hesitate to ask for help and/or get it working and edit this article. (Like the title cards being broken for levels past $10)