News:

Don't forget to visit the main site! There's lots of helpful docs, patches, and more!

Main Menu

[SM] [ENEMY] Elevator D73F : Pointer to GFX and palette.

Started by BigDomino, August 30, 2012, 06:05:52 PM

Previous topic - Next topic

BigDomino

Hi there,

After wasting two weeks trying to find this info by myself , in vain *... I decided to post my question here and hope someone could help.
( * In the "code windows" below, you can find the product of my research about the subject.)

1) All started with the idea of creating a new elevator enemy for my hack, that would be used in some part of the Laboratory area.
New enemy is intended to behave just like enemy D73F [elevator] with different GFX.

[spoiler=Elevator design]
[/spoiler]

[spoiler=Elevator tiles]
[/spoiler]

2) The idea here was not to edit the actual enemy D73F but to create a new one with, at least, its own tile data, palette data, Initialization and running A.I. (since they are the part of enemy A.I that point to graphic instructions).
New animation code and tilemaps have already been (partialy) wrote in order to display the new gfx.
Pointers in init. and runn. A.I. will be redirected to these new instructions in bank A3.
All that should work without any problem, but....

3) GFX and palette data are not pointed correctly by enemy DNA or, more likely, are not picked from these pointers in enemy data table (unlike other enemies).
Pointer to GFX / palette seem to be hardcoded in some part of the enemy A.I.

4) Knowing the real location of both GFX and palette (tanks to "project pallette" and TileLayerPro)
I started investigations to find in the ROM pointers leading to pointers leading to the concerned data.

5) Here are the info I was able to collect :
(the info below also contain the disassembly of the whole enemy D73F animation code, beggining in enemy data table and ending with tile data)


ENEMY D73F GENERAL INFO :

Enemy name : D73F [elevator]    ; found in species editor
Enemy data  bank : A0 ; same bank for all enemies
Enemy data table location : $A0:D73F (loROM) ; bank and name form a pointer to table data
$10:573F (pc)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

CONTENT OF ENEMY DATA TABLE AT $10:573F (pc) :

$10:573F | 00 00
$10:5741 | 00 00 $ -- : -- -- (loROM) ; pointer to color palette : Not handled by DNA ?!
$10:5743 | 28 00
$10:5745 | 0F 00
$10:5747 | 10 00
$10:5749 | 08 00
$10:574B | A3 ; enemy bank, to form other pointers.
$10:574C | 00
$10:574D | 59
$10:574E | 00
$10:574F | 00 00
$10:5751 | E6 94 $A3:94E6 (loROM) ; pointer to initiation AI (loROM) - use enemy's bank
$11:94E6 (pc) ; pointer to initiation AI (pc) - use enemy's bank
$10:5753 | 01 00
$10:5755 | 00 00
$10:5757 | 2A 95 $A3:952A (loROM) ; pointer to running AI (loROM) - use enemy's bank
$11:952A (pc) ; pointer to running AI (pc) - use enemy's bank
$10:5759 | 2A 95
$10:575B | 4C 80
$10:575D | 2A 95
$10:575F | 00 00
$10:5761 | 00
$10:5762 | 00
$10:5763 | 00 00 00 00
$10:5767 | 4C 80
$10:5769 | 00 00 00 00 00 00
$10:576F | 4C 80
$10:5771 | 4C 80
$10:5773 | 00 00
$10:5775 | 00 00 00 $ -- : -- -- (loROM) ; (word long) pointer to GFX tiles (loROM) : Not handled by DNA ?!
$ -- : -- -- (pc) ; (word long) pointer to GFX tiles (pc) : Not handled by DNA ?!
$10:5778 | 05
$10:5779 | 00 00
$10:577B | 00 00
$10:577D | 00 00

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

OTHER INFO ABOUT ELEVATOR PALETTE :

Found in "project palette" document :
Elevator palette location : $0D:01A0 (pc)
$9A:81A0 (loROM) ; Used by many things, not only elevator.
; Not pointed by enemy DNA : Maybe a pointer in Elevator AI ?

