Advertisement
WhiningCoil

SID Example ASM

Mar 25th, 2021
2,948
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.          *= $1000
  2. vwrite   = $fd
  3. vread    = $fb
  4. vcnt     = $bd
  5. vdur     = $b5
  6. vsid     = $a4
  7. v1freq   = $1400
  8. v2freq   = $1600
  9. v3freq   = $1800
  10. rcount   = $1a00
  11. wcount   = $1a01
  12. octave   = $1a02
  13. tempfr   = $1a03
  14. v1cnt    = $1a05
  15. v2cnt    = $1a06
  16. v3cnt    = $1a07
  17. v1dur    = $1a08
  18. v2dur    = $1a09
  19. v3dur    = $1a10
  20. irqtemp  = $1a11 ; 3 bytes
  21.  
  22. sid      = $d400
  23.  
  24.          lda #147
  25.          jsr $ffd2
  26.  
  27.          ; init some memory
  28.          ldx #0
  29.          ldy #0
  30.          stx rcount
  31.          stx wcount
  32.          stx v1cnt
  33.          stx v2cnt
  34.          stx v3cnt
  35.  
  36.          jsr setv1
  37.          jsr readmusic
  38.          jsr setv2
  39.          jsr readmusic
  40.          jsr setv3
  41.          jsr readmusic
  42.  
  43.          jmp init
  44.  
  45.          ; start reading music
  46. readmusic
  47.          ldx #0
  48.          ldy #0
  49.          stx rcount
  50.          stx wcount
  51.  
  52. readnote
  53.          ldy rcount
  54.          lda (vread),y
  55.          jsr $ffd2
  56.          sec
  57.          sbc #65
  58.          clc
  59.          asl a
  60.          asl a
  61.          tax
  62.          iny
  63.          lda (vread),y
  64.          cmp #35
  65.          bne nosharp
  66.          jsr $ffd2
  67.          inx
  68.          inx
  69.          iny
  70.          lda (vread),y
  71. nosharp
  72.          iny
  73.          jsr $ffd2
  74.          sec
  75.          sbc #47
  76.          sta octave
  77.          sty rcount
  78.          lda notes,x
  79.          sta tempfr
  80.          inx
  81.          lda notes,x
  82.          sta tempfr+1
  83.  
  84. setoct
  85.          dec octave
  86.          beq donoct
  87.  
  88.          clc
  89.          asl tempfr
  90.          rol tempfr+1
  91.          jmp setoct
  92.  
  93. donoct
  94.          ldy wcount
  95.          lda tempfr
  96.          sta (vwrite),y
  97.          lda tempfr+1
  98.          iny
  99.          sta (vwrite),y
  100.          iny
  101.          sty wcount
  102.  
  103.          ; read duration
  104.          ldy rcount
  105.          iny
  106.          lda (vread),y
  107.          jsr $ffd2
  108.          iny
  109.          sty rcount
  110.  
  111.          sec
  112.          sbc #48
  113.          ldy wcount
  114.          sta (vwrite),y
  115.          inc wcount
  116.  
  117.  
  118.          ldy rcount
  119.          inc rcount
  120.          lda (vread),y
  121.          cmp #0
  122.          beq readover
  123.          jsr $ffd2
  124.          jmp readnote
  125.  
  126. readover ldy wcount
  127.          sta (vwrite),y
  128.          lda #13
  129.          jsr $ffd2
  130.          jsr $ffd2
  131.          rts
  132.  
  133.  
  134.  
  135.          ; set up sid
  136. init     ldx #0
  137.          lda #0
  138. setsid   sta sid,x
  139.          inx
  140.          cpx #24
  141.          bne setsid
  142.  
  143.          lda #$f0
  144.          sta sid+6
  145.          sta sid+13
  146.          sta sid+20
  147.          lda #8
  148.          sta sid+3
  149.          sta sid+10
  150.          sta sid+17
  151.          lda #24
  152.          sta sid+5
  153.          lda #16
  154.          sta sid+12
  155.          lda #7
  156.          sta sid+24
  157.  
  158.          ; set up irq
  159.          sei
  160.          lda #$ff
  161.          sta $dc06
  162.          sta $dc07
  163.  
  164.          lda #<timeirq
  165.          sta $0314
  166.          lda #>timeirq
  167.          sta $0315
  168.  
  169.          lda #%00010001
  170.          sta $dc0f
  171.          lda #%10000010
  172.          sta $dc0d
  173.          cli
  174.  
  175. loop
  176.          jmp loop
  177.  
  178. timeirq
  179.          lda $dc0d
  180.          sta tempfr
  181.          tay
  182.          and #%00000001
  183.          beq timerb
  184.  
  185. timerb   tya
  186.          and #%00000010
  187.          beq irqend
  188.  
  189.          jsr setv1
  190.          jsr playv
  191.          jsr setv2
  192.          jsr playv
  193.          jsr setv3
  194.          jsr playv
  195.  
  196. irqend   jmp $ea31
  197.  
  198.  
  199. playv    ldx #0
  200.          lda (vcnt,x)
  201.          tay          ; y is voice count
  202.          lda (vdur,x) ; a is voice dur
  203.          cmp #0
  204.          bne decv
  205.  
  206.          lda (vwrite),y
  207.          sta irqtemp
  208.          iny
  209.          lda (vwrite),y
  210.          sta irqtemp+1
  211.  
  212.          ; check if freq is $0000
  213.          ora irqtemp
  214.          beq endv
  215.  
  216.          iny
  217.          lda (vwrite),y
  218.          sta (vdur,x)
  219.          lda #65
  220.          sta irqtemp+2
  221.          iny
  222.          tya
  223.          sta (vcnt,x)
  224.  
  225.          ldy #0
  226.          lda irqtemp
  227.          sta (vsid),y
  228.          iny
  229.          lda irqtemp+1
  230.          sta (vsid),y
  231.          ldy #4
  232.          lda irqtemp+2
  233.          sta (vsid),y
  234.          jmp playvend
  235.  
  236. decv     sec
  237.          sbc #1
  238.          sta (vdur,x)
  239.          cmp #1
  240.          bne playvend
  241.  
  242. endv     ldy #4
  243.          lda (vsid),y
  244.          and #$fe
  245.          sta (vsid),y
  246. playvend rts
  247.  
  248.  
  249. setv1    lda #<v1notes
  250.          sta vread
  251.          lda #>v1notes
  252.          sta vread+1
  253.          lda #<v1freq
  254.          sta vwrite
  255.          lda #>v1freq
  256.          sta vwrite+1
  257.          lda #<v1dur
  258.          sta vdur
  259.          lda #>v1dur
  260.          sta vdur+1
  261.          lda #<v1cnt
  262.          sta vcnt
  263.          lda #>v1cnt
  264.          sta vcnt+1
  265.          lda #<sid
  266.          sta vsid
  267.          lda #>sid
  268.          sta vsid+1
  269.          rts
  270.  
  271. setv2    lda #<v2notes
  272.          sta vread
  273.          lda #>v2notes
  274.          sta vread+1
  275.          lda #<v2freq
  276.          sta vwrite
  277.          lda #>v2freq
  278.          sta vwrite+1
  279.          lda #<v2cnt
  280.          sta vcnt
  281.          lda #>v2cnt
  282.          sta vcnt+1
  283.          lda #<v2dur
  284.          sta vdur
  285.          lda #>v2dur
  286.          sta vdur+1
  287.          lda #<(sid+7)
  288.          sta vsid
  289.          lda #>sid
  290.          sta vsid+1
  291.          rts
  292.  
  293. setv3    lda #<v3notes
  294.          sta vread
  295.          lda #>v3notes
  296.          sta vread+1
  297.          lda #<v3freq
  298.          sta vwrite
  299.          lda #>v3freq
  300.          sta vwrite+1
  301.          lda #<v3cnt
  302.          sta vcnt
  303.          lda #>v3cnt
  304.          sta vcnt+1
  305.          lda #<v3dur
  306.          sta vdur
  307.          lda #>v3dur
  308.          sta vdur+1
  309.          lda #<(sid+14)
  310.          sta vsid
  311.          lda #>sid
  312.          sta vsid+1
  313.          rts
  314.  
  315. v1notes  .text "D4,4 G4,4 G4,6 F#4,2 "
  316.          .text "G4,4 B4,4 B4,4 A4,4 "
  317.          .text "D5,4 D5,4 D5,6 C5,2 "
  318.          .text "B4,4 A4,4 B4,8 "
  319.          .text "D4,4 G4,4 G4,6 F#4,2 "
  320.          .text "G4,4 B4,4 B4,4 A4,4 "
  321.          .text "D5,4 A4,4 A4,6 F#4,2 "
  322.          .null "F#4,4 E4,4 D4,8"
  323.  
  324. v2notes  .text "D4,4 D4,4 D4,6 D4,2 "
  325.          .text "D4,4 G4,4 G4,4 F#4,4 "
  326.          .text "G4,4 F#4,4 E4,4 A4,4 "
  327.          .text "G4,4 F#4,4 G4,8 "
  328.          .text "D4,4 D4,4 D4,6 D4,2 "
  329.          .text "E4,4 G4,4 G4,8 "
  330.          .text "F#4,4 E4,4 F#4,6 D4,2 "
  331.          .null "D4,4 C#4,4 D4,8"
  332.  
  333. v3notes  .text "B3,4 B3,4 B3,6 A3,2 "
  334.          .text "B3,4 D4,4 D4,8 "
  335.          .text "D4,4 D4,4 C4,4 E4,4 "
  336.          .text "D4,4 D4,4 D4,8 "
  337.          .text "B3,4 B3,4 B3,6 A3,2 "
  338.          .text "B3,4 D4,4 C#4,8 "
  339.          .text "D4,4 E4,4 D4,6 A3,2 "
  340.          .null "B3,4 G3,4 F#3,8"
  341.  
  342. notes    .word 451,477,506,0,268,284,301
  343.          .word 318,337,0,358,379,401,425
  344.  
  345.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement