;**************************** ; '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 movseg ds,ss movseg es,ss mov di,pathbuf mov si,offset cgroup:nm_bak call setenvvar _ifn c popm 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 pushm push di movsw ; copy drive mov ds,ax mov si,dx call strcpy pop dx movseg ds,ss msdos F_MKDIR call addsep popm 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 mov cx,word ptr [bp].readp+2 mov dx,word ptr [bp].readp mov bx,fh_r msdos F_SEEK,0 popm 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 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 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 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 VZ_RET qread endp ;--- Close temp --- qclose proc pushf pushm call tmp_close call close_r popm popf VZ_RET qclose endp ;--- Kill temp --- qkill proc pushm 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 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 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 VZ_RET jump_lnumb endp jump_cp proc stl [bp].tnowp pushm call maptext mov ds,[bp].ttops call viewpoint mov ax,[bp].tcp call setabsp stl [bp].toldp call restcp call putnum popm 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 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 VZ_RET nexttext endp ;--- Read previous text --- ;--> ; SI :NZ=adjust ptrs, ZR=nop ;<-- ; CY :EOF or temp error ; SI :old ttop pretext proc pushm 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 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 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 clr si call pretext popm 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 clr si call nexttext popm 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 VZ_RET seektext endp ;--- Buffer overflow --- ;--> ; SI,DI :txtmov ptrs (updated) ;<-- ; CY :temp error public fulltext fulltext proc pushm 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 cmp ax,si jbe fulbt1 mov si,ax call endlin fulbt1: mov [bp].w2,si call writtail popm jc fulb_x fulb2: mov ax,[bp].tend cmp ax,[bp].ttop jne fulb1 fulb_o: clc fulb9: call qclose popm VZ_RET fulb_x: mov dl,E_TEMP call disperr stc jmp fulb9 fulb_h: mov ax,[bp].ttop add ax,[bp].tbalt pushm cmp ax,si jae fulbh1 mov si,ax call endlin fulbh1: mov [bp].w2,si call writhead popm 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 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 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 ;****************************