From daea38b7903effd321a9927a6240f568e1f70db8 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Tue, 1 Oct 2019 20:50:14 -0500 Subject: [PATCH] IIgs ASM code now supports drawing on any valid surface. --- joeylib/build-IIgs.sh | 66 ------- joeylib/build-PC.sh | 101 ----------- joeylib/build.sh | 264 +++++++++++++++++++++++++++ joeylib/joeylib.pro | 3 + joeylib/src/jAmiga.c | 202 +++++++++++++++++++++ joeylib/src/jBlank.c | 202 +++++++++++++++++++++ joeylib/src/jIIgs.asm | 408 +++++++++++++++++------------------------- joeylib/src/jST.c | 202 +++++++++++++++++++++ joeylib/src/joey.c | 21 ++- joeylib/src/joey.h | 27 +-- joeylib/src/test.c | 8 +- scripts/installer.sh | 4 +- scripts/joeyDev.sh | 3 + 13 files changed, 1079 insertions(+), 432 deletions(-) delete mode 100755 joeylib/build-IIgs.sh delete mode 100755 joeylib/build-PC.sh create mode 100755 joeylib/build.sh create mode 100644 joeylib/src/jAmiga.c create mode 100644 joeylib/src/jBlank.c create mode 100644 joeylib/src/jST.c diff --git a/joeylib/build-IIgs.sh b/joeylib/build-IIgs.sh deleted file mode 100755 index 99c828b..0000000 --- a/joeylib/build-IIgs.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash -e - -OUT=${JOEY}/sdks/IIgs/ORCA/out/joey - -if [ -d ${OUT} ]; then - rm -rf ${OUT} -fi -mkdir -p ${OUT} - -pushd ${JOEY}/joeylib/joeylib/src -iix assemble +L jIIgs.asm keep=31:/out/joey/jIIgsasm > jIIgs.asm.dis -iix compile jIIgs.c keep=31:/out/joey/jIIgsc -iix compile joey.c keep=31:/out/joey/joey - -iix makelib 31:/out/joey/joeylib +31:/out/joey/jIIgsasm.A -iix makelib 31:/out/joey/joeylib +31:/out/joey/jIIgsasm.ROOT -iix makelib 31:/out/joey/joeylib +31:/out/joey/jIIgsc.a -iix makelib 31:/out/joey/joeylib +31:/out/joey/joey.a - -iix compile test.c keep=31:/out/joey/test -iix -DKeepType=S16 link +L 31:/out/joey/test 31:/out/joey/joeylib keep=31:/out/joey/test > test.map - -iix dumpobj +D 31:/out/joey/test &> test.dis || true - -php ${JOEY}/sdks/IIgs/ntconverter/ntconverter.php *.mod -popd - -mkdir -p ${JOEY}/dist/IIgs -cp -f ${OUT}/joeylib ${JOEY}/dist/IIgs/joeylib#b20000 -cp -f ${JOEY}/joeylib/joeylib/src/joey.h ${JOEY}/dist/. -cp -f ${JOEY}/joeylib/scripts/build-IIgs.helper.sh ${JOEY}/dist/IIgs/. - -if [ ! -z $1 ]; then - CADIUS=${JOEY}/sdks/IIgs/cadius/cadius - IMPORT=/tmp/IIgs/import.po - VOL=Import - - mkdir -p `dirname ${IMPORT}` - rm /tmp/IIgs/JLSTATS#040000 2> /dev/null || true - rm ${IMPORT} 2> /dev/null || true - - cp ${OUT}/test ${OUT}/Test#B30000 - cp ${JOEY}/joeylib/joeylib/src/kanga.sta ${OUT}/kanga.sta#060000 - cp ${JOEY}/joeylib/joeylib/src/font.sta ${OUT}/font.sta#060000 - cp ${JOEY}/joeylib/joeylib/src/music ${OUT}/music#D50000 - cp ${JOEY}/joeylib/joeylib/src/music.w ${OUT}/music.w#060000 - - ${CADIUS} createvolume ${IMPORT} ${VOL} 32MB > /dev/null - ${CADIUS} createfolder ${IMPORT} ${VOL}/data > /dev/null - ${CADIUS} addfile ${IMPORT} ${VOL} ${OUT}/Test#b30000 > /dev/null - ${CADIUS} addfile ${IMPORT} ${VOL}/data ${OUT}/kanga.sta#060000 > /dev/null - ${CADIUS} addfile ${IMPORT} ${VOL}/data ${OUT}/font.sta#060000 > /dev/null - ${CADIUS} addfile ${IMPORT} ${VOL}/data ${OUT}/music#D50000 > /dev/null - ${CADIUS} addfile ${IMPORT} ${VOL}/data ${OUT}/music.w#060000 > /dev/null - - pushd ${JOEY}/sdks/IIgs/gsplus - ./GSplus -resizeable -config IIgsTest.cfg || true - popd - echo "" - ${CADIUS} extractfile ${IMPORT} ${VOL}/JLSTATS /tmp/IIgs/. > /dev/null - if [ -e /tmp/IIgs/JLSTATS#040000 ]; then - echo "" - cat /tmp/IIgs/JLSTATS#040000 | tr "\r" "\n" 2> /dev/null - echo "" - fi -fi diff --git a/joeylib/build-PC.sh b/joeylib/build-PC.sh deleted file mode 100755 index 5f991f6..0000000 --- a/joeylib/build-PC.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash -e - - -BUILD="${JOEY}/joeylib/joeylib/build" -SRC="${JOEY}/joeylib/joeylib/src" - - -function doBuild() { - - G_CFLAGS="-Wall -D_REENTRANT_ -I${SRC} -c" - - echo "*** Starting ${DIST}" - if [ -d "${BUILD}" ]; then - rm -rf "${BUILD}" - fi - mkdir -p "${BUILD}" - if [ -d "${DIST}" ]; then - rm -rf "${DIST}" - fi - mkdir -p "${DIST}" - - pushd "${BUILD}" - ${CC} ${CFLAGS} ${G_CFLAGS} -o jPC.o ${SRC}/jPC.c - ${CC} ${CFLAGS} ${G_CFLAGS} -o joey.o ${SRC}/joey.c - - ar x ${INSTALLED}/libSDL2.a - ar x ${INSTALLED}/libSDL2_mixer.a - ar x ${INSTALLED}/libmodplug.a - - ar rcs ${DIST}/libjoeylib.a *.o - popd - - if [ -d "${BUILD}" ]; then - rm -rf "${BUILD}" - fi -} - -ARCH=$1 - -if [ "${ARCH}x" == "x" ]; then - echo "$0 [arch | \"all\"]" - echo '(Where "arch" is linux32, linux64, windows32, windows64, macos32, or macos64.)' - exit 0 -fi - -if [ "${ARCH}x" == "allx" ] || [ "${ARCH}x" == "linux64x" ]; then - CC="gcc" - CFLAGS="" - LDFLAGS="" - DIST="${JOEY}/dist/linux/x64" - INSTALLED="${JOEY}/SDL2/installed/linux/x64/lib" - doBuild -fi - -if [ "${ARCH}x" == "allx" ] || [ "${ARCH}x" == "linux32x" ]; then - CC="gcc" - CFLAGS="-m32" - LDFLAGS="" - DIST="${JOEY}/dist/linux/i386" - INSTALLED="${JOEY}/SDL2/installed/linux/i386/lib" - doBuild -fi - -if [ "${ARCH}x" == "allx" ] || [ "${ARCH}x" == "windows64x" ]; then - CC="x86_64-w64-mingw32-gcc" - CFLAGS="" - LDFLAGS="" - DIST="${JOEY}/dist/windows/x64" - INSTALLED="${JOEY}/SDL2/installed/windows/x64/lib" - doBuild -fi - -if [ "${ARCH}x" == "allx" ] || [ "${ARCH}x" == "windows32x" ]; then - CC="i686-w64-mingw32-gcc" - CFLAGS="" - LDFLAGS="" - DIST="${JOEY}/dist/windows/i386" - INSTALLED="${JOEY}/SDL2/installed/windows/i386/lib" - doBuild -fi - -if [ "${ARCH}x" == "allx" ] || [ "${ARCH}x" == "macos32x" ]; then - CC="o32-clang" - CFLAGS="" - LDFLAGS="" - DIST="${JOEY}/dist/macos/i386" - INSTALLED="${JOEY}/SDL2/installed/macos/i386/lib" - doBuild -fi - -if [ "${ARCH}x" == "allx" ] || [ "${ARCH}x" == "macos64x" ]; then - CC="o64-clang" - CFLAGS="" - LDFLAGS="" - DIST="${JOEY}/dist/macos/x64" - INSTALLED="${JOEY}/SDL2/installed/macos/x64/lib" - doBuild -fi - -cp -f ${JOEY}/joeylib/joeylib/src/joey.h ${JOEY}/dist/. -cp -f ${JOEY}/joeylib/joeylib/joey.pri ${JOEY}/dist/. diff --git a/joeylib/build.sh b/joeylib/build.sh new file mode 100755 index 0000000..5d85e22 --- /dev/null +++ b/joeylib/build.sh @@ -0,0 +1,264 @@ +#!/bin/bash -e + +# m68k-amigaos-gcc -idirafter /home/scott/joey/sdks/amiga/m68k-amigaos/sys-include/machine -c ../src/joey.c +# m68k-amigaos-gcc -idirafter /home/scott/joey/sdks/amiga/m68k-amigaos/sys-include/machine -c ../src/jAmiga.c +# m68k-amigaos-ar rcs libjoeylib.a *.o + +# wget http://tho-otto.de/download/mint/m68k-atari-mint-base-20190606-linux.tar.xz +# xz -d m68k-atari-mint-base-20190606-linux.tar.xz +# tar --strip-components=1 -xf ../../stuff/m68k-atari-mint-base-20190606-linux.tar +# m68k-atari-mint-gcc -c ../src/joey.c +# m68k-atari-mint-gcc -c ../src/jST.c +# m68k-atari-ar rcs libjoeylib.a *.o + + +SRC="${JOEY}/joeylib/joeylib/src" +BUILD="${JOEY}/joeylib/joeylib/build" +OUT="${JOEY}/sdks/IIgs/ORCA/out/joey" +DEPS="${JOEY}/installerWork/deps/installed" + + +# Hackery for Scott's development system +if [[ `uname -n` == 'joey' && `whoami` == 'scott' ]]; then + DEPS="${JOEY}/installer/installerWork/deps/installed" +fi + + +function doIIgsBuild() { + + local CADIUS="${JOEY}/sdks/IIgs/cadius/cadius" + local IMPORT="/tmp/IIgs/import.po" + local VOL=Import + local RUNTEST=$1 + + echo "*** Starting ${DIST}" + if [[ -d "${OUT}" ]]; then + rm -rf "${OUT}" + fi + mkdir -p "${OUT}" + if [[ -d "${DIST}" ]]; then + rm -rf "${DIST}" + fi + mkdir -p "${DIST}" + + pushd "${SRC}" + iix assemble +L jIIgs.asm keep=31:/out/joey/jIIgsasm > jIIgs.asm.dis + iix compile jIIgs.c keep=31:/out/joey/jIIgsc + iix compile joey.c keep=31:/out/joey/joey + + iix makelib 31:/out/joey/joeylib +31:/out/joey/jIIgsasm.A + iix makelib 31:/out/joey/joeylib +31:/out/joey/jIIgsasm.ROOT + iix makelib 31:/out/joey/joeylib +31:/out/joey/jIIgsc.a + iix makelib 31:/out/joey/joeylib +31:/out/joey/joey.a + + iix compile test.c keep=31:/out/joey/test + iix -DKeepType=S16 link +L 31:/out/joey/test 31:/out/joey/joeylib keep=31:/out/joey/test > test.map + + iix dumpobj +D 31:/out/joey/test &> test.dis || true + + php "${JOEY}/sdks/IIgs/ntconverter/ntconverter.php" *.mod + popd + + cp -f "${OUT}/joeylib" "${DIST}/joeylib#b20000" + cp -f "${JOEY}/sdks/IIgs/Tool221#ba0000" "${JOEY}/dist/IIgs/." + cp -f "${JOEY}/joeylib/scripts/build-IIgs.helper.sh" "${JOEY}/dist/." + + if [[ ! -z ${RUNTEST} ]]; then + mkdir -p `dirname ${IMPORT}` + rm "/tmp/IIgs/JLSTATS#040000" 2> /dev/null || true + rm "${IMPORT}" 2> /dev/null || true + + cp "${OUT}/test" "${OUT}/Test#B30000" + cp "${JOEY}/joeylib/joeylib/src/kanga.sta" "${OUT}/kanga.sta#060000" + cp "${JOEY}/joeylib/joeylib/src/font.sta" "${OUT}/font.sta#060000" + cp "${JOEY}/joeylib/joeylib/src/music" "${OUT}/music#D50000" + cp "${JOEY}/joeylib/joeylib/src/music.w" "${OUT}/music.w#060000" + + "${CADIUS}" createvolume "${IMPORT}" ${VOL} 32MB > /dev/null + "${CADIUS}" createfolder "${IMPORT}" ${VOL}/data > /dev/null + "${CADIUS}" addfile "${IMPORT}" ${VOL} "${JOEY}/dist/IIgs/Tool221#ba0000" > /dev/null + "${CADIUS}" addfile "${IMPORT}" ${VOL} "${OUT}/Test#b30000" > /dev/null + "${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/kanga.sta#060000" > /dev/null + "${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/font.sta#060000" > /dev/null + "${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/music#D50000" > /dev/null + "${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/music.w#060000" > /dev/null + + pushd "${JOEY}/sdks/IIgs/gsplus" + ./GSplus -resizeable -config IIgsTest.cfg || true + popd + echo "" + "${CADIUS}" extractfile "${IMPORT}" ${VOL}/JLSTATS /tmp/IIgs/. > /dev/null + if [[ -e "/tmp/IIgs/JLSTATS#040000" ]]; then + echo "" + cat "/tmp/IIgs/JLSTATS#040000" | tr "\r" "\n" 2> /dev/null + echo "" + fi + fi +} + + +function doPCBuild() { + + local G_CFLAGS="-Wall -D_REENTRANT_ -I${SRC} -c" + + echo "*** Starting ${DIST}" + if [[ -d "${BUILD}" ]]; then + rm -rf "${BUILD}" + fi + mkdir -p "${BUILD}" + if [[ -d "${DIST}" ]]; then + rm -rf "${DIST}" + fi + mkdir -p "${DIST}" + + pushd "${BUILD}" + "${CC}" ${CFLAGS} ${G_CFLAGS} -o jPC.o "${SRC}/jPC.c" + "${CC}" ${CFLAGS} ${G_CFLAGS} -o joey.o "${SRC}/joey.c" + + ar x "${INSTALLED}/libSDL2.a" + ar x "${INSTALLED}/libSDL2_mixer.a" + ar x "${INSTALLED}/libmodplug.a" + + ar rcs "${DIST}/libjoeylib.a" *.o + popd + + if [[ -d "${BUILD}" ]]; then + rm -rf "${BUILD}" + fi + + #***TODO*** Add optional test app execution for Windows (WINE) and Linux here + + cp -f "${JOEY}/joeylib/joeylib/joey.pri" "${JOEY}/dist/." + cp -f "${JOEY}/joeylib/scripts/build-PC.helper.sh" "${JOEY}/dist/." +} + + +function doVBCCBuild() { + + local PLATFORM= + local CFILE= + local G_CFLAGS="-c99 -I${SRC} -speed -c" + + if [[ "${ARCH}" == "st" ]]; then + PLATFORM=tos + CFILE="jST" + fi + + if [[ "${ARCH}" == "amiga" ]]; then + PLATFORM=aos68k + CFILE="jAmiga" + fi + + echo "*** Starting ${DIST}" + if [[ -d "${BUILD}" ]]; then + rm -rf "${BUILD}" + fi + mkdir -p "${BUILD}" + if [[ -d "${DIST}" ]]; then + rm -rf "${DIST}" + fi + mkdir -p "${DIST}" + + pushd "${BUILD}" + vc +${PLATFORM} ${CFLAGS} ${G_CFLAGS} "${SRC}/joey.c" -o joey.o + vc +${PLATFORM} ${CFLAGS} ${G_CFLAGS} "${SRC}/${CFILE}.c" -o ${CFILE}.o + vlink ${LDFLAGS} joey.o ${CFILE}.o -o joeylib.lib + popd + + #hatari -c "${JOEY}/sdks/st/hatari.cfg" -d out/ +} + + +ARCH=$1 +TEST=$2 + + +if [[ "${ARCH}x" == "x" ]]; then + echo "$0 [arch | \"all\"]" + echo '(Where "arch" is iigs, st, linux32, linux64, windows32, windows64, macos32, or macos64.)' + exit 0 +fi + +if [[ "${ARCH}x" == "allx" || "${ARCH}x" == "iigsx" ]]; then + DIST="${JOEY}/dist/IIgs" + doIIgsBuild ${TEST} +fi + +if [[ "${ARCH}x" == "allx" || "${ARCH}x" == "stx" ]]; then + SDK="${JOEY}/sdks/vbcc/targets/m68k-atari" + CFLAGS="-cpu=68000 -I${SDK}/includes" + #LDFLAGS="-bvobj-be -EB -L${JOEY}/sdks/vbcc/targets/m68k-atari/lib" + LDFLAGS="-baoutnull -EB -L${SDK}/lib -lvc" + DIST="${JOEY}/dist/ST" + doVBCCBuild +fi + +if [[ "${ARCH}x" == "allx" || "${ARCH}x" == "amigax" ]]; then + #SDK="${JOEY}/sdks/amiga" + #CFLAGS="-cpu=68000 -I${SDK}/NDK_3.9/Include/include_h -I${SDK}/PosixLib/include" + #LDFLAGS="-bamigahunk -EB -L${SDK}/NDK_3.9/Include/linker_libs -L${SDK}/PosixLib/AmigaOS3 -lposix -lamiga" + SDK="${JOEY}/sdks/vbcc/targets/m68k-amigaos" + SDK2="${JOEY}/sdks/amiga/PosixLib" + CFLAGS="-cpu=68000 -I${SDK}/includes -I${SDK2}/includes" + #LDFLAGS="-bamigahunk -Bshareable -Cvbcc -mrel ${SDK}/lib/startup.o -L${SDK}/lib -L${SDK2}/AmigaOS3 -lvc -lposix" + LDFLAGS="-bvobj-be -Bshareable -Cvbcc -mrel ${SDK}/lib/startup.o -L${SDK}/lib -L${SDK2}/AmigaOS3 -lvc -lposix" + DIST="${JOEY}/dist/Amiga" + doVBCCBuild +fi + +if [[ "${ARCH}x" == "allx" || "${ARCH}x" == "linux64x" ]]; then + CC="gcc" + CFLAGS="" + LDFLAGS="" + DIST="${JOEY}/dist/linux/x64" + INSTALLED="${DEPS}/linux/x64/lib" + doPCBuild +fi + +if [[ "${ARCH}x" == "allx" || "${ARCH}x" == "linux32x" ]]; then + CC="gcc" + CFLAGS="-m32" + LDFLAGS="" + DIST="${JOEY}/dist/linux/i386" + INSTALLED="${DEPS}/linux/i386/lib" + doPCBuild +fi + +if [[ "${ARCH}x" == "allx" || "${ARCH}x" == "windows64x" ]]; then + CC="x86_64-w64-mingw32-gcc" + CFLAGS="" + LDFLAGS="" + DIST="${JOEY}/dist/windows/x64" + INSTALLED="${DEPS}/windows/x64/lib" + doPCBuild +fi + +if [[ "${ARCH}x" == "allx" || "${ARCH}x" == "windows32x" ]]; then + CC="i686-w64-mingw32-gcc" + CFLAGS="" + LDFLAGS="" + DIST="${JOEY}/dist/windows/i386" + INSTALLED="${DEPS}/windows/i386/lib" + doPCBuild +fi + +if [[ "${ARCH}x" == "allx" || "${ARCH}x" == "macos32x" ]]; then + CC="o32-clang" + CFLAGS="" + LDFLAGS="" + DIST="${JOEY}/dist/macos/i386" + INSTALLED="${DEPS}/macos/i386/lib" + doPCBuild +fi + +if [[ "${ARCH}x" == "allx" || "${ARCH}x" == "macos64x" ]]; then + CC="o64-clang" + CFLAGS="" + LDFLAGS="" + DIST="${JOEY}/dist/macos/x64" + INSTALLED="${DEPS}/macos/x64/lib" + doPCBuild +fi + +mkdir -p "${JOEY}/dist" +cp -f "${SRC}/joey.h" "${JOEY}/dist/." diff --git a/joeylib/joeylib.pro b/joeylib/joeylib.pro index 992ba53..bc58f09 100644 --- a/joeylib/joeylib.pro +++ b/joeylib/joeylib.pro @@ -20,6 +20,9 @@ SOURCES += \ src/test.c OTHER_FILES += \ + src/jBlank.c \ + src/jST.c \ + src/jAmiga.c \ src/jIIgs.c \ src/jIIgs.asm \ src/jIIgs.macro \ diff --git a/joeylib/src/jAmiga.c b/joeylib/src/jAmiga.c new file mode 100644 index 0000000..d7a1c8c --- /dev/null +++ b/joeylib/src/jAmiga.c @@ -0,0 +1,202 @@ +/* + * JoeyLib + * Copyright (C) 2018-2019 Scott Duensing + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "joey.h" + + +void jlDisplayPresent(void) { +} + + +void jlDrawBlit8x8(jlStaT *sta, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2) { + (void)sta; + (void)cx1; + (void)cy1; + (void)cx2; + (void)cy2; +} + + +void jlDrawBlit8x8a(jlStaT *sta, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2, byte offset) { + (void)sta; + (void)cx1; + (void)cy1; + (void)cx2; + (void)cy2; +} + + +void jlDrawBlitMap(jint16 startX, jint16 startY, jint16 width, jint16 height, byte *mapData, juint16 stride, jlStaT *sta) { + (void)startX; + (void)startY; + (void)width; + (void)height; + (void)mapData; + (void)stride; + (void)sta; +} + + +void jlDrawClear(void) { +} + + +byte jlDrawGetPixel(jint16 x, jint16 y) { + (void)x; + (void)y; + + return 0; +} + + +void jlDrawPoint(jint16 x, jint16 y) { + (void)x; + (void)y; +} + + +jint16 jlGameGetAxis(byte which) { + (void)which; + + return 0; +} + + +bool jlGameGetButton(byte which) { + (void)which; + + return false; +} + + +bool jlKeyPressed(void) { + return false; +} + + +char jlKeyRead(void) { + return 0; +} + + +void jlPaletteSet(byte index, byte r, byte g, byte b) { + (void)index; + (void)r; + (void)g; + (void)b; +} + + +void jlPaletteSetFromSta(jlStaT *sta) { + (void)sta; +} + + +void jlSoundFree(jlSoundT *sound) { + (void)sound; +} + + +bool jlSoundIsPlaying(jlSoundT *sound) { + (void)sound; + + return false; +} + + +bool _jlSoundLoad(jlSoundT **sound, char *filename) { + (void)sound; + (void)filename; + + return false; +} + + +void jlSoundMusicContinue(void) { +} + + +bool jlSoundMusicIsPlaying(void) { + return false; +} + + +void jlSoundMusicPause(void) { +} + + +void jlSoundMusicPlay(char *name) { + (void)name; +} + + +void jlSoundMusicStop(void) { +} + + +void jlSoundPlay(jlSoundT *sound) { + (void)sound; +} + + +bool _jlStaCreate(jlStaT **sta) { + (void)sta; + + return false; +} + + +void jlStaDisplay(jlStaT *sta) { + (void)sta; +} + + +void jlUtilIdle(void) { +} + + +bool jlUtilMustExit(void) { + return false; +} + + +void jlUtilNibbleSwap(byte *mem, jint16 count, byte old, byte new) { + (void)mem; + (void)count; + (void)old; + (void)new; +} + + +void jlUtilShutdown(void) { + jlUtilDie("Clean Exit."); +} + + +void jlUtilStartup(char *appTitle) { + (void)appTitle; +} + + +juint16 jlUtilTimer(void) { + return 0; +} diff --git a/joeylib/src/jBlank.c b/joeylib/src/jBlank.c new file mode 100644 index 0000000..d7a1c8c --- /dev/null +++ b/joeylib/src/jBlank.c @@ -0,0 +1,202 @@ +/* + * JoeyLib + * Copyright (C) 2018-2019 Scott Duensing + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "joey.h" + + +void jlDisplayPresent(void) { +} + + +void jlDrawBlit8x8(jlStaT *sta, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2) { + (void)sta; + (void)cx1; + (void)cy1; + (void)cx2; + (void)cy2; +} + + +void jlDrawBlit8x8a(jlStaT *sta, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2, byte offset) { + (void)sta; + (void)cx1; + (void)cy1; + (void)cx2; + (void)cy2; +} + + +void jlDrawBlitMap(jint16 startX, jint16 startY, jint16 width, jint16 height, byte *mapData, juint16 stride, jlStaT *sta) { + (void)startX; + (void)startY; + (void)width; + (void)height; + (void)mapData; + (void)stride; + (void)sta; +} + + +void jlDrawClear(void) { +} + + +byte jlDrawGetPixel(jint16 x, jint16 y) { + (void)x; + (void)y; + + return 0; +} + + +void jlDrawPoint(jint16 x, jint16 y) { + (void)x; + (void)y; +} + + +jint16 jlGameGetAxis(byte which) { + (void)which; + + return 0; +} + + +bool jlGameGetButton(byte which) { + (void)which; + + return false; +} + + +bool jlKeyPressed(void) { + return false; +} + + +char jlKeyRead(void) { + return 0; +} + + +void jlPaletteSet(byte index, byte r, byte g, byte b) { + (void)index; + (void)r; + (void)g; + (void)b; +} + + +void jlPaletteSetFromSta(jlStaT *sta) { + (void)sta; +} + + +void jlSoundFree(jlSoundT *sound) { + (void)sound; +} + + +bool jlSoundIsPlaying(jlSoundT *sound) { + (void)sound; + + return false; +} + + +bool _jlSoundLoad(jlSoundT **sound, char *filename) { + (void)sound; + (void)filename; + + return false; +} + + +void jlSoundMusicContinue(void) { +} + + +bool jlSoundMusicIsPlaying(void) { + return false; +} + + +void jlSoundMusicPause(void) { +} + + +void jlSoundMusicPlay(char *name) { + (void)name; +} + + +void jlSoundMusicStop(void) { +} + + +void jlSoundPlay(jlSoundT *sound) { + (void)sound; +} + + +bool _jlStaCreate(jlStaT **sta) { + (void)sta; + + return false; +} + + +void jlStaDisplay(jlStaT *sta) { + (void)sta; +} + + +void jlUtilIdle(void) { +} + + +bool jlUtilMustExit(void) { + return false; +} + + +void jlUtilNibbleSwap(byte *mem, jint16 count, byte old, byte new) { + (void)mem; + (void)count; + (void)old; + (void)new; +} + + +void jlUtilShutdown(void) { + jlUtilDie("Clean Exit."); +} + + +void jlUtilStartup(char *appTitle) { + (void)appTitle; +} + + +juint16 jlUtilTimer(void) { + return 0; +} diff --git a/joeylib/src/jIIgs.asm b/joeylib/src/jIIgs.asm index 4469156..51ed50f 100644 --- a/joeylib/src/jIIgs.asm +++ b/joeylib/src/jIIgs.asm @@ -19,37 +19,36 @@ ; 3. This notice may not be removed or altered from any source distribution. ;---------------------------------------- + mcopy 13:ORCAInclude:m16.ORCA mcopy jIIgs.macro case on gen on -SHRShad gequ $012000 -ScanTable data +GlobalData data +ScanTable entry ds 400 ; 400 bytes for scanline offsets - end - -VblRate data - ds 2 ; Either 5 or 6 depending on PAL or NTSC. +VblRate ds 2 ; Either 5 or 6 depending on PAL or NTSC. VblTime ds 2 ; Integer Counter end + ;---------------------------------------- -; Blit an 8x8 block from off-screen to back buffer. +; Blit an 8x8 block. ***TODO*** Unroll loops ;---------------------------------------- asmB88 start -t equ 1 +so equ 1 ; Source Pixels Offset +to equ 3 ; Target Pixels Offset +t equ 5 ; Temp +xc equ 7 ; X Counter +yc equ 9 ; Y Counter - jsubroutine (4:p,2:cx1,2:cy1,2:cx2,2:cy2),2 - using ScanTable + jsubroutine (4:surface,4:tiles,2:cx1,2:cy1,2:cx2,2:cy2),10 + using GlobalData - phb ; Push our current data bank onto the stack - -; ***TODO*** Mask off unused bits so they can be used for other things elsewhere ; Find offset into tile memory - clc lda cx1 ; Multiply cx1 by 4 to get offset (two pixels per byte) asl a asl a @@ -59,197 +58,110 @@ t equ 1 asl a asl a asl a - asl a ; y1 is now in the accumulator - clc + asl a ; y screen location is now in the accumulator tax - lda >ScanTable,x - adc t ; Add t to scanline offset - tay ; Offset to start of tile -; Find offset into shadow SHR memory clc - lda cx2 ; Multiply cx1 by 4 to get offset (two pixels per byte) + lda >ScanTable,x ; Load byte offset of y position from table + adc t ; Add t to scanline offset + sta so ; Offset to start of source pixels + +; Find offset into target surface memory + clc + lda cx2 ; Multiply cx2 by 4 to get offset (two pixels per byte) asl a asl a sta t clc - lda cy2 ; Multiply cy1 by 16 to get index into scanline table + lda cy2 ; Multiply cy2 by 16 to get index into scanline table asl a asl a asl a - asl a ; y2 is now in the accumulator + asl a ; y screen location is now in the accumulator clc tax - lda >ScanTable,x + lda >ScanTable,x ; Load byte offset of y position from table adc t ; Add t to scanline offset - tax ; Offset to start of screen memory + sta to ; Offset to start of target pixels - sei ; Disable interrupts while we change data banks - pea $0101 ; Push Effective Address (our new data bank) always 16 bits - plb ; Pull data bank from stack (data bank now $01) - plb ; Do it twice because it's only an 8 bit operation + lda #0 ; Load 0 into X and Y counters + sta xc + sta yc -; Row 1 - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen - inx ; Move to next pixel quad - inx - iny - iny - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen -; Move to row 2 - txa - adc #158 ; Next line - tax - tya - adc #158 ; Next line - tay -; Row 2 - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen - inx ; Move to next pixel quad - inx - iny - iny - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen -; Move to row 3 - txa - adc #158 ; Next line - tax - tya - adc #158 ; Next line - tay -; Row 3 - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen - inx ; Move to next pixel quad - inx - iny - iny - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen -; Move to row 4 - txa - adc #158 ; Next line - tax - tya - adc #158 ; Next line - tay -; Row 4 - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen - inx ; Move to next pixel quad - inx - iny - iny - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen -; Move to row 5 - txa - adc #158 ; Next line - tax - tya - adc #158 ; Next line - tay -; Row 5 - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen - inx ; Move to next pixel quad - inx - iny - iny - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen -; Move to row 6 - txa - adc #158 ; Next line - tax - tya - adc #158 ; Next line - tay -; Row 6 - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen - inx ; Move to next pixel quad - inx - iny - iny - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen -; Move to row 7 - txa - adc #158 ; Next line - tax - tya - adc #158 ; Next line - tay -; Row 7 - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen - inx ; Move to next pixel quad - inx - iny - iny - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen -; Move to row 8 - txa - adc #158 ; Next line - tax - tya - adc #158 ; Next line - tay -; Row 8 - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen - inx ; Move to next pixel quad - inx - iny - iny - lda [p],y ; Load 4 pixels from SHA data - sta |SHRShad,x ; Store 4 pixels into screen +blitTop ldy so ; Load Y register with source pixel offset + lda [tiles],y ; Load 4 tile pixels + ldy to ; Load Y register with target pixel offset + sta [surface],y ; Store 4 pixels into screen - plb ; Pull original data bank from stack - cli ; Restore interrupts + clc ; Increment to next pixel target quad + lda #2 + adc to + sta to + clc ; Increment to next pixel source quad + lda #2 + adc so + sta so + + clc + lda xc ; Increment X counter + adc #1 + sta xc + cmp #2 ; End of X pixels? + bcc blitTop ; Nope! + + lda #0 ; Reset X counter + sta xc + clc ; Increment target offset + lda #156 + adc to + sta to + clc ; Increment source offset + lda #156 + adc so + sta so + clc + lda yc ; Increment Y counter + adc #1 + sta yc + cmp #8 ; End of Y pixels? + bcc blitTop ; Nope! jreturn end + ;---------------------------------------- -; Blit an 8x8 block from off-screen to back buffer with alpha. +; Blit an 8x8 block with alpha. ;---------------------------------------- asmB88a start -mo equ 1 ; Mask Offset -so equ 3 ; Source Pixels Offset -to equ 5 ; Target Pixels Offset +so equ 1 ; Source Pixels Offset +to equ 3 ; Target Pixels Offset +mo equ 5 ; Mask Offset t equ 7 ; Temp xc equ 9 ; X Counter yc equ 11 ; Y Counter - jsubroutine (4:p,2:cx1,2:cy1,2:cx2,2:cy2,2:offset),12 - using ScanTable + jsubroutine (4:surface,4:tiles,2:cx1,2:cy1,2:cx2,2:cy2,2:offset),12 + using GlobalData - phb ; Push our current data bank onto the stack - -; ***TODO*** Mask off unused bits so they can be used for other things elsewhere ; Find offset into tile memory lda cx1 ; Multiply cx1 by 4 to get offset (two pixels per byte) asl a asl a sta t + clc lda cy1 ; Multiply cy1 by 16 to get index into scanline table asl a asl a asl a - asl a ; y1 is now in the accumulator + asl a ; y screen location is now in the accumulator tax clc - lda >ScanTable,x + lda >ScanTable,x ; Load byte offset of y position from table adc t ; Add t to scanline offset sta so ; Offset to start of source pixels +; Find offset into tile memory for mask data lda offset ; Load offset asl a ; Multiply by 4 asl a @@ -257,39 +169,36 @@ yc equ 11 ; Y Counter adc so ; Add to source pixel offset sta mo ; Offset to start of mask pixels -; Find offset into shadow SHR memory - lda cx2 ; Multiply cx1 by 4 to get offset (two pixels per byte) +; Find offset into target surface memory + clc + lda cx2 ; Multiply cx2 by 4 to get offset (two pixels per byte) asl a asl a sta t - lda cy2 ; Multiply cy1 by 16 to get index into scanline table + clc + lda cy2 ; Multiply cy2 by 16 to get index into scanline table asl a asl a asl a - asl a ; y2 is now in the accumulator + asl a ; y screen location is now in the accumulator clc tax - lda >ScanTable,x + lda >ScanTable,x ; Load byte offset of y position from table adc t ; Add t to scanline offset sta to ; Offset to start of target pixels - sei ; Disable interrupts while we change data banks - pea $0101 ; Push Effective Address (our new data bank) always 16 bits - plb ; Pull data bank from stack (data bank now $01) - plb ; Do it twice because it's only an 8 bit operation - - lda #0 - sta xc ; Load 0 into X and Y counters + lda #0 ; Load 0 into X and Y counters + sta xc sta yc -blitATop ldx to ; Load X and Y registers with target pixel offset - ldy to - lda SHRShad,x ; Load 4 target pixels - ldy mo ; Load Y register with pixel mask offset - and [p],y ; AND with mask +blitTop ldy to ; Load Y register with target pixel offset + lda [surface],y ; Load target pixels + ldy mo ; Load Y register with mask pixel offset + and [tiles],y ; AND with mask ldy so ; Load Y register with source pixel offset - ora [p],y ; OR with source pixels - sta |SHRShad,x ; Store 4 pixels into screen + ora [tiles],y ; OR with source pixels + ldy to ; Load Y register with target pixel offset + sta [surface],y ; Store 4 pixels into screen clc ; Increment to next pixel target quad lda #2 @@ -309,7 +218,7 @@ blitATop ldx to ; Load X and Y registers with target pixel offset adc #1 sta xc cmp #2 ; End of X pixels? - bcc blitATop ; Nope! + bcc blitTop ; Nope! lda #0 ; Reset X counter sta xc @@ -330,28 +239,28 @@ blitATop ldx to ; Load X and Y registers with target pixel offset adc #1 sta yc cmp #8 ; End of Y pixels? - bcc blitATop ; Nope! - - plb ; Pull original data bank from stack - cli ; Restore interrupts + bcc blitTop ; Nope! jreturn end + + ;---------------------------------------- ; Set Border Color ;---------------------------------------- asmBorder start - jsubroutine (2:c) + jsubroutine (2:color) short m lda >$E0C034 and #$F0 - ora c + ora color sta >$E0C034 long m jreturn end + ;---------------------------------------- ; Draw a block of tiles from a region of tile data ;---------------------------------------- @@ -363,7 +272,7 @@ offset equ 5 loopX equ 7 loopY equ 9 - jsubroutine (2:startX,2:startY,2:width,2:height,4:mapData,2:stride,4:tiles),10 + jsubroutine (4:surface,2:startX,2:startY,2:width,2:height,4:mapData,2:stride,4:tiles),10 lda #0 ; Zero some starting values sta offset @@ -401,6 +310,7 @@ drawTop phy ; Keep Y for later ph2 tileY ph2 tileX ph4 tiles + ph4 surface jsl asmB88 ; Call tile drawing code ply ; Unclobber @@ -422,6 +332,7 @@ drawTop phy ; Keep Y for later jreturn end + ;=============================================================================================== ; @@ -444,11 +355,11 @@ diff equ 15 even_c equ 17 odd_c equ 19 - jsubroutine (4:p,2:penColor,2:clpx0,2:clpy0,2:clpx1,2:clpy1),20 + jsubroutine (4:surface,2:penColor,2:clpx0,2:clpy0,2:clpx1,2:clpy1),20 -; Say p = $012000... +; Say surface = $012000... - lda #

