?login_element?

Subversion Repositories NedoOS

Rev

Rev 1760 | Rev 1878 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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