Page 1 of 1
Sedoric or not, overlay or not
Posted: Sun Jan 13, 2019 11:37 pm
by Symoon
Hi,
I'm currently working at faster CSAVE routines, but I would love them to work:
- on Oric-1
- on Atmos
- with or without Sedoric
As these routines are making calls to the oric ROM, I'd need to test before it runs:
- if Sedoric is loaded (any version!)
- if so, if the overlay RAM is set
- so I can finally set the Oric ROM and check if it's a ROM 1.0 or 1.1.
Has anyone ever been this road before?
Which RAM/ROM locations could I check that would give me reliable information for these tests ? Is there a "magical" byte that could work for all situations?
Re: Sedoric or not, overlay or not
Posted: Mon Jan 14, 2019 12:21 am
by Symoon
OK, found something: $C800 seems a good candidate.
= 00 => ROM 1.0
= 4E => ROM 1.1
= 07 => Sedoric 3 or 4 overlay
= 09 => Sedoric 1 overlay
mmmmh, haven't checked Sedoric 2 yet, but I'd prefer finding the same value whatever Sedoric is running.
$C980
AA => ROM 1.0
A5 => ROM 1.1
48 => Any Sedoric overlay RAM.
Now, just need a reliable test to be sure Sedoric is running (and not some other DOS)
Re: Sedoric or not, overlay or not
Posted: Thu Jan 17, 2019 2:22 pm
by Symoon
Symoon wrote: ↑Mon Jan 14, 2019 12:21 am
Now, just need a reliable test to be sure Sedoric is running (and not some other DOS)
Well, no time to check other DOS, but I'll rely on this to check if Sedoric is in RAM:
This checks if the 'PHP' op-code is in RAM in $0477. It's the 1st byte of the Sedoric routine to switch to overlay RAM.
I guess it's specific enough not to be used by another DOS.
Re: Sedoric or not, overlay or not
Posted: Thu Jan 17, 2019 6:28 pm
by iss
My first idea was to check the IRQ vector, but this check will be not reliable and may easily fail.
The best option to detect the RAM overlay is to check if some address is writable - something like this:
Code: Select all
lda $c000
eor #$ff
sta $c000
cmp $c000
bne rom_activ
; ram active -> restore the value
eor #$ff
sta $c000
jsr switch_to_rom
rom_activ
rts
Maybe you will not like it because it's too long, but it will definitely work
.
... and now when I think again ... are you sure you really need to detect RAM?
In theory it's possible, but in practice how this would happen that your code is called with RAM enabled?
Re: Sedoric or not, overlay or not
Posted: Thu Jan 17, 2019 7:42 pm
by Symoon
Actually when exectuing my prrogram, I have no idea if the Overlay RAM is ON or not. Depends on what Sedoric just did before, I think.
So here's a draft of code written in a rush (as usual, forgive the syntax, I'm only slowly adopting standards
)
Code: Select all
--- Check if RAM overlay is ON, and ROM type (1.0 or 1.1)
LDA #$00 'initialize overlay RAM flag
STA xx
LDA $C980 'AA=ROM 1.0; A5=ROM 1.1; 48=Any Sedoric overlay RAM
CMP #$48 'Overlay RAM ON ?
BNE +xy
STA xx 'set overlay RAM flag <> 0
JSR $04F2 'set ROM
LDA $C980 'load byte again, with ROM this time
CMP #$AA 'Oric-1 ?
BNE +xy
JSR xxxx 'adapt code to Oric-1
--- Check if Sedoric is in RAM
LDA $0477 'check the 'PHP' command is in RAM
CMP #$08 '(Sedoric program to swith to overlay RAM)
BEQ +x 'found: continue program
else display error message and RTS ('SEDORIC only')
--- Oric-1 adaptation
...
--- end of program
LDA xx 'get overlay RAM flag
CMP #$48 'Overlay RAM was ON before executing the program ?
BNE +3
JSR $04F2 'if yes, set RAM Overlay back
RTS
This is not very reliable, and I should especially check with other DOS what values are in the locations I'm using.
Oh and BTW, this time, code size doesn't really matter
Re: Sedoric or not, overlay or not
Posted: Wed Mar 27, 2019 9:35 am
by Symoon
Back to the subject.
ISS, your solution is, I think, the most reliable! The same idea is used in Oric ROMs to check if it's a 16K or 48K model.
Re: Sedoric or not, overlay or not
Posted: Wed Mar 27, 2019 10:22 am
by iss
... and shorter version:
Code: Select all
lda $c000
inc $c000
cmp $c000
beq rom_activ
; ram active -> restore the value
sta $c000
jsr switch_to_rom
rom_activ
rts
Re: Sedoric or not, overlay or not
Posted: Wed Mar 27, 2019 11:21 am
by Symoon
Thanks, I had programmed a shorter version too, with INC and DEC