dos_compilers/Manx Aztec C86 v340a/SRC/G.ARC
2024-07-01 06:45:15 -07:00

855 lines
13 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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