www.retrosoftware.co.uk
http://www.retrosoftware.co.uk/forum/

Changing to a custom screen mode
http://www.retrosoftware.co.uk/forum/viewtopic.php?f=73&t=908
Page 1 of 1

Author:  jbnbeeb [ Mon Jun 09, 2014 6:07 pm ]
Post subject:  Changing to a custom screen mode

Hi,
I first asked about this at the bottom of a previous thread.. but it was kind of a thread derail.. and I'm still stuck on this problem :)

http://www.retrosoftware.co.uk/forum/viewtopic.php?f=73&t=881

My objective: to change from a regular screen mode -- such as Mode 7 - to a custom 8k screen mode (which is a 128x256 pixel screen based on Mode 5). I want to be able to do this without wiping the memory between &5800 and &6000.

What is working: I can get an "8k MODE 5" by first changing to MODE 5 and then setting values in CRTC for 128x256 pixel screen and the screen start addr to &6000

What isn't working: By changing to Mode 5 first, I wipe the memory between 5800-6000. To try to resolve this, starting from Mode 7, I do the following:

a) clearing screen by writing zeroes to 6000-8000
b) setting all CRTC values to reflect an 8k mode 5 (ie keep the params to those in the Advanced User Guide for Mode 5 except chars per line and screen address)
c) Set the video ula &FE20 to &C4 (ie Mode 5)
d) Set the palette register to default mode 5 values by issuing VDU 20 (lda #20;jsr oswrch)
e) Set addressable latch for 8k screen:
ldx #4+8 : stx SysViaRegB \\ these two set the
ldx #5+0 : stx SysViaRegB \\ screen size to 8k


RESULT: the screen clears, but when plotting pixels, I get distorted results - essentially fragments of MODE 7 text characters in the area where pixels should be plotted..within an 8k screen area.. ie 32x32 char screen.

Where am I going wrong? Is what I'm aiming for possible?

Author:  TomW [ Mon Jun 09, 2014 8:51 pm ]
Post subject:  Re: Changing to a custom screen mode

Sound like the OS is re-programming the video ULA behind your back. Either use OSBYTE &9a to change the ULA control register, write to the shadow copy at &248 as well as &fe20, or disable interrupts and bin the OS.

Author:  jbnbeeb [ Tue Jun 10, 2014 6:07 pm ]
Post subject:  Re: Changing to a custom screen mode

Thanks Tom. Looks like that is what was happening.
I used OSBYTE &9A which did the trick, mostly.

I then got a blank white screen. Issuing VDU 19 OSWORD calls to change the palette didn't work properly.

I realised this was because VDU workspace wasn't being initialised to what I needed - i.e values suitable for MODE 5, which is pretty much what the 8k mode I'm using is, albeit 128x256 pixels. So I took a look at the memory layout notes in the AUG and fudged a few values so that the VDU 19 OSWORD calls worked correctly. Code snippet below for those who might be interested :)


Code:
;Set (fudge) VDU Workspace values
   ;________________________________________________________________
   .VduWorkspace
   lda #5   ; Record screen mode . We're actually setting up a custom 8k screen mode - but it's based on mode 5.
          ; We do this so the VDU 19 OS routines called below set the palette correctly.
   sta &355 ; The OS refers to this mem location in VDU routines. See p277 AUG.

   lda #3   ; Record number of logical colours minus one.
          ; We do this so the VDU 19 OS routines called below set the palette correctly.
   sta &360 ; The OS refers to this mem location in VDU routines. See p277 AUG

   lda #16  ; Record 16 bytes per character.
          ; We do this so the VDU 19 OS routines called below set the palette correctly.
   sta &34f ; The OS refers to this mem location in VDU routines. See p276 AUG
   ;________________________________________________________________


<snip>
;VDU 19 calls
   ;________________________________________________________________
   ;We need to set the logical colours ourselves,
   ;even if we wanted the defaults for a 4 colour screen.
   ;This is because we have set our own screen mode without
   ;calling the normal OS routines which would initialise everything
   ;like colour defaults for us.
   
   .vdu19
   ;Logical col 0 = blue
   lda #&0c         ; OSWORD call for VDU 19
   LDX #c0 MOD 256   ; param
   LDY #c0 DIV 256     ; block
   jsr osword

.
.
.
<snip>
 


TomW wrote:
Sound like the OS is re-programming the video ULA behind your back. Either use OSBYTE &9a to change the ULA control register, write to the shadow copy at &248 as well as &fe20, or disable interrupts and bin the OS.

Author:  tricky [ Tue Jun 10, 2014 10:25 pm ]
Post subject:  Re: Changing to a custom screen mode

Glad you got it sorted, I can "go straight to the metal", but have only learned one OSBYTE call (1 - or is it 0)!

Page 1 of 1 All times are UTC [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/