1414#include " IOUtils.h"
1515#include " Memory.h"
1616#include " MsgQueue.h"
17- #include " softfloat.h"
1817
1918//
2019// Moira
2120//
2221
23-
2422namespace vamiga ::moira {
2523
2624void
@@ -141,7 +139,13 @@ Moira::willExecute(const char *func, Instr I, Mode M, Size S, u16 opcode)
141139 break ;
142140
143141 default :
142+ {
143+
144+ char str[128 ];
145+ disassemble (str, reg.pc0 );
146+ printf (" %s\n " , str);
144147 break ;
148+ }
145149 }
146150}
147151
@@ -288,6 +292,8 @@ CPU::getConfigItem(Option option) const
288292 case OPT_CPU_OVERCLOCKING: return (long )config.overclocking ;
289293 case OPT_CPU_RESET_VAL: return (long )config.regResetVal ;
290294
295+ case OPT_FPU_REVISION: return (long )config.fpuRevision ;
296+
291297 default :
292298 fatalError;
293299 }
297303CPU::setConfigItem (Option option, i64 value)
298304{
299305 auto cpuModel = [&](CPURevision rev) { return moira::Model (rev); };
306+ auto fpuModel = [&](FPURevision rev) { return moira::FPUModel (rev); };
300307 auto dasmModel = [&](DasmRevision rev) { return moira::Model (rev); };
301308 auto syntax = [&](DasmSyntax rev) { return moira::DasmSyntax (rev); };
302309
@@ -314,6 +321,22 @@ CPU::setConfigItem(Option option, i64 value)
314321 resume ();
315322 return ;
316323
324+ case OPT_FPU_REVISION:
325+
326+ if (!amiga.fpuSupport ()) {
327+ throw VAError (ERROR_OPT_UNSUPPORTED);
328+ }
329+
330+ if (!FPURevisionEnum::isValid (value)) {
331+ throw VAError (ERROR_OPT_INVARG, FPURevisionEnum::keyList ());
332+ }
333+
334+ suspend ();
335+ config.fpuRevision = FPURevision (value);
336+ cpu.setFpuModel (fpuModel (config.fpuRevision ));
337+ resume ();
338+ return ;
339+
317340 case OPT_CPU_DASM_REVISION:
318341
319342 if (!DasmRevisionEnum::isValid (value)) {
@@ -365,8 +388,12 @@ CPU::resetConfig()
365388 std::vector <Option> options = {
366389
367390 OPT_CPU_REVISION,
391+ OPT_CPU_DASM_REVISION,
392+ OPT_CPU_DASM_SYNTAX,
368393 OPT_CPU_OVERCLOCKING,
369- OPT_CPU_RESET_VAL
394+ OPT_CPU_RESET_VAL,
395+
396+ OPT_FPU_REVISION
370397 };
371398
372399 for (auto &option : options) {
@@ -460,8 +487,13 @@ CPU::_dump(Category category, std::ostream& os) const
460487
461488 if (category == Category::Config) {
462489
490+ string fputxt =
491+ config.fpuRevision == FPU_INTERNAL ? " (none)" : " (external coprocessor)" ;
492+
463493 os << util::tab (" CPU revision" );
464494 os << CPURevisionEnum::key (config.revision ) << std::endl;
495+ os << util::tab (" FPU revision" );
496+ os << FPURevisionEnum::key (config.fpuRevision ) << fputxt << std::endl;
465497 os << util::tab (" DASM revision" );
466498 os << DasmRevisionEnum::key (config.dasmRevision ) << std::endl;
467499 os << util::tab (" DASM syntax" );
@@ -547,22 +579,39 @@ CPU::_dump(Category category, std::ostream& os) const
547579 }
548580
549581 if (category == Category::Fpu) {
550-
551- os << util::tab (" FPIAR" );
552- os << util::hex (fpu.fpiar ) << std::endl;
553- os << util::tab (" FPSR" );
554- os << util::hex (fpu.fpsr ) << std::endl;
582+
555583 os << util::tab (" FPCR" );
556584 os << util::hex (fpu.fpcr ) << std::endl;
557-
558- /*
559- for (isize i = 0; i < 8; i++) {
560-
561- auto value = softfloat::floatx80_to_float32(fpu.fpr[i].raw);
562- os << util::tab("FP" + std::to_string(i));
563- os << util::hex(u32(value)) << std::endl;
564- }
565- */
585+ os << util::tab (" FPSR" );
586+ os << util::hex (fpu.fpsr ) << std::endl;
587+ os << util::tab (" FPIAR" );
588+ os << util::hex (fpu.fpiar ) << std::endl;
589+ os << std::endl;
590+
591+ os << util::tab (" Rounding mode" );
592+ switch (fpu.getRoundingMode ()) {
593+ case moira::FPU_RND_NEAREST: os << " NEAREST" ; break ;
594+ case moira::FPU_RND_ZERO: os << " ZERO" ; break ;
595+ case moira::FPU_RND_DOWNWARD: os << " DOWNWARD" ; break ;
596+ case moira::FPU_RND_UPWARD: os << " UPDWARD" ; break ;
597+ }
598+ os << std::endl;
599+ os << util::tab (" Precision" );
600+ switch (fpu.getPrecision ()) {
601+ case moira::FPU_PREC_EXTENDED: os << " EXTENDED" ; break ;
602+ case moira::FPU_PREC_SINGLE: os << " SINGLE" ; break ;
603+ case moira::FPU_PREC_DOUBLE: os << " DOUBLE" ; break ;
604+ case moira::FPU_PREC_UNDEFINED: os << " UNDEFINED" ; break ;
605+ }
606+ os << std::endl << std::endl;
607+
608+ for (isize i = 0 ; i < 8 ; i++) {
609+
610+ os << util::tab (" FP" + std::to_string (i));
611+ // os << fpu.fpr[i] << std::endl;
612+ os << util::hex (fpu.fpr [i].val .raw .high ) << " :" ;
613+ os << util::hex (fpu.fpr [i].val .raw .low ) << std::endl;
614+ }
566615 }
567616
568617 if (category == Category::Breakpoints) {
@@ -638,6 +687,7 @@ CPU::_trackOff()
638687 debugger.disableLogging ();
639688}
640689
690+ /*
641691isize
642692CPU::_load(const u8 *buffer)
643693{
@@ -653,10 +703,19 @@ CPU::_load(const u8 *buffer)
653703
654704 return isize(reader.ptr - buffer);
655705}
706+ */
656707
657708isize
658709CPU::didLoadFromBuffer (const u8 *buffer)
659710{
711+ auto cpuModel = (moira::Model)config.revision ;
712+ auto fpuModel = (moira::FPUModel)config.fpuRevision ;
713+ auto dasmModel = (moira::Model)config.dasmRevision ;
714+
715+ // Rectify the CPU and FPU type
716+ setModel (cpuModel, dasmModel);
717+ fpu.setModel (fpuModel);
718+
660719 /* Because we don't save breakpoints and watchpoints in a snapshot, the
661720 * CPU flags for checking breakpoints and watchpoints can be in a corrupt
662721 * state after loading. These flags need to be updated according to the
@@ -741,7 +800,7 @@ CPU::disassembleWords(u32 addr, isize len)
741800{
742801 static char result[64 ];
743802
744- dump16 (result, addr, len);
803+ dump16 (result, addr, ( int ) len);
745804 return result;
746805}
747806
0 commit comments