VZEditor/SRC/text.asm
2025-04-02 07:52:59 +09:00

2118 lines
30 KiB
NASM

;****************************
; 'text.asm'
;****************************
include vz.inc
;--- Equations ---
MIN_Bt equ 16
;--- Temp slot ---
_tmpslot struc
ts_id dw ?
ts_handle dw ?
ts_ofstl dw ?
ts_ofsth dw ?
_tmpslot ends
;--- External symbols ---
wseg
extrn dspsw :byte
extrn edtsw :byte
extrn frompool :byte
extrn fromref :byte
extrn lastcmd :byte
IFNDEF NOBACKUP
extrn nm_bak :byte
ENDIF
extrn nm_confile :byte
extrn tchdir :byte
extrn addlogf :byte
extrn wsplit0 :byte
extrn fbuf :word
extrn lbufsz :word
extrn opnpath :word
extrn pathbuf :word
extrn pathp :word
extrn retval :word
extrn rends :word
extrn syssw :word
extrn tbsize :word
; extrn tmpnamep :word
extrn w_busy :word
extrn w_free :word
extrn tmpslot :word
extrn tmpbuf :word
extrn w_act0 :word
extrn w_back0 :word
extrn w_ext :word
endws
extrn addsep :near
extrn casepath :near
extrn checkpath :near
extrn chgt_cons :near
extrn chkline1 :near
extrn csroff :near
extrn cutpath :near
extrn dispask :near
extrn disperr :near
extrn dispmsg :near
extrn ems_alloc :near
extrn ems_map :near
extrn endlin :near
extrn freemem :near
extrn iniscr :near
extrn initblk :near
extrn isviewmode :near
extrn jumpnum :near
; extrn killmemtmp :near
extrn ld_wact :near
extrn makefulpath :near
extrn maptext :near
extrn memclear :near
extrn newline :near
extrn ofs2seg :near
extrn parsepath :near
extrn ptradj :near
; extrn readmemtmp :near
extrn restcp :near
extrn scannum :near
extrn searchfile :near
extrn seg2ofs :near
extrn setdnum :near
extrn setenvvar :near
extrn setnewname :near
extrn setnum :near
extrn setpath :near
extrn settab :near
extrn settcp :near
extrn settrgtp :near
extrn setwnum :near
extrn sgmove2 :near
extrn skipchar :near
extrn strcmp :near
extrn strcpy :near
extrn strncpy :near
extrn tolower :near
extrn toplin :near
extrn toupper :near
extrn txtmov1 :near
extrn viewpoint :near
extrn wndchg :near
extrn wndcls :near
extrn wndopn :near
extrn wndsel :near
extrn wrdcpy :near
extrn wrdicmp :near
; extrn writememtmp :near
extrn xmem_alloc :near
extrn xmem_free :near
extrn xmem_read :near
extrn xmem_write :near
extrn tmp_close :near
extrn chk_logfile :near
extrn scan_logtbl :near
extrn set_logtbl :near
extrn set_opnopt :near
extrn isdigit :near
extrn textsize :near
extrn do_evmac :near
extrn run_evmac :near
extrn scan_lhexa :near
extrn setabsp :near
extrn putnum :near
extrn se_textend :near
dseg
;--- Local work ---
fh_r dw 0
fh_w dw 0
fileid dw 0
idcount dw 0
readeof db 0,0
endds
cseg
assume ds:cgroup
;****************************
; Low level I/O
;****************************
;
;--- Open for read ---
;<-- CY :error(AX)
open_r proc
push ds
movseg ds,ss
mov ax,fh_r
tst ax
_if z
lea dx,[bp].path
msdos F_OPEN,O_READ
jc opnr_x
mov fh_r,ax
_endif
opnr_x: pop ds
VZ_RET
open_r endp
;--- Open for write ---
;--> DS:DX :path name ptr
;<-- CY :error(AX)
; CL :0=open,1=create
open_w proc
push ds
movseg ds,ss
mov ax,fh_w
tst ax
_if z
mov al,O_UPDATE
msdos F_OPEN
mov cl,FALSE
jnc wopn9
cmp ax,ENOFILE
stc
jne wopn9
clr cx
msdos F_CREATE
mov cl,TRUE
_endif
wopn9:
_ifn c
mov fh_w,ax
_endif
pop ds
VZ_RET
open_w endp
;--- Open for append ---
;--> DS:DX :path name ptr
;<-- CY :error(AX)
open_a proc
mov ax,fh_w
tst ax
_if z
msdos F_OPEN,O_UPDATE
jc opna9
mov fh_w,ax
_endif
mov bx,ax
call seekend
or ax,dx
jz opna9
call opna1
mov dx,offset cgroup:readeof
mov cx,1
msdos F_READ
cmp readeof,EOF
clc
jne opna9
opna1: clr cx
not cx
mov dx,cx
msdos F_SEEK,2
opna9: VZ_RET
open_a endp
assume ds:nothing
;--- Close file ---
close_r proc
clr bx
xchg bx,fh_r
tst bx
_ifn z
msdos F_CLOSE
_endif
VZ_RET
close_r endp
close_w proc
clr bx
xchg bx,fh_w
tst bx
_ifn z
tst dl
_if z
clr cx
msdos F_WRITE
_endif
msdos F_CLOSE
_endif
VZ_RET
close_w endp
assume ds:cgroup
;--- Make backup file ---
;--> DS:DX :path name ptr
IFNDEF NOBACKUP
makebak proc
pushm <dx,ds>
movseg ds,ss
movseg es,ss
mov di,pathbuf
mov si,offset cgroup:nm_bak
call setenvvar
_ifn c
popm <ds,si>
push si
call parsepath
pop si
push si
push di
sub cx,si
call strncpy
mov al,'.'
stosb
movhl ax,'A','B'
stosw
mov ax,'K'
stosw
_else
mov dx,si
popm <ds,si>
pushm <si,ds>
push di
movsw ; copy drive
mov ds,ax
mov si,dx
call strcpy
pop dx
movseg ds,ss
msdos F_MKDIR
call addsep
popm <ds,si>
push si
push dx
call parsepath
mov si,bx
call strcpy
_endif
pop dx
push ds
movseg ds,ss
msdos F_DELETE ;del 'BAK'
pop ds
mov di,dx
pop dx
msdos F_RENAME ;ren 'TXT' as 'BAK'
stc ; ##100.20
VZ_RET
makebak endp
ENDIF
assume ds:nothing
;--- Read file ---
;-->
; DS:DX :read ptr
; CX :read count
; DI :NZ=read line (DI:tmax)
;<--
; DX :read end ptr
; CY :error
; ZR :read EOF, NZ:not EOF
fread proc
pushm <cx,dx>
mov cx,word ptr [bp].readp+2
mov dx,word ptr [bp].readp
mov bx,fh_r
msdos F_SEEK,0
popm <dx,cx>
jc read_x
read1: msdos F_READ
jc read_x
add dx,ax
mov si,dx
cmp ax,cx
jb read9
; tst di
; jz read9
_repeat
mov cx,1
msdos F_READ
jc read_x
tst ax
jz read9
inc dx
inc si
cmp si,di
jne read3
mov byte ptr [si-1],LF
_break
read3: cmp byte ptr [si-1],LF
_until e
clz
VZ_RET
read9: stz
read_x: VZ_RET
fread endp
;--- Write file ---
;-->
; BX :file handle
; DS:DX :write ptr
; CX :write count
;<--
; DX :write end ptr
; CY :disk full
fwrite proc
msdos F_WRITE
jc writ_x
cmp ax,cx
jne writ_x
add dx,ax
clc
VZ_RET
writ_x: stc
VZ_RET
fwrite endp
;--- Seek to head/end of file ---
;-->
; BX :file handle
; CX :block size
seekend proc
push cx
clr cx
clr dx
msdos F_SEEK,2
pop cx
VZ_RET
seekend endp
seekhead proc
mov dx,word ptr [bp].headp
mov cx,word ptr [bp].headp+2
msdos F_SEEK,0
VZ_RET
seekhead endp
;--- Set text ID ---
settextid proc
mov ax,idcount
add al,2
cmp al,100
_if e
clr al
inc ah
_endif
mov idcount,ax
mov [bp].textid,ax
VZ_RET
settextid endp
assume ds:cgroup
;------------------------------------------------
; Temporary file manager
;------------------------------------------------
;
;--- Write temp --- ; ##16
;-->
; SI :*filep
; BX :fileid
; DS:DX :write ptr
; CX :block count
;<--
; DX :write end ptr
; BX :fileid
; CY :disk full
qwrite proc
mov [bp].temp,TRUE
mov di,dx
add di,cx
push [di]
mov ax,ss:[si+4]
mov [di],ax ; set block size
mov ss:[si+4],cx
inc cx
inc cx
pushm <si,ds,es>
push di
push ds
movseg ds,ss
mov di,tmpslot
_repeat
mov ax,[di]
tst ax
jz qwrit1
add di,type _tmpslot
cmp di,tmpslot+2
_until e
qwrit_x:pop ds
pop di
mov ax,[di]
mov ss:[si+4],ax
stc
jmps qwrit8
qwrit1:
mov ax,cx
call xmem_alloc
jc qwrit_x
movseg es,ss
push ax
mov [di],bx ; ts_id
inc di
inc di
stosw ; ts_handle
mov ax,[si]
stosw ; ts_ofstl
mov ax,[si+2]
stosw ; ts_ofsth
pop ax
pop ds
movseg es,ds
mov di,dx
call xmem_write ; ES:DI src ptr
dec cx
dec cx
add dx,cx
pop di
qwrit8:
popm <es,ds,si>
pop [di]
VZ_RET
qwrite endp
;--- Read temp ---
;-->
; SI :*filep
; BX :fileid
; DS:DX :read ptr
; CX :read count
;<--
; CY :error
; DX :read end ptr
qread proc
pushm <si,di,ds,es>
push ds
movseg ds,ss
mov di,tmpslot
_repeat
mov ax,[di]
cmp ax,bx
_if e
mov ax,[si]
cmp ax,[di].ts_ofstl
_if e
mov ax,[si+2]
cmp ax,[di].ts_ofsth
je qread1
_endif
_endif
add di,type _tmpslot
cmp di,tmpslot+2
_until e
pop ds
stc
jmps qread8
qread1:
clr ax
mov [di],ax
mov ax,[di].ts_handle
pop es
add dx,cx
mov di,dx
push es:[di]
sub di,cx
inc cx
inc cx
push ax
call xmem_read ; ES:DI dst ptr
pop ax
call xmem_free
mov di,dx
mov ax,es:[di]
mov [si+4],ax ; block size
pop es:[di]
clc
qread8: popm <es,ds,di,si>
VZ_RET
qread endp
;--- Close temp ---
qclose proc
pushf
pushm <ax,bx,si>
call tmp_close
call close_r
popm <si,bx,ax>
popf
VZ_RET
qclose endp
;--- Kill temp ---
qkill proc
pushm <si,ds>
movseg ds,ss
mov di,tmpslot
_repeat
mov ax,[di]
cmp ax,bx
_if e
mov word ptr [di],0
mov ax,[di].ts_handle
call xmem_free
_endif
add di,type _tmpslot
cmp di,tmpslot+2
_until e
popm <ds,di>
VZ_RET
qkill endp
;--- Init temp slot ---
public inittmpslot
inittmpslot proc
push es
movseg es,ss
mov di,tmpslot
mov cx,tmpslot+2
sub cx,di
call memclear
pop es
VZ_RET
inittmpslot endp
assume ds:nothing
;****************************
; Text main module
;****************************
;--- Open text ---
;<-- CY :error (DL:code)
public topen,topen1
topen proc
tstb frompool
_if z
mov si,pathp
mov di,offset cgroup:nm_confile
movseg ds,ss
movseg es,ss
call wrdicmp
jmpl c,chgt_cons
_endif
topen1:
call chkline1 ; ##156.138
topen2: call csroff
lea di,[bp].largf
movseg es,ss
mov cx,type _text - largf
clr al
rep stosb
lea di,[bp].tmark
mov cl,path - tmark
mov al,-1
rep stosb
call settextid
cmp bp,w_ext
_if e
mov di,pathbuf
call copypath
jmps topn1
_endif
call setpath
call copypath
mov al,lastcmd
cmp al,CM_NEWFILE
je tnew
cmp al,CM_OPENFILE
_if e
call isexist
_if c
openexist:
push bp
call wndsel
pop bp
call scan_parm
mov dl,M_OPENED
call dispmsg
mov al,[bp].wnum
jmp topen8
_endif
_endif
call searchfile
_ifn c
call copypath
cmp lastcmd,CM_OPENFILE
_if e
call isexist
jc openexist
_endif
_else
cmp bp,w_free
_if e
test syssw,SW_ASKNEW
_ifn z
mov dl,E_PATH
push dx
call dispask
pop dx
jbe topn_c
_endif
_endif
tnew:
call iniopn
jc topn_x
mov si,[bp].ttop
call addeof
jmps topn4
_endif
topn1:
call open_r
_if c
tread_x:mov dl,E_READ
lea ax,[bp].path
mov opnpath,ax
topn_x: call disperr
topn_c: stc
jmp topen9 ; ##153.48
_endif
call iniopn
jc topn_x
mov bx,fh_r
call seekend
stl [bp].eofp
call read_start ; ##16
jc tread_x
topn4:
call memopn
movseg ds,ss
cmp bp,w_free
_if e
call wndopn
_endif
cmp bp,w_ext
_if e
call iniscr
jmps topen_o
_endif
call setwnum
call initlnumb
call cutpath
test [bp].largf,FL_LOG
jnz topen_v
mov al,TCH_RO
mov ah,lastcmd
cmp ah,CM_READFILE
je topen7
tstb fromref
_if z
cmp ah,CM_NEWFILE
_ifn e
test word ptr syssw,SW_RO
jnz topen_v
_endif
_endif
call checkpath
cmp al,ENOFILE
mov al,0
_if a
topen_v:mov al,TCH_VIEW
_endif
topen7: mov [bp].tchf,al
call iniscr
test [bp].largf,FL_LOG
_ifn z
call restcp
mov [bp].tcp,si
call init_log
_endif
call settab
mov [bp].tabr,cl ; ##156.116
call scan_parm
mov al,EV_OPEN
call do_evmac
_if c
call run_evmac
_endif
topen_o:
clr al
topen8: cbw
mov retval,ax
clc
topen9: pushf
call close_r
popf
VZ_RET
addeof:
clrl [bp].readp
and [bp].largf,not (FL_TAIL+FL_TAILX)
cmp si,[bp].ttop
je addeof1
mov al,[si-1]
cmp al,EOF
jne addeof1
dec si
public addeof1
addeof1:
mov byte ptr [si],LF
inc si
mov [bp].tend,si
VZ_RET
topen endp
copypath proc
mov si,di
lea di,[bp].path
movseg es,ss
call strcpy
VZ_RET
copypath endp
public initlnumb
initlnumb proc
mov ax,1
mov [bp].lnumb,ax
mov [bp].lnumb0,ax
mov [bp].dnumb,ax
mov [bp].dnumb0,ax
VZ_RET
initlnumb endp
;--- Read Top of file ---
readtop proc
mov dx,[bp].ttop
mov di,[bp].tmax
mov cx,di
sub cx,lbufsz
sub cx,dx
; lea si,[bp].readp
; mov bx,fh_r
call fread
jc rtop9
_if z
mov si,dx
call addeof
jmps rtop8
_endif
mov [bp].tend,dx
sub dx,[bp].ttop
mov word ptr [bp].readp,dx
or [bp].largf,FL_TAIL+FL_TAILX
rtop8: clc
rtop9: VZ_RET
readtop endp
;----- Read start -----
read_start proc
call chk_logfile
jnc readtop
or [bp].largf,FL_LOG
call scan_logtbl
jnc readtop
tstw ss:[si].lg_lnumb
jz readtop
ldl ss:[si].lg_eofp
cmpl [bp].eofp
_if a
mov ss:[si].lg_lnumb,0
jmp readtop
_endif
_if e
ldl ss:[si].lg_nowp
_endif
stl [bp].tnowp
or [bp].largf,FL_READEND
read_start endp
;----- Read End of file ----- ; ##16
read_end proc
mov di,[bp].tmax
mov cx,di
sub cx,lbufsz
sub cx,TEXTTOP
ldl [bp].eofp
sub ax,cx
sbb dx,0
_if b
add cx,ax
_else
stl [bp].headp
or [bp].largf,FL_HEAD+FL_HEADX
_endif
call read_bwd
mov si,dx
call addeof
clc
VZ_RET
read_end endp
;----- Read Backword -----
;--> CX :read count
read_bwd proc
push cx
mov bx,fh_r
call seekhead
or ax,dx
pop cx
pushf
mov dx,TEXTTOP
msdos F_READ
mov si,dx
add dx,ax
popf
_ifn z
call endlin
mov ax,si
sub ax,TEXTTOP
addlw [bp].headp,ax
tst si
_endif
mov [bp].ttop,si
VZ_RET
read_bwd endp
;----- Init log file ----- ; ##16
init_log proc
ldl [bp].tnowp
cmpl [bp].eofp
_if e
mov al,[bp].tw_cy
dec al
mov [bp].wys,al
_endif
test [bp].largf,FL_READEND
jz inilog9
and [bp].largf,not FL_READEND
call scan_logtbl
jnc inilog9
push ds
movseg ds,ss
mov ax,[bp].tnow
mov cx,[bp].tend
dec cx
call setnum
mov cx,dx
ldl [si].lg_eofp
cmpl [bp].eofp
_if b
stl [si].lg_nowp
ldl [bp].eofp
stl [si].lg_eofp
add [si].lg_lnumb,cx
mov addlogf,TRUE
_endif
mov ax,[si].lg_lnumb
mov [bp].lnumb9,ax
sub ax,cx
mov [bp].lnumb,ax
ldl [si].lg_nowp
stl [bp].tnowp
mov ax,[si].lg_lnumb
mov [bp].lnumb9,ax
sub ax,cx
push ax
mov ax,[bp].ttop
mov cx,[bp].tnow
call setnum
pop ax
sub ax,dx
mov [bp].lnumb0,ax
or [bp].nodnumb,2
pop ds
inilog9: VZ_RET
init_log endp
;----- Check Log table -----
chk_logtbl proc
test [bp].largf,FL_LOG
jz chklog9
test [bp].largf,FL_RENAME+FL_TAIL
jnz chklog9
cmp lastcmd,CM_APPEND
je chklog9
call scan_logtbl
jnc chklog9
call textsize
stl [bp].eofp
mov ax,[bp].tnow
mov cx,[bp].tend
dec cx
call setnum
mov ax,dx
add ax,[bp].lnumb
mov di,si
movseg es,ss
call set_logtbl
chklog9: VZ_RET
chk_logtbl endp
;----- Scan paramater -----
assume ds:cgroup
scan_parm proc
movseg ds,ss
mov si,pathp
scanpar1:
mov pathp,si
call skipchar
jc scanpar9
lodsb
cmp al,'-'
_ifn e
cmp al,'/'
jne scanpar9
_endif
lodsb
cmp al,'+'
_if e
mov w_act0,bp
lodsb
sub al,'0'
mov wsplit0,al
jmp scanpar1
_endif
cmp al,'-'
_if e
mov w_back0,bp
jmp scanpar1
_endif
cmp al,'>'
_if e
call scan_lhexa
call jump_cp
jmp scanpar1
_endif
cmp al,'#'
_if e
lodsb
call isdigit
jnc scanpar1
sub al,'0'
cmp al,MARKCNT
ja scanpar1
call scan_mark
jmp scanpar1
_endif
cmp al,'$'
_if e
mov dx,-1
clc
jmps scjmp1
_endif
call isdigit
_if c
call scannum
dec si
scjmp1: mov pathp,si
_ifn c
call jump_lnumb
_endif
jmp scanpar1
_endif
call set_opnopt
jnc scanpar1
scanpar9: VZ_RET
scan_parm endp
jump_lnumb proc
pushm <si,ds>
call maptext
mov ds,[bp].ttops
push dx
call viewpoint
pop dx
cmp dx,-1
_ifn z
call jumpnum
mov [bp].tcp,si
_else
call se_textend
_endif
popm <ds,si>
VZ_RET
jump_lnumb endp
jump_cp proc
stl [bp].tnowp
pushm <si,ds>
call maptext
mov ds,[bp].ttops
call viewpoint
mov ax,[bp].tcp
call setabsp
stl [bp].toldp
call restcp
call putnum
popm <ds,si>
VZ_RET
jump_cp endp
scan_mark proc
clr ah
push ax
inc si
call scan_lhexa
pop di
shlm di,2
stl [bp+di].tretp
VZ_RET
scan_mark endp
;--- Close text ---
public tclose,tclose2,fclose
tclose proc
movseg ds,ss
call ld_wact
jz clos9
call close1
call wndcls
call setwnum
clos9: VZ_RET
tclose2:
movseg ds,ss
call ld_wact
call close1
call wndchg
VZ_RET
close1:
call fclose
mov si,[bp].tends
mov di,[bp].ttops
call sgmove2
VZ_RET
fclose:
movseg ds,ss
tstb [bp].wnum
_ifn z
mov ax,[bp].tends
test ah,EMSMASK
_if z
call xmem_free
_endif
clr bx
xchg bx,[bp].textid
tstb [bp].temp
_ifn z
call qkill
inc bx
call qkill
_endif
_endif
VZ_RET
tclose endp
;--- Save/Append text ---
;<-- CY :error (DL:code)
eofcode db EOF
public tsave,tsave2
tsave2:
mov [bp].blkm,FALSE
tsave proc
call maptext ; ##155.75
mov ds,[bp].ttops ; ##151.05
call csroff
call settcp
tstb [bp].blkm
_if z
test [bp].largf,FL_TAILX
_ifn z
call endtext
jc tsav8x
_else
call chk_logtbl
_endif
call head_text ; ##16
_endif
test [bp].largf,FL_RENAME
_ifn z
call setnewname
_endif
movseg ds,ss
mov dx,fbuf
mov opnpath,dx
cmp lastcmd,CM_APPEND
_if e
call setpath
call searchfile
movseg ds,ss
_if c
mov dl,M_XAPPEND
call dispask
mov dx,fbuf
jnbe tsav1
tsav8x: mov dl,E_TEMP
tsav81: jmp tsav8
_endif
mov dx,di
mov opnpath,dx
call open_a
_else
tstb [bp].blkm
_if z
lea dx,[bp].path
mov opnpath,0
movseg ds,ss
tsav1:
IFNDEF NOBACKUP
test [bp].largf,FL_LOG
_if z
test edtsw,EDT_BACKUP
_ifn z
call makebak
; jmps tsav11
_endif
_endif
ENDIF
;tsav11:
call open_w
_else
call open_w
_ifn c
tst cl
_if z
push dx
mov dl,M_XSAVE
call dispask
pop dx
jbe tsav7a
_endif
_endif
_endif
_endif
mov ss:tchdir,TRUE
mov dl,E_WRITE
jc tsav81
assume ds:nothing
call maptext
movseg ds,[bp].ttops
mov dl,M_SAVING
call dispmsg
tstb [bp].blkm
_if z
mov si,[bp].ttop
_else
call initblk
_endif
tsav2:
mov bl,FALSE ; end flag
tstb [bp].blkm
_if z
mov di,[bp].tend
test [bp].largf,FL_TAIL
_if z
dec di
mov bl,TRUE
_endif
_else
call settrgtp
_endif
push bx
mov dx,si
mov cx,di
sub cx,dx
mov bx,fh_w
call fwrite
pop ax
mov dl,E_NODISK
jc tsav7
tst al
_if z
clr si
call nexttext
jnc tsav2
tsav7a: mov dl,E_TEMP
jmps tsav7
_endif
test edtsw,EDT_EOF
_ifn z
push ds
movseg ds,cs
mov dx,offset cgroup:eofcode
mov cx,1
call fwrite
pop ds
_endif
tstb [bp].blkm
_if z
tstb [bp].tchf
_ifn s
clr ax
mov [bp].tchf,al
mov [bp].inpcnt,ax
_endif
_endif
clr dl
tsav7:
call qclose
call close_w
tsav8: push dx
call restcp
pop dx
tst dl
_ifn z
cmp dl,E_TEMP
_ifn e
call disperr
_endif
stc
_else
call newline
_endif
VZ_RET
tsave endp
;--- Init open ---
;<-- CY :out of memory
public iniopn,iniopn2
iniopn proc
call freemem
jc iopn_xx
mov bx,tbsize
cmp bx,MIN_Bt
_if b
mov bx,MIN_Bt
_endif
cmp bx,64
_if a
mov bx,64
_endif
mov cl,6
shl bx,cl
cmp ax,MIN_TBSIZE
_if b
mov al,2
mov dx,0800h
cmp bx,MIN_TBSIZE
_if be
shr al,1
shr dx,1
_endif
call ems_alloc
iopn_xx:jc iopn_x
push ax
call ems_map
mov [bp].ttops,ax
mov ds,ax
mov ax,dx
pop dx
_else
cmp ax,bx
_if a
mov ax,bx
_endif
mov si,rends ; rtops
mov di,si
add di,ax
push ax
call sgmove2
mov ds,si
pop ax
clr dx
_endif
iniopn2:
mov [bp].tends,dx
mov [bp].tbmax,ax
push ax
mov cl,3
shl ax,cl
; mov dx,ax
; shl ax,1
; add ax,dx
sub ax,256 ;;;
mov [bp].tbalt,ax
pop ax
call seg2ofs
cmp ax,TMAXMGN
_if a
mov ax,TMAXMGN
_endif
mov [bp].tmax,ax
setttop:
mov [bp].ttop,TEXTTOP
clc
VZ_RET
iopn_x: mov dl,E_NOMEM
stc
VZ_RET
iniopn endp
;--- Memory open ---
memopn proc
tstw [bp].tends
_if z
mov ax,[bp].tend
add ax,lbufsz
jc mopn1
cmp ax,[bp].tmax
ja mopn1
mov [bp].tmax,ax
mopn1:
mov ax,[bp].tmax
call ofs2seg
mov si,rends ; rtops
mov di,ds
push di
add di,ax
call sgmove2
mov [bp].tends,di
pop [bp].ttops
_endif
VZ_RET
memopn endp
assume ds:cgroup
;--- Check exist file ---
;<-- CY :exist
isexist proc
push ds
push bp
movseg ds,ss
movseg es,ss
tstb fromref
jnz isex8
lea dx,[bp].path
mov bp,w_busy
_repeat
tst bp
_break z
mov si,dx
lea di,[bp].path
cmp si,di
je isex3
call strcmp
_if e
stc
pop ax
jmps isex9
_endif
isex3: mov bp,[bp].w_next
_until
isex8: clc
pop bp
isex9: pop ds
VZ_RET
isexist endp
;****************************
; Large file handler
;****************************
assume ds:nothing
;--- Read next text ---
;-->
; SI :NZ=adjust ptrs, ZR=nop
;<--
; CY :EOF or temp error
; SI :old tend
nexttext proc
pushm <ax,bx,cx,dx,di>
mov [bp].w2,si
test [bp].largf,FL_TAIL
jz nxtb_c
call csroff
mov ax,[bp].tailsz ; ##16
tst ax
_if z
call open_r
jc nxtb_x
ldl [bp].eofp
subl [bp].readp
call readsize
_endif
mov [bp].w1,ax ; w1=sftsz
add ax,lbufsz
add ax,[bp].ttop ; fixed R.92
mov dx,[bp].tmax
sub dx,[bp].tend
sub ax,dx
_ifn b
mov si,ax ; SI=border
call endlin
call writhead
jc nxtb_x
_endif
mov si,[bp].tend
mov [bp].w2,si ; w2=old tend
tstl [bp].tailp
jz nreadview
nreadq:
mov cx,[bp].w1
sublw [bp].tailp,cx ; tailp-=w1
mov dx,si
lea si,[bp].tailp
mov bx,[bp].textid
inc bx
call qread
jnc nxtb3
mov ax,[bp].w1
addlw [bp].tailp,ax
nxtb_x: mov dl,E_TEMP
call disperr
nxtb_c: stc
jmps nxtb9
nxtb3:
mov [bp].tend,dx
mov ax,word ptr [bp].tailp
or ax,word ptr [bp].tailp+2
or ax,word ptr [bp].readp
or ax,word ptr [bp].readp+2
jnz nxtb8
and [bp].largf,not (FL_TAIL+FL_TAILX)
dec [bp].tend
mov di,dx
mov byte ptr [di-2],LF
jmps nxtb8
nreadview:
mov cx,[bp].tmax
mov di,cx
sub cx,si
sub cx,lbufsz
mov dx,si
; lea si,[bp].readp
; mov bx,fh_r
push dx
call fread
pop ax
jz nreadeof
mov [bp].tend,dx
sub dx,ax
addlw [bp].readp,dx
jmps nxtb8
nreadeof:
mov si,dx
call addeof
nxtb8: clc
nxtb9: mov si,[bp].w2 ; si=old tend
popm <di,dx,cx,bx,ax>
VZ_RET
nexttext endp
;--- Read previous text ---
;-->
; SI :NZ=adjust ptrs, ZR=nop
;<--
; CY :EOF or temp error
; SI :old ttop
pretext proc
pushm <ax,bx,cx,dx,di>
mov [bp].w2,si
test [bp].largf,FL_HEAD
jmpl z,preb_c
nop
call csroff
mov ax,[bp].headsz ; ##16
tst ax
_if z
call open_r
jc preb_xx
; call isviewmode
; _if e
; ldl [bp].readp
; push ax
; or ax,dx
; pop ax
; _if z
; ldl [bp].eofp
; stl [bp].readp
; _endif
; _endif
ldl [bp].headp ; ##16
call readsize
_endif
mov [bp].w1,ax
mov si,[bp].tmax
sub si,ax
sub si,lbufsz
cmp si,[bp].tend
_if b
call toplin ; ##100.17
; call isviewmode
; _if e
; mov ax,[bp].tend
; sub ax,si
; sublw [bp].readp,ax
; _endif
call writtail
preb_xx:jc preb_x
_endif
mov di,TEXTTOP ; ##16
mov si,di
xchg si,[bp].ttop
add di,[bp].w1
call txtmov1
mov ax,di
xchg [bp].w2,ax ; old ttop
tst ax
_ifn z
dec si
dec di
call ptradj
_endif
mov cx,[bp].w1
sublw [bp].headp,cx ; headp-=w1
tstw [bp].headsz ; ##16
_ifn z
mov dx,[bp].ttop
lea si,[bp].headp
mov bx,[bp].textid
call qread
_if c
mov ax,[bp].w1
addlw [bp].headp,ax
preb_x: mov dl,E_TEMP
call disperr
preb_c: stc
jmps preb9
_endif
tstl [bp].headp
_else
call read_bwd
_endif
_if z
and [bp].largf,not (FL_HEAD+FL_HEADX)
_endif
mov ax,dx
mov cx,[bp].ttop
call setnum0
call isviewmode
_if e
mov cx,[bp].tend
sub cx,[bp].ttop
ldl [bp].headp
add ax,cx
adc dx,0
stl [bp].readp
_endif
clc
preb9: mov si,[bp].w2
popm <di,dx,cx,bx,ax>
VZ_RET
pretext endp
readsize proc
tst dx
_if z
cmp ax,[bp].tbalt
jbe rsize9
_endif
mov ax,[bp].tbalt
rsize9: VZ_RET
readsize endp
;--- Is top/end of file ? ---
public istop,isend
istop proc
cmp si,[bp].ttop
jne istop9
call pretext
jmps istop1
isend:
cmp si,[bp].tend
jne istop9
call nexttext
istop1:
call qclose
push ax
_if c
stz
_else
clz
_endif
pop ax
istop9: VZ_RET
istop endp
;--- To top of file ---
public toptext
toptext proc
call isviewmode
_if e
tstw [bp].headp+2
jnz retract
_endif
toptxt1:
test [bp].largf,FL_HEAD
_ifn z
clr si
call pretext
jnc toptxt1
_endif
jmps toptxt8
retract:
call open_r
jc toptxt8
clr ax
mov word ptr [bp].readp,ax
mov word ptr [bp].readp+2,ax
mov word ptr [bp].headp,ax
mov word ptr [bp].headp+2,ax
and [bp].largf,not (FL_HEAD+FL_HEADX)
call setttop
call readtop
call initlnumb
toptxt8:call qclose
mov si,[bp].ttop
VZ_RET
toptext endp
;----- To head of file ----- ; ##16
head_text proc
test [bp].largf,FL_HEADX
jz toptext
test [bp].largf,FL_RENAME
jnz toptext
IFNDEF NOBACKUP
test edtsw,EDT_BACKUP
jnz toptext
ENDIF
_repeat
test [bp].largf,FL_HEAD
_break z
tstw [bp].headsz
jz head_cmp
_break z
clr si
call pretext
_until c
jmp toptxt8
head_cmp:
lea dx,[bp].path
call open_w
jc toptext
tst cl
jnz toptext
mov bx,fh_w
call seekhead
push ds
movseg ds,ss
mov dx,tmpbuf
mov cx,[bp].tend
dec cx
mov si,[bp].ttop
sub cx,si
cmp cx,TMPSZ
_if a
mov cx,TMPSZ
_endif
msdos F_READ
pop ds
jc head_x
cmp ax,cx
jb head_x
movseg es,ss
mov di,dx
rep cmpsb
jne head_x
call seekhead
jmp toptxt8
head_x: clr cx
clr dx
msdos F_SEEK,0
jmp toptext
head_text endp
;----- To end of file -----
public endtext
endtext proc
call isviewmode
jne endtxt1
test [bp].largf,FL_TAIL
jz endtxt1
tstw [bp].lnumb9
jz endtxt1
call isdnumb
jnz endtxt1
call open_r
_ifn c
call read_end
mov ax,[bp].tend
dec ax
mov cx,[bp].ttop
call setnum
add dx,[bp].lnumb9
mov [bp].lnumb0,dx
clc
_endif
jmps endtxt8
endtxt1:
_repeat
test [bp].largf,FL_TAIL
_break z
clr si
call nexttext
_until c
endtxt8: call qclose
mov si,[bp].tend
VZ_RET
endtext endp
;--- Seek text ---
;-->
; DX:AX :seek pointer
;<--
; CY :error
; AX :offset of pointer
public seektext
seektext proc
pushm <bx,cx,si,di>
test [bp].largf,FL_HEAD+FL_TAIL
jz seekb5
_repeat
mov bx,word ptr [bp].headp
mov cx,word ptr [bp].headp+2
; add bx,[bp].ttop ; ##1.5
; adc cx,0
cmp dx,cx
jb seekb2
_break a
cmp ax,bx
_break a
seekb2: pushm <ax,dx>
clr si
call pretext
popm <dx,ax>
jc seekb_x
_until
seekb3:
mov bx,word ptr [bp].headp
mov cx,word ptr [bp].headp+2
add bx,[bp].tend
adc cx,0
cmp dx,cx
ja seekb4
jb seekb5
cmp ax,bx
jb seekb5
seekb4: pushm <ax,dx>
clr si
call nexttext
popm <dx,ax>
jc seekb_x
jmp seekb3
seekb5:
subl [bp].headp
clc
seekb_x:
pushf
add ax,[bp].ttop ; ##1.5
cmp ax,[bp].tend
_if ae
mov ax,[bp].tend
dec ax
_endif
popf
call qclose
popm <di,si,cx,bx>
VZ_RET
seektext endp
;--- Buffer overflow ---
;-->
; SI,DI :txtmov ptrs (updated)
;<--
; CY :temp error
public fulltext
fulltext proc
pushm <bx,cx,dx>
fulb1:
mov ax,di
sub ax,si
add ax,[bp].tend
jc fulb11
cmp ax,[bp].tmax
jbe fulb_o
fulb11:
mov ax,si
sub ax,[bp].ttop
mov bx,[bp].tend
sub bx,si
cmp ax,bx
jb fulb_t
call fulb_h
jc fulb_x
jmps fulb2
fulb_t:
mov ax,[bp].tend
sub ax,[bp].tbalt
jc fulbt1
pushm <si,di>
cmp ax,si
jbe fulbt1
mov si,ax
call endlin
fulbt1: mov [bp].w2,si
call writtail
popm <di,si>
jc fulb_x
fulb2:
mov ax,[bp].tend
cmp ax,[bp].ttop
jne fulb1
fulb_o: clc
fulb9: call qclose
popm <dx,cx,bx>
VZ_RET
fulb_x: mov dl,E_TEMP
call disperr
stc
jmp fulb9
fulb_h:
mov ax,[bp].ttop
add ax,[bp].tbalt
pushm <si,di>
cmp ax,si
jae fulbh1
mov si,ax
call endlin
fulbh1: mov [bp].w2,si
call writhead
popm <di,si>
jc fulbh9
sub si,cx
sub di,cx
clc
fulbh9: VZ_RET
fulltext endp
;--- Overflow 64KB ---
;-->
; SI :source ptr
; CX :offset(add di,cx)
public ovftext
ovftext proc
pushm <bx,dx>
ovfb1: jnc ovfb9
tstb [bp].wnum
jz ovfbx
push cx
call fulb_h
pop cx
_ifn c
mov di,si
add di,cx
jmp ovfb1
_endif
mov dl,E_TEMP
call disperr
ovfbx: stc
ovfb9: call qclose
popm <dx,bx>
VZ_RET
ovftext endp
;--- Write head ---
;-->
; SI :border ptr (update)
;<--
; CY :disk full
; CX :block size
writhead proc
push si
mov dx,[bp].ttop
mov cx,si
sub cx,dx
call isviewmode
_ifn e
lea si,[bp].headp
mov bx,[bp].textid
push cx
call qwrite
pop cx
jc whead9
_else
or [bp].largf,FL_HEADX
_endif
addlw [bp].headp,cx
mov ax,[bp].ttop
pop si
push cx
mov cx,si
call setnum0
pop cx
push si
mov di,[bp].ttop
push cx
call txtmov1
pop cx
tstw [bp].w2
_ifn z
dec si
dec di
call ptradj
_endif
or [bp].largf,FL_HEAD
clc
whead9: pop si
VZ_RET
writhead endp
;--- Write tail ---
;-->
; SI :border ptr
;<--
; CY :disk full
; CX :block size
writtail proc
push si
mov dx,si
mov cx,[bp].tend
test [bp].largf,FL_TAIL
_if z
inc cx
_endif
sub cx,dx
call isviewmode
_if e
or [bp].largf,FL_TAILX
jmps wtail8
_endif
lea si,[bp].tailp
mov bx,[bp].textid
inc bx
push cx
call qwrite
pop cx
_ifn c
addlw [bp].tailp,cx
wtail8: pop si
push si
mov [bp].tend,si
or [bp].largf,FL_TAIL
clc
_endif
pop si
VZ_RET
writtail endp
;--- Set top line number ---
setnum0 proc
call setnum
add [bp].lnumb0,dx
call isdnumb
_ifn z
call setdnum
add [bp].dnumb0,dx
_else
or [bp].nodnumb,2
_endif
VZ_RET
setnum0 endp
public isdnumb
isdnumb proc
push ax
mov al,dspsw
or al,[bp].dspsw1
test al,DSP_LINE
_ifn z
test [bp].largf,FL_LOG
_if z
clz
_else
stz
_endif
_endif
pop ax
VZ_RET
isdnumb endp
;----- Open Ext-File -----
;--> DX :file name
assume ds:cgroup
extrn add_defpath :near
public open_ext
open_ext proc
movseg ds,ss
mov si,dx
mov di,pathbuf
call add_defpath
mov pathp,dx
push dx
mov bp,w_ext
call topen2
pop ax
_if c
mov ss:opnpath,ax
_endif
VZ_RET
open_ext endp
;----- Close Ext-File -----
public close_ext
close_ext proc
movseg ds,ss
call close1
VZ_RET
close_ext endp
endcs
end
;****************************
; End of 'text.asm'
; Copyright (C) 1989 by c.mos
;****************************