?login_element?

Subversion Repositories NedoOS

Rev

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