Subversion Repositories NedoOS

Rev

Rev 2286 | Blame | Compare with Previous | Last modification | View Log | Download

  1. ;Define ENABLE_FM to enable FM DACs
  2.  
  3. OPN_REG = 0xfffd
  4. OPN_DAT = 0xbffd
  5.  
  6.         macro opn_write_fm_reg chip_n
  7. ;e = register
  8. ;d = value
  9.         ld bc,OPN_REG
  10.         ifdef ENABLE_FM
  11.         ld a,chip_n+%11111000
  12.         else
  13.         ld a,chip_n+%11111100
  14.         endif
  15.         out (c),a
  16.         nop
  17.         nop
  18.         in f,(c)
  19.         jp m,$-4
  20.         out (c),e
  21.         nop
  22.         nop
  23.         in f,(c)
  24.         jp m,$-4
  25.         ld bc,OPN_DAT
  26.         out (c),d
  27.         endm
  28.  
  29. opnwriteall
  30. ;e = register
  31. ;d = value
  32.         call opnwritefm2
  33. opnwritefm1
  34. ;e = register
  35. ;d = value
  36.         opn_write_fm_reg 0
  37. .extradelay ;additional delay for FPGA systems
  38.         ld b,8
  39.         djnz $
  40.         ret
  41.  
  42. opnwritefm2
  43. ;e = register
  44. ;d = value
  45.         opn_write_fm_reg 1
  46. .extradelay ;additional delay for FPGA systems
  47.         ld b,8
  48.         djnz $
  49.         ret
  50.  
  51.         macro opn_write_fm_regs incr,incd
  52. ;e = base register
  53. ;d = value
  54. ;l = count
  55. .loop   call opnwriteall
  56.         IF incr
  57.         inc e
  58.         ENDIF
  59.         IF incd
  60.         inc d
  61.         ENDIF
  62.         dec l
  63.         jr nz,.loop
  64.         endm
  65.  
  66. opndisableextradelay
  67.         ld a,0xc9 ;ret opcode
  68.         ld (opnwritefm1.extradelay),a
  69.         ld (opnwritefm2.extradelay),a
  70.         ret
  71.  
  72. opninit
  73.         ld l,0xb4
  74.         ld de,0x0000
  75.         opn_write_fm_regs 1,0
  76. ;configure prescaler
  77.         ld de,0x002f
  78.         call opnwriteall
  79.         ld de,0x002d
  80.         jp opnwriteall
  81.  
  82. opnstoptimers
  83.         ld de,0x3027
  84.         call opnwriteall
  85.         ld de,0x0027
  86.         jp opnwriteall
  87.  
  88. opnmute
  89.         call opnstoptimers
  90. ;mute SSG
  91.         ld l,3
  92.         ld de,0x0008
  93.         opn_write_fm_regs 1,0
  94.         ld l,14
  95.         ld de,0x0000
  96.         opn_write_fm_regs 1,0
  97. ;max release rate
  98.         ld l,0x10
  99.         ld de,0x0f80
  100.         opn_write_fm_regs 1,0
  101. ;min total level
  102.         ld l,0x10
  103.         ld de,0x7f40
  104.         opn_write_fm_regs 1,0
  105. ;key off
  106.         ld l,0x04
  107.         ld de,0x0028
  108.         opn_write_fm_regs 0,1
  109. ;default tfm state
  110.         ld bc,OPN_REG
  111.         ld a,%11111111
  112.         out (c),a
  113.         ret
  114.