Login

Subversion Repositories NedoOS

Rev

Rev 889 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

strcp
;hl=s1
;de=s2
;out: Z (equal, hl=terminator of s1+1, de=terminator of s2+1), NZ (not equal, hl=erroraddr in s1, de=erroraddr in s2)
strcp0.
        ld a,[de] ;s2
        cp [hl] ;s1
        ret nz
        inc hl
        inc de
        or a
        jp nz,strcp0.
        ret ;z

dotname_to_cpmname
;de -> hl
;out: de=pointer to termination character
        ;push hl ;buffer
       
        push de ;ASCIIZ string for parsing
        push hl ;Pointer to 11 byte buffer
        ld d,h
        ld e,l
        inc de
        ld [hl],' '
        ld bc,11-1
        ldir ;empty filename
        pop hl ;Pointer to 11 byte buffer
        pop de ;ASCIIZ string for parsing

;change dots to 1, except the last
        ld a,(de)
        cp '.'
        jr z,parse_filename_changedots
        push de
        jr parse_filename_changedots0getgo
parse_filename_changedots0get
         ld a,1
         ld (de),a
parse_filename_changedots0getgo
        ld b,d
        ld c,e
parse_filename_changedots0
        ld a,(de)
        cp '.'
        jr z,parse_filename_changedots0get
        inc de
        or a
        jr nz,parse_filename_changedots0
        ld a,(bc)
        cp 1
        jr nz,$+5
         ld a,'.'
         ld (bc),a
        pop de
parse_filename_changedots

        ld b,9
       
        ld a,(de)
        cp '.'
        jr nz,parse_filename0.
        ld (hl),a
        inc de
        ld a,(de)
        cp '.'
        jr nz,parse_filenameq_findterminator.
        inc hl
        ld (hl),a
        jr parse_filenameq_findterminator.
parse_filename0.
        ld a,[de]
        or a
        ret z ;jr z,parse_filenameq. ;no extension in string
        cp '.'
        jr z,parse_filenamedot. ;можем уже быть на терминаторе
         ;cp 0x80
         ;jr nc,$+4
         ;or 0x20
         cp 1
         jr nz,$+5
          ld a,'.'
          ld [de],a
        ld [hl],a
        inc de
        inc hl
        djnz parse_filename0.
;9 bytes in filename, no dot (9th byte goes to extension)
;возможно, длинное имя, надо найти, что раньше - точка или терминатор
;можем уже быть на терминаторе или на точке
        dec hl
        ld [hl],' '
parse_filenamelongname0.
        ld a,[de]
        or a
        ret z ;jr z,parse_filenameq. ;a=0
        inc de
        cp '.'
        jr z,parse_filenameLONGnamedot. ;можем уже быть на терминаторе
        jr parse_filenamelongname0.
parse_filenamedot.
        inc de
        inc hl
        djnz $-1 ;hl points to extension in FCB
        dec hl
parse_filenameLONGnamedot.
        ld a,[de] ;extension in string
        or a
        ret z ;jr z,parse_filenameq. ;a=0
         ;cp 0x80
         ;jr nc,$+4
         ;or 0x20
        ld [hl],a ;extension in FCB
        inc hl
        inc de
        ld a,[de] ;extension in string
        or a
        ret z ;jr z,parse_filenameq. ;a=0
         ;cp 0x80
         ;jr nc,$+4
         ;or 0x20
        ld [hl],a ;extension in FCB
        inc hl
        inc de
        ld a,[de] ;extension in string
        or a
        ret z ;jr z,parse_filenameq. ;a=0
         ;cp 0x80
         ;jr nc,$+4
         ;or 0x20
        ld [hl],a ;extension in FCB
parse_filenameq_findterminator.
        inc de
        ld a,[de]
        or a
        jr nz,parse_filenameq_findterminator.
;parse_filenameq. ;de на терминаторе
        ;pop hl ;buffer
        ret ;a=0

cpmname_to_dotname
;hl -> de
        push hl
        ld b,8
cpmname_to_dotname0
        ld a,(hl)
        cp ' '
        jr z,cpmname_to_dotname0q
        ld (de),a
        inc hl
        inc de
        djnz cpmname_to_dotname0
cpmname_to_dotname0q
        pop hl
        ld bc,8
        add hl,bc ;hl=pointer to ext
        ld a,(hl)
        cp ' '
        jr z,cpmname_to_dotnameq
        ld a,'.'
        ld (de),a
        inc de
        ld  c,3
        ldir
cpmname_to_dotnameq
        xor a
        ld (de),a
        ret

makeprompt
;keeps ix
        push ix
        ld de,cmdprompt ;de=pointer to 64 byte (MAXPATH_sz!) buf
        OS_GETPATH ;TODO брать из описателя панели
        pop ix
        ret

