dos_compilers/Manx Aztec C86 v340a/SRC/G.ARC

855 lines
13 KiB
Plaintext
Raw Normal View History

2024-07-01 15:45:15 +02:00
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