855 lines
13 KiB
Plaintext
855 lines
13 KiB
Plaintext
|
mode.c
|
|||
|
/* Copyright (C) 1984 by Manx Software Systems, Inc. */
|
|||
|
|
|||
|
extern int _maxx;
|
|||
|
extern int _xaspect, _yaspect;
|
|||
|
extern char _color;
|
|||
|
extern int _plotf,_plottbl[];
|
|||
|
|
|||
|
mode (val)
|
|||
|
{
|
|||
|
switch (val) {
|
|||
|
case 'l': case 'L': case 3:
|
|||
|
scr_call (3);
|
|||
|
break;
|
|||
|
case 'm': case 'M': case 4:
|
|||
|
_plotf = _plottbl[0];
|
|||
|
_xaspect = 6;
|
|||
|
_yaspect = 5;
|
|||
|
_maxx = 319;
|
|||
|
scr_call (4);
|
|||
|
break;
|
|||
|
case 'h': case 'H': case 6:
|
|||
|
_plotf = _plottbl[1];
|
|||
|
_xaspect = 4;
|
|||
|
_yaspect = 1;
|
|||
|
_maxx = 639;
|
|||
|
scr_call (6);
|
|||
|
break;
|
|||
|
default:
|
|||
|
if (val < 0 || val > 6)
|
|||
|
return;
|
|||
|
scr_call (val);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
color (c)
|
|||
|
{
|
|||
|
switch (c) {
|
|||
|
case 'w': case 'W': case 'y': case 'Y': case 3:
|
|||
|
_color = 3;
|
|||
|
break;
|
|||
|
case 'm': case 'M': case 'r': case 'R': case 2:
|
|||
|
_color = 2;
|
|||
|
break;
|
|||
|
case 'c': case 'C': case 'g': case 'G': case 1:
|
|||
|
_color = 1;
|
|||
|
break;
|
|||
|
default:
|
|||
|
_color = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
palette (c)
|
|||
|
{
|
|||
|
if (c)
|
|||
|
scr_call (11 << 8,1<<8 | 1,0,0);
|
|||
|
else
|
|||
|
scr_call (11 << 8,1<<8 | 0,0,0);
|
|||
|
}
|
|||
|
|
|||
|
ground (c)
|
|||
|
{
|
|||
|
scr_call (11 << 8, 0 << 8 | c,0,0);
|
|||
|
}
|
|||
|
address.asm
|
|||
|
; Copyright (C) 1984 by Manx Software Systems, Inc.
|
|||
|
; :ts=8
|
|||
|
include lmacros.h
|
|||
|
dataseg segment para public 'data'
|
|||
|
|
|||
|
public $address
|
|||
|
|
|||
|
$address equ this word ;/* vertical address table */
|
|||
|
dw 7920+8192
|
|||
|
dw 7920
|
|||
|
dw 7840+8192
|
|||
|
dw 7840
|
|||
|
dw 7760+8192
|
|||
|
dw 7760
|
|||
|
dw 7680+8192
|
|||
|
dw 7680
|
|||
|
dw 7600+8192
|
|||
|
dw 7600
|
|||
|
dw 7520+8192
|
|||
|
dw 7520
|
|||
|
dw 7440+8192
|
|||
|
dw 7440
|
|||
|
dw 7360+8192
|
|||
|
dw 7360
|
|||
|
dw 7280+8192
|
|||
|
dw 7280
|
|||
|
dw 7200+8192
|
|||
|
dw 7200
|
|||
|
dw 7120+8192
|
|||
|
dw 7120
|
|||
|
dw 7040+8192
|
|||
|
dw 7040
|
|||
|
dw 6960+8192
|
|||
|
dw 6960
|
|||
|
dw 6880+8192
|
|||
|
dw 6880
|
|||
|
dw 6800+8192
|
|||
|
dw 6800
|
|||
|
dw 6720+8192
|
|||
|
dw 6720
|
|||
|
dw 6640+8192
|
|||
|
dw 6640
|
|||
|
dw 6560+8192
|
|||
|
dw 6560
|
|||
|
dw 6480+8192
|
|||
|
dw 6480
|
|||
|
dw 6400+8192
|
|||
|
dw 6400
|
|||
|
dw 6320+8192
|
|||
|
dw 6320
|
|||
|
dw 6240+8192
|
|||
|
dw 6240
|
|||
|
dw 6160+8192
|
|||
|
dw 6160
|
|||
|
dw 6080+8192
|
|||
|
dw 6080
|
|||
|
dw 6000+8192
|
|||
|
dw 6000
|
|||
|
dw 5920+8192
|
|||
|
dw 5920
|
|||
|
dw 5840+8192
|
|||
|
dw 5840
|
|||
|
dw 5760+8192
|
|||
|
dw 5760
|
|||
|
dw 5680+8192
|
|||
|
dw 5680
|
|||
|
dw 5600+8192
|
|||
|
dw 5600
|
|||
|
dw 5520+8192
|
|||
|
dw 5520
|
|||
|
dw 5440+8192
|
|||
|
dw 5440
|
|||
|
dw 5360+8192
|
|||
|
dw 5360
|
|||
|
dw 5280+8192
|
|||
|
dw 5280
|
|||
|
dw 5200+8192
|
|||
|
dw 5200
|
|||
|
dw 5120+8192
|
|||
|
dw 5120
|
|||
|
dw 5040+8192
|
|||
|
dw 5040
|
|||
|
dw 4960+8192
|
|||
|
dw 4960
|
|||
|
dw 4880+8192
|
|||
|
dw 4880
|
|||
|
dw 4800+8192
|
|||
|
dw 4800
|
|||
|
dw 4720+8192
|
|||
|
dw 4720
|
|||
|
dw 4640+8192
|
|||
|
dw 4640
|
|||
|
dw 4560+8192
|
|||
|
dw 4560
|
|||
|
dw 4480+8192
|
|||
|
dw 4480
|
|||
|
dw 4400+8192
|
|||
|
dw 4400
|
|||
|
dw 4320+8192
|
|||
|
dw 4320
|
|||
|
dw 4240+8192
|
|||
|
dw 4240
|
|||
|
dw 4160+8192
|
|||
|
dw 4160
|
|||
|
dw 4080+8192
|
|||
|
dw 4080
|
|||
|
dw 4000+8192
|
|||
|
dw 4000
|
|||
|
dw 3920+8192
|
|||
|
dw 3920
|
|||
|
dw 3840+8192
|
|||
|
dw 3840
|
|||
|
dw 3760+8192
|
|||
|
dw 3760
|
|||
|
dw 3680+8192
|
|||
|
dw 3680
|
|||
|
dw 3600+8192
|
|||
|
dw 3600
|
|||
|
dw 3520+8192
|
|||
|
dw 3520
|
|||
|
dw 3440+8192
|
|||
|
dw 3440
|
|||
|
dw 3360+8192
|
|||
|
dw 3360
|
|||
|
dw 3280+8192
|
|||
|
dw 3280
|
|||
|
dw 3200+8192
|
|||
|
dw 3200
|
|||
|
dw 3120+8192
|
|||
|
dw 3120
|
|||
|
dw 3040+8192
|
|||
|
dw 3040
|
|||
|
dw 2960+8192
|
|||
|
dw 2960
|
|||
|
dw 2880+8192
|
|||
|
dw 2880
|
|||
|
dw 2800+8192
|
|||
|
dw 2800
|
|||
|
dw 2720+8192
|
|||
|
dw 2720
|
|||
|
dw 2640+8192
|
|||
|
dw 2640
|
|||
|
dw 2560+8192
|
|||
|
dw 2560
|
|||
|
dw 2480+8192
|
|||
|
dw 2480
|
|||
|
dw 2400+8192
|
|||
|
dw 2400
|
|||
|
dw 2320+8192
|
|||
|
dw 2320
|
|||
|
dw 2240+8192
|
|||
|
dw 2240
|
|||
|
dw 2160+8192
|
|||
|
dw 2160
|
|||
|
dw 2080+8192
|
|||
|
dw 2080
|
|||
|
dw 2000+8192
|
|||
|
dw 2000
|
|||
|
dw 1920+8192
|
|||
|
dw 1920
|
|||
|
dw 1840+8192
|
|||
|
dw 1840
|
|||
|
dw 1760+8192
|
|||
|
dw 1760
|
|||
|
dw 1680+8192
|
|||
|
dw 1680
|
|||
|
dw 1600+8192
|
|||
|
dw 1600
|
|||
|
dw 1520+8192
|
|||
|
dw 1520
|
|||
|
dw 1440+8192
|
|||
|
dw 1440
|
|||
|
dw 1360+8192
|
|||
|
dw 1360
|
|||
|
dw 1280+8192
|
|||
|
dw 1280
|
|||
|
dw 1200+8192
|
|||
|
dw 1200
|
|||
|
dw 1120+8192
|
|||
|
dw 1120
|
|||
|
dw 1040+8192
|
|||
|
dw 1040
|
|||
|
dw 960+8192
|
|||
|
dw 960
|
|||
|
dw 880+8192
|
|||
|
dw 880
|
|||
|
dw 800+8192
|
|||
|
dw 800
|
|||
|
dw 720+8192
|
|||
|
dw 720
|
|||
|
dw 640+8192
|
|||
|
dw 640
|
|||
|
dw 560+8192
|
|||
|
dw 560
|
|||
|
dw 480+8192
|
|||
|
dw 480
|
|||
|
dw 400+8192
|
|||
|
dw 400
|
|||
|
dw 320+8192
|
|||
|
dw 320
|
|||
|
dw 240+8192
|
|||
|
dw 240
|
|||
|
dw 160+8192
|
|||
|
dw 160
|
|||
|
dw 80+8192
|
|||
|
dw 80
|
|||
|
dw 0+8192
|
|||
|
dw 0
|
|||
|
|
|||
|
dataseg ends
|
|||
|
|
|||
|
codeseg segment para public 'code'
|
|||
|
assume cs:codeseg,ds:dataseg,es:dataseg,ss:dataseg
|
|||
|
codeseg ends
|
|||
|
end
|
|||
|
circ.asm
|
|||
|
; Copyright (C) 1984 by Manx Software Systems, Inc.
|
|||
|
; :ts=8
|
|||
|
include lmacros.h
|
|||
|
dataseg segment para public 'data'
|
|||
|
|
|||
|
aldx dw 0
|
|||
|
aldy dw 0
|
|||
|
|
|||
|
public _yaspect_,_xaspect_
|
|||
|
_yaspect_ dw 5
|
|||
|
_xaspect_ dw 6
|
|||
|
|
|||
|
scale dw 1024
|
|||
|
scale2 dw 512
|
|||
|
|
|||
|
|
|||
|
aspect dw 0 ;function computed aspect (scaled)
|
|||
|
invasp dw 0 ;reciprocal of aspect (scaled too)
|
|||
|
|
|||
|
xorg dw 0
|
|||
|
yorg dw 0
|
|||
|
radius dw 0
|
|||
|
|
|||
|
dataseg ends
|
|||
|
|
|||
|
assume ds:dataseg,cs:codeseg
|
|||
|
;--------------------------------------------------------
|
|||
|
;procedure circle(x,y,radius)
|
|||
|
;
|
|||
|
;draws a circle at center (x,y) with aspect ratio
|
|||
|
;yaspect/xaspect; radius in column units
|
|||
|
;
|
|||
|
;Dan Lee 7/1/1982 SourceWare
|
|||
|
;Modified from DDJ May '83 for CI C-86 by Davin 6/22/1983
|
|||
|
;remodified for Aztec C86, 6/84
|
|||
|
;
|
|||
|
;--------------------------------------------------------
|
|||
|
ifdef FARPROC
|
|||
|
extrn $inline:far,$pnt:far
|
|||
|
else
|
|||
|
extrn $inline:near,$pnt:near
|
|||
|
endif
|
|||
|
procdef set_asp,<<x_asp,word>,<y_asp,word>>
|
|||
|
;set_asp (x_aspect, y_aspect);
|
|||
|
mov ax, x_asp
|
|||
|
mov [_xaspect_],ax
|
|||
|
mov ax, y_asp
|
|||
|
mov [_yaspect_],ax
|
|||
|
pret
|
|||
|
pend set_asp
|
|||
|
|
|||
|
procdef circle,<<_xorg,word>,<_yorg,word>,<irad,word>>
|
|||
|
|
|||
|
mov cx,_xorg
|
|||
|
mov [xorg],cx
|
|||
|
mov dx,_yorg
|
|||
|
mov [yorg],dx
|
|||
|
mov ax,irad
|
|||
|
pop bp
|
|||
|
push es
|
|||
|
push si
|
|||
|
push di ;save register variables
|
|||
|
or ax,ax
|
|||
|
jnz okrad
|
|||
|
jmp single
|
|||
|
okrad: mov [radius],ax
|
|||
|
mov ax,_yaspect_ ;get yaspect
|
|||
|
mul [scale] ;ax=yaspect*scale
|
|||
|
shl ax,1
|
|||
|
div _xaspect_ ;ax=(yaspect*scale)/xaspect
|
|||
|
inc ax
|
|||
|
shr ax,1
|
|||
|
mov [aspect],ax ;store aspect*scale
|
|||
|
mov ax,_xaspect_ ;get xaspect in ax
|
|||
|
mul [scale] ;ax=xaspect*scale
|
|||
|
shl ax,1
|
|||
|
div _yaspect_ ;ax=(xaspect*scale)/yaspect
|
|||
|
inc ax
|
|||
|
shr ax,1
|
|||
|
mov [invasp],ax ;store inv aspect*scale
|
|||
|
;
|
|||
|
; Plot 0 to 45 degrees.
|
|||
|
; Increase y by one unit and
|
|||
|
; decrease x by TAN units*inv aspect ratio.
|
|||
|
;
|
|||
|
mov ax,[radius] ;get radius for initial x
|
|||
|
mul [scale] ;ax=radius*scale
|
|||
|
xor di,di ;zero initial y value
|
|||
|
|
|||
|
nlp1: push ax ;save lo word x*scale
|
|||
|
push dx ;save hi word x*scale
|
|||
|
add ax,[scale2]
|
|||
|
adc dx,0
|
|||
|
div [scale]
|
|||
|
mov [aldx],ax ; aldx,aldy are old relative coord's
|
|||
|
mov [aldy],di
|
|||
|
pop dx
|
|||
|
pop ax
|
|||
|
|
|||
|
lp1: push ax ;save lo word x*scale
|
|||
|
push dx ;save hi word x*scale
|
|||
|
add ax,[scale2]
|
|||
|
adc dx,0
|
|||
|
div [scale]
|
|||
|
mov bx,ax ;bx=1st quad x
|
|||
|
add ax,[xorg] ;add x origin
|
|||
|
|
|||
|
push bp
|
|||
|
push di ;relative y-coord
|
|||
|
push bx ;relative x-coord
|
|||
|
mov bp,sp
|
|||
|
mov bx,[yorg] ;get y origin
|
|||
|
sub bx,di ;and sub y to plot
|
|||
|
call near ptr pnt1
|
|||
|
pop cx ;1st quad x val
|
|||
|
pop di
|
|||
|
mov [aldx],cx
|
|||
|
mov [aldy],di
|
|||
|
pop bp
|
|||
|
|
|||
|
;cx = 1st quad x, di = 1st quad y
|
|||
|
inc di ;get new y
|
|||
|
mov ax,di ;ax=y
|
|||
|
mul [invasp] ;ax=y*inv aspect*scale
|
|||
|
div cx ;ax=TAN*inv aspect*scale
|
|||
|
xor dx,dx ;zero remainder
|
|||
|
mov si,ax ;si=TAN*inv aspect*scale
|
|||
|
div [invasp] ;ax=TAN
|
|||
|
cmp ax,1 ;TAN=1?
|
|||
|
pop dx ;dx=hi word x*scale
|
|||
|
pop ax ;ax=lo word x*scale
|
|||
|
jae part2 ;yes, go to next sector
|
|||
|
neg si ;to decrement x
|
|||
|
add ax,si ;new x value
|
|||
|
adc dx,-1 ;hi word carry
|
|||
|
jmp short lp1 ;plot new point
|
|||
|
;
|
|||
|
; Plot 45 to 90 degrees.
|
|||
|
; Decrease x by one unit and
|
|||
|
; increase y by COT units*aspect ratio.
|
|||
|
;
|
|||
|
part2: mov ax,di ;get next y to plot
|
|||
|
mul [scale] ;dx:ax=y*scale
|
|||
|
mov di,cx ;di=last x value
|
|||
|
dec di ;next x to plot
|
|||
|
lp2: push ax ;save lo word y*scale
|
|||
|
push dx ;save hi word y*scale
|
|||
|
add ax,[scale2] ;'one-half'
|
|||
|
adc dx,0
|
|||
|
div [scale] ;ax=y
|
|||
|
mov bx,ax ;bx=1st quad y co-ord
|
|||
|
|
|||
|
add ax,[yorg] ;add y origin
|
|||
|
mov cx,[xorg] ;cx=x origin
|
|||
|
add cx,di ;x to plot
|
|||
|
|
|||
|
push bp
|
|||
|
push bx
|
|||
|
push di
|
|||
|
mov bp,sp
|
|||
|
mov bx,ax
|
|||
|
mov ax,cx
|
|||
|
call near ptr pnt2
|
|||
|
pop di
|
|||
|
pop bx
|
|||
|
mov [aldx],di
|
|||
|
mov [aldy],bx
|
|||
|
pop bp
|
|||
|
|
|||
|
or di,di ;90 degrees?
|
|||
|
js exit ;yes, exit
|
|||
|
dec di ;get new x
|
|||
|
mov ax,di ;ax=x
|
|||
|
imul [aspect] ;ax=x*aspect*scale
|
|||
|
idiv bx ;ax=COT*aspect*scale
|
|||
|
mov si,ax ;si=change in y
|
|||
|
pop dx ;dx=hi word y*scale
|
|||
|
pop ax ;ax=lo word y*scale
|
|||
|
xor bx,bx
|
|||
|
or si,si ;for sign check
|
|||
|
jns skp ;positive
|
|||
|
mov bx,-1 ;negative carry
|
|||
|
skp: add ax,si ;ax=new x value
|
|||
|
adc dx,bx
|
|||
|
jmp short lp2 ;plot next point
|
|||
|
|
|||
|
exit: add sp,4 ;release parms
|
|||
|
jmp alldone
|
|||
|
|
|||
|
pnt1 proc near
|
|||
|
;bp points to rel x coord and bp+2 points to rel y coord
|
|||
|
;abs coords of point are in ax,bx
|
|||
|
|
|||
|
mov si,[aldx]
|
|||
|
add si,[xorg] ;si is old abs x
|
|||
|
mov di,[yorg]
|
|||
|
mov cx,[aldy]
|
|||
|
sub di,cx ;di is old abs y
|
|||
|
|
|||
|
call near ptr $goinline ;write 1st quad point
|
|||
|
sub ax,word ptr [bp] ;get 2nd quad x+origin
|
|||
|
sub ax,word ptr [bp]
|
|||
|
sub si,[aldx]
|
|||
|
sub si,[aldx]
|
|||
|
call near ptr $goinline ;write 2nd quad point
|
|||
|
add bx,word ptr 2[bp] ;get 3rd quad y+origin
|
|||
|
add bx,word ptr 2[bp]
|
|||
|
add di,[aldy]
|
|||
|
add di,[aldy]
|
|||
|
call near ptr $goinline ;write 3rd quad point
|
|||
|
add ax,word ptr [bp]
|
|||
|
add ax,word ptr [bp] ;get 4th quad x+origin
|
|||
|
add si,[aldx]
|
|||
|
add si,[aldx]
|
|||
|
call near ptr $goinline ;plot 4th quad point
|
|||
|
ret
|
|||
|
pnt1 endp
|
|||
|
|
|||
|
pnt2 proc near
|
|||
|
mov si,[aldx]
|
|||
|
add si,[xorg]
|
|||
|
mov di,[yorg]
|
|||
|
add di,[aldy]
|
|||
|
|
|||
|
call near ptr $goinline ;write 1st quad point
|
|||
|
sub ax,word ptr [bp] ;get 2nd quad x+origin
|
|||
|
sub ax,word ptr [bp]
|
|||
|
sub si,[aldx]
|
|||
|
sub si,[aldx]
|
|||
|
call near ptr $goinline ;write 2nd quad point
|
|||
|
sub bx,word ptr 2[bp] ;get 3rd quad y+origin
|
|||
|
sub bx,word ptr 2[bp]
|
|||
|
sub di,[aldy]
|
|||
|
sub di,[aldy]
|
|||
|
call near ptr $goinline ;write 3rd quad point
|
|||
|
add ax,word ptr [bp]
|
|||
|
add ax,word ptr [bp] ;get 4th quad x+origin
|
|||
|
add si,[aldx]
|
|||
|
add si,[aldx]
|
|||
|
call near ptr $goinline ;plot 4th quad point
|
|||
|
ret
|
|||
|
pnt2 endp
|
|||
|
|
|||
|
single:
|
|||
|
mov si,cx
|
|||
|
mov di,dx
|
|||
|
call $pnt
|
|||
|
alldone:
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
pop es
|
|||
|
push bp
|
|||
|
pret circle
|
|||
|
|
|||
|
$goinline proc near
|
|||
|
push ax
|
|||
|
push bx
|
|||
|
push si
|
|||
|
push di
|
|||
|
call $inline ;pops es,di,si
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
ret
|
|||
|
$goinline endp
|
|||
|
|
|||
|
pend circle
|
|||
|
finish
|
|||
|
end
|
|||
|
lin.asm
|
|||
|
; Copyright (C) 1984 by Manx Software Systems, Inc.
|
|||
|
; :ts=8
|
|||
|
include lmacros.h
|
|||
|
dataseg segment para public 'data'
|
|||
|
|
|||
|
extrn _oldx_:word, _oldy_:word
|
|||
|
|
|||
|
deltax dw 0
|
|||
|
deltay dw 0
|
|||
|
yincr dw 0
|
|||
|
|
|||
|
dataseg ends
|
|||
|
assume ds:dataseg,cs:codeseg
|
|||
|
ifdef FARPROC
|
|||
|
extrn $pnt:far
|
|||
|
else
|
|||
|
extrn $pnt:near
|
|||
|
endif
|
|||
|
|
|||
|
public $inline
|
|||
|
$inline proc
|
|||
|
cmp si,ax
|
|||
|
jbe noxchg
|
|||
|
xchg si,ax
|
|||
|
xchg di,bx
|
|||
|
noxchg:
|
|||
|
jne novert
|
|||
|
jmp vertical
|
|||
|
novert:
|
|||
|
sub ax,si
|
|||
|
mov [deltax],ax
|
|||
|
sub bx,di
|
|||
|
jnz nohoriz
|
|||
|
jmp horizontal
|
|||
|
nohoriz:
|
|||
|
mov cx,1
|
|||
|
jns notneg
|
|||
|
neg cx
|
|||
|
neg bx
|
|||
|
notneg: mov [yincr],cx
|
|||
|
mov [deltay],bx
|
|||
|
cmp ax,bx
|
|||
|
jg case2
|
|||
|
|
|||
|
mov dx,[deltax]
|
|||
|
shl dx,1
|
|||
|
mov bx,dx
|
|||
|
mov ax,[deltay]
|
|||
|
shl ax,1
|
|||
|
sub bx,ax
|
|||
|
mov ax,dx
|
|||
|
sub ax,[deltax]
|
|||
|
|
|||
|
mov cx,[deltay]
|
|||
|
lp1: dec cx
|
|||
|
js done
|
|||
|
call $pnt
|
|||
|
add di,[yincr]
|
|||
|
cmp ax,0
|
|||
|
jl incr1
|
|||
|
inc si
|
|||
|
add ax,bx
|
|||
|
jmp short lp1
|
|||
|
incr1:
|
|||
|
add ax,dx
|
|||
|
jmp short lp1
|
|||
|
|
|||
|
case2:
|
|||
|
|
|||
|
mov dx,[deltay]
|
|||
|
shl dx,1 ;dx <- 2 * deltay
|
|||
|
mov bx,dx
|
|||
|
mov ax,[deltax]
|
|||
|
shl ax,1
|
|||
|
sub bx,ax ;bx <- 2*deltay - 2 * deltax
|
|||
|
mov ax,dx
|
|||
|
sub ax,[deltax] ;ax <- 2*deltay - deltax
|
|||
|
|
|||
|
mov cx,[deltax]
|
|||
|
lp2: dec cx
|
|||
|
js done
|
|||
|
call $pnt
|
|||
|
inc si
|
|||
|
cmp ax,0
|
|||
|
jl incr2
|
|||
|
add di,[yincr]
|
|||
|
add ax,bx
|
|||
|
jmp short lp2
|
|||
|
incr2:
|
|||
|
add ax,dx
|
|||
|
jmp short lp2
|
|||
|
|
|||
|
vertical: ;si = xval, di,bx = yvals
|
|||
|
cmp di,bx
|
|||
|
jle yorder
|
|||
|
xchg bx,di
|
|||
|
yorder:
|
|||
|
sub bx,di
|
|||
|
vplot:
|
|||
|
call $pnt
|
|||
|
inc di
|
|||
|
dec bx
|
|||
|
jns vplot
|
|||
|
jmp short done
|
|||
|
|
|||
|
horizontal: ;ax=deltax, si,di = start point
|
|||
|
call $pnt
|
|||
|
inc si
|
|||
|
dec ax
|
|||
|
jns horizontal
|
|||
|
;jmp short done
|
|||
|
|
|||
|
done:
|
|||
|
ret
|
|||
|
|
|||
|
procdef lineto,<<xdest,word>,<ydest,word>>
|
|||
|
|
|||
|
; lineto (dest_x, dest_y);
|
|||
|
push si
|
|||
|
push di
|
|||
|
push es
|
|||
|
mov si,[_oldx_]
|
|||
|
mov di,[_oldy_]
|
|||
|
mov ax,xdest
|
|||
|
mov bx,ydest
|
|||
|
mov [_oldx_],ax
|
|||
|
mov [_oldy_],bx
|
|||
|
call $inline ;pops si,di,es before returning
|
|||
|
pop es
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
pret
|
|||
|
pend lineto
|
|||
|
|
|||
|
procdef line,<<srcx,word>,<srcy,word>,<ddstx,word>,<ddsty,word>>
|
|||
|
; line (src_x, src_y, dest_x, dest_y);
|
|||
|
push si
|
|||
|
push di
|
|||
|
push es
|
|||
|
mov si,srcx
|
|||
|
mov di,srcy
|
|||
|
mov ax,ddstx
|
|||
|
mov bx,ddsty
|
|||
|
mov [_oldx_],ax
|
|||
|
mov [_oldy_],bx
|
|||
|
call $inline
|
|||
|
pop es
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
pret
|
|||
|
pend line
|
|||
|
finish
|
|||
|
end
|
|||
|
|
|||
|
point.asm
|
|||
|
; Copyright (C) 1984 by Manx Software Systems, Inc.
|
|||
|
; :ts=8
|
|||
|
include lmacros.h
|
|||
|
dataseg segment para public 'data'
|
|||
|
|
|||
|
extrn $address:word
|
|||
|
public _oldx_,_oldy_,_color_,_maxx_
|
|||
|
_oldx_ dw 0
|
|||
|
_oldy_ dw 0
|
|||
|
_color_ db 1
|
|||
|
_maxx_ dw 320
|
|||
|
public _plotf_, _plottbl_
|
|||
|
public mid,ultra
|
|||
|
public clrmsk,colmsk
|
|||
|
|
|||
|
clrmsk db 00111111b,11001111b,11110011b,11111100b
|
|||
|
;/* clrmsk for point mode 0 */
|
|||
|
|
|||
|
onmask db 10000000b,1000000b,100000b,10000b,1000b,100b,10b,1b
|
|||
|
offmask db 01111111b,10111111b,11011111b,11101111b
|
|||
|
db 11110111b,11111011b,11111101b,11111110b
|
|||
|
|
|||
|
colmsk db 0,0,0,0 ;/* color_ masks */
|
|||
|
db 1000000b,10000b,100b,1
|
|||
|
db 10000000b,100000b,1000b,10b
|
|||
|
db 11000000b,110000b,1100b,11b
|
|||
|
|
|||
|
_plottbl_ dw offset mid ;medium res
|
|||
|
dw offset ultra ;high res
|
|||
|
|
|||
|
_plotf_ dw offset ptquit
|
|||
|
|
|||
|
dataseg ends
|
|||
|
assume ds:dataseg,cs:codeseg
|
|||
|
|
|||
|
public $pnt
|
|||
|
$pnt proc
|
|||
|
cmp si,[_maxx_] ;si=x,di=y does not set oldx & oldy
|
|||
|
ja quit
|
|||
|
cmp si,0
|
|||
|
jb quit
|
|||
|
cmp di,199
|
|||
|
ja quit
|
|||
|
cmp di,0
|
|||
|
jnb $pnt3
|
|||
|
jmp quit
|
|||
|
$pnt3:
|
|||
|
push ax
|
|||
|
push bx
|
|||
|
mov bl,[_color_] ;entry #3 si=x,di=y no clipping !
|
|||
|
$pnt4:
|
|||
|
mov bh,0
|
|||
|
;entry #5 si=x,di=y,bx=color_
|
|||
|
;
|
|||
|
$pnt5: mov ax,0b800h ; set es to point to hires segment
|
|||
|
mov es,ax
|
|||
|
push di
|
|||
|
shl di,1 ;mult y*2 (addr table is 2 bytes wide)
|
|||
|
jmp [_plotf_] ;jmp to ptquit, mid or ultra
|
|||
|
|
|||
|
mid: push si
|
|||
|
|
|||
|
mov di,$address[di] ;get vert address from table
|
|||
|
|
|||
|
mov ax,si ;save x in si
|
|||
|
|
|||
|
and si,3
|
|||
|
shr ax,1 ;divide by 4 (4 dots per byte)
|
|||
|
shr ax,1
|
|||
|
|
|||
|
add di,ax ;get addr of byte on screen
|
|||
|
|
|||
|
sal bl,1 ; color_ table is 4 by 4 so mult color_ * 4
|
|||
|
sal bl,1
|
|||
|
mov bl,colmsk[si+bx]
|
|||
|
mov al,clrmsk[si]
|
|||
|
and es:[di],al
|
|||
|
or es:[di],bl
|
|||
|
pop si
|
|||
|
ptquit: pop di
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
quit:
|
|||
|
ret
|
|||
|
|
|||
|
ultra: mov di,$address[di]
|
|||
|
mov ax,si
|
|||
|
push si
|
|||
|
and si,7
|
|||
|
shr ax,1
|
|||
|
shr ax,1
|
|||
|
shr ax,1
|
|||
|
add di,ax
|
|||
|
or bl,bl
|
|||
|
jz black
|
|||
|
mov al,onmask[si]
|
|||
|
or es:[di],al
|
|||
|
pop si
|
|||
|
jmp short ptquit
|
|||
|
black: mov al,offmask[si]
|
|||
|
and es:[di],al
|
|||
|
pop si
|
|||
|
jmp short ptquit
|
|||
|
|
|||
|
|
|||
|
procdef point,<<xcoord,word>,<ycoord,word>>
|
|||
|
|
|||
|
push si
|
|||
|
push di
|
|||
|
push es
|
|||
|
mov si,4[bp]
|
|||
|
mov di,6[bp]
|
|||
|
|
|||
|
mov [_oldx_],si ;si=x,di=y sets oldx and oldy
|
|||
|
mov [_oldy_],di
|
|||
|
call $pnt
|
|||
|
|
|||
|
pop es
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
pret
|
|||
|
pend point
|
|||
|
finish
|
|||
|
end
|
|||
|
|
|||
|
scr_call.asm
|
|||
|
; Copyright (C) 1984 by Manx Software Systems
|
|||
|
; :ts=8
|
|||
|
include lmacros.h
|
|||
|
procdef scr_call,<<aax,word>,<bbx,word>,<ccx,word>,<ddx,word>>
|
|||
|
; scr_call (ax,bx,cx,dx)
|
|||
|
push si
|
|||
|
push di
|
|||
|
mov ax, aax
|
|||
|
mov bx, bbx
|
|||
|
mov cx, ccx
|
|||
|
mov dx, ddx
|
|||
|
int 16
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
xor ax,ax
|
|||
|
pret
|
|||
|
pend scr_call
|
|||
|
finish
|
|||
|
end
|
|||
|
|