User Tools

Site Tools


base:rather_small_and_rather_fast_screen_offset_component_splitter

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:rather_small_and_rather_fast_screen_offset_component_splitter [2015-04-17 04:33] (current)
Line 1: Line 1:
 +<​code>​
 +;  in: 10-bit value in hi.A
 +; out: x=input % 40
 +;      y=input / 40
 +;      a=clobbered
 +;
 +.proc splitOffset
 +         sta sm2+1
 +         lsr HI
 +         ror
 +         lsr HI
 +         ror
 +         lsr HI
 +         ror
 +         lsr HI
 +         ror
 +         lsr HI
 +         ror
 +         ​tax ​          ;​x=in/​32
 +         ldy divtab,​x ​ ;y=x/1.25 = in/40 + rounding errors
 +         tya
 +         asl
 +         asl
 +         ​asl ​          ;​a=y*8
 +         sta sm1+1
 +         asl
 +         ​asl ​          ;​a=<​(y*32)
 +         clc
 +sm1:     adc #$00      ;<​(y*8+y*32) = <(y*40)
 +         sec
 +sm2:     sbc #$00      ;<​(y*40-in)
 +         eor #$ff      ;<​(in-y*40-1)
 +         ​tax ​          ;​x=<​(in-y*40-1)
 +         ​inx ​          ;​x=<​(in-y*40) = in%40 + rounding errors
 +         cpx #40       ;due to x/40 != int(x/​32)/​1.25 we might get a rounding error that we fix here
 +         bcc :+
 +            txa
 +            .byte $cb,40 ;axs/sbx #40
 +            iny
 +         :
 +         rts
  
 +divtab: ​ .byte $00,​$00,​$01,​$02,​$03,​$04,​$04,​$05,​$06,​$07,​$08,​$08,​$09,​$0a,​$0b,​$0c,​$0c,​$0d,​$0e,​$0f,​$10,​$10,​$11,​$12,​$13,​$14,​$14,​$15,​$16,​$17,​$18,​$18
 +.endproc
 +</​code>​
base/rather_small_and_rather_fast_screen_offset_component_splitter.txt ยท Last modified: 2015-04-17 04:33 (external edit)