awesomenes

package
v0.0.0-...-09d7b4b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 7, 2019 License: MIT Imports: 4 Imported by: 0

Documentation

Index

Constants

View Source
const (
	CONTROLLER_BUTTONS_A = iota
	CONTROLLER_BUTTONS_B
	CONTROLLER_BUTTONS_SELECT
	CONTROLLER_BUTTONS_START
	CONTROLLER_BUTTONS_UP
	CONTROLLER_BUTTONS_DOWN
	CONTROLLER_BUTTONS_LEFT
	CONTROLLER_BUTTONS_RIGHT
)
View Source
const (
	StatusFlagC = iota
	StatusFlagZ
	StatusFlagI
	StatusFlagD
	StatusFlagB
	StatusFlagU
	StatusFlagV
	StatusFlagN
)
View Source
const (
	MEM_STACK_BASE = 0x100
	CPU_FREQ       = 1789773
)
View Source
const (
	AddrModeAbs addressingMode = iota
	AddrModeAbsX
	AddrModeAbsY
	AddrModeAccumulator
	AddrModeImmediate
	AddrModeImplied
	AddrModeIndirect
	AddrModeXIndirect
	AddrModeIndirectY
	AddrModeRelative
	AddrModeZeroPage
	AddrModeZeroX
	AddrModeZeroY
)
View Source
const (
	// 1kB
	MAPPER4_CHRROM_BANK_SIZE = 0x0400
	// 8kB
	MAPPER4_PRGROM_BANK_SIZE = 0x2000
)
View Source
const (
	MS_READ_EXT  = false
	MS_WRITE_EXT = true
)
View Source
const (
	SCANLINE_TYPE_PRE     = 0x1
	SCANLINE_TYPE_VISIBLE = 0x2
	SCANLINE_TYPE_POST    = 0x3
	SCANLINE_TYPE_VBLANK  = 0x4

	SCANLINE_NMI = 241

	DOT_TYPE_VISIBLE   = 0x1
	DOT_TYPE_PREFETCH  = 0x2
	DOT_TYPE_INVISIBLE = 0x3
)
View Source
const (
	SCREEN_WIDTH  = 256
	SCREEN_HEIGHT = 240
)

Variables

View Source
var Palette = [64]uint32{
	0x7C7C7C, 0x0000FC, 0x0000BC, 0x4428BC, 0x940084, 0xA80020, 0xA81000, 0x881400,
	0x503000, 0x007800, 0x006800, 0x005800, 0x004058, 0x000000, 0x000000, 0x000000,
	0xBCBCBC, 0x0078F8, 0x0058F8, 0x6844FC, 0xD800CC, 0xE40058, 0xF83800, 0xE45C10,
	0xAC7C00, 0x00B800, 0x00A800, 0x00A844, 0x008888, 0x000000, 0x000000, 0x000000,
	0xF8F8F8, 0x3CBCFC, 0x6888FC, 0x9878F8, 0xF878F8, 0xF85898, 0xF87858, 0xFCA044,
	0xF8B800, 0xB8F818, 0x58D854, 0x58F898, 0x00E8D8, 0x787878, 0x000000, 0x000000,
	0xFCFCFC, 0xA4E4FC, 0xB8B8F8, 0xD8B8F8, 0xF8B8F8, 0xF8A4C0, 0xF0D0B0, 0xFCE0A8,
	0xF8D878, 0xD8F878, 0xB8F8B8, 0xB8F8D8, 0x00FCFC, 0xF8D8F8, 0x000000, 0x000000,
}

From http://www.thealmightyguru.com/Games/Hacking/Wiki/index.php?title=NES_Palette

Functions

This section is empty.

Types

type AddrSpace

type AddrSpace interface {
	Read8(addr uint16) uint8
	Write8(addr uint16, v uint8)

	Read16(addr uint16) uint16
	Write16(addr uint16, v uint16)
}

type CPU

type CPU struct {
	// contains filtered or unexported fields
}

func MakeCPU

func MakeCPU(addrSpace AddrSpace) *CPU

func (*CPU) Pop16

func (c *CPU) Pop16() uint16

func (*CPU) Pop8

func (c *CPU) Pop8() uint8

func (*CPU) Push16

func (c *CPU) Push16(v uint16)

func (*CPU) Push8

func (c *CPU) Push8(v uint8)

func (*CPU) Run

func (cpu *CPU) Run() int

func (*CPU) String

func (cpu *CPU) String() string

Same format as the logs for nestest and the awesome github.com/fogleman/nes for debugging

