VZEditor/PATCHED/memo.asm
2025-04-02 08:44:47 +09:00

1192 lines
16 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;****************************
; 'memo.asm'
;****************************
include vz.inc
;--- Equations ---
textp_top equ thom
textp_end equ bmax ; ##100.16
longp_top equ tblkp
longp_end equ path
STACKMGN equ 256
;--- External symbols ---
wseg
extrn extsw :byte
extrn edtsw :word
extrn frees :word
extrn frame :word
extrn gends :word
extrn gtops :word
extrn lbufsz :word
extrn rends :word
extrn retval :word
; extrn rtops :word
extrn send :word
extrn sends :word
extrn stops :word
extrn syssw :word
; extrn temps :word
; extrn texts :word
extrn w_back :word
extrn w_busy :word
extrn w_free :word
endws
extrn dispask :near
extrn disperr :near
extrn dispmsg :near
extrn ems_alloc :near
extrn xmem_free :near
extrn ems_map2 :near
extrn endlin :near
extrn fulltext :near
extrn getnum :near
extrn isend :near
extrn jumpto :near
extrn nxtfld :near
extrn ofs2seg :near
extrn ofs2seg1 :near
extrn ovftext :near
extrn putnum :near
extrn putnum1 :near
extrn scrout :near
extrn scrout_cp :near
extrn scrout_fx :near
extrn seektext :near
extrn seg2ofs :near
extrn toplin :near
dseg
;--- Local work ---
smax dw 0 ; text stack max ptr
endds
cseg
assume ds:nothing
;--- Set/Reset tcp ---
public settcp
settcp proc
mov ax,[bp].tcp
settcp1:
call setabsp
stl [bp].tnowp
VZ_RET
settcp endp
public restcp,resetcp1
restcp proc
mov ds,[bp].ttops
ldl [bp].tnowp
resetcp1:
call seektext
mov [bp].tcp,ax
mov si,ax
call toplin
mov [bp].tnow,si
VZ_RET
restcp endp
;--- Mark block ---
public se_markblk
se_markblk proc
tstb [bp].blkm
_if z
mov [bp].blkm,TRUE
blkon1: call setnowp
stl [bp].tblkp
mov ax,[bp].tcp
sub ax,[bp].tnow
mov [bp].bofs,ax
clc
VZ_RET
_endif
mov [bp].blkm,FALSE
call scrout
clc
VZ_RET
se_markblk endp
public setnowp,setabsp
setnowp:
mov ax,[bp].tnow
setabsp: clr dx
sub ax,[bp].ttop ; ##1.5
sbb dx,0
addl [bp].headp
VZ_RET
;--- Init block pointer ---
;<--
; SI :block start ptr
; ZR :not block
; NZ,DX:AX :block size
; BH :direction
public initblk
initblk:
mov ax,[bp].tnow
call settcp1
tstb [bp].blkm
jz notblk
push bx
mov cx,word ptr [bp].tblkp
mov bx,word ptr [bp].tblkp+2
cmphl bx,cx
_if e
test [bp].blkm,BLK_RECT
_if z
mov [bp].blkm,BLK_CHAR
_endif
_endif
mov ax,[bp].tnow
test [bp].blkm,BLK_CHAR
_ifn z
mov ax,[bp].tcp
add cx,[bp].bofs
adc bx,0
_endif
push ax
call settcp1
cmphl bx,cx
_if a
stl [bp].trgtp
mov ax,cx
mov dx,bx
pushm <bx,cx>
call seektext
popm <cx,bx>
pop si
mov si,ax
ldl [bp].trgtp
sub ax,cx
sbb dx,bx
mov bh,TRUE
jmps iblk8
_endif
xchg ax,cx
xchg dx,bx
stl [bp].trgtp
pop si
sub ax,cx
sbb dx,bx
mov bh,FALSE
iblk8: pop cx
mov bl,cl
tst si
VZ_RET
notblk:
mov si,[bp].tnow
mov bh,FALSE
VZ_RET
endcs
eseg
;--- Reset stack ptr ---
setsends proc
mov send,di
setsends1:
push ax
call getsends
_ifn z
mov ax,send
call ofs2seg
add ax,stops
mov sends,ax
_endif
pop ax
VZ_RET
setsends endp
;--- Clear stack ---
public clrstack
clrstack proc
push ax
mov ax,sends
cmp ax,ONEMS
_if b
call xmem_free
test gtops,EMSMASKW
_ifn z
mov ax,rends
mov stops,ax
_else
mov ax,ONEMS
_endif
mov sends,ax
_endif
clr di
call setsends
pop ax
clc
VZ_RET
clrstack endp
;--- Get end of main memory ---
;<--
; AX :end segment
; ZR :stack on EMS
public getsends
getsends proc
mov ax,sends
test ah,EMSMASK
_if z
mov ax,rends
_endif
VZ_RET
getsends endp
endes
cseg
assume ds:cgroup
;--- Open stack ---
;<-- CY :error
openstack proc
push ds
movseg ds,ss
mov ax,sends
test ah,EMSMASK
_ifn z
mov ax,gends
test syssw,SW_CLRSTACK
_if z
sub ax,frees
jc opstk1
_endif
sub ax,stops
jc opstk1
call seg2ofs
cmp ax,STACKMGN
jb opstk1
mov smax,ax
sub ax,send
jc opstk1
_else
cmp ax,ONEMS
_if e
opstk1: mov al,2
call ems_alloc
jc opstk9
mov sends,ax
mov send,0
_endif
call ems_map2
mov stops,ax
mov smax,8000h
_endif
clc
opstk9: pop ds
VZ_RET
openstack endp
assume ds:nothing
;--- Push/Store on stack ---
public se_pushblk,se_storblk
se_storblk proc
mov bl,FALSE
jmps spsh0
se_pushblk proc
mov bl,TRUE
spsh0:
clr bh
push bx
; call freemem
; jc spsh_x2
call openstack
jc spsh_x2
pop bx
call initblk
pushf
test extsw,ESW_TRUSH
_ifn z
or bh,2
_endif
popf
jnz spsh1
mov si,[bp].tnow
mov cx,[bp].tnxt
cmp cx,[bp].tend
_if e
dec cx
mov [bp].lxs,0
_endif
sub cx,si
jz spsh9
jmps spsh2
spsh_x2:
pop ax
spsh_x: mov dl,E_NOMEM
call disperr
spsh_c: stc
spsh9: VZ_RET
spsh1:
tst dx
jnz sfull
mov cx,ax
spsh2: mov ax,cx
add ax,2
jc sfull
mov dx,smax
cmp ax,dx
_if ae
sfull:
mov dx,smax
mov ax,dx
mov cx,dx
dec cx
dec cx
dec cx
or bh,80h
_endif
mov di,send
sub dx,di
sub ax,dx
_ifn be
test bh,2
_if z
call cutstack
jc spsh9
_endif
_endif
push cx
spsh4:
mov es,stops
mov ax,si
push cx
add ax,cx
jc spsh41
cmp ax,[bp].tend
jae spsh41
tst bh
_if s
push si
mov si,ax
mov dx,ax
call toplin
sub dx,si
pop si
sub cx,dx
pop ax
pop ax
sub ax,dx
push ax
push cx
_endif
jmps spsh42
spsh41: mov cx,[bp].tend
sub cx,si
spsh42: test bh,2
_if z
call memmove
_endif
add di,cx
pop ax
sub ax,cx
je spsh6
mov cx,ax
tst bl
_ifn z
push di
mov di,si
mov si,[bp].tend
call txtmov
pop di
_endif
test bh,2
_if z
call setsends
_endif
mov si,[bp].tend
call isend
jne spsh4
spsh6:
test bh,2
_if z
mov es,stops
mov al,[bp].blkm
stosb
pop ax
stosw
call setsends
_else
pop ax
_endif
mov di,si
add si,cx
tst bl
_ifn z
call txtmov
mov si,di
_endif
mov bl,[bp].blkm
tst bh
_if s
mov dl,E_NOSTACK
call dispmsg
test bl,BLK_CHAR ; ##100.21
_ifn z
call toplin
_endif
mov ax,si
call setabsp
test bh,TRUE
_ifn z
stl [bp].tblkp
_else
stl [bp].tnowp
_endif
_else
mov [bp].blkm,FALSE
_endif
call restcp
test bh,TRUE
_ifn z
call putnum1
_endif
jmp stkout
se_pushblk endp
se_storblk endp
;--- Cut stack ---
;--> cancel
cutstack proc
pushm <cx,si,ds>
test edtsw,EDT_NOSTK
_ifn z
call se_clrstack
_else
mov ds,stops
movseg es,ds
mov si,di ; send
_repeat
mov dx,si
dec si
dec si
sub si,[si]
dec si
cmp si,ax
_while a
mov si,dx
mov cx,di
sub cx,si
clr di
call memmove
mov send,cx
mov di,cx
clc
_endif
popm <ds,si,cx>
VZ_RET
cutstack endp
;--- Pull/Load from stack ---
public se_pullblk,se_loadblk
se_loadblk proc
mov bl,FALSE
jmps spul0
se_pullblk proc
mov bl,TRUE
spul0:
; push bx
; call freemem ; ##1.5
; pop bx
; jmpl c,spsh_x
push bx
call openstack
pop bx
jmpl c,spsh_x
call get_blkinfo
jz spul_c ;stack empty
sub si,cx
tst bl
_ifn z
mov send,si
_endif
mov di,[bp].tnow
test bh,BLK_CHAR
_ifn z
mov di,[bp].tcp
_endif
mov ax,di
call settcp1
call blkon1
call getnum
spul1:
mov es,stops
push cx
cmp cx,[bp].tbalt
jb spul2
push si
add si,[bp].tbalt
IF TRUE ; ##16
pushm <cx,di>
mov di,si
sub cx,si
mov al,LF
repne scasb
mov si,di
popm <di,cx>
ELSE
push ds
movseg ds,es
call endlin
pop ds
ENDIF
mov cx,si
pop si
sub cx,si
spul2:
push si
mov si,di
add di,cx
call ovftext
jc spul_x1
call txtmov
mov di,si
pop si
jc spul_x
push ds
movseg es,ds
mov ds,stops
call memmove
pop ds
pop ax
add di,cx
sub ax,cx
je spul8
add si,cx
mov cx,ax
jmp spul1
spul_x1:
pop si
spul_x:
pop ax
call restcp
spul_c:
stc
VZ_RET
spul8:
mov al,bh
call set_ret
mov ax,di
tst bh
_ifn z
test edtsw,EDT_PASTE
_ifn z
mov [bp].tcp,ax
push ax
call putnum
pop si
jmps stkout1
_endif
_endif
call setabsp
stl [bp].tblkp
mov [bp].bofs,0
call setsends1
call restcp
mov bl,bh
clr bh
stkout:
mov si,[bp].tcp
test bl,BLK_CHAR
jnz stkout1
test bh,TRUE
_if z
mov al,[bp].ly
cbw
sub [bp].dnumb,ax
_endif
call scrout_fx
clc
VZ_RET
stkout1:
call scrout_cp
clc
VZ_RET
se_pullblk endp
se_loadblk endp
;----- Get block mode -----
public get_blkm
get_blkm proc
pushm <bx,si,es>
call openstack
jc gblk_x
call get_blkinfo
_if z
gblk_x: mov bh,-1
_endif
mov al,bh
popm <es,si,bx>
set_ret: cbw
mov retval,ax
VZ_RET
get_blkm endp
get_blkinfo proc
mov si,send
tst si
_ifn z
mov es,stops
dec si
dec si
mov cx,es:[si]
dec si
mov bh,es:[si]
clz
_endif
VZ_RET
get_blkinfo endp
;--- Clear stack ---
public se_clrstack,mc_clrstack
se_clrstack proc
mov dl,M_QCLRSTK
call dispask
jc skil9
stc
jz skil9
call clrstack
skil9: VZ_RET
mc_clrstack:
mov di,ax
call setsends
clc
VZ_RET
se_clrstack endp
;--- Jump block ---
public se_jumpblk
se_jumpblk proc
ldl [bp].tblkp
; tst ax
; jz jblk9
mov cx,[bp].bofs
pushm <ax,cx,dx>
call blkon1
call getnum
popm <dx,cx,ax>
add ax,cx
adc dx,0
call jumpto
jblk9: VZ_RET
se_jumpblk endp
;----- Set Block target flag -----
public set_blktgt
set_blktgt proc
cmp [bp].blkm,BLK_CHAR
_ifn e
call setnowp
_else
mov ax,[bp].tcp
tstb [bp].inbuf
_ifn z
sub ax,[bp].btop
add ax,[bp].tnow
_endif
call setabsp
sub ax,[bp].bofs
sbb dx,0
_endif
cmpl [bp].tblkp
mov ax,0
_if c
dec ax
_endif
_if g
mov ax,1
_endif
mov [bp].blktgt,ax
VZ_RET
set_blktgt endp
;--- Move text ---
;-->
; DS,BP :current text
; SI :source ptr
; DI :destin ptr
;<--
; CY :buffer full
public txtmov
txtmov proc
push dx
mov ax,[bp].tbmax
call seg2ofs
mov dx,ax
mov ax,di
sub ax,si
jc txtm1
add ax,[bp].tend
jc tful1
cmp ax,[bp].tmax
jbe txtm1
tstb [bp].wnum
jz tful_xx
add ax,lbufsz
jc tful1
cmp ax,dx
jb tbext1
tful1:
tstb [bp].wnum
jz tful_xx
cmp dx,[bp].tmax
je tful2
mov ax,dx
jmps tbext2
tbext1:
mov dx,ax
tbext2: sub ax,[bp].tmax
call ofs2seg
push dx
mov dx,ax
call getsends
add ax,dx
pop dx
cmp ax,gends
jae tful_x
cmp dx,TMAXMGN
_if a
mov dx,TMAXMGN
_endif
mov [bp].tmax,dx
pushm <cx,si,di>
mov cx,ax
call getsends
xchg ax,cx
sub ax,cx
mov si,[bp].tends
mov di,si
add di,ax
call sgmove2
add [bp].tends,ax
popm <di,si,cx>
tful2:
call fulltext
jc tfulx2
jmps txtm1
tful_xx:
mov dl,E_NOTEXT
jmps tfulx1
tful_x: mov dl,E_NOMEM
tfulx1: call disperr
tfulx2: pop dx
stc
VZ_RET
txtm1:
pop dx
call ptradj
call ptradj2
push cx
call txtmov1
tcut:
test [bp].largf,FL_HEAD+FL_TAIL
jnz txtm2
tstb [bp].wnum
jz txtm2
test [bp].tends,EMSMASKW
jz txtm2
mov ax,[bp].tmax
sub ax,cx
shr ax,1
cmp ax,lbufsz
jb txtm2
mov ax,cx
add ax,lbufsz
xchg [bp].tmax,ax
sub ax,[bp].tmax
call ofs2seg1
pushm <si,di>
mov si,[bp].tends
mov di,si
sub di,ax
call sgmove2
add [bp].tends,ax
popm <di,si>
txtm2: pop cx
clc
VZ_RET
txtmov endp
public txtmov1
txtmov1 proc
push es
movseg es,ds
mov cx,[bp].tend
sub cx,si
call memmove
add cx,di
mov [bp].tend,cx ; update tend
pop es
VZ_RET
txtmov1 endp
endcs
bseg
;----- Move memory ----- ; ##156
;--> DS:SI :src ptr
; ES:DI :dest ptr
; CX :size
public memmove
memmove proc
pushm <ax,cx,dx,si,di>
jcxz move9
mov ax,ds
mov dx,es
cmp ax,dx
mov ax,0
_if e
cmp si,di
je move9
_if b
std
inc ax
add si,cx
dec si
add di,cx
dec di
_endif
_endif
test di,1
_ifn e
movsb
dec cx
_endif
sub si,ax
sub di,ax
shr cx,1
rep movsw
_if c
add si,ax
add di,ax
movsb
_endif
cld
move9: popm <di,si,dx,cx,ax>
VZ_RET
memmove endp
;----- Clear memory -----
public memclear
memclear proc
clr ax
shr cx,1
rep stosw
VZ_RET
memclear endp
endbs
cseg
;--- Adjust pointers ---
;--> SI,DI :move ptrs
public ptradj
ptradj proc
pushm <bx,cx,si>
mov ax,si
mov cx,di
sub cx,si
mov si,textp_top
mov bx,textp_end
tstb [bp].inbuf
_ifn z
mov bx,btop ; ##100.16
_endif
_repeat
cmp [bp+si],ax
jbe tadj2
add [bp+si],cx
jmps tadj3
tadj2: cmp [bp+si],di
jbe tadj3
mov [bp+si],di
tadj3: inc si
inc si
cmp si,bx
_until e
popm <si,cx,bx>
VZ_RET
ptradj endp
public ptradj2
ptradj2 proc
pushm <bx,cx,dx,si,di>
tst si ; ##16
_ifn z
sub si,[bp].ttop ; ##1.5
sub di,[bp].ttop ; ##1.5
_endif
mov cx,di
sub cx,si
pushf
ldl [bp].headp
add ax,si
adc dx,0
clr bx
add di,word ptr [bp].headp
adc bx,word ptr [bp].headp+2
mov si,longp_top
_repeat
popf
pushf
call padj2
add si,4
cmp si,longp_end
_until e
popf
popm <di,si,dx,cx,bx>
VZ_RET
padj2:
pushf
push ax ; ##156.107
tstl [bp+si]
pop ax
jz padj9
push ax
mov ax,[bp+si]
and ax,[bp+si+2]
inc ax
pop ax
jz padj9
padj3: cmpl [bp+si]
jae padj5
popf
jc padj4
addlw [bp+si],cx
VZ_RET
padj4: neg cx
sublw [bp+si],cx
neg cx
VZ_RET
padj5:
cmp bx,[bp+si]+2
ja padj9
jb padj6
cmp di,[bp+si]
jae padj9
padj6: mov [bp+si],di
mov [bp+si]+2,bx
padj9: popf
VZ_RET
ptradj2 endp
;--- Move segment ---
;-->
; SI :source segment
; DI :destin segment
; CX :segment size
public sgmove2
sgmove proc
pushm <cx,dx,si,di,ds,es>
jcxz smov9
cmp si,di
je smov9
jb smovb
smovf:
mov ds,si
mov es,di
mov dx,cx
smovf1: cmp cx,1000h
jae smovf2
clr dx
jmps smovf3
smovf2: mov cx,1000h
sub dx,cx
smovf3: shlm cx,3
clr si
clr di
rep movsw
mov ax,ds
add ax,1000h
mov ds,ax
mov ax,es
add ax,1000h
mov es,ax
mov cx,dx
tst cx
jnz smovf1
jmps smov9
smovb:
add si,cx
add di,cx
mov ds,si
mov es,di
mov dx,cx
smovb1: cmp cx,1000h
jae smovb2
clr dx
jmps smovb3
smovb2: mov cx,1000h
sub dx,cx
smovb3: mov ax,ds
sub ax,cx
mov ds,ax
mov ax,es
sub ax,cx
mov es,ax
shlm cx,3
mov si,cx
mov di,cx
dec si
shl si,1
dec di
shl di,1
std
rep movsw
cld
mov cx,dx
tst cx
jnz smovb1
smov9:
popm <es,ds,di,si,dx,cx>
mov ax,di
sub ax,si
VZ_RET
sgmove1:
push cx
push ax
call getsends
mov cx,ax
pop ax
sub cx,si
call sgmove
pop cx
adj_stkp:
test sends,EMSMASKW
_ifn z
add stops,ax
add sends,ax
_endif
add rends,ax
VZ_RET
sgmove2:
test si,EMSMASKW
_ifn z
call sgmove1
push bp
cmp bp,w_free ; ##16
_ifn e
mov bp,[bp].w_next
call adjustseg
_endif
pop bp
_endif
VZ_RET
sgmove endp
endcs
eseg
;--- Adjust segment ptr ---
adjustseg proc
_repeat
tst bp
_break z
test [bp].tends,EMSMASKW
_ifn z
add [bp].ttops,ax
add [bp].tends,ax
tstb [bp].inbuf
_if z
add [bp].lbseg,ax
_endif
_endif
mov bp,[bp].w_next
_until
; add rtops,ax
VZ_RET
adjustseg endp
public adjustfar
adjustfar proc
; add texts,ax
push bp
mov bp,w_busy
call adjustseg
pop bp
call adj_stkp
VZ_RET
adjustfar endp
endes
cseg
assume ds:cgroup
;--- Check free memory ---
;<--
; CY :no memory
; AX :free seg size (0 = ONEMS)
public freemem
freemem proc
push ds
movseg ds,ss
call getsends
add ax,frees
jc freem0
push bx
mov bx,ax
mov ax,gends
sub ax,bx
pop bx
jnc freem9
freem0: clr ax
freem9: pop ds
VZ_RET
freemem endp
endcs
end
;****************************
; End of 'memo.asm'
; Copyright (C) 1989 by c.mos
;****************************