Subversion Repositories NedoOS

Rev

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

  1. WAVEHEADERBUFFERSIZE = MOONRAMWAVETABLESIZE*MOONWAVEHEADERSIZE
  2.  
  3. opl4writemusiconlyfm1
  4. ;skips writes to control registers
  5. ;e = register
  6. ;d = value
  7.         ld a,e
  8.         cp 0x20
  9.         jp nc,opl4writefm1
  10.         cp 0x08
  11.         ret nz
  12.         jp opl4writefm1
  13.  
  14. opl4writemusiconlyfm2
  15. ;skips writes to control registers
  16. ;e = register
  17. ;d = value
  18.         ld a,e
  19.         cp 1
  20.         ret z        
  21.         cp 5
  22.         ret z
  23.         jp opl4writefm2
  24.  
  25. opl4writewavemusiconly
  26. ;skips writes to control registers and handles ROM dumps
  27. ;e = register
  28. ;d = value
  29.         ld a,e
  30.         cp 0x38
  31.         jp nc,opl4writewave
  32.         cp 0x08
  33.         ret c
  34.         cp 0x20
  35.         jr c,writewavetableindexlo
  36. ;force wave table index into 384--511 range if ROM data is loaded
  37. isromloaded=$+1
  38.         ld a,0
  39.         or d
  40.         ld d,a
  41.         jp opl4writewave
  42. writewavetableindexlo
  43.         ld a,(isromloaded)
  44.         rrca
  45.         or d
  46.         ld d,a
  47.         call opl4writewave
  48. ;wait for the header to load
  49.         in a,(MOON_STAT)
  50.         and 3
  51.         jr nz,$-4
  52.         ret
  53.  
  54. vgmopl4init
  55.         xor a
  56.         ld (isromloaded),a
  57.         ld hl,MOONSOUNDROMSIZE%65536
  58.         ld (opl4loadramdatablockheader.romsize0),hl
  59.         ld a,MOONSOUNDROMSIZE/65536
  60.         ld (opl4loadramdatablockheader.romsize2),a
  61.         jp opl4init
  62.  
  63. sub24x16
  64. ;dhl = minuend
  65. ;bc = subtrahend
  66. ;out: cf=1 if negative result, zf=1 if zero
  67.         sub hl,bc
  68.         jr c,.carry
  69.         ret nz
  70.         ld a,d
  71.         or a
  72.         ret
  73. .carry
  74.         ld a,d
  75.         sbc a,0
  76.         ld d,a
  77.         ret nz
  78.         ld a,l
  79.         or h
  80.         ret
  81.  
  82. opl4loadromdatablockheader
  83. ;dhl = header+data size
  84. ;out: zf=1 if no data to load, dhl = data block size, dhl' = start address
  85.         exx
  86.         call memorystreamread4 ;adbc = total rom size
  87.         ld (opl4loadramdatablockheader.romsize0),bc
  88.         ld a,d
  89.         add 0x20 ;place in RAM
  90.         ld (opl4loadramdatablockheader.romsize2),a
  91.         call memorystreamread4 ;adbc = start address
  92.         ld hl,bc
  93.         set 5,d ;place in RAM
  94.         exx
  95.         ld bc,8
  96.         jr sub24x16
  97.  
  98. opl4loadramdatablockheader
  99. ;dhl = header+data size
  100. ;out: zf=1 if no data to load, dhl = data block size, dhl' = start address
  101.         exx
  102.         call memorystreamread4 ;adbc = total ram size
  103.         call memorystreamread4 ;adbc = start address
  104. .romsize0=$+1
  105.         ld hl,0
  106.         add hl,bc
  107. .romsize2=$+1
  108.         ld a,0
  109.         adc a,d
  110.         and 0x3f
  111.         ld d,a
  112.         exx
  113.         ld bc,8
  114.         jr sub24x16
  115.  
  116. setup24bitscounterloop
  117. ;dhl = counter
  118. ;out: b = inner loop counter, de = outer loop counter
  119.         ld e,l
  120.         ld bc,1
  121.         sub hl,bc
  122.         jr nc,$+3
  123.         dec d
  124.         ld b,e
  125.         ld e,h
  126.         inc de
  127.         ret
  128.  
  129. opl4loadsample
  130. ;dhl = sample start address
  131. ;dhl' = sample size
  132.         ld b,d
  133.         ld de,0x0305
  134.         call opl4writefm2
  135.         ld d,b
  136.         call opl4setmemoryaddress
  137.         ld de,0x1102
  138.         call opl4writewave
  139.         opl4_wait
  140.         ld a,6
  141.         out (MOON_WREG),a
  142.         exx
  143.         call setup24bitscounterloop
  144.         ld hl,(memorystreamcurrentaddr)
  145. .loop
  146.         memory_stream_read_byte c
  147.         opl4_wait
  148.         ld a,c
  149.         out (MOON_WDAT),a
  150.         djnz .loop
  151.         dec de
  152.         ld a,e
  153.         or d
  154.         jr nz,.loop
  155.         ld (memorystreamcurrentaddr),hl
  156.         ld de,0x1002
  157.         jp opl4writewave
  158.  
  159. opl4loadramdatablock
  160. ;dhl = data+header size
  161.         call opl4loadramdatablockheader
  162.         ret z
  163.         exx
  164.         jr opl4loadsample
  165.  
  166. opl4loadromdatablock
  167. ;dhl = data+header size
  168.         call opl4loadromdatablockheader
  169.         ret z
  170.         exx
  171.         push de
  172.         call opl4loadsample
  173.         pop af
  174. ;check if the address is within the first 64K of RAM
  175.         cp 0x21
  176.         ret nc
  177. ;patch all 128 headers that LSI can read from RAM
  178.         ld a,1
  179.         ld (isromloaded),a
  180.         ld hl,MOONSOUNDROMSIZE%65536
  181.         ld d,MOONSOUNDROMSIZE/65536
  182.         ld bc,WAVEHEADERBUFFERSIZE
  183.         ld ix,waveheaderbuffer
  184.         call opl4readmemory
  185.         ld hl,waveheaderbuffer
  186.         ld de,MOONWAVEHEADERSIZE
  187.         ld b,MOONRAMWAVETABLESIZE
  188. .loop
  189.         set 5,(hl) ;set base address in RAM area
  190.         add hl,de
  191.         djnz .loop
  192.         ld hl,MOONSOUNDROMSIZE%65536
  193.         ld d,MOONSOUNDROMSIZE/65536
  194.         ld bc,WAVEHEADERBUFFERSIZE
  195.         ld ix,waveheaderbuffer
  196.         jp opl4writememory
  197.  
  198. opl4inittimer60hz
  199.         ld de,0x2f02
  200.         call opl4writefm1
  201.         ld de,0x2104
  202.         jp opl4writefm1
  203.  
  204. opl4waittimer60hz
  205.         in a,(MOON_STAT)
  206.         rla
  207.         jr nc,opl4waittimer60hz
  208.         ld de,0x8104
  209.         jp opl4writefm1
  210.