?login_element?

Subversion Repositories NedoOS

Rev

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

  1. MOONSOUNDROMSIZE = 0x200000
  2. WAVETABLESIZE = 128 ;RAM samples only
  3. WAVEHEADERSIZE = 12
  4. WAVEHEADERBUFFERSIZE = WAVETABLESIZE*WAVEHEADERSIZE
  5.  
  6. opl4writemusiconlyfm1
  7. ;skips writes to control registers
  8. ;e = register
  9. ;d = value
  10.         ld a,e
  11.         cp 0x20
  12.         jr nc,opl4writefm1
  13.         cp 0x08
  14.         ret nz
  15. opl4writefm1
  16. ;e = register
  17. ;d = value
  18.         opl4_wait
  19.         ld a,e
  20.         out (MOON_REG1),a
  21.         opl4_wait
  22.         ld a,d
  23.         out (MOON_DAT1),a
  24.         ret
  25.  
  26. opl4writemusiconlyfm2
  27. ;skips writes to control registers
  28. ;e = register
  29. ;d = value
  30.         ld a,e
  31.         cp 0x05
  32.         jr nz,opl4writefm2
  33. ;TODO: skipping write to reg5 leads to a hang on some init sequences, but setting any
  34. ;value to reg5 resets timer state. Is it possible to do something better here?
  35.         ld d,3
  36.         call opl4writefm2
  37.         jp opl4inittimer60hz
  38.  
  39. opl4writefm2
  40. ;e = register
  41. ;d = value
  42.         opl4_wait
  43.         ld a,e
  44.         out (MOON_REG2),a
  45.         opl4_wait
  46.         ld a,d
  47.         out (MOON_DAT2),a
  48.         ret
  49.  
  50. opl4writewavemusiconly
  51. ;skips writes to control registers and handles ROM dumps
  52. ;e = register
  53. ;d = value
  54.         ld a,e
  55.         cp 0x38
  56.         jr nc,opl4writewave
  57.         cp 0x08
  58.         ret c
  59.         cp 0x20
  60.         jr c,writewavetableindexlo
  61. ;force wave table index into 384--511 range if ROM data is loaded
  62. isromloaded=$+1
  63.         ld a,0
  64.         or d
  65.         ld d,a
  66.         jr opl4writewave
  67. writewavetableindexlo
  68.         ld a,(isromloaded)
  69.         rrca
  70.         or d
  71.         ld d,a
  72.         call opl4writewave
  73. ;wait for the header to load
  74.         in a,(MOON_STAT)
  75.         and 3
  76.         jr nz,$-4
  77.         ret
  78.  
  79. opl4writewave
  80. ;e = register
  81. ;d = value
  82.         opl4_wait
  83.         ld a,e
  84.         out (MOON_WREG),a
  85.         opl4_wait
  86.         ld a,d
  87.         out (MOON_WDAT),a
  88.         ret
  89.  
  90. opl4readwave
  91. ;e = register
  92.         opl4_wait
  93.         ld a,e
  94.         out (MOON_WREG),a
  95.         opl4_wait
  96.         in a,(MOON_WDAT)
  97.         ret
  98.  
  99.         macro opl4_write_fm_regs
  100. ;e = base register
  101. ;d = value
  102. ;l = count
  103. .loop
  104.         call opl4writefm1
  105.         call opl4writefm2
  106.         inc e
  107.         dec l
  108.         jr nz,.loop
  109.         endm
  110.  
  111.         macro opl4_write_wave_regs
  112. ;e = base register
  113. ;d = value
  114. ;l = count
  115. .loop
  116.         call opl4writewave
  117.         inc e
  118.         dec l
  119.         jr nz,.loop
  120.         endm
  121.  
  122. opl4init
  123.         xor a
  124.         ld (isromloaded),a
  125.         ld hl,MOONSOUNDROMSIZE%65536
  126.         ld (opl4loadramdatablockheader.romsize0),hl
  127.         ld a,MOONSOUNDROMSIZE/65536
  128.         ld (opl4loadramdatablockheader.romsize2),a
  129.         ld de,0x0305
  130.         call opl4writefm2
  131.         ld l,0xda
  132.         ld de,0x0020
  133.         opl4_write_wave_regs
  134.         ld de,0x1bf8
  135.         call opl4writewave
  136.         ld de,0x1002
  137.         call opl4writewave
  138.         ld l,0xd6
  139.         ld de,0x0020
  140.         opl4_write_fm_regs
  141.         ld de,0x0001
  142.         call opl4writefm1
  143.         ld de,0x0008
  144.         call opl4writefm1
  145.         ld de,0x0004
  146.         call opl4writefm2
  147.         ld de,0x0005
  148.         jp opl4writefm2
  149.  
  150. opl4mute
  151.         ld de,0x00bd
  152.         call opl4writefm1 ;rhythm off
  153.         ld l,0x16
  154.         ld de,0x0f80
  155.         opl4_write_fm_regs ;max release rate
  156.         ld l,0x16
  157.         ld de,0x3f40
  158.         opl4_write_fm_regs ;min total level
  159.         ld l,0x09
  160.         ld de,0x00a0
  161.         opl4_write_fm_regs ;frequency 0
  162.         ld l,0x09
  163.         ld de,0x00b0
  164.         opl4_write_fm_regs ;key off
  165.         ld l,0x18
  166.         ld de,0x4068
  167.         opl4_write_wave_regs ;key off, damp
  168.         ld de,0x0005
  169.         jp opl4writefm2
  170.  
  171. opl4setmemoryaddress
  172. ;dhl = memory address
  173.         ld e,0x03
  174.         call opl4writewave
  175.         ld d,h
  176.         inc e
  177.         call opl4writewave
  178.         inc e
  179.         ld d,l
  180.         jp opl4writewave
  181.  
  182. opl4readmemory
  183. ;bc = byte count
  184. ;dhl = memory address
  185. ;ix = buffer
  186.         call opl4setmemoryaddress
  187.         ld de,0x1102
  188.         call opl4writewave
  189.         opl4_wait
  190.         ld a,6
  191.         out (MOON_WREG),a
  192.         ld de,ix
  193.         ld a,c
  194.         dec bc
  195.         inc b
  196.         ld c,b
  197.         ld b,a
  198. .readloop
  199.         opl4_wait
  200.         in a,(MOON_WDAT)
  201.         ld (de),a
  202.         inc de
  203.         djnz .readloop
  204.         dec c
  205.         jr nz,.readloop
  206.         ld de,0x1002
  207.         jp opl4writewave
  208.  
  209. opl4writememory
  210. ;bc = number of bytes
  211. ;dhl = memory address
  212. ;ix = buffer
  213.         call opl4setmemoryaddress
  214.         ld de,0x1102
  215.         call opl4writewave
  216.         opl4_wait
  217.         ld a,6
  218.         out (MOON_WREG),a
  219.         ld de,ix
  220.         ld a,c
  221.         dec bc
  222.         inc b
  223.         ld c,b
  224.         ld b,a
  225. .writeloop
  226.         opl4_wait
  227.         ld a,(de)
  228.         out (MOON_WDAT),a
  229.         inc de
  230.         djnz .writeloop
  231.         dec c
  232.         jr nz,.writeloop
  233.         ld de,0x1002
  234.         jp opl4writewave
  235.  
  236. sub24x16
  237. ;dhl = minuend
  238. ;bc = subtrahend
  239. ;out: cf=1 if negative result, zf=1 if zero
  240.         sub hl,bc
  241.         jr c,.carry
  242.         ret nz
  243.         ld a,d
  244.         or a
  245.         ret
  246. .carry
  247.         ld a,d
  248.         sbc a,0
  249.         ld d,a
  250.         ret nz
  251.         ld a,l
  252.         or h
  253.         ret
  254.  
  255. opl4loadromdatablockheader
  256. ;dhl = header+data size
  257. ;out: zf=1 if no data to load, dhl = data block size, dhl' = start address
  258.         exx
  259.         call memorybufferread4 ;adbc = total rom size
  260.         ld (opl4loadramdatablockheader.romsize0),bc
  261.         ld a,d
  262.         add 0x20 ;place in RAM
  263.         ld (opl4loadramdatablockheader.romsize2),a
  264.         call memorybufferread4 ;adbc = start address
  265.         ld hl,bc
  266.         set 5,d ;place in RAM
  267.         exx
  268.         ld bc,8
  269.         jr sub24x16
  270.  
  271. opl4loadramdatablockheader
  272. ;dhl = header+data size
  273. ;out: zf=1 if no data to load, dhl = data block size, dhl' = start address
  274.         exx
  275.         call memorybufferread4 ;adbc = total ram size
  276.         call memorybufferread4 ;adbc = start address
  277. .romsize0=$+1
  278.         ld hl,0
  279.         add hl,bc
  280. .romsize2=$+1
  281.         ld a,0
  282.         adc a,d
  283.         and 0x3f
  284.         ld d,a
  285.         exx
  286.         ld bc,8
  287.         jr sub24x16
  288.  
  289. setup24bitscounterloop
  290. ;dhl = counter
  291. ;out: b = inner loop counter, de = outer loop counter
  292.         ld e,l
  293.         ld bc,1
  294.         sub hl,bc
  295.         jr nc,$+3
  296.         dec d
  297.         ld b,e
  298.         ld e,h
  299.         inc de
  300.         ret
  301.  
  302. opl4loadsample
  303. ;dhl = sample start address
  304. ;dhl' = sample size
  305.         ld b,d
  306.         ld de,0x0305
  307.         call opl4writefm2
  308.         ld d,b
  309.         call opl4setmemoryaddress
  310.         ld de,0x1102
  311.         call opl4writewave
  312.         opl4_wait
  313.         ld a,6
  314.         out (MOON_WREG),a
  315.         exx
  316.         call setup24bitscounterloop
  317.         ld hl,(memorybuffercurrentaddr)
  318. .loop
  319.         memory_buffer_read_byte c
  320.         opl4_wait
  321.         ld a,c
  322.         out (MOON_WDAT),a
  323.         djnz .loop
  324.         dec de
  325.         ld a,e
  326.         or d
  327.         jr nz,.loop
  328.         ld (memorybuffercurrentaddr),hl
  329.         ld de,0x1002
  330.         jp opl4writewave
  331.  
  332. opl4loadramdatablock
  333. ;dhl = data+header size
  334.         call opl4loadramdatablockheader
  335.         ret z
  336.         exx
  337.         jr opl4loadsample
  338.  
  339. opl4loadromdatablock
  340. ;dhl = data+header size
  341.         call opl4loadromdatablockheader
  342.         ret z
  343.         exx
  344.         push de
  345.         call opl4loadsample
  346.         pop af
  347. ;check if the address is within the first 64K of RAM
  348.         cp 0x21
  349.         ret nc
  350. ;patch all 128 headers that LSI can read from RAM
  351.         ld a,1
  352.         ld (isromloaded),a
  353.         ld hl,MOONSOUNDROMSIZE%65536
  354.         ld d,MOONSOUNDROMSIZE/65536
  355.         ld bc,WAVEHEADERBUFFERSIZE
  356.         ld ix,waveheaderbuffer
  357.         call opl4readmemory
  358.         ld hl,waveheaderbuffer
  359.         ld de,WAVEHEADERSIZE
  360.         ld b,WAVETABLESIZE
  361. .loop
  362.         set 5,(hl) ;set base address in RAM area
  363.         add hl,de
  364.         djnz .loop
  365.         ld hl,MOONSOUNDROMSIZE%65536
  366.         ld d,MOONSOUNDROMSIZE/65536
  367.         ld bc,WAVEHEADERBUFFERSIZE
  368.         ld ix,waveheaderbuffer
  369.         jp opl4writememory
  370.  
  371. opl4inittimer60hz
  372.         ld de,0x2f02
  373.         call opl4writefm1
  374.         ld de,0x2104
  375.         jp opl4writefm1
  376.  
  377. opl4waittimer60hz
  378.         in a,(MOON_STAT)
  379.         rla
  380.         jr nc,opl4waittimer60hz
  381.         ld de,0x8104
  382.         jp opl4writefm1
  383.