Browse code

(hilbert.tal) Added Hilbert demo

Devine Lu Linvega authored on 13/03/2023 05:10:28
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,105 @@
1
+|00 @System &vector $2 &wst $1 &rst $1 &eaddr $2 &ecode $1 &pad $1 &r $2 &g $2 &b $2 &debug $1 &halt $1
2
+|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1
3
+
4
+|00
5
+
6
+	@line &x2 $2 &y2 $2
7
+
8
+|0100
9
+
10
+	#aff5 .System/r DEO2
11
+	#af00 .System/g DEO2
12
+	#af05 .System/b DEO2
13
+	( screen size )
14
+	#0140 .Screen/width DEO2
15
+	#0140 .Screen/height DEO2
16
+
17
+	#03ff #0000
18
+	&l
19
+		STH2k INC2k d2xy STH2r d2xy #01 draw-line
20
+		INC2 GTH2k ?&l
21
+	POP2 POP2
22
+
23
+BRK
24
+
25
+@d2xy ( d* -- x* y* )
26
+
27
+	,&t STR2
28
+	#0000
29
+		DUP2 ,&x STR2
30
+		,&y STR2
31
+
32
+	( N ) #0020 #0001 ( for i=1; i<n; i*=2 )
33
+	&l
34
+		STH2k
35
+		[ LIT2 &t $2 ]
36
+			DUP2 #01 SFT2 #0001 AND2
37
+				DUP2 ,&rx STR2
38
+			EOR2 #0001 AND2 ,&ry STR2
39
+		,&t LDR2 #02 SFT2 ,&t STR2
40
+		[ LIT2 &x $2 ] [ LIT2 &y $2 ] [ LIT2 &rx $2 ] [ LIT2 &ry $2 ]
41
+			STH2r rot ,&y STR2 ,&x STR2
42
+		DUP2 ,&rx LDR2 MUL2 ,&x LDR2 ADD2 ,&x STR2
43
+		DUP2 ,&ry LDR2 MUL2 ,&y LDR2 ADD2 ,&y STR2
44
+		#10 SFT2 GTH2k ?&l
45
+	POP2 POP2
46
+	,&x LDR2 #30 SFT2 #0020 ADD2
47
+	,&y LDR2 #30 SFT2 #0020 ADD2
48
+
49
+JMP2r
50
+
51
+@rot ( x* y* rx* ry* n* -- x* y* )
52
+
53
+	( n-1 ) #0001 SUB2 STH2
54
+	SWP2 ,&rx STR2
55
+	#0000 NEQ2 ?&skipy
56
+		[ LIT2 &rx $2 ] #0001 NEQ2 ?&skipx
57
+			( rx-n-1 ) SWP2 STH2kr SWP2 SUB2
58
+			( ry-n-1 ) SWP2 STH2kr SWP2 SUB2
59
+			&skipx
60
+		( swap ) SWP2
61
+	&skipy
62
+	POP2r
63
+
64
+JMP2r
65
+
66
+@draw-line ( x1* y1* x2* y2* color -- )
67
+
68
+	( load )
69
+	,&color STR
70
+	,&y STR2
71
+	,&x STR2
72
+	.line/y2 STZ2
73
+	.line/x2 STZ2
74
+
75
+	,&x LDR2 .line/x2 LDZ2 SUB2 abs2 ,&dx STR2
76
+	#0000 ,&y LDR2 .line/y2 LDZ2 SUB2 abs2 SUB2 ,&dy STR2
77
+
78
+	#ffff #00 .line/x2 LDZ2 ,&x LDR2 lts2 DUP2 ADD2 ADD2 ,&sx STR2
79
+	#ffff #00 .line/y2 LDZ2 ,&y LDR2 lts2 DUP2 ADD2 ADD2 ,&sy STR2
80
+
81
+	[ LIT2 &dx $2 ] [ LIT2 &dy $2 ] ADD2 ,&e1 STR2
82
+
83
+	&loop
84
+		.line/x2 LDZ2 DUP2 .Screen/x DEO2 [ LIT2 &x $2 ] EQU2
85
+		.line/y2 LDZ2 DUP2 .Screen/y DEO2 [ LIT2 &y $2 ] EQU2
86
+			[ LIT2 &color $1 -Screen/pixel ] DEO
87
+			AND ?&end
88
+		[ LIT2 &e1 $2 ] DUP2 ADD2 DUP2
89
+		,&dy LDR2 lts2 ?&skipy
90
+			,&e1 LDR2 ,&dy LDR2 ADD2 ,&e1 STR2
91
+			.line/x2 LDZ2 [ LIT2 &sx $2 ] ADD2 .line/x2 STZ2
92
+		&skipy
93
+		,&dx LDR2 gts2 ?&skipx
94
+			,&e1 LDR2 ,&dx LDR2 ADD2 ,&e1 STR2
95
+			.line/y2 LDZ2 [ LIT2 &sy $2 ] ADD2 .line/y2 STZ2
96
+		&skipx
97
+		!&loop
98
+	&end
99
+
100
+JMP2r
101
+
102
+@abs2 DUP2 #0f SFT2 EQU #05 JCN #0000 SWP2 SUB2 JMP2r
103
+@lts2 #8000 STH2k ADD2 SWP2 STH2r ADD2 GTH2 JMP2r
104
+@gts2 #8000 STH2k ADD2 SWP2 STH2r ADD2 LTH2 JMP2r
105
+