From 61f3931dd9be6f144f9772b55f7a2be0a60e30cb Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Thu, 21 Jun 2018 23:27:51 -0400 Subject: [PATCH] Add lots of instructions which are displayed when launched or on demand by pressing H. Update the readme. --- CurtaSim.xcodeproj/project.pbxproj | 4 - .../UserInterfaceState.xcuserstate | Bin 21486 -> 27795 bytes CurtaSim/curta.c | 3 + CurtaSim/curtaUI.c | 153 ++++++++++++++++-- CurtaSim/curtaUI.h | 1 + CurtaSim/main.c | 20 --- CurtaSim/make/V2Make.scpt | Bin 4844 -> 4900 bytes README.md | 30 +++- 8 files changed, 171 insertions(+), 40 deletions(-) delete mode 100644 CurtaSim/main.c diff --git a/CurtaSim.xcodeproj/project.pbxproj b/CurtaSim.xcodeproj/project.pbxproj index 949b4d0..2982025 100644 --- a/CurtaSim.xcodeproj/project.pbxproj +++ b/CurtaSim.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 9D24616A20D8B2AE00227E1D /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D24616920D8B2AE00227E1D /* main.c */; }; 9D24616C20D8B2AE00227E1D /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 9D24616B20D8B2AE00227E1D /* Makefile */; }; 9D24616F20D8B2AE00227E1D /* AppleCommander.jar in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D24616E20D8B2AE00227E1D /* AppleCommander.jar */; }; 9D24617120D8B2AE00227E1D /* createDiskImage in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D24617020D8B2AE00227E1D /* createDiskImage */; }; @@ -46,7 +45,6 @@ /* Begin PBXFileReference section */ 9D24616620D8B2AE00227E1D /* doNotBuild */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = doNotBuild; sourceTree = BUILT_PRODUCTS_DIR; }; - 9D24616920D8B2AE00227E1D /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = ""; }; 9D24616B20D8B2AE00227E1D /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; 9D24616E20D8B2AE00227E1D /* AppleCommander.jar */ = {isa = PBXFileReference; lastKnownFileType = archive.jar; name = AppleCommander.jar; path = make/AppleCommander.jar; sourceTree = ""; }; 9D24617020D8B2AE00227E1D /* createDiskImage */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = createDiskImage; path = make/createDiskImage; sourceTree = ""; }; @@ -101,7 +99,6 @@ 9D24616820D8B2AE00227E1D /* CurtaSim */ = { isa = PBXGroup; children = ( - 9D24616920D8B2AE00227E1D /* main.c */, 9D24618F20D8B30C00227E1D /* curta.c */, 9D24618B20D8B30B00227E1D /* curtaModel.c */, 9D24618D20D8B30B00227E1D /* curtaModel.h */, @@ -216,7 +213,6 @@ buildActionMask = 2147483647; files = ( 9D24616C20D8B2AE00227E1D /* Makefile in Sources */, - 9D24616A20D8B2AE00227E1D /* main.c in Sources */, 9D24619220D8B30C00227E1D /* curtaModel.c in Sources */, 9D24619520D8B30C00227E1D /* curtaUI.c in Sources */, 9D24619320D8B30C00227E1D /* joystick.c in Sources */, diff --git a/CurtaSim.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate b/CurtaSim.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate index cf5b94426017034be6e061c2725bc6dd76251149..ab57f3dd7dc9c0ba1d5612750e443793fe2dad01 100644 GIT binary patch delta 13687 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 delta 9559 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 diff --git a/CurtaSim/curta.c b/CurtaSim/curta.c index 168bebb..e22fc92 100644 --- a/CurtaSim/curta.c +++ b/CurtaSim/curta.c @@ -12,6 +12,9 @@ int main(void) { bool timeToQuit = false; + + printInstructions(); + initUI(); while (!timeToQuit) { diff --git a/CurtaSim/curtaUI.c b/CurtaSim/curtaUI.c index b4f0190..4cc8442 100644 --- a/CurtaSim/curtaUI.c +++ b/CurtaSim/curtaUI.c @@ -363,25 +363,138 @@ static tAction getNextAction(void) } +void textMode(void) +{ + clrscr(); + asm ("STA %w", 0xc051); +} + + +void graphicsMode(void) +{ + asm ("STA %w", 0xc050); +} + + +void printInstructions(void) +{ + textMode(); + + // 0000000001111111111222222222233333333334 + // 1234567890123456789012345678901234567890 + printf(" CURTASIM\n" + "\n" + "A CURTA IS A MECHANICAL CALCULATOR THAT\n" + "LOOKS SOMEWHAT LIKE A PEPPER GRINDER.\n" + "GOOGLE CURTA AND CHECKOUT SOME PICS.\n" + "TO REPLACE THE CRANK, THIS SIMULATION\n" + "USES A JOYSTICK.\n" + "\n" + "THE PRIMARY INTERACTION IS PERFORMED\n" + "BY \"CRANKING\" THE JOYSTICK THROUGH\n" + "360 DEGREES. TO PERFORM A CRANK, START\n" + "WITH THE JOYSTICK CENTERED. PULL THE\n" + "JOYSTICK TOWARDS YOU AND THEN CRANK\n" + "AROUND A CIRCLE CLOCKWISE UNTIL IT IS\n" + "AGAIN PULLED TOWARDS YOU. THEN RELEASE\n" + "TO THE CENTRE POSITION.\n" + "\n" + "THE OPERAND IS THE SET OF DIGITS AT THE\n" + "TOP OF THE SCREEN. THE SLIDERS CONTROL\n" + "THE OPERAND. THE RESULT IS AT THE\n" + "BOTTOM OF THE SCREEN. THE COUNTER IS A\n" + "MULTIPLICAND.\n" + "\n" + "PRESS ANY KEY FOR MORE INFORMATION"); + cgetc(); + + clrscr(); + + // 0000000001111111111222222222233333333334 + // 1234567890123456789012345678901234567890 + printf(" CURTASIM\n" + "\n" + "BELOW THE RESULT IS A CARAT THAT POINTS\n" + "TO A DIGIT. THIS IS THE SAME AS THE\n" + "CARRIAGE POSITION ON A REAL CURTA.\n" + "\n" + "THE JOYSTICK OPERATIONS ARE:\n" + "\n" + " LEFT/RIGHT - SELECT A DIGIT IN THE\n" + " OPERAND\n" + " UP/DOWN - CHANGE THE SELECTED DIGIT IN\n" + " THE OPERAND\n" + " LEFT/RIGHT WITH BUTTON 0 - CHANGE\n" + " THE CARRIAGE POSITION\n" + " CRANK - ADD OPERAND TIMES CARRIAGE\n" + " POSITION TO THE RESULT\n" + " CRANK WITH BUTTON 0 - SUBTRACT OPERAND\n" + " TIMES CARRIAGE POSITION FROM\n" + " THE RESULT\n" + " CRANK WITH BUTTON 1 - CLEAR THE RESULT\n" + " AND COUNTER\n" + "\n" + "PRESS ANY KEY FOR MORE INFORMATION"); + + cgetc(); + + clrscr(); + // 0000000001111111111222222222233333333334 + // 1234567890123456789012345678901234567890 + printf(" CURTASIM\n" + "\n" + "THESE KEYBOARD COMMANDS CAN BE USED:\n" + "\n" + " Q - QUIT THE SIMULATION\n" + " H - PRINT THIS HELP AGAIN\n" + "\n" + "IMAGINE YOU WANT TO MULTIPLY 123 BY 990." + "PERFORM A CLEAR OPERATION IF RESULT IS\n" + "NOT ZERO. USE LEFT/RIGHT/UP/DOWN\n" + "OPERATIONS TO PUT 123 IN THE OPERAND.\n" + "HOLD BUTTON 0 AND PERFORM LEFT MOVES TO\n" + "GET THE CARRIAGE POINTING TO THE\n" + "THOUSANDS POSITION IN THE RESULT.\n" + "\n" + "NOW DO AN ADD OPERATION. THIS FINDS\n" + "123 * 1000 = 123000 AND ADDS IT TO THE\n" + "RESULT. MOVE THE CARRIAGE TO THE TENS\n" + "POSITION. DO A SUBTRACT WHICH SUBTRACTS" + "123 * 10 = 1230 FROM RESULT. COUNT SAYS" + "990 AND RESULT HAS THE ANSWER: 121770\n" + "\n" + "PRESS ANY KEY TO START THE SIMULATION"); + + cgetc(); +} + + +void redrawUI(void) +{ + tDigitPos pos; + + graphicsMode(); + tgi_clear(); + for (pos = 0; pos < NUM_OPERAND_DIGITS; pos++) { + drawOperand(pos); + } + + // Mixed text and graphics mode + asm ("STA %w", 0xc053); + printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); + printState(); +} + + void initUI(void) { // Install drivers - tDigitPos pos; - initDevice(changeOperand, changeSelectedOperand); tgi_install(&a2_hires_drv); tgi_init(); - tgi_clear(); - for (pos = 0; pos < NUM_OPERAND_DIGITS; pos++) { - drawOperand(pos); - } - - // Mixed text and graphics mode - asm ("STA %w", 0xc053); - printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - printState(); + redrawUI(); } @@ -390,10 +503,22 @@ bool processNextEvent(void) bool timeToQuit = false; // Exit on ESC - if ((kbhit()) && - (cgetc() == 27)) { - timeToQuit = true; + if (kbhit()) { + switch (cgetc()) { + case 27: + case 'Q': + case 'q': + timeToQuit = true; + break; + + case 'H': + case 'h': + printInstructions(); + redrawUI(); + break; + } } + switch (getNextAction()) { case ACTION_NULL: break; diff --git a/CurtaSim/curtaUI.h b/CurtaSim/curtaUI.h index c0eca65..097d798 100644 --- a/CurtaSim/curtaUI.h +++ b/CurtaSim/curtaUI.h @@ -11,6 +11,7 @@ #ifndef _CURTAUI_H #define _CURTAUI_H +extern void printInstructions(void); extern void initUI(void); extern void shutdownUI(void); extern bool processNextEvent(void); diff --git a/CurtaSim/main.c b/CurtaSim/main.c deleted file mode 100644 index 34437b9..0000000 --- a/CurtaSim/main.c +++ /dev/null @@ -1,20 +0,0 @@ -/* - * main.c - * CurtaSim - * - * Created by Jeremy Rand on 2018-06-18. - * Copyright (c) 2018 Jeremy Rand. All rights reserved. - * - */ - - -#include -#include - - -int main(void) -{ - printf("HELLO, WORLD!\n"); - cgetc(); - return 0; -} diff --git a/CurtaSim/make/V2Make.scpt b/CurtaSim/make/V2Make.scpt index 0665efb91ffdd739d5b92e10a59d0b29070cf915..ee520a7c371e3b76bfbc174ea7b9d634571c57d1 100644 GIT binary patch delta 308 zcmaE(x@jTp>pK<{=LGB`7sF_;5MLk2enQwCiIO9od43n0{GFaffRfh0)GlEHw%5y-LtiWma1 zBT%go5IX|ZxG-2uKFOOxl%<;k`Ia*?CQSY*sLxx@kjIe2kk63Fkit+rIa