4,142 bytes added,
10:45, 9 October 2016 ==Fastest Character Print in Mode 2==
It is possible to print a character in Mode 2 in less than a raster line time (64nops)?
YES, using RES and SET commands to calculate next line screen address!!
This routine works in all vertical positions. It automatically calculates from which raster line of character we start to plot (CRTC reg. 9) and it uses special routine for each (0 - 7 lines).
Code is MAXAM compatible / timed and documented to my best..
<pre>
;FASTEST CHARACTER PRINTER IN ALL Y COORDINATES
;takes less time than a raster line per char. in mode 2
;9.10.2016
;FG Brain
org &7000 : RUN $ :nolist
;INPUT HL = Screen Address to PLOT
ld a,h
and %00111000
rra
rra
; A=no of raster line (0-7) of char. we plot
;[ rra NEEDED but destroyed then with add a,a ]
ld hl,tablinerout
ld b,0:ld c,a
add hl,bc
ld de,jphere+1
ldi:ldi
LD DE,&C850
LD BC,font
adr ld hl,0
jphere jp jphere ;get adr to jump according to A
ret
tablinerout
dw line0,line1,line2,line3,line4,line5,line6,line7
;===PLOT 8 BYTES VERTICAL FROM ALL LINES===
;input DE = &C850 BC=font adr HL=screen adr to print char.font
line0 ;LINE 0
ld a,(bc):ld(hl),a:inc c ;5
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 5,h:res 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;11
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a ;6
RET ;3
;=64 NOPs
line1 ;LINE 1
ld a,(bc):ld(hl),a:inc c ;5
res 3,h:set 4,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 5,h:res 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;11
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
res 3,h:set 4,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
add hl,de:ld a,(bc):ld(hl),a ;7
ret ;3
;=65 NOPs
line2 ;LINE 2
ld a,(bc):ld(hl),a:inc c ;5
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 5,h:res 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;11
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
add hl,de:ld a,(bc):ld(hl),a:inc c ;8
set 3,h:ld a,(bc):ld(hl),a ;6
Ret ;3
;=63 NOPs
line3 ;LINE 3
ld a,(bc):ld(hl),a:inc c ;5
set 5,h:res 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;11
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
add hl,de:ld a,(bc):ld(hl),a:inc c ;8
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a ;8
ret ;3
;=65 NOPs
line4 ;LINE 4
ld a,(bc):ld(hl),a:inc c ;5
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
add hl,de:ld a,(bc):ld(hl),a:inc c ;8
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a ;6
ret ;3
;=61 NOPs
line5 ;LINE 5
ld a,(bc):ld(hl),a:inc c ;5
set 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
add hl,de:ld a,(bc):ld(hl),a:inc c ;8
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 5,h:res 4,h:res 3,h:ld a,(bc):ld(hl),a ;10
ret ;3
;=65 NOPs
line6 ;LINE 6
ld a,(bc):ld(hl),a:inc c ;5
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
add hl,de:ld a,(bc):ld(hl),a:inc c ;8
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 5,h:res 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;11
set 3,h:ld a,(bc):ld(hl),a ;6
ret ;3
;=63 NOPs
line7 ;LINE 7
ld a,(bc):ld(hl),a:inc c ;5
add hl,de:ld a,(bc):ld(hl),a:inc c ;8
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;9
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 5,h:res 4,h:res 3,h:ld a,(bc):ld(hl),a:inc c ;11
set 3,h:ld a,(bc):ld(hl),a:inc c ;7
set 4,h:res 3,h:ld a,(bc):ld(hl),a ;8
ret ;3
;=65 NOPs
align 256
FONT
DB 200,100,200,100,200,100,200,100
end
</pre>
Compare with the normal routine (but much smaller in size), which needs at least 104 nops!!
<pre>
ldi: ;5
dec hl ;2
ld a,h:add 8:ld h,a ;4
jr nc,okk ;2 / 3 13*8=104 NOPs
ld bc,&c050 ; 3
add hl,bc ; 3
jr okk ;3 ; 104+9=113 nops
</pre>
[[Category:Programming]]