Login

Subversion Repositories NedoOS

Rev

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

        DEVICE ZXSPECTRUM128
        include "../_sdk/sys_h.asm"

COLOR=7
module=0x6000;0xc000
       
               
        org PROGSTART
cmd_begin
        ld sp,0x4000 ;не должен опускаться ниже #3b00! иначе возможна порча OS
        OS_HIDEFROMPARENT
        ld e,6 ;textmode
        OS_SETGFX
        ;call initstdio

        OS_GETMAINPAGES ;out: dehl=номера страниц в 0000,4000,8000,c000, c=flags, b=id
        ld a,e
        ld (musicpage),a
        ld a,b
        ld (myid),a
       if 0
        ld a,h
        ld (page8000),a
        ld a,l
        ld (pagec000),a
       endif
        ;push hl
        ;ld e,h
        ;OS_DELPAGE
        ;pop hl
        ;ld e,l
        ;OS_DELPAGE

;TODO найти копию себя в памяти и послать ей 0 в COMMANDLINE
        ld e,1 ;no id 0
cmd_proc0
        push de
        ld a,e
myid=$+1
        cp 0
        jr z,cmd_proc_skip
        OS_GETAPPMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, a=error
        or a
        jr nz,cmd_proc_skip
        ld a,d ;main page
        SETPG32KHIGH
        ld de,COMMANDLINE+0xc000
        ld hl,ttestdatacom
        ld bc,ttestdatacom_sz
        call teststr
        jr z,cmd_proc_found
        ld de,COMMANDLINE+0xc000
        ld hl,ttestdata
        ld bc,ttestdata_sz
        call teststr
        jr nz,cmd_proc_skip
cmd_proc_found
        xor a
        ld (COMMANDLINE+0xc000),a ;ok ;"закройся"
cmd_proc_skip
        pop de
        inc e
        ld a,e
        inc a ;no id 0xff
        jr nz,cmd_proc0

;а как заглушить музыку, если не опрашивать клаву?
;если опрашивать, то нужен терминал
;можно было бы в nv.ext прописать cmd.com start term.com player.com, но такие конструкции пока не поддержаны ни в nv, ни в term
;поэтому пока без терминала
       
        ld hl,wasplayer
        ld de,0x4000
        ld bc,szplayer
        ldir

       if 0
page8000=$+1
        ld a,0
        SETPG8000
pagec000=$+1
        ld a,0
        SETPGC000
       endif
       
        ld hl,COMMANDLINE ;command line
        call skipword
        call skipspaces
        ld a,(hl)
        or a
        jp z,noautoload
        ld (filenameaddr),hl
;command line = "texted <file to load>"
       push hl
        call findlastdot ;out: de = after last dot or start
        ld (extaddr),de
       pop hl
        ;ld (texted_filenameaddr),hl
        ex de,hl ;de=drive/path/file
        OS_OPENHANDLE
;b=new file handle

extaddr=$+1
        ld hl,0
        inc hl
        inc hl
        ld a,(hl)
        or 0x20
        cp 'd'
        jp z,play_tfd
        cp 'm'
        jp z,play_tfm
       
        ld de,module;0xc000
        ld hl,0xffff&(-module);0x4000
;B = file handle, DE = Buffer address, HL = Number of bytes to read
        push bc
        OS_READHANDLE
;hl = file size
        pop bc
;B = file handle
        push hl

;B = file handle
        OS_CLOSEHANDLE
        pop ix
;ix = file size
        call getptsconfig
;a = player config bits, hl = offset to the second module if available
        ld (SETUP),a
        ld (secondmoduleoffset), hl

        halt
        ;инитим до инита трека, иначе не работает SAA
musicpage=$+1
        ld a,0
        ld hl,player
        OS_SETMUSIC ;пишет в AY
       
        di
        ld hl,end_init
        push hl
        ;display $
    ld hl,module
        ld a,(module + 0x0a)
        cp 'E'
        jp z,EPlayer_Init
        ld a,(hl)
        cp 'T'
        jp z,tfmini

secondmoduleoffset=$+1
        ld de,0
        add de,hl ;address of the second module

                jp INIT
end_init
    ei  
mainloopredraw
        ld e,COLOR
        OS_CLS
filenameaddr=$+1
        ld hl,0
        call prtext
        ld a,0x0d
        PRCHAR
        ld a,0x0a
        PRCHAR
       
mainloop
        YIELD
        ;di ;TODO fix player
        ;call player
        ;ei
        ld a,(COMMANDLINE) ;ok
        or a
        jr z,quit
       
        GET_KEY
      cp key_redraw
      jr z,mainloopredraw
        ;or a ;cp NOKEY ;keylang==0?
        ;jr nz,$+2+1+2
        ;cp c ;keynolang==0?
        ;jr z,_1;1b;prwindow_waitkey_nokey
        cp key_esc
        jr nz,mainloop
quit
          ld a,(musicpage)
          ld hl,muter
          OS_SETMUSIC
          halt
noautoload
        QUIT

play_tfd
;b=handle
        call loadtfd

        call tfd_ini
        call tfmshut

        ld a,(musicpage)
        ld hl,tfd_play
        OS_SETMUSIC
        jp mainloopredraw

play_tfm
;b=handle
        call loadtfd

        ;call tfm_ini

        halt
        ld a,(musicpage)
        ld hl,tfm_play
        OS_SETMUSIC ;пишет в AY

        call tfmshut

        ld a,0xa0;%10101000 ;320x200 mode noturbo
        ld bc,0xbd77    ;shadow ports and palette remain on
        out (c),a

        LD DE,#FFBF
        LD C,#FD
        CALL selChip0
        CALL clrSSG;tfminiPP
        LD A,%11111000
        EXA
        LD A,7
        CALL WRITEREG
        CALL selChip1
        CALL clrSSG;tfminiPP
        LD A,%11101111
        EXA
        LD A,7
        call WRITEREG

        LD A,0xa8;%10101000 ;320x200 mode
        ld bc,0xbd77    ;shadow ports and palette remain on
        out (c),a

        jp mainloopredraw

