?login_element?

Subversion Repositories NedoOS

Rev

Rev 1945 | Rev 2009 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. ; Video Game Music player
  2. ; Supports AY8910, YM3812, YMF262, YMF278B, YM2203.
  3.  
  4.         DEVICE ZXSPECTRUM128
  5.         include "../_sdk/sys_h.asm"
  6.         include "playerdefs.asm"
  7.  
  8. HEADER_DATA_OFFSET = 0x8034
  9. HEADER_CLOCK_YM2203 = 0x8044
  10. HEADER_CLOCK_YM3812 = 0x8050
  11. HEADER_CLOCK_YMF262 = 0x805c
  12. HEADER_CLOCK_YMF278B = 0x8060
  13. HEADER_CLOCK_AY8910 = 0x8074
  14. HEADER_GD3_OFFSET = 0x8014
  15. HEADER_SAMPLES_COUNT = 0x8018
  16. HEADER_LOOP_OFFSET = 0x801c
  17. HEADER_LOOP_SAMPLES_COUNT = 0x8020
  18. TITLELENGTH = 64
  19. MEMORYSTREAMMAXPAGES = 210
  20. MEMORYSTREAMERRORMASK = 255 ; TODO: do we need to enforce loading the entire file?
  21.  
  22.         org PLAYERSTART
  23.  
  24. begin   PLAYERHEADER
  25.  
  26. isfilesupported
  27. ;cde = file extension
  28. ;out: zf=1 if this player can handle the file and the sound hardware is available, zf=0 otherwise
  29.         ld a,c
  30.         cp 'v'
  31.         ret nz
  32.         ld a,d
  33.         cp 'g'
  34.         ret nz
  35.         ld a,e
  36.         cp 'm'
  37.         jr z,$+5
  38.         cp 'z'
  39.         ret nz
  40. ;prepare local variables
  41.         ld hl,0
  42.         ld (MUSICTITLEADDR),hl
  43.         ld hl,musicprogress+1
  44.         ld (MUSICPROGRESSADDR),hl
  45.         jp initprogress
  46.  
  47. playerinit
  48. ;hl = GPSETTINGS
  49. ;a = player page
  50. ;out: zf=1 if init is successful, hl=init message
  51.         ld a,(hl)
  52.         ld (page8000),a
  53.         inc hl
  54.         ld a,(hl)
  55.         ld (pageC000),a
  56.         inc hl
  57.         ld a,(hl)
  58.         ld (filedatapage),a
  59. ;hardware detection is done when loading VGM
  60.         ld hl,initokstr
  61.         xor a
  62.         ret
  63.  
  64.         macro a_or_dw addr
  65.         ld hl,(addr+0)
  66.         or h
  67.         or l
  68.         ld de,(addr+2)
  69.         or d
  70.         or e
  71.         endm
  72.  
  73.         macro set_timer wait,ticks
  74.         ld hl,wait
  75.         ld (waittimercallback),hl
  76.         ld hl,ticks
  77.         ld (waittimerstep),hl
  78.         endm
  79.  
  80. musicload
  81. ;cde = file extension
  82. ;hl = input file name
  83. ;out: zf=1 if the file is ready for playing, zf=0 otherwise
  84.         ld a,e
  85.         cp 'z'
  86.         ex de,hl
  87.         jr z,.loadcompressed
  88.         call memorystreamloadfile
  89.         jr z,.doneloading
  90.         ret
  91. .loadcompressed
  92.         call decompressfiletomemorystream
  93.         ret nz
  94. .doneloading
  95.         set_timer waittimer50hz,882
  96.         ld hl,0
  97.         ld (waitcounter),hl
  98.         ld (samplecounterlo),hl
  99.         xor a
  100.         ld (samplecounterhi),a
  101. ;map header to 0x8000
  102.         ld a,(memorystreampages)
  103.         SETPG8000
  104. ;init progress
  105.         ld hl,(HEADER_SAMPLES_COUNT+2)
  106.         ld bc,(HEADER_LOOP_SAMPLES_COUNT+2)
  107.         add hl,bc
  108.         inc hl ;+1 as if low-word addition sets cf
  109.         ld a,l
  110.         inc h
  111.         dec h
  112.         jr z,$+4
  113.         ld a,255
  114.         call setprogressdelta
  115. ;check for GD3
  116.         xor a
  117.         a_or_dw HEADER_GD3_OFFSET
  118.         call nz,parsegd3
  119. ;setup loop
  120.         xor a
  121.         a_or_dw HEADER_LOOP_OFFSET
  122.         ld (loopoffsetlo),hl
  123.         ld (loopoffsethi),de
  124.         jr z,$+4
  125.         ld a,1
  126.         inc a
  127.         ld (loopcounter),a
  128. ;init AY before TFM in case of weird chip combos
  129.         xor a
  130.         a_or_dw HEADER_CLOCK_AY8910
  131.         ld (useAY8910),a
  132.         call nz,initAY8910
  133. ;init TFM
  134.         xor a
  135.         a_or_dw HEADER_CLOCK_YM2203
  136.         ld (useYM2203),a
  137.         call nz,initYM2203
  138. ;init Moonsound
  139.         xor a
  140.         a_or_dw HEADER_CLOCK_YM3812
  141.         ld (useYM3812),a
  142.         a_or_dw HEADER_CLOCK_YMF262
  143.         a_or_dw HEADER_CLOCK_YMF278B
  144.         ld (useYMF278B),a
  145.         call nz,initYMF278B
  146.         jp nz,memorystreamfree ;sets zf=0
  147. ;skip to the data
  148.         call memorystreamstart
  149.         ld hl,(HEADER_DATA_OFFSET)
  150.         ld a,(HEADER_DATA_OFFSET+2)
  151.         ld d,a
  152.         or l
  153.         or h
  154.         ld bc,0x40
  155.         jr z,$+4
  156.         ld c,0x34
  157.         add hl,bc
  158.         jr nc,$+3
  159.         inc d
  160.         call skipdatablock
  161.         xor a
  162.         ret
  163.  
  164. initAY8910 equ ssginit
  165.  
  166. initYM2203
  167.         call opninit
  168.         set_timer opnwaittimer60hz,735
  169.         jp opninittimer60hz
  170.  
  171. initYMF278B
  172.         call ismoonsoundpresent
  173.         ret nz
  174.         call vgmopl4init
  175.         ld a,(HEADER_CLOCK_YM3812+3)
  176.         and 0x40
  177.         jr nz,notOPL2
  178. useYM3812=$+1
  179.         or 0
  180.         ld de,0x0005
  181.         call nz,opl4writefm2
  182. notOPL2 set_timer opl4waittimer60hz,735
  183.         call opl4inittimer60hz
  184.         xor a
  185.         ret
  186.  
  187. musicunload
  188. useYMF278B=$+1
  189.         ld a,0
  190.         or a
  191.         call nz,opl4mute
  192. useYM2203=$+1
  193.         ld a,0
  194.         or a
  195.         call nz,opnmute
  196. ;mute AY after TFM in case of weird chip combos
  197. useAY8910=$+1
  198.         ld a,0
  199.         or a
  200.         call nz,ssgmute
  201.         jp memorystreamfree
  202.  
  203. playerdeinit
  204.         ret
  205.  
  206.         include "../_sdk/file.asm"
  207.         include "common/memorystream.asm"
  208.         include "common/opl4.asm"
  209.         include "vgm/opl4.asm"
  210.         include "vgm/opn.asm"
  211.         include "vgm/ssg.asm"
  212.         include "progress.asm"
  213.  
  214. waittimer50hz
  215.         YIELD
  216.         ret
  217.  
  218. musicplay
  219. ;out: zf=0 if still playing, zf=1 otherwise
  220. waittimercallback=$+1
  221.         call 0
  222. playloop
  223. waitcounter=$+1
  224.         ld hl,0
  225. waittimerstep=$+1
  226.         ld bc,0
  227.         sub hl,bc
  228.         jr nc,exitplayloop
  229. ;read command
  230.         memory_stream_read_1 a
  231.         ld l,a
  232.         ld h,cmdtable/256
  233.         ld e,(hl)
  234.         inc h
  235.         ld d,(hl)
  236.         ld hl,playloop
  237.         push hl
  238.         ex hl,de
  239.         jp (hl)
  240. exitplayloop
  241.         ld (waitcounter),hl
  242. ;update progress
  243. samplecounterlo=$+1
  244.         ld hl,0
  245. samplecounterhi=$+1
  246.         ld a,0
  247.         add hl,bc
  248.         adc a,0
  249.         jr nc,$+4
  250.         ld a,255
  251.         ld (samplecounterlo),hl
  252.         ld (samplecounterhi),a
  253.         call updateprogress
  254. ;continue playing
  255.         or 1
  256.         ret
  257.  
  258. wait1   ld hl,(waitcounter)
  259.         inc hl
  260.         ld (waitcounter),hl
  261.         ret
  262.  
  263. waitn   memory_stream_read_2 e,d
  264.         ld hl,(waitcounter)
  265.         add hl,de
  266.         ld (waitcounter),hl
  267.         ret
  268.  
  269.         macro wait_n n
  270.         ld hl,(waitcounter)
  271.         ld de,n
  272.         add hl,de
  273.         ld (waitcounter),hl
  274.         ret
  275.         endm
  276.  
  277. wait2   wait_n 2
  278. wait3   wait_n 3
  279. wait4   wait_n 4
  280. wait5   wait_n 5
  281. wait6   wait_n 6
  282. wait7   wait_n 7
  283. wait8   wait_n 8
  284. wait9   wait_n 9
  285. wait10  wait_n 10
  286. wait11  wait_n 11
  287. wait12  wait_n 12
  288. wait13  wait_n 13
  289. wait14  wait_n 14
  290. wait15  wait_n 15
  291. wait16  wait_n 16
  292. wait735 wait_n 735
  293. wait882 wait_n 882
  294.  
  295.         macro skip_n n
  296.         ld b,n
  297.         jp memorystreamskip
  298.         endm
  299.  
  300. skip1   ret
  301. skip2   skip_n 1
  302. skip3   skip_n 2
  303. skip4   skip_n 3
  304. skip5   skip_n 4
  305. skip6   skip_n 5
  306. skip11  skip_n 10
  307. skip12  skip_n 11
  308.  
  309.  
  310. endofsounddata
  311. loopcounter=$+1
  312.         ld a,0
  313.         dec a
  314.         ld (loopcounter),a
  315.         jp nz,seektoloop
  316. cmdunsupported
  317. ;stop playing
  318.         pop af
  319.         xor a
  320.         ret
  321.  
  322. cmdYM2203
  323.         memory_stream_read_2 e,d
  324.         jp opnwritemusiconlyfm1
  325.  
  326. cmdYM2203dp
  327.         memory_stream_read_2 e,d
  328.         jp opnwritemusiconlyfm2
  329.  
  330. cmdYMF262p0
  331.         memory_stream_read_2 e,d
  332.         jp opl4writemusiconlyfm1
  333.  
  334. cmdYMF262p1
  335.         memory_stream_read_2 e,d
  336.         jp opl4writemusiconlyfm2
  337.  
  338. cmdYMF278B
  339.         memory_stream_read_3 c,e,d
  340.         dec c
  341.         jp z,opl4writemusiconlyfm2
  342.         jp p,opl4writewavemusiconly
  343.         jp opl4writemusiconlyfm1
  344.  
  345. cmdYM3812
  346.         memory_stream_read_2 e,d
  347.         jp opl4writemusiconlyfm1
  348.  
  349. cmdYM3812dp
  350.         memory_stream_read_2 e,d
  351.         jp opl4writemusiconlyfm2
  352.  
  353. cmdAY8910
  354.         memory_stream_read_2 e,d
  355.         bit 7,e
  356.         jp z,ssgwritemusiconlychip0
  357.         res 7,e
  358.         jp ssgwritemusiconlychip1
  359.  
  360. cmdYMF262dp0 equ memorystreamread2
  361. cmdYMF262dp1 equ memorystreamread2
  362.  
  363. processdatablock
  364.         memory_stream_read_2 a,e ;a = 0x66 guard, e = type
  365.         cp 0x66
  366.         jp nz,cmdunsupported
  367.         call memorystreamread4 ;adbc = data size
  368.         ld a,e
  369.         ld hl,bc
  370.         cp 0x84
  371.         jp z,opl4loadromdatablock
  372.         cp 0x87
  373.         jp z,opl4loadramdatablock
  374.         jr skipdatablock
  375.  
  376. skipdatablock
  377. ;dhl = size
  378.         call setup24bitscounterloop
  379. .loop
  380.         call memorystreamskip
  381.         dec de
  382.         ld a,e
  383.         or d
  384.         jr nz,.loop
  385.         ret
  386.  
  387. seektoloop
  388.         ld bc,0x1c
  389. loopoffsethi=$+1
  390.         ld de,0
  391. loopoffsetlo=$+1
  392.         ld hl,0
  393. seektopos
  394. ;dehl + bc = position
  395. ;out: hl = read address
  396.         add hl,bc
  397.         jp nc,memorystreamseek
  398.         inc de
  399.         jp memorystreamseek
  400.  
  401. parsegd3
  402. ;dehl = GD3 offset
  403.         ld bc,32
  404.         call seektopos
  405.         ld b,TITLELENGTH
  406.         ld de,titlestr
  407.         ld a,' '
  408. .fillloop
  409.         ld (de),a
  410.         inc de
  411.         djnz .fillloop
  412.         xor a
  413.         ld (de),a
  414.         ld b,TITLELENGTH
  415.         ld de,titlestr
  416.         call gd3stringcopy   ;track name
  417.         call z,gd3stringskip ;track name in Japanese
  418.         push hl
  419.         ld hl,fromstr
  420.         call z,stringcopy
  421.         pop hl
  422.         call z,gd3stringcopy ;game name
  423.         call z,gd3stringskip ;game name in Japanese
  424.         call z,gd3stringskip ;system name
  425.         call z,gd3stringskip ;system name in Japanese
  426.         push hl
  427.         ld hl,bystr
  428.         call z,stringcopy
  429.         pop hl
  430.         call z,gd3stringcopy ;author
  431.         ld hl,titlestr
  432.         ld (MUSICTITLEADDR),hl
  433.         ld a,(memorystreampages)
  434.         SETPG8000
  435.         ret
  436.  
  437. gd3stringcopy
  438. ;hl = memorystreamcurrentaddr
  439. ;de = dest
  440. ;b = bytes remaining
  441. ;out: zf=1 if encountered zero terminator, zf=0 if out of space
  442.         memory_stream_read_byte a
  443.         memory_stream_read_byte c
  444.         or a
  445.         ret z
  446.         ld (de),a
  447.         inc de
  448.         djnz gd3stringcopy
  449.         ret
  450.  
  451. gd3stringskip
  452. ;hl = memorystreamcurrentaddr
  453. ;out: zf=1
  454.         memory_stream_read_byte a
  455.         memory_stream_read_byte c
  456.         or c
  457.         jr nz,gd3stringskip
  458.         ret
  459.  
  460. stringcopy
  461. ;hl = source
  462. ;de = dest
  463. ;b = bytes remaining
  464. ;out: zf=1 if encountered zero terminator, zf=0 if out of space
  465.         ld a,(hl)
  466.         or a
  467.         ret z
  468.         ld (de),a
  469.         inc hl
  470.         inc de
  471.         djnz stringcopy
  472.         ret
  473.  
  474.         align 256
  475. cmdtable
  476.         db skip1           %256 ; 00
  477.         db skip1           %256 ; 01
  478.         db skip1           %256 ; 02
  479.         db skip1           %256 ; 03
  480.         db skip1           %256 ; 04
  481.         db skip1           %256 ; 05
  482.         db skip1           %256 ; 06
  483.         db skip1           %256 ; 07
  484.         db skip1           %256 ; 08
  485.         db skip1           %256 ; 09
  486.         db skip1           %256 ; 0A
  487.         db skip1           %256 ; 0B
  488.         db skip1           %256 ; 0C
  489.         db skip1           %256 ; 0D
  490.         db skip1           %256 ; 0E
  491.         db skip1           %256 ; 0F
  492.         db skip1           %256 ; 10
  493.         db skip1           %256 ; 11
  494.         db skip1           %256 ; 12
  495.         db skip1           %256 ; 13
  496.         db skip1           %256 ; 14
  497.         db skip1           %256 ; 15
  498.         db skip1           %256 ; 16
  499.         db skip1           %256 ; 17
  500.         db skip1           %256 ; 18
  501.         db skip1           %256 ; 19
  502.         db skip1           %256 ; 1A
  503.         db skip1           %256 ; 1B
  504.         db skip1           %256 ; 1C
  505.         db skip1           %256 ; 1D
  506.         db skip1           %256 ; 1E
  507.         db skip1           %256 ; 1F
  508.         db skip1           %256 ; 20
  509.         db skip1           %256 ; 21
  510.         db skip1           %256 ; 22
  511.         db skip1           %256 ; 23
  512.         db skip1           %256 ; 24
  513.         db skip1           %256 ; 25
  514.         db skip1           %256 ; 26
  515.         db skip1           %256 ; 27
  516.         db skip1           %256 ; 28
  517.         db skip1           %256 ; 29
  518.         db skip1           %256 ; 2A
  519.         db skip1           %256 ; 2B
  520.         db skip1           %256 ; 2C
  521.         db skip1           %256 ; 2D
  522.         db skip1           %256 ; 2E
  523.         db skip1           %256 ; 2F
  524.         db cmdunsupported  %256 ; 30
  525.         db skip2           %256 ; 31
  526.         db skip2           %256 ; 32
  527.         db skip2           %256 ; 33
  528.         db skip2           %256 ; 34
  529.         db skip2           %256 ; 35
  530.         db skip2           %256 ; 36
  531.         db skip2           %256 ; 37
  532.         db skip2           %256 ; 38
  533.         db skip2           %256 ; 39
  534.         db skip2           %256 ; 3A
  535.         db skip2           %256 ; 3B
  536.         db skip2           %256 ; 3C
  537.         db skip2           %256 ; 3D
  538.         db skip2           %256 ; 3E
  539.         db skip2           %256 ; 3F
  540.         db skip3           %256 ; 40
  541.         db skip3           %256 ; 41
  542.         db skip3           %256 ; 42
  543.         db skip3           %256 ; 43
  544.         db skip3           %256 ; 44
  545.         db skip3           %256 ; 45
  546.         db skip3           %256 ; 46
  547.         db skip3           %256 ; 47
  548.         db skip3           %256 ; 48
  549.         db skip3           %256 ; 49
  550.         db skip3           %256 ; 4A
  551.         db skip3           %256 ; 4B
  552.         db skip3           %256 ; 4C
  553.         db skip3           %256 ; 4D
  554.         db skip3           %256 ; 4E
  555.         db skip2           %256 ; 4F
  556.         db cmdunsupported  %256 ; 50
  557.         db cmdunsupported  %256 ; 51
  558.         db cmdunsupported  %256 ; 52
  559.         db cmdunsupported  %256 ; 53
  560.         db cmdunsupported  %256 ; 54
  561.         db cmdYM2203       %256 ; 55
  562.         db cmdunsupported  %256 ; 56
  563.         db cmdunsupported  %256 ; 57
  564.         db cmdunsupported  %256 ; 58
  565.         db cmdunsupported  %256 ; 59
  566.         db cmdYM3812       %256 ; 5A
  567.         db cmdunsupported  %256 ; 5B
  568.         db cmdunsupported  %256 ; 5C
  569.         db skip3           %256 ; 5D
  570.         db cmdYMF262p0     %256 ; 5E
  571.         db cmdYMF262p1     %256 ; 5F
  572.         db cmdunsupported  %256 ; 60
  573.         db waitn           %256 ; 61
  574.         db wait735         %256 ; 62
  575.         db wait882         %256 ; 63
  576.         db cmdunsupported  %256 ; 64
  577.         db cmdunsupported  %256 ; 65
  578.         db endofsounddata  %256 ; 66
  579.         db processdatablock%256 ; 67
  580.         db skip12          %256 ; 68
  581.         db cmdunsupported  %256 ; 69
  582.         db cmdunsupported  %256 ; 6A
  583.         db cmdunsupported  %256 ; 6B
  584.         db cmdunsupported  %256 ; 6C
  585.         db cmdunsupported  %256 ; 6D
  586.         db cmdunsupported  %256 ; 6E
  587.         db cmdunsupported  %256 ; 6F
  588.         db wait1           %256 ; 70
  589.         db wait2           %256 ; 71
  590.         db wait3           %256 ; 72
  591.         db wait4           %256 ; 73
  592.         db wait5           %256 ; 74
  593.         db wait6           %256 ; 75
  594.         db wait7           %256 ; 76
  595.         db wait8           %256 ; 77
  596.         db wait9           %256 ; 78
  597.         db wait10          %256 ; 79
  598.         db wait11          %256 ; 7A
  599.         db wait12          %256 ; 7B
  600.         db wait13          %256 ; 7C
  601.         db wait14          %256 ; 7D
  602.         db wait15          %256 ; 7E
  603.         db wait16          %256 ; 7F
  604.         db skip1           %256 ; 80
  605.         db wait1           %256 ; 81
  606.         db wait2           %256 ; 82
  607.         db wait3           %256 ; 83
  608.         db wait4           %256 ; 84
  609.         db wait5           %256 ; 85
  610.         db wait6           %256 ; 86
  611.         db wait7           %256 ; 87
  612.         db wait8           %256 ; 88
  613.         db wait9           %256 ; 89
  614.         db wait10          %256 ; 8A
  615.         db wait11          %256 ; 8B
  616.         db wait12          %256 ; 8C
  617.         db wait13          %256 ; 8D
  618.         db wait14          %256 ; 8E
  619.         db wait15          %256 ; 8F
  620.         db skip5           %256 ; 90
  621.         db skip5           %256 ; 91
  622.         db skip6           %256 ; 92
  623.         db skip11          %256 ; 93
  624.         db skip2           %256 ; 94
  625.         db skip5           %256 ; 95
  626.         db cmdunsupported  %256 ; 96
  627.         db cmdunsupported  %256 ; 97
  628.         db cmdunsupported  %256 ; 98
  629.         db cmdunsupported  %256 ; 99
  630.         db cmdunsupported  %256 ; 9A
  631.         db cmdunsupported  %256 ; 9B
  632.         db cmdunsupported  %256 ; 9C
  633.         db cmdunsupported  %256 ; 9D
  634.         db cmdunsupported  %256 ; 9E
  635.         db cmdunsupported  %256 ; 9F
  636.         db cmdAY8910       %256 ; A0
  637.         db skip3           %256 ; A1
  638.         db cmdunsupported  %256 ; A2
  639.         db cmdunsupported  %256 ; A3
  640.         db cmdunsupported  %256 ; A4
  641.         db cmdYM2203dp     %256 ; A5
  642.         db skip3           %256 ; A6
  643.         db skip3           %256 ; A7
  644.         db skip3           %256 ; A8
  645.         db skip3           %256 ; A9
  646.         db cmdYM3812dp     %256 ; AA
  647.         db cmdunsupported  %256 ; AB
  648.         db cmdunsupported  %256 ; AC
  649.         db skip3           %256 ; AD
  650.         db cmdYMF262dp0    %256 ; AE
  651.         db cmdYMF262dp0    %256 ; AF
  652.         db skip3           %256 ; B0
  653.         db skip3           %256 ; B1
  654.         db skip3           %256 ; B2
  655.         db skip3           %256 ; B3
  656.         db skip3           %256 ; B4
  657.         db skip3           %256 ; B5
  658.         db skip3           %256 ; B6
  659.         db skip3           %256 ; B7
  660.         db skip3           %256 ; B8
  661.         db skip3           %256 ; B9
  662.         db skip3           %256 ; BA
  663.         db skip3           %256 ; BB
  664.         db skip3           %256 ; BC
  665.         db skip3           %256 ; BD
  666.         db skip3           %256 ; BE
  667.         db skip3           %256 ; BF
  668.         db skip4           %256 ; C0
  669.         db skip4           %256 ; C1
  670.         db skip4           %256 ; C2
  671.         db skip4           %256 ; C3
  672.         db skip4           %256 ; C4
  673.         db skip4           %256 ; C5
  674.         db skip4           %256 ; C6
  675.         db skip4           %256 ; C7
  676.         db skip4           %256 ; C8
  677.         db skip4           %256 ; C9
  678.         db skip4           %256 ; CA
  679.         db skip4           %256 ; CB
  680.         db skip4           %256 ; CC
  681.         db skip4           %256 ; CD
  682.         db skip4           %256 ; CE
  683.         db skip4           %256 ; CF
  684.         db cmdYMF278B      %256 ; D0
  685.         db skip4           %256 ; D1
  686.         db cmdunsupported  %256 ; D2
  687.         db skip4           %256 ; D3
  688.         db skip4           %256 ; D4
  689.         db skip4           %256 ; D5
  690.         db skip4           %256 ; D6
  691.         db skip4           %256 ; D7
  692.         db skip4           %256 ; D8
  693.         db skip4           %256 ; D9
  694.         db skip4           %256 ; DA
  695.         db skip4           %256 ; DB
  696.         db skip4           %256 ; DC
  697.         db skip4           %256 ; DD
  698.         db skip4           %256 ; DE
  699.         db skip4           %256 ; DF
  700.         db cmdunsupported  %256 ; E0
  701.         db skip5           %256 ; E1
  702.         db skip5           %256 ; E2
  703.         db skip5           %256 ; E3
  704.         db skip5           %256 ; E4
  705.         db skip5           %256 ; E5
  706.         db skip5           %256 ; E6
  707.         db skip5           %256 ; E7
  708.         db skip5           %256 ; E8
  709.         db skip5           %256 ; E9
  710.         db skip5           %256 ; EA
  711.         db skip5           %256 ; EB
  712.         db skip5           %256 ; EC
  713.         db skip5           %256 ; ED
  714.         db skip5           %256 ; EE
  715.         db skip5           %256 ; EF
  716.         db skip5           %256 ; F0
  717.         db skip5           %256 ; F1
  718.         db skip5           %256 ; F2
  719.         db skip5           %256 ; F3
  720.         db skip5           %256 ; F4
  721.         db skip5           %256 ; F5
  722.         db skip5           %256 ; F6
  723.         db skip5           %256 ; F7
  724.         db skip5           %256 ; F8
  725.         db skip5           %256 ; F9
  726.         db skip5           %256 ; FA
  727.         db skip5           %256 ; FB
  728.         db skip5           %256 ; FC
  729.         db skip5           %256 ; FD
  730.         db skip5           %256 ; FE
  731.         db skip5           %256 ; FF
  732.         db skip1           /256 ; 00
  733.         db skip1           /256 ; 01
  734.         db skip1           /256 ; 02
  735.         db skip1           /256 ; 03
  736.         db skip1           /256 ; 04
  737.         db skip1           /256 ; 05
  738.         db skip1           /256 ; 06
  739.         db skip1           /256 ; 07
  740.         db skip1           /256 ; 08
  741.         db skip1           /256 ; 09
  742.         db skip1           /256 ; 0A
  743.         db skip1           /256 ; 0B
  744.         db skip1           /256 ; 0C
  745.         db skip1           /256 ; 0D
  746.         db skip1           /256 ; 0E
  747.         db skip1           /256 ; 0F
  748.         db skip1           /256 ; 10
  749.         db skip1           /256 ; 11
  750.         db skip1           /256 ; 12
  751.         db skip1           /256 ; 13
  752.         db skip1           /256 ; 14
  753.         db skip1           /256 ; 15
  754.         db skip1           /256 ; 16
  755.         db skip1           /256 ; 17
  756.         db skip1           /256 ; 18
  757.         db skip1           /256 ; 19
  758.         db skip1           /256 ; 1A
  759.         db skip1           /256 ; 1B
  760.         db skip1           /256 ; 1C
  761.         db skip1           /256 ; 1D
  762.         db skip1           /256 ; 1E
  763.         db skip1           /256 ; 1F
  764.         db skip1           /256 ; 20
  765.         db skip1           /256 ; 21
  766.         db skip1           /256 ; 22
  767.         db skip1           /256 ; 23
  768.         db skip1           /256 ; 24
  769.         db skip1           /256 ; 25
  770.         db skip1           /256 ; 26
  771.         db skip1           /256 ; 27
  772.         db skip1           /256 ; 28
  773.         db skip1           /256 ; 29
  774.         db skip1           /256 ; 2A
  775.         db skip1           /256 ; 2B
  776.         db skip1           /256 ; 2C
  777.         db skip1           /256 ; 2D
  778.         db skip1           /256 ; 2E
  779.         db skip1           /256 ; 2F
  780.         db cmdunsupported  /256 ; 30
  781.         db skip2           /256 ; 31
  782.         db skip2           /256 ; 32
  783.         db skip2           /256 ; 33
  784.         db skip2           /256 ; 34
  785.         db skip2           /256 ; 35
  786.         db skip2           /256 ; 36
  787.         db skip2           /256 ; 37
  788.         db skip2           /256 ; 38
  789.         db skip2           /256 ; 39
  790.         db skip2           /256 ; 3A
  791.         db skip2           /256 ; 3B
  792.         db skip2           /256 ; 3C
  793.         db skip2           /256 ; 3D
  794.         db skip2           /256 ; 3E
  795.         db skip2           /256 ; 3F
  796.         db skip3           /256 ; 40
  797.         db skip3           /256 ; 41
  798.         db skip3           /256 ; 42
  799.         db skip3           /256 ; 43
  800.         db skip3           /256 ; 44
  801.         db skip3           /256 ; 45
  802.         db skip3           /256 ; 46
  803.         db skip3           /256 ; 47
  804.         db skip3           /256 ; 48
  805.         db skip3           /256 ; 49
  806.         db skip3           /256 ; 4A
  807.         db skip3           /256 ; 4B
  808.         db skip3           /256 ; 4C
  809.         db skip3           /256 ; 4D
  810.         db skip3           /256 ; 4E
  811.         db skip2           /256 ; 4F
  812.         db cmdunsupported  /256 ; 50
  813.         db cmdunsupported  /256 ; 51
  814.         db cmdunsupported  /256 ; 52
  815.         db cmdunsupported  /256 ; 53
  816.         db cmdunsupported  /256 ; 54
  817.         db cmdYM2203       /256 ; 55
  818.         db cmdunsupported  /256 ; 56
  819.         db cmdunsupported  /256 ; 57
  820.         db cmdunsupported  /256 ; 58
  821.         db cmdunsupported  /256 ; 59
  822.         db cmdYM3812       /256 ; 5A
  823.         db cmdunsupported  /256 ; 5B
  824.         db cmdunsupported  /256 ; 5C
  825.         db skip3           /256 ; 5D
  826.         db cmdYMF262p0     /256 ; 5E
  827.         db cmdYMF262p1     /256 ; 5F
  828.         db cmdunsupported  /256 ; 60
  829.         db waitn           /256 ; 61
  830.         db wait735         /256 ; 62
  831.         db wait882         /256 ; 63
  832.         db cmdunsupported  /256 ; 64
  833.         db cmdunsupported  /256 ; 65
  834.         db endofsounddata  /256 ; 66
  835.         db processdatablock/256 ; 67
  836.         db skip12          /256 ; 68
  837.         db cmdunsupported  /256 ; 69
  838.         db cmdunsupported  /256 ; 6A
  839.         db cmdunsupported  /256 ; 6B
  840.         db cmdunsupported  /256 ; 6C
  841.         db cmdunsupported  /256 ; 6D
  842.         db cmdunsupported  /256 ; 6E
  843.         db cmdunsupported  /256 ; 6F
  844.         db wait1           /256 ; 70
  845.         db wait2           /256 ; 71
  846.         db wait3           /256 ; 72
  847.         db wait4           /256 ; 73
  848.         db wait5           /256 ; 74
  849.         db wait6           /256 ; 75
  850.         db wait7           /256 ; 76
  851.         db wait8           /256 ; 77
  852.         db wait9           /256 ; 78
  853.         db wait10          /256 ; 79
  854.         db wait11          /256 ; 7A
  855.         db wait12          /256 ; 7B
  856.         db wait13          /256 ; 7C
  857.         db wait14          /256 ; 7D
  858.         db wait15          /256 ; 7E
  859.         db wait16          /256 ; 7F
  860.         db skip1           /256 ; 80
  861.         db wait1           /256 ; 81
  862.         db wait2           /256 ; 82
  863.         db wait3           /256 ; 83
  864.         db wait4           /256 ; 84
  865.         db wait5           /256 ; 85
  866.         db wait6           /256 ; 86
  867.         db wait7           /256 ; 87
  868.         db wait8           /256 ; 88
  869.         db wait9           /256 ; 89
  870.         db wait10          /256 ; 8A
  871.         db wait11          /256 ; 8B
  872.         db wait12          /256 ; 8C
  873.         db wait13          /256 ; 8D
  874.         db wait14          /256 ; 8E
  875.         db wait15          /256 ; 8F
  876.         db skip5           /256 ; 90
  877.         db skip5           /256 ; 91
  878.         db skip6           /256 ; 92
  879.         db skip11          /256 ; 93
  880.         db skip2           /256 ; 94
  881.         db skip5           /256 ; 95
  882.         db cmdunsupported  /256 ; 96
  883.         db cmdunsupported  /256 ; 97
  884.         db cmdunsupported  /256 ; 98
  885.         db cmdunsupported  /256 ; 99
  886.         db cmdunsupported  /256 ; 9A
  887.         db cmdunsupported  /256 ; 9B
  888.         db cmdunsupported  /256 ; 9C
  889.         db cmdunsupported  /256 ; 9D
  890.         db cmdunsupported  /256 ; 9E
  891.         db cmdunsupported  /256 ; 9F
  892.         db cmdAY8910       /256 ; A0
  893.         db skip3           /256 ; A1
  894.         db cmdunsupported  /256 ; A2
  895.         db cmdunsupported  /256 ; A3
  896.         db cmdunsupported  /256 ; A4
  897.         db cmdYM2203dp     /256 ; A5
  898.         db skip3           /256 ; A6
  899.         db skip3           /256 ; A7
  900.         db skip3           /256 ; A8
  901.         db skip3           /256 ; A9
  902.         db cmdYM3812dp     /256 ; AA
  903.         db cmdunsupported  /256 ; AB
  904.         db cmdunsupported  /256 ; AC
  905.         db skip3           /256 ; AD
  906.         db cmdYMF262dp0    /256 ; AE
  907.         db cmdYMF262dp0    /256 ; AF
  908.         db skip3           /256 ; B0
  909.         db skip3           /256 ; B1
  910.         db skip3           /256 ; B2
  911.         db skip3           /256 ; B3
  912.         db skip3           /256 ; B4
  913.         db skip3           /256 ; B5
  914.         db skip3           /256 ; B6
  915.         db skip3           /256 ; B7
  916.         db skip3           /256 ; B8
  917.         db skip3           /256 ; B9
  918.         db skip3           /256 ; BA
  919.         db skip3           /256 ; BB
  920.         db skip3           /256 ; BC
  921.         db skip3           /256 ; BD
  922.         db skip3           /256 ; BE
  923.         db skip3           /256 ; BF
  924.         db skip4           /256 ; C0
  925.         db skip4           /256 ; C1
  926.         db skip4           /256 ; C2
  927.         db skip4           /256 ; C3
  928.         db skip4           /256 ; C4
  929.         db skip4           /256 ; C5
  930.         db skip4           /256 ; C6
  931.         db skip4           /256 ; C7
  932.         db skip4           /256 ; C8
  933.         db skip4           /256 ; C9
  934.         db skip4           /256 ; CA
  935.         db skip4           /256 ; CB
  936.         db skip4           /256 ; CC
  937.         db skip4           /256 ; CD
  938.         db skip4           /256 ; CE
  939.         db skip4           /256 ; CF
  940.         db cmdYMF278B      /256 ; D0
  941.         db skip4           /256 ; D1
  942.         db cmdunsupported  /256 ; D2
  943.         db skip4           /256 ; D3
  944.         db skip4           /256 ; D4
  945.         db skip4           /256 ; D5
  946.         db skip4           /256 ; D6
  947.         db skip4           /256 ; D7
  948.         db skip4           /256 ; D8
  949.         db skip4           /256 ; D9
  950.         db skip4           /256 ; DA
  951.         db skip4           /256 ; DB
  952.         db skip4           /256 ; DC
  953.         db skip4           /256 ; DD
  954.         db skip4           /256 ; DE
  955.         db skip4           /256 ; DF
  956.         db cmdunsupported  /256 ; E0
  957.         db skip5           /256 ; E1
  958.         db skip5           /256 ; E2
  959.         db skip5           /256 ; E3
  960.         db skip5           /256 ; E4
  961.         db skip5           /256 ; E5
  962.         db skip5           /256 ; E6
  963.         db skip5           /256 ; E7
  964.         db skip5           /256 ; E8
  965.         db skip5           /256 ; E9
  966.         db skip5           /256 ; EA
  967.         db skip5           /256 ; EB
  968.         db skip5           /256 ; EC
  969.         db skip5           /256 ; ED
  970.         db skip5           /256 ; EE
  971.         db skip5           /256 ; EF
  972.         db skip5           /256 ; F0
  973.         db skip5           /256 ; F1
  974.         db skip5           /256 ; F2
  975.         db skip5           /256 ; F3
  976.         db skip5           /256 ; F4
  977.         db skip5           /256 ; F5
  978.         db skip5           /256 ; F6
  979.         db skip5           /256 ; F7
  980.         db skip5           /256 ; F8
  981.         db skip5           /256 ; F9
  982.         db skip5           /256 ; FA
  983.         db skip5           /256 ; FB
  984.         db skip5           /256 ; FC
  985.         db skip5           /256 ; FD
  986.         db skip5           /256 ; FE
  987.         db skip5           /256 ; FF
  988.  
  989. decompressfiletomemorystream
  990. ;de = input file name
  991. ;out: zf=1 is successful, zf=0 otherwise
  992.         call openstream_file
  993.         or a
  994.         ret nz
  995. ;read the last 4 bytes containing decompressed file size
  996.         ld a,(filehandle)
  997.         ld b,a
  998.         OS_GETFILESIZE
  999.         ld bc,4
  1000.         sub hl,bc
  1001.         jr nc,$+3
  1002.         dec de
  1003.         ld a,(filehandle)
  1004.         ld b,a
  1005.         OS_SEEKHANDLE
  1006.         ld de,memorystreamsize
  1007.         ld hl,4
  1008.         call readstream_file
  1009.         ld a,(filehandle)
  1010.         ld b,a
  1011.         ld hl,0
  1012.         ld de,hl
  1013.         OS_SEEKHANDLE
  1014. ;allocate memory
  1015.         ld hl,(memorystreamsize+0)
  1016.         ld de,(memorystreamsize+2)
  1017.         call memorystreamallocate
  1018.         jr nz,closefilewitherror
  1019.         call memorystreamstart
  1020. ;decompress
  1021.         call setsharedpages
  1022.         ld hl,0xffff
  1023.         ld (filedatasourceaddr),hl
  1024.         ld (savedSP),sp
  1025.         call GzipExtract
  1026.         call closestream_file
  1027.         xor a
  1028.         ret
  1029.  
  1030. GzipThrowException
  1031. savedSP=$+1
  1032.         ld sp,0
  1033. GzipExitWithError
  1034.         call memorystreamfree
  1035. closefilewitherror
  1036.         call closestream_file
  1037.         or 1
  1038.         ret
  1039.  
  1040. setsharedpages
  1041. page8000=$+1
  1042.         ld a,0
  1043.         SETPG8000
  1044. pageC000=$+1
  1045.         ld a,0
  1046.         SETPGC000
  1047.         ret
  1048.  
  1049. GzipReadInputBuffer
  1050. ;de = InputBuffer
  1051. ;hl = InputBufSize
  1052. filedatapage=$+1
  1053.         ld a,0
  1054.         SETPG8000
  1055. filedatasourceaddr=$+1
  1056.         ld hl,0
  1057.         bit 6,h
  1058.         call nz,loadfiledata
  1059.         ld bc,InputBufSize
  1060.         ldir
  1061.         ld (filedatasourceaddr),hl
  1062.         ld a,(page8000)
  1063.         SETPG8000
  1064.         ret
  1065.  
  1066. loadfiledata
  1067.         exx
  1068.         ex af,af'
  1069.         push af,bc,de,hl,ix,iy
  1070.         ld de,0x8000
  1071.         ld hl,0x4000
  1072.         call readstream_file
  1073.         pop iy,ix,hl,de,bc,af
  1074.         exx
  1075.         ex af,af'
  1076.         ld hl,0x8000
  1077.         ld de,InputBuffer
  1078.         ret
  1079.  
  1080. GzipWriteOutputBuffer
  1081. ;de = OutputBuffer
  1082. ;hl = size
  1083.         ld a,(memorystreamcurrentpage)
  1084.         SETPG8000
  1085.         ld bc,hl
  1086.         add hl,de
  1087.         bit 7,h
  1088.         jr z,.below8000
  1089.         push hl
  1090.         ld bc,0x8000-OutputBuffer
  1091.         call memorystreamwrite
  1092.         pop hl
  1093.         res 7,h
  1094.         push hl
  1095.         ld de,0x4000
  1096.         sub hl,de
  1097.         ld a,(page8000)
  1098.         jr c,.write8000
  1099.         jr z,.write8000
  1100.         ex (sp),hl
  1101.         SETPGC000
  1102.         ld de,0xc000
  1103.         ld bc,0x4000
  1104.         call memorystreamwrite
  1105.         ld a,(pageC000)
  1106. .write8000
  1107.         SETPGC000
  1108.         ld de,0xc000
  1109.         pop bc
  1110. .below8000
  1111.         call memorystreamwrite
  1112.         jp setsharedpages
  1113.  
  1114.         include "common/gunzip.asm"
  1115.  
  1116. initokstr
  1117.         db "OK\r\n",0
  1118. playernamestr
  1119.         db "VGM Player",0
  1120. fromstr
  1121.         db " [",0
  1122. bystr
  1123.         db "] by ",0
  1124. end
  1125.  
  1126. GzipBuffersStart = $
  1127. waveheaderbuffer = $
  1128. waveheaderbufferend = waveheaderbuffer+WAVEHEADERBUFFERSIZE
  1129. titlestr = waveheaderbufferend
  1130. titlestrend = titlestr+TITLELENGTH
  1131.  
  1132.         assert GzipBuffersEnd <= 0x10000
  1133.         assert titlestrend <= 0x8000
  1134.  
  1135.         savebin "vgm.bin",begin,end-begin
  1136.