Reversed location for palette : A0 81 9A ; Long pointer reversed : string to search in Initiation AI or Running AI.
; Unable to find... (nor the short pointer: A0 81).
; Maybe the AI uses a pointer to a pointer leading to palette ?
; Let's see occurrence of " A0 81 9A " in the whole ROM.

Occurrence of "A0 81 9A" found at:
$01:613F (pc)
$82:E13F (loROM) ; This address point to palette location pointer...

Reversed long pointer location: 3F E1 82 ; Hex string to search in Initiation AI or Running AI.
; Unable to find...  (nor the short pointer: 3F E1).
; Maybe it's not handled by Init. or Running AI ?  WTF !?!
; Or maybe it's a pointer who lead to GFX data that are already
; loaded into RAM/VRAM ?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

OTHER INFO ABOUT ELEVATOR GFX :

Found in TileLayerPro :
Elevator GFX location : $0D:5200 (pc) ; It's the start address of the GFX sheet that the elevator tilemap use.
; It was found by decrementing the current address of a specific elevator tile
; by : [ $20 ] x [ tile position in the sheet (specified by tilemap instruction) ]
; (enemy D73F tilemap is disassembled in the last part of this doc)
; So :
; $0D:5F80 was the address of a tile used in the first animation.
; $# 6C was the position in sheet of this specific tile according to tile setup.
; $# 20 bytes is the range of a 8 x 8 pixel tile.
; $0D5F80 - [ $20 x $6C ] = $0D5200 ok!

Elevator GFX location : $9A:D200 (loROM) ; This sheet is used by many other things such as beams, explosion, missile...
; Not pointed by enemy DNA : Maybe a pointer in Elevator AI ?

Reversed GFX sheet location : 00 D2 9A ; Long pointer reversed : string to search in Initiation AI or Running AI.
; Unable to find... (nor the short pointer: 00 D2).
; Maybe the AI uses a pointer to a pointer leading to GFX sheet ?
; Let's see occurrence of " 00 D2 9A " in the whole ROM.

Occurrence of "00 D2 9A" found at:
$01:031B (pc)
$82:831B (loROM) ; This address point to GFX location pointer...

Reversed long pointer location: 1B 83 82 ; Hex string to search in Initiation AI or Running AI.
; Unable to find...  (nor the short pointer: 1B 83).

$01:22D7 (pc)
$82:A2D7 (loROM) ; This address point to GFX location pointer...

Reversed long pointer location: D7 A2 82 ; Hex string to search in Initiation AI or Running AI.
; Unable to find...  (nor the short pointer: D7 A2).

$05:A50C (pc)
$8B:A50C (loROM) ; This address point to GFX location pointer...

Reversed long pointer location: 0C A5 8B ; Hex string to search in Initiation AI or Running AI.
; Unable to find...  (nor the short pointer: 0C A5).

$05:C217 (pc)
$8B:C217 (loROM) ; This address point to GFX location pointer...

Reversed long pointer location: 17 C2 8B ; Hex string to search in Initiation AI or Running AI.
; Unable to find...  (nor the short pointer: 17 C2).
; Maybe it's not handled by Init. or Running AI ?  WTF !?!
; Or maybe it's a pointer who lead to GFX data that are already
; loaded into RAM/VRAM ?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

AT THIS POINT, I WAS UNABLE TO FIND THE NEEDED DATA...   AN IDEA ?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ENEMY D73F POINTERS TO ANIMATION :

Occurrences of string "XX XX 9D 92 0F" found in initiation A.I. :
[start address : $11:94E6 (pc) - $11:E6C1 (pc) ]

$11:94F9 | D6 94 9D 92 0F $A3:94D6 (loROM) ; pointer in initiation A.I. leading to animation
; code of elevator (time + tilemaps) (loROM)
$11:94D6 (pc) ; conversion to pc

Occurrences of string "XX XX 9D 92 0F" found in running A.I. :
[start address : $11:E6C2 (pc) - end address : $11:96E2 (pc) ]

[no occurrences found]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

ENEMY D73F ANIMATION CODE (pointers to tilemaps):

Animation code found at $11:94D6 (pc) :

