Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. COLOR=7
  5. MDLADDR=0x6000;0xc000
  6.        
  7.                
  8.         org PROGSTART
  9. cmd_begin
  10.         ld sp,0x4000 ;не должен опускаться ниже #3b00! иначе возможна порча OS
  11.         OS_HIDEFROMPARENT
  12.         ld e,6 ;textmode
  13.         OS_SETGFX
  14.         ;call initstdio
  15.  
  16.         OS_GETMAINPAGES ;out: dehl=номера страниц в 0000,4000,8000,c000, c=flags, b=id
  17.         ld a,e
  18.         ld (musicpage),a
  19.         ld a,b
  20.         ld (myid),a
  21.        if 0
  22.         ld a,h
  23.         ld (page8000),a
  24.         ld a,l
  25.         ld (pagec000),a
  26.        endif
  27.         ;push hl
  28.         ;ld e,h
  29.         ;OS_DELPAGE
  30.         ;pop hl
  31.         ;ld e,l
  32.         ;OS_DELPAGE
  33.  
  34. ;TODO найти копию себя в памяти и послать ей 0 в COMMANDLINE
  35.         ld e,1 ;no id 0
  36. cmd_proc0
  37.         push de
  38.         ld a,e
  39. myid=$+1
  40.         cp 0
  41.         jr z,cmd_proc_skip
  42.         OS_GETAPPMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, a=error
  43.         or a
  44.         jr nz,cmd_proc_skip
  45.         ld a,d ;main page
  46.         SETPG32KHIGH
  47.         ld de,COMMANDLINE+0xc000
  48.         ld hl,ttestdatacom
  49.         ld bc,ttestdatacom_sz
  50.         call teststr
  51.         jr z,cmd_proc_found
  52.         ld de,COMMANDLINE+0xc000
  53.         ld hl,ttestdata
  54.         ld bc,ttestdata_sz
  55.         call teststr
  56.         jr nz,cmd_proc_skip
  57. cmd_proc_found
  58.         xor a
  59.         ld (COMMANDLINE+0xc000),a ;ok ;"закройся"
  60. cmd_proc_skip
  61.         pop de
  62.         inc e
  63.         ld a,e
  64.         inc a ;no id 0xff
  65.         jr nz,cmd_proc0
  66.  
  67. ;а как заглушить музыку, если не опрашивать клаву?
  68. ;если опрашивать, то нужен терминал
  69. ;можно было бы в nv.ext прописать cmd.com start term.com player.com, но такие конструкции пока не поддержаны ни в nv, ни в term
  70. ;поэтому пока без терминала
  71.        
  72.         ld hl,wasplayer
  73.         ld de,0x4000
  74.         ld bc,szplayer
  75.         ldir
  76.  
  77.        if 0
  78. page8000=$+1
  79.         ld a,0
  80.         SETPG8000
  81. pagec000=$+1
  82.         ld a,0
  83.         SETPGC000
  84.        endif
  85.        
  86.         ld hl,COMMANDLINE ;command line
  87.         call skipword
  88.         call skipspaces
  89.         ld a,(hl)
  90.         or a
  91.         jp z,noautoload
  92.         ld (filenameaddr),hl
  93. ;command line = "texted <file to load>"
  94.        push hl
  95.         call findlastdot ;out: de = after last dot or start
  96.         ld (extaddr),de
  97.        pop hl
  98.         ;ld (texted_filenameaddr),hl
  99.         ex de,hl ;de=drive/path/file
  100.         OS_OPENHANDLE
  101. ;b=new file handle
  102.  
  103. extaddr=$+1
  104.         ld hl,0
  105.         inc hl
  106.         inc hl
  107.         ld a,(hl)
  108.         or 0x20
  109.         cp 'd'
  110.         jp z,play_tfd
  111.         cp 'm'
  112.         jp z,play_tfm
  113.        
  114.         ld de,MDLADDR;0xc000
  115.         ld hl,0xffff&(-MDLADDR);0x4000
  116. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  117.         push bc
  118.         OS_READHANDLE
  119. ;hl = file size
  120.         pop bc
  121. ;B = file handle
  122.         push hl
  123.  
  124. ;B = file handle
  125.         OS_CLOSEHANDLE
  126.         pop ix
  127. ;ix = file size
  128.         call getptsconfig
  129. ;a = player config bits, hl = offset to the second module if available
  130.         ld (SETUP),a
  131.         ld (secondmoduleoffset), hl
  132.  
  133.         halt
  134.         ;инитим до инита трека, иначе не работает SAA
  135. musicpage=$+1
  136.         ld a,0
  137.         ld hl,player
  138.         OS_SETMUSIC ;пишет в AY
  139.        
  140.         di
  141.         ld hl,end_init
  142.         push hl
  143.         ld hl,MDLADDR
  144.         ld a,(MDLADDR + 0x0a)
  145.         cp 'E'
  146.         jp z,EPlayer_Init
  147.         ld a,(hl)
  148.         cp 'T'
  149.         jp z,tfmini
  150.  
  151. secondmoduleoffset=$+1
  152.         ld de,0
  153.         add de,hl ;address of the second module
  154.         jp INIT
  155. end_init
  156.         ei  
  157. mainloopredraw
  158.         ld e,COLOR
  159.         OS_CLS
  160. filenameaddr=$+1
  161.         ld hl,0
  162.         call prtext
  163.         ld a,0x0d
  164.         PRCHAR
  165.         ld a,0x0a
  166.         PRCHAR
  167.        
  168. mainloop
  169.         YIELD
  170.         ;di ;TODO fix player
  171.         ;call player
  172.         ;ei
  173.         ld a,(COMMANDLINE) ;ok
  174.         or a
  175.         jr z,quit
  176.        
  177.         GET_KEY
  178.       cp key_redraw
  179.       jr z,mainloopredraw
  180.         ;or a ;cp NOKEY ;keylang==0?
  181.         ;jr nz,$+2+1+2
  182.         ;cp c ;keynolang==0?
  183.         ;jr z,_1;1b;prwindow_waitkey_nokey
  184.         cp key_esc
  185.         jr nz,mainloop
  186. quit
  187.           ld a,(musicpage)
  188.           ld hl,muter
  189.           OS_SETMUSIC
  190.           halt
  191. noautoload
  192.         QUIT
  193.  
  194. play_tfd
  195. ;b=handle
  196.         call loadtfd
  197.  
  198.         call tfd_ini
  199.         call tfmshut
  200.  
  201.         ld a,(musicpage)
  202.         ld hl,tfd_play
  203.         OS_SETMUSIC
  204.         jp mainloopredraw
  205.  
  206. play_tfm
  207. ;b=handle
  208.         call loadtfd
  209.  
  210.         ;call tfm_ini
  211.  
  212.         halt
  213.         ld a,(musicpage)
  214.         ld hl,tfm_play
  215.         OS_SETMUSIC ;пишет в AY
  216.  
  217.         call tfmshut
  218.  
  219.         ld a,0xa0;%10101000 ;320x200 mode noturbo
  220.         ld bc,0xbd77    ;shadow ports and palette remain on
  221.         out (c),a
  222.  
  223.         LD DE,#FFBF
  224.         LD C,#FD
  225.         CALL selChip0
  226.         CALL clrSSG;tfminiPP
  227.         LD A,%11111000
  228.         EXA
  229.         LD A,7
  230.         CALL WRITEREG
  231.         CALL selChip1
  232.         CALL clrSSG;tfminiPP
  233.         LD A,%11101111
  234.         EXA
  235.         LD A,7
  236.         call WRITEREG
  237.  
  238.         LD A,0xa8;%10101000 ;320x200 mode
  239.         ld bc,0xbd77    ;shadow ports and palette remain on
  240.         out (c),a
  241.  
  242.         jp mainloopredraw
  243.  
  244. clrSSG
  245.         XOR A
  246.         EXA
  247.         LD A,#0D ;SSG
  248. regClrS0 CALL WRITEREG
  249.         DEC A
  250.         JP P,regClrS0
  251.         ret
  252.  
  253. loadtfd
  254. ;b=handle
  255.         ld a,b
  256.         ld (curhandle),a
  257.        if 1
  258.         ld hl,0
  259.         ld de,0
  260. nvview_load0
  261.         push de
  262.         push hl
  263.         call reservepage
  264.         pop hl
  265.         pop de
  266.         ret nz ;no memory
  267. ;nvview_load0nonewpg        
  268.         ld a,0xc000/256
  269.         call cmd_loadpage
  270.         jr nz,nvview_load0q
  271.         ex de,hl
  272.         add hl,bc
  273.         ex de,hl
  274.         jr nc,$+3
  275.         inc hl
  276.          ;TODO nvview_load0nonewpg with new pointer if no new page
  277.         ld a,b
  278.         or c
  279.         jr nz,nvview_load0
  280. nvview_load0q
  281. ;hlde=true file size (for TRDOSFS)
  282.         ;ld (filesize),de
  283.         ;ld (filesizeHSW),hl
  284.  
  285.         ld a,(curhandle)
  286.         ld b,a
  287.         OS_CLOSEHANDLE
  288.        else
  289.         ld de,tfmData
  290.         ld hl,0xffff&(-tfmData);0x4000
  291. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  292.         push bc
  293.         OS_READHANDLE
  294.         pop bc
  295.  
  296. ;B = file handle
  297.         OS_CLOSEHANDLE
  298.        endif
  299.         ret
  300.  
  301. reservepage
  302. ;new page, set page in textpages, npages++, set page in #c000
  303. ;nz=error
  304.         OS_NEWPAGE
  305.         or a
  306.         ret nz
  307. npages=$+1
  308.         ld hl,tpgs;textpages
  309.         ld (hl),e
  310.         inc l
  311.         ld (npages),hl
  312.         ld a,e
  313.         SETPGC000
  314.         xor a
  315.         ret ;z
  316.  
  317. cmd_loadpage
  318. ;out: a=error, bc=bytes read
  319. ;keeps hl,de
  320.         push de
  321.         push hl
  322.         ld d,a
  323.         xor a
  324.         ld l,a
  325.         ld e,a
  326.         sub d
  327.         ld h,a ;de=buffer, hl=size
  328.         call readcurhandle
  329.         ld b,h
  330.         ld c,l
  331.         pop hl
  332.         pop de
  333.         or a
  334.         ret
  335.  
  336. readcurhandle
  337. curhandle=$+1
  338.         ld b,0
  339.         OS_READHANDLE
  340.         ret
  341.  
  342. ;hl = poi to filename in string
  343. ;out: de = after last dot or start
  344. findlastdot
  345.         ld d,h
  346.         ld e,l ;de = after last dot
  347. findlastdot0
  348.         ld a,[hl]
  349.         inc hl
  350.         or a
  351.         ret z
  352.         cp '.'
  353.         jr nz,findlastdot0
  354.         jr findlastdot
  355.  
  356.  
  357. teststr
  358. testdata0
  359.         ld a,(de)
  360.         or 0x20
  361.         cp (hl)
  362.         ret nz ;jr nz,cmd_proc_skip
  363.         inc de
  364.         cpi
  365.         jp pe,testdata0
  366.         xor a
  367.         ret
  368.  
  369. ttestdatacom
  370.         db "player.com"
  371. ttestdatacom_sz=$-ttestdatacom
  372.  
  373. ttestdata
  374.         db "player "
  375. ttestdata_sz=$-ttestdata
  376.  
  377. skipword
  378. ;hl=string
  379. ;out: hl=terminator/space addr
  380. getword0
  381.         ld a,(hl)
  382.         or a
  383.         ret z
  384.         cp ' '
  385.         ret z
  386.         inc hl
  387.         jr getword0
  388.  
  389. skipspaces
  390. ;hl=string
  391. ;out: hl=after last space
  392.         ld a,(hl)
  393.         cp ' '
  394.         ret nz
  395.         inc hl
  396.         jr skipspaces
  397.  
  398. prtext
  399. ;out: hl=after terminator
  400. prtext0
  401.         ld a,(hl)
  402.         inc hl
  403.         or a
  404.         ret z
  405.         push hl
  406.         PRCHAR
  407.         pop hl
  408.         jp prtext0
  409.  
  410. findts
  411. ;ix = file size
  412. ;out: zf = 1 if TS data is found, hl = offset to the second module if available
  413.         ld de,MDLADDR
  414.         add ix,de ;past-the-end address of the data buffer
  415.  
  416.         ld a,'0'
  417.         cp (ix-4)
  418.         ret nz
  419.         ld a,'2'
  420.         cp (ix-3)
  421.         ret nz
  422.         ld a,'T'
  423.         cp (ix-2)
  424.         ret nz
  425.         ld a,'S'
  426.         cp (ix-1)
  427.         ret nz
  428.  
  429.         ld hl,(ix-12)
  430.         ret
  431.  
  432. getptsconfig
  433. ;ix = file size
  434. ;out: a = player config bits, hl = offset to the second module if available
  435.         call findts
  436.         ld a,%00010000 ;2xPT3
  437.         ret z
  438.  
  439.         ld a,(MDLADDR)
  440.         cp 'V'
  441.         jr z,$+4
  442.         cp 'P' ;'P'/'V' for PT3
  443.         ld a,%00100000 ;PT3
  444.         ret z
  445.         ld a,%00000010 ;PT2
  446.         ret
  447.  
  448. ;oldtimer
  449. ;        dw 0
  450.  
  451.         ;include "../_sdk/stdio.asm"
  452.  
  453.         ;ds 0x4000-$
  454. wasplayer
  455.         disp 0x4000
  456. player
  457. ;a = port bd77 value
  458.         di
  459.         push af
  460.         and 0xf7;0xa0;%10101000 ;320x200 mode noturbo
  461.         ld bc,0xbd77    ;shadow ports and palette remain on
  462.         out (c),a
  463.  
  464.         ld hl,end_player
  465.         push hl
  466.        
  467.         ld a,(MDLADDR + 0x0a)
  468.         cp 'E'
  469.         jp z,EPlayer_Play
  470.         ld a,(MDLADDR)
  471.         cp 'T'
  472.         jp z,tfm
  473.        
  474.         jp nz,PLAY
  475.        
  476. end_player
  477.         pop af
  478.         ;LD A,0xa8;%10101000 ;320x200 mode
  479.         ld bc,0xbd77    ;shadow ports and palette remain on
  480.         out (c),a
  481.         ei
  482.         ret
  483. muter        
  484.         ld a,(MDLADDR)
  485.         cp 'T'
  486.         push af
  487.         call nz,MUTE
  488.         pop af
  489.         call z,tfmshut
  490.         ret
  491.  
  492.         include "../_sdk/ptsplay.asm"
  493.         include "tfmplay.asm"
  494.         include "tfdtest.asm"
  495.         include "tfmtest.asm"
  496.         include "etplayer.asm"
  497. ;tfmData
  498.         ent
  499. szplayer=$-wasplayer
  500.  
  501. cmd_end
  502.  
  503.         display "szplayer ",/d,szplayer," bytes"
  504.         display "Size ",/d,cmd_end-cmd_begin," bytes"
  505.  
  506.         savebin "player.com",cmd_begin,cmd_end-cmd_begin
  507.        
  508.         LABELSLIST "../../us/user.l",1
  509.