mirror of
https://github.com/jeremysrand/CurtaSim.git
synced 2024-09-28 04:55:07 +00:00
62 lines
1.6 KiB
C
62 lines
1.6 KiB
C
//
|
|
// Author: Jeremy Rand
|
|
// Date: July 20, 2012
|
|
//
|
|
// This is the interface for the Curta emulator model.
|
|
//
|
|
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
|
|
#ifndef _CURTAMODEL_H
|
|
#define _CURTAMODEL_H
|
|
|
|
#define NUM_OPERAND_DIGITS 11
|
|
#define NUM_RESULT_DIGITS 15
|
|
#define NUM_COUNTER_DIGITS 8
|
|
|
|
typedef int8_t tDigit;
|
|
typedef int8_t tDigitPos;
|
|
|
|
extern tDigit operand[NUM_OPERAND_DIGITS];
|
|
extern tDigit result[NUM_RESULT_DIGITS];
|
|
extern tDigit counter[NUM_COUNTER_DIGITS];
|
|
|
|
#define IS_VALID_OPERAND_POS(pos) (((pos) >= 0) && ((pos) < NUM_OPERAND_DIGITS))
|
|
#define IS_VALID_RESULT_POS(pos) (((pos) >= 0) && ((pos) < NUM_RESULT_DIGITS))
|
|
#define IS_VALID_COUNTER_POS(pos) (((pos) >= 0) && ((pos) < NUM_COUNTER_DIGITS))
|
|
|
|
#define GET_OPERAND_DIGIT(pos) (operand[(pos)])
|
|
#define GET_RESULT_DIGIT(pos) (result[(pos)])
|
|
#define GET_COUNTER_DIGIT(pos) (counter[(pos)])
|
|
|
|
// Ranges from 0 to 8
|
|
#define BASE_POS_MIN 0
|
|
#define BASE_POS_MAX 8
|
|
extern tDigitPos basePos;
|
|
|
|
#define IS_VALID_BASE_POS(pos) (((pos) >= BASE_POS_MIN) && ((pos) < BASE_POS_MAX))
|
|
|
|
extern tDigitPos selectedOperand;
|
|
#define IS_SELECTED_OPERAND(pos) ((pos) == selectedOperand)
|
|
|
|
|
|
typedef void (*tOperandDigitChange)(tDigitPos pos, tDigit oldValue, tDigit newValue);
|
|
typedef void (*tSelectedOperandChange)(tDigitPos pos);
|
|
|
|
extern void clearDevice(void);
|
|
extern void initDevice(tOperandDigitChange callback1, tSelectedOperandChange callback2);
|
|
|
|
extern void incOperandPos(tDigitPos pos);
|
|
extern void decOperandPos(tDigitPos pos);
|
|
|
|
extern void shiftOperandPos(bool left);
|
|
|
|
extern void shiftResultPos(bool left);
|
|
|
|
extern void crank(bool isSubtract);
|
|
|
|
#endif
|