Adapt the putx routine from atari code to update the string for the alert with a code. Use it to indicate remaining sectors to read on error.
It seems DoIO() fails after 6 sectors. Could it have something to do with side handling ? I hope I won't have to dig trackdisk.device specific stuff... Anyway even with 6 sectors read, the boot code now calls _start() successfully. Use _floppy_err_alert() to assert this until the copying is fixed. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38951 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -71,8 +71,11 @@ _floppy_osversion: // ??
|
||||
|
||||
floppy_start:
|
||||
// save some regs just in case
|
||||
//movem.l %d1-%d7/%a0-%a6,-(%sp)
|
||||
movem.l %d1-%d7/%a0-%a6,-(%sp)
|
||||
|
||||
// save the provided IOReq pointer
|
||||
lea sBootIOReq(%pc),%a2
|
||||
move.l %a1,(%a2)
|
||||
|
||||
// seems like a6 is already set to ExecBase when called from the ROM ?
|
||||
move.l 4.w,%a6 // exec base
|
||||
@@ -89,20 +92,76 @@ floppy_start:
|
||||
// beq.s _floppy_err
|
||||
// move.l %d0,(%a2)
|
||||
|
||||
// needed to display alerts
|
||||
lea intname_boot(%pc),%a1
|
||||
jsr _LVOOldOpenLibrary(%a6)
|
||||
tst.l %d0
|
||||
beq.s _floppy_err
|
||||
beq _floppy_err
|
||||
lea IntuitionBase(%pc),%a2
|
||||
move.l %d0,(%a2)
|
||||
|
||||
// allocate absolute memory to put the bootloader
|
||||
// allocate absolute memory to put the stack & bootloader at,
|
||||
// just to make sure AmigaOS won't write there.
|
||||
|
||||
move.l #(AMIGA_ZBEOS_STACK_END-AMIGA_ZBEOS_STACK_BASE+AMIGA_ZBEOS_MAX),%d0
|
||||
move.l #AMIGA_ZBEOS_STACK_BASE,%a1
|
||||
jsr _LVOAllocAbs(%a6)
|
||||
tst.l %d0
|
||||
beq.s _floppy_err_alert
|
||||
|
||||
//lea alert_extra(%pc),%a2
|
||||
//addq.b #1,(%a2)
|
||||
move.l #0xdeadbeef,%d0
|
||||
bsr putx
|
||||
|
||||
// copy haiku_loader to AMIGA_ZBEOS_BASE
|
||||
|
||||
|
||||
|
||||
jsr _display_alert
|
||||
lea sBootIOReq,%a1
|
||||
move.l (%a1),%a1
|
||||
move #CMD_READ,28(%a1) //io_Command
|
||||
//move.l #0x200,%d0
|
||||
//XXX
|
||||
//mulu sNumSectors,%d0
|
||||
//move.l %d0,36(%a1) //io_Length
|
||||
move.l #0x200,36(%a1) //io_Length
|
||||
move.l #AMIGA_ZBEOS_BASE,40(%a1) //io_Data
|
||||
move.l #0,44(%a1) //io_Offset
|
||||
move.w sNumSectors,%d2
|
||||
|
||||
bra _floppy_err
|
||||
next_sector:
|
||||
move.w %d2,%d0
|
||||
bsr putx
|
||||
|
||||
move.l %a1,-(%sp)
|
||||
jsr _LVODoIO(%a6)
|
||||
move.l (%sp)+,%a1
|
||||
|
||||
tst.l %d0
|
||||
bne _floppy_err_alert
|
||||
|
||||
add.l #0x200,40(%a1) //io_Data
|
||||
add.l #0x200,44(%a1) //io_Offset
|
||||
//subq.w #1,sNumSectors
|
||||
subq.w #1,%d2
|
||||
bne next_sector
|
||||
|
||||
move.l #0xf100f100,%d0
|
||||
bsr putx
|
||||
|
||||
//lea alert_extra(%pc),%a2
|
||||
//move.b #'F',(%a2)
|
||||
|
||||
// move.l
|
||||
// cmp.l 32(%a1),36(%a1)
|
||||
// blt.s _floppy_err_alert
|
||||
|
||||
//lea alert_extra(%pc),%a2
|
||||
//addq.b #1,(%a2)
|
||||
|
||||
bra.s floppy_done
|
||||
|
||||
|
||||
//_continue:
|
||||
// lea dosname_boot(%pc),%a1
|
||||
@@ -119,66 +178,78 @@ floppy_start:
|
||||
// moveq #0,%d0
|
||||
// rts
|
||||
|
||||
_floppy_err:
|
||||
// pop up saved regs
|
||||
//movem.l (%sp)+,%d1-%d7/%a0-%a6
|
||||
moveq #-1,%d0
|
||||
rts
|
||||
|
||||
|
||||
_display_alert:
|
||||
//move.l %a6,-(%sp)
|
||||
GLOBAL(_floppy_err_alert):
|
||||
lea IntuitionBase(%pc),%a6
|
||||
move.l (%a6),%a6
|
||||
lea alert_data(%pc),%a0
|
||||
moveq #0,%d0
|
||||
move.l #40,%d1
|
||||
move.l #30,%d1
|
||||
jsr _LVODisplayAlert(%a6)
|
||||
//move.l (%sp)+,%a6
|
||||
|
||||
_floppy_err:
|
||||
// pop up saved regs
|
||||
movem.l (%sp)+,%d1-%d7/%a0-%a6
|
||||
moveq #-1,%d0
|
||||
rts
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
floppy_done:
|
||||
// setup stack
|
||||
move.l #AMIGA_ZBEOS_STACK_END,%sp
|
||||
//jmp AMIGA_ZBEOS_BASE+512
|
||||
|
||||
//move.w TOSVAR_bootdev,%d0
|
||||
// XXX: use uint16 ??
|
||||
//move.b %d0,AMIGA_ZBEOS_BASE + gBootDriveID - _bs_entry
|
||||
move.b #1,AMIGA_ZBEOS_BASE + gBootedFromImage - _bs_entry
|
||||
// XXX: copy the rest !
|
||||
|
||||
move.b #'S',AMIGA_ZBEOS_BASE + alert_extra - _bs_entry
|
||||
// Copy open library handles
|
||||
move.l SysBase(%pc),AMIGA_ZBEOS_BASE + SysBase - _bs_entry
|
||||
move.l IntuitionBase(%pc),AMIGA_ZBEOS_BASE + IntuitionBase - _bs_entry
|
||||
|
||||
move.l #0,%d0
|
||||
|
||||
// jump to C++ code
|
||||
jmp _start
|
||||
|
||||
|
||||
putx:
|
||||
movem.l %d0-%d2/%a0-%a2,-(%sp)
|
||||
lea alert_extra(%pc),%a2
|
||||
move.l #8-1,%d2
|
||||
move.l %d0,%d1
|
||||
putxloop:
|
||||
move.l %d1,%d0
|
||||
lsl.l #4,%d1
|
||||
//swap %d0
|
||||
//lsr.l #8,%d0
|
||||
//lsr.l #4,%d0
|
||||
rol.l #4,%d0
|
||||
and.l #0x0f,%d0
|
||||
cmp.b #9,%d0
|
||||
ble putx0
|
||||
add.b #'a'-'0'-10,%d0
|
||||
//bra putxdisp
|
||||
putx0:
|
||||
add.b #'0',%d0
|
||||
putxdisp:
|
||||
move.b %d0,(%a2)+
|
||||
dbf %d2,putxloop
|
||||
// bsr putcrlf
|
||||
movem.l (%sp)+,%d0-%d2/%a0-%a2
|
||||
rts
|
||||
|
||||
|
||||
// ATARI
|
||||
#if 0
|
||||
|
||||
lea label_floppy,%a0
|
||||
bsr puts
|
||||
//bra floppy_start
|
||||
|
||||
// no interrupt
|
||||
//or.w #0x0700,%sr
|
||||
|
||||
//XXX: check for enough RAM
|
||||
|
||||
// load the rest
|
||||
//move.w sNumSectors,%d2
|
||||
// load at base + this code.
|
||||
//move.l #(ATARI_ZBEOS_BASE+512),%a2
|
||||
//move.l %a2,%d0
|
||||
//bsr putx
|
||||
bsr load_sectors
|
||||
tst.w %d0
|
||||
bne load_failed
|
||||
floppy_done:
|
||||
// setup stack
|
||||
move.l #ATARI_ZBEOS_STACK_END,%sp
|
||||
//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
|
||||
|
||||
lea msg_j1,%a0
|
||||
bsr puts
|
||||
move.l #0,%d0
|
||||
|
||||
jmp _start
|
||||
|
||||
load_failed:
|
||||
//bra _exit
|
||||
@@ -355,30 +426,6 @@ failure_string:
|
||||
|
||||
|
||||
|
||||
putx:
|
||||
movem.l %d0-%d2/%a0-%a2,-(%sp)
|
||||
move.l #8-1,%d2
|
||||
move.l %d0,%d1
|
||||
putxloop:
|
||||
move.l %d1,%d0
|
||||
lsl.l #4,%d1
|
||||
//swap %d0
|
||||
//lsr.l #8,%d0
|
||||
//lsr.l #4,%d0
|
||||
rol.l #4,%d0
|
||||
and.l #0x0f,%d0
|
||||
cmp.b #9,%d0
|
||||
ble putx0
|
||||
add.b #'a'-'0'-10,%d0
|
||||
//bra putxdisp
|
||||
putx0:
|
||||
add.b #'0',%d0
|
||||
putxdisp:
|
||||
bsr putc
|
||||
dbf %d2,putxloop
|
||||
bsr putcrlf
|
||||
movem.l (%sp)+,%d0-%d2/%a0-%a2
|
||||
rts
|
||||
|
||||
|
||||
puts:
|
||||
@@ -446,7 +493,10 @@ sNumSectors:
|
||||
// 0x180 is the allowed maximum, as the zipped TAR with the
|
||||
// kernel and the boot module might start at offset 192 kB
|
||||
//.word 0x0300 //0x0180
|
||||
.word BOOT_ARCHIVE_IMAGE_OFFSET*2
|
||||
.word 6//BOOT_ARCHIVE_IMAGE_OFFSET*2
|
||||
|
||||
sBootIOReq:
|
||||
.long 0
|
||||
|
||||
dosname_boot:
|
||||
.ascii "dos.library"
|
||||
@@ -461,7 +511,7 @@ alert_data:
|
||||
.byte 12
|
||||
.ascii "Error loading Haiku: "
|
||||
alert_extra:
|
||||
.ascii "0\0"
|
||||
.ascii "XXXXXXXX\0"
|
||||
.byte 0
|
||||
|
||||
GLOBAL(SysBase):
|
||||
|
||||
@@ -117,10 +117,13 @@ platform_exit(void)
|
||||
while (true) {}
|
||||
}
|
||||
|
||||
extern "C" void _floppy_err_alert();
|
||||
|
||||
extern "C" void
|
||||
_start(void)
|
||||
{
|
||||
_floppy_err_alert();
|
||||
panic("plop");
|
||||
stage2_args args;
|
||||
|
||||
//asm("cld"); // Ain't nothing but a GCC thang.
|
||||
|
||||
Reference in New Issue
Block a user