Turaco sprite editor for Windows

english2

Active member

Donor 2021, 2024
Joined
Mar 21, 2020
Messages
79
Reaction score
141
Hi all. I needed a sprite editor that worked with classic arcade games (Donkey Kong, Pacman, etc.) and came across Turaco for DOS. It needs Dosbox and a driver to make it work, so I decided to port it to Windows to make it easier and publish on Github. I'll just leave the link here in case this is of use to anyone. https://github.com/english1234/Turaco-Sprite-Editor
turaco_main_interface.png
 
Hi all. I needed a sprite editor that worked with classic arcade games (Donkey Kong, Pacman, etc.) and came across Turaco for DOS. It needs Dosbox and a driver to make it work, so I decided to port it to Windows to make it easier and publish on Github. I'll just leave the link here in case this is of use to anyone. https://github.com/english1234/Turaco-Sprite-Editor
View attachment 861932
Oh god bless you dude! 😁 This has been needed for sooo long!

I'm going to try it as soon as I get home from work!
 
Last edited:
Oh god bless you dude! 😁 This has been needed for sooo long!

I'm going to try it as soon as I get home from work!
let me know how it goes as i've just done basic testing so far. it's a bit picky as it is in terms of where directories are with the drivers and roms. i've left debug info in a separate window which will hopefully give a clue if it's not finding paths to files.
 
How tough is it to add new drivers for currently unsupported games? Is it the kind of thing an amateur who doesn't know how to program can figure out with info out of the MAME drivers?
 
How tough is it to add new drivers for currently unsupported games? Is it the kind of thing an amateur who doesn't know how to program can figure out with info out of the MAME drivers?
I haven't looked into this so far, but the .INI files are just text files, and i believe the way to add new games is documented somewhere. By the way, there are drivers for over 200 games included, but apparently over 800 drivers exist, but so far i haven't been able to find the missing ones. If anyone has the DOS version of Turaco, it would be useful to count how many .INI files are in the DRIVERS directory - if it's 800+ then I'd like to add them to the Github for all to benefit from.
 
I haven't looked into this so far, but the .INI files are just text files, and i believe the way to add new games is documented somewhere. By the way, there are drivers for over 200 games included, but apparently over 800 drivers exist, but so far i haven't been able to find the missing ones. If anyone has the DOS version of Turaco, it would be useful to count how many .INI files are in the DRIVERS directory - if it's 800+ then I'd like to add them to the Github for all to benefit from.
I have the DOS version, not that I've even gotten it to work, I'll try to check how many it has when I get home.
 
I haven't looked into this so far, but the .INI files are just text files, and i believe the way to add new games is documented somewhere. By the way, there are drivers for over 200 games included, but apparently over 800 drivers exist, but so far i haven't been able to find the missing ones. If anyone has the DOS version of Turaco, it would be useful to count how many .INI files are in the DRIVERS directory - if it's 800+ then I'd like to add them to the Github for all to benefit from.
846

1763147305100.png
 
How tough is it to add new drivers for currently unsupported games? Is it the kind of thing an amateur who doesn't know how to program can figure out with info out of the MAME drivers?

Here is what the information in drivers should look like per the TXT file, so I would think you can make your own INI files if you can find correct roms and locations to load in.


#
# This is a very well commented driver file
#
# commented by Scott "Jerry" Lawrence
# 1 Jan 99
#
# This started it's life as a pacman driver.

# the filename is the short name of the driver. for example, "BUNNY.INI"
# will have its rom files in ROMDIR\BUNNY\ROM.BIN

# General: This contains general information about the driver
[General]
# Description: This is the "long" or "full" name of the driver.
# This will be displayed in the -listfull list, or file selector
Description = Pac-Man (Midway)

# Layout: General information about the graphics layouts
[Layout]
# GfxDecodes: number of "Decode"'s below in the file
GfxDecodes = 4
# Orientation: orientation of the decodes. This is to simplify writing
# drivers. Instead of making the driver rotate the info as it
# loads it, this will rotate or flip the images after it's loaded
#
# 0 - no effect
# 1 - Flip X - mirror everything in the X direction
# 2 - Flip Y - mirror everything in the Y direction
# 4 - Swap X & Y - mirror along the top-left and bottom-right diagonal
# 5 - Rotate 90 degtees clockwise
# 3 - Rotate 180 degrees (clockwise)
# 6 - Rotate 270 degrees clockwise (90 degrees counter-clockwise)
Orientation = 0

