Page 1 of 1

Screen base in plotting code issue

Posted: Wed Dec 09, 2020 10:17 am
by Kitsune Mifune
Hi,

Thought I'd jump back on here as I have a specific question regarding the screen plotting code from the Lesson 6 video (Lookup tables).

My question is, do the screen bases in that code just tell the program where to draw the graphics? Or does it actually set the visible screen?

I'm asking because I'm trying to draw a sprite to memory location &4000 (away from the visible screen, which is manually set at &C000 by setting Reg 12 of the CRTC to &30 which I believe is &C000), but it seems to be spilling over to the visible screen every 8 lines and then going back again (see picture link below).

https://drive.google.com/file/d/15vrQ5t ... sp=sharing

There's nothing in my code that points to &C000 (bar CRTC Reg 12) so I'm unsure what's happening. All I've done is set the main screen base in the plotting code to &40 and the jump back to the top to &4040 (256 wide screen). In fact, it seems to spill over to the visible screen no matter what base address I put in, or even what the CRTC Register is set to.

I've made some great leaps and bounds in the last while with my coding and my game, but this has stumped me for about 4 days now, so any help would be great!

Thanks!

Re: Screen base in plotting code issue

Posted: Sun Dec 13, 2020 6:19 am
by akuyou
Looking at the glitch I think you need to change your newline code when you alter the screen base, For example here's the code I use for the screen base being &C000/&8000

The Bit 7 check will only work for the &C000 screen, it needs to be set to Bit 6 if the screen is at &8000
I'm not sure what it would need to be for a screen at &4000 - it's not a configuration I use as this basically makes using the extra 128k ram for sprites impossible.

I don't think the firmware functions can cope with a screen base anywhere except the default, so if you're using &BC26, you will have a problem

Code: Select all

GetNextLine:
	push af

		ld a,h		;Add &08 to H (each CPC line is &0800 bytes below the last
		add &08
		ld h,a
			;Every 8 lines we need to jump back to the top of the memory range to get the correct line
			;The code below will check if we need to do this - yes it's annoying but that's just the way the CPC screen is!
		bit 7,h		;Change this to bit 6,h if your screen is at &8000!
		jp nz,GetNextLineDone
		push bc
			ld bc,&c050	;if we got here we need to jump back to the top of the screen - the command here will do that
			add hl,bc
		pop bc
	GetNextLineDone:
	pop af
	ret
Update:
Ok, I set up a test program, and bit 6,h seems to work

sample attached

Re: Screen base in plotting code issue

Posted: Mon Dec 14, 2020 12:14 pm
by Kitsune Mifune
Cheers Keith!

I've been messing around with Bank Switching using the Gate Array (just for practise, not in this current code), so that makes a lot of sense now that you say it, given the &4000 range.

I'm not using the Firmware at all now except to change the border colour and set the palette on initialisation, but I was thinking about getting rid of that too at some point as I now know how to do it by talking directly to the Gate Array (although it only works if I disable all the interrupts).

Anyway, I'm rambling. Thanks for the example. I'll look at it when I get in tonight. :)

Re: Screen base in plotting code issue

Posted: Tue Dec 15, 2020 2:57 pm
by Kitsune Mifune
Just a follow up:

Yep it seems to be working now, and it was the jump back address and the bit check. I was setting the jump back address to &4040, but just leaving it at &C040 and setting only the base address to &40 works.

Code: Select all

GETSCREENPOS:					; Return memory pos in HL of screen co-ord B,C (X,Y)

	push bc
		ld b,0				; Load B with 0 because we only want C
		ld hl,SCREEN_ADDRESS_TABLE
		add hl,bc			; We add twice, because each address has 2 bytes
		add hl,bc

		ld a,(hl)	
		inc l				;INC L not INC HL because we're byte aligned to 2
		ld h,(hl)
		ld l,a
	pop bc
		ld c,b				; Load the Xpos in ('b') into 'c'	
		ld a,(SCREEN_BASE)		; Our table is relative to 0 - so we need to add our screen base (&40)
		ld b,a
		add hl,bc			; This is so it can be used for alt screen buffers
RET

GETNEXTLINE:
		ld a,h
		add a,&08
		ld h,a
		bit 6,h				
		RET nz				

		ld bc,&C040			; If we got here we need to jump back...
		add hl,bc			; ...to the top of the screen - the command here will do that
RET
I also set up a little key press code in a loop to flick between the two ranges at &4000 and &C000 by changing CRTC Reg12 and it works quite well now, so I can see what's on both.

Code: Select all

LOOP:
		ld a,1			; RIGHT CURSOR KEY
		call &BB1E
		jr z, nopress1
			ld bc,&BC0C
			out (c),c	; Choose register (CRTC - R12)
			inc b
			ld a,&10
			out (c),a	; Send Value (&10 = &4000)
		nopress1:

		ld a,8			; LEFT CURSOR KEY
		call &BB1E	
		jr z, nopress2
			ld bc,&BC0C
			out (c),c	; Choose register (CRTC - R12)
			inc b
			ld a,&30
			out (c),a	; Send Value (&30 = &C000)
		nopress2:
	jr LOOP
	
Cheers for the help! :)