[Coco] MultiBoot - multiple boot files on one disk (can someone dis-asm this for me?)
Sean Conner
sean at conman.org
Mon Mar 3 20:36:05 EST 2025
It was thus said that the Great Allen Huffman via Coco once stated:
> One of out utilities I was most proud of was MultiBoot. “Back in the day”
> when you had different boot floppies (for the BBS with those drives, for
> the hard drive, for the Sierra games, etc.) Terry and I came up with an
> idea of swapping the os9boot file out dynamically. MultiBoot was the
> result. Type “DOS” and a menu comes up showing the boot files on the disk.
> Select one and go. One disk, multiple boot files (up to 16, space
> permitting, if I recall).
>
> Terry wrote the RS-DOS portion that lives on the “DOS” track, and the code
> it ran from there, and I wrote the OS-9 frontend. You’d point it to a disk
> with multiple os9boot files and add the ones you wanted.
>
> Unfortunately, I do not have Terry’s assembly source — but I do have the
> data that made it up:
>
> char mb_sec34_1[] = { /* Terry's RS-DOS DOS startup code... 50 bytes */
> 79,83,134,13,151,211,204,56,0,221,209,12,211,142,0,234,204,2,0,237,132,
> 134,33,214,211,237,2,220,209,237,4,173,159,192,4,109,6,38,8,76,129,61,37,
> 221,126,57,0,126,215,9
> };
>
> Is there anyone out there who might do me a favor of turning this back
> into the assembly? I’d like to include it with the GitHub repo I am
> putting together of all the Sub-Etha Software stuff.
Here's the assembly for the above data:
inbuf equ $D1
sector equ $D3
DCOPCv equ $EA
DCOPC equ 0
DCDRV equ 1
DCTRK equ 2
DSEC equ 3
DCPBT equ 4
DCSTA equ 6
startup clra ; ???
comb ; ???
lda #13 ; starting sector - 1
sta sector
ldd #$3800 ; buffer address
again std inbuf ; save updated buffer ptr
inc sector
ldx #DCOPCv ; smaller than LDX [$C006]
ldd #READ*256+0 ; read op, drive 0
std DCOPC,x ; tell RS-DOS
lda #33 ; track 33
ldb sector ; get sector number
std DCTRK,x ; tell RS-DOS
ldd inbuf ; get buffer
std DCBPT,x ; tell RS-DOS
jsr [DSKCON]
tst DCSTA,x ; check status
bne done
inca ; adjust buffer
cmpa #$3D ; are we done? (last address $3CFF)
blo again ; if not, continue
jmp $3900 ; jump to starting code
done jmp $D709 ; report I/O error to BASIC
I'm puzzled by the first two instructions, which do nothing. I'm also
curious that it loads data off the last five sectors of track 33. The DOS
track is track 34, not 33, and it's an entire track, and a granual in RS-DOS
is 9 sectors, not 5.
I haven't fully disassembled the larger blob as it looks like it'll take
more work as there appear to be gaps in the instruction stream. Do you
recall which address the other blob was assembled to?
-spc
More information about the Coco
mailing list