type CPUAddrSpace

type CPUAddrSpace struct {
	RAM Memory
	ROM *Rom

	PPU *PPU

	Mapper Mapper
	// contains filtered or unexported fields
}

func MakeCPUAddrSpace

func MakeCPUAddrSpace(rom *Rom, ppu *PPU, ctrlr *Controller, mapper Mapper) *CPUAddrSpace

func (*CPUAddrSpace) Read16

func (as *CPUAddrSpace) Read16(addr uint16) uint16

Little-endian mem layout

func (*CPUAddrSpace) Read8

func (as *CPUAddrSpace) Read8(addr uint16) uint8

http://wiki.nesdev.com/w/index.php/CPU_memory_map https://wiki.nesdev.com/w/index.php/NROM (Hard coded mapper 0 for now)

func (*CPUAddrSpace) Write16

func (as *CPUAddrSpace) Write16(addr uint16, v uint16)

func (*CPUAddrSpace) Write8

func (as *CPUAddrSpace) Write8(addr uint16, v uint8)

type Controller

type Controller struct {
	// contains filtered or unexported fields
}

func MakeController

func MakeController() *Controller

func (*Controller) PushButton

func (ctrl *Controller) PushButton(btn uint8)

func (*Controller) ReadState

func (ctrl *Controller) ReadState() uint8

func (*Controller) ReleaseButton

func (ctrl *Controller) ReleaseButton(btn uint8)

func (*Controller) Write

func (ctrl *Controller) Write(v uint8)

type Mapper

type Mapper interface {
	Read8(addr uint16) uint8
	Write8(addr uint16, v uint8)
}

func MakeMapper

func MakeMapper(rom *Rom) Mapper

type Mapper0

type Mapper0 struct {
	ROM *Rom
}

func (*Mapper0) Read8

func (m *Mapper0) Read8(addr uint16) uint8

func (*Mapper0) Write8

func (m *Mapper0) Write8(addr uint16, v uint8)

type Mapper3

type Mapper3 struct {
	ROM *Rom
	// contains filtered or unexported fields
}

func (*Mapper3) Read8

func (m *Mapper3) Read8(addr uint16) uint8

func (*Mapper3) Write8

func (m *Mapper3) Write8(addr uint16, v uint8)

type Mapper4

type Mapper4 struct {
	ROM *Rom

	// Written at 0x8000 - 0xa0000 (on even addrs)
	Register uint8

	// R0 - R7 internal registers
	BankRegisters [8]uint8

	// 8 1kB regions
	CHRMappings [8]uint8

	// 4 8kB regions
	PRGMappings [4]uint8
}

func MakeMapper4

func MakeMapper4(rom *Rom) *Mapper4

func (*Mapper4) Read8

func (m *Mapper4) Read8(addr uint16) uint8

func (*Mapper4) Write8

func (m *Mapper4) Write8(addr uint16, v uint8)

type Memory

type Memory []uint8

func (Memory) Dump

func (m Memory) Dump(addr, amount uint16)

func (Memory) Read8

func (m Memory) Read8(p uint16) uint8

func (Memory) Write8

func (m Memory) Write8(p uint16, v uint8)

type OAMEntry

type OAMEntry struct {
	// contains filtered or unexported fields
}

type PPU

type PPU struct {
	CTRL   *PPUCTRL
	ADDR   *PPUADDR
	MASK   *PPUMASK
	STATUS *PPUSTATUS

	CPU *CPU

	TV     *TV
	Mapper Mapper

	Pixels []byte

	ReadDataBuffer uint8

	Scanline int
	Dot      int

	NameTableLatch uint8
	AttrTableLatch uint8

	// Background latches & shift registers
	BgLatchLow      uint8
	BgLatchHigh     uint8
	BgTileShiftLow  uint16
	BgTileShiftHigh uint16

	// Attribute latches & shift registers
	AttrLatchLow  uint8
	AttrLatchHigh uint8
	AttrShiftLow  uint8
	AttrShiftHigh uint8

	Frame uint64 // frame counter
	// contains filtered or unexported fields
}

func MakePPU

func MakePPU(cpu *CPU, rom *Rom, mapper Mapper) *PPU

func (*PPU) EvalSpritePriority

func (ppu *PPU) EvalSpritePriority(x int, spritePixel uint8, backgroundPixel uint8, oamEntry *OAMEntry) uint8

func (*PPU) EvalSprites

func (ppu *PPU) EvalSprites()

func (*PPU) GetBgPixel