# GraphicsRoms: stores the names and sizes of the files that contain
# the graphics data
[GraphicsRoms]
# these are numbered, starting with 1, through the number of required roms.
# order in this file of the numbers does not matter. If there are 1, 2, 3,
# and 5 (no 4), then it will stop at 3.
#
# The fields are seperated by spaces, and are as follows:
# (offset) (size) (filename)
Rom1 = 0 4096 pacman.5e
Rom2 = 4096 4096 pacman.5f
# Offset: Location or order of the rom file in memory (in bytes)
# Size: File size of the rom file (in bytes)
# Filename: The name of the rom file. (case insensitive)
#
# Above: pacman.5e starts at memory location 0 and is 4096 bytes large
# pacman.5f starts at memory location 4096 and is 4096 bytes large

# Decode1: As above, the graphics decode banks start at 1, and there are
# as many of them as in "GfxDecodes" above.
[Decode1]
# start: location in the memory space where this, the first bank begins
start = 0
# width: number of bits wide each sprite is.
width = 8
# height: number of bits tall each sprite is.
height = 8
# total: number of sprites in this bank
total = 256
#planes: number of bitplanes in this bank:
# 1 plane = 2^1 or 2 colors
# 2 planes = 2^2 or 4 colors
# 3 planes = 2^3 or 8 colors
# 4 planes = 2^4 or 16 colors
# 5 planes = 2^5 or 32 colors
# 8 planes = 2^8 or 256 colors
planes = 2
# planeoffsets: there should be as many of these as there are planes. They
# are seperated by spaces. In this example, on plane 0, the
# first plane, each sprite starts at 0. Plane 1 starts
# at 4 *BITS* off from the beginning of the sprite.
planeoffsets = 0 4
# xoffsets: the offsets from each sprite start point for each bit for the
# beginnings of each row of pixels
xoffsets = 56 48 40 32 24 16 8 0
# yoffsets: the offsets from each sprite start point for each bit for the
# beginnings of each column of pixels
yoffsets = 64 65 66 67 0 1 2 3
# charincrement: the number of bits to add to the start point to go to
# the next sprite.
charincrement = 128

# here's an example using the above:
# sprite 0: starts at (start) or (0), and is (2) planes deep.
# plane 1 starts at (start+planeoffset1) or (0 + 0)
# The first row (8 pixels wide) of bits can be found at:
# 0+yoffset1+xoffset1, 0+yoffset1+xoffset2, 0+yoffset1+xoffset3, etc.
# 0+64+56, 0+64+48, 0+64+40, etc...
#
# the next plane starts at (4) and, using the example as above is:
# 4+yoffset1+xoffset1, 4+yoffset1+xoffset2, 4+yoffset1+xoffset3, etc.
# 4+64+56, 4+64+48, 4+64+40, etc...
#
# the next sprite starts at (0+128) (bits, not bytes)
# it's first plane starts at (0+128+0)
# it's second plane starts at (0+128+4)
#
# the next sprite starts at (0+256) (bits, not bytes)
# it's first plane starts at (0+256+0)
# it's second plane starts at (0+256+4)
#
# and so on...
#
# ... I think ...

[Decode2]
# bank 2
start = 4096
width = 16
height = 16
total = 64
planes = 2
planeoffsets = 0 4
xoffsets = 312 304 296 288 280 272 264 256 56 48 40 32 24 16 8 0
yoffsets = 64 65 66 67 128 129 130 131 192 193 194 195 0 1 2 3
charincrement = 512

[Decode3]
# bank 3
start = 0
width = 16
height = 16
total = 64
planes = 2
planeoffsets = 0 4
xoffsets = 184 176 168 160 152 144 136 128 56 48 40 32 24 16 8 0
yoffsets = 64 65 66 67 0 1 2 3 320 321 322 323 256 257 258 259
charincrement = 512

[Decode4]
# bank 4
start = 0
width = 16
height = 16
total = 64
planes = 2
planeoffsets = 0 4
xoffsets = 56 48 40 32 24 16 8 0 184 176 168 160 152 144 136 128
yoffsets = 64 65 66 67 0 1 2 3 320 321 322 323 256 257 258 259
charincrement = 512

