• Please review our updated Terms and Rules here

AlphaMicro Systems AM1000, AM1200, & maybe AM100L drive replacement

Mike,

While trying to be helpful, how are you defining “after boot”, Amosl.MON (or what-ever.MON) actually gets and executes AMOS??.INI. I can verify it if it’s important, but FYI I’m pretty sure the booting file access goes:

1) BADBLK.SYS from proms
2) AMOSL.MON from proms
3) AMOSL.INI from AMOSL.MON

The only source I have is from 1.1a, but recall that held through 1.X.

Curbie
 
In the emulator the (current) boot process is:
1- ignore any BADBLK.SYS 'cause I dont think they would be relevant in any 'container' of disk images; ie the containers are list of valid logical blocks probably copied from real hard drive.
2- find and copy DSK0:AMOSL.MON[1,4] (or whatever other monitor is specified in the emulator's ini file) into ram.
3- if the ini file request it, copy a disk driver from DVR: into the loaded monitor. Sorta like MONGEN.
4- if the ini file requests it, change the AMOSL.INI file name in the loaded monitor. Sorta like MONTST.
5- transfer control to the loaded & modified monitor at the same low ram address MONTST uses.

The proposed boot process modification is:
* Modify step (3) to allow the disk driver to come from host memory instead of DVR: and
* Add a new (6) step to catch the first FETCH the loaded monitor issues (which will be for AMOSL.INI or whatever it was modified to) and, instead of allowing the monitor to do the fetch copy my own .INI file from host memory into emulator ram. The monitor won't know this happened and will happily start running my file instead if the one it asked for. That also makes step (4) irrelevent.
 
My recollection of BADBLK.SYS processing is if BADBLK.SYS either has no blocks marked bad or is not found, no translation occurs, I think you're fine there.
My recollection is ZYSDVR: (DSK.DVR) is loaded into the .MON by MONGEN, I think the only time a request for a driver of any type would be made would be to for-fill load from disk requests by .INI execution. In thinking about this issue it would seem that your emulator is probably emulating boot proms, .MON, and some .
INI statements up to the SYSTEM statements.

You probably know this but technically, IIRC the monitor sets up normally, the loads and runs the .INI file as a command file which returns job control back to the user after command file execution completes.

Curbie
 
What type of disk image do you plan to support? I was thinking of taking a raw dd disk image from my running Eagle 300 or 400 (both 2.3a), but I also have the AlphaCD.

Incidentally, someone sent me a picture of some unidentified Alpha Micro ROMs (164-01 and 164-02 both rev D00). I've been scratching my head to think of what they came from. They're 4K, so they must be early - any guesses?
 
Last edited:
What type of disk image do you plan to support? I was thinking of taking a raw dd disk image from my running Eagle 300 or 400 (both 2.3a), but I also have the AlphaCD.

Incidentally, someone sent me a picture of some unidentified Alpha Micro ROMs (164-01 and 164-02 both rev D00). I've been scratching my head to think of what they came from. They're 4K, so they must be early - any guesses?
I think.your raw DD disk image will work fine.
VAM supports two kinds of images: the old single format & the new multi format.
The old format starts with a volume record, followed by MFD, bitmap, ...
The new format starts with a self definition record, followed by volume record, followed by MFD,... followed by next volume record, followed by MF...
The old format was used by pre L systems, and later by small capacity devices like floppys. Max size 32m.
The new format is used by later systems. I don't know their max size. The biggest I've seen was 450m (16 30m logicals).
I have no experiance with AlphaCD but I've heard they can't be mounted as a normal cd on a PC. Maybe they are effectively just DD images of new format??
 
Mike,

do you have the "new multi format" structure? I'm learning python and find that structure is one of my learning projects.
 
This should illustrate. Sorry, C, not python...

/*-------------------------------------------------------------------*/
/* vdkshow.c (c) Copyright Mike Noel, 2001-2023 */
/* */
/* This is part of an emulator for the Alpha-Micro AM-100 computer. */
/* It is copyright by Michael Noel and licensed for non-commercial */
/* hobbyist use under terms of the "Q public license", an open */
/* source certified license. A copy of that license may be found */
/* here: http://kicksfortso.com/Am100/license.html */
/* */
/*-------------------------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *vdkdsk[32];
long vdkoff[32]; // byteoffset of first block (relative of 0)
long vdkmax[32]; // max byteoffset (relative of vdkoff)
short drv_flag[32]; // bmsize & base file indicator
char drv_name[32][255];

void usage (void);
void vdkdvr_start (void);
void vdkdvr_show (void);
void vdkdvr_stop (void);
int vdk_analysis (FILE *in, int drv);


int main (int argc, char *argv[]) {

vdkdvr_start();

// vdkdvr_show();

vdkdvr_stop();

}


void usage (void){ // HaHa -- no way to get here!!
printf("vdkshow\n");
printf(" USAGE...\n");
printf(" \n");
printf(" Vdkshow is a program to display all the VAM logical\n");
printf(" drives in 'stacked' container(s).\n");
printf(" \n");
printf(" It takes no arguments.\n");
printf(" \n");
printf(" Based on the 'vdkdvr_analysis' routine from hwassit.c \n");
printf(" this utility operates on 'utl?\?-container' files, typically\n");
printf(" links to '.hda' or such real files, each of which may contain\n");
printf(" several logicals.\n");
exit(-1);
}


/*-------------------------------------------------------------------*/
/* Initialize the virtual disk driver... */
/*-------------------------------------------------------------------*/
void vdkdvr_start (void) {
int drv, err;

for (drv = 0; drv < 32; drv++) {
vdkdsk[drv] = NULL;
vdkoff[drv] = 0;
vdkmax[drv] = 0;
drv_flag[drv] = 0;
drv_name[drv][0] = '\0';
}
for (drv = 0; drv < 32; drv++) {
sprintf ((char *) &drv_name[drv][0], "utl%d-container", drv);
vdkdsk[drv] = fopen ((char *) &drv_name[drv][0], "r+");
if (vdkdsk[drv] != NULL) {
err = vdk_analysis(vdkdsk[drv], drv);
switch (err) {
case -5: // bitmap corrupt
case -4: // no label record
case -3: // to small or to big
case -2: // size not divisible by 512
fclose(vdkdsk[drv]);
case -1: // didn't open
drv_name[drv][0] = '\0';
break;
default:
drv += err-1; // bypass overlaps
}
}
else
drv_name[drv][0] = '\0';
}

vdkdvr_show();
}

/*-------------------------------------------------------------------*/
/* */
/*-------------------------------------------------------------------*/
void vdkdvr_show (void) {
int drv;
char c[514];

for (drv = 0; drv < 32; drv++) {
if (vdkdsk[drv] != NULL) {

if(drv_flag[drv] == 0) printf("- ");
else printf(" ");

printf("%02d ", drv);

fseek (vdkdsk[drv], vdkoff[drv], SEEK_SET);
fread (&c, 512, 1, vdkdsk[drv]);
printf("%-20s ", &c[4]);

printf("at %09ld ", vdkoff[drv]);
printf("to %09ld, ", vdkmax[drv]);
printf("Len %08ld", vdkmax[drv]-vdkoff[drv]);

if(drv_flag[drv] != 0)
printf(", BM=%d", drv_flag[drv]);

printf("\n");

}
}
}


/*-------------------------------------------------------------------*/
/* Stop the virtual disk driver... */
/*-------------------------------------------------------------------*/
void vdkdvr_stop (void) {
int drv;

for (drv = 0; drv < 32; drv++) {
if(drv_flag[drv] != 0)
if (vdkdsk[drv] != NULL) fclose (vdkdsk[drv]);
vdkoff[drv] = 0;
vdkmax[drv] = 0;
vdkdsk[drv] = NULL;
drv_flag[drv] = 0;
}
}


/*-------------------------------------------------------------------*/
/* */
/*-------------------------------------------------------------------*/
int vdk_analysis(FILE *in, int drv) {

static char lblflag[4] = {0xAA, 0xAA, 0x55, 0x55};

long HWBLKS, DOFF[32], DMAX[32];
long fileLen, pos;
int i, j, NUMDSK, BMSIZ;
unsigned short words[255]; // assumes short is 16 bits...

long long myCS, hisCS;

if (in != NULL) {
fseek (in, 0, SEEK_END);
fileLen = ftell (in);
}
else {
// printf ("did not open\n");
return(-1);
}

// make sure it's divisible by 512 without remainder
if ((fileLen % 512) != 0) {
// printf ("image size not evenly divisible by 512!\n");
return(-2);
}

// get number of 512 byte records
HWBLKS = fileLen / 512;

// make sure the number of records resonable
if ((HWBLKS < 10) | (HWBLKS > 2190000)) {
// printf ("image too small or to big!\n");
return(-3);
}

// preset initial platter offset to zero
// check if that record is label..
DOFF[0] = 0;
while (DOFF[0] < 513) {
pos = DOFF[0];
fseek (in, pos, SEEK_SET);
fread((char*)words, 512, 1, in);
if (strncmp((char*)words, lblflag, 4) == 0) break;
else DOFF[0] += 512;
}
if (DOFF[0] > 512) {
// printf ("cant find label record!\n");
return(-4);
}

// MFD follows label record
pos += 512;

// first block of the bitmap follows the MFD
// scan thru whole bitmap (max 16 blocks)
myCS = hisCS = 0; BMSIZ = 0;
for (i = 0; i<16; i++) {
pos += 512;
fseek (in, pos, SEEK_SET);
fread((char*)words, 512, 1, in);
for (j=0; j<256; j++) { // sum bitmap
if (j < 254) {
// presume on-disk CS cant span blocks...
hisCS = 65536 * words[j+2] + words[j+1];
}
myCS = myCS + words[j];
if (myCS == hisCS)
BMSIZ = (j+1) + 256 * i;
if (BMSIZ > 0) break;
} // for j...
if (BMSIZ > 0) break;
} // for i...

if (BMSIZ == 0) {
// printf ("bitmap currupt, can't continue!\n");
return(-5);
}

// bitmap size should point to the end of this disk image
DMAX[0] = DOFF[0] + ((BMSIZ * 16) * 512);
// BUT IT MIGHT NOT!!

// find next label record. it might be less than DMAX
// by up to one word of bitmap (16 records)
// ** this seems wrong, but is OK as long as the the
// bits for records beyond DMAX are always ones...
for (i=0; i<15; i++) {
pos = DMAX[0] - (512 * i);
fseek (in, pos, SEEK_SET);
fread((char*)words, 512, 1, in);
if (strncmp((char*)words, lblflag, 4) == 0) {
DMAX[0] = pos;
break;
}
}

// finally DMAX really points to the next image...
i = 1;
while(1) {
DOFF = DMAX[i-1];
DMAX = DOFF + DMAX[0] - DOFF[0];
pos = DOFF;
fseek (in, pos, SEEK_SET);
fread((char*)words, 512, 1, in);
if (strncmp((char*)words, lblflag, 4) == 0)
i = i + 1;
else
break;
}
NUMDSK = i;

// copy discovered data to globals
for (i=0; i<NUMDSK; i++) {
vdkdsk[drv+i] = in;
vdkoff[drv+i] = DOFF;
vdkmax[drv+i] = DMAX;
drv_flag[drv+i] = 0;
if(i==0) drv_flag[drv] = BMSIZ;
}

return(NUMDSK);
}
 
Thanks Mike,

Since Alpha Micro assembly, C is the only relatively low level language I've written in, I'm learning Python because of it's touted Rapid development features. My Linux machine was very fast 10 years ago when I bought it 4.5 ghz 8 core on a ssd, and still faster than I need for a desktop.
 
I've played with python but never committed to it. Still just a C guy. Going back & forth between FL & AK I don't have a desktop machine; my laptop is only half as fast as yours but still way good for my dev use. Performance here is more dictated by flight sim so my main os is windows 10. But my dev os is fedora linux and WSL does it great for me (I have vmware but seldom use it).
 
When MS demanded I upgrade from XP in 2000, I upgraded to Linux with VirtualBox for XP since then, I've upgraded the hardware twice, and the OS stays one version back. VirtualBox doesn't allow XP access to the net and it has run flawlessly for 24 years. I transitioned fully except MS Access, which Linux can't touch yet.
 
100-L ?
I'd like to ul them if you could forward 'em
I've actually been looking for them, we have a machine with a bad eprom

and, that whole thread has disappeared in my mind blurred post-covid memory
That looks like it. I will advise their current owner and I'll connect you in E-mail.
 
I have no experiance with AlphaCD but I've heard they can't be mounted as a normal cd on a PC. Maybe they are effectively just DD images of new format??
No, they're some weir-dass multisession format that ACD.LIT directly mounts as AMOS volumes. It's not bootable in any case.

My POWER9 workstation runs Fedora, so I should be able to build directly from source for testing.
 
FYI, regarding Alphamicro's continued existence, I heard back from alphamicro/birmingham as indicated below:

Alpha Microsystems <info@alphamicro.com>



0k, Despite lack of a name in your response you've convinced me some remnent of Alphamicro is still in business so I will refrain from publishing Alphamicro software.

rats, missed this line from Sunday. I may need to pull down those tape images.
 
Their communications has been ambiguous. Perhaps you should let them know you accidently posted potentially protected material of theirs & inquire if they want you to "try to remove it".
 
Mike,

Will VAM/L have the built-in ability to import text files from the host?
 
Right now I use Cut/Paste from a telnet client (teraterm). Works for ncurses sceens too, but can only copy 24 lines at a time there.
The WD16 version has several other ways to do it (tape, PS3 interface) and eventually the 68k version will have those as well, but not yet.
Of course since the containers are compatable you can use the WD16 version to import/export then turn around and access the container with the 68k version.
For example I keep a WD16 boot image on my normal container as DSK8. To boot it I run VDKXCHG 0 8 then boot WD16, do what I need, run VDKXCHG 0 8 again and restart 68k version. A bit awkward, but works fine.
VDKXCHG and the othe VDK... utilities & doc are on the current WD16 distro if you want to experiment with doing that...
 
I'm not familiar with VAM other then knowing that other people I trust speak well of it, I presume that "containers" = SD disk images files, the issue I'm pondering is getting .M68 files I've saved for decades, from my Linux system over to VAM/L. Booting VAM to download a .M68, then booting VAM/L to access a common drive (or the like) would be just fine for me as long as that method will handle downloading a file think 240 blocks is my largest.
 
Back
Top