home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of Shareware - Software Farm 2
/
wosw_2.zip
/
wosw_2
/
CPROG
/
CEXPRESS.ZIP
/
SCREEN.ASM
/
WRAPLN.ASM
< prev
next >
Wrap
Assembly Source File
|
1989-05-03
|
6KB
|
207 lines
;void wrapln(strg,col,row,left,right,color);
; unsigned char *strg,*col,*row,left,right,color;
EXTRN _memory_model:byte
EXTRN _video_buffer:word
EXTRN _snow_protect:byte
_TEXT SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:_TEXT
PUBLIC _wrapln
_wrapln proc near
cld ;direction flag forward
push bp ;
mov bp,sp ;set stack frame
push di ;
push si ;
cmp _memory_model,0 ;near or far?
jle begin ;jump if near
inc bp ;else add 2 to BP
inc bp ;
begin: jmp short start ;jump over local data
strg dd ? ;
row dd ? ;
col dd ? ;
start: mov ax,_video_buffer ;get video address
mov es,ax ;move to ES
push ds ;DS changed for LODSB
cmp _memory_model,2 ;data near or far?
jb A1 ;jump if near
lds si,dword ptr[bp+4] ;point DS:SI to Strg
mov word ptr cs:strg,si
mov word ptr cs:strg+2,ds
lds si,dword ptr[bp+8] ;point DS:SI to Col
mov word ptr cs:col,si
mov word ptr cs:col+2,ds
lds si,dword ptr[bp+12];point DS:SI to Row
mov word ptr cs:row,si
mov word ptr cs:row+2,ds
add bp,6 ;additional offset since dword ptrs
jmp short B1 ;
A1: mov si,[bp+4] ;Strg
mov word ptr cs:strg,si
mov word ptr cs:strg+2,ds
mov si,[bp+6] ;Col
mov word ptr cs:col,si
mov word ptr cs:col+2,ds
mov si,[bp+8] ;Row
mov word ptr cs:row,si
mov word ptr cs:row+2,ds
B1: sub ax,ax ;
mov al,[si] ;place row in AX
dec ax ;count from 0
cmp ax,24 ;in range?
jna D1 ;jump ahead if not
C1: jmp Q1 ;quit routine
D1: mov dl,160 ;bytes in a row
mul dl ;times rows
mov cx,ax ;transfer offset to CX
lds si,cs:dword ptr col ;point DS:SI to Col
sub bx,bx ;
mov bl,[si] ;place in DI
mov di,bx ;
dec di ;count from 0
cmp di,79 ;in range?
ja C1 ;quit if not
shl di,1 ;double for attributes
add di,cx ;ES:DI pts to row,col
sub dx,dx ;
mov dl,[bp+10] ;Left border col to DX
sub bx,bx ;
mov bl,[bp+12] ;Right border col to BX
cmp bx,dx ;margins OK?
jbe C1 ;quit routine if not
dec dx ;count cols from 0
cmp dx,79 ;in range?
ja C1 ;quit if not
dec bx ;dec text
cmp bx,79 ;in range?
ja C1 ;quit if not
inc bx ;readjust
shl dx,1 ;double for attributes
shl bx,1 ;ditto
add dx,cx ;add row offset
add bx,cx ;ditto
cmp dx,di ;wrapcol rt of wrapleft?
ja C1 ;quit if not
cmp bx,di ;wrapcol left of wraprow?
jbe C1 ;quit if not
lds si,cs:dword ptr strg ;point DS:SI to Strg
sub cx,cx ;get string length
push si ;
E1: cmp byte ptr[si],0 ;end of string?
je F1 ;
inc cx ;inc counter
inc si ;inc strg ptr
jmp short E1 ;
F1: pop si ;
jcxz C1 ;quit if null
add cx,si ;CX=SI at last char
push si ;save string ptr
push di ;save screen ptr
mov ah,[bp+14] ;get color
G1: lodsb ;get a char
cmp al,32 ;a space?
jne J1 ;skip ahead if not
add sp,4 ;balance stack
push si ;save new string ptr
push di ;save new screen ptr
cmp di,dx ;start of row?
jne J1 ;jmp ahead if not
inc si ;inc SI for test
cmp si,cx ;cmp to EOL value
jg H1 ;skip if end of string
dec si ;readjust SI
cmp [si],al ;next char a space?
jne I1 ;jump ahead if not
cmp [si+1],al ;next char a space?
jne I1 ;jump ahead if not
jmp short J1 ;else write initial spcs
H1: dec si ;readjust SI
I1: cmp si,cx ;end of string?
jae N1 ;jump out of loop if so
jmp short G1 ;else delete initial spc
J1: call Writeit ;write a character
cmp si,cx ;end of string yet?
je N1 ;jump ahead if so
cmp di,bx ;right margin?
jne G1 ;if not, go do next char
mov al,32 ;clear EOL with spc char
cmp [si-1],al ;current char a space?
je M1 ;suitable end of line
cmp [si],al ;is next char a space?
je M1 ;suitable end of line
pop di ;scrn pos of prior space
cmp di,dx ;right col yet?
jne K1 ;jump is not
push di ;else save screen ptr
jmp short M1 ;go adjust for next line
K1: pop si ;string pos of prior space
push si ;save string ptr
push di ;save screen ptr
L1: mov al,32 ;write spc to end of line
call Writeit ;write a character
cmp di,bx ;end of line?
jne L1 ;write another spc if not
M1: add dx,160 ;left margin to next row
add bx,160 ;right margin to next row
cmp bx,4000 ;off screen?
ja N1 ;quit if so
pop di ;restore prior screen ptr
mov di,dx ;scrn ptr to left margin
push di ;save the position
jmp short G1 ;go do next char
N1: add sp,4 ;balance stack
sti ;reenable interrupts
cmp di,bx ;ending on right margin?
jne O1 ;jump ahead if not
mov ax,dx ;left margin value to AX
add ax,160 ;point 1 row below
jmp short P1 ;use value to set row-col
O1: mov ax,di ;screen pointer to AX
P1: shr ax,1 ;minus attri byte count
mov dl,80 ;columns in a row
div dl ;divide
sub bx,bx ;clear BX
mov bl,ah ;remainder in BX
sub ah,ah ;quotient in AX
inc ax ;count rows from 1
inc bx ;count cols from 1
mov dx,ax ;free AX
lds si,cs:dword ptr row ;point DS:SI to Row
mov [si],dl ;save new row position
lds si,cs:dword ptr col ;point DS:SI to Col
mov [si],bl ;save new col position
Q1: pop ds ;
pop si ;
pop di ;
pop bp ;
cmp _memory_model,0 ;quit
jle quit ;
db 0CBh ;RET far
quit: ret ;RET near
_wrapln endp
Writeit PROC
push dx ;--------PROCEDURE BEGINS
push bx ;save DX and BX
mov dx,es ;get video buffer address
cmp dx,0b800h ;test for graphics card
jb T1 ;jump if not graphics
mov dx,3dah ;status byte address
mov bx,ax ;save char-attri in BX
R1: in al,dx ;get status byte
test al,1 ;test bit
jnz R1 ;loop till 0
cli ;disable interrupts
S1: in al,dx ;get status byte
test al,1 ;test bit
jz S1 ;loop till 1
mov ax,bx ;return char-attri to AX
T1: stosw ;write the character
pop bx ;restore BX
pop dx ;restore DX and return
ret ;
Writeit endp
_TEXT ENDS
END