clrSSG
        XOR A
        EXA
        LD A,#0D ;SSG
regClrS0 CALL WRITEREG
        DEC A
        JP P,regClrS0
        ret

loadtfd
;b=handle
        ld a,b
        ld (curhandle),a
       if 1
        ld hl,0
        ld de,0
nvview_load0
        push de
        push hl
        call reservepage
        pop hl
        pop de
        ret nz ;no memory
;nvview_load0nonewpg        
        ld a,0xc000/256
        call cmd_loadpage
        jr nz,nvview_load0q
        ex de,hl
        add hl,bc
        ex de,hl
        jr nc,$+3
        inc hl
         ;TODO nvview_load0nonewpg with new pointer if no new page
        ld a,b
        or c
        jr nz,nvview_load0
nvview_load0q
;hlde=true file size (for TRDOSFS)
        ;ld (filesize),de
        ;ld (filesizeHSW),hl

        ld a,(curhandle)
        ld b,a
        OS_CLOSEHANDLE
       else
        ld de,tfmData
        ld hl,0xffff&(-tfmData);0x4000
;B = file handle, DE = Buffer address, HL = Number of bytes to read
        push bc
        OS_READHANDLE
        pop bc

;B = file handle
        OS_CLOSEHANDLE
       endif
        ret

reservepage
;new page, set page in textpages, npages++, set page in #c000
;nz=error
        OS_NEWPAGE
        or a
        ret nz
npages=$+1
        ld hl,tpgs;textpages
        ld (hl),e
        inc l
        ld (npages),hl
        ld a,e
        SETPGC000
        xor a
        ret ;z

cmd_loadpage
;out: a=error, bc=bytes read
;keeps hl,de
        push de
        push hl
        ld d,a
        xor a
        ld l,a
        ld e,a
        sub d
        ld h,a ;de=buffer, hl=size
        call readcurhandle
        ld b,h
        ld c,l
        pop hl
        pop de
        or a
        ret

readcurhandle
curhandle=$+1
        ld b,0
        OS_READHANDLE
        ret

;hl = poi to filename in string
;out: de = after last dot or start
findlastdot
        ld d,h
        ld e,l ;de = after last dot
findlastdot0
        ld a,[hl]
        inc hl
        or a
        ret z
        cp '.'
        jr nz,findlastdot0
        jr findlastdot


teststr
testdata0
        ld a,(de)
        or 0x20
        cp (hl)
        ret nz ;jr nz,cmd_proc_skip
        inc de
        cpi
        jp pe,testdata0
        xor a
        ret

ttestdatacom
        db "player.com"
ttestdatacom_sz=$-ttestdatacom

ttestdata
        db "player "
ttestdata_sz=$-ttestdata

skipword
;hl=string
;out: hl=terminator/space addr
getword0
        ld a,(hl)
        or a
        ret z
        cp ' '
        ret z
        inc hl
        jr getword0

skipspaces
;hl=string
;out: hl=after last space
        ld a,(hl)
        cp ' '
        ret nz
        inc hl
        jr skipspaces

prtext
;out: hl=after terminator
prtext0
        ld a,(hl)
        inc hl
        or a
        ret z
        push hl
        PRCHAR
        pop hl
        jp prtext0

findts
;ix = file size
;out: zf = 1 if TS data is found, hl = offset to the second module if available
        ld de,module
        add ix,de ;past-the-end address of the data buffer

        ld a,'0'
        cp (ix-4)
        ret nz
        ld a,'2'
        cp (ix-3)
        ret nz
        ld a,'T'
        cp (ix-2)
        ret nz
        ld a,'S'
        cp (ix-1)
        ret nz

        ld hl,(ix-12)
        ret

getptsconfig
;ix = file size
;out: a = player config bits, hl = offset to the second module if available
        call findts
        ld a,%00010000 ;2xPT3
        ret z

        ld a,(module)
        cp 'V'
        jr z,$+4
        cp 'P' ;'P'/'V' for PT3
        ld a,%00100000 ;PT3
        ret z

        ld a,%00000010 ;PT2
        ret

;oldtimer
;        dw 0

        ;include "../_sdk/stdio.asm"

        ;ds 0x4000-$
wasplayer
        disp 0x4000
player
;a = port bd77 value
        di
        push af
        and 0xf7;0xa0;%10101000 ;320x200 mode noturbo
        ld bc,0xbd77    ;shadow ports and palette remain on
        out (c),a

        ld hl,end_player
        push hl
       
        ld a,(module + 0x0a)
        cp 'E'
        jp z,EPlayer_Play
        ld a,(module)
        cp 'T'
        jp z,tfm
       
        jp nz,PLAY
       
end_player
        pop af
        ;LD A,0xa8;%10101000 ;320x200 mode
        ld bc,0xbd77    ;shadow ports and palette remain on
        out (c),a
        ei
        ret
muter        
        ld a,(module)
        cp 'T'
        push af
        call nz,MUTE
        pop af
        call z,tfmshut
        ret

        include "ptsplay.asm"
        include "tfmplay.asm"
        include "tfdtest.asm"
        include "tfmtest.asm"
        include "etplayer.asm"
;tfmData
        ent
szplayer=$-wasplayer

cmd_end

        display "szplayer ",/d,szplayer," bytes"
        display "Size ",/d,cmd_end-cmd_begin," bytes"

        savebin "player.com",cmd_begin,cmd_end-cmd_begin
       
        LABELSLIST "../../us/user.l",1