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
|
#include "msdos.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: sys a:";
if( argc == 1 && argv[1][1] == ':' && argv[1][2] == 0 )
{
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 ||
buffer[DOS_HEADS] != 2 )
fatal("Floppy has invalid format");
for(i=0; i<msdos_dosfs_stat; i++)
buffer[i] = msdos_data[i];
for(i=msdos_codestart; i<512; i++)
buffer[i] = msdos_data[i];
for(tries=0; tries<6; tries++)
if( (rv = dos_sect_read(drive, 0, 0, 1, buffer)) == 0 )
break;
if( rv ) fatal("Cannot write bootsector");
return 0;
}
fatal(str)
{
write(0, str, strlen(str));
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
}
|