!!!Fast Graphics 8

General Information

Author: 	Carsten Strotmann \\
Language: 	ACTION! \\
Compiler/Interpreter: 	ACTION! \\
Published: 	09.12.90 \\

[{TableOfContents }]


{{{

;********************************
;**									 **
;** Phoenix SoftCrew ACTION!	**
;**									 **
;********************************

; Programname:GR8.FAST POINT
; Programmer:CARSTEN STROTMANN
; Filename:GR8.ACT
; first Version:09.12.90
; last chnage:09.12.90
; Task:fast graphics 8 Routines
;
;


PROC Pixel=$2006 (CARD x,BYTE y)

PROC Shp=$2003 (CARD x,BYTE y)

PROC Shape (CARD x,BYTE y)

 IF x>319 THEN
  x=319
 FI
 IF y>191 THEN
  y=191
 FI

 Shp (x,y)

RETURN

PROC Line (CARD x1,y1,x2,y2)
INT fx,fy
CARD dx,dy,ful,rst,x,y,z,a,u

fx=1
fy=1
dx=x2-x1
dy=y2-y1

IF y1>y2 THEN
 dy=y1-y2
 fy=-1
FI

IF x1>x2 THEN
 dx=x1-x2
 fx=-1
FI

IF dx>dy THEN
 ful=dx/dy
 rst=dx MOD dy
 z=0
 x=x1
 y=y1
 
 DO
  z==+rst
  IF z>=dy THEN
	z==-dy
	a=ful+1
  ELSE
	a=ful
  FI
  FOR u=1 TO a
  DO 
	x==+fx
	Pixel (x,y)
  OD
  y==+fy
 UNTIL y=y2
 OD
ELSE
 ful=dy/dx
 rst=dy MOD dx
 z=0
 y=y1
 x=x1
 y=y1
 
 DO
  z==+rst
  IF z>=dx THEN
	z==-dx
	a=ful+1
  ELSE
	a=ful
  FI
  FOR u=1 TO a
  DO 
	y==+fy
	Pixel (x,y)
  OD
 x==+fx
 UNTIL x=x2
 OD
FI

RETURN

PROC HLine (CARD y,x1,x2)

CARD x

IF x1>x2 THEN
 x=x2
 x2=x1
 x1=x
FI

FOR x=x1 TO x2
DO
 Pixel (x,y)
OD

RETURN

PROC VLine (INT x,y1,y2)

BYTE y,r
CARD savmsc=$58
BYTE POINTER adr
BYTE ARRAY bit(7)=[128 64 32 16 8 4 2 1]

IF y1>191 THEN y1=191 FI
IF y2>191 THEN y2=191 FI
IF x>319 THEN x=319 FI
IF x<0 THEN x=0 FI
IF y1<0 THEN y1=0 FI
IF y2<0 THEN y2=0 FI

IF y1>y2 THEN
 y=y2
 y2=y1
 y1=y
FI

adr=y1*40+savmsc+(x/8)

r=x & 7

FOR y=y1 TO y2
DO
 IF y<191 THEN
  IF color=1 THEN
	adr^==%bit(r)
  ELSE
	adr^==!bit(r)
  FI
  adr==+40
 FI
OD

RETURN

PROC LineTo (CARD x1,y1,x2,y2)

BYTE c=$2FB

c=color

IF x1>319 THEN
  x1=319
FI
IF x2>319 THEN
  x2=319
FI
IF y1>191 THEN
  y1=191
FI
IF y2>191 THEN
  y2=191
FI

IF x1=x2 THEN 
 VLine (x1,y1,y2)
 RETURN
FI

IF y1=y2 THEN
 HLine (y1,x1,x2)
 RETURN
FI

Line (x1,y1,x2,y2)

RETURN

BYTE FUNC Inter (BYTE b)
 IF b>=0 AND b<32 THEN
  b==+64
 ELSEIF b>31 AND b<96 THEN
  b==-32
 ELSEIF b>127 AND b<160 THEN
  b==+64
 ELSEIF b>159 AND b<224 THEN
  b==-32
 FI
RETURN (b)

PROC Text (CARD x,BYTE y,BYTE ARRAY tex)

BYTE len,u,ci=$2FA

len=tex(0)

FOR u=1 TO len
DO
 ci=Inter(tex(u))
 Shape (x,y)
 x==+8
OD

RETURN

INT FUNC Abs(INT n)

	IF n<0 THEN RETURN( -n ) FI
RETURN( n )

PROC Circle(INT x,y,r)

  BYTE c=$2FB
  INT Phi,Phiy,Phixy,
		x1,y1

  Phi=0
  x1=r
  y1=0
  c=color

  DO
	 Phiy=Phi+y1+y1+1
	 Phixy=Phiy-x1-x1+1
	 Pixel(x+x1,y+y1) 
	 Pixel(x-x1,y+y1) 
	 Pixel(x+x1,y-y1) 
	 Pixel(x-x1,y-y1) 
	 Pixel(x+y1,y+x1) 
	 Pixel(x-y1,y+x1) 
	 Pixel(x+y1,y-x1) 
	 Pixel(x-y1,y-x1) 
	 Phi=Phiy
	 y1=y1+1
	 IF Abs(Phixy)+0<Abs(Phiy) THEN
		Phi=Phixy
		x1=x1-1
	 FI
  UNTIL y1>x1
  OD
RETURN

PROC Disk (CARD x,y,r)

  BYTE c=$2FB
  INT Phi,Phiy,Phixy,
		x1,y1

  Phi=0
  x1=r
  y1=0
  c=color

  DO
	 Phiy=Phi+y1+y1+1
	 Phixy=Phiy-x1-x1+1
	 VLine (y+y1,x+x1,x-x1)
	 VLine (y-y1,x+x1,x-x1)
	 VLine (y+x1,x+y1,x-y1)
	 VLine (y-x1,x+y1,x-y1)
	 Phi=Phiy
	 y1=y1+1
	 IF Abs(Phixy)+0<Abs(Phiy) THEN
		Phi=Phixy
		x1=x1-1
	 FI
  UNTIL y1>x1
  OD
RETURN

PROC Box (CARD x1,y1,x2,y2)

BYTE c=$2FB
CARD x,y

c=color

IF x1>x2 THEN
 x=x1
 x1=x2
 x2=x
FI

IF y1>y2 THEN
 y=y1
 y1=y2
 y2=y
FI

FOR x=x1 TO x2
DO
 VLine (x,y1,y2)
OD

RETURN
 
PROC Frame (CARD x1,y1,x2,y2)

BYTE c=$2FB

c=color

HLine (y1,x1,x2)
HLine (y2,x1,x2)
VLine (x1,y1,y2)
VLine (x2,y1,y2)

RETURN
}}}

