2020-09-30: Updated to version 62
Signed-off-by: Gwenhael Le Moine <gwenhael.le.moine@gmail.com>
This commit is contained in:
parent
b29959b1f3
commit
20ce3f59ed
22 changed files with 3031 additions and 2994 deletions
BIN
Emu48.dll
BIN
Emu48.dll
Binary file not shown.
BIN
Emu48.exe
BIN
Emu48.exe
Binary file not shown.
|
@ -83,7 +83,8 @@ h3 { color:red; font-size:1.1em; }
|
||||||
<a href="#ss12.2">12.2 About Emu48...</a>
|
<a href="#ss12.2">12.2 About Emu48...</a>
|
||||||
</span></p>
|
</span></p>
|
||||||
<p><a class="nav1" href="#s13">13. DDE Server</a></p>
|
<p><a class="nav1" href="#s13">13. DDE Server</a></p>
|
||||||
<p><a class="nav1" href="#s14">14. License</a></p>
|
<p><a class="nav1" href="#s14">14. Emu48+ Changes</a></p>
|
||||||
|
<p><a class="nav1" href="#s15">15. License</a></p>
|
||||||
</div>
|
</div>
|
||||||
<div id="main">
|
<div id="main">
|
||||||
<h1><a name=s1>1. General</a></h1>
|
<h1><a name=s1>1. General</a></h1>
|
||||||
|
@ -395,19 +396,14 @@ h3 { color:red; font-size:1.1em; }
|
||||||
</ul>
|
</ul>
|
||||||
<h3><a name=ss8.6.3>8.6.3 Settings Peripheral</a></h3>
|
<h3><a name=ss8.6.3>8.6.3 Settings Peripheral</a></h3>
|
||||||
<h4>8.6.3.1 Section Sound</h4>
|
<h4>8.6.3.1 Section Sound</h4>
|
||||||
<p>A new implementation of the sound engine made ROM patches for sound
|
<p>A new implementation of the sound engine made ROM patches for sound
|
||||||
output obsolete. The new sound engine emulates the behaviour of the
|
output obsolete. The new sound engine emulates the behaviour of the
|
||||||
beeper output ports and only work in connection with a sound card.
|
beeper output ports and only work in connection with a sound card.
|
||||||
Using the legacy PC speaker mode isn't possible any more. The old
|
Using the legacy PC speaker mode isn't possible any more. The old
|
||||||
beeper method with a ROM patch is still working but deprecated, it's
|
beeper method with a ROM patch has been removed, so you have to remove
|
||||||
strongly recommended to remove all beep patches from your current KML
|
the ROM beep patches from your KML scripts. Actually the program
|
||||||
scripts to enable the new sound engine. The support of the old sound
|
informs you when detecting ROM beep patches by opening the "KML
|
||||||
implementation by a ROM patch maybe removed in later versions of the
|
Script Compilation Result" dialog reporting an error.
|
||||||
emulator and remaining beep patches will corrupt the ROM with an
|
|
||||||
illegal opcode then. Actually the program informs you when
|
|
||||||
detecting ROM beep patches by opening the "KML Script Compilation
|
|
||||||
Result" dialog. To prevent this, remove the ROM beep patches
|
|
||||||
from the KML script.
|
|
||||||
</p>
|
</p>
|
||||||
<p>For the sound generation the calculator must know his own CPU strobe
|
<p>For the sound generation the calculator must know his own CPU strobe
|
||||||
frequency. On the real calculator the speed depends on various settings
|
frequency. On the real calculator the speed depends on various settings
|
||||||
|
@ -599,9 +595,51 @@ h3 { color:red; font-size:1.1em; }
|
||||||
<td width="66%" align="center">HP object (normal HP object)</td>
|
<td width="66%" align="center">HP object (normal HP object)</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<h1><a name=s14>14. License</a></h1>
|
<h1><a name=s14>14. Emu48+ Changes</a></h1>
|
||||||
|
<p>Emu48+ is a modified version of Emu48 to add support for the ARM-based
|
||||||
|
calculators. It does not emulate the ARM CPU, but it enhances the
|
||||||
|
Saturn emulation to more closely match the emulation provided by the
|
||||||
|
Saturn emulator on the ARM-based calculators.</p>
|
||||||
|
<p>Emu48+ adds support for many of the Saturn+ instructions, including
|
||||||
|
some of the BUSCC instructions, and it also adds support for the 80-line
|
||||||
|
display used on the 49g+ and 50g.</p>
|
||||||
|
<p>At present, the additional calculators supported in Emu48+ are the
|
||||||
|
49g+, 48gII (hardware revision 1), 50g, and 39g+/39gs/40gs.</p>
|
||||||
|
<p>To create KML scripts for the additional calculator models, use the
|
||||||
|
following model codes:</p>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" width="651" summary="DDE settings">
|
||||||
|
<tr>
|
||||||
|
<td width="111">39g+/39gs:</td>
|
||||||
|
<td width="536">Model "P"<br>
|
||||||
|
Class 39</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td width="111">40gs:</td>
|
||||||
|
<td width="536">Model "P"<br>
|
||||||
|
Class 40</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td width="111">48gII:</td>
|
||||||
|
<td width="536">Model "2"</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td width="111">49g+:</td>
|
||||||
|
<td width="536">Model "Q"</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td width="111">50g:</td>
|
||||||
|
<td width="536">Model "Q"<br>
|
||||||
|
Class 50</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<p>Most of the code that was changed in Emu48+ over Emu48 was provided by
|
||||||
|
Cyrille de Brebisson of Hewlett-Packard.</p>
|
||||||
|
<h1><a name=s15>15. License</a></h1>
|
||||||
<p>Emu48 - A HP38G/39G/40G/48SX/48GX/49G Emulator<br>
|
<p>Emu48 - A HP38G/39G/40G/48SX/48GX/49G Emulator<br>
|
||||||
Copyright (C) 2019 Christoph Gießelink</p>
|
Copyright (C) 2020 Christoph Gießelink</p>
|
||||||
|
<p>Emu48+ - A 39g+/39gs/40gs/48gII/49g+/50g Emulator<br>
|
||||||
|
Copyright (C) 2020 Cyrille de Brebisson<br>
|
||||||
|
Additional changes by Bill Graves and Eric Rechlin</p>
|
||||||
<p>This program is free software; you can redistribute it and/or modify it
|
<p>This program is free software; you can redistribute it and/or modify it
|
||||||
under the terms of the GNU General Public License as published by the Free
|
under the terms of the GNU General Public License as published by the Free
|
||||||
Software Foundation; either version 2 of the License, or (at your option)
|
Software Foundation; either version 2 of the License, or (at your option)
|
50
PROBLEMS.TXT
50
PROBLEMS.TXT
|
@ -1,50 +0,0 @@
|
||||||
Known bugs and restrictions of Emu48 V1.62
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
- the following I/O bits aren't emulated (incomplete)
|
|
||||||
DTEST (0x102) [VDIG LID TRIM]
|
|
||||||
DSPCTL (0x103) [LRT LRTD LRTC BIN]
|
|
||||||
LPD (0x108) [LB2 LB1]
|
|
||||||
LPE (0x109) [GRST RST]
|
|
||||||
CMODE (0x10A) Mode register
|
|
||||||
IOC (0x110) [ERBZ]
|
|
||||||
RCS (0x111) [RX RER RBZ]
|
|
||||||
SRQ1 (0x118) [ISQR]
|
|
||||||
SRQ2 (0x119) [LSRQ]
|
|
||||||
IRC (0x11A) [IRI EIRU EIRI IRE]
|
|
||||||
LCR (0x11C) [LBZ LBF]
|
|
||||||
- the baudrates 1920, 3840, 7680 and 15360 aren't emulated on most
|
|
||||||
operating systems
|
|
||||||
Windows 95a 1920, 3840, 7680 work, 15360 fail
|
|
||||||
Windows 98, NT4.0, 2000, XP all baudrates fail
|
|
||||||
- problems when receiving a break signal on the serial port
|
|
||||||
Windows 98, NT4.0 SP4 no retrigger on port open
|
|
||||||
Windows 98 timing problems setting the RER bit
|
|
||||||
Windows 2000 SP2 no known problems
|
|
||||||
- System-RPL commands VERYVERYSLOW, VERYSLOW and SLOW depends on PC
|
|
||||||
speed (are realized as simple down counter in ROM)
|
|
||||||
- display updating differs from the real machine
|
|
||||||
- screen VBL counter values may skip after large display operations
|
|
||||||
like turning on or updating the whole display
|
|
||||||
- read on an unconfigured address (open data bus) will not show the
|
|
||||||
same value like a real calculator
|
|
||||||
- the Yorke hardware signals BEN and DA19 aren't fully supported,
|
|
||||||
because the emulator don't use a multiplexed AR18 / NCE3 data line
|
|
||||||
-> all programs that run on a real calculator will run as well,
|
|
||||||
programs with incorrect DA19 / BEN handling may run on the
|
|
||||||
emulator but will crash on a real calculator
|
|
||||||
- incomplete reset logic of the bank switcher FF, on real
|
|
||||||
calculators a reset happen after about 4s in deep sleep, in the
|
|
||||||
emulator this happens immediately
|
|
||||||
- no MP interrupt on card control circuit or timer restart
|
|
||||||
- Shell OS: clock isn't synchronized with real time
|
|
||||||
- HP49G: the flash memory is emulated now with some restrictions
|
|
||||||
- no flash programming times, the flash state machine returns
|
|
||||||
immediately the ready signal
|
|
||||||
- only one write buffer, second not needed because of prior reason
|
|
||||||
- not fully tested, especially the status byte may return
|
|
||||||
incorrect values (error bits)
|
|
||||||
- quitting the emulator while programming the flash isn't allowed,
|
|
||||||
because the content of flash state machine isn't saved so far
|
|
||||||
|
|
||||||
10/15/19 (c) by Christoph Gießelink, c dot giesselink at gmx dot de
|
|
|
@ -158,6 +158,35 @@ VOID o80B40(VOID)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BEEP2
|
||||||
|
VOID o80B50(CHIPSET* w)
|
||||||
|
{
|
||||||
|
BYTE fbeep;
|
||||||
|
DWORD freq,dur;
|
||||||
|
|
||||||
|
freq = Npack(w->D,5); // frequency in Hz
|
||||||
|
dur = Npack(w->C,5); // duration in ms
|
||||||
|
Nread(&fbeep,0x80F0F,1); // fetch system flags -53 to -56
|
||||||
|
|
||||||
|
w->carry = TRUE; // setting of no beep
|
||||||
|
if (!(fbeep & 0x8) && freq) // bit -56 clear and frequency > 0 Hz
|
||||||
|
{
|
||||||
|
if (freq > 4400) freq = 4400; // high limit of HP (SX)
|
||||||
|
|
||||||
|
SoundBeep(freq,dur); // beeping
|
||||||
|
|
||||||
|
// estimate cpu cycles for beeping time (4MHz)
|
||||||
|
w->cycles += dur * 4000;
|
||||||
|
|
||||||
|
// original routine return with...
|
||||||
|
w->P = 0; // P=0
|
||||||
|
w->intk = TRUE; // INTON
|
||||||
|
w->carry = FALSE; // RTNCC
|
||||||
|
}
|
||||||
|
w->pc = rstkpop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// MOVEDOWN
|
// MOVEDOWN
|
||||||
VOID o80B60(VOID)
|
VOID o80B60(VOID)
|
||||||
{
|
{
|
||||||
|
@ -230,6 +259,38 @@ VOID o80B80(VOID)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RCKBp
|
||||||
|
VOID o80B90(CHIPSET* w) // ROM Check Beep patch
|
||||||
|
{
|
||||||
|
DWORD dw2F,dwCpuFreq;
|
||||||
|
DWORD freq,dur;
|
||||||
|
BYTE f,d;
|
||||||
|
|
||||||
|
f = w->C[1]; // f = freq ctl
|
||||||
|
d = w->C[0]; // d = duration ctl
|
||||||
|
|
||||||
|
// CPU strobe frequency @ RATE 27 = 3.67MHz
|
||||||
|
// CPU strobe frequency @ RATE 29 = 3.93MHz
|
||||||
|
dwCpuFreq = ((27 + 1) * 524288) >> 2;
|
||||||
|
|
||||||
|
dw2F = f * 180 + 367; // F=f*90+183.5
|
||||||
|
|
||||||
|
freq = dwCpuFreq / dw2F;
|
||||||
|
dur = (dw2F * (256 - 16 * d)) * 1000 / 2 / dwCpuFreq;
|
||||||
|
|
||||||
|
if (freq > 4400) freq = 4400; // high limit of HP
|
||||||
|
|
||||||
|
SoundBeep(freq,dur); // beeping
|
||||||
|
|
||||||
|
// estimate cpu cycles for beeping time (4MHz)
|
||||||
|
w->cycles += dur * 4000;
|
||||||
|
|
||||||
|
w->P = 0; // P=0
|
||||||
|
w->carry = FALSE; // RTNCC
|
||||||
|
w->pc = rstkpop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// setup basic memory configuration
|
// setup basic memory configuration
|
||||||
VOID o80B04(VOID)
|
VOID o80B04(VOID)
|
||||||
{
|
{
|
||||||
|
@ -327,11 +388,11 @@ VOID o80BExt(LPBYTE I) // Saturnator extentions
|
||||||
case 0x00: o80B00(); break; // RPL2 (preserve Carry)
|
case 0x00: o80B00(); break; // RPL2 (preserve Carry)
|
||||||
case 0x03: o80B30(); break; // FALSE
|
case 0x03: o80B30(); break; // FALSE
|
||||||
case 0x04: o80B40(); break; // DOFALSE
|
case 0x04: o80B40(); break; // DOFALSE
|
||||||
case 0x05: External(&w); PCHANGED; break; // BEEP2 implemented using Emu48's beep
|
case 0x05: o80B50(&w); PCHANGED; break; // BEEP2 implemented using Emu48's beep
|
||||||
case 0x06: o80B60(); break; // MOVEDOWN
|
case 0x06: o80B60(); break; // MOVEDOWN
|
||||||
case 0x07: o80B70(); break; // MOVEUP
|
case 0x07: o80B70(); break; // MOVEUP
|
||||||
case 0x08: o80B80(); break; // CREATETEMP
|
case 0x08: o80B80(); break; // CREATETEMP
|
||||||
case 0x09: RCKBp(&w); PCHANGED; break; // RCKBp
|
case 0x09: o80B90(&w); PCHANGED; break; // RCKBp (ROM Check Beep patch)
|
||||||
case 0x0A: break; // KEYDN not implemented
|
case 0x0A: break; // KEYDN not implemented
|
||||||
case 0x0B: break; // no doslow implemented
|
case 0x0B: break; // no doslow implemented
|
||||||
case 0x10: // simulate off function
|
case 0x10: // simulate off function
|
||||||
|
|
|
@ -10,9 +10,11 @@
|
||||||
extern VOID o80B00(VOID);
|
extern VOID o80B00(VOID);
|
||||||
extern VOID o80B30(VOID);
|
extern VOID o80B30(VOID);
|
||||||
extern VOID o80B40(VOID);
|
extern VOID o80B40(VOID);
|
||||||
|
extern VOID o80B50(CHIPSET* w);
|
||||||
extern VOID o80B60(VOID);
|
extern VOID o80B60(VOID);
|
||||||
extern VOID o80B70(VOID);
|
extern VOID o80B70(VOID);
|
||||||
extern VOID o80B80(VOID);
|
extern VOID o80B80(VOID);
|
||||||
|
extern VOID o80B90(CHIPSET* w);
|
||||||
extern VOID o80B04(VOID);
|
extern VOID o80B04(VOID);
|
||||||
extern VOID o80B14(VOID);
|
extern VOID o80B14(VOID);
|
||||||
extern VOID o80B24(VOID);
|
extern VOID o80B24(VOID);
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
Service Pack 61+ based on Emu48 Service Pack 62
|
Service Pack 62+ based on Emu48 Service Pack 63
|
||||||
|
|
||||||
See CHANGES.TXT in Emu48 for full history.
|
See CHANGES.TXT in Emu48 for full history.
|
||||||
Only changes specifically made to Emu48+ are shown below.
|
Only changes specifically made to Emu48+ are shown below.
|
||||||
|
|
||||||
|
APPLE.C
|
||||||
|
APPLE.H
|
||||||
|
- Moved BEEP2 and RCKBp here to match other Apple opcodes
|
||||||
|
|
||||||
Service Pack 60+ for Emu48 Version 1.0
|
Service Pack 60+ for Emu48 Version 1.0
|
||||||
|
|
||||||
DISPLAY.C
|
DISPLAY.C
|
||||||
|
|
|
@ -589,21 +589,26 @@ VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID UpdateAnnunciators(VOID)
|
VOID UpdateAnnunciators(DWORD dwUpdateMask)
|
||||||
{
|
{
|
||||||
BYTE c;
|
BYTE c;
|
||||||
|
UINT i;
|
||||||
|
|
||||||
c = (BYTE)(Chipset.IORam[ANNCTRL] | (Chipset.IORam[ANNCTRL+1]<<4));
|
c = (BYTE)(Chipset.IORam[ANNCTRL] | (Chipset.IORam[ANNCTRL+1]<<4));
|
||||||
// switch annunciators off if timer stopped
|
// switch annunciators off if timer stopped
|
||||||
if ((c & AON) == 0 || (Chipset.IORam[TIMER2_CTRL] & RUN) == 0)
|
if ((c & AON) == 0 || (Chipset.IORam[TIMER2_CTRL] & RUN) == 0)
|
||||||
c = 0;
|
c = 0;
|
||||||
|
|
||||||
DrawAnnunciator(1,c&LA1);
|
for (i = 1; i <= 6; ++i)
|
||||||
DrawAnnunciator(2,c&LA2);
|
{
|
||||||
DrawAnnunciator(3,c&LA3);
|
if ((dwUpdateMask & 0x1) != 0) // annunciator changed?
|
||||||
DrawAnnunciator(4,c&LA4);
|
{
|
||||||
DrawAnnunciator(5,c&LA5);
|
DrawAnnunciator(i,c & 0x1);
|
||||||
DrawAnnunciator(6,c&LA6);
|
}
|
||||||
|
dwUpdateMask >>= 1;
|
||||||
|
c >>= 1;
|
||||||
|
}
|
||||||
|
_ASSERT(dwUpdateMask == 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include "kml.h"
|
#include "kml.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
|
||||||
#define VERSION "1.61+"
|
#define VERSION "1.62+"
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
LPCTSTR szNoTitle = _T("Emu48 ")_T(VERSION)_T(" Debug");
|
LPCTSTR szNoTitle = _T("Emu48 ")_T(VERSION)_T(" Debug");
|
||||||
|
@ -904,7 +904,7 @@ static LRESULT OnPaint(HWND hWindow)
|
||||||
GdiFlush();
|
GdiFlush();
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&csGDILock);
|
LeaveCriticalSection(&csGDILock);
|
||||||
UpdateAnnunciators();
|
UpdateAnnunciators(0x3F);
|
||||||
RefreshButtons(&rcMainPaint);
|
RefreshButtons(&rcMainPaint);
|
||||||
}
|
}
|
||||||
EndPaint(hWindow, &Paint);
|
EndPaint(hWindow, &Paint);
|
||||||
|
|
|
@ -253,10 +253,6 @@ SOURCE=.\engine.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\external.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\fetch.c
|
SOURCE=.\fetch.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
|
@ -52,7 +52,6 @@
|
||||||
#define DISP_POINTER 0x01 // defines for display area
|
#define DISP_POINTER 0x01 // defines for display area
|
||||||
#define DISP_MAIN 0x02
|
#define DISP_MAIN 0x02
|
||||||
#define DISP_MENUE 0x04
|
#define DISP_MENUE 0x04
|
||||||
#define DISP_ANNUN 0x08
|
|
||||||
|
|
||||||
#define ROMPAGESIZE (1<<12) // ROM dirty page size in nibbles
|
#define ROMPAGESIZE (1<<12) // ROM dirty page size in nibbles
|
||||||
|
|
||||||
|
@ -182,7 +181,7 @@ extern VOID UpdateMenuDisplay(VOID);
|
||||||
extern VOID RefreshDisp0(); // CdB for HP: add apples display management
|
extern VOID RefreshDisp0(); // CdB for HP: add apples display management
|
||||||
extern VOID WriteToMainDisplay(LPBYTE a, DWORD d, UINT s);
|
extern VOID WriteToMainDisplay(LPBYTE a, DWORD d, UINT s);
|
||||||
extern VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s);
|
extern VOID WriteToMenuDisplay(LPBYTE a, DWORD d, UINT s);
|
||||||
extern VOID UpdateAnnunciators(VOID);
|
extern VOID UpdateAnnunciators(DWORD dwUpdateMask);
|
||||||
extern VOID ResizeWindow(VOID);
|
extern VOID ResizeWindow(VOID);
|
||||||
|
|
||||||
// Engine.c
|
// Engine.c
|
||||||
|
@ -374,10 +373,6 @@ extern DWORD RPL_Pick(UINT l);
|
||||||
extern VOID RPL_Replace(DWORD n);
|
extern VOID RPL_Replace(DWORD n);
|
||||||
extern VOID RPL_Push(UINT l,DWORD n);
|
extern VOID RPL_Push(UINT l,DWORD n);
|
||||||
|
|
||||||
// External.c
|
|
||||||
extern VOID External(CHIPSET* w);
|
|
||||||
extern VOID RCKBp(CHIPSET* w);
|
|
||||||
|
|
||||||
// SndEnum.c
|
// SndEnum.c
|
||||||
extern VOID SetSoundDeviceList(HWND hWnd,UINT uDeviceID);
|
extern VOID SetSoundDeviceList(HWND hWnd,UINT uDeviceID);
|
||||||
|
|
||||||
|
|
|
@ -303,7 +303,7 @@ FONT 8, "MS Sans Serif"
|
||||||
BEGIN
|
BEGIN
|
||||||
ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE
|
ICON IDI_EMU48,IDC_STATIC,7,6,20,20,SS_REALSIZEIMAGE
|
||||||
LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP
|
LTEXT "",IDC_VERSION,29,6,151,8,NOT WS_GROUP
|
||||||
LTEXT "Copyright © 2019 Christoph Gießelink && Sébastien Carlier",
|
LTEXT "Copyright © 2020 Christoph Gießelink && Sébastien Carlier",
|
||||||
IDC_STATIC,29,18,181,8
|
IDC_STATIC,29,18,181,8
|
||||||
DEFPUSHBUTTON "OK",IDOK,215,12,39,14
|
DEFPUSHBUTTON "OK",IDOK,215,12,39,14
|
||||||
EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL |
|
EDITTEXT IDC_LICENSE,7,33,247,112,ES_MULTILINE | ES_AUTOHSCROLL |
|
||||||
|
@ -723,8 +723,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,6,1,0
|
FILEVERSION 1,6,2,0
|
||||||
PRODUCTVERSION 1,6,1,0
|
PRODUCTVERSION 1,6,2,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -741,12 +741,12 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Christoph Gießelink & Sebastien Carlier\0"
|
VALUE "CompanyName", "Christoph Gießelink & Sebastien Carlier\0"
|
||||||
VALUE "FileDescription", "HP38/39/40/48/49/50 Emulator\0"
|
VALUE "FileDescription", "HP38/39/40/48/49/50 Emulator\0"
|
||||||
VALUE "FileVersion", "1, 6, 1, 0\0"
|
VALUE "FileVersion", "1, 6, 2, 0\0"
|
||||||
VALUE "InternalName", "Emu48\0"
|
VALUE "InternalName", "Emu48+\0"
|
||||||
VALUE "LegalCopyright", "Copyright © 2019\0"
|
VALUE "LegalCopyright", "Copyright © 2020\0"
|
||||||
VALUE "OriginalFilename", "Emu48.exe\0"
|
VALUE "OriginalFilename", "Emu48.exe\0"
|
||||||
VALUE "ProductName", "Emu48\0"
|
VALUE "ProductName", "Emu48+\0"
|
||||||
VALUE "ProductVersion", "1, 6, 1, 0\0"
|
VALUE "ProductVersion", "1, 6, 2, 0\0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -140,10 +140,6 @@ SOURCE=.\engine.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\external.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\fetch.c
|
SOURCE=.\fetch.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
|
@ -285,7 +285,6 @@ static __inline VOID CheckDisp(BOOL bSync)
|
||||||
_ASSERT((disp & DISP_POINTER) == 0); // display pointer already updated
|
_ASSERT((disp & DISP_POINTER) == 0); // display pointer already updated
|
||||||
if (disp & DISP_MAIN) UpdateMainDisplay();
|
if (disp & DISP_MAIN) UpdateMainDisplay();
|
||||||
if (disp & DISP_MENUE) UpdateMenuDisplay();
|
if (disp & DISP_MENUE) UpdateMenuDisplay();
|
||||||
_ASSERT((disp & DISP_ANNUN) == 0); // annunciators already updated
|
|
||||||
disp = 0; // display updated
|
disp = 0; // display updated
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -599,7 +598,7 @@ loop:
|
||||||
UpdateMainDisplay();
|
UpdateMainDisplay();
|
||||||
UpdateMenuDisplay();
|
UpdateMenuDisplay();
|
||||||
RefreshDisp0(); // CdB for HP: add apples display management
|
RefreshDisp0(); // CdB for HP: add apples display management
|
||||||
UpdateAnnunciators();
|
UpdateAnnunciators(0x3F);
|
||||||
// init speed reference
|
// init speed reference
|
||||||
dwOldCyc = (DWORD) (Chipset.cycles & 0xFFFFFFFF);
|
dwOldCyc = (DWORD) (Chipset.cycles & 0xFFFFFFFF);
|
||||||
QueryPerformanceCounter(&lDummyInt);
|
QueryPerformanceCounter(&lDummyInt);
|
||||||
|
|
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* external.c
|
|
||||||
*
|
|
||||||
* This file is part of Emu48
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 Sebastien Carlier
|
|
||||||
* Copyright (C) 2005 Christoph Gießelink
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include "pch.h"
|
|
||||||
#include "Emu48.h"
|
|
||||||
#include "ops.h"
|
|
||||||
|
|
||||||
//| 38G | 39G | 40G | 48SX | 48GX | 49G | Name
|
|
||||||
//#F0E4F #80F0F #80F0F #706D2 #80850 #80F0F =SFLAG53_56
|
|
||||||
|
|
||||||
// memory address for flags -53 to -56
|
|
||||||
// CdB for HP: add apples beep management
|
|
||||||
#define SFLAG53_56 ( (cCurrentRomType=='6') \
|
|
||||||
? 0xE0E4F \
|
|
||||||
: ( (cCurrentRomType=='A') \
|
|
||||||
? 0xF0E4F \
|
|
||||||
: ( (cCurrentRomType!='E' && cCurrentRomType!='X' && cCurrentRomType!='P' && cCurrentRomType!='2' && cCurrentRomType!='Q') \
|
|
||||||
? ( (cCurrentRomType=='S') \
|
|
||||||
? 0x706D2 \
|
|
||||||
: 0x80850 \
|
|
||||||
) \
|
|
||||||
: 0x80F0F \
|
|
||||||
) \
|
|
||||||
) \
|
|
||||||
)
|
|
||||||
|
|
||||||
VOID External(CHIPSET* w) // Beep patch
|
|
||||||
{
|
|
||||||
BYTE fbeep;
|
|
||||||
DWORD freq,dur;
|
|
||||||
|
|
||||||
freq = Npack(w->D,5); // frequency in Hz
|
|
||||||
dur = Npack(w->C,5); // duration in ms
|
|
||||||
Nread(&fbeep,SFLAG53_56,1); // fetch system flags -53 to -56
|
|
||||||
|
|
||||||
w->carry = TRUE; // setting of no beep
|
|
||||||
if (!(fbeep & 0x8) && freq) // bit -56 clear and frequency > 0 Hz
|
|
||||||
{
|
|
||||||
if (freq > 4400) freq = 4400; // high limit of HP (SX)
|
|
||||||
|
|
||||||
SoundBeep(freq,dur); // beeping
|
|
||||||
|
|
||||||
// estimate cpu cycles for beeping time (2MHz / 4MHz)
|
|
||||||
w->cycles += dur * ((cCurrentRomType=='S') ? 2000 : 4000);
|
|
||||||
|
|
||||||
// original routine return with...
|
|
||||||
w->P = 0; // P=0
|
|
||||||
w->intk = TRUE; // INTON
|
|
||||||
w->carry = FALSE; // RTNCC
|
|
||||||
}
|
|
||||||
w->pc = rstkpop();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID RCKBp(CHIPSET* w) // ROM Check Beep patch
|
|
||||||
{
|
|
||||||
DWORD dw2F,dwCpuFreq;
|
|
||||||
DWORD freq,dur;
|
|
||||||
BYTE f,d;
|
|
||||||
|
|
||||||
f = w->C[1]; // f = freq ctl
|
|
||||||
d = w->C[0]; // d = duration ctl
|
|
||||||
|
|
||||||
if (cCurrentRomType == 'S') // Clarke chip with 48S ROM
|
|
||||||
{
|
|
||||||
// CPU strobe frequency @ RATE 14 = 1.97MHz
|
|
||||||
dwCpuFreq = ((14 + 1) * 524288) >> 2;
|
|
||||||
|
|
||||||
dw2F = f * 126 + 262; // F=f*63+131
|
|
||||||
}
|
|
||||||
else // York chip with 48G and later ROM
|
|
||||||
{
|
|
||||||
// CPU strobe frequency @ RATE 27 = 3.67MHz
|
|
||||||
// CPU strobe frequency @ RATE 29 = 3.93MHz
|
|
||||||
dwCpuFreq = ((27 + 1) * 524288) >> 2;
|
|
||||||
|
|
||||||
dw2F = f * 180 + 367; // F=f*90+183.5
|
|
||||||
}
|
|
||||||
|
|
||||||
freq = dwCpuFreq / dw2F;
|
|
||||||
dur = (dw2F * (256 - 16 * d)) * 1000 / 2 / dwCpuFreq;
|
|
||||||
|
|
||||||
if (freq > 4400) freq = 4400; // high limit of HP
|
|
||||||
|
|
||||||
SoundBeep(freq,dur); // beeping
|
|
||||||
|
|
||||||
// estimate cpu cycles for beeping time (2MHz / 4MHz)
|
|
||||||
w->cycles += dur * ((cCurrentRomType=='S') ? 2000 : 4000);
|
|
||||||
|
|
||||||
w->P = 0; // P=0
|
|
||||||
w->carry = FALSE; // RTNCC
|
|
||||||
w->pc = rstkpop();
|
|
||||||
return;
|
|
||||||
}
|
|
|
@ -321,7 +321,7 @@ static JMPTAB o8A_[] =
|
||||||
static JMPTAB o81B_[] =
|
static JMPTAB o81B_[] =
|
||||||
{
|
{
|
||||||
(LPCVOID) o_invalid4, F,
|
(LPCVOID) o_invalid4, F,
|
||||||
(LPCVOID) o81B1, F, // normally o_invalid4, beep patch, Apple: LOOP
|
(LPCVOID) o81B1, F, // normally o_invalid4, Apple: LOOP
|
||||||
(LPCVOID) o81B2, F,
|
(LPCVOID) o81B2, F,
|
||||||
(LPCVOID) o81B3, F,
|
(LPCVOID) o81B3, F,
|
||||||
(LPCVOID) o81B4, F,
|
(LPCVOID) o81B4, F,
|
||||||
|
|
|
@ -1017,8 +1017,16 @@ BOOL OpenDocument(LPCTSTR szFilename)
|
||||||
case 0xFE: // Win48 2.1 / Emu4x 0.99.x format
|
case 0xFE: // Win48 2.1 / Emu4x 0.99.x format
|
||||||
// read length of KML script name
|
// read length of KML script name
|
||||||
ReadFile(hFile,&nLength,sizeof(nLength),&lBytesRead,NULL);
|
ReadFile(hFile,&nLength,sizeof(nLength),&lBytesRead,NULL);
|
||||||
|
|
||||||
// KML script name too long for file buffer
|
// KML script name too long for file buffer
|
||||||
if (nLength >= ARRAYSIZEOF(szCurrentKml)) goto read_err;
|
if (nLength >= ARRAYSIZEOF(szCurrentKml))
|
||||||
|
{
|
||||||
|
// skip heading KML script name characters until remainder fits into file buffer
|
||||||
|
UINT nSkip = nLength - (ARRAYSIZEOF(szCurrentKml) - 1);
|
||||||
|
SetFilePointer(hFile, nSkip, NULL, FILE_CURRENT);
|
||||||
|
|
||||||
|
nLength = ARRAYSIZEOF(szCurrentKml) - 1;
|
||||||
|
}
|
||||||
#if defined _UNICODE
|
#if defined _UNICODE
|
||||||
{
|
{
|
||||||
LPSTR szTmp = (LPSTR) malloc(nLength);
|
LPSTR szTmp = (LPSTR) malloc(nLength);
|
||||||
|
@ -2575,7 +2583,7 @@ static BOOL LabColorCmp(DWORD dwColor1,DWORD dwColor2,DWORD dwTol)
|
||||||
nDiffCol = (INT) (dwColor1 & 0xFF) - (INT) (dwColor2 & 0xFF);
|
nDiffCol = (INT) (dwColor1 & 0xFF) - (INT) (dwColor2 & 0xFF);
|
||||||
dwDiff += (DWORD) (nDiffCol * nDiffCol);
|
dwDiff += (DWORD) (nDiffCol * nDiffCol);
|
||||||
dwTol *= dwTol;
|
dwTol *= dwTol;
|
||||||
|
|
||||||
return dwDiff > dwTol; // FALSE = colors match
|
return dwDiff > dwTol; // FALSE = colors match
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2630,9 +2630,8 @@ BOOL InitKML(LPCTSTR szFilename, BOOL bNoLog)
|
||||||
}
|
}
|
||||||
if (CheckForBeepPatch()) // check if ROM contain beep patches
|
if (CheckForBeepPatch()) // check if ROM contain beep patches
|
||||||
{
|
{
|
||||||
AddToLog(_T("Warning, ROM beep patch detected. Remove beep patches please."));
|
AddToLog(_T("Error, ROM beep patch detected. Remove beep patches please."));
|
||||||
bNoLog = FALSE;
|
goto quit;
|
||||||
bAlwaysDisplayLog = TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ResizeMainBitmap(nScaleMul,nScaleDiv); // resize main picture
|
ResizeMainBitmap(nScaleMul,nScaleDiv); // resize main picture
|
||||||
|
|
1738
source/LODEPNG.C
1738
source/LODEPNG.C
File diff suppressed because it is too large
Load diff
3898
source/LODEPNG.H
3898
source/LODEPNG.H
File diff suppressed because it is too large
Load diff
|
@ -1307,6 +1307,7 @@ VOID WriteIO(BYTE *a, DWORD d, DWORD s)
|
||||||
BOOL bDISPADDR = FALSE; // flag addr 0x120-0x124 changed
|
BOOL bDISPADDR = FALSE; // flag addr 0x120-0x124 changed
|
||||||
BOOL bLINEOFFS = FALSE; // flag addr 0x125-0x127 changed
|
BOOL bLINEOFFS = FALSE; // flag addr 0x125-0x127 changed
|
||||||
BOOL bMENUADDR = FALSE; // flag addr 0x130-0x134 changed
|
BOOL bMENUADDR = FALSE; // flag addr 0x130-0x134 changed
|
||||||
|
DWORD dwAnnunciator = 0; // no annunciator write
|
||||||
|
|
||||||
#if defined DEBUG_IO
|
#if defined DEBUG_IO
|
||||||
{
|
{
|
||||||
|
@ -1412,7 +1413,8 @@ VOID WriteIO(BYTE *a, DWORD d, DWORD s)
|
||||||
if (c & RST)
|
if (c & RST)
|
||||||
{
|
{
|
||||||
CpuReset(); // emulate NRES signal
|
CpuReset(); // emulate NRES signal
|
||||||
disp |= (DISP_POINTER | DISP_MAIN | DISP_MENUE | DISP_ANNUN);
|
disp |= (DISP_POINTER | DISP_MAIN | DISP_MENUE);
|
||||||
|
dwAnnunciator = 0x3F; // update all annunciators
|
||||||
bInterrupt = TRUE; // SHUTDN
|
bInterrupt = TRUE; // SHUTDN
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1425,11 +1427,9 @@ VOID WriteIO(BYTE *a, DWORD d, DWORD s)
|
||||||
// 0010B @ Annunciator control [LA4 LA3 LA2 LA1] = [ alarm alpha -> <- ]
|
// 0010B @ Annunciator control [LA4 LA3 LA2 LA1] = [ alarm alpha -> <- ]
|
||||||
case 0x0B:
|
case 0x0B:
|
||||||
case 0x0C:
|
case 0x0C:
|
||||||
if (c!=Chipset.IORam[d])
|
// annunciator changed
|
||||||
{
|
dwAnnunciator |= ((Chipset.IORam[d] ^c) << ((d - 0x0B) * 4)) & 0x3F;
|
||||||
Chipset.IORam[d] = c;
|
Chipset.IORam[d] = c;
|
||||||
disp |= DISP_ANNUN;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 0010D = NS:BAUD
|
// 0010D = NS:BAUD
|
||||||
|
@ -1759,7 +1759,7 @@ VOID WriteIO(BYTE *a, DWORD d, DWORD s)
|
||||||
StartTimers();
|
StartTimers();
|
||||||
else
|
else
|
||||||
StopTimers();
|
StopTimers();
|
||||||
disp |= DISP_ANNUN; // update annunciators
|
dwAnnunciator = 0x3F; // update all annunciators
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 00130 = NS:MENUADDR
|
// 00130 = NS:MENUADDR
|
||||||
|
@ -1842,10 +1842,9 @@ finish:
|
||||||
disp &= ~DISP_POINTER; // display pointer updated
|
disp &= ~DISP_POINTER; // display pointer updated
|
||||||
UpdateDisplayPointers();
|
UpdateDisplayPointers();
|
||||||
}
|
}
|
||||||
if (disp & DISP_ANNUN)
|
if (dwAnnunciator)
|
||||||
{
|
{
|
||||||
disp &= ~DISP_ANNUN; // annunciators updated
|
UpdateAnnunciators(dwAnnunciator);
|
||||||
UpdateAnnunciators();
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2444,7 +2444,7 @@ VOID o_goyes5(LPBYTE I)
|
||||||
}
|
}
|
||||||
|
|
||||||
//////// EXTENSIONS ////////
|
//////// EXTENSIONS ////////
|
||||||
VOID o81B1(LPBYTE I) // beep patch
|
VOID o81B1(LPBYTE I)
|
||||||
{
|
{
|
||||||
if (cCurrentRomType=='Q' || cCurrentRomType=='2' || cCurrentRomType=='P')
|
if (cCurrentRomType=='Q' || cCurrentRomType=='2' || cCurrentRomType=='P')
|
||||||
{
|
{
|
||||||
|
@ -2454,9 +2454,8 @@ VOID o81B1(LPBYTE I) // beep patch
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Emu48 borrows this opcode for the beep patch on the non-ARM-based calculators
|
// this opcode was used for the beep patch on the non-ARM-based calculators, not used any more
|
||||||
External(&w); // beep patch
|
o_invalid4(I);
|
||||||
PCHANGED; // update field select table
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue