NES 8-बिट सिंथेसाइज़र
Loading...
NES 6502 8-bit Synthesizer

NES 6502: 8-बिट सिंथेसाइज़र

सबसे पागलपन भरी डेमो: निन्टेंडो को एक संगीत उपकरण (थेरेमिन) में बदलें जो 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

यह कोड हाथ से लिखा हुआ 6502 असेंबली है। यह सीधे निन्टेंडो के साउंड चिप (APU) में निर्देश लिखता है और प्रक्रियात्मक ध्वनियाँ बनाता है। बटन A = स्क्वेयर वेव टोन। बटन B = नॉइज़ (शोर)। ऊपर/नीचे तीर पिच (स्वर की ऊँचाई) बदलते हैं। बाएँ/दाएँ तीर शोर की बनावट बदलते हैं। स्क्रीन आवृत्ति के अनुसार स्ट्रोबोस्कोपिक तरीके से प्रतिक्रिया देती है।

वास्तविक हार्डवेयर के लिए .nes ROM प्राप्त करें:

  • यह मज़ाक नहीं है। ऐप ने आपके लिए हाथ से वे बाइट्स (हेक्स) तैयार की हैं जो 6502 निर्देशों के अनुरूप हैं और iNES हेडर सहित एक मान्य ROM बना दी है।
  • बटन पर क्लिक करें और NES के लिए 16KB कार्ट्रिज के रूप में पूरी तरह कार्यात्मक संगीत उपकरण डाउनलोड करें।
  • इसे वास्तविक हार्डवेयर (फ्लैशकार्ट) पर अपलोड करें या कोई भी एमुलेटर आज़माएँ। हर बार जब आप तीर दबाते हैं, आप APU रजिस्टरों को एड्रेस $4002 और $400E पर ओवरराइट करते हैं।