cmdcalctextaddr
;out: hl=addr, a=curcmdx
;keeps ix
        ld hl,cmdbuf
        ld a,(curcmdx)
cmdcalctextaddr_hlbase_ax
        ld c,a
        ld b,0
        add hl,bc
        ret

cmdcalcpromptsz
;out: hl=len, a=(len+1)<64 or 64
        ld hl,cmdprompt
        call strlen
        ld a,l
        inc a
         cp 64
         ret c
         ld a,64
        ret

cmdcalccurxy
;out: de=yx
;x=cmdpromptsz+curcmdx-curcmdscroll
        call cmdcalcpromptsz ;a=promptsz
        ld hl,curcmdx ;не на экране, а внутри команды
        add a,(hl)
        ld hl,curcmdscroll ;сдвиг команды относительно экрана
        sub (hl)
        ;ld d,txtscrhgt-1
        ;ld d,CMDLINEY
        ld de,(scrhgt-1) ;d
        dec d
        dec d
        ld e,a
        ret

strlen
;hl=str
;out: hl=length
        xor a
        ld b,a
        ld c,a ;чтобы точно найти терминатор
        cpir ;найдём обязательно, если длина=0, то bc=-1 и т.д.
        ld h,a
        ld l,a
        scf
        sbc hl,bc
        ret

fixscroll_prcmd
;цикл поиска скролла для текущего положения курсора
editcmd_scroll0
        call cmdcalccurxy ;e=scrx
        call cmdcalcpromptsz ;a=promptsz
        ld hl,curcmdscroll
        dec a
        cp e ;scrx
        jr c,editcmd_noscrollleft ;x>=promptsz (x>(promptsz-1))
;x<promptsz - скролл влево
        dec (hl)
        jr editcmd_scroll0
editcmd_noscrollleft
        ld a,e ;scrx
        cp txtscrwid
        jr c,editcmd_noscrollright
;x>=txtscrwid - скролл вправо
        inc (hl)
        jr editcmd_scroll0
editcmd_noscrollright
;prcmd
        ld de,_COLOR
       if PRSTDIO
        SETCOLOR_
       else
        call nv_setcolor
       endif
        ;ld de,+(txtscrhgt-1)*256+0
        ;ld de,CMDLINEY*256+0
        ld de,(scrhgt-1) ;d
        dec d
        dec d
        ld e,0
        call nv_setxy ;keeps de,hl,ix
        call cmdcalcpromptsz
        dec a
        ld e,a ;!=0, т.к. буква дисковода
        ld d,0
        ld hl,cmdprompt
        ld c,d;0
        ;call prtext
        call cmdprNchars
        push bc
        ld a,'>'
        MYPRCHAR
        pop bc
        inc c
        ld hl,(curcmdscroll)
        ld h,0
        ld de,cmdbuf
        add hl,de
        call prtext
;добьём остаток строки пробелами
        ;ld hl,tspaces
        ;jp prtext
        jp clearrestofline

tspaces ;for drawfilecursor_sizeb_colorhl
        ds txtscrwid-1,' '
        db 0
 
cmdprNchars
;hl=buffer
;de=size
;out: hl=buffer+size
        ex de,hl
        push de
        push hl
        call sendchars
        pop hl
        pop de
        add hl,de
        ret
       
prtext
;c=x
        push bc
        push hl
        ld a,txtscrwid-1
        sub c
        ld c,a
        push bc
        call strlen ;hl=length
        pop bc
        ld b,0
        call minhl_bc_tobc
        ld h,b
        ld l,c
        pop de
        pop bc ;c=x
        ld a,h
        or l
;de=buf
;hl=len
        push bc
        push de
        push hl
        call nz,sendchars
        pop hl
        pop de
        pop bc
        ld a,l
        add a,c
        ld c,a
         add hl,de
         inc hl
;c=x        
;hl=after terminator
        ret

minhl_bc_tobc
        or a
        sbc hl,bc
        add hl,bc
        ret nc ;bc<=hl
        ld b,h
        ld c,l
        ret

strdelch
;delete char at (hl-1), shift string left
;keeps ix
editcmd_bs0
        ld a,(hl)
        dec hl
        ld (hl),a
        inc hl
        inc hl
        or a
        jr nz,editcmd_bs0
        ret

strinsch
;insert char E at (hl), shift string right
;keeps ix
editcmd_ins0
        ld a,(hl)
        ld (hl),e
        ld e,a
        inc hl
        or a
        jr nz,editcmd_ins0
        ld (hl),a
        ret

curcmdscroll ;сдвиг команды относительно экрана
        db 0
curcmdx ;не на экране, а внутри команды
        db 0
cmdprompt
        ds MAXPATH_sz;MAXCMDSZ+1
tcmd
        db "cmd "
tcmd_sz=$-tcmd
cmdbuf
        db 0
        ds cmdbuf+MAXCMDSZ+1-$