CPCWiki forum

General Category => Programming => Topic started by: litwr on 23:11, 11 September 16

Title: How to get screen MODE?
Post by: litwr on 23:11, 11 September 16
What is the best way to get it?  I am going to use PEEK(&b7c3)... However it will not work with CPC464 or maybe with PLUS models.  :( Thanks.
Title: Re: How to get screen MODE?
Post by: SRS on 23:17, 11 September 16
not sure if it works on all cpc, but this may help:

CALL &BC11
SCR GET MODE
ActionGets the current screen mode
EntlyNo entry conditions
ExitIf the mode is 0, then Carry is true, Zero is false, and A contains 0; if the mode is 1, then Carry is false, Zero is true, and A contains 1; if the mode is 2, then Carry is false, Zero is false, and A contains 2; in all cases the other flags are corrupt and all the other registers are preserved
Title: Re: How to get screen MODE?
Post by: AMSDOS on 12:29, 12 September 16
I'm assuming @litwr (http://www.cpcwiki.eu/forum/index.php?action=profile;u=1057) wants to get the screen mode without using the Firmware, though those Addresses mean nothing if the Firmware is disabled, though I was wondering how one detects which CPC is being used years ago, which this thread (http://www.cpcwiki.eu/forum/programming/detecting-which-cpc-i'm-using/) has a pile of answers in it.
Title: Re: How to get screen MODE?
Post by: andycadley on 13:50, 12 September 16
I'm assuming @litwr (http://www.cpcwiki.eu/forum/index.php?action=profile;u=1057) wants to get the screen mode without using the Firmware, though those Addresses mean nothing if the Firmware is disabled, though I was wondering how one detects which CPC is being used years ago, which this thread (http://www.cpcwiki.eu/forum/programming/detecting-which-cpc-i'm-using/) has a pile of answers in it.
You can't find out from the hardware, the only way is to keep track of what value you last sent to the gate array (which is how the firmware call knows). If you need to know what mode you're in from something that is going to disable the firmware (but doesn't reset the mode itself) then you'll need to call SCR GET MODE before disabling the firmware and then keep that value up to date yourself.
Title: Re: How to get screen MODE?
Post by: litwr on 13:54, 12 September 16
I want to get this mode inside Basic program.  The call to &BC11 looks a bit difficult... How to use these flags in Basic?  It is a bit odd that fine Locomotive Basic misses a useful statement. :( Commodore Basics above 3.5 have RGR statement for this.
Title: Re: How to get screen MODE?
Post by: CECPC on 14:19, 12 September 16
I want to get this mode inside Basic program.  The call to &BC11 looks a bit difficult... How to use these flags in Basic?  It is a bit odd that fine Locomotive Basic misses a useful statement. :( Commodore Basics above 3.5 have RGR statement for this.
If the address is common for all CPC Basic versions...

CpcAlive is a programming environment Amstrad CPC compatible. (http://www.cpcalive.com/docs/amstrad_cpc_6128_memory_map.html)

Then &B7C3 should cointain MODE value.
Try with PEEK(&B7C3)

In any case, Firmware routine seems more secure. With a small assembler in the basic (memory+pokes) you should be able to read the value.
Title: Re: How to get screen MODE?
Post by: SuTeKH/Epyteor on 14:22, 12 September 16
I want to get this mode inside Basic program.  The call to &BC11 looks a bit difficult... How to use these flags in Basic?  It is a bit odd that fine Locomotive Basic misses a useful statement. :( Commodore Basics above 3.5 have RGR statement for this.
Try this... I've tested it on my own 6128 (and WinAPE), but not on any other CPC!

Code: [Select]
10 MODE 1
20 FOR Address=&A000 to &A007
30 READ Byte$
40 POKE Address,VAL("&"+Byte$)
50 NEXT Address
60 CALL &A000
70 ScreenMode=PEEK(&A007)
80 PRINT "MODE";ScreenMode
90 END
100 DATA CD,11,BC,32,07,A0,C9,00

Change line 10 to whichever MODE you want to test! ENJOY!

EDIT: The assembler code incase anyone is wondering! (Not as if it's difficult to work out! ^_^)

Code: [Select]
        org    &a000

        call    &bc11
        ld    (Address),a
        ret

.Address    defb    &00
Title: Re: How to get screen MODE?
Post by: andycadley on 14:49, 12 September 16
Well, it looks like SuTeKH has beaten me to it, but I'll post my version as the M/C is fully relocatable which might be useful to some.

Code: [Select]
10 gosub 9000 : rem setup routine
20 let m% = 0
30 call getmode, @m%
40 print m%
50 end
9000 symbol after 256
9010 let getmode = himem - 11
9020 memory getmode -1
9030 restore 9090
9040 for i% = 0 to 10
9050 read x%
9060 poke getmode + i%, x%
9070 next i%
9080 return
9090 data &cd,&11,&bc,&dd,&6e,&00,&dd,&66,&01,&77,&c9

And the assembly:
Code: [Select]
call &bc11
ld l,(ix+0)
ld h,(ix+1)
ld (hl),a
ret
Title: Re: How to get screen MODE?
Post by: PulkoMandy on 15:04, 12 September 16

And here is a "pure BASIC" solution, just for fun:

Code: [Select]
10 POKE &C000,0
30 PLOT 0,400,15
40 a=PEEK(&C000)


This will make the firmware draw a pixel at the top left of the screen, using pen 15. Depending on the mode, the byte will have different values. We then read it using PEEK, and we test the value (&80 for mode 2, and I think &88 for mode 1 and &AA for mode 0).
Title: Re: How to get screen MODE?
Post by: Urusergi on 17:05, 12 September 16
A great trick  8) but it's out of range:

Code: [Select]
10 POKE &C000,0
30 PLOT 0,399,15
40 a=PEEK(&C000)
Title: Re: How to get screen MODE?
Post by: litwr on 19:18, 12 September 16
Thanks!  :) However it would be a bit better to have a proper word in Basic.  ;)
Title: Re: How to get screen MODE?
Post by: AMSDOS on 22:33, 12 September 16
You can't find out from the hardware, the only way is to keep track of what value you last sent to the gate array (which is how the firmware call knows). If you need to know what mode you're in from something that is going to disable the firmware (but doesn't reset the mode itself) then you'll need to call SCR GET MODE before disabling the firmware and then keep that value up to date yourself.

Looking at all the replies it appears there's all sorts of tricks you could do to find out the screen mode.  :)
Title: Re: How to get screen MODE?
Post by: arnoldemu on 22:39, 12 September 16
Thanks!  :) However it would be a bit better to have a proper word in Basic.  ;)
i there a basic command to make a sprite and move it on the screen in commodore basic?
Title: Re: How to get screen MODE?
Post by: andycadley on 22:48, 12 September 16
Thanks!  :) However it would be a bit better to have a proper word in Basic.  ;)