func (ppu *PPU) GetBgPixel() uint8

func (*PPU) GetCurrentOAMEntry

func (ppu *PPU) GetCurrentOAMEntry() *OAMEntry

func (*PPU) GetSpritePixel

func (ppu *PPU) GetSpritePixel(entry *OAMEntry) uint8

func (*PPU) HighBGTileAddr

func (ppu *PPU) HighBGTileAddr() uint16

func (*PPU) LowBGTileAddr

func (ppu *PPU) LowBGTileAddr() uint16

func (*PPU) Read

func (ppu *PPU) Read(address uint16) byte

func (*PPU) ReadData

func (ppu *PPU) ReadData() uint8

VRAM 0x0000 - 0x3eff reads are buffered! https://wiki.nesdev.com/w/index.php/PPU_registers#The_PPUDATA_read_buffer_.28post-fetch.29

func (*PPU) RenderSinglePixel

func (ppu *PPU) RenderSinglePixel()

func (*PPU) Reset

func (ppu *PPU) Reset()

func (*PPU) TickScanline

func (ppu *PPU) TickScanline()

func (*PPU) Write

func (ppu *PPU) Write(address uint16, value byte)

func (*PPU) WriteData

func (ppu *PPU) WriteData(v uint8)

type PPUADDR

type PPUADDR struct {
	// Internal PPU registers v, t, w, x
	VAddr       uint16
	TAddr       uint16
	WriteHi     bool
	FineXScroll uint8
}

func (*PPUADDR) AttrTableAddr

func (addr *PPUADDR) AttrTableAddr() uint16

http://wiki.nesdev.com/w/index.php/PPU_scrolling

func (*PPUADDR) FineY

func (addr *PPUADDR) FineY() uint16

func (*PPUADDR) NameTableAddr

func (addr *PPUADDR) NameTableAddr() uint16

func (*PPUADDR) SetOnCTRLWrite

func (addr *PPUADDR) SetOnCTRLWrite(v uint8)

func (*PPUADDR) SetOnSCROLLWrite

func (addr *PPUADDR) SetOnSCROLLWrite(v uint8)

http://wiki.nesdev.com/w/index.php/PPU_scrolling

func (*PPUADDR) SetOnSTATUSRead

func (addr *PPUADDR) SetOnSTATUSRead()

func (*PPUADDR) TransferX

func (addr *PPUADDR) TransferX()

http://wiki.nesdev.com/w/index.php/PPU_scrolling

func (*PPUADDR) TransferY

func (addr *PPUADDR) TransferY()

func (*PPUADDR) Write

func (addr *PPUADDR) Write(v uint8)

type PPUCTRL

type PPUCTRL struct {
	NameTableAddr     uint16
	VRAMReadIncrement uint16
	// Addr for 8x8 sprites only (ignored for 16x16)
	SpritePatTableAddr uint16
	BgTableAddr        uint16
	SpriteSize         uint8
	MasterSlave        bool
	NMIonVBlank        bool
}

func (*PPUCTRL) Set

func (ctrl *PPUCTRL) Set(v uint8)

type PPUMASK

type PPUMASK struct {
	// contains filtered or unexported fields
}

func (*PPUMASK) Set

func (mask *PPUMASK) Set(v uint8)

type PPUSTATUS

type PPUSTATUS struct {
	SpriteOverflow bool
	Sprite0Hit     bool
	VBlankStarted  bool

	// So we can simulate a dirty bus when reading CTRL
	LastWrite uint8
}

func (*PPUSTATUS) Get

func (status *PPUSTATUS) Get() (result uint8)

type Rom

type Rom struct {
	Header *RomHeader
	PRGROM Memory
	CHRROM Memory
	PRGRAM Memory
}

http://fms.komkon.org/EMUL8/NES.html

func ReadROM

func ReadROM(path string) *Rom

type RomHeader

type RomHeader struct {
	MapperN uint8

	// 16kB each
	NPRGROMBanks uint8

	// 8kB each
	NCHRROMBanks uint8

	HasTrainer bool

	VerticalMirror bool
}

type TV

type TV struct {
	// contains filtered or unexported fields
}

func MakeTV

func MakeTV() *TV

func (*TV) Cleanup

func (tv *TV) Cleanup()

func (*TV) SetFrame

func (tv *TV) SetFrame(pixels []byte)

func (*TV) ShowPixels

func (tv *TV) ShowPixels()

func (*TV) UpdateInputState

func (tv *TV) UpdateInputState(ctrlr *Controller)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL