Thread View: comp.sources.atari.st
1 messages
1 total messages
Started by atari-sources-request
Sun, 29 Nov 1987 03:39
v00i047: mmc:all: IBMFMT.C - program to format IBM disks usable by ST
Author: atari-sources-request
Date: Sun, 29 Nov 1987 03:39
Date: Sun, 29 Nov 1987 03:39
218 lines
8129 bytes
8129 bytes
Submitted by: imagen!decwrl!hplabs!ames!rochester!cornell!batcomputer!braner (braner)
comp.sources.atari.st: Volume 0, Issue 47
Archive-name: ibmfmt.c
~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
[Editor's Note]
The following note from Moshe is pretty self explainatory, I can
only test this on my DSDD 3.5" disk as I don't have a IBM system that
uses 3.5" disks nor do I have a 5 1/4" B: disk. The program does compile
under MegaMax C and runs as far as I can test it.
the checksum is:
bytes = 5891( 6071) cksm = 1030 ibmfmtr.c
~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
Hi, James!
Here is a submission for comp.*.atari.st (some for each):
This is a corrected version of the 200% MS-DOS-compatible formatter.
It will format 3.5" (720K, MS-DOS 3.3) disks in drive A and 5.25" (360K,
MS-DOS 2.0) disks in drive B (assuming you have a 5.25" drive attached
as drive B!). (Sorry, no frills!) The disks are NOT bootable (on MS-DOS)
but both the Atari ST and MS-DOS machines can read and write files on
them, even in subdirectories. The correction (of the early version that
I posted to comp.sys.atari.st) is that now a random disk ID is created.
In the early version, the same ID was always used (stupid me!).
Thanks for doing the moderation job (must be a pain)!
- Moshe Braner
Here is the source code (Megamax C), followed by the uuencoded binary.
------------------ cut here ------------------
/**
** Program to format MS-DOS-compatible disks on the Atari ST
** Code for Megamax C compiler 871023
**/
#include <osbind.h>
#define WORD int /* 16 bits!!! */
/*
* IBM style boot sector for nonsystem 5.25" disk:
*
* (This is simply:
* WORD boot5[256] = { 0xEB3C, ... };
* done in a sick way to bypass the sick element-by-element
* array-initialization scheme used by Megamax...)
*/
extern boot5();
asm{
boot5:
DC.W 0xEB3C,0x9049,0x424D,0x2020,0x322E,0x3000,0x0202,0x0100
DC.W 0x0270,0x00D0,0x02FD,0x0200,0x0900,0x0200,0x0000,0x2020
DC.W 0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020
DC.W 0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x0E1F
DC.W 0x33C0,0xFA8E,0xD0BC,0x007C,0x36C7,0x0678,0x00F4,0x7C36
DC.W 0xA37A,0x00FB,0xCD13,0x7264,0xB850,0x008E,0xC033,0xDBB8
DC.W 0x0102,0xB906,0x0033,0xD2CD,0x1372,0x51B1,0x0B26,0x8A07
DC.W 0x3A87,0xDE7C,0x754E,0x268A,0x4720,0x3A87,0xE97C,0x7544
DC.W 0x43E2,0xEAB8,0x7000,0x8EC0,0x33DB,0xB806,0x02B1,0x04B6
DC.W 0x01CD,0x1372,0x27B7,0x0CB8,0x0902,0xB901,0x01B6,0x00CD
DC.W 0x1372,0x19CD,0x11D0,0xC0D0,0xC025,0x0300,0x7501,0x4040
DC.W 0x8BC8,0x33C0,0xBB0C,0x00EA,0x0000,0x7000,0xBEFF,0x7CE8
DC.W 0x0E00,0xEBFE,0xBE15,0x7DE8,0x0600,0xB400,0xCD16,0xCD19
DC.W 0xAC84,0xC074,0x08B4,0x0EB3,0x07CD,0x10EB,0xF3C3,0x4942
DC.W 0x4D42,0x494F,0x2020,0x434F,0x4D49,0x424D,0x444F,0x5320
DC.W 0x2043,0x4F4D,0xDF02,0x2502,0x092A,0xFF50,0x000F,0x020D
DC.W 0x0A44,0x6973,0x6B20,0x426F,0x6F74,0x2066,0x6169,0x6C75
DC.W 0x7265,0x0D0A,0x000D,0x0A4E,0x6F6E,0x2D53,0x7973,0x7465
DC.W 0x6D20,0x6469,0x736B,0x206F,0x7220,0x6469,0x736B,0x2065
DC.W 0x7272,0x6F72,0x0D0A,0x0D0A,0x5265,0x706C,0x6163,0x6520
DC.W 0x616E,0x6420,0x7374,0x7269,0x6B65,0x2061,0x6E79,0x206B
DC.W 0x6579,0x2077,0x6865,0x6E20,0x7265,0x6164,0x790D,0x0A00
DC.W 0,0,0,0,0,0,0,0
DC.W 0,0,0,0,0,0,0,0
DC.W 0,0,0,0,0,0,0,0
DC.W 0,0,0,0,0,0,0,0
DC.W 0,0,0,0,0,0,0,0
DC.W 0,0,0,0,0,0,0,0
DC.W 0,0,0,0,0,0,0,0
DC.W 0,0,0,0,0,0,0,0
DC.W 0,0,0,0,0,0,0,0
DC.W 0,0,0,0,0,0,0,0x55AA
}
/*
* IBM style boot sector for nonsystem 3.5" disk:
*/
extern boot3();
asm{
boot3:
DC.W 0xEB34,0x9049,0x424D,0x2020,0x332E,0x3300,0x0202,0x0100
DC.W 0x0270,0x00A0,0x05F9,0x0300,0x0900,0x0200,0x0000,0x0000
DC.W 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0012
DC.W 0x0000,0x0000,0x0100,0xFA33,0xC08E,0xD0BC,0x007C,0x1607
DC.W 0xBB78,0x0036,0xC537,0x1E56,0x1653,0xBF2B,0x7CB9,0x0B00
DC.W 0xFCAC,0x2680,0x3D00,0x7403,0x268A,0x05AA,0x8AC4,0xE2F1
DC.W 0x061F,0x8947,0x02C7,0x072B,0x7CFB,0xCD13,0x7267,0xA010
DC.W 0x7C98,0xF726,0x167C,0x0306,0x1C7C,0x0306,0x0E7C,0xA33F
DC.W 0x7CA3,0x377C,0xB820,0x00F7,0x2611,0x7C8B,0x1E0B,0x7C03
DC.W 0xC348,0xF7F3,0x0106,0x377C,0xBB00,0x05A1,0x3F7C,0xE89F
DC.W 0x00B8,0x0102,0xE8B3,0x0072,0x198B,0xFBB9,0x0B00,0xBED6
DC.W 0x7DF3,0xA675,0x0D8D,0x7F20,0xBEE1,0x7DB9,0x0B00,0xF3A6
DC.W 0x7418,0xBE77,0x7DE8,0x6A00,0x32E4,0xCD16,0x5E1F,0x8F04
DC.W 0x8F44,0x02CD,0x19BE,0xC07D,0xEBEB,0xA11C,0x0533,0xD2F7
DC.W 0x360B,0x7CFE,0xC0A2,0x3C7C,0xA137,0x7CA3,0x3D7C,0xBB00
DC.W 0x07A1,0x377C,0xE849,0x00A1,0x187C,0x2A06,0x3B7C,0x4038
DC.W 0x063C,0x7C73,0x03A0,0x3C7C,0x50E8,0x4E00,0x5872,0xC628
DC.W 0x063C,0x7C74,0x0C01,0x0637,0x7CF7,0x260B,0x7C03,0xD8EB
DC.W 0xD08A,0x2E15,0x7C8A,0x16FD,0x7D8B,0x1E3D,0x7CEA,0x0000
DC.W 0x7000,0xAC0A,0xC074,0x22B4,0x0EBB,0x0700,0xCD10,0xEBF2
DC.W 0x33D2,0xF736,0x187C,0xFEC2,0x8816,0x3B7C,0x33D2,0xF736
DC.W 0x1A7C,0x8816,0x2A7C,0xA339,0x7CC3,0xB402,0x8B16,0x397C
DC.W 0xB106,0xD2E6,0x0A36,0x3B7C,0x8BCA,0x86E9,0x8A16,0xFD7D
DC.W 0x8A36,0x2A7C,0xCD13,0xC30D,0x0A4E,0x6F6E,0x2D53,0x7973
DC.W 0x7465,0x6D20,0x6469,0x736B,0x206F,0x7220,0x6469,0x736B
DC.W 0x2065,0x7272,0x6F72,0x0D0A,0x5265,0x706C,0x6163,0x6520
DC.W 0x616E,0x6420,0x7374,0x7269,0x6B65,0x2061,0x6E79,0x206B
DC.W 0x6579,0x2077,0x6865,0x6E20,0x7265,0x6164,0x790D,0x0A00
DC.W 0x0D0A,0x4469,0x736B,0x2042,0x6F6F,0x7420,0x6661,0x696C
DC.W 0x7572,0x650D,0x0A00,0x4942,0x4D42,0x494F,0x2020,0x434F
DC.W 0x4D49,0x424D,0x444F,0x5320,0x2043,0x4F4D,0x0000,0x0000
DC.W 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x55AA
}
WORD buf[5000];
main()
{
register WORD *p;
int i, j, virgin, five, tracks, drive;
long a, b, magic;
Cconws("\033E\r\n\n\tMS-DOS compatible disk formatter, v1.1");
Cconws("\r\n\n\tEnter size of disk (3/5): ");
i = Cnecin();
if (i == '5') {
five = 1;
tracks = 40;
drive = 1;
} else {
five = 0;
tracks = 80;
drive = 0;
}
/* format all tracks */
if (five)
Cconws("\r\n\n\tAbout to >> FORMAT << 5.25\" disk in drive B.");
else
Cconws("\r\n\n\tAbout to >> FORMAT << 3.5\" disk in drive A.");
Cconws("\r\n\n\t\tProceed (y/n)? ");
i = Cnecin();
if (i!='y' && i!='Y') exit(0);
Cconws("\r\n\n\tFormatting");
magic = 0x87654321;
virgin = 0xE5E5;
for (i=0; i<tracks; i++) { /* tracks */
if (five || (i&1))
Cconout('.');
for (j=0; j<2; j++) { /* sides */
if (Flopfmt(buf,0L,drive,9,i,j,1,magic,virgin)) {
Cconws("\r\n\nError formatting track ");
Cconout((i/10) + '0');
Cconout((i%10) + '0');
Cconws(" (decimal) on side ");
Cconout(j+'0');
Cconws("!\r\n");
goto bye;
}
}
}
/* Boot sector, FAT and root directory */
for (i=0; i<2304; i++) /* one track */
buf[i] = 0;
if (five)
j = 2;
else
j = 9;
a = Flopwr(buf, 0L, drive, 1, 0, 1, j);
if (five) {
buf[256] = 0xFDFF; /* start of first FAT */
buf[257] = 0xFF00;
buf[768] = 0xFDFF; /* start of second FAT */
buf[769] = 0xFF00;
p = (WORD *) &boot5;
} else {
buf[256] = 0xF9FF;
buf[257] = 0xFF00;
buf[1536] = 0xF9FF;
buf[1537] = 0xFF00;
p = (WORD *) &boot3;
}
for (i=0; i<256; i++) /* boot sector */
buf[i] = *p++;
magic = Random()<<8; /* get a random ID number */
p = (WORD *) &magic;
buf[4] = *p++;
buf[5] = *p;
b = Flopwr(buf, 0L, drive, 1, 0, 0, 9);
if (a || b)
Cconws("\r\n\n\tError writing root sectors! ");
else
Cconws("\r\n\n\tDone. Hit any key.");
bye:
Cnecin();
}
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads