1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-03-15 14:27:19 +00:00

Compare commits

...

59 Commits

Author SHA1 Message Date
Frank Halasz
eac4cdc3d3 Update install of sdl2 for emscripten in buildRelease workflow. 2024-02-16 12:45:30 -08:00
Frank Halasz
eacdd98f48 1. Replace wasm build with wasm_nl builds and get rid of wasm_nl flag. Update buildRelease.yml and makeright accordingly. 2. Add -lidbfs.js flag to LDFLAGS in makefile-emscripten-wasm.wasm. 3. Update buildRelease.yml docker action versions to accomdate github moving from node 16 to node 20. 2024-02-16 12:32:15 -08:00
Frank Halasz
fb579a2ab5 Merge pull request #491 from Interlisp/fgh_emscripten-vmem_save
Fix Issue#1541: IL:LOGOUT does not work running Medley on emscripten maiko
2024-02-16 12:03:31 -08:00
Frank Halasz
258f70a82b Fix Issue#1541: IL:LOGOUT does not work running Medley on emscripten maiko 2024-02-16 00:03:39 -08:00
Nick Briggs
895f765105 Merge pull request #490 from Interlisp/nhb-no-wasm-getrusage
Emscripten/wasm does not support getrusage() system call
2024-02-13 16:08:40 -08:00
Nick Briggs
9f02ce0590 Emscripten/wasm does not support getrusage() system call
Updating the MiscStats data can at best provide the time of day and
attribute all elapsed time to total CPU time.

Closes issue #1537
2024-02-12 09:30:46 -08:00
Frank Halasz
ce20accae3 Merge pull request #489 from Interlisp/fgh_em-build-01
Add Emscripten build to buildRelease workflow
2024-02-11 14:28:57 -08:00
Frank Halasz
ce7deadad3 Added LZ4 compression to wasm_nl 2024-02-10 00:40:20 -08:00
Frank Halasz
0b0c82ce18 Returning buildRelease to full builds 2024-02-07 18:37:47 -08:00
Frank Halasz
3ae25f81f8 update actions to later versions to account for githiubs move from node16 to node20 2024-02-07 18:29:22 -08:00
Frank Halasz
52a3512379 additional fix to tar of emscripten files 2024-02-07 18:09:39 -08:00
Frank Halasz
df6dd883a6 fix tar of emscripten files 2024-02-07 18:01:36 -08:00
Frank Halasz
3d341e3bbd 5 Debugging emscripten install PATH updates 2024-02-07 17:53:53 -08:00
Frank Halasz
ebe4babbe1 4 Debugging emscripten install PATH updates 2024-02-07 17:23:40 -08:00
Frank Halasz
587ce1983a 3 Debugging emscripten install PATH updates 2024-02-07 17:14:16 -08:00
Frank Halasz
b841a44427 2 Debugging emscripten install PATH updates 2024-02-07 17:10:01 -08:00
Frank Halasz
efd200dbf7 Debugging emscripten install PATH updates 2024-02-07 17:02:21 -08:00
Frank Halasz
640f69877f More on fixing emscripten install PATH updates 2024-02-07 16:57:04 -08:00
Frank Halasz
400f3b7835 Fix emscripten install PATH updates 2024-02-07 16:49:26 -08:00
Frank Halasz
e657b2e1dc Debugging emscriten build 2024-02-07 13:21:01 -08:00
Frank Halasz
75c815f585 Fix typo in emscripten install 2024-02-07 13:13:04 -08:00
Frank Halasz
696ac9a675 Fix install of SDL2 2024-02-07 13:08:39 -08:00
Frank Halasz
8c54c0fbe0 First pass at workflow to build maiko for emscripten 2024-02-07 12:55:49 -08:00
Nick Briggs
586a3206c2 Merge pull request #488 from Interlisp/incorporate-wasm-changes
Incorporate wasm changes
2024-01-26 08:42:15 -08:00
Nick Briggs
e93e3c895e Update preloaded directories, allow Emscripten runtime to exit, set MAIKO_ENABLE_NETHUB
Compiling with -DMAIKO_ENABLE_NETHUB makes it possible to test out having a WebSocket
server that could pass packets back and forth to the Dodo NetHub.

Setting Emscripten link-time option for EXIT_RUNTIME allows the runtime code to shutdown
when you exit Medley via a (LOGOUT)

Set up preloads for all the parts of the Medley directory that MEDLEYDIR-INIT expects
to be there.  The resulting ldesdl.data is (at this time) 128 MB.  It can be installed
gzipped if using nginx or some other web server that supports pre-zipped static files.
It would be better to have these as lazy-loading files, but the setup for that is
complicated.  Another alternative to embedding all the data would be if a WebSocket
to  XNS/Nethub gateway were written and deployed.
2024-01-01 17:30:01 -08:00
Nick Briggs
29fdf4c40b Adapt to window geometry, set up a fake environment variable MEDLEYDIR
Passes the window width/height as the requested geometry to lde at startup.

Since we control the directory structure of the file-system, we can pass the
known fixed location of the Medley directories in the MEDLEYDIR environment variable.

Sets up the NetHub host as localhost - not currenty functional, but a WebSocket
server could be added to communicate with the NetHub gateway to enable local
networking from the browser version of Medley.
2024-01-01 16:58:23 -08:00
Nick Briggs
7bb2393637 Adjustments to WAsm file system layout and compilation options
Moves the full.sysout from the root of tle system to /medley/loadups/full.sysout,
adds /medley/lispusers/BACKGROUND-YIELD.LCOM and an Emscripten/WAsm specific
site init file at /usr/local/lde/site-init.lisp

Adjusts options so that the options are in the correct place for the
compiler and loader.
2023-12-27 17:20:11 -08:00
Nick Briggs
7c1d2081c8 Ignore all wasm generated directories, lde[sdl].html has moved to src directory 2023-12-22 19:21:59 -08:00
Nick Briggs
acffcb74aa Merge remote-tracking branch 'wasm-updates/master' into incorporate-wasm-changes 2023-12-22 19:18:56 -08:00
Nick Briggs
ad71e1e830 Merge remote-tracking branch 'no-defun-allowed/master' into incorporate-wasm-changes 2023-12-22 19:15:28 -08:00
Nick Briggs
4b0032e1b6 Piggyback on existing async timer emulation instruction countdown for periodic emscripten_sleep() call.
There is no need for an additional Emscripten-specific counter to periodically call emscripten_sleep().