$11:94D6 | 02 00 #0002 frames ; delay for displaying 1st sprite of animation.
$11:94D8 | 2F 96 $A3:962F (loROM) ; pointer to tilemaps of the 1st sprite of animation (loROM).
$11:962F (pc) ; pointer to tilemaps of the 1st sprite of animation (PC).

$11:94DA | 02 00 #0002 frames ; delay for displaying 2nd sprite of animation.
$11:94DC | 45 96 $A3:9645 (loROM) ; pointer to tilemaps of the 2nd sprite of animation (loROM).
$11:9645 (pc) ; pointer to tilemaps of the 2nd sprite of animation (PC).

$11:94DE | ED 80 D6 94 return to $A3:94D6 ; loop instruction.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

TILEMAPS :

Tilemaps of 1st sprite of animation located at $11:962F (pc)
(i.e. : this is the darker sprite in the animation, made with a single repeated tile)
(Look, in this code, how lateral tiles [01 & 02] overlap center tiles [03 & 04] by two pixels to enhance the "pulsating" effect!)
(for X and Y coordinate, insertion point is the top-left corner of the tile. Position from the center is given by adding or subtracting pixels)

Number of tiles to load :
$11:962F | 04 00 #0004 tiles to load ; nb. of tiles (or group of four tiles) displayed to make the sprite