p ; Should be $0120 + lda #>surface ; Should be $0120 pha ; switch to bank we're pointing into plb ; B is now $20 - bad! plb ; B is now $01 - good! @@ -953,13 +864,12 @@ asmGetPoint start temp1 equ 1 - jsubroutine (2:Xp,2:Yp),2 - using ScanTable + jsubroutine (4:surface,2:Xp,2:Yp),2 lda Yp ; Load accumulator with Y location asl a ; Shift accumulator left (multiply by 2) for word offset into table - tax ; Transfer accumulator to x register - lda >ScanTable,x ; Look up scan line address offset + tay ; Transfer accumulator to y register + lda ScanTable,y ; Look up scan line address offset sta temp1 ; Store accumulator (row offset into SHR memory) into temp1 clc ; Clear carry flag lda Xp ; Place X position in accumulator @@ -968,8 +878,8 @@ temp1 equ 1 clc ; Clear carry adc temp1 ; Add X position to SHR address with carry - a now contains address of color pair we want plp ; Restore our carry flag - tax ; Transfer accumulator to x register - lda SHRShad,x ; Load pixel pair into accumulator + tay ; Transfer accumulator to y register + lda [surface],y ; Load pixel pair into accumulator bcc GEven ; Branch if Carry Clear - Determines Even/Odd pixel and #$F ; AND accumulator with $F to mask off unwanted pixel bra GBoth @@ -985,15 +895,17 @@ GBoth sta temp1 ; Store accumulator in temp1 jreturn 2:temp1 end + ;---------------------------------------- ; Return the current 1/10th second timer value ;---------------------------------------- asmGetVbl start - using VblRate + using GlobalData lda >VblTime rtl end + ;---------------------------------------- ; Turns off SHR Graphics ;---------------------------------------- @@ -1007,6 +919,7 @@ asmGrOff start jreturn end + ;---------------------------------------- ; Turns on SHR Graphics ;---------------------------------------- @@ -1020,6 +933,7 @@ asmGrOn start jreturn end + ;---------------------------------------- ; Reads controller axis ; Thank you to John Brooks for this code! @@ -1038,7 +952,7 @@ ptrig equ $00C070 php ; Save mx reg size bits phb ; Save data bank - short m,i ; 8-bit m,x + short m,i ; 8-bit m,x sei ; disable interrupts ldx #0 ; Zero paddle 0 counter @@ -1081,11 +995,12 @@ gotpdl0 xba ; 3c sta pret1 plp ; Restore mx 8/16 mode and interrupt enable state - long m,i + long m,i jreturn 2:pret0 end + ;---------------------------------------- ; Swaps nibble values ; @@ -1096,16 +1011,16 @@ asmNSwap start hnibo equ 1 ; High nibble old color value hnibn equ 2 ; High nibble new color value - jsubroutine (4:P,2:C,2:O,2:N),2 + jsubroutine (4:pointer,2:count,2:oldColor,2:newColor),2 - short m ; Use 8 bit accumulator - lda N ; Load new color to use + short m ; Use 8 bit accumulator + lda newColor ; Load new color to use asl a ; Shift it up a nibble asl a asl a asl a sta hnibn ; Store it for later - lda O ; Load old color to use (16 bit argument) + lda oldColor ; Load old color to use (16 bit argument) asl a ; Shift it up a nibble asl a asl a @@ -1114,33 +1029,34 @@ hnibn equ 2 ; High nibble new color value ldy #0 ; Load Y (our counter) with 0 -NSLow lda [P],y ; Get byte to check +NSLow lda [pointer],y ; Get byte to check and #$0F ; Isolate low nibble - cmp O ; Compare to old value + cmp oldColor ; Compare to old value bne NSHigh ; Not equal, skip to high nibble - lda [P],y ; Get byte to modify + lda [pointer],y ; Get byte to modify and #$F0 ; Clear low nibble - ora N ; Set low nibble to new color - sta [P],y ; Store it back + ora newColor ; Set low nibble to new color + sta [pointer],y ; Store it back -NSHigh lda [P],y ; Get byte to check +NSHigh lda [pointer],y ; Get byte to check and #$F0 ; Isolate high nibble cmp hnibo ; Compare to old color bne NSEnd ; Not equal, skip to next byte - lda [P],y ; Get byte to modify + lda [pointer],y ; Get byte to modify and #$0F ; Clear high nibble ora hnibn ; Set high nibble to new color - sta [P],y ; Store it back + sta [pointer],y ; Store it back NSEnd iny ; Increment Y clc ; Clear carry - cpy C ; Compare Y to number of bytes to modify + cpy count ; Compare Y to number of bytes to modify bcc NSLow ; Keep going - long m ; Back to 16 bit accumulator + long m ; Back to 16 bit accumulator jreturn end + ;---------------------------------------- ; Plots a point in a given color ; @@ -1152,41 +1068,41 @@ temp1 equ 1 temp2 equ 3 temp3 equ 5 - jsubroutine (2:C,2:Xp,2:Yp),6 - using ScanTable + jsubroutine (4:surface,2:color,2:Xp,2:Yp),6 + using GlobalData lda Xp ; Place X position in accumulator lsr a ; Logical Shift Right (divide by 2) - bit shifted off the end goes into carry flag sta temp1 ; Store accumulator in temp1 bcc PEven ; Branch if Carry Clear - Determines Even/Odd pixel - POdd lda #$FFF0 ; Load accumulator with pixel mask sta temp2 ; Store accumulator in temp2 - lda C ; Load accumulator with color + lda color ; Load accumulator with color and #$F ; AND accumulator with $F bra PBoth ; Branch Always to PBoth PEven lda #$FF0F ; Load accumulator with pixel mask sta temp2 ; Store accumulator in temp2 - lda C ; Load accumulator with color + lda color ; Load accumulator with color and #$F0 ; AND accumulator with $F0 PBoth sta temp3 ; Store accumulator in temp3 lda Yp ; Load accumulator with Y location asl a ; Shift accumulator left (multiply by 2) - tax ; Transfer accumulator to x register - lda >ScanTable,x ; Look up scan line address offset + tay ; Transfer accumulator to y register + lda ScanTable,y ; Look up scan line address offset adc temp1 ; Add X position to address with carry - tax ; Transfer accumulator to x + tay ; Transfer accumulator to y - lda >SHRShad,x ; Load existing pixels into accumulator + lda [surface],y ; Load existing pixels into accumulator and temp2 ; AND accumulator with temp2 ora temp3 ; OR accumulator with temp3 - sta >SHRShad,x ; Store updated pixels back into memory + sta [surface],y ; Store updated pixels back into memory jreturn end + ;---------------------------------------- ; "PEI Slam" shadowed SHR display to the ; actual display. Copies all 200 lines, @@ -1198,11 +1114,11 @@ asmSlam start jsubroutine - short m ; Turn Shadowing On + short m ; Turn Shadowing On lda >$E0C035 and #$F7 sta >$E0C035 - long m + long m php ; Push Processor Status Register lda >$E0C068-1 @@ -1398,11 +1314,11 @@ peiEnd lda #0 ; Swap main 48k into bank 0 sta >$E0C068-1 ; Restore main/aux bank state plp ; Restore processor register - short m ; Turn Shadowing Off + short m ; Turn Shadowing Off lda >$E0C035 ora #$08 sta >$E0C035 - long m + long m jreturn @@ -1416,21 +1332,21 @@ StackPtr ds 2 ; Space for SP ; Builds a table of scanline offsets ;---------------------------------------- asmStart start - jsubroutine (2:id,2:h) - using ScanTable - using VblRate + jsubroutine (2:id,2:hertz) + using GlobalData - ldx #0 ; Load 0 into x register + ldy #0 ; Load 0 into y register lda #0 ; Load 0 into accumulator clc ; Clear carry flag -STL sta >ScanTable,x ; Store accumulator in ScanTable+x +buildTable anop + sta ScanTable,y ; Store accumulator in ScanTable+x adc #160 ; Add 160 to accumulator - inx ; Increment x - inx ; Increment x - cpx #400 ; Compare x to 400 (200 scanlines) - bcc STL ; Repeat Scan Table Loop until we do all 200 lines + iny ; Increment y + iny ; Increment y + cpy #400 ; Compare y to 400 (200 scanlines) + bcc buildTable ; Repeat Scan Table Loop until we do all 200 lines - lda h ; Store refresh rate / 10 in VblCount and VblRate + lda hertz ; Store refresh rate / 10 in VblCount and VblRate sta >VblRate lda #0 ; Reset timer @@ -1447,6 +1363,7 @@ STL sta >ScanTable,x ; Store accumulator in ScanTable+x jreturn end + ;---------------------------------------- ; Shut down assembly routines ;---------------------------------------- @@ -1460,6 +1377,7 @@ asmStop start jreturn end + ;---------------------------------------- ; Increment time counter using VBLs every 1/10 second ;---------------------------------------- @@ -1467,13 +1385,15 @@ VblHdr start dc i4'0' ; Space for task pointer VblCount dc i2'1' ; How many VBLs between calls (1 only on initial call) dc i2'$A55A' ; Task signature - using VblRate - long m,i + + using GlobalData + + long m,i lda >VblRate ; Reset hearbeat counter sta >VblCount lda >VblTime ; Increment timer inc a sta >VblTime - short m,i + short m,i rtl end diff --git a/joeylib/src/jST.c b/joeylib/src/jST.c new file mode 100644 index 0000000..d7a1c8c --- /dev/null +++ b/joeylib/src/jST.c @@ -0,0 +1,202 @@ +/* + * JoeyLib + * Copyright (C) 2018-2019 Scott Duensing + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "joey.h" + + +void jlDisplayPresent(void) { +} + + +void jlDrawBlit8x8(jlStaT *sta, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2) { + (void)sta; + (void)cx1; + (void)cy1; + (void)cx2; + (void)cy2; +} + + +void jlDrawBlit8x8a(jlStaT *sta, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2, byte offset) { + (void)sta; + (void)cx1; + (void)cy1; + (void)cx2; + (void)cy2; +} + + +void jlDrawBlitMap(jint16 startX, jint16 startY, jint16 width, jint16 height, byte *mapData, juint16 stride, jlStaT *sta) { + (void)startX; + (void)startY; + (void)width; + (void)height; + (void)mapData; + (void)stride; + (void)sta; +} + + +void jlDrawClear(void) { +} + + +byte jlDrawGetPixel(jint16 x, jint16 y) { + (void)x; + (void)y; + + return 0; +} + + +void jlDrawPoint(jint16 x, jint16 y) { + (void)x; + (void)y; +} + + +jint16 jlGameGetAxis(byte which) { + (void)which; + + return 0; +} + + +bool jlGameGetButton(byte which) { + (void)which; + + return false; +} + + +bool jlKeyPressed(void) { + return false; +} + + +char jlKeyRead(void) { + return 0; +} + + +void jlPaletteSet(byte index, byte r, byte g, byte b) { + (void)index; + (void)r; + (void)g; + (void)b; +} + + +void jlPaletteSetFromSta(jlStaT *sta) { + (void)sta; +} + + +void jlSoundFree(jlSoundT *sound) { + (void)sound; +} + + +bool jlSoundIsPlaying(jlSoundT *sound) { + (void)sound; + + return false; +} + + +bool _jlSoundLoad(jlSoundT **sound, char *filename) { + (void)sound; + (void)filename; + + return false; +} + + +void jlSoundMusicContinue(void) { +} + + +bool jlSoundMusicIsPlaying(void) { + return false; +} + + +void jlSoundMusicPause(void) { +} + + +void jlSoundMusicPlay(char *name) { + (void)name; +} + + +void jlSoundMusicStop(void) { +} + + +void jlSoundPlay(jlSoundT *sound) { + (void)sound; +} + + +bool _jlStaCreate(jlStaT **sta) { + (void)sta; + + return false; +} + + +void jlStaDisplay(jlStaT *sta) { + (void)sta; +} + + +void jlUtilIdle(void) { +} + + +bool jlUtilMustExit(void) { + return false; +} + + +void jlUtilNibbleSwap(byte *mem, jint16 count, byte old, byte new) { + (void)mem; + (void)count; + (void)old; + (void)new; +} + + +void jlUtilShutdown(void) { + jlUtilDie("Clean Exit."); +} + + +void jlUtilStartup(char *appTitle) { + (void)appTitle; +} + + +juint16 jlUtilTimer(void) { + return 0; +} diff --git a/joeylib/src/joey.c b/joeylib/src/joey.c index 360572c..1e28487 100644 --- a/joeylib/src/joey.c +++ b/joeylib/src/joey.c @@ -21,8 +21,8 @@ #include -#include #include +#include #include @@ -627,6 +627,16 @@ void jlUtilRandomSeedSet(juint32 seed) { } +void jlUtilSleep(juint16 tenths) { + juint16 t = jlUtilTimer(); + juint16 d = 0; + + while ((d < tenths) && !jlUtilMustExit()) { + d = jlUtilTimeSpan(t, jlUtilTimer()); + } +} + + void *_jlUtilStackPop(jlStackT **stack) { void *d = NULL; jlStackT *s; @@ -649,6 +659,15 @@ void _jlUtilStackPush(jlStackT **stack, void *data) { } +juint16 jlUtilTimeSpan(juint16 past, juint16 current) { + jint32 temp = current - past; + if (temp < 0) { + temp += 65536; + } + return (juint16)temp; +} + + void jlVecDisplay(jlVecT *vec, jint16 ox, jint16 oy) { jint16 command; jint16 count; diff --git a/joeylib/src/joey.h b/joeylib/src/joey.h index 5b4d74b..267f6ac 100644 --- a/joeylib/src/joey.h +++ b/joeylib/src/joey.h @@ -282,13 +282,14 @@ juint16 jlUtilRandom(void); juint32 jlUtilRandomSeedGet(void); void jlUtilRandomSeedSet(juint32 seed); void jlUtilShutdown(void) __attribute__((noreturn)); +void jlUtilSleep(juint16 tenths); #define jlUtilStackPop(stack) _jlUtilStackPop((jlStackT **)&(stack)) // Syntatic Sugar void *_jlUtilStackPop(jlStackT **stack); #define jlUtilStackPush(stack, data) _jlUtilStackPush((jlStackT **)&(stack), data) // Syntatic Sugar void _jlUtilStackPush(jlStackT **stack, void *data); void jlUtilStartup(char *appTitle); juint16 jlUtilTimer(void); -#define jlUtilTimeSpan(past, current) (past < current ? current - past : 65536 - past - current) +juint16 jlUtilTimeSpan(juint16 past, juint16 current); void jlVecDisplay(jlVecT *vec, jint16 x, jint16 y); void jlVecFree(jlVecT *vec); @@ -298,22 +299,22 @@ bool _jlVecLoad(jlVecT **vec, char *filename); #ifdef JOEY_IIGS // Inlined functions - asm code -extern void asmB88(byte *p, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2); -extern void asmB88a(byte *p, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2, byte alpha); -extern void asmDrawBM(jint16 startX, jint16 startY, jint16 width, jint16 height, byte *mapData, juint16 stride, byte *sta); -//extern void asmDrawLine(byte *p, jint16 color, jint16 x1, jint16 y1, jint16 x2, jint16 y2); -extern jint16 asmGetPoint(jint16 x, jint16 y); +extern void asmB88(juint32 surface, byte *p, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2); +extern void asmB88a(juint32 surface, byte *p, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2, byte alphaOffset); +extern void asmDrawBM(juint32 surface, jint16 startX, jint16 startY, jint16 width, jint16 height, byte *mapData, juint16 stride, byte *sta); +//extern void asmDrawLine(juint32 surface, jint16 color, jint16 x1, jint16 y1, jint16 x2, jint16 y2); +extern jint16 asmGetPoint(juint32 surface, jint16 x, jint16 y); extern juint16 asmGetVbl(void); extern void asmNSwap(byte *mem, jint16 count, jint16 old, jint16 new); -extern void asmPoint(jint16 color, jint16 x, jint16 y); +extern void asmPoint(juint32 surface, jint16 color, jint16 x, jint16 y); // Inlined functions -#define jlDrawBlit8x8(sta, cx1, cy1, cx2, cy2) asmB88((byte *)sta->pixels, cx1, cy1, cx2, cy2) -#define jlDrawBlit8x8a(sta, cx1, cy1, cx2, cy2, offset) asmB88a((byte *)sta->pixels, cx1, cy1, cx2, cy2, offset) -#define jlDrawBlitMap(startX, startY, width, height, mapData, stride, sta) asmDrawBM(startX, startY, width, height, (byte *)mapData, stride, (byte *)sta->pixels) -#define jlDrawGetPixel(x, y) asmGetPoint(x, y) -#define jlDrawPoint(x, y) asmPoint(_jlDrawColorNibbles, x, y) -//#define jlDrawLine(x1, y1, x2, y2) asmDrawLine((byte *)0x012000L, _jlDrawColor, x1, y1, x2, y2) +#define jlDrawBlit8x8(sta, cx1, cy1, cx2, cy2) asmB88(0x012000, (byte *)sta->pixels, cx1, cy1, cx2, cy2) +#define jlDrawBlit8x8a(sta, cx1, cy1, cx2, cy2, offset) asmB88a(0x012000, (byte *)sta->pixels, cx1, cy1, cx2, cy2, offset) +#define jlDrawBlitMap(startX, startY, width, height, mapData, stride, sta) asmDrawBM(0x012000, startX, startY, width, height, (byte *)mapData, stride, (byte *)sta->pixels) +#define jlDrawGetPixel(x, y) asmGetPoint(0x012000, x, y) +#define jlDrawPoint(x, y) asmPoint(0x012000, _jlDrawColorNibbles, x, y) +//#define jlDrawLine(x1, y1, x2, y2) asmDrawLine(0x012000, _jlDrawColor, x1, y1, x2, y2) #define jlUtilNibbleSwap(mem, count, old, new) asmNSwap(mem, count, (jint16)old, (jint16)new) #define jlUtilTimer asmGetVbl diff --git a/joeylib/src/test.c b/joeylib/src/test.c index 0347526..518a134 100644 --- a/joeylib/src/test.c +++ b/joeylib/src/test.c @@ -70,9 +70,9 @@ int main(void) { jlStaDisplay(kanga); jlDrawColor(1); - //jlDrawBox(0, 0, 319, 199); + jlDrawBox(0, 0, 319, 199); - //jlSoundMusicPlay("music"); + jlSoundMusicPlay("music"); jlPaletteSet(15, 15, 15, 15); printAt(font, 1, 16, "X"); @@ -82,13 +82,11 @@ int main(void) { printAt(font, 1, y++, "Y = %d ", jlGameGetAxis(1)); printAt(font, 1, y++, "T = %d ", jlUtilTimer()); jlDrawColor((byte)color); - _jlDebugBorder(BORDER_GREEN); jlDrawLine(0, y2, 319, 199-y2); - _jlDebugBorder(BORDER_BROWN); y2 += dy; if (y2 == 199 || y2 == 0) dy = -dy; jlDisplayPresent(); - //jlUtilNibbleSwap((byte *)font->pixels, 32000, (byte)(color), (byte)(nextColor)); + jlUtilNibbleSwap((byte *)font->pixels, 32000, (byte)(color), (byte)(nextColor)); color = nextColor; nextColor++; if (nextColor > 15) nextColor = 1; diff --git a/scripts/installer.sh b/scripts/installer.sh index f21ea62..950e434 100755 --- a/scripts/installer.sh +++ b/scripts/installer.sh @@ -507,11 +507,11 @@ function installIIgs() { mkdir -p "${JOEY}/dist/IIgs" - if [[ ! -e "${JOEY}/dist/IIgs/Tool221#ba0000" ]]; then + if [[ ! -e "${IIGS}/Tool221#ba0000" ]]; then purple "Installing Tool221" download https://www.brutaldeluxe.fr/products/apple2gs/tool221/ninjatracker_tool221_v2.1.2mg "${IIGS}/cadius/cadius" extractfile ninjatracker_tool221_v2.1.2mg NT.TOOL221.V2.1/SYSTEM/TOOLS/TOOL221 . - cp -f TOOL221#BA0000 "${JOEY}/dist/IIgs/Tool221#ba0000" + cp -f TOOL221#BA0000 "${IIGS}/Tool221#ba0000" fi purple "Building JoeyLib" diff --git a/scripts/joeyDev.sh b/scripts/joeyDev.sh index 2c69bd9..042efaa 100755 --- a/scripts/joeyDev.sh +++ b/scripts/joeyDev.sh @@ -17,6 +17,9 @@ export PATH="${JOEY}/sdks/IIgs:${PATH}" export MACOSX_DEPLOYMENT_TARGET=10.6 export PATH="${JOEY}/sdks/macos/bin:${PATH}" +# Amiga Cross Compiler +export PATH="${JOEY}/sdks/amiga/bin:${PATH}" + # Raspberry Pi Cross Compiler #export PATH="${JOEY}/sdks/pi/tools/arm-bcm2708/arm-bmc2708-linux-gnueabi/bin:${PATH}" #export PATH="${JOEY}/sdks/pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:${PATH}"