Subversion Repositories NedoOS

Rev

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

  1. ; Video Game Music player
  2. ; Supports AY8910, YM3526, YM3812, YMF262, YMF278B, YM2203, YM2151.
  3.  
  4.         DEVICE ZXSPECTRUM128
  5.         include "../_sdk/sys_h.asm"
  6.         include "playerdefs.asm"
  7.  
  8. HEADER_DATA_OFFSET = 0x8034
  9. HEADER_SIZE_MAX = 256
  10. TITLELENGTH = 64
  11. MEMORYSTREAMMAXPAGES = 250
  12. MEMORYSTREAMERRORMASK = 255 ; TODO: do we need to enforce loading the entire file?
  13. ENABLE_FM = 1
  14.  
  15.         org PLAYERSTART
  16.  
  17. begin   PLAYERHEADER
  18.  
  19. isfilesupported
  20. ;cde = file extension
  21. ;out: zf=1 if this player can handle the file and the sound hardware is available, zf=0 otherwise
  22.         ld a,c
  23.         cp 'v'
  24.         ret nz
  25.         ld a,d
  26.         cp 'g'
  27.         ret nz
  28.         ld a,e
  29.         cp 'm'
  30.         jr z,$+5
  31.         cp 'z'
  32.         ret nz
  33. ;prepare local variables
  34.         ld hl,0
  35.         ld (MUSICTITLEADDR),hl
  36.         ld hl,musicprogress+1
  37.         ld (MUSICPROGRESSADDR),hl
  38.         jp initprogress
  39.  
  40. playerinit
  41. ;hl,ix = GPSETTINGS
  42. ;a = player page
  43. ;out: zf=1 if init is successful, hl=init message
  44.         ld a,(hl)
  45.         ld (page8000),a
  46.         inc hl
  47.         ld a,(hl)
  48.         ld (pageC000),a
  49.         inc hl
  50.         ld a,(hl)
  51.         ld (filedatapage),a
  52.         ld a,(ix+GPSETTINGS.moonsoundstatus)
  53.         ld (moonsoundstatus),a
  54.         ld a,(ix+GPSETTINGS.tfmstatus)
  55.         ld (tfmstatus),a
  56.         ld a,(ix+GPSETTINGS.opmstatus)
  57.         ld (opmstatus),a
  58.         ld de,(ix+GPSETTINGS.framelength)
  59.         ld hl,-MIN_FRAME_LENGTH_FPGA
  60.         add hl,de
  61.         call nc,opndisableextradelay
  62. ;hardware detection is done when loading VGM
  63.         ld hl,initokstr
  64.         xor a
  65.         ret
  66.  
  67.         macro a_or_dw addr
  68.         ld hl,(addr+0)
  69.         or h
  70.         or l
  71.         ld de,(addr+2)
  72.         or d
  73.         or e
  74.         endm
  75.  
  76.         macro set_timer wait,ticks
  77.         ld hl,wait
  78.         ld (waittimercallback),hl
  79.         ld hl,ticks
  80.         ld (waittimerstep),hl
  81.         endm
  82.  
  83. musicload
  84. ;cde = file extension
  85. ;hl = input file name
  86. ;out: hl = device mask, zf=1 if the file is ready for playing, zf=0 otherwise
  87.         push hl
  88.         set_timer waittimer50hz,882
  89.         ld hl,0
  90.         ld (waitcounter),hl
  91.         ld (samplecounterlo),hl
  92.         ld (dataoffsetlo),hl
  93.         ld (dataoffsethi),hl
  94.         ld (devicemask),hl
  95.         ld a,l
  96.         ld (samplecounterhi),a
  97.         ld (vgmheadercopy),a
  98.         ld a,e
  99.         pop de
  100.         cp 'z'
  101.         jr z,.loadcompressed
  102.         call memorystreamloadfile
  103.         jr z,.doneloading
  104.         ld hl,(ERRORSTRINGADDR)
  105.         ld a,l
  106.         or h
  107.         ret nz
  108.         ld a,(memorystreamerrorcode)
  109.         dec a
  110.         ret m
  111.         ld hl,fileioerrorstr
  112.         ld (ERRORSTRINGADDR),hl
  113.         dec a
  114.         ret m
  115.         ld hl,oomerrorstr
  116.         ld (ERRORSTRINGADDR),hl
  117.         dec a
  118.         ret
  119. .loadcompressed
  120.         call decompressfiletomemorystream
  121.         ret nz
  122. .doneloading
  123. ;init progress
  124.         ld hl,(HEADER_SAMPLES_COUNT+2)
  125.         ld bc,(HEADER_LOOP_SAMPLES_COUNT+2)
  126.         add hl,bc
  127.         inc hl ;+1 as if low-word addition sets cf
  128.         ld a,l
  129.         inc h
  130.         dec h
  131.         jr z,$+4
  132.         ld a,255
  133.         call setprogressdelta
  134. ;check for GD3
  135.         xor a
  136.         a_or_dw HEADER_GD3_OFFSET
  137.         call nz,parsegd3
  138. ;setup loop
  139.         xor a
  140.         a_or_dw HEADER_LOOP_OFFSET
  141.         ld (loopoffsetlo),hl
  142.         ld (loopoffsethi),de
  143.         jr z,$+4
  144.         ld a,1
  145.         inc a
  146.         ld (loopcounter),a
  147. ;start command stream
  148. dataoffsetlo=$+1
  149.         ld hl,0
  150. dataoffsethi=$+1
  151.         ld de,0
  152.         call memorystreamseek
  153.         xor a
  154. devicemask=$+1
  155.         ld hl,0
  156.         ret
  157.  
  158. inithardware
  159. ;out: zf=1 if hardware is found, zf=0 otherwise
  160.         xor a
  161.         a_or_dw HEADER_CLOCK_AY8910
  162.         call nz,initAY8910
  163. ;init OPM
  164.         xor a
  165.         a_or_dw HEADER_CLOCK_YM2151
  166.         call nz,initYM2151
  167.         jp nz,.missinghardwareerror
  168. ;init TFM
  169.         xor a
  170.         a_or_dw HEADER_CLOCK_YM2203
  171.         a_or_dw HEADER_CLOCK_YM2608
  172.         call nz,initYM2203
  173.         jp nz,.missinghardwareerror
  174. ;init Moonsound
  175.         xor a
  176.         a_or_dw HEADER_CLOCK_YM3526
  177.         a_or_dw HEADER_CLOCK_YM3812
  178.         a_or_dw HEADER_CLOCK_Y8950
  179.         ld (useYM3812),a
  180.         a_or_dw HEADER_CLOCK_YMF262
  181.         jr nz,.opl4notneeded
  182.         a_or_dw HEADER_CLOCK_YMF278B
  183.         jr z,.opl4notneeded
  184.         ld a,(moonsoundstatus)
  185.         cp 2
  186.         jr nz,.missinghardwareerror
  187.         or a
  188. .opl4notneeded
  189.         call nz,initYMF278B
  190.         jp nz,.missinghardwareerror
  191. ;zf=0 if there is no supported device
  192.         ld hl,(devicemask)
  193.         ld a,l
  194.         or h
  195.         cp 1
  196.         sbc a,a
  197.         ret z
  198. .missinghardwareerror
  199.         ld hl,missinghardwareerrorstr
  200.         ld (ERRORSTRINGADDR),hl
  201.         ret
  202.  
  203. missinghardwareerrorstr
  204.         db "Unable to initialize the sound device!",0
  205. fileioerrorstr
  206.         db "Unable to read the file!",0
  207. oomerrorstr
  208.         db "Not enough memory to load the module!",0
  209. gziperrorstr
  210.         db "Failed to decompress the file!",0
  211.  
  212. playerdeinit
  213.         ret
  214.  
  215.         include "../_sdk/file.asm"
  216.         define ON_DATA_LOADED_CALLBACK ondataloaded
  217.         define UNUSED_PAGE_ADDR page8000
  218.         include "common/memorystream.asm"
  219.         include "common/opl4.asm"
  220.         include "vgm/opl4.asm"
  221.         include "common/opn.asm"
  222.         include "common/opm.asm"
  223.         include "vgm/opn.asm"
  224.         include "vgm/opm.asm"
  225.         include "vgm/ssg.asm"
  226.         include "progress.asm"
  227.  
  228. ondataloaded
  229. ;output: zf=1 if hardware is found, zf=0 otherwise
  230.         call memorystreamgetpos
  231.         push de
  232.         push hl
  233.         ld a,(vgmheadercopy)
  234.         or a
  235.         jr nz,.headerloaded
  236. ;copy header
  237.         ld a,(memorystreampages)
  238.         SETPG8000
  239.         ld bc,HEADER_SIZE_MAX
  240.         ld hl,vgmheadercopy
  241.         ld de,vgmheadercopy+1
  242.         ld (hl),0
  243.         ldir
  244.         ld hl,(HEADER_DATA_OFFSET)
  245.         ld a,h
  246.         or l
  247.         ld bc,0x40
  248.         jr z,$+4
  249.         ld c,0x34
  250.         add hl,bc
  251.         ld (dataoffsetlo),hl
  252.         ld bc,hl
  253.         ld hl,-HEADER_SIZE_MAX-1
  254.         add hl,bc
  255.         jr nc,$+5
  256.         ld bc,HEADER_SIZE_MAX
  257.         ld hl,0x8000
  258.         ld de,vgmheadercopy
  259.         ldir
  260. ;we've got the header, now we know which hardware we need
  261.         call inithardware
  262.         jr z,.checkfirstdatablock
  263.         pop hl
  264.         pop de
  265.         ret
  266. .checkfirstdatablock
  267.         ld hl,(dataoffsetlo)
  268.         ld de,(dataoffsethi)
  269.         push de
  270.         push hl
  271.         call memorystreamseek
  272.         pop hl
  273.         pop de
  274.         call .checkdatablock
  275.         pop hl
  276.         pop de
  277.         push de
  278.         push hl
  279. .headerloaded
  280. .blockendlo=$+1
  281.         ld bc,0
  282.         sub hl,bc
  283. .blockendhi=$+1
  284.         ld bc,0
  285.         ex de,hl
  286.         sbc hl,bc
  287.         jr c,.done
  288. .blockstartlo=$+1
  289.         ld hl,0
  290. .blockstarthi=$+1
  291.         ld de,0
  292.         call memorystreamseek
  293.         call memorystreamread3 ;c = 0x67, e = 0x66, d = data type
  294.         ld e,d
  295.         call processdatablock
  296.         call memorystreamgetpos
  297.         ld (dataoffsetlo),hl
  298.         ld (dataoffsethi),de
  299.         call .checkdatablock
  300. ;free unused pages
  301.         ld hl,(dataoffsetlo)
  302.         ld a,(dataoffsethi)
  303.         add hl,hl : rla
  304.         add hl,hl : rla
  305.         call memorystreamfreecustompagecount
  306. .done   pop hl
  307.         pop de
  308.         call memorystreamseek
  309.         xor a
  310.         ret
  311. .checkdatablock
  312. ;dehl = current stream offset
  313.         ld (.blockstartlo),hl
  314.         ld (.blockstarthi),de
  315.         ld hl,0xffff
  316.         ld (.blockendlo),hl
  317.         ld (.blockendhi),hl
  318.         call memorystreamread3 ;c = 0x67, e = 0x66, d = data type
  319.         ld a,c
  320.         cp 0x67
  321.         ret nz
  322.         ld a,e
  323.         cp 0x66
  324.         ret nz
  325.         call memorystreamread4 ;adbc = data size
  326.         xor a
  327.         ld hl,32 ;include the next data block header
  328.         add hl,bc
  329.         adc a,d
  330.         ld bc,(.blockstartlo)
  331.         add hl,bc
  332.         ld (.blockendlo),hl
  333.         ld l,a
  334.         ld h,0
  335.         ld bc,(.blockstarthi)
  336.         adc hl,bc
  337.         ld (.blockendhi),hl
  338.         ret
  339.  
  340. waittimer50hz
  341.         YIELD
  342.         ret
  343.  
  344. musicplay
  345. ;out: zf=0 if still playing, zf=1 otherwise
  346. waittimercallback=$+1
  347.         call 0
  348. playloop
  349. waitcounter=$+1
  350.         ld hl,0
  351. waittimerstep=$+1
  352.         ld bc,0
  353.         sub hl,bc
  354.         jr nc,exitplayloop
  355. ;read command
  356.         memory_stream_read_1 e
  357.         ld d,0
  358.         ld hl,cmdtable
  359.         add hl,de
  360.         ld e,(hl)
  361.         inc h
  362.         ld d,(hl)
  363.         ld hl,playloop
  364.         push hl
  365.         ex hl,de
  366.         jp (hl)
  367. exitplayloop
  368.         ld (waitcounter),hl
  369. ;update progress
  370. samplecounterlo=$+1
  371.         ld hl,0
  372. samplecounterhi=$+1
  373.         ld a,0
  374.         add hl,bc
  375.         adc a,0
  376.         jr nc,$+4
  377.         ld a,255
  378.         ld (samplecounterlo),hl
  379.         ld (samplecounterhi),a
  380.         call updateprogress
  381. ;continue playing
  382.         or 1
  383.         ret
  384.  
  385. wait1   ld hl,(waitcounter)
  386.         inc hl
  387.         ld (waitcounter),hl
  388.         ret
  389.  
  390. waitn   memory_stream_read_2 e,d
  391.         ld hl,(waitcounter)
  392.         add hl,de
  393.         ld (waitcounter),hl
  394.         ret
  395.  
  396.         macro wait_n n
  397.         ld hl,(waitcounter)
  398.         ld de,n
  399.         add hl,de
  400.         ld (waitcounter),hl
  401.         ret
  402.         endm
  403.  
  404. wait2   wait_n 2
  405. wait3   wait_n 3
  406. wait4   wait_n 4
  407. wait5   wait_n 5
  408. wait6   wait_n 6
  409. wait7   wait_n 7
  410. wait8   wait_n 8
  411. wait9   wait_n 9
  412. wait10  wait_n 10
  413. wait11  wait_n 11
  414. wait12  wait_n 12
  415. wait13  wait_n 13
  416. wait14  wait_n 14
  417. wait15  wait_n 15
  418. wait16  wait_n 16
  419. wait735 wait_n 735
  420. wait882 wait_n 882
  421.  
  422.         macro skip_n n
  423.         ld b,n
  424.         jp memorystreamskip
  425.         endm
  426.  
  427. skip1   ret
  428. skip2   skip_n 1
  429. skip3   skip_n 2
  430. skip4   skip_n 3
  431. skip5   skip_n 4
  432. skip6   skip_n 5
  433. skip11  skip_n 10
  434. skip12  skip_n 11
  435.  
  436. endofsounddata
  437. loopcounter=$+1
  438.         ld a,0
  439.         dec a
  440.         ld (loopcounter),a
  441.         jp nz,seektoloop
  442. cmdunsupported
  443. ;stop playing
  444.         pop af
  445.         xor a
  446.         ret
  447.  
  448. cmdYM2203
  449.         memory_stream_read_2 e,d
  450.         jp opnwritemusiconlyfm1
  451.  
  452. cmdYM2203dp
  453.         memory_stream_read_2 e,d
  454.         jp opnwritemusiconlyfm2
  455.  
  456. cmdYMF278B
  457.         memory_stream_read_3 c,e,d
  458.         dec c
  459.         jp z,opl4writemusiconlyfm2
  460.         jp p,opl4writewavemusiconly
  461.         jp opl4writemusiconlyfm1
  462.  
  463. cmdYMF262p0
  464. cmdYM3812
  465. cmdY8950
  466. cmdYM3526
  467.         memory_stream_read_2 e,d
  468.         jp opl4writemusiconlyfm1
  469.  
  470. cmdYMF262p1
  471. cmdYM3812dp
  472. cmdY8950dp
  473. cmdYM3526dp
  474.         memory_stream_read_2 e,d
  475.         jp opl4writemusiconlyfm2
  476.  
  477. cmdYM2151
  478.         memory_stream_read_2 e,d
  479.         jp opmwritemusiconlychip0
  480.  
  481. cmdYM2151dp
  482.         memory_stream_read_2 e,d
  483.         jp opmwritemusiconlychip1
  484.  
  485. cmdAY8910
  486.         memory_stream_read_2 e,d
  487.         bit 7,e
  488.         jp z,ssgwritemusiconlychip0
  489.         res 7,e
  490.         jp ssgwritemusiconlychip1
  491.  
  492. cmdYMF262dp0 equ memorystreamread2
  493. cmdYMF262dp1 equ memorystreamread2
  494.  
  495. cmddatablock
  496.         memory_stream_read_2 a,e ;a = 0x66 guard, e = type
  497.         cp 0x66
  498.         jp nz,cmdunsupported
  499. processdatablock
  500. ;e = data type
  501.         call memorystreamread4 ;adbc = data size
  502.         ld a,e
  503.         ld hl,bc
  504. ;       cp 0x81
  505. ;       jp z,opnaloaddatablock
  506.         cp 0x84
  507.         jp z,opl4loadromdatablock
  508.         cp 0x87
  509.         jp z,opl4loadramdatablock
  510.         push de
  511.         push bc
  512.         call memorystreamgetpos
  513.         pop bc
  514.         pop af
  515.         add hl,bc
  516.         adc a,e
  517.         ld e,a
  518.         adc a,d
  519.         sub e
  520.         ld d,a
  521.         jp memorystreamseek
  522.  
  523. seektoloop
  524.         ld bc,0x1c
  525. loopoffsethi=$+1
  526.         ld de,0
  527. loopoffsetlo=$+1
  528.         ld hl,0
  529. seektopos
  530. ;dehl + bc = position
  531. ;out: hl = read address
  532.         add hl,bc
  533.         jp nc,memorystreamseek
  534.         inc de
  535.         jp memorystreamseek
  536.  
  537. parsegd3
  538. ;dehl = GD3 offset
  539.         ld bc,32
  540.         call seektopos
  541.         ld b,TITLELENGTH
  542.         ld de,titlestr
  543.         ld a,' '
  544. .fillloop
  545.         ld (de),a
  546.         inc de
  547.         djnz .fillloop
  548.         xor a
  549.         ld (de),a
  550.         ld b,TITLELENGTH
  551.         ld de,titlestr
  552.         call gd3stringcopy   ;track name
  553.         call z,gd3stringskip ;track name in Japanese
  554.         push hl
  555.         ld hl,fromstr
  556.         call z,stringcopy
  557.         pop hl
  558.         call z,gd3stringcopy ;game name
  559.         call z,gd3stringskip ;game name in Japanese
  560.         call z,gd3stringskip ;system name
  561.         call z,gd3stringskip ;system name in Japanese
  562.         push hl
  563.         ld hl,bystr
  564.         call z,stringcopy
  565.         pop hl
  566.         call z,gd3stringcopy ;author
  567.         ld hl,titlestr
  568.         ld (MUSICTITLEADDR),hl
  569.         ret
  570.  
  571. gd3stringcopy
  572. ;hl = memorystreamcurrentaddr
  573. ;de = dest
  574. ;b = bytes remaining
  575. ;out: zf=1 if encountered zero terminator, zf=0 if out of space
  576.         memory_stream_read_byte a
  577.         memory_stream_read_byte c
  578.         or a
  579.         ret z
  580.         ld (de),a
  581.         inc de
  582.         djnz gd3stringcopy
  583.         ret
  584.  
  585. gd3stringskip
  586. ;hl = memorystreamcurrentaddr
  587. ;out: zf=1
  588.         memory_stream_read_byte a
  589.         memory_stream_read_byte c
  590.         or c
  591.         jr nz,gd3stringskip
  592.         ret
  593.  
  594. stringcopy
  595. ;hl = source
  596. ;de = dest
  597. ;b = bytes remaining
  598. ;out: zf=1 if encountered zero terminator, zf=0 if out of space
  599.         ld a,(hl)
  600.         or a
  601.         ret z
  602.         ld (de),a
  603.         inc hl
  604.         inc de
  605.         djnz stringcopy
  606.         ret
  607.  
  608. cmdtable
  609.         db skip1           %256 ; 00
  610.         db skip1           %256 ; 01
  611.         db skip1           %256 ; 02
  612.         db skip1           %256 ; 03
  613.         db skip1           %256 ; 04
  614.         db skip1           %256 ; 05
  615.         db skip1           %256 ; 06
  616.         db skip1           %256 ; 07
  617.         db skip1           %256 ; 08
  618.         db skip1           %256 ; 09
  619.         db skip1           %256 ; 0A
  620.         db skip1           %256 ; 0B
  621.         db skip1           %256 ; 0C
  622.         db skip1           %256 ; 0D
  623.         db skip1           %256 ; 0E
  624.         db skip1           %256 ; 0F
  625.         db skip1           %256 ; 10
  626.         db skip1           %256 ; 11
  627.         db skip1           %256 ; 12
  628.         db skip1           %256 ; 13
  629.         db skip1           %256 ; 14
  630.         db skip1           %256 ; 15
  631.         db skip1           %256 ; 16
  632.         db skip1           %256 ; 17
  633.         db skip1           %256 ; 18
  634.         db skip1           %256 ; 19
  635.         db skip1           %256 ; 1A
  636.         db skip1           %256 ; 1B
  637.         db skip1           %256 ; 1C
  638.         db skip1           %256 ; 1D
  639.         db skip1           %256 ; 1E
  640.         db skip1           %256 ; 1F
  641.         db skip1           %256 ; 20
  642.         db skip1           %256 ; 21
  643.         db skip1           %256 ; 22
  644.         db skip1           %256 ; 23
  645.         db skip1           %256 ; 24
  646.         db skip1           %256 ; 25
  647.         db skip1           %256 ; 26
  648.         db skip1           %256 ; 27
  649.         db skip1           %256 ; 28
  650.         db skip1           %256 ; 29
  651.         db skip1           %256 ; 2A
  652.         db skip1           %256 ; 2B
  653.         db skip1           %256 ; 2C
  654.         db skip1           %256 ; 2D
  655.         db skip1           %256 ; 2E
  656.         db skip1           %256 ; 2F
  657.         db cmdunsupported  %256 ; 30
  658.         db skip2           %256 ; 31
  659.         db skip2           %256 ; 32
  660.         db skip2           %256 ; 33
  661.         db skip2           %256 ; 34
  662.         db skip2           %256 ; 35
  663.         db skip2           %256 ; 36
  664.         db skip2           %256 ; 37
  665.         db skip2           %256 ; 38
  666.         db skip2           %256 ; 39
  667.         db skip2           %256 ; 3A
  668.         db skip2           %256 ; 3B
  669.         db skip2           %256 ; 3C
  670.         db skip2           %256 ; 3D
  671.         db skip2           %256 ; 3E
  672.         db skip2           %256 ; 3F
  673.         db skip3           %256 ; 40
  674.         db skip3           %256 ; 41
  675.         db skip3           %256 ; 42
  676.         db skip3           %256 ; 43
  677.         db skip3           %256 ; 44
  678.         db skip3           %256 ; 45
  679.         db skip3           %256 ; 46
  680.         db skip3           %256 ; 47
  681.         db skip3           %256 ; 48
  682.         db skip3           %256 ; 49
  683.         db skip3           %256 ; 4A
  684.         db skip3           %256 ; 4B
  685.         db skip3           %256 ; 4C
  686.         db skip3           %256 ; 4D
  687.         db skip3           %256 ; 4E
  688.         db skip2           %256 ; 4F
  689.         db cmdunsupported  %256 ; 50
  690.         db cmdunsupported  %256 ; 51
  691.         db cmdunsupported  %256 ; 52
  692.         db cmdunsupported  %256 ; 53
  693.         db cmdYM2151       %256 ; 54
  694.         db cmdYM2203       %256 ; 55
  695.         db cmdYM2608p0     %256 ; 56
  696.         db cmdYM2608p1     %256 ; 57
  697.         db cmdunsupported  %256 ; 58
  698.         db cmdunsupported  %256 ; 59
  699.         db cmdYM3812       %256 ; 5A
  700.         db cmdYM3526       %256 ; 5B
  701.         db cmdY8950        %256 ; 5C
  702.         db skip3           %256 ; 5D
  703.         db cmdYMF262p0     %256 ; 5E
  704.         db cmdYMF262p1     %256 ; 5F
  705.         db cmdunsupported  %256 ; 60
  706.         db waitn           %256 ; 61
  707.         db wait735         %256 ; 62
  708.         db wait882         %256 ; 63
  709.         db cmdunsupported  %256 ; 64
  710.         db cmdunsupported  %256 ; 65
  711.         db endofsounddata  %256 ; 66
  712.         db cmddatablock    %256 ; 67
  713.         db skip12          %256 ; 68
  714.         db cmdunsupported  %256 ; 69
  715.         db cmdunsupported  %256 ; 6A
  716.         db cmdunsupported  %256 ; 6B
  717.         db cmdunsupported  %256 ; 6C
  718.         db cmdunsupported  %256 ; 6D
  719.         db cmdunsupported  %256 ; 6E
  720.         db cmdunsupported  %256 ; 6F
  721.         db wait1           %256 ; 70
  722.         db wait2           %256 ; 71
  723.         db wait3           %256 ; 72
  724.         db wait4           %256 ; 73
  725.         db wait5           %256 ; 74
  726.         db wait6           %256 ; 75
  727.         db wait7           %256 ; 76
  728.         db wait8           %256 ; 77
  729.         db wait9           %256 ; 78
  730.         db wait10          %256 ; 79
  731.         db wait11          %256 ; 7A
  732.         db wait12          %256 ; 7B
  733.         db wait13          %256 ; 7C
  734.         db wait14          %256 ; 7D
  735.         db wait15          %256 ; 7E
  736.         db wait16          %256 ; 7F
  737.         db skip1           %256 ; 80
  738.         db wait1           %256 ; 81
  739.         db wait2           %256 ; 82
  740.         db wait3           %256 ; 83
  741.         db wait4           %256 ; 84
  742.         db wait5           %256 ; 85
  743.         db wait6           %256 ; 86
  744.         db wait7           %256 ; 87
  745.         db wait8           %256 ; 88
  746.         db wait9           %256 ; 89
  747.         db wait10          %256 ; 8A
  748.         db wait11          %256 ; 8B
  749.         db wait12          %256 ; 8C
  750.         db wait13          %256 ; 8D
  751.         db wait14          %256 ; 8E
  752.         db wait15          %256 ; 8F
  753.         db skip5           %256 ; 90
  754.         db skip5           %256 ; 91
  755.         db skip6           %256 ; 92
  756.         db skip11          %256 ; 93
  757.         db skip2           %256 ; 94
  758.         db skip5           %256 ; 95
  759.         db cmdunsupported  %256 ; 96
  760.         db cmdunsupported  %256 ; 97
  761.         db cmdunsupported  %256 ; 98
  762.         db cmdunsupported  %256 ; 99
  763.         db cmdunsupported  %256 ; 9A
  764.         db cmdunsupported  %256 ; 9B
  765.         db cmdunsupported  %256 ; 9C
  766.         db cmdunsupported  %256 ; 9D
  767.         db cmdunsupported  %256 ; 9E
  768.         db cmdunsupported  %256 ; 9F
  769.         db cmdAY8910       %256 ; A0
  770.         db skip3           %256 ; A1
  771.         db cmdunsupported  %256 ; A2
  772.         db cmdunsupported  %256 ; A3
  773.         db cmdYM2151dp     %256 ; A4
  774.         db cmdYM2203dp     %256 ; A5
  775.         db skip3           %256 ; A6
  776.         db skip3           %256 ; A7
  777.         db skip3           %256 ; A8
  778.         db skip3           %256 ; A9
  779.         db cmdYM3812dp     %256 ; AA
  780.         db cmdYM3526dp     %256 ; AB
  781.         db cmdY8950dp      %256 ; AC
  782.         db skip3           %256 ; AD
  783.         db cmdYMF262dp0    %256 ; AE
  784.         db cmdYMF262dp0    %256 ; AF
  785.         db skip3           %256 ; B0
  786.         db skip3           %256 ; B1
  787.         db skip3           %256 ; B2
  788.         db skip3           %256 ; B3
  789.         db skip3           %256 ; B4
  790.         db skip3           %256 ; B5
  791.         db skip3           %256 ; B6
  792.         db skip3           %256 ; B7
  793.         db skip3           %256 ; B8
  794.         db skip3           %256 ; B9
  795.         db skip3           %256 ; BA
  796.         db skip3           %256 ; BB
  797.         db skip3           %256 ; BC
  798.         db skip3           %256 ; BD
  799.         db skip3           %256 ; BE
  800.         db skip3           %256 ; BF
  801.         db skip4           %256 ; C0
  802.         db skip4           %256 ; C1
  803.         db skip4           %256 ; C2
  804.         db skip4           %256 ; C3
  805.         db skip4           %256 ; C4
  806.         db skip4           %256 ; C5
  807.         db skip4           %256 ; C6
  808.         db skip4           %256 ; C7
  809.         db skip4           %256 ; C8
  810.         db skip4           %256 ; C9
  811.         db skip4           %256 ; CA
  812.         db skip4           %256 ; CB
  813.         db skip4           %256 ; CC
  814.         db skip4           %256 ; CD
  815.         db skip4           %256 ; CE
  816.         db skip4           %256 ; CF
  817.         db cmdYMF278B      %256 ; D0
  818.         db skip4           %256 ; D1
  819.         db cmdunsupported  %256 ; D2
  820.         db skip4           %256 ; D3
  821.         db skip4           %256 ; D4
  822.         db skip4           %256 ; D5
  823.         db skip4           %256 ; D6
  824.         db skip4           %256 ; D7
  825.         db skip4           %256 ; D8
  826.         db skip4           %256 ; D9
  827.         db skip4           %256 ; DA
  828.         db skip4           %256 ; DB
  829.         db skip4           %256 ; DC
  830.         db skip4           %256 ; DD
  831.         db skip4           %256 ; DE
  832.         db skip4           %256 ; DF
  833.         db cmdunsupported  %256 ; E0
  834.         db skip5           %256 ; E1
  835.         db skip5           %256 ; E2
  836.         db skip5           %256 ; E3
  837.         db skip5           %256 ; E4
  838.         db skip5           %256 ; E5
  839.         db skip5           %256 ; E6
  840.         db skip5           %256 ; E7
  841.         db skip5           %256 ; E8
  842.         db skip5           %256 ; E9
  843.         db skip5           %256 ; EA
  844.         db skip5           %256 ; EB
  845.         db skip5           %256 ; EC
  846.         db skip5           %256 ; ED
  847.         db skip5           %256 ; EE
  848.         db skip5           %256 ; EF
  849.         db skip5           %256 ; F0
  850.         db skip5           %256 ; F1
  851.         db skip5           %256 ; F2
  852.         db skip5           %256 ; F3
  853.         db skip5           %256 ; F4
  854.         db skip5           %256 ; F5
  855.         db skip5           %256 ; F6
  856.         db skip5           %256 ; F7
  857.         db skip5           %256 ; F8
  858.         db skip5           %256 ; F9
  859.         db skip5           %256 ; FA
  860.         db skip5           %256 ; FB
  861.         db skip5           %256 ; FC
  862.         db skip5           %256 ; FD
  863.         db skip5           %256 ; FE
  864.         db skip5           %256 ; FF
  865.         db skip1           /256 ; 00
  866.         db skip1           /256 ; 01
  867.         db skip1           /256 ; 02
  868.         db skip1           /256 ; 03
  869.         db skip1           /256 ; 04
  870.         db skip1           /256 ; 05
  871.         db skip1           /256 ; 06
  872.         db skip1           /256 ; 07
  873.         db skip1           /256 ; 08
  874.         db skip1           /256 ; 09
  875.         db skip1           /256 ; 0A
  876.         db skip1           /256 ; 0B
  877.         db skip1           /256 ; 0C
  878.         db skip1           /256 ; 0D
  879.         db skip1           /256 ; 0E
  880.         db skip1           /256 ; 0F
  881.         db skip1           /256 ; 10
  882.         db skip1           /256 ; 11
  883.         db skip1           /256 ; 12
  884.         db skip1           /256 ; 13
  885.         db skip1           /256 ; 14
  886.         db skip1           /256 ; 15
  887.         db skip1           /256 ; 16
  888.         db skip1           /256 ; 17
  889.         db skip1           /256 ; 18
  890.         db skip1           /256 ; 19
  891.         db skip1           /256 ; 1A
  892.         db skip1           /256 ; 1B
  893.         db skip1           /256 ; 1C
  894.         db skip1           /256 ; 1D
  895.         db skip1           /256 ; 1E
  896.         db skip1           /256 ; 1F
  897.         db skip1           /256 ; 20
  898.         db skip1           /256 ; 21
  899.         db skip1           /256 ; 22
  900.         db skip1           /256 ; 23
  901.         db skip1           /256 ; 24
  902.         db skip1           /256 ; 25
  903.         db skip1           /256 ; 26
  904.         db skip1           /256 ; 27
  905.         db skip1           /256 ; 28
  906.         db skip1           /256 ; 29
  907.         db skip1           /256 ; 2A
  908.         db skip1           /256 ; 2B
  909.         db skip1           /256 ; 2C
  910.         db skip1           /256 ; 2D
  911.         db skip1           /256 ; 2E
  912.         db skip1           /256 ; 2F
  913.         db cmdunsupported  /256 ; 30
  914.         db skip2           /256 ; 31
  915.         db skip2           /256 ; 32
  916.         db skip2           /256 ; 33
  917.         db skip2           /256 ; 34
  918.         db skip2           /256 ; 35
  919.         db skip2           /256 ; 36
  920.         db skip2           /256 ; 37
  921.         db skip2           /256 ; 38
  922.         db skip2           /256 ; 39
  923.         db skip2           /256 ; 3A
  924.         db skip2           /256 ; 3B
  925.         db skip2           /256 ; 3C
  926.         db skip2           /256 ; 3D
  927.         db skip2           /256 ; 3E
  928.         db skip2           /256 ; 3F
  929.         db skip3           /256 ; 40
  930.         db skip3           /256 ; 41
  931.         db skip3           /256 ; 42
  932.         db skip3           /256 ; 43
  933.         db skip3           /256 ; 44
  934.         db skip3           /256 ; 45
  935.         db skip3           /256 ; 46
  936.         db skip3           /256 ; 47
  937.         db skip3           /256 ; 48
  938.         db skip3           /256 ; 49
  939.         db skip3           /256 ; 4A
  940.         db skip3           /256 ; 4B
  941.         db skip3           /256 ; 4C
  942.         db skip3           /256 ; 4D
  943.         db skip3           /256 ; 4E
  944.         db skip2           /256 ; 4F
  945.         db cmdunsupported  /256 ; 50
  946.         db cmdunsupported  /256 ; 51
  947.         db cmdunsupported  /256 ; 52
  948.         db cmdunsupported  /256 ; 53
  949.         db cmdYM2151       /256 ; 54
  950.         db cmdYM2203       /256 ; 55
  951.         db cmdYM2608p0     /256 ; 56
  952.         db cmdYM2608p1     /256 ; 57
  953.         db cmdunsupported  /256 ; 58
  954.         db cmdunsupported  /256 ; 59
  955.         db cmdYM3812       /256 ; 5A
  956.         db cmdYM3526       /256 ; 5B
  957.         db cmdY8950        /256 ; 5C
  958.         db skip3           /256 ; 5D
  959.         db cmdYMF262p0     /256 ; 5E
  960.         db cmdYMF262p1     /256 ; 5F
  961.         db cmdunsupported  /256 ; 60
  962.         db waitn           /256 ; 61
  963.         db wait735         /256 ; 62
  964.         db wait882         /256 ; 63
  965.         db cmdunsupported  /256 ; 64
  966.         db cmdunsupported  /256 ; 65
  967.         db endofsounddata  /256 ; 66
  968.         db cmddatablock    /256 ; 67
  969.         db skip12          /256 ; 68
  970.         db cmdunsupported  /256 ; 69
  971.         db cmdunsupported  /256 ; 6A
  972.         db cmdunsupported  /256 ; 6B
  973.         db cmdunsupported  /256 ; 6C
  974.         db cmdunsupported  /256 ; 6D
  975.         db cmdunsupported  /256 ; 6E
  976.         db cmdunsupported  /256 ; 6F
  977.         db wait1           /256 ; 70
  978.         db wait2           /256 ; 71
  979.         db wait3           /256 ; 72
  980.         db wait4           /256 ; 73
  981.         db wait5           /256 ; 74
  982.         db wait6           /256 ; 75
  983.         db wait7           /256 ; 76
  984.         db wait8           /256 ; 77
  985.         db wait9           /256 ; 78
  986.         db wait10          /256 ; 79
  987.         db wait11          /256 ; 7A
  988.         db wait12          /256 ; 7B
  989.         db wait13          /256 ; 7C
  990.         db wait14          /256 ; 7D
  991.         db wait15          /256 ; 7E
  992.         db wait16          /256 ; 7F
  993.         db skip1           /256 ; 80
  994.         db wait1           /256 ; 81
  995.         db wait2           /256 ; 82
  996.         db wait3           /256 ; 83
  997.         db wait4           /256 ; 84
  998.         db wait5           /256 ; 85
  999.         db wait6           /256 ; 86
  1000.         db wait7           /256 ; 87
  1001.         db wait8           /256 ; 88
  1002.         db wait9           /256 ; 89
  1003.         db wait10          /256 ; 8A
  1004.         db wait11          /256 ; 8B
  1005.         db wait12          /256 ; 8C
  1006.         db wait13          /256 ; 8D
  1007.         db wait14          /256 ; 8E
  1008.         db wait15          /256 ; 8F
  1009.         db skip5           /256 ; 90
  1010.         db skip5           /256 ; 91
  1011.         db skip6           /256 ; 92
  1012.         db skip11          /256 ; 93
  1013.         db skip2           /256 ; 94
  1014.         db skip5           /256 ; 95
  1015.         db cmdunsupported  /256 ; 96
  1016.         db cmdunsupported  /256 ; 97
  1017.         db cmdunsupported  /256 ; 98
  1018.         db cmdunsupported  /256 ; 99
  1019.         db cmdunsupported  /256 ; 9A
  1020.         db cmdunsupported  /256 ; 9B
  1021.         db cmdunsupported  /256 ; 9C
  1022.         db cmdunsupported  /256 ; 9D
  1023.         db cmdunsupported  /256 ; 9E
  1024.         db cmdunsupported  /256 ; 9F
  1025.         db cmdAY8910       /256 ; A0
  1026.         db skip3           /256 ; A1
  1027.         db cmdunsupported  /256 ; A2
  1028.         db cmdunsupported  /256 ; A3
  1029.         db cmdYM2151dp     /256 ; A4
  1030.         db cmdYM2203dp     /256 ; A5
  1031.         db skip3           /256 ; A6
  1032.         db skip3           /256 ; A7
  1033.         db skip3           /256 ; A8
  1034.         db skip3           /256 ; A9
  1035.         db cmdYM3812dp     /256 ; AA
  1036.         db cmdYM3526dp     /256 ; AB
  1037.         db cmdY8950dp      /256 ; AC
  1038.         db skip3           /256 ; AD
  1039.         db cmdYMF262dp0    /256 ; AE
  1040.         db cmdYMF262dp0    /256 ; AF
  1041.         db skip3           /256 ; B0
  1042.         db skip3           /256 ; B1
  1043.         db skip3           /256 ; B2
  1044.         db skip3           /256 ; B3
  1045.         db skip3           /256 ; B4
  1046.         db skip3           /256 ; B5
  1047.         db skip3           /256 ; B6
  1048.         db skip3           /256 ; B7
  1049.         db skip3           /256 ; B8
  1050.         db skip3           /256 ; B9
  1051.         db skip3           /256 ; BA
  1052.         db skip3           /256 ; BB
  1053.         db skip3           /256 ; BC
  1054.         db skip3           /256 ; BD
  1055.         db skip3           /256 ; BE
  1056.         db skip3           /256 ; BF
  1057.         db skip4           /256 ; C0
  1058.         db skip4           /256 ; C1
  1059.         db skip4           /256 ; C2
  1060.         db skip4           /256 ; C3
  1061.         db skip4           /256 ; C4
  1062.         db skip4           /256 ; C5
  1063.         db skip4           /256 ; C6
  1064.         db skip4           /256 ; C7
  1065.         db skip4           /256 ; C8
  1066.         db skip4           /256 ; C9
  1067.         db skip4           /256 ; CA
  1068.         db skip4           /256 ; CB
  1069.         db skip4           /256 ; CC
  1070.         db skip4           /256 ; CD
  1071.         db skip4           /256 ; CE
  1072.         db skip4           /256 ; CF
  1073.         db cmdYMF278B      /256 ; D0
  1074.         db skip4           /256 ; D1
  1075.         db cmdunsupported  /256 ; D2
  1076.         db skip4           /256 ; D3
  1077.         db skip4           /256 ; D4
  1078.         db skip4           /256 ; D5
  1079.         db skip4           /256 ; D6
  1080.         db skip4           /256 ; D7
  1081.         db skip4           /256 ; D8
  1082.         db skip4           /256 ; D9
  1083.         db skip4           /256 ; DA
  1084.         db skip4           /256 ; DB
  1085.         db skip4           /256 ; DC
  1086.         db skip4           /256 ; DD
  1087.         db skip4           /256 ; DE
  1088.         db skip4           /256 ; DF
  1089.         db cmdunsupported  /256 ; E0
  1090.         db skip5           /256 ; E1
  1091.         db skip5           /256 ; E2
  1092.         db skip5           /256 ; E3
  1093.         db skip5           /256 ; E4
  1094.         db skip5           /256 ; E5
  1095.         db skip5           /256 ; E6
  1096.         db skip5           /256 ; E7
  1097.         db skip5           /256 ; E8
  1098.         db skip5           /256 ; E9
  1099.         db skip5           /256 ; EA
  1100.         db skip5           /256 ; EB
  1101.         db skip5           /256 ; EC
  1102.         db skip5           /256 ; ED
  1103.         db skip5           /256 ; EE
  1104.         db skip5           /256 ; EF
  1105.         db skip5           /256 ; F0
  1106.         db skip5           /256 ; F1
  1107.         db skip5           /256 ; F2
  1108.         db skip5           /256 ; F3
  1109.         db skip5           /256 ; F4
  1110.         db skip5           /256 ; F5
  1111.         db skip5           /256 ; F6
  1112.         db skip5           /256 ; F7
  1113.         db skip5           /256 ; F8
  1114.         db skip5           /256 ; F9
  1115.         db skip5           /256 ; FA
  1116.         db skip5           /256 ; FB
  1117.         db skip5           /256 ; FC
  1118.         db skip5           /256 ; FD
  1119.         db skip5           /256 ; FE
  1120.         db skip5           /256 ; FF
  1121.  
  1122. decompressfiletomemorystream
  1123. ;de = input file name
  1124. ;out: zf=1 is successful, zf=0 otherwise
  1125.         call openstream_file
  1126.         or a
  1127.         ret nz
  1128.         ld (memorystreampagecount),a
  1129.         ld hl,0
  1130.         ld (memorystreamsize+0),hl
  1131.         ld (memorystreamsize+2),hl
  1132.         call memorystreamstart
  1133. ;backup the data from app page
  1134.         ld a,(filedatapage)
  1135.         SETPG8000
  1136.         ld hl,GzipWorkBuffersStart
  1137.         ld de,0x8000
  1138.         ld bc,GzipWorkBuffersEnd-GzipWorkBuffersStart
  1139.         ldir
  1140. ;decompress
  1141.         call setsharedpages
  1142.         ld (savedSP),sp
  1143.         call GzipExtract
  1144.         call closestream_file
  1145.         call restoreappdata
  1146.         xor a
  1147.         ret
  1148.  
  1149. restoreappdata
  1150. filedatapage=$+1
  1151.         ld a,0
  1152.         SETPG8000
  1153.         ld hl,0x8000
  1154.         ld de,GzipWorkBuffersStart
  1155.         ld bc,GzipWorkBuffersEnd-GzipWorkBuffersStart
  1156.         ldir
  1157.         ret
  1158.  
  1159. GzipThrowException
  1160. GzipExitWithError
  1161.         ld hl,gziperrorstr
  1162.         ld (ERRORSTRINGADDR),hl
  1163. GzipThrowExceptionNoError
  1164. savedSP=$+1
  1165.         ld sp,0
  1166.         call memorystreamfree
  1167.         call restoreappdata
  1168.         call closestream_file
  1169.         or 1
  1170.         ret
  1171.  
  1172. setsharedpages
  1173. page8000=$+1
  1174.         ld a,0
  1175.         SETPG8000
  1176. pageC000=$+1
  1177.         ld a,0
  1178.         SETPGC000
  1179.         ret
  1180.  
  1181. GzipReadInputBuffer
  1182. ;de = InputBuffer
  1183. ;hl = InputBufSize
  1184.         exx
  1185.         ex af,af'
  1186.         push af,bc,de,hl,ix,iy
  1187.         ld de,InputBuffer
  1188.         ld hl,InputBufSize
  1189.         call readstream_file
  1190.         pop iy,ix,hl,de,bc,af
  1191.         exx
  1192.         ex af,af'
  1193.         ret
  1194.  
  1195. GzipWriteOutputBuffer
  1196. ;de = OutputBuffer
  1197. ;hl = size
  1198.         exx
  1199.         ex af,af'
  1200.         push af,bc,de,hl,ix,iy
  1201.         exx
  1202. ;allocate memory
  1203.         ld a,l
  1204.         add a,0xff
  1205.         ld a,h
  1206.         adc a,0x3f
  1207.         rlca
  1208.         rlca
  1209.         and 3
  1210.         ld b,a
  1211.         ld a,(memorystreampagecount)
  1212.         ld c,a
  1213.         push hl
  1214.         add a,memorystreampages%256
  1215.         ld l,a
  1216.         adc a,memorystreampages/256
  1217.         sub l
  1218.         ld h,a
  1219. .allocloop
  1220.         push bc
  1221.         push hl
  1222.         OS_NEWPAGE
  1223.         or a
  1224.         pop hl
  1225.         pop bc
  1226.         jr z,.pageallocated
  1227.         ld a,c
  1228.         ld (memorystreampagecount),a
  1229.         ld hl,oomerrorstr
  1230.         ld (ERRORSTRINGADDR),hl
  1231.         jp GzipThrowExceptionNoError
  1232. .pageallocated
  1233.         ld (hl),e
  1234.         inc hl
  1235.         inc c
  1236.         djnz .allocloop
  1237.         ld a,c
  1238.         ld (memorystreampagecount),a
  1239.         ld hl,(memorystreamsize+0)
  1240.         ld de,(memorystreamsize+2)
  1241.         push hl
  1242.         push de
  1243.         call memorystreamseek
  1244.         pop bc
  1245.         pop hl
  1246.         pop de
  1247.         add hl,de
  1248.         ld (memorystreamsize+0),hl
  1249.         jr nc,$+7
  1250.         inc bc
  1251.         ld (memorystreamsize+2),bc
  1252.         ex de,hl
  1253.         ld de,OutputBuffer
  1254. ;copy data to memory stream
  1255.         ld bc,hl
  1256.         add hl,de
  1257.         bit 7,h
  1258.         jr z,.below8000
  1259.         push hl
  1260.         ld bc,0x8000-OutputBuffer
  1261.         call memorystreamwrite
  1262.         pop hl
  1263.         res 7,h
  1264.         push hl
  1265.         ld de,0x4000
  1266.         sub hl,de
  1267.         ld a,(page8000)
  1268.         jr c,.write8000
  1269.         jr z,.write8000
  1270.         ex (sp),hl
  1271.         SETPGC000
  1272.         ld de,0xc000
  1273.         ld bc,0x4000
  1274.         call memorystreamwrite
  1275.         ld a,(pageC000)
  1276. .write8000
  1277.         SETPGC000
  1278.         ld de,0xc000
  1279.         pop bc
  1280. .below8000
  1281.         call memorystreamwrite
  1282.         call ondataloaded
  1283.         jp nz,GzipThrowExceptionNoError
  1284.         pop iy,ix,hl,de,bc,af
  1285.         exx
  1286.         ex af,af'
  1287.         jp setsharedpages
  1288.  
  1289.         include "common/gunzip.asm"
  1290.  
  1291.         macro set_device_mask devicebit
  1292.         ld hl,devicemask+devicebit/8
  1293.         set devicebit%8,(hl)
  1294.         endm
  1295.  
  1296.         macro check_device_mask devicebit
  1297.         ld hl,devicemask+devicebit/8
  1298.         bit devicebit%8,(hl)
  1299.         endm
  1300.  
  1301. initAY8910
  1302.         call ssginit
  1303.         ld a,(HEADER_CLOCK_AY8910+3)
  1304.         and 0x40
  1305.         jr nz,.dualchip
  1306.         set_device_mask DEVICE_AY_BIT
  1307.         ret
  1308. .dualchip
  1309.         set_device_mask DEVICE_TURBOSOUND_BIT
  1310.         ret
  1311.  
  1312. initYM2203
  1313. tfmstatus=$+1
  1314.         ld a,0
  1315.         dec a
  1316.         ret m
  1317.         call opninit
  1318.         set_timer opnwaittimer60hz,735
  1319.         call opninittimer60hz
  1320.         set_device_mask DEVICE_TFM_BIT
  1321.         xor a
  1322.         ret
  1323.  
  1324. initYMF278B
  1325. moonsoundstatus=$+1
  1326.         ld a,0
  1327.         dec a
  1328.         ret m
  1329.         call vgmopl4init
  1330.         ld a,(HEADER_CLOCK_YM3812+3)
  1331.         ld hl,HEADER_CLOCK_YM3526+3
  1332.         or (hl)
  1333.         ld hl,HEADER_CLOCK_Y8950+3
  1334.         or (hl)
  1335.         and 0x40
  1336.         jr nz,notOPL2
  1337. useYM3812=$+1
  1338.         or 0
  1339.         ld de,0x0005
  1340.         call nz,opl4writefm2
  1341. notOPL2 set_timer opl4waittimer60hz,735
  1342.         call opl4inittimer60hz
  1343.         set_device_mask DEVICE_MOONSOUND_BIT
  1344.         xor a
  1345.         ret
  1346.  
  1347. initYM2151
  1348. opmstatus=$+1
  1349.         ld a,0
  1350.         dec a
  1351.         ret m
  1352.         jr nz,.hasdualopm
  1353.         call opmdisablechip1
  1354.         ld a,(HEADER_CLOCK_YM2151+3)
  1355.         and 0x40
  1356.         ret nz
  1357. .hasdualopm
  1358.         call vgmopminit
  1359.         ld a,(HEADER_CLOCK_YM2151+3)
  1360.         and 0x40
  1361.         jr nz,.dualchip
  1362.         set_device_mask DEVICE_OPM_BIT
  1363.         xor a
  1364.         ret
  1365. .dualchip
  1366.         set_device_mask DEVICE_DUAL_OPM_BIT
  1367.         xor a
  1368.         ret
  1369.  
  1370. musicunload
  1371.         check_device_mask DEVICE_MOONSOUND_BIT
  1372.         call nz,opl4mute
  1373.         check_device_mask DEVICE_TFM_BIT
  1374.         call nz,opnmute
  1375.         check_device_mask DEVICE_AY_BIT
  1376.         call nz,ssgmute
  1377.         check_device_mask DEVICE_TURBOSOUND_BIT
  1378.         call nz,ssgmute
  1379.         check_device_mask DEVICE_OPM_BIT
  1380.         call nz,opmmute
  1381.         check_device_mask DEVICE_DUAL_OPM_BIT
  1382.         call nz,opmmute
  1383.         jp memorystreamfree
  1384.  
  1385. cmdYM2608p0 equ cmdYM2203
  1386.  
  1387. cmdYM2608p1
  1388.         memory_stream_read_2 e,d
  1389.         ld a,e
  1390.         cp 0x30
  1391.         ret c
  1392.         jp opnwritefm2
  1393.  
  1394. initokstr
  1395.         db "OK\r\n",0
  1396. playernamestr
  1397.         db "VGM Player",0
  1398. fromstr
  1399.         db " [",0
  1400. bystr
  1401.         db "] by ",0
  1402. end
  1403.  
  1404. GzipWorkBuffersStart = PROGSTART
  1405. vgmheadercopy = $
  1406. vgmheadercopyend = vgmheadercopy+HEADER_SIZE_MAX
  1407. GzipOutputBuffersStart = vgmheadercopyend
  1408. waveheaderbuffer = vgmheadercopyend
  1409. waveheaderbufferend = waveheaderbuffer+WAVEHEADERBUFFERSIZE
  1410. titlestr = waveheaderbufferend
  1411. titlestrend = titlestr+TITLELENGTH
  1412.  
  1413. HEADER_LOOP_SAMPLES_COUNT = vgmheadercopy+0x20
  1414. HEADER_GD3_OFFSET    = vgmheadercopy+0x14
  1415. HEADER_SAMPLES_COUNT = vgmheadercopy+0x18
  1416. HEADER_LOOP_OFFSET   = vgmheadercopy+0x1c
  1417. HEADER_CLOCK_YM2151  = vgmheadercopy+0x30
  1418. HEADER_CLOCK_YM2203  = vgmheadercopy+0x44
  1419. HEADER_CLOCK_YM2608  = vgmheadercopy+0x48
  1420. HEADER_CLOCK_YM3812  = vgmheadercopy+0x50
  1421. HEADER_CLOCK_YM3526  = vgmheadercopy+0x54
  1422. HEADER_CLOCK_Y8950   = vgmheadercopy+0x58
  1423. HEADER_CLOCK_YMF262  = vgmheadercopy+0x5c
  1424. HEADER_CLOCK_YMF278B = vgmheadercopy+0x60
  1425. HEADER_CLOCK_AY8910  = vgmheadercopy+0x74
  1426.  
  1427.         assert vgmheadercopyend <= PLAYEREND ;ensure everything is within the player page
  1428.         assert GzipOutputBuffersEnd <= 0x10000
  1429.         assert GzipWorkBuffersEnd <= 0x3500 ;ensure the buffers and stack are not overlapping
  1430.  
  1431.         savebin "vgm.bin",begin,end-begin
  1432.