-
Notifications
You must be signed in to change notification settings - Fork 2
/
elite-teletext-lines.asm
286 lines (206 loc) · 6.22 KB
/
elite-teletext-lines.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
\ ******************************************************************************
\
\ TELETEXT ELITE LINE ROUTINES
\
\ Elite was written by Ian Bell and David Braben and is copyright Acornsoft 1984
\
\ The code on this site has been reconstructed from a disassembly of the version
\ released on Ian Bell's personal website at http://www.elitehomepage.org/
\
\ The commentary is copyright Mark Moxon, and any misunderstandings or mistakes
\ in the documentation are entirely my fault
\
\ The terminology and notations used in this commentary are explained at
\ https://elite.bbcelite.com/terminology
\
\ The deep dive articles referred to in this commentary can be found at
\ https://elite.bbcelite.com/deep_dives
\
\ ------------------------------------------------------------------------------
\
\ The code in this section is taken from the Bitshifters' sixel line-drawing
\ routines here:
\
\ https://github.com/bitshifters/teletextr/blob/master/lib/bresenham.asm
\
\ It has been reformatted, but the core routines and comments are mostly
\ unchanged from the original.
\
\ ******************************************************************************
\ ******************************************************************************
\
\ Name: rtw
\ Type: Workspace
\ Category: Teletext Elite
\ Summary: Variables for use in the Bresenham routine below, based on
\ routines by Rich Talbot-Watkins (hence "rtw")
\
\ ******************************************************************************
.rtw_startx
SKIP 1
.rtw_starty
SKIP 1
.rtw_endx
SKIP 1
.rtw_endy
SKIP 1
.rtw_dx
SKIP 1
.rtw_dy
SKIP 1
.rtw_accum
SKIP 1
.rtw_count
SKIP 1
\ ******************************************************************************
\
\ Name: MoveToSixel
\ Type: Subroutine
\ Category: Teletext Elite
\ Summary: Set the position of the graphics cursor to (X, Y)
\
\ ------------------------------------------------------------------------------
\
\ Arguments:
\
\ X Sixel x-coordinate to move to
\
\ Y Sixel y-coordinate to move to
\
\ ******************************************************************************
.MoveToSixel
LDA rtw_startx \ Copy the current start coordinate to the end
STA rtw_endx \ coordinate
LDA rtw_starty
STA rtw_endy
STX rtw_startx \ Set the start coordinate to (X, Y)
STY rtw_starty
RTS \ Return from the subroutine
\ ******************************************************************************
\
\ Name: DrawToSixel
\ Type: Subroutine
\ Category: Teletext Elite
\ Summary: Plot a mode 7 sixel line from the graphics cursor to (X, Y)
\
\ ------------------------------------------------------------------------------
\
\ Arguments:
\
\ X Sixel x-coordinate to draw to
\
\ Y Sixel y-coordinate to draw to
\
\ ******************************************************************************
.DrawToSixel
LDA rtw_startx \ Copy the current start coordinate to the end
STA rtw_endx \ coordinate
LDA rtw_starty
STA rtw_endy
STX rtw_startx \ Set the start coordinate to (X, Y)
STY rtw_starty
SEC \ Calc dx = ABS(startx - endx)
LDA rtw_startx
TAX
SBC rtw_endx
BCS posdx
EOR #255
ADC #1
.posdx
STA rtw_dx
PHP \ C=0 if dir of startx -> endx is positive,
\ otherwise C=1
SEC \ Calc dy = ABS(starty - endy)
LDA rtw_starty
TAY
SBC rtw_endy
BCS posdy
EOR #255
ADC #1
.posdy
STA rtw_dy
PHP \ C=0 if dir of starty -> endy is positive,
\ otherwise C=1
ORA rtw_dx \ Coincident start and end points exit early
BNE nonzero
PLP \ Safe exit for coincident points
PLP
RTS
.nonzero
LDA rtw_dy \ Determine which type of line it is
CMP rtw_dx
BCC shallowline
.steepline
\ Self-modify code so that line progresses according to
\ direction remembered earlier
PLP \ C=sign of dy
LDA #&C8 \ INY (goingdown)
BCC P%+4
LDA #&88 \ DEY (goingup)
STA goingupdown
PLP \ C=sign of dx
LDA #&E8 \ INX (goingright)
BCC P%+4
LDA #&CA \ DEX (goingleft)
STA goingleftright
LDA rtw_dy \ Initialise accumulator for 'steep' line
STA rtw_count
LSR A
.steeplineloop
STA rtw_accum
JSR PlotSixelClipped \ Plot sixel
DEC rtw_count \ Check if done
BNE goingupdown
.exitline
RTS
.goingupdown
\ Move up to next line
NOP \ Self-modified to INY (goingdown) or DEY (goingup)
.movetonextcolumn
\ Check move to next pixel column
SEC
LDA rtw_accum
SBC rtw_dx
BCS steeplineloop
ADC rtw_dy
.goingleftright
\ Move left or right to next pixel column
NOP \ Self-modifed to INX (goingright) or DEX (goingleft)
JMP steeplineloop
.shallowline
\ Self-modify code so that line progresses according to
\ direction remembered earlier
PLP \ C=sign of dy
LDA #&C8 \ INY (goingdown)
BCC P%+4
LDA #&88 \ DEY (goingup)
STA goingupdown2
PLP \ C=sign of dx
LDA #&E8 \ INX (goingright)
BCC P%+4
LDA #&CA \ DEX (goingleft)
STA goingleftright2
LDA rtw_dx \ Initialise accumulator for 'steep' line
STA rtw_count
LSR A
.shallowlineloop
STA rtw_accum
JSR PlotSixelClipped \ Plot sixel in cached byte
DEC rtw_count \ Check if done
BNE goingleftright2
.exitline2
RTS
.goingleftright2
\ Move left or right to next pixel column
NOP \ Self-modifed to INX (goingright) or DEX (goingleft)
.movetonextline
\ Check whether we move to the next line
SEC
LDA rtw_accum
SBC rtw_dy
BCS shallowlineloop
ADC rtw_dx
.goingupdown2
\ Move down or up to next line
NOP \ Self-modified to INY (goingdown) or DEY (goingup)
JMP shallowlineloop