The Commodore 128 was marketed as being “three computers in one”. I guess technically they were correct when they made that statement. Although I’m very find of the native 128 mode, the system saw its uses mostly as a games machines in C64 mode. I don’t recall anybody ever looking at CP/M mode longer than half an hour (if that).
There are three ways to put the C128 into C64 mode. Two of which I always knew about, ever since my friend Frank Jagow bought himself a whole C128 system from his paper route money in 1986. But the third option’ve only recently learnt about – after over 30 years of being a C128 fanboy. How exciting!
Here are all three options.
Option 1: C= Key + RESET
Hold down the C= key (Commodore key, bottom left), then reset or turn on the machine. This will boot the C128 in C64 mode.
At the same time, a connected 1571 drive will automatically be switched into 1541 compatibility mode. This can be useful if your game relies on a real 1541 drive (for whatever reason), or if you have a broken 1571 on which the seance read/write head isn’t working well.
Option 2: GO 64 command
From the C128 BASIC prompt, either in 40 or 80 column mode, issue the GO 64 command.
In direct mode, the system will ask “are you sure?”, to which you answer “y” followed by the return key. You can also type anything beginning with the letter y instead (for example, “yeah man – what a great idea”).
And omit the space between GO and 64 if you’re in a hurry by all means.
Note that this command will leave a potentially attached 1571 drive in its native 1571 mode. As a result, it will be able to format and access a double sided floppy from within C64 mode. However, programmes that rely on a native 1541 may encounter problems as a result.
Fun fact: you can also use GO 64 from within a BASIC programme. While the “are you sure” question won’t be displayed, and the system boots into C64 mode fine, there is of course nothing left in memory to execute at the other end.
Option 3: SYS 57931
The third option I’ve only recently discovered in a post by Maurizio Sorrentino on the C128 Enthusiasts FaceBook page.
We can call the machine language routine directly with SYS 57931 (or $E24B in hex). There’s no question whether you’re sure or not, much like issuing GO 64 in a BASIC programme. The result is the same: your C128 will think for a couple of seconds, then come back with deep blue colours on the 40 column display.
How does it work?
Good question! I’d love to find that out myself, but haven’t had time to dissect the code yet.
Here’s what that routine does:
. fe24b a9 e3 lda #$e3 . fe24d 85 01 sta $01 . fe24f a9 2f lda #$2f . fe251 85 00 sta $00 . fe253 a2 08 ldx #$08 . fe255 bd 62 e2 lda $e262,x . fe258 95 01 sta $01,x . fe25a ca dex . fe25b d0 f8 bne $e255 . fe25d 8e 30 d0 stx $d030 . fe260 4c 02 00 jmp $0002 . fe263 a9 f7 lda #$f7 . fe265 8d 05 d5 sta $d505 . fe268 6c fc ff jmp ($fffc) . fe26b a2 03 ldx #$03 . fe26d 8e c0 0a stx $0ac0 . fe270 a9 00 lda #$00 . fe272 9d c1 0a sta $0ac1,x . fe270 a9 00 lda #$00 . fe272 9d c1 0a sta $0ac1,x . fe275 ca dex . fe276 10 fa bpl $e272 . fe278 85 9e sta $9e . fe27a a0 09 ldy #$09 . fe27c ae c0 0a ldx $0ac0 . fe27f bd bc e2 lda $e2bc,x . fe282 85 9f sta $9f . fe284 bd c0 e2 lda $e2c0,x . fe287 85 02 sta $02 . fe289 a6 02 ldx $02 . fe28b a9 9e lda #$9e . fe28d 20 d0 f7 jsr $f7d0 . fe290 d9 bd e2 cmp $e2bd,y . fe293 d0 21 bne $e2b6 . fe295 88 dey . fe296 c0 07 cpy #$07 . fe298 b0 ef bcs $e289 . fe29a a6 02 ldx $02 . fe29c a9 9e lda #$9e . fe29e 20 d0 f7 jsr $f7d0 . fe2a1 ae c0 0a ldx $0ac0 . fe2a4 9d c1 0a sta $0ac1,x . fe2a7 c9 01 cmp #$01 . fe2a9 d0 0b bne $e2b6 . fe2ab a5 9e lda $9e . fe2ad a4 9f ldy $9f . fe2af 85 04 sta $04 . fe2b1 84 03 sty $03 . fe2b3 20 cd 02 jsr $02cd . fe2b6 ce c0 0a dec $0ac0 . fe2b9 10 bf bpl $e27a . fe2bb 60 rts
It may end somewhere before the RTS, possibly at the jump to $0002. See if you can make head or tail of it, and let me know if you do.
Anyway, those are the three methods of how to put your Commodore 128 into 64 mode.
That C64 mode routine:
. fe24b a9 e3 lda #$e3
. fe24d 85 01 sta $01
. fe24f a9 2f lda #$2f
. fe251 85 00 sta $00
. fe253 a2 08 ldx #$08
. fe255 bd 62 e2 lda $e262,x
. fe258 95 01 sta $01,x
. fe25a ca dex
. fe25b d0 f8 bne $e255
. fe25d 8e 30 d0 stx $d030
. fe260 4c 02 00 jmp $0002
. fe263 a9 f7 lda #$f7
. fe265 8d 05 d5 sta $d505
. fe268 6c fc ff jmp ($fffc)
Put E3 into 01 (11100011) – data register for the 8502 on chip I/O port.
Put 2F into 00 (00101111) – data direction register for 8502 on chip I/O port.
Put 00 into D030 – CPU clock speed register
The routine copies 8 bytes from E263-E26A to 0002 and executes them there.
Put F7 into D505 (11110111) – MMU mode configuration register
Jump to (FFFC) – reset vector
Awesome – thank you for translating this into “human” for us. I always wondered what that routine did.