mirror of
https://github.com/NishiOwO/VZEditor.git
synced 2025-04-21 00:34:37 +00:00
1429 lines
19 KiB
NASM
1429 lines
19 KiB
NASM
;****************************
|
|
; 'core.asm'
|
|
;****************************
|
|
|
|
include vz.inc
|
|
|
|
;--- External symbols ---
|
|
|
|
wseg
|
|
; extrn altsize :byte ; ##156.133
|
|
extrn dspsw :byte
|
|
extrn msgon :byte
|
|
|
|
extrn drawfunc :word
|
|
extrn edtsw :word
|
|
extrn lbuf :word
|
|
extrn lbuf_end :word
|
|
extrn ucsrpos :word
|
|
extrn w_back :word
|
|
endws
|
|
|
|
; extrn chkdosheight :near
|
|
extrn chkline1 :near
|
|
extrn clrbtm :near
|
|
extrn cls :near
|
|
extrn csroff1 :near
|
|
extrn disperr :near
|
|
extrn disphead :near
|
|
extrn disppole :near
|
|
extrn dispstat :near
|
|
extrn disptext :near
|
|
; extrn ems_map :near
|
|
extrn initdnumb :near
|
|
extrn isend :near
|
|
extrn issilent :near
|
|
extrn istop :near
|
|
extrn ld_wact :near
|
|
extrn maptexts :near
|
|
extrn ovftext :near
|
|
extrn resetwind :near
|
|
extrn rollwind :near
|
|
extrn setctype :near
|
|
extrn setnum :near
|
|
extrn touch :near
|
|
extrn txtmov :near
|
|
extrn undercsr :near
|
|
extrn isdnumb :near
|
|
|
|
eseg
|
|
assume ds:nothing
|
|
|
|
;--- Do Tab ---
|
|
;--> CL
|
|
|
|
public do_tab
|
|
do_tab proc
|
|
mov ah,cl ; AH :previous CL
|
|
mov al,[bp].tabr
|
|
dec al
|
|
and al,cl
|
|
sub al,[bp].tabr
|
|
neg al ; AL :increment count
|
|
add cl,al ; CL :updated
|
|
_if c
|
|
sub al,cl
|
|
mov cl,255
|
|
_endif
|
|
VZ_RET
|
|
do_tab endp
|
|
|
|
endes
|
|
|
|
cseg
|
|
|
|
;--- Load to Line buffer ---
|
|
;<-- CY :too long, can't load
|
|
|
|
public bload
|
|
bload proc
|
|
push es
|
|
movseg es,ss
|
|
tstb [bp].inbuf
|
|
jnz blod9
|
|
mov di,lbuf
|
|
mov ax,CRLF
|
|
stosw
|
|
mov [bp].btop,di
|
|
mov [bp].bhom,di
|
|
mov cx,lbuf_end
|
|
mov [bp].bmax,cx
|
|
sub cx,di
|
|
mov si,[bp].tnow
|
|
blod1: lodsb
|
|
stosb
|
|
cmp al,LF
|
|
je blod2
|
|
loop blod1
|
|
call offlbuf
|
|
mov dl,E_NOLINE
|
|
call disperr
|
|
jmps blod9
|
|
blod2:
|
|
mov [bp].tnxt,si
|
|
push ds
|
|
movseg ds,ss
|
|
mov si,di
|
|
call setbend
|
|
pop ds
|
|
mov ax,[bp].btop
|
|
sub ax,[bp].tnow
|
|
add [bp].tcp,ax
|
|
add [bp].tfld,ax
|
|
mov bx,[bp].thom
|
|
cmp bx,[bp].tnow
|
|
_ifn b
|
|
add bx,ax
|
|
mov [bp].thom,0
|
|
mov [bp].bhom,bx
|
|
_endif
|
|
mov bx,[bp].tbtm
|
|
tst bx
|
|
_ifn z
|
|
cmp bx,[bp].tnxt
|
|
jae blod5
|
|
add bx,ax
|
|
_endif
|
|
mov [bp].tbtm,0
|
|
mov [bp].bbtm,bx
|
|
blod5: mov [bp].lbseg,ss ; ##1.5
|
|
mov [bp].inbuf,TRUE
|
|
mov [bp].wnxt,0
|
|
clc
|
|
blod9: pop es
|
|
VZ_RET
|
|
bload endp
|
|
|
|
;--- Save from Line buffer ---
|
|
|
|
public bsave
|
|
bsave proc
|
|
push es
|
|
movseg es,ss
|
|
tstb [bp].inbuf
|
|
jmpl z,bsav9 ; ##100.08
|
|
mov si,[bp].tnxt
|
|
mov di,[bp].bend
|
|
test edtsw,EDT_CUTSPC
|
|
_ifn z
|
|
mov bx,di
|
|
_repeat
|
|
cmp di,[bp].btop
|
|
je bcut1
|
|
dec di
|
|
mov al,es:[di]
|
|
cmp al,SPC
|
|
_cont e
|
|
cmp al,TAB
|
|
_while e
|
|
inc di
|
|
bcut1: mov ax,es:[bx]
|
|
mov es:[di],ax
|
|
cmp di,[bp].tcp
|
|
_if b
|
|
mov [bp].tcp,di
|
|
_endif
|
|
_endif
|
|
mov cx,2
|
|
mov al,LF
|
|
repne scasb
|
|
mov cx,di
|
|
sub cx,[bp].btop
|
|
push cx
|
|
mov di,si
|
|
mov ax,si
|
|
sub ax,[bp].tnow
|
|
sub cx,ax
|
|
_if a
|
|
add di,cx
|
|
call ovftext
|
|
pop cx
|
|
jc bsav9
|
|
_else
|
|
add di,cx
|
|
pop cx
|
|
_endif
|
|
dec si ; for adjust tbtm
|
|
dec di ;
|
|
cmp si,di ; ##100.08
|
|
_ifn e
|
|
call touch
|
|
_endif
|
|
call txtmov
|
|
jc bsav9
|
|
movseg es,ds
|
|
movseg ds,ss
|
|
mov si,[bp].btop
|
|
mov di,[bp].tnow
|
|
tstb [bp].tchf
|
|
_if z
|
|
pushm <cx,si,di>
|
|
repe cmpsb
|
|
_ifn e
|
|
call touch
|
|
_endif
|
|
popm <di,si,cx>
|
|
_endif
|
|
rep movsb
|
|
movseg ds,es
|
|
mov [bp].tnxt,di
|
|
mov ax,[bp].tnow
|
|
sub ax,[bp].btop
|
|
add [bp].tcp,ax
|
|
add [bp].tfld,ax
|
|
tstw [bp].thom
|
|
_if z
|
|
mov bx,[bp].bhom
|
|
add bx,ax
|
|
mov [bp].thom,bx
|
|
_endif
|
|
tstw [bp].tbtm
|
|
_if z
|
|
mov bx,[bp].bbtm
|
|
tst bx
|
|
_ifn z
|
|
add bx,ax
|
|
_endif
|
|
mov [bp].tbtm,bx
|
|
_endif
|
|
call offlbuf
|
|
clc
|
|
bsav9: pop es
|
|
VZ_RET
|
|
bsave endp
|
|
|
|
;--- Close Line buffer ---
|
|
|
|
public offlbuf
|
|
offlbuf proc
|
|
mov ax,[bp].ttops
|
|
mov [bp].lbseg,ax
|
|
mov ax,[bp].tnow
|
|
mov [bp].btop,ax
|
|
push si
|
|
mov si,[bp].tnxt
|
|
call setbend
|
|
pop si
|
|
mov [bp].bmax,0FFFFh
|
|
mov [bp].inbuf,FALSE
|
|
VZ_RET
|
|
offlbuf endp
|
|
|
|
;--- Scan line start ptr ---
|
|
;--> DS:SI :text ptr
|
|
|
|
public toplin,endlin,prelin
|
|
toplin proc
|
|
cmp byte ptr [si-1],LF
|
|
je topl9
|
|
jmps topl1
|
|
prelin:
|
|
dec si
|
|
topl1: dec si
|
|
std
|
|
call endlin
|
|
cld
|
|
inc si
|
|
inc si
|
|
topl9: VZ_RET
|
|
toplin endp
|
|
|
|
endlin proc
|
|
pushm <cx,di,es>
|
|
movseg es,ds
|
|
mov di,si
|
|
mov cx,-1
|
|
mov al,LF
|
|
repne scasb
|
|
mov si,di
|
|
popm <es,di,cx>
|
|
VZ_RET
|
|
endlin endp
|
|
|
|
;--- Scan field start ptr ---
|
|
;--> DS:SI :text ptr
|
|
;<-- BX :top of line
|
|
|
|
public nxtfld,nxtfldl,prefld,prefldl
|
|
nxtfld proc
|
|
mov dl,0
|
|
jmps fild1
|
|
nxtfldl:
|
|
call nxtfld
|
|
_if c
|
|
inc [bp].lnumb
|
|
_endif
|
|
inc [bp].dnumb
|
|
VZ_RET
|
|
prefldl:
|
|
cmp byte ptr [si-1],LF
|
|
_if e
|
|
dec [bp].lnumb
|
|
_endif
|
|
dec [bp].dnumb
|
|
prefld proc
|
|
mov dl,1
|
|
mov di,si
|
|
call prelin
|
|
fild1:
|
|
mov bx,si
|
|
clr cx
|
|
mov dh,[bp].fsiz
|
|
fild2:
|
|
inc cx
|
|
fild21: lodsb
|
|
ifkanji fild_k
|
|
cmp al,SPC
|
|
jae fild3
|
|
cmp al,TAB
|
|
je fild_tab
|
|
cmp al,CR
|
|
je fild_cr
|
|
cmp al,LF
|
|
jne fild_ct
|
|
fild_lf:
|
|
tst dl
|
|
stc
|
|
jz fild9
|
|
jmps fild8
|
|
fild_cr:
|
|
lodsb
|
|
cmp al,LF
|
|
je fild_lf
|
|
dec si
|
|
fild_ct:
|
|
cmp cl,dh
|
|
je fldck1
|
|
inc cx
|
|
jmps fild3
|
|
fild_tab:
|
|
dec cx
|
|
call do_tab
|
|
jmps fild3
|
|
fldck1:
|
|
dec si
|
|
jmps fild4
|
|
fild_kx:
|
|
dec si
|
|
jmps fild3
|
|
fild_k:
|
|
IFNDEF NO2BYTEHAN
|
|
mov ah,al
|
|
lodsb
|
|
cmp al,40h ;;
|
|
_if ae
|
|
cmp ax,8540h
|
|
_if ae
|
|
cmp ax,869Eh
|
|
jbe fild3
|
|
_endif
|
|
_endif
|
|
dec si
|
|
cmp cl,dh
|
|
je fldck1
|
|
inc si
|
|
ELSE
|
|
cmp cl,dh
|
|
je fldck1
|
|
lodsb
|
|
ENDIF
|
|
inc cx
|
|
cmp al,40h
|
|
jb fild_kx
|
|
fild3:
|
|
cmp cl,dh
|
|
jb fild2
|
|
fild4:
|
|
tst dl
|
|
jz fild9
|
|
cmp si,di
|
|
jne fild1
|
|
clc
|
|
fild8: mov si,bx
|
|
fild9: VZ_RET
|
|
|
|
prefld endp
|
|
nxtfld endp
|
|
|
|
;--- Scan field start ptr ---
|
|
;--> DS:SI :text ptr
|
|
;<-- SI :field top
|
|
|
|
public topfld
|
|
topfld proc
|
|
mov di,si
|
|
call toplin
|
|
_repeat
|
|
cmp si,di
|
|
je tfld9
|
|
pushm <si,di>
|
|
call nxtfld
|
|
popm <di,ax>
|
|
cmp si,di
|
|
_until a
|
|
mov si,ax
|
|
tfld9: VZ_RET
|
|
topfld endp
|
|
|
|
;****************************
|
|
; Display text
|
|
;****************************
|
|
|
|
;--- Redraw screen ---
|
|
|
|
public dspscr
|
|
dspscr proc
|
|
call csroff1 ; ##153.41
|
|
call ld_wact
|
|
jz dspscr9
|
|
mov drawfunc,offset cgroup:dspscr
|
|
; tstb altsize ; ##156.133
|
|
; jnz dspscr9
|
|
; call chkdosheight
|
|
; jne dspscr9
|
|
call chkline1
|
|
_if c
|
|
call resetwind
|
|
_endif
|
|
call clrbtm
|
|
call maptexts
|
|
mov al,[bp].wsplit
|
|
tst al
|
|
jz dspscr2
|
|
cmp al,SPLIT_V
|
|
_if ae
|
|
mov dh,[bp].tw_py
|
|
mov ch,[bp].tw_sy
|
|
tstb msgon
|
|
_if g
|
|
dec ch
|
|
_endif
|
|
call disppole
|
|
_endif
|
|
push bp
|
|
mov bp,w_back
|
|
call dspscr2
|
|
pop bp
|
|
dspscr2:
|
|
mov ds,[bp].ttops
|
|
call initdnumb
|
|
mov al,dspsw
|
|
or al,[bp].dspsw1
|
|
clr ah
|
|
test al,DSP_NUM
|
|
_ifn z
|
|
mov ah,6
|
|
_endif
|
|
mov [bp].fskp,ah
|
|
call bsave
|
|
mov si,[bp].tcp
|
|
call scrout_cp
|
|
call dispstat
|
|
dspscr9:clc
|
|
VZ_RET
|
|
|
|
dspscr endp
|
|
|
|
;--- Display one line ---
|
|
; DS:SI :text ptr
|
|
; CL :location y
|
|
; DX :line number
|
|
|
|
public tout,tout1
|
|
toutb:
|
|
pushm <cx,dx>
|
|
call disphead
|
|
clr ax
|
|
test [bp].largf,FL_TAIL
|
|
jne toutb1
|
|
mov dx,[bp].tnxt
|
|
cmp dx,[bp].tend
|
|
jb toutb1
|
|
mov ax,[bp].bend
|
|
inc ax
|
|
toutb1: push ax
|
|
call chkbblk
|
|
jmps tout1
|
|
|
|
tout proc
|
|
pushm <cx,dx>
|
|
call disphead
|
|
clr ax
|
|
test [bp].largf,FL_TAIL
|
|
_if z
|
|
mov ax,[bp].tend
|
|
_endif
|
|
push ax
|
|
call chktblk
|
|
tout1:
|
|
push cx
|
|
push bx
|
|
mov al,[bp].tabr
|
|
push ax
|
|
mov ah,[bp].fsiz
|
|
mov al,dspsw
|
|
or al,[bp].dspsw1
|
|
push ax
|
|
mov bl,[bp].fofs
|
|
mov bh,[bp].tw_sx
|
|
sub bh,[bp].fskp
|
|
add bh,bl
|
|
mov dx,sp
|
|
call disptext
|
|
pop ax
|
|
lahf
|
|
add sp,8
|
|
sahf
|
|
popm <dx,cx>
|
|
jc tout8
|
|
call isdnumb
|
|
jz tout9
|
|
tout8: inc dx
|
|
tout9: VZ_RET
|
|
tout endp
|
|
|
|
;--- Check block ---
|
|
; AH :blkm
|
|
; BX :blktop
|
|
; CX :blkend
|
|
|
|
chktblk proc
|
|
tstb [bp].blkm
|
|
jz noblk
|
|
ldl [bp].tblkp
|
|
mov bx,[bp].tnow
|
|
mov cx,[bp].tcp
|
|
tstb [bp].inbuf
|
|
_ifn z
|
|
mov cx,bx
|
|
_endif
|
|
subl [bp].headp
|
|
_ifn c
|
|
tst dx
|
|
_if z
|
|
add ax,[bp].ttop ; ##1.5
|
|
mov dx,ax
|
|
add dx,[bp].bofs
|
|
cmp dx,cx
|
|
je noblk
|
|
jb chkt_a
|
|
_else
|
|
mov ax,0FFFFh
|
|
mov dx,ax
|
|
_endif
|
|
xchg ax,bx
|
|
xchg dx,cx
|
|
_else
|
|
clr ax
|
|
clr dx
|
|
_endif
|
|
chkt_a:
|
|
cmp si,ax
|
|
jb noblk
|
|
cmp si,cx
|
|
ja noblk
|
|
cmp ax,bx
|
|
je chkt3
|
|
cmp [bp].blkm,BLK_CHAR
|
|
je chkt3
|
|
|
|
cmp si,bx
|
|
je noblk
|
|
|
|
mov cx,bx
|
|
mov dx,ax
|
|
chkt3: mov bx,dx
|
|
blk_c: mov ah,[bp].blkm
|
|
test ah,BLK_RECT
|
|
_ifn z
|
|
mov bl,[bp].blkx
|
|
clr bh
|
|
mov cl,[bp].lxs
|
|
clr ch
|
|
cmp cx,bx
|
|
_if be
|
|
mov cx,-1
|
|
_endif
|
|
_endif
|
|
VZ_RET
|
|
noblk:
|
|
clr ah
|
|
VZ_RET
|
|
chktblk endp
|
|
|
|
chkbblk proc
|
|
tstb [bp].blkm
|
|
jz noblk
|
|
ldl [bp].tblkp
|
|
mov bx,[bp].btop
|
|
add bx,[bp].bofs
|
|
mov cx,[bp].tcp
|
|
subl [bp].headp
|
|
jc chkb_a
|
|
tst dx
|
|
jnz chkb_b
|
|
add ax,[bp].ttop ; ##1.5
|
|
cmp ax,[bp].tnow
|
|
jb chkb_a
|
|
ja chkb_b
|
|
chkb1: cmp bx,cx
|
|
je noblk
|
|
jb chkb2
|
|
xchg bx,cx
|
|
chkb2: jmp blk_c
|
|
chkb_a: clr bx
|
|
jmps chkb1
|
|
chkb_b: mov cx,0FFFFh
|
|
jmps chkb1
|
|
chkbblk endp
|
|
|
|
;--- Display full screen ---
|
|
|
|
public scrout_cp,scrout_fx,scrout_lx
|
|
scrout_cp:
|
|
call adj_cp
|
|
jmps scrout
|
|
|
|
scrout_fx:
|
|
call adj_fx
|
|
jmps scrout
|
|
|
|
scrout_lx:
|
|
mov [bp].ly,0
|
|
mov si,[bp].tnow
|
|
call adj_fx
|
|
jmps scrout
|
|
|
|
public scrout,scrout1
|
|
scrout proc
|
|
call hadjust
|
|
scrout1:call issilent
|
|
mov ucsrpos,0
|
|
mov cx,[bp].thom
|
|
jcxz bufout
|
|
call sethomnumb
|
|
mov si,cx
|
|
clr cl
|
|
sout1: cmp si,[bp].tnow
|
|
jne sout2
|
|
tstb [bp].inbuf
|
|
jz sout2
|
|
push ds
|
|
mov ds,[bp].lbseg
|
|
mov si,[bp].btop
|
|
mov [bp].wnxt,0
|
|
jmp bout1
|
|
sout2: call tout
|
|
inc cx
|
|
sout3:
|
|
cmp cl,[bp].tw_cy
|
|
ja sout9
|
|
jb sout4
|
|
call isend
|
|
je sout41
|
|
mov [bp].tbtm,si
|
|
cmp [bp].wsplit,SPLIT_U
|
|
je sout4
|
|
tstb msgon
|
|
jg sout9
|
|
cmp [bp].wsplit,SPLIT_R ; ##153.52
|
|
_ifn e
|
|
mov msgon,0
|
|
_endif
|
|
sout4: call isend
|
|
jne sout1
|
|
sout41: clr ax
|
|
mov [bp].tbtm,ax
|
|
mov [bp].bbtm,ax
|
|
mov al,cl
|
|
mov dx,word ptr [bp].tw_px
|
|
mov cx,word ptr [bp].tw_sx
|
|
add dh,al
|
|
sub ch,al
|
|
jz sout9
|
|
cmp [bp].wsplit,SPLIT_U
|
|
je sout5
|
|
tstb msgon
|
|
jng sout5
|
|
dec ch
|
|
jz sout9
|
|
sout5: call cls
|
|
sout9: clc
|
|
VZ_RET
|
|
scrout endp
|
|
|
|
;--- Display lower screen ---
|
|
|
|
public bufout
|
|
bufout proc
|
|
call issilent
|
|
push ds
|
|
mov ds,[bp].lbseg
|
|
mov cl,[bp].wy
|
|
sub cl,[bp].ly
|
|
tst cl
|
|
_if l
|
|
clr cl
|
|
_endif
|
|
mov si,[bp].bhom
|
|
mov dx,[bp].lnumb
|
|
call isdnumb
|
|
_ifn z
|
|
mov dx,[bp].dnumb
|
|
mov al,[bp].ly
|
|
cmp al,[bp].wy
|
|
_if a
|
|
mov al,[bp].wy
|
|
_endif
|
|
cbw
|
|
sub dx,ax
|
|
_endif
|
|
bout1:
|
|
call toutb
|
|
inc cl
|
|
jnc bout2
|
|
cmp cl,[bp].wnxt
|
|
je bout8
|
|
mov [bp].wnxt,cl
|
|
mov si,[bp].tnxt
|
|
pop ds
|
|
jmp sout3
|
|
bout2:
|
|
cmp cl,[bp].tw_cy
|
|
jb bout1
|
|
ja bout8
|
|
mov [bp].tbtm,0
|
|
mov [bp].bbtm,si
|
|
jmp bout1
|
|
bout8: pop ds
|
|
clc
|
|
VZ_RET
|
|
bufout endp
|
|
|
|
;--- Set home line number ---
|
|
;--> CX :thom
|
|
;<-- DX :line number
|
|
|
|
public sethomnumb
|
|
sethomnumb proc
|
|
call isdnumb
|
|
_if z
|
|
mov ax,[bp].tnow
|
|
call setnum
|
|
add dx,[bp].lnumb
|
|
_else
|
|
sethomdnumb:
|
|
mov dx,[bp].dnumb
|
|
sub dl,[bp].wy
|
|
sbb dh,0
|
|
_endif
|
|
VZ_RET
|
|
sethomnumb endp
|
|
|
|
;--- Set bottom line number ---
|
|
;--> CX :tbtm
|
|
;<-- DX :line number
|
|
|
|
public setbtmnumb
|
|
setbtmnumb proc
|
|
call isdnumb
|
|
_if z
|
|
mov ax,[bp].tnow
|
|
call setnum
|
|
add dx,[bp].lnumb
|
|
_else
|
|
mov dl,[bp].tw_cy
|
|
sub dl,[bp].wy
|
|
clr dh
|
|
add dx,[bp].dnumb
|
|
_endif
|
|
VZ_RET
|
|
setbtmnumb endp
|
|
|
|
;--- Clear message line ---
|
|
|
|
public clrmsg
|
|
clrmsg proc
|
|
mov msgon,0
|
|
mov al,[bp].wsplit
|
|
tst al
|
|
jz clrmsg1
|
|
cmp al,SPLIT_D
|
|
je clrmsg1
|
|
_if a
|
|
mov dh,[bp].tw_cy
|
|
add dh,[bp].tw_py
|
|
mov ch,1
|
|
call disppole
|
|
call clrmsg1
|
|
_endif
|
|
pushm <bp,ds>
|
|
mov bp,w_back
|
|
mov ds,[bp].ttops
|
|
call clrmsg1
|
|
popm <ds,bp>
|
|
VZ_RET
|
|
|
|
clrmsg1:
|
|
mov dx,[bp].lnumb
|
|
mov cx,[bp].tbtm
|
|
mov al,[bp].tw_cy
|
|
push ax
|
|
_ifn cxz
|
|
call setbtmnumb
|
|
mov si,cx
|
|
pop cx
|
|
call tout
|
|
_else
|
|
mov si,[bp].bbtm
|
|
tst si
|
|
_ifn z
|
|
pop cx
|
|
push ds
|
|
mov ds,[bp].lbseg
|
|
call toutb
|
|
pop ds
|
|
_else
|
|
pop cx
|
|
mov dx,word ptr [bp].tw_px
|
|
add dh,cl
|
|
mov cl,[bp].tw_sx
|
|
mov ch,1
|
|
call cls
|
|
_endif
|
|
_endif
|
|
VZ_RET
|
|
clrmsg endp
|
|
|
|
endcs
|
|
|
|
eseg
|
|
|
|
;****************************
|
|
; Adjust output parameters
|
|
;****************************
|
|
|
|
;--- Set location(x,y) from cursor point ---
|
|
;-->
|
|
; SI :cursor ptr
|
|
; btop is given
|
|
;<--
|
|
; CL(lx),CH :location x,y
|
|
; SI(tcp) :adjusted cursor ptr
|
|
; BX(tfld) :current field start
|
|
|
|
public cptoxy
|
|
cptoxy proc
|
|
push ds
|
|
movseg ds,[bp].lbseg
|
|
clr cx
|
|
mov dl,[bp].fsiz
|
|
mov di,si
|
|
inc di
|
|
cpx01:
|
|
mov si,[bp].btop
|
|
cpx1:
|
|
mov bx,si
|
|
cpx2:
|
|
lodsb
|
|
ifkanji cpxck
|
|
cmp al,SPC
|
|
jb cpxct1
|
|
cmp si,di
|
|
je cpxeq
|
|
cpx3:
|
|
inc cl
|
|
cpx31: cmp cl,dl
|
|
jb cpx2
|
|
cpx4:
|
|
clr cl
|
|
inc ch
|
|
jmp cpx1
|
|
cpxct1:
|
|
cmp al,CR
|
|
je cpx_cr
|
|
cmp al,LF
|
|
je cpxeq
|
|
cmp al,TAB
|
|
jne cpxck
|
|
cmp si,di
|
|
je cpxeq
|
|
call do_tab
|
|
jmps cpx31
|
|
cpx_kx:
|
|
dec si
|
|
jmp cpx3
|
|
cpx_cr:
|
|
cmp byte ptr [si],LF
|
|
je cpxeq
|
|
IFNDEF NO2BYTEHAN
|
|
cpxck:
|
|
mov ah,al
|
|
tst ah
|
|
_if s
|
|
lodsb
|
|
dec si
|
|
cmp al,40h ;;
|
|
_if ae
|
|
cmp ax,8540h
|
|
_if ae
|
|
cmp ax,869Eh
|
|
_if be
|
|
cmp si,di
|
|
je cpxeq
|
|
inc si
|
|
cmp si,di
|
|
jne cpx3
|
|
dec si
|
|
jmps cpxeq
|
|
_endif
|
|
_endif
|
|
_endif
|
|
_endif
|
|
inc cl
|
|
cmp cl,dl
|
|
jb cpxck1
|
|
mov cl,1
|
|
inc ch
|
|
mov bx,si
|
|
dec bx
|
|
cpxck1: cmp si,di
|
|
je cpxeq1
|
|
tst ah
|
|
jns cpx3
|
|
inc si
|
|
cmp al,40h
|
|
jb cpx_kx
|
|
ELSE
|
|
cpxck:
|
|
inc cl
|
|
cmp cl,dl
|
|
jb cpxck1
|
|
mov cl,1
|
|
inc ch
|
|
mov bx,si
|
|
dec bx
|
|
cpxck1: cmp si,di
|
|
je cpxeq1
|
|
tst al
|
|
jns cpx3
|
|
lodsb
|
|
cmp al,40h
|
|
jb cpx_kx
|
|
ENDIF
|
|
cmp si,di
|
|
jne cpx3
|
|
cpxeq2: dec si
|
|
cpxeq1: dec cl
|
|
cpxeq:
|
|
dec si
|
|
mov [bp].tfld,bx
|
|
mov [bp].tcp,si
|
|
mov [bp].lx,cl
|
|
mov [bp].lxs,cl
|
|
pop ds
|
|
VZ_RET
|
|
cptoxy endp
|
|
|
|
endes
|
|
|
|
cseg
|
|
|
|
;--- Set edit point from location(x,y) ---
|
|
;<--
|
|
; SI(tcp) :edit ptr
|
|
; CL(lx) :corrected x
|
|
;
|
|
;-->
|
|
; DL,DH :location in line
|
|
; tnow is given
|
|
|
|
public xytocp
|
|
xytocp proc
|
|
clr bx
|
|
jmps fxc0
|
|
;-->
|
|
; SI :field start
|
|
; tnow,lx is given
|
|
|
|
public xtocp,xtocp2
|
|
xtocp:
|
|
mov dl,[bp].lxs
|
|
jmps xtocp1
|
|
;-->
|
|
; DL :location in line
|
|
; SI :field start
|
|
; tnow is given
|
|
|
|
public fxtocp
|
|
fxtocp: mov dh,-1
|
|
mov bx,si
|
|
fxc0:
|
|
mov si,[bp].tnow
|
|
clr ch
|
|
fxc1: cmp ch,dh
|
|
jz xyc0
|
|
tst bx
|
|
jz fxc2
|
|
cmp si,bx
|
|
jae xyc0
|
|
fxc2: pushm <bx,cx,dx>
|
|
call nxtfld
|
|
mov ax,bx
|
|
popm <dx,cx,bx>
|
|
jc fxc3
|
|
inc ch
|
|
jmp fxc1
|
|
fxc3: mov si,ax
|
|
xyc0: ;SI :field start ptr
|
|
mov [bp].ly,ch
|
|
xtocp1:
|
|
mov [bp].tfld,si
|
|
xtocp2:
|
|
clr cl
|
|
xyc1:
|
|
cmp cl,dl
|
|
jae xyc8
|
|
inc cl
|
|
xyc11: lodsb
|
|
ifkanji xycck
|
|
cmp al,SPC
|
|
jae xyc1
|
|
cmp al,TAB
|
|
je xyc_tab
|
|
cmp al,CR
|
|
je xyc_cr
|
|
cmp al,LF
|
|
jne xycck
|
|
jmps xyc_lf
|
|
xyc_cr:
|
|
cmp byte ptr [si],LF
|
|
je xyc_lf
|
|
IFNDEF NO2BYTEHAN
|
|
xycck:
|
|
mov ah,al
|
|
tst ah
|
|
_if s
|
|
lodsb
|
|
cmp al,40h ;;
|
|
_if ae
|
|
cmp ax,8540h
|
|
_if ae
|
|
cmp ax,869Eh
|
|
jbe xyc1
|
|
_endif
|
|
_endif
|
|
dec si
|
|
_endif
|
|
cmp cl,dl
|
|
_if ae
|
|
dec cl
|
|
dec si
|
|
jmps xyc8
|
|
_endif
|
|
inc cl
|
|
tst ah
|
|
jns xyc1
|
|
inc si
|
|
ELSE
|
|
xycck:
|
|
cmp cl,dl
|
|
jb xycck1
|
|
dec cl
|
|
dec si
|
|
jmps xyc8
|
|
xycck1: inc cl
|
|
tst al
|
|
jns xyc1
|
|
mov ah,al
|
|
lodsb
|
|
ENDIF
|
|
cmp al,40h
|
|
jae xyc1
|
|
xycck2: dec si
|
|
jmps xyc1
|
|
xyc_tab:
|
|
dec cl
|
|
call do_tab
|
|
cmp cl,dl
|
|
jb xyc1
|
|
jz xyc8
|
|
mov cl,ah
|
|
dec si
|
|
jmps xyc8
|
|
|
|
xyc_lf: dec cl
|
|
dec si
|
|
test edtsw,EDT_LOGMOVE
|
|
jnz xyc8
|
|
cmp dl,-1
|
|
je xyc8
|
|
mov cl,dl
|
|
xyc8:
|
|
mov [bp].tcp,si
|
|
mov [bp].lx,cl
|
|
VZ_RET
|
|
xytocp endp
|
|
|
|
;--- Adjust by cp ---
|
|
; SI :text current ptr(cp)
|
|
; wy :display position
|
|
|
|
public adj_cp
|
|
adj_cp proc
|
|
mov [bp].tcp,si
|
|
call setlinep
|
|
call cptoxy
|
|
mov [bp].ly,ch
|
|
jmps sethome
|
|
adj_cp endp
|
|
|
|
;--- Adjust by field ---
|
|
; SI :field top
|
|
; lx,wy :display position
|
|
|
|
public adj_fx
|
|
adj_fx proc
|
|
call setlinep
|
|
mov dl,[bp].lxs
|
|
call fxtocp
|
|
jmps sethome
|
|
adj_fx endp
|
|
|
|
;--- Set line top/end ptr ---
|
|
;--> SI :text ptr
|
|
|
|
public setlinep
|
|
setlinep proc
|
|
push si
|
|
call toplin
|
|
mov [bp].tnow,si
|
|
mov [bp].btop,si
|
|
pop si
|
|
setlendp:
|
|
push si
|
|
call endlin
|
|
mov [bp].tnxt,si
|
|
call setbend
|
|
pop si
|
|
VZ_RET
|
|
setlinep endp
|
|
|
|
;--- Set bend ---
|
|
;--> SI :tnxt
|
|
|
|
setbend proc
|
|
dec si
|
|
cmp byte ptr [si-1],CR
|
|
_if e
|
|
dec si
|
|
_endif
|
|
mov [bp].bend,si
|
|
VZ_RET
|
|
setbend endp
|
|
|
|
;--- Set home ptr ---
|
|
|
|
sethome proc
|
|
mov si,[bp].tnow
|
|
mov al,[bp].wys
|
|
mov [bp].wy,al
|
|
sub al,[bp].ly
|
|
_if be
|
|
push ds
|
|
movseg ds,[bp].lbseg
|
|
tstb [bp].inbuf
|
|
jz home1
|
|
mov si,[bp].btop
|
|
home1: tst al
|
|
jz home2
|
|
pushm <ax,ds>
|
|
call nxtfld
|
|
popm <ds,ax>
|
|
inc al
|
|
jnz home1
|
|
home2:
|
|
pop ds
|
|
tstb [bp].inbuf
|
|
jz home5
|
|
mov [bp].bhom,si
|
|
_else
|
|
home3:
|
|
call istop
|
|
je home4
|
|
push ax
|
|
call prefld
|
|
pop ax
|
|
dec al
|
|
jnz home3
|
|
home4:
|
|
sub al,[bp].wys
|
|
neg al
|
|
mov [bp].wy,al ;set wy
|
|
home5: mov [bp].thom,si ;set thom
|
|
_endif
|
|
VZ_RET
|
|
sethome endp
|
|
|
|
endcs
|
|
|
|
eseg
|
|
|
|
;--- H screen adjust ---
|
|
;<-- CY :request H-scroll
|
|
|
|
public hadjust
|
|
hadjust proc
|
|
call setctype
|
|
mov ah,[bp].fofs
|
|
add ah,[bp].tw_sx
|
|
sub ah,[bp].fskp
|
|
mov al,[bp].lx
|
|
cmp al,[bp].fofs
|
|
jb hadj4
|
|
_if e
|
|
tst al
|
|
jz hadj9
|
|
dec al
|
|
jmps hadj4
|
|
_endif
|
|
sub al,ah
|
|
_if b
|
|
hadj9: clc
|
|
VZ_RET
|
|
_endif
|
|
inc al
|
|
tstb [bp].ckanj
|
|
_ifn z
|
|
inc al
|
|
_endif
|
|
add al,[bp].fofs
|
|
hadj4: mov [bp].fofs,al
|
|
mov [bp].wnxt,0 ; ##100.04
|
|
stc
|
|
VZ_RET
|
|
hadjust endp
|
|
|
|
endes
|
|
|
|
cseg
|
|
|
|
;--- V screen adjust ---
|
|
;--> DH :dy
|
|
;<-- CY :request V-scroll
|
|
|
|
vadjust proc
|
|
mov al,dh
|
|
tst al
|
|
jz vadjc
|
|
js vadjm
|
|
add al,[bp].wy
|
|
cmp al,[bp].tw_cy
|
|
jb vadj0
|
|
sub al,[bp].tw_cy
|
|
cbw
|
|
inc ax
|
|
mov cx,ax
|
|
mov al,[bp].tw_cy
|
|
dec ax
|
|
mov [bp].wy,al
|
|
mov si,[bp].thom
|
|
tst si
|
|
jz vadjb
|
|
vadjpl:
|
|
push cx
|
|
call nxtfld
|
|
pop cx
|
|
cmp si,[bp].tnow
|
|
je vadjb
|
|
loop vadjpl
|
|
mov [bp].thom,si
|
|
jmps vadjs
|
|
vadjm:
|
|
add al,[bp].wy
|
|
jge vadj0
|
|
mov [bp].wy,0
|
|
vadjb:
|
|
call sethome
|
|
vadjs: stc
|
|
VZ_RET
|
|
vadj0:
|
|
mov [bp].wy,al
|
|
vadjc: clc
|
|
VZ_RET
|
|
|
|
vadjust endp
|
|
|
|
;--- Vertical scroll ---
|
|
;-->
|
|
; DL :0=no touch, 1=touched
|
|
; DH :dy
|
|
|
|
public vscroll
|
|
vscroll proc
|
|
mov al,dh
|
|
cbw
|
|
add [bp].dnumb,ax
|
|
push dx
|
|
call vadjust
|
|
mov al,[bp].wy
|
|
mov [bp].wys,al
|
|
pushf
|
|
call hadjust
|
|
jc vscr3
|
|
tstb [bp].blkm
|
|
jnz vscr3
|
|
popf
|
|
jc vscr1
|
|
pop dx
|
|
push dx
|
|
tst dl
|
|
jz vscr8
|
|
call bufout
|
|
jmps vscr8
|
|
vscr1:
|
|
pop dx
|
|
cmp dx,0100h
|
|
je vscr5
|
|
cmp dx,0FF00h
|
|
je vscr5
|
|
vscr2: push dx
|
|
pushf
|
|
vscr3: popf
|
|
call scrout1
|
|
vscr8: pop dx
|
|
VZ_RET
|
|
vscr5:
|
|
mov al,dh
|
|
vscr6:
|
|
mov si,[bp].tbtm
|
|
tst si
|
|
jz vscr2
|
|
tst al
|
|
_ifn s
|
|
tstb msgon
|
|
_ifn z
|
|
pushm <ax,si>
|
|
call clrmsg
|
|
popm <si,ax>
|
|
_endif
|
|
_endif
|
|
push ax
|
|
tst al
|
|
_ifn s
|
|
call nxtfld
|
|
call isend
|
|
_if e
|
|
clr si
|
|
_endif
|
|
_else
|
|
call prefld
|
|
_endif
|
|
mov [bp].tbtm,si
|
|
mov [bp].bbtm,0
|
|
clr dx
|
|
call undercsr
|
|
pop ax
|
|
push ax
|
|
mov dx,word ptr [bp].tw_px
|
|
mov cx,word ptr [bp].tw_sx
|
|
mov ah,ATR_TXT
|
|
call rollwind
|
|
pop ax
|
|
tst al
|
|
_ifn s
|
|
call clrmsg1
|
|
_else
|
|
mov cx,[bp].thom
|
|
push cx
|
|
call sethomnumb
|
|
clr cl
|
|
pop si
|
|
call tout
|
|
_endif
|
|
VZ_RET
|
|
vscroll endp
|
|
|
|
public vscroll2
|
|
vscroll2 proc
|
|
push ax
|
|
call setlinep
|
|
mov dl,[bp].lxs
|
|
call fxtocp
|
|
call hadjust
|
|
pop ax
|
|
jc vrol_x
|
|
tstb [bp].blkm
|
|
jnz vrol_x
|
|
mov si,[bp].thom
|
|
push ax
|
|
tst al
|
|
_ifn s
|
|
mov al,[bp].wy
|
|
cmp al,[bp].wys
|
|
jb norol
|
|
call nxtfld
|
|
_else
|
|
call istop
|
|
je norol
|
|
call prefld
|
|
_endif
|
|
mov [bp].thom,si
|
|
pop ax
|
|
jmp vscr6
|
|
vrol_x:
|
|
call sethome
|
|
jmp scrout1
|
|
norol:
|
|
pop ax
|
|
jmp sethome
|
|
vscroll2 endp
|
|
|
|
endcs
|
|
end
|
|
|
|
;****************************
|
|
; End of 'core.asm'
|
|
; Copyright (C) 1989 by c.mos
|
|
;****************************
|