/*
* Copyright 2004-2005, Axel DΓΆrfler, axeld@pinc-software.de. All rights reserved.
* Copyright 2005, Ingo Weinhold, bonefish@users.sf.net.
* Copyright 2007, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT license.
*
* Author:
* FranΓ§ois Revol, revol@free.fr.
*/
/** This file contains the boot floppy and BFS boot block entry points for
* the stage 2 boot loader.
* x86 ahead:
* The floppy entry point is at offset 0. It's loaded at 0x07c0:0x000. It
* will load the rest of the loader to 0x1000:0x0200 and execute it.
* The BFS boot block will load the whole stage 2 loader to 0x1000:0x0000
* and will then jump to 0x1000:0x0200 as its entry point.
* This code will then switch to protected mode and will directly call
* the entry function of the embedded ELF part of the loader.
*/
/*
* generate boot floppy:
* cd src/system/boot/platform/atari_m68k/
* dd if=generated/objects/haiku/m68k/release/system/boot/haiku_loader of=~/floppy.img bs=512 count=20 conv=notrunc
* src/system/boot/platform/atari_m68k/fixup_tos_floppy_chksum ~/floppy.img
* generate .prg:
* generated.m68k/cross-tools/bin/m68k-unknown-haiku-ld -o haiku.prg -T src/system/ldscripts/m68k/boot_prg_atari_m68k.ld generated/objects/haiku/m68k/release/system/boot/boot_loader_atari_m68k
*/
/*
* references :
* http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-4-0/src/sys/arch/amiga/stand/bootblock/
* http://wandel.ca/homepage/execdis/virus_disassembly.txt
* http://ciarang.com/wiki/page/Minimal_Amiga_Boot_Code
*
*/
#include "amiga_memory_map.h"
#include "rom_calls.h"
// 1 enabled verbose output
//#define DEBUG 1
#define GLOBAL(x) .globl x
#define FUNCTION(x) .global x
#define DRIVE_RETRIES 3
// when the drive reading fails for some reason, it will
// retry this many times until it will report a failure
#define SECTSIZE 512
// .text
_bs_entry:
// Amiga boot sector
_floppy_entry:
.ascii "DOS"
.byte 0
_floppy_checksum:
.long 0
_floppy_osversion: // ??
//.long 0x370
.long 0x09D5A859 // dos private ???
/*
* floppy boot support code
*/
floppy_start:
// save some regs just in case
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
//jsr _LVOFindResident(%a6)
lea SysBase(%pc),%a2
move.l %a6,(%a2)
// lea dosname_boot(%pc),%a1
// move.l 4.w,%a6 // exec base
// jsr _LVOFindResident(%a6)
// lea DosBase(%pc),%a2
// tst.l %d0
// beq.s _floppy_err
// move.l %d0,(%a2)
// needed to display alerts
lea intname_boot(%pc),%a1
jsr _LVOOldOpenLibrary(%a6)
tst.l %d0
beq _floppy_err
lea IntuitionBase(%pc),%a2
move.l %d0,(%a2)
// 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
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
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
// move.l 4.w,%a6 // exec base
// jsr _LVOFindResident(%a6)
// lea _dosbase(%pc),%a2
// tst.l %d0
// beq.s _floppy_err
// move.l %d0,(%a2)
// // pop up saved regs
// movem.l (%sp)+,%d1-%d7/%a0-%a6
// move.l _dosbase,%a0
// move.l 0x16(%a0),%a0
// moveq #0,%d0
// rts
GLOBAL(_floppy_err_alert):
lea IntuitionBase(%pc),%a6
move.l (%a6),%a6
lea alert_data(%pc),%a0
moveq #0,%d0
move.l #30,%d1
jsr _LVODisplayAlert(%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
floppy_end:
// .org FAILURE_STRING
failure_string:
// .string " Loading failed! Press key to reboot.\r\n"
.string " Loading failed! Press key.\r\n"
// .string "FAIL"
// .org DOT_STRING
// .string "."
str:
.string "Haiku!"
msg_j1:
.string "Jumping to haiku_loader."
#endif
sNumSectors:
// this location will contain the length of the boot loader as
// written by the "makeflop" command in 512 byte blocks
// 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
sBootIOReq:
.long 0
dosname_boot:
.ascii "dos.library"
.byte 0
intname_boot:
.ascii "intuition.library"
.byte 0
alert_data:
.word 10
.byte 12
.ascii "Error loading Haiku: "
alert_extra:
.ascii "XXXXXXXX\0"
.byte 0
GLOBAL(SysBase):
.long 0
GLOBAL(DosBase):
.long 0
GLOBAL(IntuitionBase):
.long 0
end_buff:
// equ *-_floppy_entry
.dcb.b (1024)-(end_buff-_floppy_entry),0
//XXX: put bfs_start here
/*
* \AUTO\HAIKU.PRG and ARAnyM BOOTSTRAP() support code
*/
#if 0
super_done:
// XXX: copy the rest !
move.b #AMIGA_BOOT_DRVAPI_FLOPPY,AMIGA_ZBEOS_BASE + gBootDriveAPI - _bs_entry
move.b #0,AMIGA_ZBEOS_BASE + gBootDriveID - _bs_entry
move.b #1,AMIGA_ZBEOS_BASE + gBootedFromImage - _bs_entry
move.l #0,%d0
#endif
//jmp AMIGA_ZBEOS_BASE+512
jmp _start
saved_super_stack:
.long 0
GLOBAL(gBootedFromImage):
.byte 0
GLOBAL(gBootDriveID):
.byte 0
GLOBAL(gBootPartitionOffset):
.long 0