Tile n°01 setting :
$11:9631 | F2 [00] - [E pixels : move left] ; horizontal position of the tile (X coordinate)
$11:9632 | 01 [00] + [01] ; multiplyer byte: [00 = single tile, not group] + [01 = moved to the left]
$11:9633 | C [00] - [04 pixels : move up] ; vertical position of the tile (Y coordinate)
$11:9634 | 6C Position of tile in the sheet ; increment the GFX address: $0D:5200 (pc) + [#$ 6C x #$ 20] = $0D:5F80 (pc)
$11:9635 | 6A [20]+[40]+[00]+[09]+[01] ; [20 = priority : in front of Samus] + [40 = horiz. flip] + [00 = no vertic. flip] + ...
; ... + [09 = palette index] + [01 = name]
Tile n°02 setting:
$11:9636 | 06 [00] + [6 pixels : move right] ; horizontal position of the tile (X coordinate)
$11:9637 | 00 [00] + [00] ; multiplyer byte: [00 = single tile, not group] + [00 = not moved to the left]
$11:9638 | FC [00] - [04 pixels : move up] ; vertical position of the tile (Y coordinate)
$11:9639 | 6C Position of tile in the sheet ; increment the GFX address: $0D:5200 (pc) + [#$ 6C x #$ 20] = $0D:5F80 (pc)
$11:963A | 6A [20]+[40]+[00]+[09]+[01] ; [20 = priority : in front of Samus] + [40 = horiz. flip] + [00 = no vertic. flip] + ...
; ... + [09 = palette index] + [01 = name]
Tile n°03 setting:
$11:963B | 00 [00] - [0 pixels : not moved] ; horizontal position of the tile (X coordinate)
$11:963C | 00 [00] + [00] ; multiplyer byte: [00 = single tile, not group] + [00 = not moved to the left]
$11:963D | FC [00] - [04 pixels : move up] ; vertical position of the tile (Y coordinate)
$11:963E | 6C Position of tile in the sheet ; increment the GFX address: $0D:5200 (pc) + [#$ 6C x #$ 20] = $0D:5F80 (pc)
$11:963F | 6A [20]+[40]+[00]+[09]+[01] ; [20 = priority : in front of Samus] + [40 = horiz. flip] + [00 = no vertic. flip] + ...
; ... + [09 = palette index] + [01 = name]
Tile n°04 setting:
$11:9640 | F8 [00] - [8 pixels : move left] ; horizontal position of the tile (X coordinate)
$11:9641 | 01 [00] + [01] ; multiplyer byte: [00 = single tile, not group] + [01 = moved to the left]
$11:9642 | FC [00] - [04 pixels : move up] ; vertical position of the tile (Y coordinate)
$11:9643 | 6C Position of tile in the sheet ; increment the GFX address: $0D:5200 (pc) + [#$ 6C x #$ 20] = $0D:5F80 (pc)
$11:9644 | 2A [20]+[00]+[00]+[09]+[01] ; [20 = priority : in front of Samus] + [00 = no horiz. flip] + [00 = no vertic. flip] + ...
; ... + [09 = palette index] + [01 = name]



Tilemaps of 2nd sprite of animation 01 located at $11:9645 (pc)
(i.e. : this is the brighter sprite in the animation, made with two pair of symmetric tiles)
(adjacent tiles doesn't overlap)

Number of tiles to load :
$11:9645 | 04 00 #0004 tiles to load ; nb. of tiles (or group of four tiles) displayed to make the sprite

Tile n°01 setting :
$11:9647 | 00 [00] - [0 pixels : not moved] ; horizontal position of the tile (X coordinate)
$11:9648 | 00 [00] + [00] ; multiplyer byte: [00 = single tile, not group] + [00 = not moved to the left]
$11:9649 | FC [00] - [04 pixels : move up] ; vertical position of the tile (Y coordinate)
$11:964A | 6E Position of tile in the sheet ; increment the GFX address: $0D:5200 (pc) + [#$ 6E x #$ 20] = $0D:5FC0 (pc)
$11:964B | 6A [20]+[40]+[00]+[09]+[01] ; [20 = priority : in front of Samus] + [40 = horiz. flip] + [00 = no vertic. flip] + ...
; ... + [09 = palette index] + [01 = name]
Tile n°02 setting:
$11:964C | 08 [00] + [8 pixels : move right] ; horizontal position of the tile (X coordinate)
$11:964D | 00 [00] + [00] ; multiplyer byte: [00 = single tile, not group] + [00 = not moved to the left]
$11:964E | FC [00] - [04 pixels : move up] ; vertical position of the tile (Y coordinate)
$11:964F | 6D Position of tile in the sheet ; increment the GFX address: $0D:5200 (pc) + [#$ 6D x #$ 20] = $0D:5FA0 (pc)
$11:9650 | 6A [20]+[40]+[00]+[09]+[01] ; [20 = priority : in front of Samus] + [40 = horiz. flip] + [00 = no vertic. flip] + ...
; ... + [09 = palette index] + [01 = name]
Tile n°03 setting:
$11:9651 | F8 [00] - [8 pixels : move left] ; horizontal position of the tile (X coordinate)
$11:9652 | 01 [00] + [01] ; multiplyer byte: [00 = single tile, not group] + [01 = moved to the left]
$11:9653 | FC [00] - [04 pixels : move up] ; vertical position of the tile (Y coordinate)
$11:9654 | 6E Position of tile in the sheet ; increment the GFX address: $0D:5200 (pc) + [#$ 6E x #$ 20] = $0D:5FC0 (pc)
$11:9655 | 2A [20]+[00]+[00]+[09]+[01] ; [20 = priority : in front of Samus] + [00 = no horiz. flip] + [00 = no vertic. flip] + ...
; ... + [09 = palette index] + [01 = name]
Tile n°04 setting:
$11:9656 | F0 [00] - [10 pixels : move left] ; horizontal position of the tile (X coordinate)
$11:9657 | 01 [00] + [01] ; multiplyer byte: [00 = single tile, not group] + [01 = moved to the left]
$11:9658 | FC [00] - [04 pixels : move up] ; vertical position of the tile (Y coordinate)
$11:9659 | 6D Position of tile in the sheet ; increment the GFX address: $0D:5200 (pc) + [#$ 6D x #$ 20] = $0D:5FA0 (pc)
$11:965A | 2A [20]+[00]+[00]+[09]+[01] ; [20 = priority : in front of Samus] + [00 = no horiz. flip] + [00 = no vertic. flip] + ...
; ... + [09 = palette index] + [01 = name]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

GFX TILES :

Tiles pointed by tilemaps :
(GFX: ctrl + g in TileLayerPro to see the tile)

$0D:5F80 (pc)  : sprite 1 : darker tile.

$0D:5FA0 (pc) : sprite 2 : brighter tile - extreme parts of elevator.

$0D:5FC0 (pc) : sprite 2 : brighter tile - center parts of elevator.

(Right palette: exported from SABS "I'm a genius" at : $0D:01A0 - [0F]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



6) Conclusion:
For his gfx, Elevator enemy use the same sheet than missile animation, explosion animation, shutter, etc..
The location of this sheet (start $0D:5200 pc) is not pointed by DNA but (I suppose) hardcoded in enemy AI.

For his color, Elevator enemy use the same palette than missile animation, explosion animation, shutter, etc..
The location of this palette (start $0D:01A0 pc) is not pointed by DNA but (I suppose) hardcoded in enemy AI.

7) Question to Metconst :

Being a total noob when ASM is concerned, I just reached the limite of what I can do with my basic knowledges on the subject.

No need to mention that, before posting, I tried to read and understand all docs from Kejardon about enemies and enemy in RAM, all posts related to elevator, palette or gfx on this forum or m2k2.

Here are my question:
- Does anybody know which part of the A.I. point to palette and GFX sheet ?
- Does anybody made a disassembly of enemy D73F A.I. ?
- Does anybody know a useful document or any info (not already mentioned in this post) about elevator D73F behavior?

if not:

- Which kind of ASM instructions could use these data in A.I. ?
- Which methodology would you recommend to pursue this investigation?

Sorry for the huge tome and thanks by advance for your answers.

PS: in attachment : the note of the "code window" above, in .pdf format. More easy to read.

Metaquarius

What ???  :pwuh:

I've just tried myself to clone D73F and make it point to new GFX, palette and tilemaps and everything has gone as expected. There's no such thing as hardcoded GFX pointer in enemy AI otherwise I wouldn't be able to make it work. Indeed, D73F uses the same GFX sheet and palette as Explosions/projectiles, but unless you've failed somehow at cloning it, that's not a problem AFAIK.

Do you mind posting your new tilemaps ?

Scyzer

The original elevator uses the main sprite GFX sheet because it has a GFX pointer of $000000. If you give it a proper pointer to GFX, it will load those GFX instead.

BigDomino

Quote from: Scyzer on August 31, 2012, 05:28:27 AM
[...] If you give it a proper pointer to GFX, it will load those GFX instead.

I already managed to make it works for about ten other enemies without any problems.... but elevator D73F still don't want to load other gfx and palette than its own original, from new address pointer in DNA.

- I tryed to change gfx/palette/nb. of tiles of the original enemy D73F.
- I have made the same with a clone [new DNA stored at: $A0:F800] without any succes.
- I tried to test via quickmet, then via normal play : same result.
- I changed the values of complex flip/priority byte of enemy tilemap ("name" bit), remembering that Kejardon
    said that this bit in "flip byte" can handle instruction to switch to another tilesheet : no changes.

You are known here as the more informed specialist of enemies and I'm not trying, in any manner, to question your answer above... but it just don't work for me.

What the hell I'm doing wrong ? That doesn't make any sense...

Quote from: Metaquarius on August 31, 2012, 04:41:53 AM
[...] but unless you've failed somehow at cloning it, that's not a problem AFAIK.

I don't really figure out what a "failled cloning" can be but, from what I can see ingame, my cloned elevator act and display just like the original one.

Maybe allowing me to take a look at what you did to make it works could put in evidence the mistake I made?
Nevertheless, It would be really sad for me to be unable to write properly an address in a f*** field in SMILE.

This seriously begin to be a pain in the ass.

Crashtour99

Did you remember to add your clone to the enemies allowed list?  Normally you wouldn't add elevators to the allowed list because the 000000 pointer means the gfx/palette are already loaded into VRAM.  If you change that, then you'll have to add it to the list for it to display correctly.

JAM

#5
Congratulations! You've found the location of elevator tilemap. I was about to do this, I haven't found these tilemaps (I was searching in wrong place, in the bank $93). So, now I can help you with data you've posted.

All you need to do is:
1. Clone elevator enemy. Change only Initiation AI to make it point to free space in bank A3. There is a lot of it.
2. Now, copy all data from Initiation AI (from 1194E6 to 119529) to free space. It should start from address you've set in new elevator Initiation AI.
3. Then, in new code find these bytes: A9 D6 94. Change it to A9 XX XX, where XX XX will point to free space.
4. After that, copy all bytes from 1194D6 to 1195E1 to free space (address must match XX XX). These bytes are drawing instruction of tilemaps.
5. Now change 2F 96 to YY YY and 45 96 to ZZ ZZ (where YY YY and ZZ ZZ -- pointers to free space) and last 2 bytes (D6 94) to XX XX. We just made new drawing cycle with loop.
6. Write new tilemaps at A3:YY YY and A3:ZZ ZZ. First of all, copy tilemaps from 11962F to YY YY and from 119645 to ZZ ZZ.
7. Draw new elevator tiles at $D5200. Don't sure what tiles to use. Try tiles, marked with "X". 8 tiles at $D5800 are used by beams, so don't touch them. And don't go over $D7200.
8. Rewrite tilemaps at YY YY and ZZ ZZ to set newly drawed tiles. If you will not see newly drawed tiles in the game, try to use other tiles.

I just don't sure what to do to change palette. But at least, you'll have new graphics.

I haven't tested it, but it should work!

P.S. Keep in mind that bytes at XX, YY and ZZ are reversed as well as all pointers. Just like A9 D6 94 is operator LDA #$94D6 (not D694).

BigDomino

#6
Okay guys, with your help and through the different advices posted here or via PM, I finally solved this annoying gfx problem.

Here are some extra info for other hackers planning to do tilemaps or messing with elevator:

- Pointers for gfx and palette has to be changed in enemy DNA.
- Like Crashtour99 and Metaquarius said, the enemy need to be added to enemy allowed list to pick his gfx from the new address.
  (enemy allowed pointer of the room must be relocated in free space before adding if the list is empty. If not, species can be switched).
- Like Metaquarius said via PM, the original tilemaps setting of elevator D73F also force it to take his gfx from the
  main sheet (missile, explosion, etc) instead of the new location. After messing a bit with settings and testing
  several values, i observed that the low nibble of the last byte in each tile setting of the animation tilemaps was
  indeed involved in the gfx "alteration",just like Kejardon said :

  In the example below, I settled a tile to make it horizontally flipped (+ [4]0) and displayed between
  BG and Samus (+ [2]0) so, high nibble was [6]0.

  - every even low nibble made with a "name bit" of 0 + any even "palette bit" like :
    6[ 0] (0+0= [0 ]) ; 6[2] (2+0 = [2]) ; 6[4] (4+0 = [4]) ; ... ; 6[E] (E+0 = [E])
    make the tile use the old main gfx sheet instead of the new gfx pointed by DNA.
and
  - every odd low nibble made with a "name bit" of 1 + any even "palette bit" like :
    6[1] (0+1 = [1]) ; 6[3] (2+1 = [3]) ; 6[5] (4+1 = [5]) ; ... ; 6 (E+1 = )
    make the tile use the correct new gfx pointed by DNA.

In addition, "palette bit" seem to have no effect since the enemy is added to the list and flip byte has an odd low nibble.
(61, 63, 65, etc.. = same result) the palette used is the one pointed by DNA.
In the other hand, for enemy who are not added in the list and have a flip bit with even low nibble (like original elevator), some "palette bit" values alter the color palette (for example C + 0 = [C] make the tile use a black palette instead of the main palette).

I also noticed that white XXX staying at the top of the main sheet (start in ROM at $0D:5200 pc ; end at ??:????) are used to display Samus's sprites. New custom gfx tiles shouldn't be added in these places.

That's all I can tell about that.

I hope a video featuring the new elevator will be posted in D.o.O topic soon enough.

A big thanks to all for the help  :yay:.


PS: I'm close to release an Excel software called "Tilemaps generator".
This tool write tilemaps automatically : User clic on a grid to put the tiles, choose between "single tile" mode or "16 x 16" mode, define flip and priority via drop-down menu ; then the program write and concatenate the code - ready to paste-write in the ROM.
Tilemaps generator has its limitation, though. To keep it easy to use, I decided to restrain the possible positions of a tile on the grid.
That way, T.G. can only handle tiles who fit to the 8 x 8 pixel grid - Intermediate positions are not allowed.
I already use beta version for my hack but a public release is planned in about 2 weeks, time for me to do the last cosmetic adjustments.