I assume the thinking was that since the graphics commands in Basic are meant to be resolution independent, there would be little call for actually knowing the screen mode via a command.

Looking at all the replies it appears there's all sorts of tricks you could do to find out the screen mode.  :)

They all fundamentally rely on the fact the firmware is keeping track of the mode, if it wasn't then PLOT wouldn't be able to write different values to the display depending upon the current mode. The hardware itself doesn't provide any mechanism for determining a change "after the fact"
Title: Re: How to get screen MODE?
Post by: andycadley on 22:51, 12 September 16
i there a basic command to make a sprite and move it on the screen in commodore basic?

POKE. :P

But then the C64 doesn't actually have any graphics commands in basic at all! Things like RGR appear on later machines like the Plus 4, which didn't have sprites IIRC.
Title: Re: How to get screen MODE?
Post by: arnoldemu on 23:15, 12 September 16
POKE. :P

But then the C64 doesn't actually have any graphics commands in basic at all! Things like RGR appear on later machines like the Plus 4, which didn't have sprites IIRC.
exactly!

CPC Basic lacks RGR, and Commodore BASIC lacks basic commands for sprites!
So neither BASIC is perfect.  :D



Title: Re: How to get screen MODE?
Post by: AMSDOS on 03:24, 13 September 16

They all fundamentally rely on the fact the firmware is keeping track of the mode, if it wasn't then PLOT wouldn't be able to write different values to the display depending upon the current mode. The hardware itself doesn't provide any mechanism for determining a change "after the fact"

Yep, so the screen mode would have to be obtained before disabling the firmware. Normally you would only do this if you wanted to return back to BASIC in the mode it was in usually. Using the hardware has little need for it, which I presume the reason why it hasn't got it.
Title: Re: How to get screen MODE?
Post by: litwr on 20:28, 14 September 16
i there a basic command to make a sprite and move it on the screen in commodore basic?
C16/+4 have no hardware sprites  (so as CPC6128).  C128 Basic has such commands.  Locomotive Basic is fast but misses several good commands.
I used CPC6128, PCW8256 and PCW9512.   :)  They are good PC, maybe the best z80 based PC.  The problem of 6502/6809 based PC that they might be better but were often restricted artificially.  For example, C128 might be 2 times faster and use 256 KB memory.  Z80 had much better support...  IMHO it was a bit unfair.
Title: Re: How to get screen MODE?
Post by: ZbyniuR on 18:51, 17 September 16
Pure BASIC solution for any CPC:

10 IF PEEK(&BB5B)=0 THEN m=PEEK(&B1C8) ELSE m=PEEK(&B7C3)