Subversion Repositories NedoOS

Rev

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

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