# Palette: This is where all of the palettes are stored
[Palette]
# as above, these start at 1, and increment from there.
# they are space sperated as above as well.
Palette1 = 4 0 0 0 50 50 50 0 0 30 50 0 0
# (number of colors) (color1 red) (color1 green) (color1 blue)
# (color2 red) (color2 green) (color2 blue)
# etc...
#
# in the above example, there are 4 colors, the first color being (0,0,0).
# second color is (50, 50, 50), etc. The values go from 0 (no color)
# to 63 (full color). Black is "0 0 0" and white is "63 63 63"
Palette2 = 4 0 0 0 0 50 0 0 0 30 50 40 20
Palette3 = 4 0 0 0 0 0 50 60 0 0 60 60 0
Palette4 = 4 0 0 0 50 0 0 30 30 0 50 50 50
Palette5 = 4 0 0 0 50 0 0 0 50 0 50 50 50
Palette6 = 4 0 0 0 40 40 0 0 50 0 30 30 0
Palette7 = 4 0 0 0 50 50 0 30 30 50 50 50 50
Palette8 = 4 0 0 0 50 0 0 30 30 0 50 50 50
Palette9 = 4 0 0 0 0 40 50 0 50 0 50 50 50
Palette10 = 4 0 0 0 0 0 0 30 30 50 50 50 50
Palette11 = 4 60 0 0 60 60 60 0 60 0 0 0 50
Palette12 = 4 0 0 0 60 60 60 0 0 0 0 0 50

#
# the next sections are all for the map and text editing, which is not
# yet supported by TURACO, therefore I will not explain it yet.
#
[DataRoms]
Rom1 = 0 4096 pacman.6e
Rom2 = 4096 4096 pacman.6f
Rom3 = 8192 4096 pacman.6h
Rom4 = 12288 4096 pacman.6j

[Map1]
MapType = pacman
StartAddress = 3436
OverlayAddress = 35B5
OverlayCount = 240
Width = 28
Height = 32
Gfx_Bank = 1
HC1 = 1 4
HC2 = 26 4
HC3 = 1 24
HC4 = 26 24

[Lookup1]
LU1 = a 41 b 42 c 43 d 44 e 45 f 46 g 47 h 48
LU2 = i 49 j 4a k 4b l 4c m 4d n 4e o 4f p 50
LU3 = q 51 r 52 s 53 t 54 u 55 v 56 w 57 x 58
LU4 = y 59 z 5a A 41 B 42 C 43 D 44 E 45 F 46
LU5 = G 47 H 48 I 49 J 4a K 4b L 4c M 4d N 4e
LU6 = O 4f P 50 Q 51 R 52 S 53 T 54 U 55 V 56
LU7 = W 57 X 58 Y 59 Z 5a 0 30 1 31 2 32 3 33
LU8 = 4 34 5 35 6 36 7 37 8 38 9 39 . 25 / 3a
LU9 = ! 5b @ 5c 40 - 3b " 26 ' 27 [ 5d ] 5e
LU10 = \ 5f # 28 $ 29 % 2a ^ 2b & 2c * 2d ( 2e
LU11 = 0 40

[String_Category1]
Name = Main Ghost Names
Gfx_Bank = 1
Lookup = 1
String1 = 3d59 10 "Red Name"
String2 = 3d69 9 "Red Nick"
String3 = 3d78 10 "Pink Name"
String4 = 3d88 9 "Pink Nick"
String5 = 3d97 10 "Aqua Name"
String6 = 3da7 9 "Aqua Nick"
String7 = 3db6 10 "Orange Name"
String8 = 3dc6 9 "Orange Nick"

[String_Category2]
Name = Alt. Ghost Names
Gfx_Bank = 1
Lookup = 1
String1 = 3dd5 10 "Red Name"
String2 = 3de5 9 "Red Nick"
String3 = 3df4 10 "Pink Name"
String4 = 3e04 9 "Pink Nick"
String5 = 3e13 10 "Aqua Name"
String6 = 3e23 9 "Aqua Nick"
String7 = 3e32 10 "Orange Name"
String8 = 3e42 9 "Orange Nick"
 
