############################################################################### # # File: pengo.keg # # Description: # # This file contains the definition for Pengo. # # Author: Kevin Brisley # ############################################################################### # # The name of the game. # Pengo.Name: Pengo # # The desired FPS. # Pengo.FramesPerSecond: 60 # # The history and anecdote files. # Pengo.HistoryFile: pengo.his Pengo.TalesFile: pengo.tal # # Address spaces. # Pengo.NumSpaces: 1 # # The first address space is used by the Game CPU. It includes the following: # 0x00000-0x0FFFF (64K): Game RAM/ROM. # 0x10000-0x10000 (1Byte): Interrupt Disable. # 0x10001-0x10001 (1Byte): Gfx Bank # Pengo.Space1.Size: 0x10002 Pengo.Space1.NumROMs: 8 Pengo.Space1.ROM1.Description: pengopop.u8 @ 0x00000 Pengo.Space1.ROM2.Description: pengopop.u7 @ 0x01000 Pengo.Space1.ROM3.Description: pengopop.u15 @ 0x02000 Pengo.Space1.ROM4.Description: pengopop.u14 @ 0x03000 Pengo.Space1.ROM5.Description: pengopop.u21 @ 0x04000 Pengo.Space1.ROM6.Description: pengopop.u20 @ 0x05000 Pengo.Space1.ROM7.Description: pengopop.u32 @ 0x06000 Pengo.Space1.ROM8.Description: pengopop.u31 @ 0x07000 # # CPUs. # Pengo.NumCPUs: 1 # # CPU 1 (game). # Pengo.CPU1.Description: Game Pengo.CPU1.Type: Z80_OLD Pengo.CPU1.ClockSpeed: 3072000 Pengo.CPU1.Space: 1 Pengo.CPU1.IValue: 255 Pengo.CPU1.IDisable: 0x10000 # # The number of inputs. # Pengo.NumInputs: 4 Pengo.Input1.Description: Player 1 Controls Pengo.Input1.CPU: 1 Pengo.Input1.Location: 0x90c0 Pengo.Input1.Default: 0xff Pengo.Input2.Description: Player 2 Controls Pengo.Input2.CPU: 1 Pengo.Input2.Location: 0x9080 Pengo.Input2.Default: 0xff Pengo.Input3.Description: Dip Switches 1 Pengo.Input3.CPU: 1 Pengo.Input3.Location: 0x9040 Pengo.Input3.Default: 0xb0 Pengo.Input4.Description: Dip Switches 2 Pengo.Input4.CPU: 1 Pengo.Input4.Location: 0x9000 Pengo.Input4.Default: 0xff # # The number of outputs. # Pengo.NumOutputs: 2 Pengo.Output1.Description: Interrupt Disable Pengo.Output1.CPU: 1 Pengo.Output1.WLocation: 0x9040 Pengo.Output1.Location: 0x10000 Pengo.Output2.Description: Gfx Bank Pengo.Output2.CPU: 1 Pengo.Output2.WLocation: 0x9047 Pengo.Output2.Location: 0x10001 # # The keys used in the game. # Pengo.NumKeys: 16 # Player 1 Push Pengo.Key1.Key: KEY_SPACE Pengo.Key1.Joy: JOY_B1 Pengo.Key1.Mask: 0x80 Pengo.Key1.Input: 1 Pengo.Key1.Default: Off/1 # Credit Pengo.Key2.Key: KEY_3 Pengo.Key2.Mask: 0x40 Pengo.Key2.Input: 1 Pengo.Key2.Default: Off/1 # Coin Slot B Pengo.Key3.Key: KEY_9 Pengo.Key3.Mask: 0x20 Pengo.Key3.Input: 1 Pengo.Key3.Default: Off/1 # Coin Slot A Pengo.Key4.Key: KEY_8 Pengo.Key4.Mask: 0x10 Pengo.Key4.Input: 1 Pengo.Key4.Default: Off/1 # Player 1 Right Pengo.Key5.Key: KEY_RIGHT Pengo.Key5.Joy: JOY_RIGHT Pengo.Key5.Mask: 0x08 Pengo.Key5.Input: 1 Pengo.Key5.Default: Off/1 # Player 1 Left Pengo.Key6.Key: KEY_LEFT Pengo.Key6.Joy: JOY_LEFT Pengo.Key6.Mask: 0x04 Pengo.Key6.Input: 1 Pengo.Key6.Default: Off/1 # Player 1 Down Pengo.Key7.Key: KEY_DOWN Pengo.Key7.Joy: JOY_DOWN Pengo.Key7.Mask: 0x02 Pengo.Key7.Input: 1 Pengo.Key7.Default: Off/1 # Player 1 Up Pengo.Key8.Key: KEY_UP Pengo.Key8.Joy: JOY_UP Pengo.Key8.Mask: 0x01 Pengo.Key8.Input: 1 Pengo.Key8.Default: Off/1 # Player 2 Push Pengo.Key9.Key: KEY_A Pengo.Key9.Mask: 0x80 Pengo.Key9.Input: 2 Pengo.Key9.Default: Off/1 # Player 2 Start Pengo.Key10.Key: KEY_2 Pengo.Key10.Joy: JOY_B2 Pengo.Key10.Mask: 0x40 Pengo.Key10.Input: 2 Pengo.Key10.Default: Off/1 # Player 1 Start Pengo.Key11.Key: KEY_1 Pengo.Key11.Joy: JOY_B1 Pengo.Key11.Mask: 0x20 Pengo.Key11.Input: 2 Pengo.Key11.Default: Off/1 # Test. Pengo.Key12.Key: KEY_X Pengo.Key12.Mask: 0x10 Pengo.Key12.Input: 2 Pengo.Key12.Default: Off/1 # Player 2 Right Pengo.Key13.Key: KEY_L Pengo.Key13.Mask: 0x08 Pengo.Key13.Input: 2 Pengo.Key13.Default: Off/1 # Player 2 Left Pengo.Key14.Key: KEY_J Pengo.Key14.Mask: 0x04 Pengo.Key14.Input: 2 Pengo.Key14.Default: Off/1 # Player 2 Down Pengo.Key15.Key: KEY_K Pengo.Key15.Mask: 0x02 Pengo.Key15.Input: 2 Pengo.Key15.Default: Off/1 # Player 2 Up Pengo.Key16.Key: KEY_I Pengo.Key16.Mask: 0x01 Pengo.Key16.Input: 2 Pengo.Key16.Default: Off/1 # # The dip switches used in the game. # Pengo.NumDips: 0 # Difficulty Level (1 of 2) Pengo.Dip1.Description: Difficulty Level (1 of 2) Pengo.Dip1.Mask: 0x80 Pengo.Dip1.Input: 3 Pengo.Dip1.Default: Off/1 # Difficulty Level (2 of 2) Pengo.Dip2.Description: Difficulty Level (2 of 2) Pengo.Dip2.Mask: 0x40 Pengo.Dip2.Input: 3 Pengo.Dip2.Default: Off/1 # Rack Test Pengo.Dip3.Description: Rack Test Pengo.Dip3.Mask: 0x20 Pengo.Dip3.Input: 3 Pengo.Dip3.Default: On/0 # Number of Lives (1 of 2) Pengo.Dip4.Description: Number of Lives (1 of 2) Pengo.Dip4.Mask: 0x10 Pengo.Dip4.Input: 3 Pengo.Dip4.Default: Off/1 # Number of Lives (2 of 2). Pengo.Dip5.Description: Number of Lives (2 of 2) Pengo.Dip5.Mask: 0x08 Pengo.Dip5.Input: 3 Pengo.Dip5.Default: On/0 # Cabinet Type Pengo.Dip6.Description: Cabinet Type Pengo.Dip6.Mask: 0x04 Pengo.Dip6.Input: 3 Pengo.Dip6.Default: On/0 # Attract Mode Sounds Pengo.Dip7.Description: Attract Mode Sounds Pengo.Dip7.Mask: 0x02 Pengo.Dip7.Input: 3 Pengo.Dip7.Default: On/0 # Bonus Life Pengo.Dip8.Description: Bonus Life Pengo.Dip8.Mask: 0x01 Pengo.Dip8.Input: 3 Pengo.Dip8.Default: On/0 # # Screen Resolution. # Pengo.ScreenWidth: 224 Pengo.ScreenHeight: 288 # # Graphics Sets. # Pengo.NumGfxSets: 2 # # The first set contains the characters. # Pengo.GfxSet1.Width: 8 Pengo.GfxSet1.Height: 8 Pengo.GfxSet1.Number: 512 Pengo.GfxSet1.BPP: 2 Pengo.GfxSet1.BPs: 0 4 Pengo.GfxSet1.XBits: 56 48 40 32 24 16 8 0 Pengo.GfxSet1.YBits: 64 65 66 67 0 1 2 3 Pengo.GfxSet1.Increment: 128 Pengo.GfxSet1.NumROMs: 2 Pengo.GfxSet1.ROM1.Description: pengopop.u92, 0x0000, 0x1000 Pengo.GfxSet1.ROM2.Description: pengopop.105, 0x0000, 0x1000 # # The second set contains the sprites. # Pengo.GfxSet2.Width: 16 Pengo.GfxSet2.Height: 16 Pengo.GfxSet2.Number: 128 Pengo.GfxSet2.BPP: 2 Pengo.GfxSet2.BPs: 0 4 Pengo.GfxSet2.XBits: 312 304 296 288 280 272 264 256 \ 56 48 40 32 24 16 8 0 Pengo.GfxSet2.YBits: 64 65 66 67 128 129 130 131 \ 192 193 194 195 0 1 2 3 Pengo.GfxSet2.Increment: 512 Pengo.GfxSet2.NumROMs: 2 Pengo.GfxSet2.ROM1.Description: pengopop.u92, 0x1000, 0x1000 Pengo.GfxSet2.ROM2.Description: pengopop.105, 0x1000, 0x1000 # # Graphic Layers # Pengo.NumGfxLayers: 2 ############################################################################### # The first layer renders the characters. # # The video RAM starts at 0x08000 and is mapped as follows: # # /0x83dd 0x83dc 0x83db ... 0x83c3 0x83c2\ # \0x83fd 0x83fc 0x83fb ... 0x83e3 0x83e2/ # /0x83a0 0x8380 0x8360 ... 0x8060 0x8040\ # | 0x83a1 0x8381 0x8361 ... 0x8061 0x8041 | # ... ... ... ... ... # | 0x83be 0x839e 0x837e ... 0x807e 0x805e | # \0x83bf 0x839f 0x837f ... 0x807f 0x805f/ # /0x801d 0x801c 0x801b ... 0x8003 0x8002\ # \0x803d 0x803c 0x803b ... 0x8023 0x8022/ # # The colour RAM starts at 0x04400 and is mapped as follows: # # /0x87dd 0x87dc 0x87db ... 0x87c3 0x87c2\ # \0x87fd 0x87fc 0x87fb ... 0x87e3 0x87e2/ # /0x87a0 0x8780 0x8760 ... 0x8460 0x8440\ # | 0x87a1 0x8781 0x8761 ... 0x8461 0x8441 | # ... ... ... ... ... # | 0x87be 0x879e 0x877e ... 0x847e 0x845e | # \0x87bf 0x879f 0x877f ... 0x847f 0x845f/ # /0x841d 0x841c 0x841b ... 0x8403 0x8402\ # \0x843d 0x843c 0x843b ... 0x8423 0x8422/ # ############################################################################### Pengo.GfxLayer1.Lightweight: Yes Pengo.GfxLayer1.Space: 1 Pengo.GfxLayer1.GfxSet: 1 Pengo.GfxLayer1.Palette: 1 Pengo.GfxLayer1.ColourTable: 1 Pengo.GfxLayer1.Transparency: Off Pengo.GfxLayer1.Clipping: 0,223,0,287 Pengo.GfxLayer1.BlankChar: 64 Pengo.GfxLayer1.NumChars: 1024 Pengo.GfxLayer1.NumDirty: 3 Pengo.GfxLayer1.Dirty1.Start: 0x08000 Pengo.GfxLayer1.Dirty1.End: 0x083ff Pengo.GfxLayer1.Dirty1.CharsPerLoc: 1 Pengo.GfxLayer1.Dirty1.Assign: # Pengo.GfxLayer1.Dirty2.Start: 0x08400 Pengo.GfxLayer1.Dirty2.End: 0x087ff Pengo.GfxLayer1.Dirty2.CharsPerLoc: 1 Pengo.GfxLayer1.Dirty2.Assign: # Pengo.GfxLayer1.Dirty3.Start: 0x10001 Pengo.GfxLayer1.Dirty3.End: 0x10001 Pengo.GfxLayer1.Dirty3.CharsPerLoc: 1024 Pengo.GfxLayer1.Dirty3.Assign: $ Pengo.GfxLayer1.NumCharNums: 1 Pengo.GfxLayer1.CharNum1.Value: @0x10001 * 256 + @(0x08000 + #) Pengo.GfxLayer1.NumColours: 1 Pengo.GfxLayer1.Colour1.Value: @0x10001 * 128 + @(0x08400 + #) Pengo.GfxLayer1.NumXPoss: 1 Pengo.GfxLayer1.XPos1.Value: \ (# / 32) <= 1 ? (29 - # % 32) * 8 : \ (# / 32) >= 30 ? (29 - # % 32) * 8 : \ (29 - # / 32) * 8 Pengo.GfxLayer1.NumYPoss: 1 Pengo.GfxLayer1.YPos1.Value: \ (# / 32) <= 1 ? (# / 32 + 34) * 8 : \ (# / 32) >= 30 ? (# / 32 - 30) * 8 : \ (# % 32 + 2) * 8 ############################################################################### # The second layer renders the sprites. # # The sprite RAM is split in two, half at 0x08FF2 and the other half at # 0x09022. There are 2 sequential bytes per sprite and 6 sprites. # The following describes the 4 bytes: # # First half - # 0 : bit 0 indicates vertical flip # bit 1 indicates horizontal flip # bits 2-7 indicate the sprite number # 1 : Colour # # Second half - # 0 : X Position from right side of the screen. # 1 : Y Position from bottom of the screen. ############################################################################### Pengo.GfxLayer2.Space: 1 Pengo.GfxLayer2.GfxSet: 2 Pengo.GfxLayer2.Palette: 1 Pengo.GfxLayer2.ColourTable: 1 Pengo.GfxLayer2.Clipping: 0,223,16,287 Pengo.GfxLayer2.Transparency: Map Pengo.GfxLayer2.NumChars: 6 Pengo.GfxLayer2.NumDirty: 3 Pengo.GfxLayer2.Dirty1.Start: 0x08ff2 Pengo.GfxLayer2.Dirty1.End: 0x08ffd Pengo.GfxLayer2.Dirty1.CharsPerLoc: 1 Pengo.GfxLayer2.Dirty1.Assign: # / 2 Pengo.GfxLayer2.Dirty2.Start: 0x09022 Pengo.GfxLayer2.Dirty2.End: 0x0902d Pengo.GfxLayer2.Dirty2.CharsPerLoc: 1 Pengo.GfxLayer2.Dirty2.Assign: # / 2 Pengo.GfxLayer2.Dirty3.Start: 0x10001 Pengo.GfxLayer2.Dirty3.End: 0x10001 Pengo.GfxLayer2.Dirty3.CharsPerLoc: 6 Pengo.GfxLayer2.Dirty3.Assign: $ Pengo.GfxLayer2.NumCharNums: 1 Pengo.GfxLayer2.CharNum1.Value: \ @0x10001 * 64 + (@(0x08ff2 + 2 * #) >> 2) Pengo.GfxLayer2.NumColours: 1 Pengo.GfxLayer2.Colour1.Value: @0x10001 * 128 + @(0x08ff3 + 2 * #) Pengo.GfxLayer2.NumXPoss: 1 Pengo.GfxLayer2.XPos1.Value: 239 - @(0x09022 + 2 * #) Pengo.GfxLayer2.NumYPoss: 1 Pengo.GfxLayer2.YPos1.Value: 272 - @(0x09023 + 2 * #) Pengo.GfxLayer2.NumEnables: 1 Pengo.GfxLayer2.Enable1.Value: 1 Pengo.GfxLayer2.NumHFlips: 1 Pengo.GfxLayer2.HFlip1.Value: @(0x8ff2 + 2 * #) & 0x02 Pengo.GfxLayer2.NumVFlips: 1 Pengo.GfxLayer2.VFlip1.Value: @(0x8ff2 + 2 * #) & 0x01 # # Colour Palettes # Pengo.NumPalettes: 1 Pengo.Palette1.NumColours: 32 Pengo.Palette1.MaxValue: 255 Pengo.Palette1.Colour1.RGB: 0x00/0x00/0x00 Pengo.Palette1.Colour2.RGB: 0xde/0xde/0xff Pengo.Palette1.Colour3.RGB: 0xff/0x00/0x00 Pengo.Palette1.Colour4.RGB: 0x00/0xff/0x97 Pengo.Palette1.Colour5.RGB: 0x21/0x21/0x68 Pengo.Palette1.Colour6.RGB: 0x00/0xff/0xff Pengo.Palette1.Colour7.RGB: 0xff/0xff/0x97 Pengo.Palette1.Colour8.RGB: 0xff/0xb8/0xff Pengo.Palette1.Colour9.RGB: 0xff/0xb8/0xb8 Pengo.Palette1.Colour10.RGB: 0xde/0x47/0x00 Pengo.Palette1.Colour11.RGB: 0xff/0xb8/0x97 Pengo.Palette1.Colour12.RGB: 0xff/0xff/0xb8 Pengo.Palette1.Colour13.RGB: 0x00/0xde/0xff Pengo.Palette1.Colour14.RGB: 0xde/0xde/0x97 Pengo.Palette1.Colour15.RGB: 0x68/0x68/0x68 Pengo.Palette1.Colour16.RGB: 0xde/0x00/0x68 Pengo.Palette1.Colour17.RGB: 0x00/0x00/0x00 Pengo.Palette1.Colour18.RGB: 0xde/0xde/0xff Pengo.Palette1.Colour19.RGB: 0x00/0x68/0x68 Pengo.Palette1.Colour20.RGB: 0x00/0xde/0xff Pengo.Palette1.Colour21.RGB: 0x00/0xff/0xff Pengo.Palette1.Colour22.RGB: 0xde/0x47/0x00 Pengo.Palette1.Colour23.RGB: 0xff/0x00/0x00 Pengo.Palette1.Colour24.RGB: 0xff/0xb8/0x97 Pengo.Palette1.Colour25.RGB: 0xde/0xde/0x97 Pengo.Palette1.Colour26.RGB: 0xff/0xff/0x97 Pengo.Palette1.Colour27.RGB: 0xff/0xff/0xb8 Pengo.Palette1.Colour28.RGB: 0x00/0xb8/0x97 Pengo.Palette1.Colour29.RGB: 0x47/0xde/0x97 Pengo.Palette1.Colour30.RGB: 0x00/0xff/0x97 Pengo.Palette1.Colour31.RGB: 0xff/0xb8/0xff Pengo.Palette1.Colour32.RGB: 0xde/0x00/0x68 # # The colour lookup table. # Pengo.NumColourTables: 1 Pengo.ColourTable1.NumEntries: 256 Pengo.ColourTable1.List: \ 0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x01, \ 0x00,0x05,0x02,0x01,0x00,0x05,0x06,0x01, \ 0x00,0x05,0x07,0x01,0x00,0x05,0x0a,0x01, \ 0x00,0x05,0x0b,0x01,0x00,0x05,0x0c,0x01, \ 0x00,0x05,0x0d,0x01,0x00,0x05,0x04,0x01, \ 0x00,0x03,0x06,0x01,0x00,0x03,0x02,0x01, \ 0x00,0x03,0x07,0x01,0x00,0x03,0x05,0x01, \ 0x00,0x02,0x03,0x01,0x00,0x00,0x00,0x00, \ 0x00,0x08,0x03,0x01,0x00,0x09,0x02,0x05, \ 0x00,0x08,0x05,0x0d,0x04,0x04,0x04,0x04, \ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, \ 0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03, \ 0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07, \ 0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b, \ 0x00,0x01,0x01,0x01,0x00,0x05,0x05,0x05, \ 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, \ 0x00,0x00,0x00,0x00,0x00,0x13,0x17,0x1d, \ 0x00,0x1c,0x1f,0x1b,0x00,0x1c,0x1e,0x1b, \ 0x00,0x1c,0x16,0x1b,0x00,0x1c,0x17,0x1b, \ 0x00,0x1c,0x13,0x1b,0x00,0x1c,0x18,0x1b, \ 0x00,0x1c,0x1d,0x1b,0x00,0x1c,0x14,0x1b, \ 0x00,0x1c,0x19,0x1b,0x00,0x1c,0x15,0x1b, \ 0x00,0x1c,0x12,0x1b,0x00,0x1c,0x1b,0x12, \ 0x00,0x18,0x1c,0x12,0x00,0x18,0x1f,0x12, \ 0x00,0x13,0x12,0x11,0x00,0x12,0x1f,0x13, \ 0x00,0x1f,0x1e,0x12,0x00,0x1e,0x17,0x1f, \ 0x00,0x17,0x16,0x1e,0x00,0x16,0x15,0x17, \ 0x00,0x15,0x00,0x16,0x00,0x00,0x1b,0x15, \ 0x00,0x1b,0x1c,0x00,0x00,0x1c,0x1d,0x1b, \ 0x00,0x1d,0x18,0x1c,0x00,0x18,0x19,0x1d, \ 0x00,0x19,0x1a,0x18,0x00,0x1a,0x11,0x19, \ 0x00,0x11,0x14,0x1a,0x00,0x14,0x13,0x11