;**************************** ; 'xscr.asm' ;**************************** include vz.inc IFNDEF NOXSCR ;--- Equations --- grafflag equ 0600h+008Ah TEXTTOP equ 2 CONTMPEND equ 0100h MAXLINELEN equ 512 cseg ;--- External symbols --- extrn cmdln :byte extrn hardware :byte extrn conbufsz :word extrn conseg :word extrn dspsw :word extrn loseg :word extrn nears :word extrn nm_confile :word extrn ntab :word extrn syssw :word extrn w_act :word extrn w_busy :word extrn w_free :word extrn addeof1 :near extrn ems_alloc :near extrn ems_map :near extrn ems_restore :near extrn ems_save :near extrn iniopn2 :near extrn iniscr :near extrn initlnumb :near extrn isalpha :near extrn istop :near extrn memcopy :near extrn ofs2seg :near extrn prefld :near extrn ptradj2 :near extrn resetgbank :near extrn resetint :near extrn setabsp :near extrn setgbank :near extrn setint :near extrn setnum :near extrn sgmove2 :near extrn strcpy :near extrn toplin :near extrn txtmov :near extrn wndopn :near endcs bseg ;--- Local work --- vct29 dd 0 prechar db 0 GDATA skipescf, db, 0 putp dw 0 puttop dw 0 conend dw 0 conmax dw 0 conshift dw 0 concp dw 0 conwy db 0 xpause db 0 endbs iseg assume ds:cgroup,es:cgroup ;--- Init console file --- public initcon initcon proc mov conend,TEXTTOP mov ax,conbufsz tst ax _ifn z and ax,not 1 mov conmax,ax call ofs2seg mov cx,ax mov ax,conseg tst ax _if z mov al,2 call ems_alloc _endif tst ax _if z mov ax,nears add cx,ax mov nears,cx _endif mov conseg,ax mov si,offset cgroup:cmdln lodsb cbw add si,ax inc si mov puttop,si mov putp,si _endif ret initcon endp endis cseg ;--- Open console file --- public opencon opencon proc tstw conbufsz _ifn z mov bp,w_free call wndopn mov w_act,NULL lea di,[bp].path mov [bp].namep,di mov si,offset cgroup:nm_confile movseg es,ss call strcpy movseg es,cs mov [bp].tchf,TCH_RO call initlnumb mov al,byte ptr ntab mov [bp].tabr,al mov ax,conseg mov [bp].tends,ax mov dx,ax call ems_map mov ds,ax mov [bp].ttops,ax mov ax,cs:conmax call iniopn2 call iniscr mov si,cs:conend tst si _ifn z call addeof1 _endif movseg ds,cs _endif ret opencon endp ;--- Pre/Post DOS --- preconfile proc tstw conend _if z push bp mov bp,w_busy mov ax,[bp].tcp mov concp,ax mov al,[bp].wy mov conwy,al mov ax,[bp].tend dec ax mov conend,ax call setabsp stl [bp].tretp clr ax mov conshift,ax mov xpause,al ; ##152.17 pop bp _endif ret preconfile endp public postconfile postconfile proc tstw conbufsz _ifn z test syssw,SW_CON _ifn z tstw conend jnz pstcon1 _endif _endif ret pstcon1: mov di,putp call flushcontmp mov putp,di pushm mov ds,loseg mov putp,di movseg ds,cs mov bp,w_busy clr di xchg di,conend mov ax,conseg call ems_map mov ds,ax mov si,[bp].ttop mov ax,CRLF cmp [si-2],ax _ifn e mov [si-2],ax ; mov cs:conshift,-1 mov di,si _endif mov byte ptr [di],LF inc di mov [bp].tend,di mov al,cs:conwy mov si,cs:concp tst si _if z mov si,di dec si mov cl,[bp].tw_sy clr ch _repeat call istop _break e push cx call prefld pop cx _loop clr al _endif mov [bp].wy,al mov [bp].wys,al mov [bp].tcp,si call toplin mov [bp].tnow,si mov [bp].bhom,si push si mov ax,di mov si,cs:conshift mov di,TEXTTOP tst si _ifn z cmp si,-1 _if e mov si,ax _else add si,di _endif call ptradj2 _endif mov ax,[bp].ttop pop cx call setnum inc dx mov [bp].lnumb,dx popm ret postconfile endp endcs bseg ;--- INT29h handler --- int29in proc cld sti push ds pushm movseg ds,cs movseg es,cs call putcontmp popm cli cmp al,'\' je slash1 xscr8: mov prechar,al pop ds jmp cs:vct29 slash1: test dspsw,DSP_BSLASH jz xscr8 test hardware,IDN_PC98 jnz xscr8 tstb prechar js xscr8 tstb skipescf jnz xscr8 mov prechar,al pushm clr ax mov es,ax mov byte ptr es:[grafflag],0 mov al,BACKSLASH pushf call cs:vct29 mov byte ptr es:[grafflag],1 popm pop ds iret int29in endp ;--- Put char to console tmp buffer --- ;--> AL :output char putcontmp proc tstb skipescf _ifn z cmp prechar,ESCP ; ##152.17 _if e cmp al,'0' je pausectrl cmp al,'1' je pausectrl _endif call isalpha jc skipesc9 ret pausectrl: xor al,'1' mov xpause,al skipesc9: mov skipescf,FALSE ret _endif cmp al,ESCP jne puttmp2 test syssw,SW_SKIPESC jz puttmp2 mov skipescf,TRUE ret puttmp2: tst al jz puttmp9 cmp al,CR je puttmp9 tstb xpause jnz puttmp9 mov di,putp cmp al,BS _if e cmp di,puttop je puttmp9 dec di jmps puttmp8 _endif cmp al,LF _if e mov ax,CRLF stosw _else cmp prechar,CR _if e mov di,puttop _endif stosb cmp di,CONTMPEND jb puttmp8 _endif pushm call setgbank call ems_save call flushcontmp call ems_restore call resetgbank mov di,puttop popm puttmp8:mov putp,di puttmp9:ret putcontmp endp ;--- Flush console tmp buffer --- ;<--> DI :putp flushcontmp proc push es push di mov ax,conseg call ems_map mov es,ax mov cx,di sub cx,puttop jz flcon9 mov concp,0 mov di,conend mov ax,conmax sub ax,di cmp ax,cx _if be push ds movseg ds,es push di shr di,1 shr di,1 mov cx,MAXLINELEN mov al,LF repne scasb mov si,di mov di,TEXTTOP mov ax,si sub ax,di add ax,cs:conshift _if c mov ax,-1 _endif mov cs:conshift,ax pop cx sub cx,si call memcopy pop ds _endif pop cx mov si,puttop push si sub cx,si _ifn cxz rep movsb mov conend,di _endif flcon9: pop di pop es ret flushcontmp endp endbs eseg ;--- Copy ptrs to loader --- public copyxptrs copyxptrs proc push es mov es,loseg mov ax,es:putp mov putp,ax pop es ret copyxptrs endp ;--- Set/reset INT29h --- setint29 proc mov bx,offset cgroup:vct29 mov di,29h*4 mov ax,offset cgroup:int29in call setint ret setint29 endp public resetint29 resetint29 proc mov bx,offset cgroup:vct29 mov di,29h*4 call resetint ret resetint29 endp endes cseg ;--- Check INT29h --- public chkint29 chkint29 proc tstw conbufsz jz chkcon9 test syssw,SW_CON jz chkcon1 call preconfile call setint29 jmps chkcon9 chkcon1:call resetint29 chkcon9:ret chkint29 endp endcs ENDIF end ;**************************** ; End of 'xscr.asm' ; Copyright (C) 1989 by c.mos ;****************************