Make test for Emscripten environment check MAIKO_OS_EMSCRIPTEN rather than checking __EMSCRIPTEN__,
which is localized in the maiko/platform.h include.
2023-12-22 18:17:02 -08:00
Nick Briggs
b21fbcbcb1 subr_settime should avoid settimeofday() completely in Emscripten environment 2023-12-22 18:15:18 -08:00
Nick Briggs
0cc8e4d71c Revert/update unixfork.c since it is no longer used in emscripten based builds 2023-12-22 13:35:33 -08:00
Nick Briggs
bee6a2f33e amend! Give emcc link-time flags only to the link phase not the compile phase
Give emcc link-time flags only to the link phase not the compile phase
Remove target "lde" which is not used in the emscripten configuration.
2023-12-22 13:27:05 -08:00
Nick Briggs
f208fd3302 Rename/move ldesdl.html out of emscripten.wasm (which gets cleared on rebuild) to src/lde.html 2023-12-22 13:18:20 -08:00
Nick Briggs
e82b47a9e7 Give emcc link-time flags only to the link phase not the compile phase 2023-12-22 13:13:32 -08:00
Nick Briggs
b666b1b2de Add stubs for X11 IOErrorHandler and IOErrorExitHandler (#487)
Adds stub procedures and hooks them in to the X11 error handlers as an
example of how we may be able to handle lost X connections and
gracefully terminate the session.
2023-12-22 10:36:13 -08:00
Matt Heffron
d933ba88b7 XFree(mapping) was called *before* mapping was referenced in DEBUG conditional code. (#486)
This is only a potential issue in DEBUG build. A problem hasn't occurred, that I know of, but it seemed best just to be safe.
Moved the DEBUG code to precede the XFree(mapping) call. (Equivalent to moving the XFree down.)
2023-12-16 15:14:02 -08:00
Nick Briggs
56e7591ada Although an unlikely case, LispNumToCInt() should handle negative SmallP numbers correctly 2023-11-17 13:11:11 -08:00
Nick Briggs
28d7d5ec00 improve debug output in interprocess communication code 2023-11-17 12:11:10 -08:00
Nick Briggs
1e0264416f Error exits in forked process code should exit with failure status rather than success 2023-11-17 12:07:23 -08:00
Nick Briggs
15966ccf34 If SUNDISPLAY is defined REALCURSOR will be defined so remove redundant defined(SUNDISPLAY) 2023-11-17 09:46:22 -08:00
Nick Briggs
09fae0a3f5 Add file name and line number to debug print output. 2023-11-17 09:41:37 -08:00
Nick Briggs
2caa2269a9 Avoid initializing CLastUserActionCell68k in INIT mode as \LASTUSERACTION will not have been set. 2023-11-13 13:23:41 -08:00
Hayley Patton
7b2cf44c7c Add ldesdl.html 2023-11-13 15:30:19 +11:00
Hayley Patton
79a788279b Add Emscripten/WASM support 2023-11-13 15:18:49 +11:00
Nick Briggs
42477318b5 Assignments embedded in if-condition are not a good idea. 2023-11-12 17:37:34 -08:00
Nick Briggs
6cea8c69b0 Switch makefile slice for building ldeinit on Linux x86_64 from clang to gcc 2023-11-12 15:46:30 -08:00
Nick Briggs
eb3b382ac6 Correct comment about processor type in makefile slice 2023-11-12 15:44:29 -08:00
Nick Briggs
c9b4164d89 Add makefile slice for building ldeinit on Linux aarch64 systems 2023-11-12 15:43:07 -08:00
Nick Briggs
562f4c30ee Fix typo 2023-11-09 16:48:48 -08:00
Nick Briggs
98569d10b4 Reduce false positives for misaligned pointer access when checking array blocks
The forward and backward pointers in an array block only contain
    valid pointer values when the block is free therefore avoid
    producing native addresses from these fields if the block is in use.

Add comments regarding the operation of the array block merging code
    Array block merging will produce a single block if possible,
    otherwise it will produce two blocks with one as large as possible
    and the other no less than the minimum block size.

Rewrite the checks in array block merge forward to minimize unnecessary field accesses
2023-11-09 15:43:11 -08:00
Bill Stumbo
3207df6e24 Update README fixing location of Medley Introduction. (#484) 2023-09-13 07:49:27 -07:00
Nick Briggs
7fce08f92c More Lisp variables to avoid in INIT mode - turn off X11 input handling (#482) 2023-08-09 14:04:51 -07:00
Nick Briggs
2c55f7923c Add makefile slice for OpenBSD init on x86_64. (#478)
* Add makefile slice for OpenBSD init on x86_64.

* Correct flags for init.
2023-08-03 11:55:22 -07:00
Nick Briggs
b441a28c34 Teach CMake to build ldeinit, update clang-tidy names (#474)
Have CMake build ldeinit when configured for X11 display, and
update the ever-growing list of names under which clang-tidy may
be found (now up to version 16)
2023-08-03 10:20:15 -07:00
Nick Briggs
09e73d4153 Update machinetype and osversion scripts to invoke config.guess from same directory (#479)
If machinetype or osversion are executed from other than the current working directory
they will fail to execute the config.guess script because it was invoked with "./config.guess".
This update attempts to determine the directory where machinetype or osversion
were found and uses the same path to invoke config.guess.
2023-08-03 10:18:02 -07:00
Nick Briggs
8e43a393bd Avoid setting Lisp variables whose locations are unknown when in INIT mode (#481)
* Avoid setting Lisp variables whose locations are unknown when in INIT mode.

* Exit with a success (0) status for normal lisp_finish.
2023-08-01 11:16:42 -07:00
Nick Briggs
4a9f5500c4 struct buf is missing definition for byte-swapped bigvm case (#477)
While there was a definition for the pre-bigvm case, with 24-bit
pointers, for byteswapped (little-endian) systems, there was no
structure definition for the bigvm case, with 28-bit pointers.
2023-07-24 20:43:25 -07:00
28 changed files with 363 additions and 67 deletions

View File

@@ -107,7 +107,7 @@ jobs:
echo "linux=true" >> $GITHUB_OUTPUT;
echo "macos=true" >> $GITHUB_OUTPUT;
echo "windows=true" >> $GITHUB_OUTPUT;
######################################################################################
@@ -123,7 +123,7 @@ jobs:
steps:
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}
@@ -157,7 +157,7 @@ jobs:
steps:
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}
@@ -165,7 +165,7 @@ jobs:
# Checkout the branch
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
# Setup release tag
- name: Setup Release Tag
@@ -185,14 +185,14 @@ jobs:
# Setup the Docker Machine Emulation environment.
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
with:
platforms: linux/amd64,linux/arm64,linux/arm/v7
# Setup the Docker Buildx funtion
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
# Do the Docker Build using the Dockerfile in the repository we
# checked out. Save the results in a directory under /tmp to be used
@@ -204,7 +204,7 @@ jobs:
# Dockerfile, NOT HERE IN THE WORKFLOW.
#
- name: Build Docker Image and Save It Locally
uses: docker/build-push-action@v4
uses: docker/build-push-action@v5
with:
builder: ${{ steps.buildx.outputs.name }}
build-args: |
@@ -272,11 +272,11 @@ jobs:
# Checkout the branch
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}
@@ -324,7 +324,7 @@ jobs:
export LDEARCH=aarch64-apple-darwin
./makeright init
mkdir -p ../darwin.universal
exe=ldeinit
exe=ldeinit
lipo -create \
-arch arm64 ../darwin.aarch64/${exe} \
-arch x86_64 ../darwin.x86_64/${exe} \
@@ -346,7 +346,7 @@ jobs:
lipo ${exe} -output ../darwin.x86_64/${exe} -extract x86_64
lipo ${exe} -output ../darwin.aarch64/${exe} -extract arm64
cp -p ${exe} ../darwin.universal/${exe}
done
done
# Create release tar for github.
- name: Make release tar(s)
@@ -369,7 +369,7 @@ jobs:
# Push Release
- name: Push the release
uses: ncipollo/release-action@v1
with:
with:
allowUpdates: true
artifacts:
/tmp/release_tars/${{ steps.tag.outputs.release_tag }}-darwin.x86_64.tgz,
@@ -383,7 +383,7 @@ jobs:
# Windows: build for Windows-Cygwin via Docker build and use results to
# create and push release assets to github
windows:
needs: [inputs, sentry]
@@ -418,7 +418,7 @@ jobs:
# Retrieve SDL2 and install in cygwin
- name: Install SDL2
id: sdl2
env:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release download 2.26.5 --repo interlisp/cygwin-sdl --pattern *.tgz --output .\cygwin\sdl2.tar.gz
@@ -426,13 +426,13 @@ jobs:
# Checkout the branch
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
path: cygwin\maiko
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}
@@ -473,6 +473,81 @@ jobs:
######################################################################################
# Emscripten: build and push Maiko compiled for Emscripten (to run Maiko in browser)
emscripten:
needs: [inputs, sentry]
if: |
needs.inputs.outputs.linux == 'true'
&& (
needs.sentry.outputs.release_not_built == 'true'
|| needs.inputs.outputs.force == 'true'
)
runs-on: ubuntu-latest
steps:
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v4
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}
- run: mv ./Actions_${{ github.sha }}/actions ../actions && rm -rf ./Actions_${{ github.sha }}
# Install SDL2
- name: Install SDL2
run: |
export DEBIAN_FRONTEND=noninteractive
sudo -E apt-get update
sudo -E apt-get install -y libsdl2-dev libsdl2-2.0-0
# Install Emscripten SDK
- name: Install Empscripten
working-directory: ../
run: |
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install latest
./emsdk activate latest
CWD="$(pwd)"
echo "${CWD}" >> ${GITHUB_PATH}
echo "${CWD}/upstream/emscripten" >> ${GITHUB_PATH}
echo "${CWD}/upstream/emscripten/tools" >> ${GITHUB_PATH}
echo "${CWD}/node/$(ls -d node/*64bit | tail -1)/bin" >> ${GITHUB_PATH}
# Checkout the maiko branch
- name: Checkout
uses: actions/checkout@v4
# Setup release tag
- name: Setup Release Tag
id: tag
uses: ./../actions/release-tag-action
# Compile maiko using Emscripten (no load build)
- name: Compile Maiko using Emscripten
working-directory: ./bin
run: |
./makeright wasm
cd ../emscripten.wasm
tar -c -z -f ../${{ steps.tag.outputs.release_tag }}-emscripten.tgz *
# Push Release to github
- name: Push the release
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: ${{ steps.tag.outputs.release_tag }}-emscripten.tgz
tag: ${{ steps.tag.outputs.release_tag }}
draft: ${{ needs.inputs.outputs.draft }}
token: ${{ secrets.GITHUB_TOKEN }}
######################################################################################
# Use set-sentry-action to determine set the sentry that says this release has
@@ -485,12 +560,12 @@ jobs:
outputs:
build_successful: ${{ steps.output.outputs.build_successful }}
needs: [inputs, sentry, linux, macos, windows]
needs: [inputs, sentry, linux, macos, windows, emscripten]
steps:
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}

4
.gitignore vendored
View File

@@ -19,6 +19,10 @@ cmake-build-*/**
*.x86_64-x/**
*.x86_64-sdl/**
*.x86_64/**
*.wasm/**
*.wasm-wasm/**
*.wasm_nl/**
*.wasm_nl-wasm_nl/**
*.armv7l-x/**
*.armv7l/**
*.aarch64-x/**

View File

@@ -18,7 +18,7 @@ ENDIF()
find_program(
CLANG_TIDY_EXE
NAMES "clang-tidy" "clang-tidy13" "clang-tidy12" "clang-tidy11" "clang-tidy10"
NAMES "clang-tidy" "clang-tidy16" "clang-tidy15" "clang-tidy14" "clang-tidy13" "clang-tidy12" "clang-tidy11" "clang-tidy10"
DOC "Path to clang-tidy executable"
)
@@ -41,6 +41,10 @@ SET(MAIKO_DEFINITIONS
"-DRELEASE=351"
)
SET(MAIKO_INIT_DEFINITIONS
"-DRELEASE=351" "-DINIT" "-DNOVERSION"
)
OPTION(MAIKO_DISPLAY_X11 "Use X11 for display." ON)
OPTION(MAIKO_DISPLAY_SDL "Use SDL for display." OFF)
@@ -454,6 +458,18 @@ IF(MAIKO_DISPLAY_X11)
TARGET_COMPILE_DEFINITIONS(ldex PUBLIC ${MAIKO_DEFINITIONS} ${MAIKO_DISPLAY_X11_DEFINITIONS})
TARGET_INCLUDE_DIRECTORIES(ldex PUBLIC inc)
TARGET_LINK_LIBRARIES(ldex ${MAIKO_LIBRARIES} ${MAIKO_DISPLAY_X11_LIBRARIES})
ADD_EXECUTABLE(ldeinit
src/main.c
vdate.c
${MAIKO_SRCS}
${MAIKO_HDRS}
${MAIKO_DISPLAY_X11_SRCS}
${MAIKO_DISPLAY_X11_HDRS}
)
TARGET_COMPILE_DEFINITIONS(ldeinit PUBLIC ${MAIKO_INIT_DEFINITIONS} ${MAIKO_DISPLAY_X11_DEFINITIONS})
TARGET_INCLUDE_DIRECTORIES(ldeinit PUBLIC inc)
TARGET_LINK_LIBRARIES(ldeinit ${MAIKO_LIBRARIES} ${MAIKO_DISPLAY_X11_LIBRARIES})
ENDIF()
IF(MAIKO_DISPLAY_SDL)

View File

@@ -4,7 +4,7 @@ Maiko is the implementation of the Medley Interlisp virtual machine, for a
byte-coded Lisp instruction set and some low-level functions for
connecting with Lisp for access to display (via X11) and disk etc.
For an overview, see [Medley Interlisp Introduction](https://github.com/Interlisp/medley/wiki/Medley-Interlisp-Introduction).
For an overview, see [Medley Interlisp Introduction](https://interlisp.org/medley/using/docs/medley/).
See [the Medley repository](https://github.com/Interlisp/medley) for
* [Issues](https://github.com/Interlisp/medley/issues) (note that maiko issues are there too)

View File

@@ -9,7 +9,8 @@
# #
#########################################################################
os=${LDEARCH:-`./config.guess`}
SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
os=${LDEARCH:-`$SCRIPTPATH/config.guess`}
# o/s switch block
case "$os" in
m68k-*) echo m68k ;;

View File

@@ -0,0 +1,20 @@
# Options for Emscripten, WASM and SDL
CC = emcc $(CLANG_CFLAGS)
XFILES = $(OBJECTDIR)sdl.o
XFLAGS = -DSDL -sUSE_SDL=2
# OPTFLAGS is normally -O2.
OPTFLAGS = -O2
DFLAGS = $(XFLAGS) -DRELEASE=351 -DMAIKO_ENABLE_NETHUB
LD = emcc
LDFLAGS = -lidbfs.js -sUSE_SDL=2 -sASYNCIFY -sALLOW_MEMORY_GROWTH -sEXIT_RUNTIME=1 -sFORCE_FILESYSTEM -sLZ4
LDELDFLAGS =
OBJECTDIR = ../$(RELEASENAME)/
default : ../$(OSARCHNAME)/ldesdl.js

View File

@@ -0,0 +1,29 @@
# Options for Linux, aarch64 processor, X windows, for INIT processing
CC = gcc $(GCC_CFLAGS)
#CC = clang $(CLANG_CFLAGS)
XFILES = $(OBJECTDIR)xmkicon.o \
$(OBJECTDIR)xbbt.o \
$(OBJECTDIR)dspif.o \
$(OBJECTDIR)xinit.o \
$(OBJECTDIR)xscroll.o \
$(OBJECTDIR)xcursor.o \
$(OBJECTDIR)xlspwin.o \
$(OBJECTDIR)xrdopt.o \
$(OBJECTDIR)xwinman.o
XFLAGS = -DXWINDOW
# OPTFLAGS is normally -O2, for INIT we want unoptimized in case we need to debug it
OPTFLAGS = -O0 -g
DEBUGFLAGS =
DFLAGS = $(DEBUGFLAGS) $(XFLAGS) -DRELEASE=351 -DNOVERSION -DINIT
LDFLAGS = -L/usr/X11/lib -lX11 -lc -lm
LDELDFLAGS = -L/usr/X11/lib -lX11 -lc -lm
OBJECTDIR = ../$(RELEASENAME)/
default : ../$(OSARCHNAME)/ldeinit

View File

@@ -1,7 +1,7 @@
# Options for Linux, x86 processor, X windows, for INIT processing
#CC = gcc -m64 $(GCC_CFLAGS)
CC = clang -m64 $(CLANG_CFLAGS)
CC = gcc $(GCC_CFLAGS)
#CC = clang $(CLANG_CFLAGS)
XFILES = $(OBJECTDIR)xmkicon.o \
$(OBJECTDIR)xbbt.o \

View File

@@ -0,0 +1,27 @@
# Options for OpenBSD, Intel x86_64 and X-Window
CC = clang -m64 $(CLANG_CFLAGS)
XFILES = $(OBJECTDIR)xmkicon.o \
$(OBJECTDIR)xbbt.o \
$(OBJECTDIR)dspif.o \
$(OBJECTDIR)xinit.o \
$(OBJECTDIR)xscroll.o \
$(OBJECTDIR)xcursor.o \
$(OBJECTDIR)xlspwin.o \
$(OBJECTDIR)xrdopt.o \
$(OBJECTDIR)xwinman.o
XFLAGS = -I/usr/X11R6/include -DXWINDOW
# OPTFLAGS is normally -O2.
OPTFLAGS = -O2 -g3
DFLAGS = $(XFLAGS) -DRELEASE=351 -DNOVERSION -DINIT
LDFLAGS = -L/usr/X11R6/lib -lX11 -lc -lm
LDELDFLAGS = -L/usr/X11R6/lib -lX11 -lc -lm
OBJECTDIR = ../$(RELEASENAME)/
default : ../$(OSARCHNAME)/ldeinit

View File

@@ -1,4 +1,4 @@
# Options for Linux, ARMv7 and X-Window
# Options for Linux, aarch64 and X-Window
CC = gcc $(GCC_CFLAGS)
#CC = clang $(CLANG_CFLAGS)

View File

@@ -20,7 +20,7 @@
# Nov 20 2001 JDS: Convert to use BASH, not CSH, for open-source...
#
# usage: makeright [display-option] [other-option]
#
#
# example: makeright single ; make lde for mmaped displayFB
# makeright multi ; make lde for cg3,cg6
# makeright x ; make lde for X-windows
@@ -74,6 +74,11 @@ case "$display" in
sdl) releasename=${osversion}.${architecture}-${display}
ldename=ldesdl
;;
wasm) osversion=emscripten
architecture=wasm
releasename=${osversion}.${architecture}-${display}
ldename=ldesdl.js
;;
*) echo "display-option: $display is not supported."
exit
;;

View File

@@ -1,5 +1,6 @@
#!/bin/sh
os=${LDEARCH:-`./config.guess`}
SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
os=${LDEARCH:-`$SCRIPTPATH/config.guess`}
case "$os" in
m68k-*-amigaos) echo amigaos ;;
sparc-sun-sunos*) echo sunos4 ;;

View File

@@ -40,7 +40,7 @@ extern int flushing;
#endif
#ifdef DEBUG
#define DBPRINT(X) do {printf X ; if (flushing) fflush(stdout); } while(0)
#define DBPRINT(X) do { printf("%s:%d ", __FILE__, __LINE__); printf X ; if (flushing) fflush(stdout); } while(0)
#define DEBUGGER(X) X
#else
#define DBPRINT(X) if (0) do {printf X ; } while(0)
@@ -51,7 +51,7 @@ extern int flushing;
/* For trace print statements */
#ifdef TRACE
#define TPRINT(X) do { printf X; if (flushing) fflush(stdout); } while (0)
#define TPRINT(X) do { printf("%s:%d ", __FILE__, __LINE__); printf X; if (flushing) fflush(stdout); } while (0)
#define TRACER(X) X
#else /* TRACE */
@@ -64,7 +64,7 @@ extern int flushing;
/* For tracing individual opcode executions */
#ifdef OPTRACE
#define OPTPRINT(X) do { printf X; if (flushing) fflush(stdout); } while (0)
#define OPTPRINT(X) do { printf("%s:%d ", __FILE__, __LINE__); printf X; if (flushing) fflush(stdout); } while (0)
#define OPTRACER(X) X
#else
#define OPTPRINT(X) if (0) do { printf X; } while (0)
@@ -75,7 +75,7 @@ extern int flushing;
/* For tracing function calls */
#ifdef FNTRACE
#define FNTPRINT(X) do { printf X; if (flushing) fflush(stdout); } while (0)
#define FNTPRINT(X) do { printf("%s:%d ", __FILE__, __LINE__); printf X; if (flushing) fflush(stdout); } while (0)
#define FNTRACER(X) X
#else
#define FNTPRINT(X) if (0) do { printf X; } while (0)
@@ -86,7 +86,7 @@ extern int flushing;
/* For function-call & return stack checking */
#ifdef FNSTKCHECK
#define FNCHKPRINT(X) do { printf X ; if (flushing) fflush(stdout); } while (0)
#define FNCHKPRINT(X) do { printf("%s:%d ", __FILE__, __LINE__); printf X ; if (flushing) fflush(stdout); } while (0)
#define FNCHECKER(X) X
#else
#define FNCHKPRINT(X) if (0) do { printf X; } while (0)

View File

@@ -194,8 +194,9 @@ do { \
#endif /* min */
#define LispNumToCInt(Lisp) \
( (((Lisp) & SEGMASK) == S_POSITIVE) ? \
((Lisp) & 0xFFFF) : (*((int *)(NativeAligned4FromLAddr(Lisp)))) )
( (((Lisp) & SEGMASK) == S_POSITIVE) ? ((Lisp) & 0xFFFF) : \
(((Lisp) & SEGMASK) == S_NEGATIVE) ? ((Lisp) | 0xFFFF0000) : \
(*((int *)(NativeAligned4FromLAddr(Lisp)))) )
#define UPLOWDIFF 0x20

View File

@@ -83,6 +83,19 @@
# define MAIKO_OS_DETECTED 1
#endif
#ifdef __EMSCRIPTEN__
# define MAIKO_OS_LINUX 1
# define MAIKO_OS_EMSCRIPTEN 1
# define MAIKO_OS_NAME "Emscripten"
# define MAIKO_EMULATE_TIMER_INTERRUPTS 1
# define MAIKO_EMULATE_ASYNC_INTERRUPTS 1
# define MAIKO_OS_UNIX_LIKE 1
# define MAIKO_OS_DETECTED
# define MAIKO_ARCH_NAME "WebAssembly"
# define MAIKO_ARCH_WORD_BITS 32
# define MAIKO_ARCH_DETECTED 1
#endif
/* __x86_64__: GNU C, __x86_64: Sun Studio, _M_AMD64: Visual Studio */
#if defined(__x86_64__) || defined(__x86_64) || defined(_M_AMD64)
# define MAIKO_ARCH_X86_64 1

View File

@@ -1799,7 +1799,7 @@ void tedit_bltchar(LispPTR *args)
} /* end tedit_bltchar */
#if defined(REALCURSOR) || defined(SUNDISPLAY)
#if defined(REALCURSOR)
#ifndef COLOR
/* Lisp addr hi-word, lo-word, ... */
static int old_cursorin(DLword addrhi, DLword addrlo, int x, int w, int h, int y, int backward)
@@ -1866,4 +1866,4 @@ static int old_cursorin(DLword addrhi, DLword addrlo, int x, int w, int h, int y
} /* COLOR case end */
}
#endif /* COLOR */
#endif /* defined(REALCURSOR) || defined(SUNDISPLAY) */
#endif /* defined(REALCURSOR) */

View File

@@ -2150,7 +2150,8 @@ LispPTR COM_next_file(LispPTR *args)
propp = gfsp->propp;
dfp = &FinfoArray[finfoid];
if (dfp->head == (FINFO *)0 || (fp = dfp->next) == (FINFO *)0) return (SMALLP_MINUSONE);
fp = dfp->next;
if (dfp->head == NULL || fp == NULL) return (SMALLP_MINUSONE);
dfp->next = fp->next;
laddr = gfsp->name;

View File

@@ -97,6 +97,18 @@ struct buf {
};
#endif /* BIGVM */
#else
#ifdef BIGVM
struct buf {
LispPTR filepage;
LispPTR vmempage;
LispPTR buffernext;
unsigned sysnext : 28;
unsigned unused : 1;
unsigned iodirty : 1;
unsigned usermapped : 1;
unsigned noreference : 1;
};
#else
struct buf {
LispPTR filepage;
LispPTR vmempage;
@@ -107,6 +119,7 @@ struct buf {
unsigned usermapped : 1;
unsigned noreference : 1;
};
#endif /* BIGVM */
#endif /* BYTESWAP */
/************* The following procedure is common !! **************************/
@@ -192,8 +205,6 @@ LispPTR checkarrayblock(LispPTR base, LispPTR free, LispPTR onfreelist) {
{
bbase = (struct arrayblock *)NativeAligned4FromLAddr(base);
btrailer = (struct arrayblock *)NativeAligned4FromLAddr(Trailer(base, bbase));
bfwd = (struct arrayblock *)NativeAligned4FromLAddr(bbase->fwd);
bbwd = (struct arrayblock *)NativeAligned4FromLAddr(bbase->bkwd);
if (bbase->password != ARRAYBLOCKPASSWORD) {
printarrayblock(base);
error("ARRAYBLOCK password wrong\n");
@@ -213,9 +224,11 @@ LispPTR checkarrayblock(LispPTR base, LispPTR free, LispPTR onfreelist) {
printarrayblock(base);
error("ARRAYBLOCK Trailer INUSE bit set wrong\n");
} else if (!onfreelist || (bbase->arlen < MINARRAYBLOCKSIZE))
/* Remaining tests only for free list. */
return (NIL);
else if ((bbwd->fwd != base) || (bfwd->bkwd != base)) {
/* Remaining tests only for free list. */
bfwd = (struct arrayblock *)NativeAligned4FromLAddr(bbase->fwd);
bbwd = (struct arrayblock *)NativeAligned4FromLAddr(bbase->bkwd);
if ((bbwd->fwd != base) || (bfwd->bkwd != base)) {
error("ARRAYBLOCK links fouled\n");
} else {
fbl = FreeBlockChainN(bbase->arlen);
@@ -337,7 +350,6 @@ LispPTR makefreearrayblock(LispPTR block, DLword length) {
/* */
/* */
/************************************************************************/
LispPTR arrayblockmerger(LispPTR base, LispPTR nbase) {
DLword arlens, narlens, secondbite, minblocksize, shaveback;
struct arrayblock *bbase, *bnbase;
@@ -346,12 +358,23 @@ LispPTR arrayblockmerger(LispPTR base, LispPTR nbase) {
arlens = bbase->arlen;
narlens = bnbase->arlen;
secondbite = MAXARRAYBLOCKSIZE - arlens;
if (narlens > secondbite) {
/* There are three cases for merging the blocks
* (1) the total size of the two blocks is less than max:
* merge into a single block
* (2) creating a max size block leaves a viable leftover block:
* move the boundary to make a max block and a leftover block
* (3) creating a max size block leaves a non-viable leftover block
* move the boundary to make a big block and a minimum size leftover block
*/
if (base + (2 * arlens) != nbase) {
error("Attempt to merge non-adjacent blocks in array space\n");
}
if (narlens > secondbite) { /* (2) or (3) */
arlens = MAXARRAYBLOCKSIZE;
narlens = narlens - secondbite;
minblocksize =
((*Hunk_word == ATOM_T) ? (ARRAYBLOCKOVERHEADCELLS + MAXCELLSPERHUNK) : MINARRAYBLOCKSIZE);
if (narlens < minblocksize) {
if (narlens < minblocksize) { /* (3) */
shaveback = narlens - minblocksize;
narlens = minblocksize;
arlens += shaveback;
@@ -375,10 +398,10 @@ LispPTR mergebackward(LispPTR base) {
LispPTR pbase;
struct arrayblock *ptrailer;
ptrailer = (struct arrayblock *)NativeAligned4FromLAddr(base - ARRAYBLOCKTRAILERWORDS);
if (base == NIL)
return (NIL);
else if ((*ArrayMerging_word == NIL) ||
ptrailer = (struct arrayblock *)NativeAligned4FromLAddr(base - ARRAYBLOCKTRAILERWORDS);
if ((*ArrayMerging_word == NIL) ||
((base == *ArraySpace_word) || ((base == *ArraySpace2_word) || (ptrailer->inuse == T))))
return (linkblock(base));
pbase = base - 2 * ptrailer->arlen;
@@ -398,16 +421,18 @@ LispPTR mergebackward(LispPTR base) {
LispPTR mergeforward(LispPTR base) {
LispPTR nbase, nbinuse;
struct arrayblock *bbase, *bnbase;
if (*ArrayMerging_word == NIL) return NIL;
if (base == NIL) return NIL;
if (checkarrayblock(base, T, T)) return NIL;
bbase = (struct arrayblock *)NativeAligned4FromLAddr(base);
nbase = base + 2 * (bbase->arlen);
if (nbase == *ArrayFrLst_word || nbase == *ArrayFrLst2_word) return NIL;
bnbase = (struct arrayblock *)NativeAligned4FromLAddr(nbase);
if ((*ArrayMerging_word == NIL) ||
((base == NIL) ||
(checkarrayblock(base, T, T) ||
((nbase == *ArrayFrLst_word) ||
((nbase == *ArrayFrLst2_word) ||
(checkarrayblock(nbase, (!(nbinuse = bnbase->inuse)), NIL) || nbinuse))))))
return (NIL);
nbinuse = bnbase->inuse;
if (checkarrayblock(nbase, !nbinuse, NIL)) return NIL;
if (nbinuse) return (NIL);
deleteblock(nbase);
deleteblock(base);
return (arrayblockmerger(base, nbase));

View File

@@ -375,8 +375,6 @@ static u_char *make_X_keymap(void) {
table[xcode - 7] = code;
}
XFree(mapping); /* No locking required? */
#ifdef DEBUG
printf("\n\n\tXGetKeyboardMapping table\n\n");
for (i = 0; i < codecount * symspercode; i += symspercode) {
@@ -394,6 +392,8 @@ static u_char *make_X_keymap(void) {
}
#endif /* DEBUG */
XFree(mapping); /* No locking required? */
return (table);
}

View File

@@ -37,7 +37,7 @@
#include "ifpage.h" // for IFPAGE, MACHINETYPE_MAIKO
#include "initsoutdefs.h" // for build_lisp_map, fixp_value, init_for_bitblt
#include "iopage.h" // for IOPAGE
#include "lispemul.h" // for LispPTR, DLword, NIL, BYTESPER_DLWORD
#include "lispemul.h" // for LispPTR, DLword, NIL, BYTESPER_DLWORD, POINTERMASK
#include "lispmap.h" // for ATMHT_OFFSET, ATOMS_OFFSET, DEFS_OFFSET
#include "lspglob.h" // for InterfacePage, IOPage, AtomHT, Closure_Cac...
#include "lsptypes.h" // for GetDTD, TYPE_FIXP, TYPE_LISTP
@@ -405,7 +405,9 @@ void init_for_keyhandle(void) {
MOUSECHORDTICKS68k = MakeAtom68k("\\MOUSECHORDTICKS");
LASTUSERACTION68k = MakeAtom68k("\\LASTUSERACTION");
CLastUserActionCell68k = (LispPTR *)NativeAligned4FromLAddr(*LASTUSERACTION68k & 0xffffff);
#ifndef INIT
CLastUserActionCell68k = (LispPTR *)NativeAligned4FromLAddr(*LASTUSERACTION68k & POINTERMASK);
#endif
DOBUFFEREDTRANSITION_index = MAKEATOM("\\DOBUFFEREDTRANSITIONS");
INTERRUPTFRAME_index = MAKEATOM("\\INTERRUPTFRAME");

24
src/lde.html Normal file
View File

@@ -0,0 +1,24 @@
<!doctype html>
<!-- Based on https://github.com/timhutton/sdl-canvas-wasm/blob/main/index.html -->
<!-- html to set up WebAssembly module for Medley running in a browser -->
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div style="text-align: center;">
<canvas id="canvas" oncontextmenu="event.preventDefault()"></canvas>
</div>
<script type="text/javascript">
var width = 32*Math.trunc(Math.min(Math.max(window.innerWidth, 512), 1664)/32);
var height = Math.min(Math.max(window.innerHeight, 512), 1260);
var Module = {
preRun: [ function() {ENV.MEDLEYDIR = "{DSK}<medley>";} ],
arguments: ["medley/loadups/full.sysout","-sc", width+"x"+height, "-nh-host", "127.0.0.1"],
canvas: (function() { return document.getElementById('canvas'); })()
};
</script>
<script src="ldesdl.js"></script>
</body>
</html>

View File

@@ -118,6 +118,19 @@ void update_miscstats(void) {
MiscStats->diskiotime = 0; /* ?? not available ?? */
MiscStats->diskops = 0;
MiscStats->secondstmp = MiscStats->secondsclock = (time(0) + UNIX_ALTO_TIME_DIFF);
#elif defined(MAIKO_OS_EMSCRIPTEN)
/* Emscripten does not provide getrusage() functionality */
struct timeval timev;
MiscStats->totaltime = gettime(0) - MiscStats->starttime;
MiscStats->swapwaittime = 0;
MiscStats->pagefaults = 0;
MiscStats->swapwrites = 0;
MiscStats->diskiotime = 0;
MiscStats->diskops = 0;
gettimeofday(&timev, NULL);
MiscStats->secondstmp = MiscStats->secondsclock = (timev.tv_sec + UNIX_ALTO_TIME_DIFF);
#else
struct timeval timev;
struct rusage ru;
@@ -288,6 +301,8 @@ void subr_settime(LispPTR args[])
dosday.year = uxtime.tm_year;
dosday.dayofweek = uxtime.tm_wday;
_dos_setdate(&dosday);
#elif defined(MAIKO_OS_EMSCRIPTEN)
(void)args[0];
#else
struct timeval timev;
timev.tv_sec = *((int *)NativeAligned4FromLAddr(args[0])) - UNIX_ALTO_TIME_DIFF;

View File

@@ -518,6 +518,7 @@ LispPTR Unix_handlecomm(LispPTR *args) {
DBPRINT(("Terminating process in slot %d.\n", slot));
if (!valid_slot(slot)) return (ATOM_T);
/* in all cases we need to close() the file descriptor */
if (slot == 0) DBPRINT(("ZERO SLOT\n"));
close(slot);
switch (UJ[slot].type) {
case UJSHELL:
@@ -699,7 +700,7 @@ LispPTR Unix_handlecomm(LispPTR *args) {
if (!valid_slot(slot)) return (NIL); /* No fd open; punt the read */
bufp = (NativeAligned2FromLAddr(args[2])); /* User buffer */
DBPRINT(("Read buffer slot %d, type is %d\n", slot, UJ[slot].type));
DBPRINT(("Read buffer slot %d, type is %d buffer LAddr 0x%x (native %p)\n", slot, UJ[slot].type, args[2], bufp));
switch (UJ[slot].type) {
case UJSHELL:

View File

@@ -98,7 +98,7 @@ static int ForkUnixShell(int slot, char *PtySlave, char *termtype, char *shellar
if (SlaveFD == -1) {
perror("Slave Open");
perror(PtySlave);
exit(0);
exit(1);
}
#ifdef OS5
@@ -132,7 +132,7 @@ static int ForkUnixShell(int slot, char *PtySlave, char *termtype, char *shellar
for (userShell = getusershell(); userShell != NULL && strcmp(shell, userShell) != 0; userShell = getusershell());
if (userShell == NULL) {
perror("$(SHELL) not found in /etc/shells");
exit(0);
exit(1);
}
/* argvec entries initialized to NULL */
@@ -146,7 +146,7 @@ static int ForkUnixShell(int slot, char *PtySlave, char *termtype, char *shellar
/* Should never get here */
perror("execv");
exit(0);
exit(1);
}
/* fork_Unix is the secondary process spawned right after LISP is
@@ -264,12 +264,14 @@ int fork_Unix(void) {
while (1) {
ssize_t len;
len = SAFEREAD(LispPipeIn, IOBuf, 6);
if (len == 0)
exit(0);
if (len < 0) {
perror("Error reading packet by slave");
exit(0);
exit(1);
} else if (len != 6) {
DBPRINT(("Input packet wrong length: %zd", len));
exit(0);
exit(1);
}
slot = IOBuf[3];
IOBuf[3] = 1; /* Start by signalling success in return-code */
@@ -345,7 +347,7 @@ int fork_Unix(void) {
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
perror("slave socket");
exit(0);
exit(1);
}
sprintf(PipeName, "/tmp/LPU%ld-%d", StartTime, slot);
memset(&addr, 0, sizeof(struct sockaddr_un));
@@ -357,7 +359,7 @@ int fork_Unix(void) {
perror("slave connect");
printf("Name = %s.\n", PipeName);
fflush(stdout);
exit(0);
exit(1);
} else {
DBPRINT(("Slave connected on %s.\n", PipeName));
}

View File

@@ -354,7 +354,7 @@ LispPTR vmem_save(char *sysout_file_name)
TIMEOUT(sysout = open(sysout_file_name, O_WRONLY, 0666));
if (sysout == -1) {
/* No file error skip return. */
if (errno != 2) return (FILECANNOTOPEN); /* No such file error.*/
if (errno != ENOENT) return (FILECANNOTOPEN); /* No such file error.*/
} else
TIMEOUT(rval = close(sysout));
@@ -481,7 +481,7 @@ LispPTR vmem_save(char *sysout_file_name)
TIMEOUT(rval = unlink(sysout_file_name));
if (rval == -1) {
/* No file error skip return. */
if (errno != 2) /* No such file error.*/
if (errno != ENOENT) /* No such file error.*/
return (FILECANNOTOPEN);
}
@@ -531,5 +531,5 @@ void lisp_finish(void) {
#ifdef DOS
exit_host_filesystem();
#endif /* DOS */
exit(1);
exit(0);
}

View File

@@ -20,6 +20,9 @@
/* */
/************************************************************************/
#ifdef MAIKO_OS_EMSCRIPTEN
#include <emscripten.h>
#endif
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
@@ -286,6 +289,9 @@ nextopcode:
Irq_Stk_End = 0;
#if defined(MAIKO_EMULATE_ASYNC_INTERRUPTS)
IO_Signalled = TRUE;
#endif
#ifdef MAIKO_OS_EMSCRIPTEN
emscripten_sleep(1);
#endif
pseudoTimerAsyncCountdown = insnsCountdownForTimerAsyncEmulation;
}

View File

@@ -16,6 +16,7 @@
#include <signal.h> // for sig_atomic_t
#include <stdbool.h> // for false, bool, true
#include <stdio.h> // for NULL
#include <stdlib.h> // for exit
#include "adr68k.h" // for NativeAligned4FromLAddr
#include "dbprint.h" // for TPRINT
#include "devif.h" // for (anonymous), MRegion, DspInterface, OUTER_S...
@@ -200,6 +201,27 @@ void Open_Display(DspInterface dsp)
init_Xevent(dsp); /* Turn on the event reporting */
} /* end OpenDisplay */
int X_FatalErrorHandler(Display *display)
{
/* when the fatal error handler gets called it can do cleanup
* and either exit, or return. If it returns, the
* FatalErrorExitHandler will be called
*/
/* If we could do a SAVEVM in the interrupt context we would mark it
* as needed here. Returning will cause the FatalErrorExitHandler
* hook to be called.
*/
return 0;
}
void X_FatalErrorExitHandler(Display *display, void *userdata)
{
/* If we were invoking a SAVEVM/LOGOUT in the interrupt context we
* would not exit here, as the Lisp VM needs to continue to run
*/
exit(1);
}
/*********************************************************************/
/* */
/* X _ i n i t */
@@ -236,6 +258,10 @@ DspInterface X_init(DspInterface dsp, LispPTR lispbitmap, unsigned width_hint, u
/* Try to open the X display. If this isn't possible, we just */
/* return FALSE. */
if ((dsp->display_id = XOpenDisplay(dsp->identifier)) == NULL) return (NULL);
XSetIOErrorHandler(X_FatalErrorHandler);
XSetIOErrorExitHandler(dsp->display_id, X_FatalErrorExitHandler, NULL);
/* Load the dsp structure */
Xscreen = ScreenOfDisplay(dsp->display_id, DefaultScreen(dsp->display_id));

View File

@@ -188,6 +188,7 @@ void process_Xevents(DspInterface dsp)
XNextEvent(dsp->display_id, &report);
if (report.xany.window == dsp->DisplayWindow) /* Try the most important window first. */
switch (report.type) {
#ifndef INIT
case MotionNotify:
*CLastUserActionCell68k = MiscStats->secondstmp;
*EmCursorX68K = (*((DLword *)EmMouseX68K)) =
@@ -235,6 +236,7 @@ void process_Xevents(DspInterface dsp)
break;
case EnterNotify: Mouse_Included = TRUE; break;
case LeaveNotify: Mouse_Included = FALSE; break;
#endif
case Expose:
(dsp->bitblt_to_screen)(dsp, 0, report.xexpose.x + dsp->Visible.x,
report.xexpose.y + dsp->Visible.y, report.xexpose.width,