?login_element?

Subversion Repositories NedoOS

Rev

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