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