?login_element?

Subversion Repositories NedoOS

Rev

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

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