05-31-2010, 06:34 PM
Okay. This is faster. it's also quite a lot longer!
I had to hand time this at about 8.5 seconds for 80 loops. Which means it takes about 5.3 frames to fill the screen once. (Your 8 loop test would take about 42 frames). I can't use the frames counter to time it, because Interrupts HAVE to be disabled.
I hope around 3 times faster is good?
This could probably be optimized slightly better, I don't think I'm using passed in parameters well.
I also think you might be able to see how the fourspriter code was made to go quite a lot faster...
I had to hand time this at about 8.5 seconds for 80 loops. Which means it takes about 5.3 frames to fill the screen once. (Your 8 loop test would take about 42 frames). I can't use the frames counter to time it, because Interrupts HAVE to be disabled.
I hope around 3 times faster is good?
This could probably be optimized slightly better, I don't think I'm using passed in parameters well.
I also think you might be able to see how the fourspriter code was made to go quite a lot faster...
Code:
SUB putTile(x as uByte, y as uByte, graphicsAddr as uInteger)
poke @ptx+1,x
poke @pty+1,y
poke Uinteger @ptgraddr+1,graphicsAddr
ptDataPoint:
asm
JP pt_start
ptstackSave:
defb 0,0
pt_start:
ld a,i
push af ; Save interrupt status.
; Routine to save the background to the buffer
DI ; we really, really, REALLY can NOT be having interrupts while the stack and IX and IY are pointed elsewhere.
PUSH IX
PUSH IY
end asm
ptgraddr:
asm
ld HL, 65535 ; Self modifying code should load this with the graphics address.
;; Print sprites routine
LD (ptstackSave), SP ; Save Stack Pointer
LD SP,HL ; now SP points at the start of the graphics.
; This function returns the address into HL of the screen address
end asm
ptx:
asm
ld a,0 ; Load in x
ld IYH, a ; save it
ld l,a
end asm
pty:
asm
ld a,0 ; Load in y
ld IYL, a ; save it
ld d,a
and 24
add a,64
ld h,a
ld a,d
and 7
rrca
rrca
rrca
or l
add a,2 ; Need to be to the right so backwards writing pushes land properly.
ld l,a
; SO now, HL -> Screen address, and SP -> Graphics. Time to start loading.
POP BC ; Row 0
POP DE ; row 1
EX AF,AF'
POP AF ; row 2
EX AF,AF'
EXX
POP BC ; row 3
POP DE ; row 4
POP HL ; row 5
EXX
; All right. We're loaded. Time to dump!
LD IX,0
ADD IX,SP ; Save our stack pointer into IX
LD SP,HL ; point at the screen.
PUSH BC ; row 0
INC H
LD SP,HL
PUSH DE ; row 1
INC H
LD SP,HL
EX AF,AF'
PUSH AF ; row 2
INC H
LD SP,HL
EXX
PUSH BC ; row 3
EXX
INC H
LD SP,HL
EXX
PUSH DE ; row 4
EXX
INC H
LD SP,HL
EXX
PUSH HL ; ROW 5
EXX
; We're empty. Time to load up again.
LD SP,IX
POP BC ; ROW 6
POP DE ; ROW 7
EX AF,AF'
POP AF ; ROW 8
EX AF,AF'
EXX
POP BC ; ROW 9
POP DE ; ROW 10
POP HL ; ROW 11
EXX
; and we're loaded up again! Time to dump this graphic on the screen.
LD IX,0
ADD IX,SP ; save SP in IX
INC H
LD SP,HL
PUSH BC ; ROW 6
INC H
LD SP,HL
PUSH DE ; ROW 7
DEC HL
DEC HL
; Aha. Snag. We're at the bottom of a character. What's the next address down?
ld a,l
and 224
cp 224
jp z,ptSameThird3
ptNextThird3:
ld de,1760
and a
sbc hl,de
jp ptAddrDone3
ptSameThird3:
ld de,32
and a
adc hl,de
ptAddrDone3:
INC HL
INC HL
LD SP,HL
EX AF,AF'
PUSH AF ; ROW 8
INC H
LD SP,HL
EXX
PUSH BC ; ROW 9
EXX
INC H
LD SP,HL
EXX
PUSH DE ; ROW 10
EXX
INC H
LD SP,HL
EXX
PUSH HL ; ROW 11
EXX
; Okay. Registers empty. Reload time!
LD SP,IX
POP BC ; ROW 12
POP DE ; ROW 13
EXX
POP BC ; ROW 14
POP DE ; ROW 15
POP HL ; Top Attrs
EXX
EX AF,AF'
POP AF ; Bottom Attrs
EX AF,AF'
; and the last dump to screen
INC H
LD SP,HL
PUSH BC
INC H
LD SP,HL
PUSH DE
INC H
LD SP,HL
EXX
PUSH BC
EXX
INC H
LD SP,HL
EXX
PUSH DE
EXX
end asm
#line 222
asm
; Pixels done. Just need to do the attributes.
; So set HL to the attr address:
ld a,IYL ;ypos
rrca
rrca
rrca ; Multiply by 32
ld l,a ; Pass to L
and 3 ; Mask with 00000011
add a,88 ; 88 * 256 = 22528 - start of attributes.
ld h,a ; Put it in the High Byte
ld a,l ; We get y value *32
and 224 ; Mask with 11100000
ld l,a ; Put it in L
ld a,IYH ; xpos
adc a,l ; Add it to the Low byte
ld l,a ; Put it back in L, and we're done. HL=Address.
INC HL ; we need to be to the right of the ATTR point as pushes write backwards.
INC HL
; attr
LD SP,HL
EXX
PUSH HL ; top row
EXX
LD HL,34 ; we need to move down to the next row. We already backed up 2, so we add 34.
ADD HL,SP
LD SP,HL
EX AF,AF' ; bottom row
PUSH AF
ptNextSprite2:
; done. Cleanup.
LD SP,(ptstackSave) ; put our stack back together.
; done all 4 final clean up
POP IY
POP IX
POP AF ; recover interrupt status
JP PO, pt_nointerrupts ; skip EI if we didn't have them enabled to begin with.
EI ; Okay. We put everything back.
pt_nointerrupts:
END ASM
END SUB
dim x,y as ubyte
dim adr as Uinteger
adr=0
for y=0 to 11
for x=0 to 15
putTile(x<<1,y<<1,adr)
'adr=adr+36
next x
next y