I tried to run this on my (now off-line) win 10 machine, but I get a "vcruntime140.dll not found" error.
What's the safest next-step to get this running? (should the Binary Release even be reliant on vcruntime140.dll?)

Installing the Visual C++ Redistributable Runtime Library doesn't fix the issue. WinTuraco.exe still asks for vcruntime140.dll.

So far, I haven't located a standalone installer for Microsoft VisualStudio on Win10.
There's the Network Install option, but you'd need a Win11 PC to safely download and configure the install.
I've got the installers for 32bit XP, and a laptop to compile it, but that may be a stretch as I haven't done this kind of stuff in 25 years...

Any help would be appreciated!
 
Last edited:
I tried to run this on my (now off-line) win 10 machine, but I get a "vcruntime140.dll not found" error.
What's the safest next-step to get this running? (should the Binary Release even be reliant on vcruntime140.dll?)

Installing the Visual C++ Redistributable Runtime Library doesn't fix the issue. WinTuraco.exe still asks for vcruntime140.dll.

So far, I haven't located a standalone installer for Microsoft VisualStudio on Win10.
There's the Network Install option, but you'd need a Win11 PC to safely download and configure the install.
I've got the installers for 32bit XP, and a laptop to compile it, but that may be a stretch as I haven't done this kind of stuff in 25 years...

Any help would be appreciated!
I have updated the executable on Github using static linking which should remove this dependence on VCRUNTIME140.DLL. Hopefully if you download it again it should now work.
 
Just so everybody has the link, here are a bunch of different graphics hacking utils. I already filtered by arcade games but there are also hacks for specific platforms or games:


When I get home I'll see what I have. I've been collecting these utils for decades. I believe Turaco CL was the latest (and last) version of Turaco. From the above link you can grab it along with all the drivers.
 
Made a few more improvements to handling of scrollbars and uploaded to Github. I'm actively using Turaco while working once again on a vector version of Donkey Kong (old video here), so I'm correcting bugs as I come across them...
Hey hey! Progress! I was able to run the app, and look for a game, but each game I tried would give the same error "Palettes Corrupt, Cols = 2, 1"

Here's the debug window (super handy BYW):

Code:
DEBUG: try_loading_the_driver called with: drivers\TAZMANIA.INI
DEBUG: Loading driver - Full path: drivers\TAZMANIA.INI
DEBUG: Driver filename: TAZMANIA.INI
DEBUG: ROMDirName (game name): TAZMANIA
Parsing default values: 0 16384
  default[0] = '0'
  default[1] = '16384'
Default values parsed into 2 tokens
Parsing default values: 0 1 2 3 4 5 6 7
  default[0] = '0'
  default[1] = '1'
  default[2] = '2'
  default[3] = '3'
  default[4] = '4'
  default[5] = '5'
  default[6] = '6'
  default[7] = '7'
Default values parsed into 8 tokens
get_config_int_array: [Decode1] xoffsets, argc = 8, max_count = 64
  array[0] = 0 (from '0')
  array[1] = 1 (from '1')
  array[2] = 2 (from '2')
  array[3] = 3 (from '3')
  array[4] = 4 (from '4')
  array[5] = 5 (from '5')
  array[6] = 6 (from '6')
  array[7] = 7 (from '7')
get_config_int_array: parsed 8 values
Parsing default values: 0 8 16 24 32 40 48 56
  default[0] = '0'
  default[1] = '8'
  default[2] = '16'
  default[3] = '24'
  default[4] = '32'
  default[5] = '40'
  default[6] = '48'
  default[7] = '56'
Default values parsed into 8 tokens
get_config_int_array: [Decode1] yoffsets, argc = 8, max_count = 64
  array[0] = 0 (from '0')
  array[1] = 8 (from '8')
  array[2] = 16 (from '16')
  array[3] = 24 (from '24')
  array[4] = 32 (from '32')
  array[5] = 40 (from '40')
  array[6] = 48 (from '48')
  array[7] = 56 (from '56')
get_config_int_array: parsed 8 values
Parsing default values: 0 16384
  default[0] = '0'
  default[1] = '16384'
