?login_element?

Subversion Repositories NedoOS

Rev

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