Millfork: a middle-level programming language targeting 6502- and Z80-based microcomputers and home consoles
This project is maintained by KarolS
The nes_hardware
module is imported automatically on NES targets.
It contains defintions for the NES’s memory-mapped registers, as well
as some joypad and PPU management routines.
PPU memory-mapped registers
Named memory locations for interfacing with the PPU’s memory-mapped registers.
Available variables:
byte ppu_ctrl @$2000
byte ppu_mask @$2001
byte ppu_status @$2002
byte oam_addr @$2003
byte oam_data @$2004
byte ppu_scroll @$2005
byte ppu_addr @$2006
byte ppu_data @$2007
byte oam_dma @$4014
byte strobe_joypad()
Strobes joypads in preparation for reading new joypad states.
byte read_joypad1()
Get joypad1’s state as a byte.
byte read_joypad2()
Get joypad2’s state as a byte.
void simulate_reset()
Simulates a hardware reset by jumping to the reset vector, which then calls main().
void ppu_set_addr(word register(ax) address)
Sets the PPU to point at the VRAM address at ax, usually in preparation for a write via ppu_write_data().
byte read_ppu_status()
Gets the PPU status byte.
void ppu_set_scroll(byte register(a) xscroll, byte register(x) yscroll)
Sets the PPU scroll register. Parameter a defines the horizontal (X-axis) scroll value, and parameter x defines the vertical (Y-axis) scroll value.
void ppu_write_data(byte register(a) data)
Writes a byte to the PPU’s VRAM at the address the PPU is currently pointing to. Usually used after a call to ppu_set_addr().
void ppu_oam_dma_write(byte register(a) page)
Initiates a DMA transfer of 256 bytes from CPU memory address $xx00-$xxFF to PPU OAM memory, where xx is the hexadecimal representation of parameter a.
The nes_mmc4
module is imported automatically on the NES MMC4 target
and contains routines related to MMC4 bankswitching.
void set_prg_bank(byte register(a) bank)
Changes the $8000-$BFFF PRG bank.
void set_chr_bank0(byte register(a) bank)
Changes the CHR bank 0 ($0000-$0fff in the PPU memory space).
The high nibble (0 or 1) selects between chrrom0
and chrrom1
segments.
The low nibble L (0-$F) selects a 4K-aligned address in the segment ($L000).
void set_chr_bank1(byte register(a) bank)
Changes the CHR bank 1 ($1000-$1fff in the PPU memory space).
The high nibble (0 or 1) selects between chrrom0
and chrrom1
segments.
The low nibble L (0-$F) selects a 4K-aligned address in the segment ($L000).
void set_vertical_mirroring()
Switches nametable mirroring to vertical.
void set_horizontal_mirroring()
Switches nametable mirroring to horizontal.
Provides an interface for reading joypads that is compatible with the joy
module.
alias input_a = input_btn
1 if A button pressed, 0 if not pressed.
byte input_b
1 if B button pressed, 0 if not pressed.
byte input_select
1 if Select button pressed, 0 if not pressed.
byte input_start
1 if Start button pressed, 0 if not pressed.
void read_joy1()
Reads the joypad from the port 1.
void read_joy2()
Reads the joypad from the port 2.
void read_also_joy1()
Reads the joypad from the port 1 and adds its readouts to the current readouts.
void read_also_joy2()
Reads the joypad from the port 2 and adds its readouts to the current readouts.
void nes_reset_joy()
alias reset_joy = nes_reset_joy!
Resets the state variables.
Defines the joystick in port 1 as the default joystick.
alias read_joy = read_joy1