Default values parsed into 2 tokens
Parsing default values: 0 1 2 3 4 5 6 7 64 65 66 67 68 69 70 71
  default[0] = '0'
  default[1] = '1'
  default[2] = '2'
  default[3] = '3'
  default[4] = '4'
  default[5] = '5'
  default[6] = '6'
  default[7] = '7'
  default[8] = '64'
  default[9] = '65'
  default[10] = '66'
  default[11] = '67'
  default[12] = '68'
  default[13] = '69'
  default[14] = '70'
  default[15] = '71'
Default values parsed into 16 tokens
get_config_int_array: [Decode2] xoffsets, argc = 16, max_count = 64
  array[0] = 0 (from '0')
  array[1] = 1 (from '1')
  array[2] = 2 (from '2')
  array[3] = 3 (from '3')
  array[4] = 4 (from '4')
  array[5] = 5 (from '5')
  array[6] = 6 (from '6')
  array[7] = 7 (from '7')
  array[8] = 64 (from '64')
  array[9] = 65 (from '65')
  array[10] = 66 (from '66')
  array[11] = 67 (from '67')
  array[12] = 68 (from '68')
  array[13] = 69 (from '69')
  array[14] = 70 (from '70')
  array[15] = 71 (from '71')
get_config_int_array: parsed 16 values
Parsing default values: 0 8 16 24 32 40 48 56 128 136 144 152 160 168 176 184
  default[0] = '0'
  default[1] = '8'
  default[2] = '16'
  default[3] = '24'
  default[4] = '32'
  default[5] = '40'
  default[6] = '48'
  default[7] = '56'
  default[8] = '128'
  default[9] = '136'
  default[10] = '144'
  default[11] = '152'
  default[12] = '160'
  default[13] = '168'
  default[14] = '176'
  default[15] = '184'
Default values parsed into 16 tokens
get_config_int_array: [Decode2] yoffsets, argc = 16, max_count = 64
  array[0] = 0 (from '0')
  array[1] = 8 (from '8')
  array[2] = 16 (from '16')
  array[3] = 24 (from '24')
  array[4] = 32 (from '32')
  array[5] = 40 (from '40')
  array[6] = 48 (from '48')
  array[7] = 56 (from '56')
  array[8] = 128 (from '128')
  array[9] = 136 (from '136')
  array[10] = 144 (from '144')
  array[11] = 152 (from '152')
  array[12] = 160 (from '160')
  array[13] = 168 (from '168')
  array[14] = 176 (from '176')
  array[15] = 184 (from '184')
get_config_int_array: parsed 16 values
Parsing GraphicsRoms entry: 0 2048 5f.cpu
  rom[1] = '2048' (length)
  rom[2] = '5f.cpu' (filename)
GraphicsRoms parsed into 3 parts
Parsing GraphicsRoms entry: 2048 2048 5h.cpu
  rom[1] = '2048' (length)
  rom[2] = '5h.cpu' (filename)
GraphicsRoms parsed into 3 parts

=== DEBUG ROM LOADING ===
Number of ROMs: 2
ROM 1:
  Load Address: 0x0
  Size: 2048 bytes
  Alternate: NO
  ROM Name: '5f.cpu'
    FileExists: 5f.cpu
  FILE EXISTS: YES
ROM 2:
  Load Address: 0x800
  Size: 2048 bytes
  Alternate: NO
  ROM Name: '5h.cpu'
    FileExists: 5h.cpu
  FILE EXISTS: YES
=== END DEBUG ===

get_config_int_array: [Palette] Palette1, argc = 7, max_count = 200
  array[0] = 2 (from '2')
  array[1] = 0 (from '0')
  array[2] = 0 (from '0')
  array[3] = 0 (from '0')
  array[4] = 63 (from '63')
  array[5] = 0 (from '0')
  array[6] = 0 (from '0')
get_config_int_array: parsed 7 values
 
Hey hey! Progress! I was able to run the app, and look for a game, but each game I tried would give the same error "Palettes Corrupt, Cols = 2, 1"

Here's the debug window (super handy BYW):

DEBUG: try_loading_the_driver called with: drivers\TAZMANIA.INI
DEBUG: Loading driver - Full path: drivers\TAZMANIA.INI
...
I tested with Tazmania and got the same error. I have made the error checking on the INI files less strict, and now it loads correctly. I have updated Github if you want to try the latest version.
 
  • Like
Reactions: TSB
Back
Top Bottom