Code cleanup and native graphics routines for C64 (almost).

This commit is contained in:
Pecusx
2023-05-15 19:54:22 +02:00
parent ce6f7b3406
commit d17d49c5f0
9 changed files with 1342 additions and 358 deletions
+355
View File
@@ -189,6 +189,361 @@ ClearPlot
and bittable,x
rts
.endp
;--------------------------------------------------
.proc drawmountains
;--------------------------------------------------
mwa #0 xdraw
mwa #mountaintable modify
mva #1 color
drawmountainsloop
ldy #0
lda (modify),y
cmp #screenheight
beq NoMountain
sta ydraw
sty ydraw+1
.IF FASTER_GRAF_PROCS = 1
; there was Drawline proc
lda #screenheight
sec
sbc ydraw
sta tempbyte01
jsr plot.MakePlot
; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit)
; jmp IntoDraw ; jumps inside Draw routine
; because one pixel is already plotted (and who cares? :) )
@
lda (xbyte),y
and bittable2,x
sta (xbyte),y
;IntoDraw
adw xbyte #screenBytes
dec tempbyte01
bne @-
; end of Drawline proc
.ELSE
; there was Drawline proc
drawline
jsr plot.MakePlot
inc ydraw
lda ydraw
cmp #screenheight
bne drawline
; end of Drawline proc
.ENDIF
NoMountain
inw modify
inw xdraw
cpw xdraw #screenwidth
bne drawmountainsloop
rts
.endp
;--------------------------------------------------
.proc TypeChar
; puts char on the graphics screen
; in: CharCode
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
;--------------------------------------------------
; char to the table
lda CharCode
sta fontind
lda #$00
sta fontind+1
; char intex times 8
aslw fontind
rolw fontind
rolw fontind
adw fontind #TankFont
; and 8 bytes to the table
ldy #7
CopyChar
lda (fontind),y
eor #$ff
sta char1,y
lda #$ff
sta char2,y
dey
bpl CopyChar
; and 8 subsequent bytes as a mask
adw fontind #8
ldy #7
CopyMask
lda (fontind),y
eor #$ff
sta mask1,y
lda #$00
sta mask2,y
dey
bpl CopyMask
.IF FASTER_GRAF_PROCS = 1
; calculating coordinates from xdraw and ydraw
mwa xdraw xbyte
lda xbyte
and #$7
sta ybit
lsrw xbyte ; div 8
rorw xbyte
rorw xbyte
;---
ldy xbyte
lda ydraw ; y = y - 7 because left lower. shouldn't it be 8?
sec
sbc #7
tax
lda linetableL,x
sta xbyte
lda linetableH,x
sta xbyte+1
; mask preparation and character shifting
ldx ybit
beq MaskOK00
MakeMask00
.rept 8
lsr mask1+#
ror mask2+#
.endr
sec
.rept 8
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask00
MaskOK00
; here x=0
lda Erase
beq CharLoopi ; it works, because x=0
lda #$ff
ldx #7
EmptyChar
sta char1,x
sta char2,x
dex
bpl EmptyChar
ldx #0
CharLoopi
lda (xbyte),y
ora mask1,x
and char1,x
sta (xbyte),y
iny
lda (xbyte),y
ora mask2,x
and char2,x
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #8
bne CharLoopi
.ELSE
mvx #7 temp ; line counter (Y)
CharLoop1
mva #7 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda Erase
bne ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #8
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
clc
lda ydraw
adc #8
sta ydraw
bne EndPutChar
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPutChar
rts
.endp
;--------------------------------------------------
.proc PutChar4x4
; puts 4x4 pixels char on the graphics screen
; in: dx, dy (LOWER left corner of the char)
; in: CharCode4x4 (.sbyte)
; in: plot4x4color (0/255)
; all pixels are being drawn
; (empty and not empty)
;--------------------------------------------------
cpw dy #(screenheight-1)
jcs TypeChar.EndPutChar ;nearest RTS
cpw dy #(4)
jcc TypeChar.EndPutChar ;nearest RTS
cpw dx #(screenwidth-4)
jcs TypeChar.EndPutChar ;nearest RTS
; checks ommited.
; char to the table
lda CharCode4x4
and #%00000001
beq Upper4bits
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
Upper4bits
sta nibbler4x4
lda CharCode4x4
lsr
sta fontind
lda #$00
sta fontind+1
adw fontind #font4x4
; and 4 bytes to the table
ldy #0
ldx #3
CopyChar
lda (fontind),y ; Y must be 0 !!!!
bit nibbler4x4
bpl GetUpper4bits
:4 rol
GetUpper4bits
ora #$0f
sta char1,x
lda #$ff
sta char2,x
; and 4 bytes as a mask
lda #$f0
sta mask1,x
lda #$00
sta mask2,x
adw fontind #32 ; next byte of 4x4 font
dex
bpl CopyChar
.IF FASTER_GRAF_PROCS = 1
; calculating coordinates from xdraw and ydraw
mwa dx xbyte
lda xbyte
and #$7
sta ybit
:3 lsrw xbyte ; div 8
; rorw xbyte
; rorw xbyte
;---
ldy xbyte ; horizontal byte offet stored in Y
lda dy ; y = y - 3 because left lower.
sec
sbc #3
tax
lda linetableL,x
sta xbyte
lda linetableH,x
sta xbyte+1
; mask preparation and character shifting
ldx ybit
beq MaskOK01
MakeMask01
.rept 4
lsr mask1+#
ror mask2+#
.endr
sec
.rept 4
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask01
MaskOK01
ldx #0
CharLoopi4x4
lda (xbyte),y
ora mask1,x
bit plot4x4color
bpl PutInColor0_1 ; only mask - no char
and char1,x
PutInColor0_1
sta (xbyte),y
iny
lda (xbyte),y
ora mask2,x
bit plot4x4color
bpl PutInColor0_2 ; only mask - no char
and char2,x
PutInColor0_2
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #4
bne CharLoopi4x4
.ELSE
mwa xdraw char2
mwa ydraw mask2
mva color mask2+2
mwa dx xdraw
mwa dy ydraw
mvx #3 temp ; line counter (Y)
CharLoop1
mva #3 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda plot4x4color
beq ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #4
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
mwa char2 xdraw
mwa mask2 ydraw
mva mask2+2 color
bpl EndPut4x4
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPut4x4
rts
.endp
;--------------------------------------------------
.proc ClearScreen
+358
View File
@@ -176,6 +176,364 @@ ClearPlot
and bittable,x
rts
.endp
;--------------------------------------------------
.proc drawmountains
;--------------------------------------------------
mwa #0 xdraw
mwa #mountaintable modify
mva #1 color
drawmountainsloop
ldy #0
lda (modify),y
cmp #screenheight
beq NoMountain
sta ydraw
sty ydraw+1
.IF FASTER_GRAF_PROCS = 1
; there was Drawline proc
lda #screenheight
sec
sbc ydraw
sta tempbyte01
jsr plot.MakePlot
; X - index in bittable (number of bit) and nothing more (for use) in C64 :)
; jmp IntoDraw ; jumps inside Draw routine
; because one pixel is already plotted (and who cares? :) )
@
lda (xbyte),y
and bittable2,x
sta (xbyte),y
;IntoDraw
inc ydraw
lda xdraw
and #%11111000
;sta xbyte
;---
ldy ydraw
clc
adc linetableL,y
sta xbyte
lda linetableH,y
adc xdraw+1
sta xbyte+1
ldy #0
dec tempbyte01
bne @-
; end of Drawline proc
.ELSE
; there was Drawline proc
drawline
jsr plot.MakePlot
inc ydraw
lda ydraw
cmp #screenheight
bne drawline
; end of Drawline proc
.ENDIF
NoMountain
inw modify
inw xdraw
cpw xdraw #screenwidth
bne drawmountainsloop
rts
.endp
;--------------------------------------------------
.proc TypeChar
; puts char on the graphics screen
; in: CharCode
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
;--------------------------------------------------
; char to the table
lda CharCode
sta fontind
lda #$00
sta fontind+1
; char intex times 8
aslw fontind
rolw fontind
rolw fontind
adw fontind #TankFont
; and 8 bytes to the table
ldy #7
CopyChar
lda (fontind),y
eor #$ff
sta char1,y
lda #$ff
sta char2,y
dey
bpl CopyChar
; and 8 subsequent bytes as a mask
adw fontind #8
ldy #7
CopyMask
lda (fontind),y
eor #$ff
sta mask1,y
lda #$00
sta mask2,y
dey
bpl CopyMask
.IF FASTER_GRAF_PROCS = 1
; mask preparation and character shifting
lda xdraw
and #$7
tax
beq MaskOK00
MakeMask00
.rept 8
lsr mask1+#
ror mask2+#
.endr
sec
.rept 8
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask00
MaskOK00
lda ydraw
sec
sbc #7
sta ydraw
; X = 0 !
lda Erase
beq CharLoopi ; it works, because x=0
lda #$ff
ldx #7
EmptyChar
sta char1,x
sta char2,x
dex
bpl EmptyChar
ldx #0
CharLoopi
; calculating coordinates from xdraw and ydraw
ldy ydraw
lda xdraw
and #%11111000
clc
adc linetableL,y
sta xbyte
lda linetableH,y
adc xdraw+1
sta xbyte+1
;--
ldy #0
lda (xbyte),y
ora mask1,x
and char1,x
sta (xbyte),y
ldy #8
lda (xbyte),y
ora mask2,x
and char2,x
sta (xbyte),y
inc ydraw
inx
cpx #8
bne CharLoopi
.ELSE
mvx #7 temp ; line counter (Y)
CharLoop1
mva #7 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda Erase
bne ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #8
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
clc
lda ydraw
adc #8
sta ydraw
bne EndPutChar
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPutChar
rts
.endp
;--------------------------------------------------
.proc PutChar4x4
; puts 4x4 pixels char on the graphics screen
; in: dx, dy (LOWER left corner of the char)
; in: CharCode4x4 (.sbyte)
; in: plot4x4color (0/255)
; all pixels are being drawn
; (empty and not empty)
;--------------------------------------------------
cpw dy #(screenheight-1)
jcs TypeChar.EndPutChar ;nearest RTS
cpw dy #(4)
jcc TypeChar.EndPutChar ;nearest RTS
cpw dx #(screenwidth-4)
jcs TypeChar.EndPutChar ;nearest RTS
; checks ommited.
; char to the table
lda CharCode4x4
and #%00000001
beq Upper4bits
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
Upper4bits
sta nibbler4x4
lda CharCode4x4
lsr
sta fontind
lda #$00
sta fontind+1
adw fontind #font4x4
; and 4 bytes to the table
ldy #0
ldx #3
CopyChar
lda (fontind),y ; Y must be 0 !!!!
bit nibbler4x4
bpl GetUpper4bits
:4 rol
GetUpper4bits
ora #$0f
sta char1,x
lda #$ff
sta char2,x
; and 4 bytes as a mask
lda #$f0
sta mask1,x
lda #$00
sta mask2,x
adw fontind #32 ; next byte of 4x4 font
dex
bpl CopyChar
.IF FASTER_GRAF_PROCS = 1
; mask preparation and character shifting
lda dx
and #$7
tax
beq MaskOK01
MakeMask01
.rept 4
lsr mask1+#
ror mask2+#
.endr
sec
.rept 4
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask01
MaskOK01
lda dy
sec
sbc #3
sta dy
ldx #0
CharLoopi4x4
; calculating coordinates from xdraw and ydraw
ldy dy
lda dx
and #%11111000
clc
adc linetableL,y
sta xbyte
lda linetableH,y
adc dx+1
sta xbyte+1
;--
ldy #0
lda (xbyte),y
ora mask1,x
bit plot4x4color
bpl PutInColor0_1 ; only mask - no char
and char1,x
PutInColor0_1
sta (xbyte),y
ldy #8
lda (xbyte),y
ora mask2,x
bit plot4x4color
bpl PutInColor0_2 ; only mask - no char
and char2,x
PutInColor0_2
sta (xbyte),y
inc dy
inx
cpx #4
bne CharLoopi4x4
.ELSE
mwa xdraw char2
mwa ydraw mask2
mva color mask2+2
mwa dx xdraw
mwa dy ydraw
mvx #3 temp ; line counter (Y)
CharLoop1
mva #3 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda plot4x4color
beq ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #4
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
mwa char2 xdraw
mwa mask2 ydraw
mva mask2+2 color
bpl EndPut4x4
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPut4x4
rts
.endp
;--------------------------------------------------
.proc ClearScreen
+6
View File
@@ -0,0 +1,6 @@
mads 2.1.5 build 3 (21 Feb 22)
Label table:
00 FFFF0001 0@
00 FFFF0001 1@
00 FFFF0001 2@
00 FFFF0001 3@
+622
View File
@@ -0,0 +1,622 @@
mads 2.1.5 build 3 (21 Feb 22)
Source: gr_basics.asm
1 .IF *>0 ;this is a trick that prevents compiling this file alone
2
3 ; Basic hardware-dependent graphics routines.
4
5 ; -----------------------------------------
6 .proc unPlot
7 ; plots a point and saves the plotted byte, reverts the previous plot.
8 ; -----------------------------------------
9 ldx #0 ; only one pixel
10 unPlotAfterX
11 stx WhichUnPlot
12
13 ; first remake the oldie
14 lda oldplotL,x
15 sta oldplot
16 lda oldplotH,x
17 sta oldplot+1
18
19 ldy #0
20 lda oldora,x
21 sta (oldplot),y
22
23
24 ; is it not out of the screen ????
25 cpw ydraw #screenheight
26 jcc CheckX
27 mwa #0 ydraw
28 CheckX
29 cpw xdraw #screenwidth
30 jcs EndOfUnPlot
31 MakeUnPlot
32 ; let's count coordinates taken from xdraw and ydraw
33 lda xdraw
34 and #%11111000
35 ;sta xbyte
36 ;---
37 ldx ydraw
38 clc
39 adc linetableL,x
40 sta xbyte
41 sta oldplot
42 lda linetableH,x
43 adc xdraw+1
44 sta xbyte+1
45 sta oldplot+1
46
47 lda xdraw
48 and #$7
49 tax
50 ldy #0
51
52 lda color
53 bne ClearUnPlot
54
55 ;plotting here
56 lda (xbyte),y
57 sta OldOraTemp
58 ora bittable,x
59 sta (xbyte),y
60 bne ContinueUnPlot ; allways <>0
61 ClearUnPlot
62 lda (xbyte),y
63 sta OldOraTemp
64 and bittable2,x
65 sta (xbyte),y
66 ContinueUnPlot
67 ldx WhichUnPlot
68 lda OldOraTemp
69 sta oldora,x
70 lda oldplot
71 sta oldplotL,x
72 lda oldplot+1
73 sta oldplotH,x
74 ; and now we must solve the problem of several plots
75 ; in one byte
76 ldx #4
77 ldy WhichUnPlot
78 LetsCheckOverlapping
79 cpx WhichUnPlot
80 beq SkipThisPlot
81 lda oldplotL,x
82 cmp oldplotL,y
83 bne NotTheSamePlot
84 lda oldplotH,x
85 cmp oldplotH,y
86 bne NotTheSamePlot
87 ; the pixel is in the same byte so let's take correct contents
88 lda oldora,x
89 sta oldora,y
90 NotTheSamePlot
91 SkipThisPlot
92 dex
93 bpl LetsCheckOverlapping
94 EndOfUnPlot
95 rts
96 .endp
97
98 ; -----------------------------------------
99 .proc plot ;plot (xdraw, ydraw, color)
100 ; color == 1 --> put pixel
101 ; color == 0 --> erase pixel
102 ; this is one of the most important routines in the whole
103 ; game. If you are going to speed up the game, start with
104 ; plot - it is used by every single effect starting from explosions
105 ; through line drawing and small text output!!!
106 ;
107 ; Optimized by 0xF (Fox) THXXXX!!!
108
109 ; -----------------------------------------
110 ; is it not over the screen ???
111 cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
112 bcs unPlot.EndOfUnPlot ;nearest RTS
113 CheckX02
114 cpw xdraw #screenwidth
115 bcs EndOfPlot
116 MakePlot
117 ; let's calculate coordinates from xdraw and ydraw
118
119 lda xdraw
120 and #%11111000
121 ;sta xbyte
122 ;---
123 ldx ydraw
124 clc
125 adc linetableL,x
126 sta xbyte
127 lda linetableH,x
128 adc xdraw+1
129 sta xbyte+1
130
131 lda xdraw
132 and #$7
133 tax
134 ldy #0
135 lda color
136 bne ClearPlot
137
138 lda (xbyte),y
139 ora bittable,x
140 sta (xbyte),y
141 EndOfPlot
142 rts
143 ClearPlot
144 lda (xbyte),y
145 and bittable2,x
146 sta (xbyte),y
147 rts
148 .endp
149
150 ; -----------------------------------------
151 .proc point_plot
152 ; -----------------------------------------
153 ; checks state of the pixel (coordinates in xdraw and ydraw)
154 ; result is in A (zero or appropriate bit is set)
155
156 ; let's calculate coordinates from xdraw and ydraw
157
158 lda xdraw
159 and #%11111000
160 ;sta xbyte
161 ;---
162 ldx ydraw
163 clc
164 adc linetableL,x
165 sta xbyte
166 lda linetableH,x
167 adc xdraw+1
168 sta xbyte+1
169
170 lda xdraw
171 and #$7
172 tax
173 ldy #0
174 lda (xbyte),y
175 eor #$ff
176 and bittable,x
177 rts
178 .endp
179 ;--------------------------------------------------
180 .proc drawmountains
181 ;--------------------------------------------------
182 mwa #0 xdraw
183 mwa #mountaintable modify
184 mva #1 color
185
186 drawmountainsloop
187 ldy #0
188 lda (modify),y
189 cmp #screenheight
190 beq NoMountain
191 sta ydraw
192 sty ydraw+1
193 .IF FASTER_GRAF_PROCS = 1
194 ; there was Drawline proc
195 lda #screenheight
196 sec
197 sbc ydraw
198 sta tempbyte01
199 jsr plot.MakePlot
200 ; X - index in bittable (number of bit) and nothing more (for use) in C64 :)
201 ; jmp IntoDraw ; jumps inside Draw routine
202 ; because one pixel is already plotted (and who cares? :) )
203 @
204 lda (xbyte),y
205 and bittable2,x
206 sta (xbyte),y
207 ;IntoDraw
208 inc ydraw
209 lda xdraw
210 and #%11111000
211 ;sta xbyte
212 ;---
213 ldy ydraw
214 clc
215 adc linetableL,y
216 sta xbyte
217 lda linetableH,y
218 adc xdraw+1
219 sta xbyte+1
220 ldy #0
221 dec tempbyte01
222 bne @-
223 ; end of Drawline proc
224 .ELSE
225 ; there was Drawline proc
226 drawline
227 jsr plot.MakePlot
228 inc ydraw
229 lda ydraw
230 cmp #screenheight
231 bne drawline
232 ; end of Drawline proc
233 .ENDIF
234 NoMountain
235 inw modify
236 inw xdraw
237 cpw xdraw #screenwidth
238 bne drawmountainsloop
239 rts
240 .endp
241 ;--------------------------------------------------
242 .proc TypeChar
243 ; puts char on the graphics screen
244 ; in: CharCode
245 ; in: left LOWER corner of the char coordinates (xdraw, ydraw)
246 ;--------------------------------------------------
247 ; char to the table
248 lda CharCode
249 sta fontind
250 lda #$00
251 sta fontind+1
252 ; char intex times 8
253 aslw fontind
254 rolw fontind
255 rolw fontind
256
257 adw fontind #TankFont
258
259 ; and 8 bytes to the table
260 ldy #7
261 CopyChar
262 lda (fontind),y
263 eor #$ff
264 sta char1,y
265 lda #$ff
266 sta char2,y
267 dey
268 bpl CopyChar
269 ; and 8 subsequent bytes as a mask
270 adw fontind #8
271 ldy #7
272 CopyMask
273 lda (fontind),y
274 eor #$ff
275 sta mask1,y
276 lda #$00
277 sta mask2,y
278 dey
279 bpl CopyMask
280
281 .IF FASTER_GRAF_PROCS = 1
282 ; mask preparation and character shifting
283 lda xdraw
284 and #$7
285 tax
286 beq MaskOK00
287 MakeMask00
288 .rept 8
289 lsr mask1+#
290 ror mask2+#
291 .endr
292 sec
293 .rept 8
294 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
295 ror char2+#
296 .endr
297 dex
298 bne MakeMask00
299 MaskOK00
300 lda ydraw
301 sec
302 sbc #8
303 sta ydraw
304 ; X = 0 !
305 lda Erase
306 beq CharLoopi ; it works, because x=0
307 lda #$ff
308 ldx #7
309 EmptyChar
310 sta char1,x
311 sta char2,x
312 dex
313 bpl EmptyChar
314 ldx #0
315 CharLoopi
316 ; calculating coordinates from xdraw and ydraw
317 ldy ydraw
318 lda xdraw
319 and #%11111000
320 clc
321 adc linetableL,y
322 sta xbyte
323 lda linetableH,y
324 adc xdraw+1
325 sta xbyte+1
326 ;--
327 ldy #0
328 lda (xbyte),y
329 ora mask1,x
330 and char1,x
331 sta (xbyte),y
332 ldy #8
333 lda (xbyte),y
334 ora mask2,x
335 and char2,x
336 sta (xbyte),y
337 inc ydraw
338 inx
339 cpx #8
340 bne CharLoopi
341 .ELSE
342 mvx #7 temp ; line counter (Y)
343 CharLoop1
344 mva #7 temp+1 ; pixel counter (X)
345 CharLoop2
346 mva #0 color
347 rol mask1,x
348 bcc NoMaskNoPlot
349 rol char1,x
350 bcs NoPlot
351 MakeCharPlot
352 lda Erase
353 bne ErasingChar
354 inc color
355 ErasingChar
356 NoPlot
357 jsr plot.MakePlot
358 AfterCharPlot
359 inw xdraw
360 ldx temp
361 dec temp+1
362 bpl CharLoop2
363 sec
364 sbw xdraw #8
365 dec ydraw
366 ldx temp
367 dex
368 stx temp
369 bpl CharLoop1
370 clc
371 lda ydraw
372 adc #8
373 sta ydraw
374 bne EndPutChar
375 NoMaskNoPlot
376 rol char1,x
377 jmp AfterCharPlot
378 .ENDIF
379 EndPutChar
380 rts
381 .endp
382
383 ;--------------------------------------------------
384 .proc PutChar4x4
385 ; puts 4x4 pixels char on the graphics screen
386 ; in: dx, dy (LOWER left corner of the char)
387 ; in: CharCode4x4 (.sbyte)
388 ; in: plot4x4color (0/255)
389 ; all pixels are being drawn
390 ; (empty and not empty)
391 ;--------------------------------------------------
392 cpw dy #(screenheight-1)
393 jcs TypeChar.EndPutChar ;nearest RTS
394 cpw dy #(4)
395 jcc TypeChar.EndPutChar ;nearest RTS
396 cpw dx #(screenwidth-4)
397 jcs TypeChar.EndPutChar ;nearest RTS
398 ; checks ommited.
399 ; char to the table
400 lda CharCode4x4
401 and #%00000001
402 beq Upper4bits
403 lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
404 Upper4bits
405 sta nibbler4x4
406 lda CharCode4x4
407 lsr
408 sta fontind
409 lda #$00
410 sta fontind+1
411
412 adw fontind #font4x4
413
414 ; and 4 bytes to the table
415 ldy #0
416 ldx #3
417 CopyChar
418 lda (fontind),y ; Y must be 0 !!!!
419 bit nibbler4x4
420 bpl GetUpper4bits
421 :4 rol
422 GetUpper4bits
423 ora #$0f
424 sta char1,x
425 lda #$ff
426 sta char2,x
427 ; and 4 bytes as a mask
428 lda #$f0
429 sta mask1,x
430 lda #$00
431 sta mask2,x
432 adw fontind #32 ; next byte of 4x4 font
433 dex
434 bpl CopyChar
435
436 .IF FASTER_GRAF_PROCS = 1
437 ; calculating coordinates from xdraw and ydraw
438 mwa dx xbyte
439
440 lda xbyte
441 and #$7
442 sta ybit
443
444 :3 lsrw xbyte ; div 8
445 ; rorw xbyte
446 ; rorw xbyte
447 ;---
448 ldy xbyte ; horizontal byte offet stored in Y
449 lda dy ; y = y - 3 because left lower.
450 sec
451 sbc #3
452 tax
453
454 lda linetableL,x
455 sta xbyte
456 lda linetableH,x
457 sta xbyte+1
458 ; mask preparation and character shifting
459 ldx ybit
460 beq MaskOK01
461 MakeMask01
462 .rept 4
463 lsr mask1+#
464 ror mask2+#
465 .endr
466 sec
467 .rept 4
468 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
469 ror char2+#
470 .endr
471 dex
472 bne MakeMask01
473 MaskOK01
474 ldx #0
475 CharLoopi4x4
476 lda (xbyte),y
477 ora mask1,x
478 bit plot4x4color
479 bpl PutInColor0_1 ; only mask - no char
480 and char1,x
481 PutInColor0_1
482 sta (xbyte),y
483 iny
484 lda (xbyte),y
485 ora mask2,x
486 bit plot4x4color
487 bpl PutInColor0_2 ; only mask - no char
488 and char2,x
489 PutInColor0_2
490 sta (xbyte),y
491 dey
492 adw xbyte #screenBytes
493 inx
494 cpx #4
495 bne CharLoopi4x4
496 .ELSE
497 mwa xdraw char2
498 mwa ydraw mask2
499 mva color mask2+2
500 mwa dx xdraw
501 mwa dy ydraw
502 mvx #3 temp ; line counter (Y)
503 CharLoop1
504 mva #3 temp+1 ; pixel counter (X)
505 CharLoop2
506 mva #0 color
507 rol mask1,x
508 bcc NoMaskNoPlot
509 rol char1,x
510 bcs NoPlot
511 MakeCharPlot
512 lda plot4x4color
513 beq ErasingChar
514 inc color
515 ErasingChar
516 NoPlot
517 jsr plot.MakePlot
518 AfterCharPlot
519 inw xdraw
520 ldx temp
521 dec temp+1
522 bpl CharLoop2
523 sec
524 sbw xdraw #4
525 dec ydraw
526 ldx temp
527 dex
528 stx temp
529 bpl CharLoop1
530 mwa char2 xdraw
531 mwa mask2 ydraw
532 mva mask2+2 color
533 bpl EndPut4x4
534 NoMaskNoPlot
535 rol char1,x
536 jmp AfterCharPlot
537 .ENDIF
538 EndPut4x4
539 rts
540 .endp
541
542 ;--------------------------------------------------
543 .proc ClearScreen
544 ;--------------------------------------------------
545 mwa #displayC64 temp
546 ldy #0
547 @ lda #$ff
548 sta (temp),y
549 inw temp
550 cpw temp #displayC64+screenheight*screenBytes+1
551 bne @-
552 rts
553 .endp
554
555 ;--------------------------------------------------
556 .proc GenerateLineTable
557
558 mwa #displayC64 temp
559 mwa #linetableL temp2
560 mwa #linetableH modify
561 ldy #0
562 ldx #0
563 @ lda temp
564 sta (temp2),y
565 lda temp+1
566 sta (modify),y
567 cpx #7
568 bne NotChar
569 ldx #0
570 adw temp #(320-7)
571 jmp next8lines
572 NotChar
573 inw temp
574 inx
575 next8lines
576 iny
577 cpy #screenheight+1
578 bne @-
579 rts
580 .endp
581 ;--------------------------------------------------
582 .proc SetMainScreen
583 lda #$b ; Grey background and border
584 lda WallsType
585 :4 rol
586 sta $d020
587 sta $d021
588
589 lda $dd00 ; Set video bank to start at 0
590 and #252
591 ora #3
592 sta $dd00
593 lda #$18
594 sta $d018
595
596 ; SwitchVICBank(0)
597 ; SetScreenMemory($2000)
598 SetHiresBitmapMode ; Hires mode on
599 lda #$00
600 sta 53281
601 ; clear color RAM
602 ldx #0
603 @ lda #1
604 sta $d800,x
605 sta $d900,x
606 sta $da00,x
607 sta $db00,x
608 lda #$0f
609 sta $0400,x
610 sta $0500,x
611 sta $0600,x
612 sta $0700,x
613 inx
614 bne @-
615
616
617 rts
618 .endp
619
620 .ENDIF
-357
View File
@@ -1266,55 +1266,6 @@ ThereWasNoParachute
rts
.endp
;--------------------------------------------------
.proc drawmountains
;--------------------------------------------------
mwa #0 xdraw
mwa #mountaintable modify
mva #1 color
drawmountainsloop
ldy #0
lda (modify),y
cmp #screenheight
beq NoMountain
sta ydraw
sty ydraw+1
.IF FASTER_GRAF_PROCS = 1
; there was Drawline proc
lda #screenheight
sec
sbc ydraw
sta tempbyte01
jsr plot.MakePlot
; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit)
; jmp IntoDraw ; jumps inside Draw routine
; because one pixel is already plotted (and who cares? :) )
@
lda (xbyte),y
and bittable2,x
sta (xbyte),y
;IntoDraw
adw xbyte #screenBytes
dec tempbyte01
bne @-
; end of Drawline proc
.ELSE
; there was Drawline proc
drawline
jsr plot.MakePlot
inc ydraw
lda ydraw
cmp #screenheight
bne drawline
; end of Drawline proc
.ENDIF
NoMountain
inw modify
inw xdraw
cpw xdraw #screenwidth
bne drawmountainsloop
rts
/*
;--------------------------------------------------
drawmountainspixel ; never used ?
@@ -1333,7 +1284,6 @@ drawmountainspixelloop
bne drawmountainspixelloop
rts
*/
.endp
;--------------------------------------------------
.proc SoilDown2
;--------------------------------------------------
@@ -1630,313 +1580,6 @@ NotHigher
rts
.endp
;--------------------------------------------------
.proc TypeChar
; puts char on the graphics screen
; in: CharCode
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
;--------------------------------------------------
; char to the table
lda CharCode
sta fontind
lda #$00
sta fontind+1
; char intex times 8
aslw fontind
rolw fontind
rolw fontind
adw fontind #TankFont
; and 8 bytes to the table
ldy #7
CopyChar
lda (fontind),y
eor #$ff
sta char1,y
lda #$ff
sta char2,y
dey
bpl CopyChar
; and 8 subsequent bytes as a mask
adw fontind #8
ldy #7
CopyMask
lda (fontind),y
eor #$ff
sta mask1,y
lda #$00
sta mask2,y
dey
bpl CopyMask
.IF FASTER_GRAF_PROCS = 1
; calculating coordinates from xdraw and ydraw
mwa xdraw xbyte
lda xbyte
and #$7
sta ybit
lsrw xbyte ; div 8
rorw xbyte
rorw xbyte
;---
ldy xbyte
lda ydraw ; y = y - 7 because left lower. shouldn't it be 8?
sec
sbc #7
tax
lda linetableL,x
sta xbyte
lda linetableH,x
sta xbyte+1
; mask preparation and character shifting
ldx ybit
beq MaskOK00
MakeMask00
.rept 8
lsr mask1+#
ror mask2+#
.endr
sec
.rept 8
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask00
MaskOK00
; here x=0
lda Erase
beq CharLoopi ; it works, because x=0
lda #$ff
ldx #7
EmptyChar
sta char1,x
sta char2,x
dex
bpl EmptyChar
ldx #0
CharLoopi
lda (xbyte),y
ora mask1,x
and char1,x
sta (xbyte),y
iny
lda (xbyte),y
ora mask2,x
and char2,x
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #8
bne CharLoopi
.ELSE
mvx #7 temp ; line counter (Y)
CharLoop1
mva #7 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda Erase
bne ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #8
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
clc
lda ydraw
adc #8
sta ydraw
bne EndPutChar
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPutChar
rts
.endp
;--------------------------------------------------
.proc PutChar4x4
; puts 4x4 pixels char on the graphics screen
; in: dx, dy (LOWER left corner of the char)
; in: CharCode4x4 (.sbyte)
; in: plot4x4color (0/255)
; all pixels are being drawn
; (empty and not empty)
;--------------------------------------------------
cpw dy #(screenheight-1)
jcs TypeChar.EndPutChar ;nearest RTS
cpw dy #(4)
jcc TypeChar.EndPutChar ;nearest RTS
cpw dx #(screenwidth-4)
jcs TypeChar.EndPutChar ;nearest RTS
; checks ommited.
; char to the table
lda CharCode4x4
and #%00000001
beq Upper4bits
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
Upper4bits
sta nibbler4x4
lda CharCode4x4
lsr
sta fontind
lda #$00
sta fontind+1
adw fontind #font4x4
; and 4 bytes to the table
ldy #0
ldx #3
CopyChar
lda (fontind),y ; Y must be 0 !!!!
bit nibbler4x4
bpl GetUpper4bits
:4 rol
GetUpper4bits
ora #$0f
sta char1,x
lda #$ff
sta char2,x
; and 4 bytes as a mask
lda #$f0
sta mask1,x
lda #$00
sta mask2,x
adw fontind #32 ; next byte of 4x4 font
dex
bpl CopyChar
.IF FASTER_GRAF_PROCS = 1
; calculating coordinates from xdraw and ydraw
mwa dx xbyte
lda xbyte
and #$7
sta ybit
:3 lsrw xbyte ; div 8
; rorw xbyte
; rorw xbyte
;---
ldy xbyte ; horizontal byte offet stored in Y
lda dy ; y = y - 3 because left lower.
sec
sbc #3
tax
lda linetableL,x
sta xbyte
lda linetableH,x
sta xbyte+1
; mask preparation and character shifting
ldx ybit
beq MaskOK01
MakeMask01
.rept 4
lsr mask1+#
ror mask2+#
.endr
sec
.rept 4
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
ror char2+#
.endr
dex
bne MakeMask01
MaskOK01
ldx #0
CharLoopi4x4
lda (xbyte),y
ora mask1,x
bit plot4x4color
bpl PutInColor0_1 ; only mask - no char
and char1,x
PutInColor0_1
sta (xbyte),y
iny
lda (xbyte),y
ora mask2,x
bit plot4x4color
bpl PutInColor0_2 ; only mask - no char
and char2,x
PutInColor0_2
sta (xbyte),y
dey
adw xbyte #screenBytes
inx
cpx #4
bne CharLoopi4x4
.ELSE
mwa xdraw char2
mwa ydraw mask2
mva color mask2+2
mwa dx xdraw
mwa dy ydraw
mvx #3 temp ; line counter (Y)
CharLoop1
mva #3 temp+1 ; pixel counter (X)
CharLoop2
mva #0 color
rol mask1,x
bcc NoMaskNoPlot
rol char1,x
bcs NoPlot
MakeCharPlot
lda plot4x4color
beq ErasingChar
inc color
ErasingChar
NoPlot
jsr plot.MakePlot
AfterCharPlot
inw xdraw
ldx temp
dec temp+1
bpl CharLoop2
sec
sbw xdraw #4
dec ydraw
ldx temp
dex
stx temp
bpl CharLoop1
mwa char2 xdraw
mwa mask2 ydraw
mva mask2+2 color
bpl EndPut4x4
NoMaskNoPlot
rol char1,x
jmp AfterCharPlot
.ENDIF
EndPut4x4
rts
.endp
;--------------------------------------------------------
.proc DisplayOffensiveTextNr ;
ldx TextNumberOff
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -10,7 +10,7 @@
;---------------------------------------------------
.def XCORRECTION_FOR_PM = 0
; if 1 - active x position of tanks correction fo PMG
.def FASTER_GRAF_PROCS = 0
.def FASTER_GRAF_PROCS = 1
; if 1 - activates faster graphics routines
; (direct writes to screen memory - atari only :) )
;---------------------------------------------------
BIN
View File
Binary file not shown.