! 1st Version

{{{
;********************************
;** FAST GRAPH                 **
;** PHOENIX SOFTCREW 1990      **
;** SCHNELLE GRAPHIKROUTINEN   **
;** FUER GRAPHICS 8	       **
;********************************

BYTE FUNC Sgn (INT wert)

  Byte u

  IF wert<0 THEN
	 u=-1
  ELSE
	 u=1
  FI

RETURN (u)

CARD FUNC Abs (CARD wert)

  IF wert<0 THEN
	 wert=-wert
  FI

RETURN (wert)


PROC Point (CARD x,BYTE y,mode)

  BYTE yp=$54
  CARD savmsc=$58,xp=$55
  BYTE ARRAY pixt=[ $80 $40 $20 $10 $08 $04 $02 $01 ]
  BYTE POINTER z

  xp=x
  yp=y

  mode==MOD 2

  IF x<320 AND x>=0 AND y>=0 AND y<192 THEN
  
	 z=savmsc
	 z==+y*40
	 z==+(x RSH 3)
	 IF mode=1 THEN
		z^==%pixt(x&7)
	 ELSE
		z^==!pixt(x&7)
	 FI
  FI 

RETURN

PROC Line (CARD x,BYTE y)

  BYTE yp=$54,d1x,d2x,d1y,d2y
  CARD xp=$55,xa,ya,u,v,n,m,zp,s,z

  xa=xp
  ya=yp

  u=x-xa
  v=y-ya

  d1x=Sgn (u)
  d2x=Sgn (u)
  d1y=Sgn (v)
  d2y=0

  m=Abs (u)
  n=Abs (v)

  IF n>m THEN
	 d2x=0
	 d2y=d1y
	 zp=m
	 m=n
	 n=zp
  FI

  s=m/2
  z=0

  DO
	 Point (xa,ya,1)
	 s==+n
	 IF m<s THEN
		s==-m
		xa==+d1x
		ya==+d1y
	 ELSE
		xa==+d2x
		ya==+d2y
	 FI

	 z==+1
  UNTIL z=m
  OD

RETURN


PROC Circle(INT x,y,r,c)

  INT Phi,Phiy,Phixy,
		x1,y1

  Phi=0
  x1=r
  y1=0
  color=c
  DO
	 Phiy=Phi+y1+y1+1
	 Phixy=Phiy-x1-x1+1
	 Point(x+x1,y+y1,1) ; 
	 Point(x-x1,y+y1,1) ;|
	 Point(x+x1,y-y1,1) ;|
	 Point(x-x1,y-y1,1) ;  8 way symmetry
	 Point(x+y1,y+x1,1) ;  plotting points
	 Point(x-y1,y+x1,1) ;|
	 Point(x+y1,y-x1,1) ;|
	 Point(x-y1,y-x1,1) ; 
	 Phi=Phiy
	 y1=y1+1
	 IF Abs(Phixy)+0<Abs(Phiy) THEN
		Phi=Phixy
		x1=x1-1
	 FI
  UNTIL y1>x1
  OD
RETURN

}}}

