millfork/include/nes_hardware.mfk

92 lines
2.0 KiB
Plaintext

#if not(NES)
#warn nes_hardware module should be only used on NES/Famicom targets
#endif
volatile byte ppu_ctrl @$2000
volatile byte ppu_mask @$2001
volatile byte ppu_status @$2002
volatile byte oam_addr @$2003
volatile byte oam_data @$2004
volatile byte ppu_scroll @$2005
volatile byte ppu_addr @$2006
volatile byte ppu_data @$2007
volatile byte oam_dma @$4014
// TODO: better names
volatile byte apu_pulse1_ctrl @$4000
volatile byte apu_pulse1_sweep @$4001
volatile word apu_pulse1_period @$4002
volatile byte apu_pulse2_ctrl @$4004
volatile byte apu_pulse2_sweep @$4005
volatile word apu_pulse2_period @$4006
volatile byte apu_triangle_unmute @$4008
volatile word apu_triangle_period @$400A
volatile byte apu_noise_ctrl @$400C
volatile byte apu_noise_period @$400E
volatile byte apu_dmc_ctrl @$4010
volatile byte apu_dmc_load @$4011
volatile byte apu_dmc_sample_addr @$4012
volatile byte apu_dmc_sample_length @$4013
volatile byte apu_status @$4015
volatile byte apu_frame_counter @$4017
volatile byte joypad1_ctrl @$4016
volatile byte joypad2_ctrl @$4017
inline asm byte strobe_joypad() {
? LDA #1
! STA joypad1_ctrl
? LSR
! STA joypad1_ctrl
? RTS
}
inline asm byte read_joypad1() {
! LDA joypad1_ctrl
? RTS
}
inline asm byte read_joypad2() {
! LDA joypad2_ctrl
? RTS
}
macro asm void simulate_reset() {
JMP (reset_vector.addr)
}
inline asm void ppu_set_addr(word register(ax) address) {
! STX ppu_addr
! STA ppu_addr
?RTS
}
inline asm byte read_ppu_status() {
! LDA ppu_status
? RTS
}
inline asm void ppu_set_scroll(byte register(a) xscroll, byte register(x) yscroll) {
BIT ppu_status
! STA ppu_scroll
! STX ppu_scroll
? RTS
}
inline asm void ppu_write_data(byte register(a) data) {
! STA ppu_data
? RTS
}
inline asm void ppu_oam_dma_write(byte register(a) page) {
! STA oam_dma
? RTS
}