Sintetizador NES de 8 bits
Loading...
NES 6502 8-bit Synthesizer

NES 6502: Sintetizador de 8 bits

La demo más loca: convierte tu Nintendo en un instrumento musical (theremin) usando el chip APU.

synth.asm
; ---------------------------------------------------------
; NES 8-BIT SYNTHESIZER / THEREMIN
; Promeni starou konzoli NES na plne funkcni hudebni nastroj.
; A = Square Wave, B = Noise
; Up/Down = Pitch, Left/Right = Noise textury
; Obrazovka stroboskopicky pulzuje s frekvenci zvuku
; ---------------------------------------------------------

.org $C000

RESET:
  SEI
  CLD
  LDX #$40
  STX $4017    ; Vypnout APU frame IRQ
  LDX #$FF
  TXS          ; Inicializace zasobniku
  INX
  STX $2000    ; Vypnout NMI
  STX $2001    ; Vypnout renderovani (PPU)
  STX $4010    ; Vypnout DMC IRQ

  ; Zapnuti APU kanalu: Pulse 1 a Noise
  LDA #$09
  STA $4015

  ; Pocatecni promenne ulozene do RAM
  LDA #$80
  STA $00      ; Pulse 1 frekvence (Low)
  LDA #$02
  STA $01      ; Pulse 1 frekvence (High)
  LDA #$05
  STA $02      ; Noise perioda
  LDA #$30
  STA $03      ; Pocatecni barva pozadi

MainLoop:
WaitVblank:
  BIT $2002
  BPL WaitVblank

  ; Latch ovladace
  LDA #$01
  STA $4016
  LDA #$00
  STA $4016

  ; -------------------------
  ; Tlacitko A (Square Wave)
  ; -------------------------
  LDA $4016
  AND #$01
  BEQ A_NotPressed
  LDA #$BF     ; Hlasitost MAX, Duty cycle 50%
  STA $4000
  JMP ReadB
A_NotPressed:
  LDA #$B0     ; Hlasitost 0
  STA $4000

  ; -------------------------
  ; Tlacitko B (Noise)
  ; -------------------------
ReadB:
  LDA $4016
  AND #$01
  BEQ B_NotPressed
  LDA #$3F     ; Hlasitost Noise MAX
  STA $400C
  JMP ReadSelect
B_NotPressed:
  LDA #$30     ; Hlasitost Noise 0
  STA $400C

ReadSelect:
  LDA $4016    ; Ignorovat Select
  LDA $4016    ; Ignorovat Start

  ; -------------------------
  ; D-Pad ovladani
  ; -------------------------
ReadUp:
  LDA $4016
  AND #$01
  BEQ ReadDown
  DEC $00      ; Snizit periodu pulsu -> Vyssí tón

ReadDown:
  LDA $4016
  AND #$01
  BEQ ReadLeft
  INC $00      ; Zvysit periodu pulsu -> Nizsi tón

ReadLeft:
  LDA $4016
  AND #$01
  BEQ ReadRight
  DEC $02      ; Snizit periodu sumu

ReadRight:
  LDA $4016
  AND #$01
  BEQ UpdateAPU
  INC $02      ; Zvysit periodu sumu

  ; -------------------------
  ; Zapis do HW registru
  ; -------------------------
UpdateAPU:
  ; Zapis Pulse 1 pitch do zvukoveho cipu
  LDA $00
  STA $4002
  LDA $01
  STA $4003

  ; Zapis Noise pitch
  LDA $02
  AND #$0F
  STA $400E
  LDA #$08
  STA $400F

  ; -------------------------
  ; Audio-Reaktivni vizualizace
  ; -------------------------
  ; Vypocet barvy pozadi z vysky tonu ($00)
  LDA $00
  LSR A
  LSR A
  LSR A
  LSR A        ; Vydelit 16 (ziskame hodnotu 0-15)
  CLC
  ADC #$11     ; Pridat offset k palete barev
  STA $03      ; Ulozit novou barvu

  ; Zapis barvy do grafickeho cipu (PPU)
  LDA #$3F
  STA $2006
  LDA #$00
  STA $2006
  LDA $03
  STA $2007

  ; Zapnout zobrazeni obrazu
  LDA #$1E
  STA $2001

  JMP MainLoop

NMI:
IRQ:
  RTI

; --- VECTORY ($FFFA) ---
.org $FFFA
.dw NMI
.dw RESET
.dw IRQ

Este código está escrito a mano en ensamblador 6502. Escribe instrucciones directamente en el chip de sonido (APU) de Nintendo y crea sonidos procedurales. Botón A = tono de onda cuadrada. Botón B = ruido. Las flechas Arriba/Abajo cambian la altura del tono (pitch). Las flechas Izquierda/Derecha cambian la textura del ruido. La pantalla parpadea en respuesta a la frecuencia.

Obtén la ROM .nes para hardware real:

  • Esto no es una broma. La aplicación ensambló a mano por ti los bytes (Hex) correspondientes a las instrucciones 6502 y generó una ROM válida, incluyendo el encabezado iNES.
  • Haz clic en el botón y descarga un instrumento musical totalmente funcional en forma de cartucho de 16 KB para NES.
  • Cárgalo en hardware real (flashcart) o prueba cualquier emulador. Cada vez que presionas una flecha, estás reescribiendo los registros de la APU en las direcciones $4002 y $400E.