2020-09-30: Updated to version 62

Signed-off-by: Gwenhael Le Moine <gwenhael.le.moine@gmail.com>
This commit is contained in:
Gwenhael Le Moine 2024-03-20 07:46:28 +01:00
parent b29959b1f3
commit 20ce3f59ed
No known key found for this signature in database
GPG key ID: FDFE3669426707A7
22 changed files with 3031 additions and 2994 deletions

BIN
Emu48.dll

Binary file not shown.

BIN
Emu48.exe

Binary file not shown.

View file

@ -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 &quot;KML
implementation by a ROM patch maybe removed in later versions of the Script Compilation Result&quot; 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 &quot;KML Script Compilation
Result&quot; 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&szlig;elink</p> Copyright (C) 2020 Christoph Gie&szlig;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)

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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;
} }

View file

@ -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);

View file

@ -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

View 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);

View file

@ -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"

View file

@ -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

View 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);

View file

@ -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;
}

View file

@ -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,

View file

@ -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
} }

View file

@ -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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -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;
} }

View file

@ -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;
} }