- add a gBootDriveAPI variable telling which method was used to load,
- move gBoot* out of the boot sector, - fix the FAT params to actually indicate 1.44kB floppy, - fix the FloppyDrive class to also use 18 sectors/track, so now tarfs won't get data from start of disk when on the middle. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30481 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -15,7 +15,7 @@
|
|||||||
#include "Handle.h"
|
#include "Handle.h"
|
||||||
#include "toscalls.h"
|
#include "toscalls.h"
|
||||||
|
|
||||||
#define TRACE_DEVICES
|
//#define TRACE_DEVICES
|
||||||
#ifdef TRACE_DEVICES
|
#ifdef TRACE_DEVICES
|
||||||
# define TRACE(x) dprintf x
|
# define TRACE(x) dprintf x
|
||||||
#else
|
#else
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
// exported from shell.S
|
// exported from shell.S
|
||||||
extern uint8 gBootedFromImage;
|
extern uint8 gBootedFromImage;
|
||||||
|
extern uint8 gBootDriveAPI; // ATARI_BOOT_DRIVE_API_*
|
||||||
extern uint8 gBootDriveID;
|
extern uint8 gBootDriveID;
|
||||||
extern uint32 gBootPartitionOffset;
|
extern uint32 gBootPartitionOffset;
|
||||||
|
|
||||||
@@ -702,8 +703,11 @@ FloppyDrive::FloppyDrive(int handle)
|
|||||||
dprintf("getting drive parameters for: %u failed!\n", fHandle);
|
dprintf("getting drive parameters for: %u failed!\n", fHandle);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// XXX: probe! this is a std 1.44kB floppy
|
||||||
fBlockSize = 512;
|
fBlockSize = 512;
|
||||||
fParameters.sectors = 1440 * 1024 / 512;
|
fParameters.sectors = 1440 * 1024 / 512;
|
||||||
|
fParameters.sectors_per_track = 18;
|
||||||
|
fParameters.heads = 2;
|
||||||
fSize = fParameters.sectors * fBlockSize;
|
fSize = fParameters.sectors * fBlockSize;
|
||||||
fHasParameters = false;
|
fHasParameters = false;
|
||||||
/*
|
/*
|
||||||
@@ -797,12 +801,32 @@ FloppyDrive::FillIdentifier()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
hexdump(uint8 *buf, uint32 offset)
|
||||||
|
{
|
||||||
|
// hexdump
|
||||||
|
|
||||||
|
for (int i = 0; i < 512; i++) {
|
||||||
|
if ((i % 16) == 0)
|
||||||
|
TRACE(("%08lx ", offset+i));
|
||||||
|
if ((i % 16) == 8)
|
||||||
|
TRACE((" "));
|
||||||
|
TRACE((" %02x", buf[i]));
|
||||||
|
|
||||||
|
if ((i % 16) == 15)
|
||||||
|
TRACE(("\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
FloppyDrive::ReadBlocks(void *buffer, off_t first, int32 count)
|
FloppyDrive::ReadBlocks(void *buffer, off_t first, int32 count)
|
||||||
{
|
{
|
||||||
int sectorsPerBlocks = (fBlockSize / 512);
|
int sectorsPerBlocks = (fBlockSize / 512);
|
||||||
|
int sectorsPerTrack = fParameters.sectors_per_track;
|
||||||
|
int heads = fParameters.heads;
|
||||||
int32 ret;
|
int32 ret;
|
||||||
TRACE(("FloppyDrive::%s(%Ld,%ld) (%d)\n", __FUNCTION__, first, count, fHandle));
|
//TRACE(("FloppyDrive::%s(%Ld,%ld) (%d)\n", __FUNCTION__, first, count, fHandle));
|
||||||
// force single sector reads to avoid crossing track boundaries
|
// force single sector reads to avoid crossing track boundaries
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
uint8 *buf = (uint8 *)buffer;
|
uint8 *buf = (uint8 *)buffer;
|
||||||
@@ -810,17 +834,23 @@ FloppyDrive::ReadBlocks(void *buffer, off_t first, int32 count)
|
|||||||
|
|
||||||
int16 track, side, sect;
|
int16 track, side, sect;
|
||||||
sect = (first + i) * sectorsPerBlocks;
|
sect = (first + i) * sectorsPerBlocks;
|
||||||
track = sect / (9 * 2);
|
track = sect / (sectorsPerTrack * heads);
|
||||||
side = (sect / 9) % 2;
|
side = (sect / sectorsPerTrack) % heads;
|
||||||
sect %= 9;
|
sect %= sectorsPerTrack;
|
||||||
sect++; // 1-based
|
sect++; // 1-based
|
||||||
|
|
||||||
|
|
||||||
TRACE(("FloppyDrive::%s: THS: %d %d %d\n", __FUNCTION__, track, side, sect));
|
/*
|
||||||
|
TRACE(("FloppyDrive::%s: THS: %d %d %d\n",
|
||||||
|
__FUNCTION__, track, side, sect));
|
||||||
|
*/
|
||||||
ret = Floprd(buf, 0L, fHandle, sect, track, side, 1);
|
ret = Floprd(buf, 0L, fHandle, sect, track, side, 1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return toserror(ret);
|
return toserror(ret);
|
||||||
|
//if (first >= 1440)
|
||||||
|
//hexdump(buf, (uint32)(first+i)*512);
|
||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -975,7 +1005,7 @@ XHDIDrive::XHDIDrive(int handle, uint16 major, uint16 minor)
|
|||||||
|
|
||||||
fMajor = major;
|
fMajor = major;
|
||||||
fMinor = minor;
|
fMinor = minor;
|
||||||
TRACE(("XHDIDrive::%s(%d, %d,%d)\n", __FUNCTION__, handle, fMajor, fMinor));
|
TRACE(("XHDIDrive::%s(%d, %d, %d)\n", __FUNCTION__, handle, fMajor, fMinor));
|
||||||
|
|
||||||
product[32] = '\0';
|
product[32] = '\0';
|
||||||
err = XHInqTarget(major, minor, &fBlockSize, &devflags, product);
|
err = XHInqTarget(major, minor, &fBlockSize, &devflags, product);
|
||||||
@@ -1107,12 +1137,22 @@ platform_add_boot_device(struct stage2_args *args, NodeList *devicesList)
|
|||||||
//XXX: FIXME
|
//XXX: FIXME
|
||||||
//BlockHandle *drive = new(nothrow) BlockHandle(gBootDriveID);
|
//BlockHandle *drive = new(nothrow) BlockHandle(gBootDriveID);
|
||||||
BlockHandle *drive;
|
BlockHandle *drive;
|
||||||
switch (gBootDriveID) {
|
switch (gBootDriveAPI) {
|
||||||
case 0:
|
case ATARI_BOOT_DRVAPI_FLOPPY:
|
||||||
case 1:
|
|
||||||
drive = new(nothrow) FloppyDrive(gBootDriveID);
|
drive = new(nothrow) FloppyDrive(gBootDriveID);
|
||||||
break;
|
break;
|
||||||
|
/*
|
||||||
|
case ATARI_BOOT_DRVAPI_XBIOS:
|
||||||
|
drive = new(nothrow) DMADrive(gBootDriveID);
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
case ATARI_BOOT_DRVAPI_XHDI:
|
||||||
|
drive = new(nothrow) XHDIDrive(gBootDriveID, gBootDriveID, 0);
|
||||||
|
break;
|
||||||
|
case ATARI_BOOT_DRVAPI_UNKNOWN:
|
||||||
default:
|
default:
|
||||||
|
dprintf("unknown boot drive API %d\n", gBootDriveAPI);
|
||||||
|
return B_ERROR;
|
||||||
drive = new(nothrow) BIOSDrive(gBootDriveID);
|
drive = new(nothrow) BIOSDrive(gBootDriveID);
|
||||||
}
|
}
|
||||||
if (drive->InitCheck() != B_OK) {
|
if (drive->InitCheck() != B_OK) {
|
||||||
|
|||||||
@@ -56,20 +56,23 @@ _bs_entry:
|
|||||||
|
|
||||||
//FAT lookalike to avoid nasty things from happening
|
//FAT lookalike to avoid nasty things from happening
|
||||||
// http://alive.atari.org/alive10/btmania.php
|
// http://alive.atari.org/alive10/btmania.php
|
||||||
|
// MS-DOS values :
|
||||||
|
// http://support.microsoft.com/kb/75131/en
|
||||||
|
// http://alumnus.caltech.edu/~pje/dosfiles.html
|
||||||
.ascii "Haiku "
|
.ascii "Haiku "
|
||||||
.byte 0xbe, 0x50, 0x38 // id
|
.byte 0xbe, 0x50, 0x38 // id
|
||||||
//LE
|
//LITTLE ENDIAN!
|
||||||
.byte 0x00, 0x02 //BPS
|
.byte 0x00, 0x02 //BPS
|
||||||
.byte 0x02 //SPC
|
.byte 0x02 //SPC
|
||||||
//.byte 0x00 //???
|
//.byte 0x00 //???
|
||||||
.byte 0x00, 0x02 //RES - number of reserved sectors
|
.byte 0x00, 0x02 //RES - number of reserved sectors
|
||||||
.byte 0x00//0x02 //NFATS
|
.byte 0x00 //NFATS
|
||||||
.byte 0x00/*70*/, 0x00 //NDIRS
|
.byte 0x00, 0x00 //NDIRS
|
||||||
.byte 0xa0, 0x05 //NSECTS
|
.byte 0x40, 0x0b //NSECTS
|
||||||
.byte 0xf9 //MEDIA
|
.byte 0xf0 //MEDIA
|
||||||
.byte 0x05, 0x00 //SPF
|
.byte 0x05, 0x00 //SPF
|
||||||
_fat_spt:
|
_fat_spt:
|
||||||
.byte 0x09, 0x00 //SPT
|
.byte 0x12, 0x00 //SPT
|
||||||
.byte 0x02, 0x00 //NSIDES
|
.byte 0x02, 0x00 //NSIDES
|
||||||
.byte 0x00, 0x00 //NHID
|
.byte 0x00, 0x00 //NHID
|
||||||
// we're done
|
// we're done
|
||||||
@@ -79,7 +82,8 @@ sNumSectors:
|
|||||||
// written by the "makeflop" command in 512 byte blocks
|
// written by the "makeflop" command in 512 byte blocks
|
||||||
// 0x180 is the allowed maximum, as the zipped TAR with the
|
// 0x180 is the allowed maximum, as the zipped TAR with the
|
||||||
// kernel and the boot module might start at offset 192 kB
|
// kernel and the boot module might start at offset 192 kB
|
||||||
.word 0x0300 //0x0180
|
//.word 0x0300 //0x0180
|
||||||
|
.word BOOT_ARCHIVE_IMAGE_OFFSET*2
|
||||||
|
|
||||||
real_entry:
|
real_entry:
|
||||||
|
|
||||||
@@ -125,16 +129,20 @@ floppy_start:
|
|||||||
tst.w %d0
|
tst.w %d0
|
||||||
bne load_failed
|
bne load_failed
|
||||||
floppy_done:
|
floppy_done:
|
||||||
lea h4,%a0
|
|
||||||
bsr puts
|
|
||||||
// setup stack
|
// setup stack
|
||||||
move.l #ATARI_ZBEOS_STACK_END,%sp
|
move.l #ATARI_ZBEOS_STACK_END,%sp
|
||||||
lea h5,%a0
|
|
||||||
bsr puts
|
|
||||||
move.l #0,%d0
|
|
||||||
//jmp ATARI_ZBEOS_BASE+512
|
//jmp ATARI_ZBEOS_BASE+512
|
||||||
|
|
||||||
|
move.b #ATARI_BOOT_DRVAPI_FLOPPY,ATARI_ZBEOS_BASE + gBootDriveAPI - _bs_entry
|
||||||
|
move.w TOSVAR_bootdev,%d0
|
||||||
|
// XXX: use uint16 ??
|
||||||
|
move.b %d0,ATARI_ZBEOS_BASE + gBootDriveID - _bs_entry
|
||||||
move.b #1,ATARI_ZBEOS_BASE + gBootedFromImage - _bs_entry
|
move.b #1,ATARI_ZBEOS_BASE + gBootedFromImage - _bs_entry
|
||||||
|
|
||||||
|
lea msg_j1,%a0
|
||||||
|
bsr puts
|
||||||
|
move.l #0,%d0
|
||||||
|
|
||||||
jmp _start
|
jmp _start
|
||||||
|
|
||||||
load_failed:
|
load_failed:
|
||||||
@@ -310,18 +318,6 @@ failure_string:
|
|||||||
// .string "."
|
// .string "."
|
||||||
|
|
||||||
|
|
||||||
saved_super_stack:
|
|
||||||
.long 0
|
|
||||||
|
|
||||||
GLOBAL(gBootedFromImage):
|
|
||||||
.byte 0
|
|
||||||
|
|
||||||
GLOBAL(gBootDriveID):
|
|
||||||
.byte 0
|
|
||||||
|
|
||||||
GLOBAL(gBootPartitionOffset):
|
|
||||||
.long 0
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
putx:
|
putx:
|
||||||
@@ -477,6 +473,27 @@ copysect_loop:
|
|||||||
// all done
|
// all done
|
||||||
super_done:
|
super_done:
|
||||||
// XXX: copy the rest !
|
// XXX: copy the rest !
|
||||||
|
move.b #ATARI_BOOT_DRVAPI_FLOPPY,ATARI_ZBEOS_BASE + gBootDriveAPI - _bs_entry
|
||||||
|
move.b #0,ATARI_ZBEOS_BASE + gBootDriveID - _bs_entry
|
||||||
|
move.b #1,ATARI_ZBEOS_BASE + gBootedFromImage - _bs_entry
|
||||||
|
|
||||||
move.l #0,%d0
|
move.l #0,%d0
|
||||||
|
|
||||||
//jmp ATARI_ZBEOS_BASE+512
|
//jmp ATARI_ZBEOS_BASE+512
|
||||||
jmp _start
|
jmp _start
|
||||||
|
|
||||||
|
saved_super_stack:
|
||||||
|
.long 0
|
||||||
|
|
||||||
|
GLOBAL(gBootedFromImage):
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
GLOBAL(gBootDriveAPI):
|
||||||
|
.byte ATARI_BOOT_DRVAPI_UNKNOWN
|
||||||
|
|
||||||
|
GLOBAL(gBootDriveID):
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
GLOBAL(gBootPartitionOffset):
|
||||||
|
.long 0
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
* http://www.fortunecity.com/skyscraper/apple/308/html/chap3.htm
|
* http://www.fortunecity.com/skyscraper/apple/308/html/chap3.htm
|
||||||
* http://leonard.oxg.free.fr/articles/multi_atari/multi_atari.html
|
* http://leonard.oxg.free.fr/articles/multi_atari/multi_atari.html
|
||||||
* http://alive.atari.org/alive10/btmania.php
|
* http://alive.atari.org/alive10/btmania.php
|
||||||
|
* AHDI boot args:
|
||||||
|
* http://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/sys/arch/atari/stand/xxboot/ahdi-xxboot/xxboot.ahdi.S
|
||||||
* gas stuff:
|
* gas stuff:
|
||||||
* http://www.gnu.org/software/binutils/manual/gas-2.9.1/html_chapter/as_18.html#SEC214
|
* http://www.gnu.org/software/binutils/manual/gas-2.9.1/html_chapter/as_18.html#SEC214
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -809,6 +809,18 @@ extern void nat_feat_debugprintf(const char *str);
|
|||||||
|
|
||||||
#endif /* __ASSEMBLER__ */
|
#endif /* __ASSEMBLER__ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Drive API used by the bootsector
|
||||||
|
* gBootDriveAPI is set to one of those
|
||||||
|
* not all are implemented
|
||||||
|
*/
|
||||||
|
#define ATARI_BOOT_DRVAPI_UNKNOWN 0
|
||||||
|
#define ATARI_BOOT_DRVAPI_FLOPPY 1 // Floprd()
|
||||||
|
#define ATARI_BOOT_DRVAPI_BIOS 2 // Rwabs()
|
||||||
|
#define ATARI_BOOT_DRVAPI_XBIOS 3 // DMAread()
|
||||||
|
#define ATARI_BOOT_DRVAPI_XHDI 4 // XHReadWrite()
|
||||||
|
#define ATARI_BOOT_DRVAPI_METADOS 5 // Metaread()
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user