68060 FPU disable update

This commit is contained in:
Toni Wilen 2018-07-08 15:33:48 +03:00
parent f9a5d53712
commit 7333d061b2
6 changed files with 1490 additions and 1446 deletions

View File

@ -1868,6 +1868,31 @@ void create_ks12_boot(void)
}
#endif
// 68060 FPU disable ROM code
void create_68060_nofpu(void)
{
uaecptr code = here();
if ((code & 0xffff0000) != 0x00f00000)
return;
if (dbg(0xf00000) != 0 || dbg(0xf00001) != 0) {
org(0xf00000);
dw(0x0000);
org(code);
}
if (currprefs.cpu_model != 68060)
return;
if (currprefs.fpu_model == 0)
return;
uae_u32 ptr = filesys_get_entry(12);
if (ptr - 0xf00004 > 128 || ptr < 0xf00004)
return;
// first two words of UAE Boot ROM are normally unused
org(0xf00000);
dw(0x1111);
dw(0x6000 + (ptr - 0xf00004)); // bra.b
org(code);
}
static bool expamem_init_filesys(struct autoconfig_info *aci)
{
struct uae_prefs *p = aci->prefs;

View File

@ -28,6 +28,7 @@
; 2015.09.28 KS 1.2 boot hack improved, 1.1 and older BCPL-only DOS support.
; 2016.01.14 'Indirect' boot ROM trap support.
; 2018.03.22 Segment tracking
; 2018.07.08 68060 FPU disable
AllocMem = -198
FreeMem = -210
@ -89,19 +90,20 @@ our_seglist:
dc.l 0 ; 8 /* NextSeg */
start:
bra.s startjmp
dc.w 12 ;0 12
dc.w 13 ; 0 12
startjmp:
bra.w filesys_mainloop ; 1 16
dc.l make_dev-start ; 2 20
dc.l make_dev-start ; 2 20
dc.l filesys_init-start ; 3 24
dc.l moverom-start ; 4 28
dc.l bootcode-start ; 5 32
dc.l moverom-start ; 4 28
dc.l bootcode-start ; 5 32
dc.l setup_exter-start ; 6 36
dc.l bcplwrapper-start ; 7 40
dc.l afterdos-start ; 8 44
dc.l hwtrap_install-start ; 9 48
dc.l afterdos-start ; 8 44
dc.l hwtrap_install-start ; 9 48
dc.l hwtrap_entry-start ; 10 52
dc.l keymaphack-start ; 11 56
dc.l keymaphack-start ; 11 56
dc.l fpu060disable-start ; 12 60
bootcode:
lea.l doslibname(pc),a1
@ -112,6 +114,12 @@ bootcode:
jsr (a0)
rts
fpu060disable:
movec pcr,d0
bset #1,d0
movec d0,pcr
jmp (a5)
; BCPL filehandler segment entry point
; for KS 1.1 and older.
cnop 0,4

View File

@ -9182,6 +9182,7 @@ void filesys_install (void)
org (loop);
create_ks12_boot();
create_68060_nofpu();
}
uaecptr filesys_get_entry(int index)

File diff suppressed because it is too large Load Diff

View File

@ -137,6 +137,7 @@ extern bool filesys_heartbeat(void);
extern void filesys_install (void);
extern void filesys_install_code (void);
extern void create_ks12_boot(void);
extern void create_68060_nofpu(void);
extern uaecptr filesys_get_entry(int);
extern void filesys_store_devinfo (uae_u8 *);
extern void hardfile_install (void);

View File

@ -3860,8 +3860,10 @@ static void m68k_reset2(bool hardreset)
if (currprefs.cpu_model == 68060) {
regs.pcr = currprefs.fpu_model == 68060 ? MC68060_PCR : MC68EC060_PCR;
regs.pcr |= (currprefs.cpu060_revision & 0xff) << 8;
if (currprefs.fpu_model == 0 || kickstart_rom)
regs.pcr |= 2; /* disable FPU */
if (currprefs.fpu_model == 0 || (currprefs.cpuboard_type == 0 && rtarea_base != 0xf00000)) {
/* disable FPU if no accelerator board and no $f0 ROM */
regs.pcr |= 2;
}
}
// regs.ce020memcycles = 0;
regs.ce020startcycle = regs.ce020endcycle = 0;
@ -8760,6 +8762,10 @@ void cpureset (void)
uae_u16 ins;
addrbank *ab;
if (currprefs.cpu_model == 68060 && currprefs.cpuboard_type == 0 && rtarea_base != 0xf00000) {
// disable FPU at reset if no accelerator board and no $f0 ROM.
regs.pcr |= 2;
}
m68k_reset_delay = currprefs.reset_delay;
set_special(SPCFLAG_CHECK);
send_internalevent(INTERNALEVENT_CPURESET);