?login_element?

Subversion Repositories NedoOS

Rev

Rev 1715 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. OPN_REG = 0xfffd
  2. OPN_DAT = 0xbffd
  3.  
  4.         macro opn_write_fm_reg chip_n
  5. ;e = register
  6. ;d = value
  7.         ld bc,OPN_REG
  8.         ld a,chip_n+%11111000
  9.         out (c),a
  10.         in a,(c)
  11.         rlca
  12.         jr c,$-3
  13.         out (c),e
  14.         in a,(c)
  15.         rlca
  16.         jr c,$-3
  17.         ld bc,OPN_DAT
  18.         out (c),d
  19.         endm
  20.  
  21. iscontrolregister
  22. ;a = register
  23. ;out: zf=1 if it's control register, zf=0 otherwise
  24.         cp 0x0e ;IO port
  25.         ret z
  26.         cp 0x0f ;IO port
  27.         ret z
  28.         cp 0x2d ;prescaler
  29.         ret z
  30.         cp 0x2e ;prescaler
  31.         ret z
  32.         cp 0x2f ;prescaler
  33.         ret
  34.  
  35. opnwritemusiconlyfm1
  36. ;skips writes to control registers
  37. ;e = register
  38. ;d = value
  39.         ld a,e
  40.         call iscontrolregister
  41.         ret z
  42.         cp 0x27 ;timers control
  43.         jr nz,opnwritefm1
  44.         ld a,d
  45.         ld (opntimerctrl),a
  46.         or %00001010 ;avoid altering timer B
  47.         ld d,a
  48. opnwritefm1
  49. ;e = register
  50. ;d = value
  51.         opn_write_fm_reg 0
  52.         ret
  53.  
  54. opnwritemusiconlyfm2
  55. ;skips writes to control registers
  56. ;e = register
  57. ;d = value
  58.         ld a,e
  59.         call iscontrolregister
  60.         ret z
  61. opnwritefm2
  62. ;e = register
  63. ;d = value
  64.         opn_write_fm_reg 1
  65.         ret
  66.  
  67.         macro opn_write_fm_regs incr,incd
  68. ;e = base register
  69. ;d = value
  70. ;l = count
  71. .loop
  72.         call opnwritefm1
  73.         call opnwritefm2
  74.         IF incr
  75.         inc e
  76.         ENDIF
  77.         IF incd
  78.         inc d
  79.         ENDIF
  80.         dec l
  81.         jr nz,.loop
  82.         endm
  83.  
  84. opninit
  85.         ld l,0xb4
  86.         ld de,0x0000
  87.         opn_write_fm_regs 1,0
  88.         ld de,0x002f
  89.         call opnwritefm1
  90.         call opnwritefm2
  91.         ld de,0x002d
  92.         call opnwritefm1
  93.         jp opnwritefm2
  94.  
  95. opnmute
  96.         ld l,3
  97.         ld de,0x0008
  98.         opn_write_fm_regs 1,0 ;mute SSG
  99.         ld l,14
  100.         ld de,0x0000
  101.         opn_write_fm_regs 1,0
  102.         ld l,0x10
  103.         ld de,0x0f80
  104.         opn_write_fm_regs 1,0 ;max release rate
  105.         ld l,0x10
  106.         ld de,0x7f40
  107.         opn_write_fm_regs 1,0 ;min total level
  108.         ld l,0x04
  109.         ld de,0x0028
  110.         opn_write_fm_regs 0,1 ;key off
  111.         ld bc,OPN_REG
  112.         ld a,%11111111
  113.         out (c),a
  114.         ret
  115.  
  116. opninittimer60hz
  117. ;       ld de,0xc626
  118.         ld de,0xca26
  119.         call opnwritefm1
  120.         ld de,0x2a27
  121.         jp opnwritefm1
  122.  
  123. opnwaittimer60hz
  124.         ld bc,OPN_REG
  125.         ld a,%11111000
  126.         out (c),a
  127. .waitloop
  128.         in a,(c)
  129.         and 2
  130.         jr z,.waitloop
  131.         ld de,0x2a27
  132. opntimerctrl=$+1
  133.         ld a,0
  134.         or d
  135.         ld d,a
  136.         jp opnwritefm1
  137.