The following warnings occurred:
Warning [2] Undefined array key 0 - Line: 1677 - File: showthread.php PHP 8.2.31 (Linux)
File Line Function
/inc/class_error.php 157 errorHandler->error
/showthread.php 1677 errorHandler->error_callback
/showthread.php 916 buildtree




Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PutTile16x16 Pixels + Attributes
#16
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...

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
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)