Subversion Repositories NedoOS

Rev

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