;**************************** ; 'disp.asm' ;**************************** include vz.inc ;--- Equations --- ;CHARCODE equ FALSE MAC_GETC equ 01000000b ;--- External symbols --- wseg extrn dspkeyf :byte extrn dspsw :byte extrn edtsw :byte extrn syssw :byte extrn linecnt :byte extrn hardware :byte extrn msgon :byte extrn pagm :byte extrn vsplit :byte extrn gends :word extrn macmode :word extrn opnpath :word extrn pagec :word extrn prompt :word extrn retval :word extrn rends :word extrn sbuf :word extrn send :word extrn sends :word extrn sysmode :word extrn w_act :word extrn doswd :word extrn pfbufp :word extrn atrpath :word extrn silent :word endws extrn sym_page :word extrn abputc :near extrn cls2 :near extrn csroff :near extrn dosheight :near extrn doswindow :near extrn fillset :near extrn fillspc :near extrn getatr :near extrn getc :near extrn getloc :near extrn getwindow :near extrn gputc :near extrn issilent :near extrn isviewmode :near extrn loadwloc :near extrn locate :near extrn message :near extrn mg_ask :near ; extrn mg_pass :near extrn mkscrnp :near ; extrn offmacro :near extrn printf :near extrn sprintf :near extrn putc :near extrn putcw :near extrn puts :near extrn putspc :near extrn puts_t :near extrn revatr :near extrn savewloc :near extrn setatr :near extrn setatr2 :near extrn set_attr :near extrn setwindow :near extrn skipstr :near extrn vlinec :near extrn vputc :near extrn get_indichar :near extrn isdnumb :near extrn off_silent :near dseg ;--- Local work --- clrkey db 0 endds cseg ;--- Constants --- pf_pass db '"%32s"',0 pf_linecolm db "%5u:%-3d",0 pf_dlinecolm db "%5u|%-3d",0 pf_linenum db "%5u:",0 pf_linespc db " ",0 pf_dispnum db "%5u|",0 pf_pagenum db "P%-4u|",0 ;IF CHARCODE ;pf_sysparm db "+%-4d[%4xh]%7ld/text %3uk/free",0 ;ELSE ;pf_sysparm db "%7ld/text %5u/stack %3uk/free",0 ;ENDIF pf_bytechar db " [ %02xh ]",0 pf_wordchar db " [%04xh]",0 pf_sysparm db "%8ld %3u%% (%5u) %3uK",0 ; code text ptr stack free endcs eseg assume ds:nothing ;--- New line --- public newline newline proc pushf pushm call doswindow call setwindow mov dh,ch dec dh clr dl call locate mov al,ATR_MSG call setatr mov ch,1 call cls2 mov msgon,-1 popm popf ret newline endp endes cseg ;--- Display message --- ; DL :message No. ; BX :parameter "ptr" ; ##156.118 public dispmsg dispmsg proc pushm call newline call messagep lodsb cmp al,1 _if e call printf _else cmp al,3 _if be ; push ds mov ax,opnpath jb fpath tst ax _if z fpath: lea ax,[bp].path ; movseg ds,ss _endif push si mov si,offset cgroup:pf_pass push ax mov bx,sp call printf pop ax pop si ; pop ds _else dec si _endif call puts _endif neg msgon call getloc ; ##156.139 call locate popm ret dispmsg endp messagep proc movseg ds,cs movseg es,cs mov di,offset cgroup:message _repeat call skipstr dec dl _until z mov si,di ret messagep endp assume ds:cgroup ;--- Display current string --- public dispstr dispstr proc push ds movseg ds,ss call newline neg msgon mov al,ATR_MSG call setatr mov si,sbuf call puts pop ds ret dispstr endp assume ds:nothing ;--- Ask Y/N ? --- ;--> DL :message No. ;<-- NC,ZR,AX=0:no, NC,NZ,AX=1:yes, CY:escape public dispask,dispaskn dispask proc call dispmsg dispask1: mov si,offset cgroup:mg_ask call putmg ask1: mov al,CSR_INS call getc jc ask_c cmp al,'Y' je ask_y cmp al,'N' je ask_n mov ah,syssw test ah,SW_YES+SW_REVYN _ifn z test ah,SW_REVYN _if z cmp al,CM_CR je ask_y cmp al,SPC je ask_n _else cmp al,CM_CR je ask_n cmp al,SPC je ask_y _endif _endif jmp ask1 ask_c: mov ax,-1 jmps ask8 ask_y: mov ax,TRUE jmps ask7 ask_n: mov ax,FALSE ask7: tst ax ask8: pushf push ax call newline call csroff pop ax popf ret dispaskn: mov al,dl call getloc push dx mov dl,al call dispmsg mov si,offset cgroup:mg_ask call putmg pop dx call locate jmp ask1 dispask endp ;--- Display split pole --- ; DH,CH :pole def. public disppole disppole proc mov al,ATR_TXT call setatr mov dl,vsplit call locate call vlinec ret disppole endp ;**************************** ; Display status line ;**************************** ; DS :text segment assume ds:cgroup public dispstat dispstat proc call issilent push ds movseg ds,ss call setatr_r mov al,[bp].wsplit mov cx,doswd ; ##156.123 cmp al,SPLIT_V ; ##156.99 _if ae shr cx,1 clr dx cmp al,SPLIT_L _ifn e mov dl,cl _endif sub cx,WD/2 pushm call locate mov al,GRC_VL call gputc call editmode call indibar popm push cx _ifn cxz call gputc dec cx _endif call fillright inc dh call locate call setatr_p mov al,GRC_VL call gputc call displabel1 call linecolm call putspc _else sub cx,WD push cx clr dl mov dh,[bp].tw_py dec dh call locate call putspc call editmode test word ptr dspsw,DSP_STLHEAD _ifn z call setatr_p call putspc call displabel1 call linecolm call indibar call gputc _else call putspc call linecolm call indibar call setatr_p call gputc call displabel1 _endif _endif pop cx call fillright mov al,ATR_TXT call setatr pop ds ret setatr_r: mov al,[bp].atrstt1 tst al _ifn z call set_attr ret _endif mov al,ATR_STT tstb [bp].tchf _if s mov al,ATR_STTR _endif tstb [bp].wnum _if z mov al,ATR_STT2 _endif call setatr ret fillright proc _ifn cxz _repeat call putspc _loop _endif ret fillright endp ;--- Edit mode --- editmode: mov bx,offset cgroup:sym_page mov al,pagm cmp al,PG_STRSCH _if ae call revatr mov al,PG_STRSCH _endif shl al,1 cbw add bx,ax mov dx,cs:[bx] xchg dl,dh call putcw call setatr_r call putspc tstb [bp].blkm _ifn z call revatr _endif mov dx,cs:sym_page+6 xchg dl,dh call putcw jmp setatr_r ;--- Line/Column number --- linecolm: mov al,[bp].lx clr ah inc ax push ax mov ax,[bp].lnumb mov si,offset cgroup:pf_linecolm call isdnumb _ifn z mov ax,[bp].dnumb mov si,offset cgroup:pf_dlinecolm _endif push ax mov bx,sp call printf add sp,4 ret ;--- Indicator bar --- indibar: test dspsw,DSP_SYS jnz sysparm mov al,GRC_VR call gputc call fillset call getcurptr tst dh _ifn z mov ax,-1 mov dl,al _endif mov dh,dl mov dl,ah mov ah,al clr al _repeat _break cxz shr cx,1 rcr bx,1 shr dx,1 rcr ax,1 _until tst bx _ifn z div bx mov dx,ax _endif mov cl,3 shr dx,cl mov cx,ax and cl,7 test hardware,IDN_PC98 _ifn z shr cl,1 shr cl,1 _endif push dx tst dx _ifn z _repeat call putspc dec dx _until z _endif call revatr mov al,SPC tst cl _ifn z call get_indichar _endif call gputc push ax call revatr pop ax pop dx cmp dl,32 _ifn e call gputc _endif mov dl,33 call fillspc mov al,GRC_VL ret ;--- System parameter --- sysparm: mov si,offset cgroup:pf_bytechar call gettcp inc ax cmp ax,[bp].tend mov ax,EOF _if b mov ax,[bp].ccode cmp ax,CR _if e mov ax,0D0Ah _endif tst ah _ifn z mov si,offset cgroup:pf_wordchar _endif _endif push ax mov bx,sp call printf pop ax mov ax,gends mov dx,sends test dh,EMSMASK _if z mov dx,rends ; rtops _endif sub ax,dx mov cl,6 shr ax,cl push ax ; /free push send ; /stack call getcurptr _if ae mov ax,100 jmps sys_cp _endif pushm _repeat _break cxz shr cx,1 rcr bx,1 shr dx,1 rcr ax,1 _until mov si,100 mul si div bx popm sys_cp: push ax ; % pushm ; /text mov bx,sp mov si,offset cgroup:pf_sysparm call printf add sp,10 ret dispstat endp assume ds:nothing ;--- Calc text size --- ;<-- DX:AX :text size public textsize textsize proc tstl [bp].readp _ifn z ldl [bp].eofp call isviewmode ; ##16 je tsize9 add ax,1 adc dx,0 subl [bp].readp _else clr ax cwd _endif addl [bp].headp addl [bp].tailp add ax,[bp].tend adc dx,0 sub ax,[bp].ttop sbb dx,0 test edtsw,EDT_EOF _if z sub ax,1 sbb dx,0 _endif tsize9: ret textsize endp ;--- Get current ptr --- ;<-- ; DX:AX :current ptr ; CX:BX :text size getcurptr proc call textsize pushm call gettcp sub ax,[bp].ttop clr dx addl [bp].headp popm cmphl cx,bx _if a mov dx,cx mov ax,bx _endif ret getcurptr endp gettcp proc mov ax,[bp].tcp tstb [bp].inbuf _ifn z sub ax,[bp].btop add ax,[bp].tnow cmp ax,[bp].tnxt _if a mov ax,[bp].tnxt _endif _endif ret gettcp endp ;--- Display text label --- setatr_p proc push ax mov al,[bp].atrpath1 tst al _ifn z call set_attr _else tstw atrpath _ifn z mov al,ATR_PATH call setatr _endif _endif pop ax ret setatr_p endp displabel1 proc call fillset call displabel call putspc call setatr_r ret displabel1 endp public displabel displabel proc mov al,[bp].wnum add al,'0' cmp al,'9' _if a add al,'A'-'9'-1 cmp al,'Z' _if a mov al,SPC _endif _endif call putc mov al,SPC cmp [bp].tchf,0 _ifn e mov al,'*' _if le mov al,'R' call isviewmode _if e mov al,'V' _endif _endif _endif call putc call putspc push ds mov si,[bp].labelp movseg ds,ss call puts pop ds mov dl,28 call fillspc ret displabel endp ;--- Display Line header --- ; SI :text pointer ; CL :y pos ; DX :line number public disphead disphead proc push dx mov dx,word ptr [bp].tw_px add dh,cl call locate pop dx push dx mov al,dspsw or al,[bp].dspsw1 test al,DSP_NUM _ifn z mov al,ATR_NUM call setatr push si call isdnumb _if z cmp byte ptr [si-1],LF mov si,offset cgroup:pf_linenum _ifn e mov si,offset cgroup:pf_linespc _endif _else mov si,offset cgroup:pf_dispnum mov bx,pagec tst bx _ifn z dec dx mov ax,dx clr dx div bx tst dx _if z mov dx,ax mov si,offset cgroup:pf_pagenum _endif inc dx _endif _endif ; push ds ; movseg ds,cs push dx mov bx,sp call printf pop dx ; pop ds pop si _endif pop dx ret disphead endp endcs eseg ;--- Draw window frame --- ; AL :frame attribute public dispframe dispframe proc pushm call setatr2 call getwindow mov dh,-1 mov dl,cl call locate mov al,GRC_TR call vputc mov dl,-1 call locate mov al,GRC_TL call vputc mov al,GRC_H call repputc mov dx,cx call locate mov al,GRC_BR call vputc mov dl,-1 call locate mov al,GRC_BL call vputc mov al,GRC_H call repputc movhl dx,0,-1 call locate call vlinec mov dl,cl call locate call vlinec popm ret dispframe endp ;--- Repeat put char --- ; AL :ASCII code ; CL :repeat count public repputc repputc proc push cx clr ch _repeat push ax call putc pop ax _loop pop cx ret repputc endp assume ds:cgroup ;--- Display prompt --- public dispprmpt dispprmpt proc push ds movseg ds,ss call newline mov al,ATR_MSG call setatr mov si,prompt call puts_t pop ds ret dispprmpt endp ;--- Display key mode --- ;--> SI :dword data ptr public dispkeymode,clrkeymode,offkeymode offkeymode: tstb dspkeyf jz dspk9 clrkeymode: mov si,offset cgroup:clrkey mov dl,FALSE jmps dspk0 dispkeymode proc mov dl,TRUE dspk0: mov dspkeyf,dl push ax call dosheight tst cl _if z cmp sysmode,SYS_DOS je dspk8 _endif mov dh,ch clr dl call mkscrnp mov al,ATR_KEY call getatr mov dl,al mov dh,al mov cx,4 mov al,SPC _repeat tst al jz dspk2 lodsb mov dl,dh cmp al,SPC ja dspk2 push ax mov al,ATR_DOS call getatr mov dl,al pop ax dspk2: clr ah call abputc _loop dspk8: pop ax dspk9: ret dispkeymode endp ;--- Display macro message --- ;--> ; SI :macro ptr ; BX :argument ptr ; DI :0=dispmsg, 1=dispask public dispmacmsg dispmacmsg proc tst si _if z cmp msgon,1 je macmsg9 _endif push silent mov ax,di call off_silent call savewloc push ax call newline tstb [si] _ifn z mov msgon,2 _endif mov al,ATR_MSG call setatr cmp si,100h _if b mov dx,si call dispmsg _else movseg es,ss mov di,pfbufp push di call sprintf pop si call puts _endif movseg ds,ss movseg es,ss ;; pop ax tst ax _ifn z mov ax,MAC_GETC xchg macmode,ax push ax push sysmode call dispask1 pop sysmode pop macmode mov retval,ax _endif call loadwloc pop silent macmsg9:ret dispmacmsg endp ;--- Put message --- public putmg putmg proc push ds movseg ds,cs call puts pop ds ret putmg endp endes end ;**************************** ; End of 'disp.asm' ; Copyright (C) 1989 by c.mos ;****************************