1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
#include "msdos.v"
#include "msdos16.v"
#define DOS_SYSID 0x03
#define DOS_SECT 0x0B
#define DOS_CLUST 0x0D
#define DOS_RESV 0x0E
#define DOS_NFAT 0x10
#define DOS_NROOT 0x11
#define DOS_MAXSECT 0x13
#define DOS_MEDIA 0x15
#define DOS_FATLEN 0x16
#define DOS_SPT 0x18
#define DOS_HEADS 0x1A
#define DOS_HIDDEN 0x1C
#define DOS4_MAXSECT 0x20
#define DOS4_PHY_DRIVE 0x24
#define DOS4_SERIAL 0x27
#define DOS4_LABEL 0x2B
#define DOS4_FATTYPE 0x36
unsigned char buffer[1024];
int drive = 0;
main(argc, argv)
int argc;
char ** argv;
{
int tries, rv, i;
if( argc > 1 )
{
static char * s = "Usage: lsys [a:]\n";
if( argc == 2 && argv[1][1] == ':' && argv[1][2] <= ' ' )
{
if( argv[1][0] == 'a' || argv[1][0] == 'A' )
drive = 0;
else if( argv[1][0] == 'b' || argv[1][0] == 'B' )
drive = 1;
else
fatal(s);
}
else
fatal(s);
}
for(tries=0; tries<6; tries++)
if( (rv = dos_sect_read(drive, 0, 0, 1, buffer)) == 0 )
break;
if( rv == 0 )
for(tries=0; tries<6; tries++)
if( (rv = dos_sect_read(drive, 0, 0, 2, buffer+512)) == 0 )
break;
if( rv ) fatal("Cannot read bootsector");
if( buffer[DOS_MEDIA] != buffer[512] ||
buffer[DOS_MEDIA] < 0xF0 ||
buffer[DOS_NFAT] > 2 ||
buffer[DOS_SECT+1] != 2 )
fatal("Floppy has invalid format");
if( memcmp(buffer+DOS4_FATTYPE, "FAT16", 5) )
{
for(i=0; i<msdos_dosfs_stat - msdos_start; i++)
buffer[i] = msdos_data[i];
for(i=msdos_codestart - msdos_start; i<512; i++)
buffer[i] = msdos_data[i];
}
else
{
for(i=0; i<msdos16_dosfs_stat - msdos_start; i++)
buffer[i] = msdos16_data[i];
for(i=msdos_codestart - msdos_start; i<512; i++)
buffer[i] = msdos16_data[i];
}
for(tries=0; tries<6; tries++)
if( (rv = dos_sect_write(drive, 0, 0, 1, buffer)) == 0 )
break;
if( rv ) fatal("Cannot write bootsector");
write(0, "Wrote bootsector\r\n", 18);
return 0;
}
fatal(str)
{
write(0, str, strlen(str));
write(0, "\r\n", 2);
exit(1);
}
dos_sect_write(drv, track, head, sector, loadaddr)
{
#asm
push bp
mov bp,sp
push ds
pop es
mov dh,[bp+2+_dos_sect_write.head]
mov dl,[bp+2+_dos_sect_write.drv]
mov cl,[bp+2+_dos_sect_write.sector]
mov ch,[bp+2+_dos_sect_write.track]
mov bx,[bp+2+_dos_sect_write.loadaddr]
mov ax,#$0301
int $13
jc write_err
mov ax,#0
write_err:
pop bp
#endasm
}
dos_sect_read(drv, track, head, sector, loadaddr)
{
#asm
push bp
mov bp,sp
push ds
pop es
mov dh,[bp+2+_dos_sect_read.head]
mov dl,[bp+2+_dos_sect_read.drv]
mov cl,[bp+2+_dos_sect_read.sector]
mov ch,[bp+2+_dos_sect_read.track]
mov bx,[bp+2+_dos_sect_read.loadaddr]
mov ax,#$0201
int $13
jc read_err
mov ax,#0
read_err:
pop bp
#endasm
}
|