From 7a8fb73f84936d4dc349bb2e3d5d661e6bb3d4df Mon Sep 17 00:00:00 2001 From: RochesterX Date: Wed, 18 Feb 2026 15:04:42 -0500 Subject: [PATCH] Subpixels --- plat.nes | Bin 40976 -> 40976 bytes plat.s | 444 +++++++++++++++++++++++++++---------------------------- 2 files changed, 215 insertions(+), 229 deletions(-) diff --git a/plat.nes b/plat.nes index 8535f8d3cc58163acb577f83e9859076dfcf5683..83a1aff34be236ea499138421b1b7cef0a852a15 100644 GIT binary patch delta 1324 zcmZ`&O=ufO6rLSxrPZvnyS7%Vu`ScdApuhgzD0+IIzI(DEX6&PUX_EW}v`PaBIrU)bLq)Be7INq<)umL%Qj)w`$&M15x7yLZ?|u8t zH*aPehqwX1l5+lT`Em26^1)|!cJHCsaKIXWGk1smxfQJOd7cUo&+=t9tUSa_WNBI9 zS$4O|(%bBM1xRkbBJ|v`;%nHS#kph4N7#>HVKskKsMo3p;?H1Thl=JWux~@bDvcLlvI3-VTj|E|9m0`0~f#*Z6QHv zS>tq1-y`*F*X}8J2r*#cA5b>9$vrDze6CPvA@-~al1X7Dx47kgv<-83+ycBU@!6Il z=C}diOK!0T5;7zNWB`*2w+71StjJ1V;X;6V#wcYGVZd^0hI?mQ7_@A0gFTPl6ia<& zqy_(Q(-X3F&#Qb%WOKhSN3SP@DVt~tofb{53nOaBIrzUpH^&#JkeNI~i?b_cZ`M-V zWLP7vwlhsyep@pg*krExL-27(7_Uyo7x2m*gcMmpdEtP#y?H;V{`U!S$NsguN zaA1YMwopA^`#*vU_347=>#fF+WGP7uE*_z z&!=)iiZ(!nx1b4l{T)!kV6nY1tZnQSO5IXtIMBjxOP!-bEri9RQD%TfDelzs0is3c zY4|U9N?qZ=8H=iiP=)gTxcqfg?g*#(bFAP|LE3bH!g%gD?!KzhvU<9QHf(TNJ4riH z1IPV?Dd(fb!Z*>=AH|{T(ETU?W93{?rvP=+C5QH3b8A!o1F*Tmhl9OCk$1$$UXFKg=6q_y~MAK*iEg@$S zp@qc^JV}g3{6&euWzEf}@H_-I(M4unTt#Mb(J|Bb{DmjKB(B^BFCRW3TXFUp*pjld delta 1300 zcmZ`&PiP}m7=Lf3^Cy$ZOhP)-NlNt{+?C+P1!e0&42YNwxp)u{doT#aWLL$T3bJX_ zyh#ZRWEmE!SS*7t?kg@Rd(lI&3WcN~3|<6J5p+%U5``7*VexyD)~!qTP5AP@-|u_B z@0;&?)8CW&@N3{}*PCCwa!Vqc)oL|G0+nnUVo|N9XyDZ=y~;qIky}WfoUjc=6K+Eo zU#?d+E1$@{50E@;{AW6HSit1sr`;_yHyM-uUGnNW`D2xrsZFyS(E=@!a+?*rCZ+}Q zWrw`iCNHg%uht-_wjI8W-Dj*49-(-i8G$ARwzPbx2eK5TrP|RNV98cs3CXO|Dg-P1 zg<7f|evMr-IXzW)x%Nam{0SFZPK21_HFfITNZ&Ae)#?_OCa}gN{uK%`X@*+79K7BQ z8eN_Zn%&?^w_cABIqHniG{vmcDz$3Y+mNb7Ex^AMxEWzCQ4_#>)FR)XK=%Zc!qgh$ z=@Kizo3v2uaI|ku?W{g94}7!sV|!pue3K{?bS&nL@Kopj& zr)hXKyp74ZHI4&~gqP(DujP1_eAw|;ayz^4_>n^1@9gYe?E<^|hOmvD$v7MT5TRbh zKP&XjB=oIQp~F2pW*kLj{xh6Ei2sH(ODzHPO7ihVE6Iw+Q9}R5@iwYNIx*H75e$}G zk|$%Y|JNmXxaaoo@WDqlDf|=*=0uk+3&eKHQqCKjkoE;EYkME+4A3^VDl9 z-j&%yb1;mie&XItdY7~=yr8(P%)puW4ov?RWTF3)x%Qw8+~PB2e5gD>Og=ft1EW)E zTFml9__Jf-Q$>iHX63e)54GAINTfbYndQU)AoafSxk?T31w5#Hs;>LWLijoV;leJ< z!8BYUF3L8b?EB*3W%c7SM&dcO&Ts{v#LPB{mE<`^)$~;Ojr!<|^NzcK=e 0, decrement bpl :+ - ldx player_vel_x - dex + lda player_vel_x + sec + sbc #16 stx player_vel_x jmp @end : ; Else if player_vel_x < 0, increment - ldx player_vel_x - inx - stx player_vel_x + lda player_vel_x + clc + adc #16 + sta player_vel_x @end: ; Jump @@ -664,11 +596,84 @@ movement: sta player_pos_y ; Apply X velocity + ; Position + lda player_vel_x + and #%10000000 + cmp #0 + bne :+ + ; 0: right + lda player_vel_x + and #%01110000 + clc + ror + clc + ror + clc + ror + clc + ror + sta var_n ; pixels + + lda player_vel_x + and #%00001111 + sta var_m ; subpixels + ; A contains signed subpixels + + clc + adc player_subpos_x ; add subposition and velocity subpixels + and #%00001111 + cmp player_subpos_x ; if A (result) is less than current subpos, overflow occurred + bpl @end_add_subpos ; so skip if subpos is smaller than result + ldx player_pos_x + inx + stx player_pos_x + @end_add_subpos: + + jmp :++ + : + ; 1: left + lda player_vel_x + and #%01110000 + clc + ror + clc + ror + clc + ror + clc + ror + eor #%11111111 + clc + adc #1 + sta var_n ; pixels + + lda player_vel_x + and #%00001111 + eor #%00001111 + clc + adc #1 + and #%00001111 + ; A contains signed subpixels + + clc + adc player_subpos_x ; add subposition and velocity subpixels + and #%00001111 + cmp player_subpos_x ; if A (result) is greater than current subpos, underflow occurred + bmi @end_sub_subpos ; so skip if subpos is bigger than result + ldx player_pos_x + dex + stx player_pos_x + @end_sub_subpos: + : + lda player_pos_x clc - adc player_vel_x + adc var_n ; add pixels + + sta player_pos_x + ; load x pos, filter blocks, check up and down lda player_vel_y @@ -708,23 +713,6 @@ movement: rts -update_background: - rts - ;lda $2002 - ;lda #$20 - ;sta $2006 - ;lda #$00 - ;sta $2006 - - ldx #1 - ldy #1 - jsr ppu_update_tile - - lda #1 - sta $2007 - - rts - setup_background: lda $2002 ; reset latch lda #$20 @@ -814,117 +802,115 @@ setup_background: ; clear attributes - lda #0 - ldx #64 ; 64 bytes - : - lda #%11100100 + ;lda #0 + ;ldx #64 ; 64 bytes + ;: + ; lda #%11100100 +; + ; sta $2007 + ; dex + ; bne :- - sta $2007 - dex - bne :- + lda #0 + sta $50 + + ldy #0 + : + tya + pha + + ldx #0 + : + tya + pha + txa + pha + + tya + asl + asl + asl + asl + asl + sta temp_y + + txa + asl + + clc + adc temp_y + + tax + + lda level, X + tay + lda #5 + jsr mul_y + tay + lda metatiles+4, Y + sta temp_x + + lda level+1, X + tay + lda #5 + jsr mul_y + tay + lda metatiles+4, Y + asl + asl + adc temp_x + sta temp_x + + lda level+16, X + tay + lda #5 + jsr mul_y + tay + lda metatiles+4, Y + asl + asl + asl + asl + adc temp_x + sta temp_x + + lda level+17, X + tay + lda #5 + jsr mul_y + tay + lda metatiles+4, Y + asl + asl + asl + asl + asl + asl + adc temp_x + sta $2007 + + ldx $50 + inx + stx $50 + + sta $60, X + + pla + tax + pla + tay + inx + cpx #8 + bne :- + + pla + tay + iny + cpy #8 + bne :-- rts - - - lda $2002 ; reset latch - lda #$20 - sta $2006 - lda #$00 - sta $2006 - ; empty nametable - lda #0 - ldy #30 ; 30 rows - : - ldx #32 ; 32 columns - : - sta $2007 - dex - bne :- - dey - bne :-- - ; set all attributes to 0 - lda #0 - ldx #64 ; 64 bytes - : - txa - and #%00000011 - asl - asl - asl - asl - sta temp - txa - and #%00000011 - ora temp - lda #0 - - sta $2007 - dex - bne :- - - - - - - ; fill in an area in the middle with 1/2 checkerboard - lda #1 - ldy #0 ; start at row 8 - : - pha ; temporarily store A, it will be clobbered by ppu_address_tile routine - ldx #8 ; start at column 8 - jsr ppu_address_tile - pla ; recover A - - ldx #8 - : - sta $2007 - eor #$3 - inx - cpx #(32-8) - bcc :- - eor #$3 - iny - cpy #(30-8) - bcc :-- - - lda #$24 - sta $2006 - lda #$00 - sta $2006 - lda #$00 - ldy #30 - : - ldx #32 - : - sta $2007 - clc - adc #1 - and #3 - dex - bne :- - clc - adc #1 - and #3 - dey - bne :-- - - lda #0 - ldy #4 - : - ldx #16 - : - sta $2007 - dex - bne :- - - clc - adc #%01010101 - dey - bne :-- - - rts - mul_x: cmp #0 beq @zero