VM02/plasma2/radar.pla

163 lines
2.5 KiB
Plaintext
Executable File

CONST SHOWGR = $C050
CONST SHOWFULL = $C052
CONST SHOWPG1 = $C054
CONST SHOWPG2 = $C055
CONST SHOWLORES = $C056
DEF TEXTMODE
DROP ^SHOWPG1
DROP ROMCALL(0, 0, 0, 0, $FB39)
END
DEF CPYBUF
; MEMCPY($0400, $0800, 1016)
END
DEF GRMODE
DROP ROMCALL(0, 0, 0, 0, $F832)
DROP ^SHOWGR
DROP ^SHOWFULL
CPYBUF
; DROP ^SHOWPG2
DROP ^SHOWLORES
END
DEF COLOR(CLR)
DROP ROMCALL(CLR, 0, 0, 0, $F864)
END
DEF PLOT(X, Y)
DROP ROMCALL(Y, 0, X, 0, $F800)
END
DEF HLIN(LEFT, RIGHT, VERT)
^$2C = RIGHT
DROP ROMCALL(VERT, 0, LEFT, 0, $F819)
END
DEF VLIN(TOP, BOTTOM, HORZ)
^$2D = BOTTOM
DROP ROMCALL(TOP, 0, HORZ, 0, $F828)
END
DEF LINE(X1, Y1, X2, Y2)
BYTE DX, DY, DX2, DY2, PP, S
WORD SX, SY, ERR, DXDY2
IF X1 < X2
SX = 1
DX = X2 - X1
ELSE
SX = -1
DX = X1 - X2
FIN
IF Y1 < Y2
SY = 1
DY = Y2 - Y1
ELSE
SY = -1
DY = Y1 - Y2
FIN
DX2 = DX << 1
DY2 = DY << 1
DXDY2 = DX2 - DY2
IF DX > DY
ERR = DX
PP = X1
IF SX < 0
FOR S = PP DOWNTO X2
IF ERR < 0
HLIN(S + 1, PP, Y1)
PP = S
ERR = ERR + DXDY2
Y1 = Y1 + SY
ELSE
ERR = ERR - DY2
FIN
NEXT
HLIN(X2, PP, Y2)
ELSE
FOR S = PP TO X2
IF ERR < 0
HLIN(PP, S - 1, Y1)
PP = S
ERR = ERR + DXDY2
Y1 = Y1 + SY
ELSE
ERR = ERR - DY2
FIN
NEXT
HLIN(PP, X2, Y2)
FIN
ELSE
ERR = -DY
PP = Y1
IF SY < 0
FOR S = PP DOWNTO Y2
IF ERR >= 0
VLIN(S + 1, PP, X1)
PP = S
ERR = ERR + DXDY2
X1 = X1 + SX
ELSE
ERR = ERR + DX2
FIN
NEXT
VLIN(Y2, PP, X2)
ELSE
FOR S = PP TO Y2
IF ERR >= 0
VLIN(PP, S - 1, X1)
PP = S
ERR = ERR + DXDY2
X1 = X1 + SX
ELSE
ERR = ERR + DX2
FIN
NEXT
VLIN(PP, Y2, X2)
FIN
FIN
END
DEF RADAR(C)
BYTE I
FOR I = 0 TO 38
COLOR(C)
LINE(20, 24, I, 0)
CPYBUF
COLOR(0)
LINE(20, 24, I, 0)
NEXT
FOR I = 0 TO 46
COLOR(C)
LINE(20, 24, 39, I)
CPYBUF
COLOR(0)
LINE(20, 24, 39, I)
NEXT
FOR I = 39 DOWNTO 1
COLOR(C)
LINE(20, 24, I, 47)
CPYBUF
COLOR(0)
LINE(20, 24, I, 47)
NEXT
FOR I = 47 DOWNTO 1
COLOR(C)
LINE(20, 24, 0, I)
CPYBUF
COLOR(0)
LINE(20, 24, 0, I)
NEXT
END
GRMODE
REPEAT
RADAR(15)
UNTIL ^$C000 > 127
DROP ^$C010
TEXTMODE
DONE