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: 3 Guest(s)