From eba439a3ba05a89b415d22f261b6dde269cc9783 Mon Sep 17 00:00:00 2001 From: Simon Owen Date: Sun, 8 Jan 2012 01:44:59 +0000 Subject: [PATCH] Improved tunnel trimming The old method used a mix of black attributes and data masking to trim sprites at the screen edges, with every sprite trimmed separately. The new method no longer uses attributes, so it's compatible with the colour version. It also finds the extent of the trim block for all sprites, for more efficient clearing. --- pacemuzx.asm | 102 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 40 deletions(-) diff --git a/pacemuzx.asm b/pacemuzx.asm index dd9baf5..8e007da 100644 --- a/pacemuzx.asm +++ b/pacemuzx.asm @@ -1589,65 +1589,87 @@ ENDIF ; Trim sprites that overlap the maze edges, as the real hardware does automatically ; Here we trim partial bytes, as full blocks are hidden behind black on black attrs ; -do_trim: ld de,&5062 ; start of sprite data - ld b,&07 ; 7 sprites to check +do_trim: ld hl,&5062 ; sprite x for first sprite + ld de,&ff00 ; no trim yet + ld b,7 ; 7 sprites to check -trim_lp: ld a,(de) ; sprite x - inc e - cp &10 ; hidden sprite? - jr c,no_trim +trim_lp: ld a,(hl) ; sprite x + inc l + cp &10 ; hidden? + jr c,trim_next cp &20 ; clipped at right edge? jr c,may_trim cp &f0 ; clipped at left edge? - jr nc,may_trim -no_trim: inc e + jr c,trim_next + +may_trim: ld a,(hl) ; sprite y + cp &10 ; hidden? + jr c,trim_next + + cp d ; compare min + jr nc,no_trim_min + ld d,a ; update min +no_trim_min: cp e ; compare max + jr c,trim_next + ld e,a ; update max + jr trim_next + +trim_next: inc l ; skip sprite y djnz trim_lp - ret -may_trim: ld a,(de) ; sprite y - cp &10 ; hidden sprite? - jr c,no_trim + ld a,e ; max + and a + jp z,page_rom ; zero means no trim + sub d ; subtract min to give block + add a,12 ; add sprite height to give span + ld b,a ; line count for trim - ld e,12 ; height of sprite - ld hl,&4f45 ; left of tunnel - cp &8c ; sprite y for tunnel? - jr z,trim_edge - ld e,24 ; height of 2 sprites - ld hl,&4d65 ; left of intermission row -trim_edge: - ld a,h - or ixh ; offset to current screen + ld l,e ; top line, due to mirrored y! + ld h,conv_y/256 + ld l,(hl) ; convert y to Speccy line + ld h,scradtab/256 + ld c,(hl) ; LSB of line start + inc h + ld a,(hl) ; MSB of line start + add a,ixh ; current screen offset ld h,a + ld l,c - ld a,%00000100 ; +3 normal paging, R3/5/2/7 - ld bc,&1ffd - out (c),a ; normal paging (screen) + call page_screen - ld b,e ; line count - ld de,&03fc ; masks for below + ld de,&0300 ; D=left mask, E=clear byte +trim_r_lp: ld c,l ; save line start LSB -trim_line_lp: ld a,(hl) - and d ; clear 6 pixels - ld (hl),a - ld c,l - ld a,l - add a,&15 ; advance to right edge + ld a,c + add a,4 ld l,a + + ld (hl),e ; full byte to trim 6 pixels + inc l ld a,(hl) - and e ; clear 2 pixels + and d ; trim 6 pixels at maze left ld (hl),a - ld l,c ; restore left position + + ld a,c + add a,26 ; right tunnel offset + ld l,a + + ld a,(hl) + and &fc ; trim 2 pixels at maze right + ld (hl),a + inc l + ld (hl),e ; full byte + inc l + ld (hl),e ; full byte for final 2 pixels + + ld l,c ; restore original LSB inc h ; next line ld a,h and %00000111 call z,blockdown_hl - djnz trim_line_lp - ld a,%00000001 ; +3 special paging, banks 0/1/2/3 - ld bc,&1ffd - out (c),a ; page ROM - - ret + djnz trim_r_lp + jp page_rom ; Clear a sprite-sized hole, used for blank tiles in our fruit and lives display