! 2nd version

{{{
;********************************
;** FAST GRAPH	               **
;** PHOENIX SOFTCREW 1990      **
;** FOR GRAPHICS 8             **
;********************************

BYTE FUNC Sgn (INT wert)

  Byte u

  IF wert<0 THEN
	 u=-1
  ELSE
	 u=1
  FI

RETURN (u)

CARD FUNC Abs (INT wert)

  IF wert<0 THEN
	 wert=-wert
  FI

RETURN (wert)


PROC Point (CARD x,BYTE y)

  BYTE yp=$54,oldy=$5A,mode
  CARD savmsc=$58,xp=$55,oldx=$5B
  BYTE ARRAY pixt=[$80 $40 $20 $10 $8 $4 $2 $1]
  BYTE POINTER z

  xp=x
  yp=y

  oldx=x
  oldy=y

  mode=color
  mode==MOD 2

  IF x<320 AND x>=0 AND y>=0 AND y<192 THEN
  
	 z=savmsc
	 z==+y*40
	 z==+(x RSH 3)
	 IF mode=1 THEN
		z^==%pixt(x&7)
	 ELSE
		z^==!pixt(x&7)
	 FI
  FI 

RETURN

PROC Line (CARD x,BYTE y)

  BYTE yp=$54
  CARD xp=$55,z
  INT xs,ys

	DrawTo (x,y)

RETURN

PROC Circle(INT x,y,r)

  INT Phi,Phiy,Phixy,
		x1,y1

  Phi=0
  x1=r
  y1=0
  DO
	 Phiy=Phi+y1+y1+1
	 Phixy=Phiy-x1-x1+1
	 Point(x+x1,y+y1) ; 
	 Point(x-x1,y+y1) ;|
	 Point(x+x1,y-y1) ;|
	 Point(x-x1,y-y1) ;  8 way symmetry
	 Point(x+y1,y+x1) ;  plotting points
	 Point(x-y1,y+x1) ;|
	 Point(x+y1,y-x1) ;|
	 Point(x-y1,y-x1) ; 
	 Phi=Phiy
	 y1=y1+1
	 IF Abs(Phixy)+0<Abs(Phiy) THEN
		Phi=Phixy
		x1=x1-1
	 FI
  UNTIL y1>x1
  OD
RETURN

PROC Disk (CARD x,y,r)

  BYTE u

  FOR u=0 TO r
  DO
	Circle (x,y,u)
  OD

RETURN

PROC Frame (CARD x1,y1,x2,y2)

  Point (x1,y1)
  Line (x2,y1)
  Line (x2,y2)
  Line (x1,y2)
  Line (x1,y1)

RETURN

PROC Box (CARD x1,y1,x2,y2)

  BYTE xs
  CARD xw

  IF x1<x2 THEN
	xs=1
  ELSE
	xs=-1
  FI

  FOR xw=x1 TO x2 STEP xs
  DO
	Plot (xw,y1)
	Line (xw,y2)
  OD

RETURN

}}}

