Subversion Repositories NedoOS

Rev

Rev 1517 | 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. module=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,module;0xc000
  115.         ld hl,0xffff&(-module);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.         ;display $
  144.     ld hl,module
  145.         ld a,(module + 0x0a)
  146.         cp 'E'
  147.         jp z,EPlayer_Init
  148.         ld a,(hl)
  149.         cp 'T'
  150.         jp z,tfmini
  151.  
  152. secondmoduleoffset=$+1
  153.         ld de,0
  154.         add de,hl ;address of the second module
  155.  
  156.                 jp INIT
  157. end_init
  158.     ei  
  159. mainloopredraw
  160.         ld e,COLOR
  161.         OS_CLS
  162. filenameaddr=$+1
  163.         ld hl,0
  164.         call prtext
  165.         ld a,0x0d
  166.         PRCHAR
  167.         ld a,0x0a
  168.         PRCHAR
  169.        
  170. mainloop
  171.         YIELD
  172.         ;di ;TODO fix player
  173.         ;call player
  174.         ;ei
  175.         ld a,(COMMANDLINE) ;ok
  176.         or a
  177.         jr z,quit
  178.        
  179.         GET_KEY
  180.       cp key_redraw
  181.       jr z,mainloopredraw
  182.         ;or a ;cp NOKEY ;keylang==0?
  183.         ;jr nz,$+2+1+2
  184.         ;cp c ;keynolang==0?
  185.         ;jr z,_1;1b;prwindow_waitkey_nokey
  186.         cp key_esc
  187.         jr nz,mainloop
  188. quit
  189.           ld a,(musicpage)
  190.           ld hl,muter
  191.           OS_SETMUSIC
  192.           halt
  193. noautoload
  194.         QUIT
  195.  
  196. play_tfd
  197. ;b=handle
  198.         call loadtfd
  199.  
  200.         call tfd_ini
  201.         call tfmshut
  202.  
  203.         ld a,(musicpage)
  204.         ld hl,tfd_play
  205.         OS_SETMUSIC
  206.         jp mainloopredraw
  207.  
  208. play_tfm
  209. ;b=handle
  210.         call loadtfd
  211.  
  212.         ;call tfm_ini
  213.  
  214.         halt
  215.         ld a,(musicpage)
  216.         ld hl,tfm_play
  217.         OS_SETMUSIC ;пишет в AY
  218.  
  219.         call tfmshut
  220.  
  221.         ld a,0xa0;%10101000 ;320x200 mode noturbo
  222.         ld bc,0xbd77    ;shadow ports and palette remain on
  223.         out (c),a
  224.  
  225.         LD DE,#FFBF
  226.         LD C,#FD
  227.         CALL selChip0
  228.         CALL clrSSG;tfminiPP
  229.         LD A,%11111000
  230.         EXA
  231.         LD A,7
  232.         CALL WRITEREG
  233.         CALL selChip1
  234.         CALL clrSSG;tfminiPP
  235.         LD A,%11101111
  236.         EXA
  237.         LD A,7
  238.         call WRITEREG
  239.  
  240.         LD A,0xa8;%10101000 ;320x200 mode
  241.         ld bc,0xbd77    ;shadow ports and palette remain on
  242.         out (c),a
  243.  
  244.         jp mainloopredraw
  245.  
  246. clrSSG
  247.         XOR A
  248.         EXA
  249.         LD A,#0D ;SSG
  250. regClrS0 CALL WRITEREG
  251.         DEC A
  252.         JP P,regClrS0
  253.         ret
  254.  
  255. loadtfd
  256. ;b=handle
  257.         ld a,b
  258.         ld (curhandle),a
  259.        if 1
  260.         ld hl,0
  261.         ld de,0
  262. nvview_load0
  263.         push de
  264.         push hl
  265.         call reservepage
  266.         pop hl
  267.         pop de
  268.         ret nz ;no memory
  269. ;nvview_load0nonewpg        
  270.         ld a,0xc000/256
  271.         call cmd_loadpage
  272.         jr nz,nvview_load0q
  273.         ex de,hl
  274.         add hl,bc
  275.         ex de,hl
  276.         jr nc,$+3
  277.         inc hl
  278.          ;TODO nvview_load0nonewpg with new pointer if no new page
  279.         ld a,b
  280.         or c
  281.         jr nz,nvview_load0
  282. nvview_load0q
  283. ;hlde=true file size (for TRDOSFS)
  284.         ;ld (filesize),de
  285.         ;ld (filesizeHSW),hl
  286.  
  287.         ld a,(curhandle)
  288.         ld b,a
  289.         OS_CLOSEHANDLE
  290.        else
  291.         ld de,tfmData
  292.         ld hl,0xffff&(-tfmData);0x4000
  293. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  294.         push bc
  295.         OS_READHANDLE
  296.         pop bc
  297.  
  298. ;B = file handle
  299.         OS_CLOSEHANDLE
  300.        endif
  301.         ret
  302.  
  303. reservepage
  304. ;new page, set page in textpages, npages++, set page in #c000
  305. ;nz=error
  306.         OS_NEWPAGE
  307.         or a
  308.         ret nz
  309. npages=$+1
  310.         ld hl,tpgs;textpages
  311.         ld (hl),e
  312.         inc l
  313.         ld (npages),hl
  314.         ld a,e
  315.         SETPGC000
  316.         xor a
  317.         ret ;z
  318.  
  319. cmd_loadpage
  320. ;out: a=error, bc=bytes read
  321. ;keeps hl,de
  322.         push de
  323.         push hl
  324.         ld d,a
  325.         xor a
  326.         ld l,a
  327.         ld e,a
  328.         sub d
  329.         ld h,a ;de=buffer, hl=size
  330.         call readcurhandle
  331.         ld b,h
  332.         ld c,l
  333.         pop hl
  334.         pop de
  335.         or a
  336.         ret
  337.  
  338. readcurhandle
  339. curhandle=$+1
  340.         ld b,0
  341.         OS_READHANDLE
  342.         ret
  343.  
  344. ;hl = poi to filename in string
  345. ;out: de = after last dot or start
  346. findlastdot
  347.         ld d,h
  348.         ld e,l ;de = after last dot
  349. findlastdot0
  350.         ld a,[hl]
  351.         inc hl
  352.         or a
  353.         ret z
  354.         cp '.'
  355.         jr nz,findlastdot0
  356.         jr findlastdot
  357.  
  358.  
  359. teststr
  360. testdata0
  361.         ld a,(de)
  362.         or 0x20
  363.         cp (hl)
  364.         ret nz ;jr nz,cmd_proc_skip
  365.         inc de
  366.         cpi
  367.         jp pe,testdata0
  368.         xor a
  369.         ret
  370.  
  371. ttestdatacom
  372.         db "player.com"
  373. ttestdatacom_sz=$-ttestdatacom
  374.  
  375. ttestdata
  376.         db "player "
  377. ttestdata_sz=$-ttestdata
  378.  
  379. skipword
  380. ;hl=string
  381. ;out: hl=terminator/space addr
  382. getword0
  383.         ld a,(hl)
  384.         or a
  385.         ret z
  386.         cp ' '
  387.         ret z
  388.         inc hl
  389.         jr getword0
  390.  
  391. skipspaces
  392. ;hl=string
  393. ;out: hl=after last space
  394.         ld a,(hl)
  395.         cp ' '
  396.         ret nz
  397.         inc hl
  398.         jr skipspaces
  399.  
  400. prtext
  401. ;out: hl=after terminator
  402. prtext0
  403.         ld a,(hl)
  404.         inc hl
  405.         or a
  406.         ret z
  407.         push hl
  408.         PRCHAR
  409.         pop hl
  410.         jp prtext0
  411.  
  412. findts
  413. ;ix = file size
  414. ;out: zf = 1 if TS data is found, hl = offset to the second module if available
  415.         ld de,module
  416.         add ix,de ;past-the-end address of the data buffer
  417.  
  418.         ld a,'0'
  419.         cp (ix-4)
  420.         ret nz
  421.         ld a,'2'
  422.         cp (ix-3)
  423.         ret nz
  424.         ld a,'T'
  425.         cp (ix-2)
  426.         ret nz
  427.         ld a,'S'
  428.         cp (ix-1)
  429.         ret nz
  430.  
  431.         ld hl,(ix-12)
  432.         ret
  433.  
  434. getptsconfig
  435. ;ix = file size
  436. ;out: a = player config bits, hl = offset to the second module if available
  437.         call findts
  438.         ld a,%00010000 ;2xPT3
  439.         ret z
  440.  
  441.         ld a,(module)
  442.         cp 'V'
  443.         jr z,$+4
  444.         cp 'P' ;'P'/'V' for PT3
  445.         ld a,%00100000 ;PT3
  446.         ret z
  447.  
  448.         ld a,%00000010 ;PT2
  449.         ret
  450.  
  451. ;oldtimer
  452. ;        dw 0
  453.  
  454.         ;include "../_sdk/stdio.asm"
  455.  
  456.         ;ds 0x4000-$
  457. wasplayer
  458.         disp 0x4000
  459. player
  460. ;a = port bd77 value
  461.         di
  462.         push af
  463.         and 0xf7;0xa0;%10101000 ;320x200 mode noturbo
  464.         ld bc,0xbd77    ;shadow ports and palette remain on
  465.         out (c),a
  466.  
  467.         ld hl,end_player
  468.         push hl
  469.        
  470.         ld a,(module + 0x0a)
  471.         cp 'E'
  472.         jp z,EPlayer_Play
  473.         ld a,(module)
  474.         cp 'T'
  475.         jp z,tfm
  476.        
  477.         jp nz,PLAY
  478.        
  479. end_player
  480.         pop af
  481.         ;LD A,0xa8;%10101000 ;320x200 mode
  482.         ld bc,0xbd77    ;shadow ports and palette remain on
  483.         out (c),a
  484.         ei
  485.         ret
  486. muter        
  487.         ld a,(module)
  488.         cp 'T'
  489.         push af
  490.         call nz,MUTE
  491.         pop af
  492.         call z,tfmshut
  493.         ret
  494.  
  495.         include "ptsplay.asm"
  496.         include "tfmplay.asm"
  497.         include "tfdtest.asm"
  498.         include "tfmtest.asm"
  499.         include "etplayer.asm"
  500. ;tfmData
  501.         ent
  502. szplayer=$-wasplayer
  503.  
  504. cmd_end
  505.  
  506.         display "szplayer ",/d,szplayer," bytes"
  507.         display "Size ",/d,cmd_end-cmd_begin," bytes"
  508.  
  509.         savebin "player.com",cmd_begin,cmd_end-cmd_begin
  510.        
  511.         LABELSLIST "../../us/user.l",1
  512.