Subversion Repositories NedoOS

Rev

Rev 2272 | 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 4
  20.         ret c
  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  ld a,d
  74.         sbc a,0
  75.         ld d,a
  76.         ret nz
  77.         ld a,l
  78.         or h
  79.         ret
  80.  
  81. opl4loadromdatablockheader
  82. ;dhl = header+data size
  83. ;out: zf=1 if no data to load, dhl = data block size, dhl' = start address
  84.         exx
  85.         call memorystreamread4 ;adbc = total rom size
  86.         ld (opl4loadramdatablockheader.romsize0),bc
  87.         ld a,d
  88.         ld (opl4loadramdatablockheader.romsize2),a
  89.         call memorystreamread4 ;adbc = start address
  90.         ld hl,bc
  91.         set 5,d ;place in RAM
  92.         exx
  93.         ld bc,8
  94.         jr sub24x16
  95.  
  96. opl4loadramdatablockheader
  97. ;dhl = header+data size
  98. ;out: zf=1 if no data to load, dhl = data block size, dhl' = start address
  99.         exx
  100.         call memorystreamread4 ;adbc = total ram size
  101.         call memorystreamread4 ;adbc = start address
  102. .romsize0=$+1
  103.         ld hl,0
  104.         add hl,bc
  105. .romsize2=$+1
  106.         ld a,0
  107.         adc a,d
  108.         and 0x3f
  109.         ld d,a
  110.         exx
  111.         ld bc,8
  112.         jr sub24x16
  113.  
  114. setup24bitscounterloop
  115. ;dhl = counter
  116. ;out: b = inner loop counter, de = outer loop counter
  117.         ld e,l
  118.         ld bc,1
  119.         sub hl,bc
  120.         jr nc,$+3
  121.         dec d
  122.         ld b,e
  123.         ld e,h
  124.         inc de
  125.         ret
  126.  
  127. opl4loadsample
  128. ;dhl = sample start address
  129. ;dhl' = sample size
  130.         ld b,d
  131.         ld de,0x0305
  132.         call opl4writefm2
  133.         ld d,b
  134.         call opl4setmemoryaddress
  135.         ld de,0x1102
  136.         call opl4writewave
  137.         opl4_wait
  138.         ld a,6
  139.         out (MOON_WREG),a
  140.         exx
  141.         call setup24bitscounterloop
  142.         ld hl,(memorystreamcurrentaddr)
  143. .loop   memory_stream_read_byte c
  144.         opl4_wait
  145.         ld a,c
  146.         out (MOON_WDAT),a
  147.         djnz .loop
  148.         dec de
  149.         ld a,e
  150.         or d
  151.         jr nz,.loop
  152.         ld (memorystreamcurrentaddr),hl
  153.         ld de,0x1002
  154.         jp opl4writewave
  155.  
  156. opl4loadramdatablock
  157. ;dhl = data+header size
  158.         call opl4loadramdatablockheader
  159.         ret z
  160.         exx
  161.         jr opl4loadsample
  162.  
  163. opl4loadromdatablock
  164. ;dhl = data+header size
  165.         call opl4loadromdatablockheader
  166.         ret z
  167.         exx
  168.         push de
  169.         call opl4loadsample
  170.         pop af
  171. ;check if the address is within the first 64K of RAM
  172.         cp 0x21
  173.         ret nc
  174. ;patch all 128 headers that LSI can read from RAM
  175.         ld a,1
  176.         ld (isromloaded),a
  177.         ld hl,MOONSOUNDROMSIZE%65536
  178.         ld d,MOONSOUNDROMSIZE/65536
  179.         ld bc,WAVEHEADERBUFFERSIZE
  180.         ld ix,waveheaderbuffer
  181.         call opl4readmemory
  182.         ld hl,waveheaderbuffer
  183.         ld de,MOONWAVEHEADERSIZE
  184.         ld b,MOONRAMWAVETABLESIZE
  185. .loop   set 5,(hl) ;set base address in RAM area
  186.         add hl,de
  187.         djnz .loop
  188.         ld hl,MOONSOUNDROMSIZE%65536
  189.         ld d,MOONSOUNDROMSIZE/65536
  190.         ld bc,WAVEHEADERBUFFERSIZE
  191.         ld ix,waveheaderbuffer
  192.         jp opl4writememory
  193.  
  194. opl4inittimer60hz
  195.         ld de,0x2f02
  196.         call opl4writefm1
  197.         ld de,0x2104
  198.         jp opl4writefm1
  199.  
  200. opl4waittimer60hz
  201.         in a,(MOON_STAT)
  202.         rla
  203.         jr nc,opl4waittimer60hz
  204.         ld de,0x8104
  205.         jp opl4writefm1
  206.