! Assembler Source (BIBO Assembler)

{{{

00010			 .LI OFF
00020 ******************************
00030 *									 *
00040 * PROGRAMM:SCHNELLER GR8.PLOT*
00050 * AUTOR	:CARSTEN STROTMANN *
00060 * DATUM	:12.12.90			 *
00070 * VERSION :.2					 *
00080 * FUER	 :ACTION!			  *
00090 *									 *
00100 ******************************
00110 ;
00120			 .OR $7000
00130			 .OF "D:GR8.COM"
00140 ;
00150 ROWCRS	=	$54
00160 COLCRS	=	$55
00170 ROWAC	 =	$70
00180 COLAC	 =	$72
00190 ATACHR	=	$2FB
00200 SAVMSC	=	$58
00210 OLDROW	=	$5A
00220 OLDCOL	=	$5B
00230 ZAEHLER  =	$E4
00240 DELTAX	=	$77
00250 DELTAY	=	$76
00260 XFLAG	 =	$74
00270 YFLAG	 =	$75
00280 HILFA	 =	$E9
00290 HILFB	 =	$EB
00300 HILFT	 =	$ED
00310 HLP1	  =	$E6
00320 HLP2	  =	$E7
00330 HLP3	  =	$E8
00340 TXTROW	=	$290
00350 TXTCOL	=	$291
00360 CADR	  =	$70
00370 CHBAS	 =	$2F4
00380 CHAR	  =	$2FA
00390 ;
00400 ;
00410 CALC
00420			 STA COLCRS
00430			 STX COLCRS+1
00440			 STY ROWCRS
00450 ;
00460			 LDA #0
00470			 STA HLP1
00480			 STA HLP2
00490			 STA HLP3
00500 ;
00510			 TYA
00520			 ASL
00530			 ROL HLP1
00540			 ASL
00550			 ROL HLP1
00560			 ASL
00570			 ROL HLP1  ;Y*8
00580			 STA HLP2
00590			 LDX HLP1
00600			 STX HLP3
00610			 ASL
00620			 ROL HLP1
00630			 ASL
00640			 ROL HLP1  ;Y*32
00650 ;
00660			 CLC
00670			 ADC HLP2
00680			 STA HLP2
00690			 LDA HLP3
00700			 ADC HLP1
00710			 STA HLP3  ;*8+*32=*40
00720 ;
00730			 CLC
00740			 LDA SAVMSC
00750			 ADC HLP2
00760			 STA ROWAC
00770			 LDA SAVMSC+1
00780			 ADC HLP3
00790			 STA ROWAC+1
00800 ;
00810			 LDA COLCRS
00820			 AND #7
00830			 TAX
00840			 LDA COLCRS
00850			 LSR
00860			 LSR
00870			 LSR
00880			 TAY
00890			 LDA COLCRS+1
00900			 BEQ .1
00910			 TYA
00920			 CLC
00930			 ADC #32
00940			 TAY
00950 ;
00960 .1
00970			 LDA ATACHR
00980			 BEQ CLEAR
00990			 CMP #1
01000			 BEQ PLOT
01010			 CMP #2
01020			 BEQ XPLOT
01030 ;
01040 LOCATE
01050			 LDA (ROWAC),Y
01060			 AND PTAB,X
01070			 STA ATACHR
01080			 RTS
01090 ;
01100 PLOT
01110			 LDA (ROWAC),Y
01120			 ORA PTAB,X
01130			 STA (ROWAC),Y
01140			 RTS
01150 ;
01160 XPLOT
01170			 LDA (ROWAC),Y
01180			 EOR PTAB,X
01190			 STA (ROWAC),Y
01200			 RTS
01210 ;
01220 CLEAR
01230			 LDA (ROWAC),Y
01240			 AND CTAB,X
01250			 STA (ROWAC),Y
01260			 RTS
01270 ------------------------------
01280 * BITTABELLE
01290 PTAB	  .HX 8040201008040201
01300 CTAB	  .HX 7FBFDFEFF7FBFDFE
01310 ------------------------------
01320 SHAPE
01330 ;  ZEICHENSATZ AUF GRAFIK
01340 ;  BILDSCHIRM
01350 ;  A = X-POSITION LSB
01360 ;  X = X-POSITION MSB
01370 ;  Y = Y-POSITION
01380 ;  CHAR=ZEICHEN IM INT-CODE
01390 ;
01400			 STA TXTCOL
01410			 STX TXTCOL+1
01420			 STY TXTROW
01430 ;
01440			 LDA #0
01450			 STA HLP1
01460			 STA HLP2
01470			 STA HLP3
01480 ;
01490			 LDA CHBAS
01500			 STA CADR+1
01510			 LDA #0
01520			 STA CADR
01530 ;
01540			 LDA CHAR
01550			 ASL
01560			 ROL HLP1
01570			 ASL
01580			 ROL HLP1
01590			 ASL
01600			 ROL HLP1
01610			 CLC
01620			 ADC CADR
01630			 STA CADR
01640			 LDA HLP1
01650			 ADC CADR+1
01660			 STA CADR+1
01670			 LDA #0
01680			 STA HLP1
01690 ;
01700 ; ZEICHEN UEBERTRAGEN
01710 ;
01720			 LDX #16
01730			 LDY #8
01740 .1
01750			 LDA (CADR),Y
01760			 STA CTABL,X
01770			 DEX
01780			 DEX
01790			 DEY
01800			 BNE .1
01810 ;
01820 ; ZEICHEN SCHIFTEN
01830 ;
01840			 LDA TXTCOL
01850			 AND #7
01860			 TAY
01870 .3
01880			 LDX #16
01890 ;
01900 .2
01910			 LSR CTABL,X
01920			 ROR CTABL+1,X
01930			 DEX
01940			 DEX
01950			 BNE .2
01960 ;
01970			 DEY
01980			 BNE .3
01990 ;
02000 ; ADRESSE ERRECHNEN
02010 ;
02020			 LDA TXTROW
02030			 ASL
02040			 ROL HLP1
02050			 ASL
02060			 ROL HLP1
02070			 ASL
02080			 ROL HLP1
02090			 LDA HLP1
02100			 STA HLP2
02110			 LDX HLP1
02120			 STX HLP3
02130			 ASL
02140			 ROL HLP1
02150			 ASL
02160			 ROL HLP1
02170			 CLC
02180			 ADC HLP2
02190			 STA HLP2
02200			 LDA HLP3
02210			 ADC HLP1
02220			 STA HLP3
02230 ;
02240			 CLC
02250			 LDA SAVMSC
02260			 ADC HLP1
02270			 STA ROWAC
02280			 LDA SAVMSC+1
02290			 ADC HLP3
02300			 STA ROWAC+1
02310 ;
02320			 LDA TXTCOL
02330			 LSR
02340			 LSR
02350			 LSR
02360			 TAY
02370			 LDA TXTCOL+1
02380			 BEQ .4
02390			 TYA
02400			 CLC
02410			 ADC #32
02420			 TAY
02430 ;
02440 ; ZEICHEN AUF BILDSCHIRM
02450 ;
02460 .4
02470			 LDX #8
02480 .6
02490			 LDA (ROWAC),Y
02500			 EOR CTAB,X
02510			 STA (ROWAC),Y
02520			 INY
02530			 LDA (ROWAC),Y
02540			 EOR CTAB+1,X
02550			 STA (ROWAC),Y
02560			 DEY
02570			 CLC
02580			 LDA ROWAC
02590			 ADC #40
02600			 STA ROWAC
02610			 BCC .5
02620			 INC ROWAC+1
02630 .5		 DEX
02640			 BNE .6
02650 ;
02660			 RTS
02670 ------------------------------
02680 ; BUFFERTABLLE FUER ZEICHEN
02690 CTABL
02700			 .HX 0000
02710			 .HX 0000
02720			 .HX 0000
02730			 .HX 0000
02740			 .HX 0000
02750			 .HX 0000
02760			 .HX 0000
02770			 .HX 0000
02780 ------------------------------

}}}