mirror of
https://github.com/byteworksinc/ORCA-C.git
synced 2024-06-15 08:29:27 +00:00
Add C samples.
These are the samples from ORCA/C 2.1.0, converted to LF line endings.
This commit is contained in:
parent
e123339a45
commit
ab975b611c
46
C.Samples/Benchmarks/FIB.cc
Normal file
46
C.Samples/Benchmarks/FIB.cc
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Fibonacci
|
||||||
|
*
|
||||||
|
* Recursively computes Fibonacci numbers to test the speed of
|
||||||
|
* function calls.
|
||||||
|
*
|
||||||
|
* To get the best performance from the desktop development
|
||||||
|
* environment, be sure and turn debugging off from the
|
||||||
|
* Compile Dialog. Use the Compile command from the Run menu
|
||||||
|
* to get the compile dialog.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "FIB"
|
||||||
|
#pragma optimize -1
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define NTIMES 10 /* # iterations */
|
||||||
|
#define NUMBER 23 /* largest Fib # smaller than 32767 */
|
||||||
|
|
||||||
|
|
||||||
|
int Fibonacci(int x)
|
||||||
|
|
||||||
|
{
|
||||||
|
if (x > 2)
|
||||||
|
return Fibonacci(x-1)+Fibonacci(x-2);
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int value;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
printf("%d iterations:\n", NTIMES);
|
||||||
|
for (i = 0; i < NTIMES; ++i)
|
||||||
|
value = Fibonacci(NUMBER);
|
||||||
|
printf("Fibonacci(%d) = %d\n", NUMBER, value);
|
||||||
|
return 0;
|
||||||
|
}
|
51
C.Samples/Benchmarks/Float.cc
Normal file
51
C.Samples/Benchmarks/Float.cc
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Float
|
||||||
|
*
|
||||||
|
* Test simple floating point operations.
|
||||||
|
*
|
||||||
|
* To get the best performance from the desktop development
|
||||||
|
* environment, be sure and turn debugging off from the
|
||||||
|
* Compile Dialog. Use the Compile command from the Run menu
|
||||||
|
* to get the compile dialog.
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Float"
|
||||||
|
#pragma optimize -1
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define const1 3.141597
|
||||||
|
#define const2 1.7839032e4
|
||||||
|
#define count 1000
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
double a,b,c;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
a = const1;
|
||||||
|
b = const2;
|
||||||
|
printf("%d iterations.\n", count);
|
||||||
|
for (i = 0; i < count; ++i) {
|
||||||
|
c = a*b;
|
||||||
|
c = c/a;
|
||||||
|
c = a*b;
|
||||||
|
c = c/a;
|
||||||
|
c = a*b;
|
||||||
|
c = c/a;
|
||||||
|
c = a*b;
|
||||||
|
c = c/a;
|
||||||
|
c = a*b;
|
||||||
|
c = c/a;
|
||||||
|
c = a*b;
|
||||||
|
c = c/a;
|
||||||
|
c = a*b;
|
||||||
|
c = c/a;
|
||||||
|
}
|
||||||
|
printf("Done. C is %e.\n", c);
|
||||||
|
return 0;
|
||||||
|
}
|
114
C.Samples/Benchmarks/Gamm.cc
Normal file
114
C.Samples/Benchmarks/Gamm.cc
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Gamm
|
||||||
|
*
|
||||||
|
* Test the speed of floating point operations in a mix tha
|
||||||
|
* is typical of scientific and engineering applications.
|
||||||
|
*
|
||||||
|
* To get the best performance from the desktop development
|
||||||
|
* environment, be sure and turn debugging off from the
|
||||||
|
* Compile Dialog. Use the Compile command from the Run menu
|
||||||
|
* to get the compile dialog.
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Gamm"
|
||||||
|
#pragma optimize -1
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int five,i,j,n,rep,ten,thirty;
|
||||||
|
float acc,acc1,divn,rn,root,x,y;
|
||||||
|
float a[30], b[30], c[30];
|
||||||
|
|
||||||
|
printf("Start timing 15000 Gamm units\n");
|
||||||
|
n = 50;
|
||||||
|
five = 5;
|
||||||
|
ten = 10;
|
||||||
|
thirty = 30;
|
||||||
|
rn = n;
|
||||||
|
divn = 1.0/rn;
|
||||||
|
x = 0.1;
|
||||||
|
acc = 0.0;
|
||||||
|
|
||||||
|
/* initialize a and b */
|
||||||
|
y = 1.0;
|
||||||
|
for (i = 0; i < thirty; ++i) {
|
||||||
|
a[i] = i+1;
|
||||||
|
b[i] = -y;
|
||||||
|
y = -y;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* one pass thru this loop corresponds to 300 gamm units */
|
||||||
|
for (rep = 0; rep < n; ++rep) {
|
||||||
|
/* first addition/subtraction loop */
|
||||||
|
i = 29;
|
||||||
|
for (j = 0; j < 30; ++j) {
|
||||||
|
c[i] = a[i]+b[i];
|
||||||
|
--i;
|
||||||
|
};
|
||||||
|
/* first polynomial loop */
|
||||||
|
y = 1.0;
|
||||||
|
for (i = 0; i < 10; ++i)
|
||||||
|
y = (y+c[i])*x;
|
||||||
|
acc1 = y*divn;
|
||||||
|
/* first maximum element loop */
|
||||||
|
y = c[10];
|
||||||
|
for (i = 10; i < 20; ++i)
|
||||||
|
if (c[i] > y)
|
||||||
|
y = c[i];
|
||||||
|
/* first square root loop */
|
||||||
|
root = 1.0;
|
||||||
|
for (i = 0; i < 5; ++i)
|
||||||
|
root = 0.5*(root+y/root);
|
||||||
|
acc1 = acc1+root*divn;
|
||||||
|
/* second addition/subtraction loop */
|
||||||
|
for (i = 0; i < 30; ++i)
|
||||||
|
a[i] = c[i]-b[i];
|
||||||
|
/* second polynomial loop */
|
||||||
|
y = 0.0;
|
||||||
|
for (i = 0; i < 10; ++i)
|
||||||
|
y = (y+a[i])*x;
|
||||||
|
/* second square root loop */
|
||||||
|
root = 1.0;
|
||||||
|
for (i = 1; i < 5; ++i)
|
||||||
|
root = 0.5*(root+y/root);
|
||||||
|
acc1 = acc1+root*divn;
|
||||||
|
/* first multiplication loop */
|
||||||
|
for (i = 0; i < thirty; ++i)
|
||||||
|
c[i] = c[i]*b[i];
|
||||||
|
/* second maximum element loop */
|
||||||
|
y = c[19];
|
||||||
|
for (i = 20; i < thirty; ++i)
|
||||||
|
if (c[i] > y)
|
||||||
|
y = c[i];
|
||||||
|
/* third square root loop */
|
||||||
|
root = 1.0;
|
||||||
|
for (i = 0; i < 5; ++i)
|
||||||
|
root = 0.5*(root+y/root);
|
||||||
|
acc1 = acc1+root*divn;
|
||||||
|
/* third polynomial loop */
|
||||||
|
y = 0.0;
|
||||||
|
for (i = 0; i < 10; ++i)
|
||||||
|
y = (y+c[i])*x;
|
||||||
|
acc1 = acc1+y*divn;
|
||||||
|
/* third maximum element loop */
|
||||||
|
y = c[0];
|
||||||
|
for (i = 1; i < 10; ++i);
|
||||||
|
if (c[i] > y)
|
||||||
|
y = c[i];
|
||||||
|
/* fourth square root loop */
|
||||||
|
root = 1.0;
|
||||||
|
for (i = 0; i < 5; ++i)
|
||||||
|
root = 0.5*(root+y/root);
|
||||||
|
acc1 = acc1+root*divn;
|
||||||
|
acc = acc+acc1;
|
||||||
|
}
|
||||||
|
printf("%12d %12.7e %12.7e\n", n, acc, acc1);
|
||||||
|
return 0;
|
||||||
|
}
|
56
C.Samples/Benchmarks/IMath.cc
Normal file
56
C.Samples/Benchmarks/IMath.cc
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Integer Math
|
||||||
|
*
|
||||||
|
* Test the speed of the four basic integer math operations.
|
||||||
|
*
|
||||||
|
* To get the best performance from the desktop development
|
||||||
|
* environment, be sure and turn debugging off from the
|
||||||
|
* Compile Dialog. Use the Compile command from the Run menu
|
||||||
|
* to get the compile dialog.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "IMath"
|
||||||
|
#pragma optimize -1
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define ITER 10000
|
||||||
|
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int a,b,c,d,e,f;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
printf("Start timing...\n");
|
||||||
|
b = 1000;
|
||||||
|
c = 10;
|
||||||
|
d = 100;
|
||||||
|
e = 5;
|
||||||
|
f = 10;
|
||||||
|
for (i = 0; i < ITER; ++i) {
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
a = b+c-d*e/f;
|
||||||
|
}
|
||||||
|
if (a == 960) {
|
||||||
|
printf("Stop timing - correct result.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("INCORRECT RESULT.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
50
C.Samples/Benchmarks/Prime.cc
Normal file
50
C.Samples/Benchmarks/Prime.cc
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* This is probably the most famous benchmark in use today.
|
||||||
|
* It tests the speed that a compiler can do logic and looping
|
||||||
|
* operations. While there are things that you can do to make
|
||||||
|
* this benchmark run faster under ORCA/C, we have not
|
||||||
|
* doctored it in any way - this is the original benchmark
|
||||||
|
* in its original form.
|
||||||
|
*
|
||||||
|
* To get the best performance from the desktop development
|
||||||
|
* environment, be sure and turn debugging off from the
|
||||||
|
* Compile Dialog. Use the Compile command from the Run menu
|
||||||
|
* to get the compile dialog.
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Prime"
|
||||||
|
#pragma optimize -1
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define true 1
|
||||||
|
#define false 0
|
||||||
|
#define size 8190
|
||||||
|
|
||||||
|
char flags[size+1];
|
||||||
|
|
||||||
|
void main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i,prime,k,count,iter;
|
||||||
|
|
||||||
|
printf("10 iterations\n");
|
||||||
|
for (iter = 1; iter <= 10; iter++) {
|
||||||
|
count = 0;
|
||||||
|
for (i = 0; i <= size; i++)
|
||||||
|
flags[i] = true;
|
||||||
|
for (i = 0; i <= size; i++) {
|
||||||
|
if (flags[i]) {
|
||||||
|
prime = i+i+3;
|
||||||
|
/* printf("\n%d", prime); */
|
||||||
|
for (k = i+prime; k <= size; k += prime)
|
||||||
|
flags[k] = false;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n%d primes.", count);
|
||||||
|
}
|
96
C.Samples/Benchmarks/Quick.cc
Normal file
96
C.Samples/Benchmarks/Quick.cc
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* QuickSort
|
||||||
|
*
|
||||||
|
* Creates an array of long integers, then sorts the array.
|
||||||
|
*
|
||||||
|
* To get the best performance from the desktop development
|
||||||
|
* environment, be sure and turn debugging off from the
|
||||||
|
* Compile Dialog. Use the Compile command from the Run menu
|
||||||
|
* to get the compile dialog.
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Quick"
|
||||||
|
#pragma optimize -1
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define maxNum 999 /* size of array to sort - 1 */
|
||||||
|
#define count 10 /* # of iterations */
|
||||||
|
#define modulus 0x00020000 /* for random number generator */
|
||||||
|
#define c 13849
|
||||||
|
#define a 25173
|
||||||
|
|
||||||
|
typedef long arrayType[maxNum];
|
||||||
|
|
||||||
|
arrayType buffer; /* array to sort */
|
||||||
|
long seed; /* seed for random number generator */
|
||||||
|
|
||||||
|
|
||||||
|
void Quick (int lo, int hi, arrayType base)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
long pivot,temp;
|
||||||
|
|
||||||
|
if (hi > lo) {
|
||||||
|
pivot = base[hi];
|
||||||
|
i = lo-1;
|
||||||
|
j = hi;
|
||||||
|
do {
|
||||||
|
do ++i; while ((base[i] < pivot) && (j > i));
|
||||||
|
if (j > i)
|
||||||
|
do --j; while ((base[j] > pivot) && (j > i));
|
||||||
|
temp = base[i];
|
||||||
|
base[i] = base[j];
|
||||||
|
base[j] = temp;
|
||||||
|
}
|
||||||
|
while (j > i);
|
||||||
|
base[j] = base[i];
|
||||||
|
base[i] = base[hi];
|
||||||
|
base[hi] = temp;
|
||||||
|
Quick(lo, i-1, base);
|
||||||
|
Quick(i+1, hi, base);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
long Random (long size)
|
||||||
|
|
||||||
|
{
|
||||||
|
seed = seed*a+c;
|
||||||
|
return seed % size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i,j; /* loop variables */
|
||||||
|
int pass; /* for checking the array */
|
||||||
|
|
||||||
|
seed = 7;
|
||||||
|
printf("Filling array and sorting %d times.\n", count);
|
||||||
|
for (i = 0; i < count; ++i) {
|
||||||
|
for (j = 0; j < maxNum; ++j)
|
||||||
|
buffer[j] = labs(Random(modulus));
|
||||||
|
Quick(0, maxNum-1, buffer);
|
||||||
|
}
|
||||||
|
printf("Done.\n");
|
||||||
|
|
||||||
|
pass = 1;
|
||||||
|
for (i = 0; i < maxNum-1; ++i)
|
||||||
|
if (buffer[i] > buffer[i+1])
|
||||||
|
pass = 0;
|
||||||
|
if (pass) {
|
||||||
|
printf("The last array is sorted properly.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("The last array is NOT sorted properly!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
35
C.Samples/Benchmarks/Savage.cc
Normal file
35
C.Samples/Benchmarks/Savage.cc
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Savage
|
||||||
|
*
|
||||||
|
* Test the speed (and stability) of floating point functions.
|
||||||
|
*
|
||||||
|
* To get the best performance from the desktop development
|
||||||
|
* environment, be sure and turn debugging off from the
|
||||||
|
* Compile Dialog. Use the Compile command from the Run menu
|
||||||
|
* to get the compile dialog.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Savage"
|
||||||
|
#pragma optimize -1
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#define loop 250
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
double sum;
|
||||||
|
|
||||||
|
printf("Start...\n");
|
||||||
|
sum = 1.0;
|
||||||
|
for (i = 1; i < loop; ++i)
|
||||||
|
sum = tan(atan(exp(log(sqrt(sum*sum)))))+1.0;
|
||||||
|
printf("sum = %e", sum);
|
||||||
|
return 0;
|
||||||
|
}
|
288
C.Samples/CDA.Samples/Calendar.cc
Normal file
288
C.Samples/CDA.Samples/Calendar.cc
Normal file
|
@ -0,0 +1,288 @@
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Calendar
|
||||||
|
*
|
||||||
|
* This classic desk accessory shows the calendar for the
|
||||||
|
* current date. The arrow keys can be used to see calendars
|
||||||
|
* for previous or future months.
|
||||||
|
*
|
||||||
|
* Commands (each is a single keystroke)
|
||||||
|
*
|
||||||
|
* up-arrow Look at the same month in the previous
|
||||||
|
* year.
|
||||||
|
* down-arrow Look at the same month in the next
|
||||||
|
* year.
|
||||||
|
* left-arrow Look at the previous month.
|
||||||
|
* right-arrow Look at the next month.
|
||||||
|
* ? or / Display help screen.
|
||||||
|
* ESC Return to CDA main menu.
|
||||||
|
*
|
||||||
|
* Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1987-1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Calendar"
|
||||||
|
#pragma cda "Calendar" Start ShutDown
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <misctool.h>
|
||||||
|
|
||||||
|
#define LEFT_ARROW 0x08 /* key codes for legal commands */
|
||||||
|
#define DOWN_ARROW 0x0A
|
||||||
|
#define UP_ARROW 0x0B
|
||||||
|
#define RIGHT_ARROW 0x15
|
||||||
|
#define ESC 0x1B
|
||||||
|
#define SLASH '/'
|
||||||
|
#define QUESTION '?'
|
||||||
|
|
||||||
|
int ch; /* ord of last character read */
|
||||||
|
int month, year; /* current month and year */
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Factor: Computes the 'factor' for the first day of the
|
||||||
|
* month. The factor is the number of days since
|
||||||
|
* 31 Dec 0000.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
long Factor (long year, long month)
|
||||||
|
|
||||||
|
{
|
||||||
|
if (month < 2)
|
||||||
|
return 365 * year + 1 + 31 * month + (year - 1) / 4 -
|
||||||
|
((year - 1) / 100 + 1) * 3 / 4;
|
||||||
|
return 365 * year + 1 + 31 * month - ((month + 1) * 4 + 23) / 10 +
|
||||||
|
year / 4 - (year / 100 + 1) * 3 / 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* GetKey: Returns the ordinal value of the next key typed
|
||||||
|
* by the user.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
int GetKey (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
char ch, *cp;
|
||||||
|
|
||||||
|
cp = (char *) 0x00C000; /* wait for keypress */
|
||||||
|
while ((*cp & 0x80) == 0) ;
|
||||||
|
ch = *cp; /* save the key */
|
||||||
|
cp = (char *) 0x00C010; /* clear the strobe */
|
||||||
|
*cp = 0;
|
||||||
|
return ch & 0x7F; /* return the key read */
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* GetThisMonth: Reads the clock to obtain today's month
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void GetThisMonth (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
time_t lt; /* encoded time */
|
||||||
|
struct tm *ct; /* current time */
|
||||||
|
|
||||||
|
lt = time(NULL); /* get the coded time */
|
||||||
|
ct = gmtime(<); /* convert to a decoded time */
|
||||||
|
year = ct->tm_year + 1900; /* set the month/year */
|
||||||
|
month = ct->tm_mon;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* GotoXY: Positions the cursor
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void GotoXY (int x, int y)
|
||||||
|
|
||||||
|
{
|
||||||
|
putchar(0x1E);
|
||||||
|
putchar(0x20 + x);
|
||||||
|
putchar(0x20 + y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* PrintCalendar: Prints the calendar for the current
|
||||||
|
* and year.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void PrintCalendar (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
#define TAB 26 /* disp of calendar from left edge */
|
||||||
|
#define VTAB 5 /* disp of calendar from top */
|
||||||
|
|
||||||
|
int startDay, /* day of week for 1st day in month */
|
||||||
|
numDays, /* # days in the month */
|
||||||
|
nextMonth, nextYear, /* work variables */
|
||||||
|
i, /* loop variable */
|
||||||
|
vt, /* line # for next line of days */
|
||||||
|
pos; /* day position for next date */
|
||||||
|
|
||||||
|
/* Compute day of week for 1st day in month */
|
||||||
|
startDay = (int) ((Factor (year, month) - 1) % 7);
|
||||||
|
nextMonth = month+1; /* compute # days in month */
|
||||||
|
if (nextMonth == 12) {
|
||||||
|
nextMonth = 0;
|
||||||
|
nextYear = year+1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nextYear = year;
|
||||||
|
numDays = (int) (Factor (nextYear, nextMonth) - Factor (year, month));
|
||||||
|
|
||||||
|
putchar(12); /* clear the screen */
|
||||||
|
GotoXY(TAB+7, VTAB); /* position cursor */
|
||||||
|
switch (month) { /* write the month */
|
||||||
|
case 0: printf(" January "); break;
|
||||||
|
case 1: printf("February "); break;
|
||||||
|
case 2: printf(" March "); break;
|
||||||
|
case 3: printf(" April "); break;
|
||||||
|
case 4: printf(" May "); break;
|
||||||
|
case 5: printf(" June "); break;
|
||||||
|
case 6: printf(" July "); break;
|
||||||
|
case 7: printf(" August "); break;
|
||||||
|
case 8: printf("September "); break;
|
||||||
|
case 9: printf(" October "); break;
|
||||||
|
case 10: printf("November "); break;
|
||||||
|
case 11: printf("December ");
|
||||||
|
}
|
||||||
|
printf("%d", year); /* write the year */
|
||||||
|
GotoXY(TAB, VTAB+2); /* write the day header line */
|
||||||
|
printf("Sun Mon Tue Wed Thu Fri Sat");
|
||||||
|
vt = VTAB+4; /* set current date line */
|
||||||
|
pos = 0; /* set day position */
|
||||||
|
GotoXY(TAB-1, vt); /* position cursor for 1st line */
|
||||||
|
for (i = 1; i <= startDay; i++) { /* skip over blank days */
|
||||||
|
pos++;
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write the dates */
|
||||||
|
for (i = 1; i <= numDays; i++) {
|
||||||
|
printf("%4d", i);
|
||||||
|
pos++;
|
||||||
|
if (pos == 7) {
|
||||||
|
pos = 0;
|
||||||
|
vt += 2;
|
||||||
|
GotoXY(TAB-1, vt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GotoXY(25, 23); /* write instructions */
|
||||||
|
printf("Hit ? for help, or ESC to quit");
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* PrintHelp: Print the help screen.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void PrintHelp (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int ch; /* dummy variable for reading keyboard */
|
||||||
|
|
||||||
|
putchar(0x0C); /* clear screen */
|
||||||
|
printf( "This program recognizes the following single-keystroke commands:"
|
||||||
|
"\n\n"
|
||||||
|
" key action\n"
|
||||||
|
" --- ------\n"
|
||||||
|
" up-arrow Show the current month in the previous year.\n"
|
||||||
|
" down-arrow Show the current month in the next year.\n"
|
||||||
|
" left-arrow Show the previous month.\n"
|
||||||
|
" right-arrow Show the next month.\n"
|
||||||
|
" ESC exit the program.");
|
||||||
|
|
||||||
|
GotoXY(0, 23);
|
||||||
|
printf("Hit any key to return to the program.");
|
||||||
|
ch = GetKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************
|
||||||
|
*
|
||||||
|
* Start: Body of calendar program
|
||||||
|
*
|
||||||
|
**************************************************************/
|
||||||
|
|
||||||
|
void Start(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
putchar('\006'); /* turn the cursor off */
|
||||||
|
GetThisMonth(); /* find out what month it is */
|
||||||
|
PrintCalendar(); /* print the calendar for this month */
|
||||||
|
do {
|
||||||
|
ch = GetKey(); /* get a command */
|
||||||
|
switch (ch) {
|
||||||
|
case LEFT_ARROW: {
|
||||||
|
month--;
|
||||||
|
if (month < 0) {
|
||||||
|
month = 11;
|
||||||
|
year--;
|
||||||
|
}
|
||||||
|
PrintCalendar();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case RIGHT_ARROW: {
|
||||||
|
month++;
|
||||||
|
if (month > 11) {
|
||||||
|
month = 0;
|
||||||
|
year++;
|
||||||
|
}
|
||||||
|
PrintCalendar();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case UP_ARROW: {
|
||||||
|
year--;
|
||||||
|
PrintCalendar();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DOWN_ARROW: {
|
||||||
|
year++;
|
||||||
|
PrintCalendar();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case QUESTION:
|
||||||
|
case SLASH: {
|
||||||
|
PrintHelp();
|
||||||
|
PrintCalendar();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case ESC: return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
SysBeep();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************
|
||||||
|
*
|
||||||
|
* ShutDown: Does nothing
|
||||||
|
*
|
||||||
|
*************************************************************/
|
||||||
|
|
||||||
|
void ShutDown(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
}
|
44
C.Samples/CDA.Samples/Echo.cc
Normal file
44
C.Samples/CDA.Samples/Echo.cc
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Echo
|
||||||
|
*
|
||||||
|
* This is about the simplest a classic desk accessory can be,
|
||||||
|
* providing a quick framework for developing your own. It
|
||||||
|
* simply reads strings typed from the keyboard and echos
|
||||||
|
* them back to the screen.
|
||||||
|
*
|
||||||
|
* Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Echo"
|
||||||
|
#pragma cda "Echo from C" Start ShutDown
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
char str[256];
|
||||||
|
|
||||||
|
|
||||||
|
void Start(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
printf("This program echoes the strings you type from the keyboard. To\n");
|
||||||
|
printf("quit, hit the RETURN key at the beginning of a line.\n\n");
|
||||||
|
|
||||||
|
do {
|
||||||
|
fgets(str, 256, stdin); /* read a string */
|
||||||
|
printf("%s\n", str); /* write the same string */
|
||||||
|
}
|
||||||
|
while (strlen(str) > 1); /* quit if the string is empty */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ShutDown(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
}
|
71
C.Samples/CDev.Samples/WorldCDev.cc
Normal file
71
C.Samples/CDev.Samples/WorldCDev.cc
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/****************************************************************/
|
||||||
|
/* */
|
||||||
|
/* Hello World CDev */
|
||||||
|
/* */
|
||||||
|
/* Mike Westerfield */
|
||||||
|
/* October 1991 */
|
||||||
|
/* */
|
||||||
|
/* Copyright 1991 */
|
||||||
|
/* Byte Works, Inc. */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* */
|
||||||
|
/****************************************************************/
|
||||||
|
/* */
|
||||||
|
/* This CDev displays a text message. It can be used as a */
|
||||||
|
/* framework for developing your own CDevs. */
|
||||||
|
/* */
|
||||||
|
/* For detailed information about CDevs, see Apple II File */
|
||||||
|
/* Type Notes for file type $D8. Apple II File Type Notes */
|
||||||
|
/* are available from major online services, large users */
|
||||||
|
/* groups, or from APDA. */
|
||||||
|
/* */
|
||||||
|
/****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "worldobj"
|
||||||
|
#pragma cdev Driver
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
#include <control.h>
|
||||||
|
#include <quickdraw.h>
|
||||||
|
|
||||||
|
|
||||||
|
GrafPortPtr wPtr; /* our window pointer */
|
||||||
|
|
||||||
|
|
||||||
|
/* DoAbout - Show the help info */
|
||||||
|
|
||||||
|
void DoAbout (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
NewControl2(wPtr, 0x0009, 257L); /* draw the text (it's a stattext control) */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* DoCreate - Create the controls */
|
||||||
|
|
||||||
|
void DoCreate (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
NewControl2(wPtr, 0x0009, 256L); /* create the controls */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Driver - main entry point */
|
||||||
|
|
||||||
|
long Driver (long data2, long data1, int message)
|
||||||
|
|
||||||
|
#define createCDev 7 /* message numbers */
|
||||||
|
#define aboutCDev 8
|
||||||
|
|
||||||
|
{
|
||||||
|
wPtr = (void *) data1; /* get our window pointer (most calls) */
|
||||||
|
switch (message) {
|
||||||
|
case createCDev: DoCreate();
|
||||||
|
break;
|
||||||
|
case aboutCDev: DoAbout();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
3
C.Samples/CDev.Samples/WorldCDev.make
Normal file
3
C.Samples/CDev.Samples/WorldCDev.make
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
cmpl +t +e -x worldcdev.cc
|
||||||
|
compile +t +e worldcdev.rez keep=WorldCDev
|
||||||
|
filetype WorldCDev $C7
|
110
C.Samples/CDev.Samples/WorldCDev.rez
Normal file
110
C.Samples/CDev.Samples/WorldCDev.rez
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
#include "types.rez"
|
||||||
|
|
||||||
|
/* This is the required resource to tell the control panel about the CDev */
|
||||||
|
resource rCDEVFlags (0x1) {
|
||||||
|
0x00C0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
{0, 0, 110, 200},
|
||||||
|
"Hello World",
|
||||||
|
"Mike Westerfield",
|
||||||
|
"1.0"
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Code resource; the executable part of the CDev */
|
||||||
|
read rCDevCode (0x1,convert) "worldobj";
|
||||||
|
|
||||||
|
/* This is the icon displayed by the control panel */
|
||||||
|
resource rIcon (0x1) {
|
||||||
|
0x8000, /* color icon */
|
||||||
|
20, /* height in pixels */
|
||||||
|
28, /* width in pixels */
|
||||||
|
$"FFFFFFFFFFF1111111FFFFFFFFFF"
|
||||||
|
$"FFFFFFFF111111111111FFFFFFFF"
|
||||||
|
$"FFFFFF1111118881111881FFFFFF"
|
||||||
|
$"FFFFF111888888888818811FFFFF"
|
||||||
|
$"FFFF11118888888888118111FFFF"
|
||||||
|
$"FFF1111111888888811111111FFF"
|
||||||
|
$"FFF1111111888888111111111FFF"
|
||||||
|
$"FF111111111881181111111111FF"
|
||||||
|
$"FF111111111181111111111111FF"
|
||||||
|
$"FF111111111181111111111111FF"
|
||||||
|
$"FF111111118888881111111111FF"
|
||||||
|
$"FF111111118888888111111111FF"
|
||||||
|
$"FFF1111111888888811111111FFF"
|
||||||
|
$"FFF1111111188888111111111FFF"
|
||||||
|
$"FFFF11111111888811111111FFFF"
|
||||||
|
$"FFFFF111111118811111111FFFFF"
|
||||||
|
$"FFFFFF1111111181111111FFFFFF"
|
||||||
|
$"FFFFFFFF111111111111FFFFFFFF"
|
||||||
|
$"FFFFFFFFFF11111111FFFFFFFFFF"
|
||||||
|
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFF",
|
||||||
|
|
||||||
|
$"00000000000FFFFFFF0000000000"
|
||||||
|
$"00000000FFFFFFFFFFFF00000000"
|
||||||
|
$"000000FFFFFFFFFFFFFFFF000000"
|
||||||
|
$"00000FFFFFFFFFFFFFFFFFF00000"
|
||||||
|
$"0000FFFFFFFFFFFFFFFFFFFF0000"
|
||||||
|
$"000FFFFFFFFFFFFFFFFFFFFFF000"
|
||||||
|
$"000FFFFFFFFFFFFFFFFFFFFFF000"
|
||||||
|
$"00FFFFFFFFFFFFFFFFFFFFFFFF00"
|
||||||
|
$"00FFFFFFFFFFFFFFFFFFFFFFFF00"
|
||||||
|
$"00FFFFFFFFFFFFFFFFFFFFFFFF00"
|
||||||
|
$"00FFFFFFFFFFFFFFFFFFFFFFFF00"
|
||||||
|
$"00FFFFFFFFFFFFFFFFFFFFFFFF00"
|
||||||
|
$"000FFFFFFFFFFFFFFFFFFFFFF000"
|
||||||
|
$"000FFFFFFFFFFFFFFFFFFFFFF000"
|
||||||
|
$"0000FFFFFFFFFFFFFFFFFFFF0000"
|
||||||
|
$"00000FFFFFFFFFFFFFFFFFF00000"
|
||||||
|
$"000000FFFFFFFFFFFFFFFF000000"
|
||||||
|
$"00000000FFFFFFFFFFFF00000000"
|
||||||
|
$"0000000000FFFFFFFF0000000000"
|
||||||
|
$"0000000000000000000000000000"
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The following resources define the various controls in the main display */
|
||||||
|
resource rControlList (256) {
|
||||||
|
{
|
||||||
|
256,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
resource rControlTemplate (256) {
|
||||||
|
0x00000001, /* control id */
|
||||||
|
{38,5,49,205}, /* control rectangle */
|
||||||
|
statTextControl {{ /* control type */
|
||||||
|
0x0000, /* flags */
|
||||||
|
0x1002, /* more flags */
|
||||||
|
0, /* ref con */
|
||||||
|
256, /* text reference */
|
||||||
|
13 /* text length */
|
||||||
|
}};
|
||||||
|
};
|
||||||
|
resource rTextForLETextBox2 (256) {
|
||||||
|
"Hello, world."
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The following resources define the controls for the help screen */
|
||||||
|
resource rControlList (257) {
|
||||||
|
{
|
||||||
|
257,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
resource rControlTemplate (257) {
|
||||||
|
0x00000002, /* control id */
|
||||||
|
{38,5,49,205}, /* control rectangle */
|
||||||
|
statTextControl {{ /* control type */
|
||||||
|
0x0000, /* flags */
|
||||||
|
0x1002, /* more flags */
|
||||||
|
0, /* ref con */
|
||||||
|
257, /* text reference */
|
||||||
|
19 /* text length */
|
||||||
|
}};
|
||||||
|
};
|
||||||
|
resource rTextForLETextBox2 (257) {
|
||||||
|
"Put help info here."
|
||||||
|
};
|
||||||
|
|
163
C.Samples/Desktop.Samples/Clock.cc
Normal file
163
C.Samples/Desktop.Samples/Clock.cc
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
/**************************************************************
|
||||||
|
*
|
||||||
|
* This desk accessory brings up a simple clock. It can be
|
||||||
|
* used as an outline when creating more complex desk accessories.
|
||||||
|
*
|
||||||
|
* Original Pascal version by Phil Montoya
|
||||||
|
* C Translation by Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1987,1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
**************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Clock"
|
||||||
|
#pragma nda Open Close Action Init 60 0xFFFF "--Clock\\H**"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include <quickdraw.h>
|
||||||
|
#include <misctool.h>
|
||||||
|
#include <event.h>
|
||||||
|
#include <desk.h>
|
||||||
|
#include <window.h>
|
||||||
|
|
||||||
|
#define TRUE 1 /* boolean constants */
|
||||||
|
#define FALSE 0
|
||||||
|
|
||||||
|
int clockActive = 0; /* are we already active flag */
|
||||||
|
GrafPortPtr clockWinPtr; /* window pointer */
|
||||||
|
|
||||||
|
char title[] = "\pClock"; /* window title */
|
||||||
|
ParamList clockWin = { /* new window record */
|
||||||
|
78, /* paramLength */
|
||||||
|
0xC0A0, /* wFrameBits */
|
||||||
|
title, /* wTitle */
|
||||||
|
0L, /* wRefCon */
|
||||||
|
{0,0,0,0}, /* wZoom */
|
||||||
|
NULL, /* wColor */
|
||||||
|
0,0, /* wYOrigin,wXOrigin */
|
||||||
|
0,0, /* wDataH,wDataW */
|
||||||
|
0,0, /* wMaxH,wMaxW */
|
||||||
|
0,0, /* wScrollVer,wScrollHor */
|
||||||
|
0,0, /* wPageVer,wPageHor */
|
||||||
|
0, /* wInfoRefCon */
|
||||||
|
0, /* wInfoHeight */
|
||||||
|
NULL, /* wFrameDefProc */
|
||||||
|
NULL, /* wInfoDefProc */
|
||||||
|
NULL, /* wContDefProc */
|
||||||
|
{50,50,62,200}, /* wPosition */
|
||||||
|
(void *) -1L, /* wPlane */
|
||||||
|
NULL /* wStorage */
|
||||||
|
};
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* DrawTime - Reads the time and draws it in the window
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
void DrawTime (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i; /* index variable */
|
||||||
|
char timeString[21]; /* string to hold time */
|
||||||
|
|
||||||
|
ReadAsciiTime(timeString);
|
||||||
|
timeString[20] = 0;
|
||||||
|
for (i = 0; i < 20; i++)
|
||||||
|
timeString[i] &= 0x7F;
|
||||||
|
MoveTo(7, 10);
|
||||||
|
DrawCString(timeString);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Open - opens the desk accessory if it is not already active
|
||||||
|
*
|
||||||
|
* Outputs:
|
||||||
|
* GrafPortPtr - pointer to desk accessory window
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
GrafPortPtr Open (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
if (!clockActive) {
|
||||||
|
clockWinPtr = NewWindow(&clockWin); /* open a window */
|
||||||
|
SetSysWindow(clockWinPtr); /* set it to the system window */
|
||||||
|
clockActive = TRUE; /* we are now active */
|
||||||
|
return clockWinPtr; /* return our window pointer */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Close - closes the desk accessory if it is active
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
void Close(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
if (clockActive) {
|
||||||
|
CloseWindow(clockWinPtr);
|
||||||
|
clockActive = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Action - Handle an action call
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
void Action (long param, int code)
|
||||||
|
|
||||||
|
{
|
||||||
|
EventRecordPtr evPtr;
|
||||||
|
GrafPortPtr currPort;
|
||||||
|
|
||||||
|
switch (code) {
|
||||||
|
|
||||||
|
case eventAction: {
|
||||||
|
evPtr = (EventRecordPtr) param;
|
||||||
|
if (evPtr->what == updateEvt) {
|
||||||
|
BeginUpdate(clockWinPtr);
|
||||||
|
DrawTime();
|
||||||
|
EndUpdate(clockWinPtr);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case runAction: {
|
||||||
|
currPort = GetPort();
|
||||||
|
SetPort(clockWinPtr);
|
||||||
|
DrawTime();
|
||||||
|
SetPort(currPort);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Initialization
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
void Init(int code)
|
||||||
|
|
||||||
|
{
|
||||||
|
if (code == 0) {
|
||||||
|
if (clockActive)
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
clockActive = FALSE;
|
||||||
|
}
|
199
C.Samples/Desktop.Samples/Frame.cc
Normal file
199
C.Samples/Desktop.Samples/Frame.cc
Normal file
|
@ -0,0 +1,199 @@
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Frame
|
||||||
|
*
|
||||||
|
* This desktop program is about as simple as they get. It
|
||||||
|
* brings up the Apple menu, a file menu with Quit and Close,
|
||||||
|
* and an edit menu with Undo, Cut, Copy, Paste and Clear.
|
||||||
|
* This is the minimum configuration for supporting desk
|
||||||
|
* accessories. (All of these menus have pre-assigned numbers,
|
||||||
|
* assigned by Apple.)
|
||||||
|
*
|
||||||
|
* The purpose of this rather simple program is to show how
|
||||||
|
* easy a desktop program can be to write, and to give you a
|
||||||
|
* framework to use in developing your own programs.
|
||||||
|
*
|
||||||
|
* Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Frame"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <orca.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
#include <quickdraw.h>
|
||||||
|
#include <misctool.h>
|
||||||
|
#include <event.h>
|
||||||
|
#include <control.h>
|
||||||
|
#include <window.h>
|
||||||
|
#include <menu.h>
|
||||||
|
#include <desk.h>
|
||||||
|
#include <lineedit.h>
|
||||||
|
#include <dialog.h>
|
||||||
|
|
||||||
|
#define apple_About 257 /* Menu ID numbers */
|
||||||
|
#define file_Quit 256
|
||||||
|
|
||||||
|
enum alertKind {norml, stop, note, caution}; /* kinds of alerts */
|
||||||
|
|
||||||
|
typedef int BOOL; /* simulate boolean types */
|
||||||
|
BOOL done; /* tells if the program should stop */
|
||||||
|
WmTaskRec lastEvent; /* last event returned in event loop */
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* DoAlert - Create an alert box
|
||||||
|
*
|
||||||
|
* Input:
|
||||||
|
* kind - kind of alert
|
||||||
|
* msg - alert message
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void DoAlert (enum alertKind kind, char *msg)
|
||||||
|
|
||||||
|
{
|
||||||
|
static ItemTemplate button = /* button item */
|
||||||
|
{ 1, 36, 15, 0, 0, buttonItem, "\pOK", 0, 0, NULL };
|
||||||
|
|
||||||
|
static ItemTemplate message = /* message item */
|
||||||
|
{ 100, 5, 100, 90, 280, itemDisable+statText, NULL, 0, 0, NULL };
|
||||||
|
|
||||||
|
static AlertTemplate alertRec = /* alert box */
|
||||||
|
{ 50, 180, 107, 460, 2, 0x80, 0x80, 0x80, 0x80, NULL, NULL, NULL };
|
||||||
|
|
||||||
|
|
||||||
|
SetForeColor (0); /* set text colors */
|
||||||
|
SetBackColor (15);
|
||||||
|
|
||||||
|
message.itemDescr = msg; /* init. non-constant */
|
||||||
|
alertRec.atItemList [0] = (ItemTempPtr) &button; /* template fields */
|
||||||
|
alertRec.atItemList [1] = (ItemTempPtr) &message;
|
||||||
|
|
||||||
|
switch (kind) {
|
||||||
|
case norml: Alert (&alertRec, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case stop: StopAlert (&alertRec, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case note: NoteAlert (&alertRec, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case caution: CautionAlert (&alertRec, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: printf ("Error in DoAlert\n");
|
||||||
|
exit (-1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* MenuAbout - Create the About menu
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void MenuAbout (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
DoAlert (note, "\pFrame 1.0\r"
|
||||||
|
"Copyright 1989\r"
|
||||||
|
"Byte Works, Inc.\r\r"
|
||||||
|
"By Mike Westerfield");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* HandleMenu - Handle a menu selection
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void HandleMenu (int menuNum)
|
||||||
|
|
||||||
|
{
|
||||||
|
switch (menuNum) {
|
||||||
|
case apple_About: MenuAbout ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case file_Quit: done = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
HiliteMenu (FALSE, (int) (lastEvent.wmTaskData >> 16));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* InitMenus - Initialize the menu bar
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void InitMenus (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
InsertMenu (NewMenu (">> Edit \\N3\r" /* create the edit menu */
|
||||||
|
"--Undo\\N250V*Zz\r"
|
||||||
|
"--Cut\\N251*Xx\r"
|
||||||
|
"--Copy\\N252*Cc\r"
|
||||||
|
"--Paste\\N253*Vv\r"
|
||||||
|
"--Clear\\N254\r"
|
||||||
|
".\r"), 0);
|
||||||
|
|
||||||
|
InsertMenu (NewMenu (">> File \\N2\r" /* create the file menu */
|
||||||
|
"--Close\\N255V\r"
|
||||||
|
"--Quit\\N256*Qq\r"
|
||||||
|
".\r"), 0);
|
||||||
|
|
||||||
|
InsertMenu (NewMenu (">>@\\XN1\r" /* create the Apple menu */
|
||||||
|
"--About Frame\\N257V\r"
|
||||||
|
".\r"), 0);
|
||||||
|
|
||||||
|
FixAppleMenu (1); /* add desk accessories */
|
||||||
|
FixMenuBar (); /* draw the completed menu bar */
|
||||||
|
DrawMenuBar ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Main Program
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int event; /* event # returned by TaskMaster */
|
||||||
|
|
||||||
|
startdesk (640);
|
||||||
|
InitMenus (); /* set up the menu bar */
|
||||||
|
lastEvent.wmTaskMask = 0x1FFFL; /* let Task Master do most stuff */
|
||||||
|
ShowCursor (); /* show the cursor */
|
||||||
|
|
||||||
|
done = FALSE; /* main event loop */
|
||||||
|
do {
|
||||||
|
event = TaskMaster (0x076E, &lastEvent);
|
||||||
|
switch (event) { /* handle the events we need to */
|
||||||
|
case wInSpecial:
|
||||||
|
case wInMenuBar: HandleMenu ((int) lastEvent.wmTaskData);
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (!done);
|
||||||
|
enddesk ();
|
||||||
|
}
|
374
C.Samples/Desktop.Samples/MiniCAD.cc
Normal file
374
C.Samples/Desktop.Samples/MiniCAD.cc
Normal file
|
@ -0,0 +1,374 @@
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* MiniCAD
|
||||||
|
*
|
||||||
|
* MiniCAD is a (very) simple CAD program based on the Frame
|
||||||
|
* program. With MiniCAD, you can open new windows, close
|
||||||
|
* windows that are on the desktop, and draw lines using the
|
||||||
|
* mouse. Multiple windows are supported.
|
||||||
|
*
|
||||||
|
* Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "MiniCAD"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <orca.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
#include <quickdraw.h>
|
||||||
|
#include <misctool.h>
|
||||||
|
#include <event.h>
|
||||||
|
#include <control.h>
|
||||||
|
#include <window.h>
|
||||||
|
#include <menu.h>
|
||||||
|
#include <desk.h>
|
||||||
|
#include <lineedit.h>
|
||||||
|
#include <dialog.h>
|
||||||
|
|
||||||
|
#define apple_About 257 /* Menu ID #s */
|
||||||
|
#define file_Quit 256
|
||||||
|
#define file_New 258
|
||||||
|
#define file_Close 255
|
||||||
|
|
||||||
|
#define maxWindows 4 /* max # of drawing windows */
|
||||||
|
#define maxLines 50 /* max # of lines in a window */
|
||||||
|
|
||||||
|
typedef int BOOL; /* simulate boolean types */
|
||||||
|
typedef struct { Point p1, p2; } lineRecord; /* line defined by its endpts */
|
||||||
|
|
||||||
|
/* holds info about 1 window */
|
||||||
|
struct windowRecord { GrafPortPtr wPtr; /* ptr to the window's port */
|
||||||
|
char *name; /* name of the window */
|
||||||
|
int numLines; /* # lines in this window */
|
||||||
|
lineRecord lines [maxLines]; /* lines in drawing */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum alertKind {norml, stop, note, caution}; /* kinds of alerts */
|
||||||
|
|
||||||
|
BOOL done; /* tells if the program should stop */
|
||||||
|
WmTaskRec lastEvent; /* last event returned in event loop */
|
||||||
|
|
||||||
|
static struct windowRecord windows [maxWindows] = /* drawing windows */
|
||||||
|
{ { NULL, "\pPaint 1" }, { NULL, "\pPaint 2" },
|
||||||
|
{ NULL, "\pPaint 3" }, { NULL, "\pPaint 4" } };
|
||||||
|
|
||||||
|
static ParamList wParms = /* parameters for NewWindow */
|
||||||
|
{ 78, 0xDDA7, NULL, 0, 0, 615, 25, 188, NULL, 0, 0, 0, 0, 0, 0, 10, 10,
|
||||||
|
0, 0, 0, 0, NULL, NULL, NULL, 25, 0, 188, 615, NULL, NULL };
|
||||||
|
|
||||||
|
static ItemTemplate button = /* button item */
|
||||||
|
{ 1, 36, 15, 0, 0, buttonItem, "\pOK", 0, 0, NULL };
|
||||||
|
|
||||||
|
static ItemTemplate message = /* message item */
|
||||||
|
{ 100, 5, 100, 90, 280, itemDisable+statText, NULL, 0, 0, NULL };
|
||||||
|
|
||||||
|
static AlertTemplate alertRec = /* alert box */
|
||||||
|
{ 50, 180, 107, 460, 2, 0x80, 0x80, 0x80, 0x80, NULL, NULL, NULL };
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* DoAlert - Create an alert box
|
||||||
|
*
|
||||||
|
* Input:
|
||||||
|
* kind - kind of alert
|
||||||
|
* msg - alert message
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void DoAlert (enum alertKind kind, char *msg)
|
||||||
|
|
||||||
|
{
|
||||||
|
SetForeColor (0); /* set text colors */
|
||||||
|
SetBackColor (15);
|
||||||
|
|
||||||
|
message.itemDescr = msg; /* init. non-constant */
|
||||||
|
alertRec.atItemList [0] = (ItemTempPtr) &button; /* template fields */
|
||||||
|
alertRec.atItemList [1] = (ItemTempPtr) &message;
|
||||||
|
|
||||||
|
switch (kind) {
|
||||||
|
case norml: Alert (&alertRec, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case stop: StopAlert (&alertRec, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case note: NoteAlert (&alertRec, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case caution: CautionAlert (&alertRec, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: printf ("Error in DoAlert\n");
|
||||||
|
exit (-1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma databank 1
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* DrawWindow - Draw the contents of the current window
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void DrawWindow (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i; /* window's index */
|
||||||
|
int j; /* loop variable */
|
||||||
|
|
||||||
|
struct windowRecord *wp; /* work pointers */
|
||||||
|
lineRecord *lp;
|
||||||
|
|
||||||
|
i = GetWRefCon (GetPort());
|
||||||
|
if (windows [i].numLines) { /* skip the work if there */
|
||||||
|
/* aren't any lines */
|
||||||
|
SetPenMode (modeCopy); /* set up to draw */
|
||||||
|
SetSolidPenPat (0);
|
||||||
|
SetPenSize (2, 1);
|
||||||
|
wp = &windows [i]; /* draw each of the lines */
|
||||||
|
for (j = 0; j < wp->numLines; ++j) {
|
||||||
|
lp = &(wp->lines [j]);
|
||||||
|
MoveTo (lp->p1.h, lp->p1.v);
|
||||||
|
LineTo (lp->p2.h, lp->p2.v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#pragma databank 0
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* DoClose - Close the front drawing window, if there is one
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void DoClose (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (FrontWindow () != NULL) {
|
||||||
|
i = GetWRefCon (FrontWindow ());
|
||||||
|
CloseWindow (windows [i].wPtr);
|
||||||
|
windows [i].wPtr = NULL;
|
||||||
|
EnableMItem (file_New);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* MenuAbout - Create the About alert box
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void MenuAbout (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
DoAlert (note, "\pMini-CAD 1.0\r"
|
||||||
|
"Copyright 1989\r"
|
||||||
|
"Byte Works, Inc.\r\r"
|
||||||
|
"By Mike Westerfield");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* DoNew - Open a new drawing window
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void DoNew (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i; /* index variable */
|
||||||
|
|
||||||
|
i = 0; /* find an empty record */
|
||||||
|
while (windows[i].wPtr != NULL)
|
||||||
|
++i;
|
||||||
|
windows[i].numLines = 0; /* no lines drawn yet */
|
||||||
|
|
||||||
|
wParms.wTitle = (Pointer) windows[i].name; /* init. non-constant */
|
||||||
|
wParms.wRefCon = i; /* wParms fields */
|
||||||
|
wParms.wContDefProc = (VoidProcPtr) DrawWindow;
|
||||||
|
wParms.wPlane = (GrafPortPtr) topMost;
|
||||||
|
|
||||||
|
windows[i].wPtr = NewWindow (&wParms); /* open the window */
|
||||||
|
if (toolerror()) {
|
||||||
|
DoAlert (stop, "\pError opening the window.");
|
||||||
|
windows [i].wPtr = NULL;
|
||||||
|
}
|
||||||
|
else if (i == 3) /* don't allow more than 4 open windows */
|
||||||
|
DisableMItem (file_New);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* HandleMenu - Handle a menu selection
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void HandleMenu (int menuNum)
|
||||||
|
|
||||||
|
{
|
||||||
|
switch (menuNum) {
|
||||||
|
case apple_About: MenuAbout();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case file_Quit: done = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case file_New: DoNew ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case file_Close: DoClose ();
|
||||||
|
}
|
||||||
|
HiliteMenu (FALSE, (int) (lastEvent.wmTaskData >> 16));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* InitMenus - Initialize the menu bar
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void InitMenus (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
InsertMenu (NewMenu (">> Edit \\N3\r" /* create the edit menu */
|
||||||
|
"--Undo\\N250V*Zz\r"
|
||||||
|
"--Cut\\N251*Xx\r"
|
||||||
|
"--Copy\\N252*Cc\r"
|
||||||
|
"--Paste\\N253*Vv\r"
|
||||||
|
"--Clear\\N254\r"
|
||||||
|
".\r"), 0);
|
||||||
|
|
||||||
|
InsertMenu (NewMenu (">> File \\N2\r" /* create the file menu */
|
||||||
|
"--New\\N258*Nn\r"
|
||||||
|
"--Close\\N255V\r"
|
||||||
|
"--Quit\\N256*Qq\r"
|
||||||
|
".\r"), 0);
|
||||||
|
|
||||||
|
InsertMenu (NewMenu (">>@\\XN1\r" /* create the Apple menu */
|
||||||
|
"--About...\\N257V\r"
|
||||||
|
".\r"), 0);
|
||||||
|
|
||||||
|
FixAppleMenu (1); /* add desk accessories */
|
||||||
|
FixMenuBar (); /* draw the completed menu bar */
|
||||||
|
DrawMenuBar ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Sketch - Track the mouse, drawing lines to connect the points
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void Sketch (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
Point endPoint; /* the end point of the line */
|
||||||
|
Point firstPoint; /* the initial point */
|
||||||
|
int i; /* window index */
|
||||||
|
int numLines; /* copy of windows [i].numLines */
|
||||||
|
EventRecord sEvent; /* last event returned in event loop */
|
||||||
|
|
||||||
|
/* get the window's index */
|
||||||
|
i = GetWRefCon (FrontWindow());
|
||||||
|
|
||||||
|
/* check for too many lines */
|
||||||
|
if (windows [i].numLines == maxLines)
|
||||||
|
DoAlert (stop, "\pThe window is full -\rmore lines cannot be\radded.");
|
||||||
|
else {
|
||||||
|
/* initialize the pen */
|
||||||
|
StartDrawing (FrontWindow());
|
||||||
|
SetSolidPenPat (15);
|
||||||
|
SetPenSize (2, 1);
|
||||||
|
SetPenMode (modeXOR);
|
||||||
|
|
||||||
|
/* record the initial pen location */
|
||||||
|
firstPoint = lastEvent.where;
|
||||||
|
GlobalToLocal (&firstPoint);
|
||||||
|
MoveTo (firstPoint.h, firstPoint.v);
|
||||||
|
LineTo (firstPoint.h, firstPoint.v);
|
||||||
|
endPoint = firstPoint;
|
||||||
|
|
||||||
|
/* follow the pen, rubber-banding the line */
|
||||||
|
while (!GetNextEvent (mUpMask, &sEvent)) {
|
||||||
|
GlobalToLocal (&sEvent.where);
|
||||||
|
if ((endPoint.h != sEvent.where.h) || (endPoint.v != sEvent.where.v)) {
|
||||||
|
MoveTo (firstPoint.h, firstPoint.v);
|
||||||
|
LineTo (endPoint.h, endPoint.v);
|
||||||
|
MoveTo (firstPoint.h, firstPoint.v);
|
||||||
|
LineTo (sEvent.where.h, sEvent.where.v);
|
||||||
|
endPoint.h = sEvent.where.h;
|
||||||
|
endPoint.v = sEvent.where.v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* erase the last XORed line */
|
||||||
|
MoveTo (firstPoint.h, firstPoint.v);
|
||||||
|
LineTo (endPoint.h, endPoint.v);
|
||||||
|
|
||||||
|
/* if we have a line (not a point), record it in window's line list */
|
||||||
|
if ((firstPoint.h != endPoint.h) || (firstPoint.v != endPoint.v)) {
|
||||||
|
numLines = windows[i].numLines++;
|
||||||
|
windows [i].lines [numLines].p1 = firstPoint;
|
||||||
|
windows [i].lines [numLines].p2 = endPoint;
|
||||||
|
SetPenMode (modeCopy);
|
||||||
|
SetSolidPenPat (0);
|
||||||
|
MoveTo (firstPoint.h, firstPoint.v);
|
||||||
|
LineTo (endPoint.h, endPoint.v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Program begins here
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int event; /* event #; returned by TaskMaster */
|
||||||
|
|
||||||
|
startdesk (640);
|
||||||
|
InitMenus (); /* set up the menu bar */
|
||||||
|
lastEvent.wmTaskMask = 0x1FFFL; /* let task master do most stuff */
|
||||||
|
ShowCursor (); /* show the cursor */
|
||||||
|
|
||||||
|
done = FALSE; /* main event loop */
|
||||||
|
do {
|
||||||
|
event = TaskMaster (0x076E, &lastEvent);
|
||||||
|
switch (event) { /* handle the events we need to */
|
||||||
|
case wInSpecial:
|
||||||
|
case wInMenuBar: HandleMenu ((int) lastEvent.wmTaskData);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wInGoAway : DoClose ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wInContent: Sketch ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (!done);
|
||||||
|
enddesk ();
|
||||||
|
return 0;
|
||||||
|
}
|
1627
C.Samples/Desktop.Samples/Reversi.cc
Normal file
1627
C.Samples/Desktop.Samples/Reversi.cc
Normal file
File diff suppressed because it is too large
Load Diff
167
C.Samples/Graphic.Samples/Bounce.cc
Normal file
167
C.Samples/Graphic.Samples/Bounce.cc
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* A simple graphics demo.
|
||||||
|
*
|
||||||
|
* By Phil Montoya and Barbara Allred
|
||||||
|
*
|
||||||
|
* Copyright 1987-1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Bounce"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <quickdraw.h>
|
||||||
|
#include <orca.h>
|
||||||
|
|
||||||
|
#define screenMode 640 /* 640x200 graphics Super HiRes display mode */
|
||||||
|
#define copyMode 0 /* pen copy mode */
|
||||||
|
#define size 6 /* number of points */
|
||||||
|
|
||||||
|
/* Global variables */
|
||||||
|
|
||||||
|
static int curColor = white; /* pen color */
|
||||||
|
static int curSize = 1; /* no. points-1 */
|
||||||
|
static int x[size]; /* initial points */
|
||||||
|
static int y[size];
|
||||||
|
static int xv[size], yv[size]; /* move and velocity arrays */
|
||||||
|
static int maxX, maxY; /* max X, Y coordinates */
|
||||||
|
static int minX, minY; /* min X, Y coordinates */
|
||||||
|
static Rect r; /* drawing rectangle */
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* UpDate - Updates x and y by velocity factors and changes
|
||||||
|
* direction if necessary
|
||||||
|
*
|
||||||
|
* Inputs:
|
||||||
|
* px - X location
|
||||||
|
* pxv - X velocity
|
||||||
|
* py - Y location
|
||||||
|
* pyv - Y velocity
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void UpDate (int *px, int *pxv, int *py, int *pyv)
|
||||||
|
|
||||||
|
{
|
||||||
|
*px += *pxv; /* move x by velocity factor */
|
||||||
|
if ((*px < minX) || (*px > maxX)) { /* if x is beyond border... */
|
||||||
|
*px -= *pxv; /* ...move back */
|
||||||
|
*pxv = -(*pxv); /* ...change directions */
|
||||||
|
}
|
||||||
|
*py += *pyv; /* move y by velocity factor */
|
||||||
|
if ((*py < minY) || (*py > maxY)) { /* if y is beyond border... */
|
||||||
|
*py -= *pyv; /* ...move back */
|
||||||
|
*pyv = -(*pyv); /* ...change directions */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* NextPenColor - Changes the pen color
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void NextPenColor (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
curColor++; /* get next color */
|
||||||
|
if (curColor > white) /* if out of colors then start over */
|
||||||
|
curColor = black;
|
||||||
|
SetSolidPenPat(curColor); /* set the pen to this color */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Initialize - initialization for program
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void Initialize (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
SetPenSize(4, 2); /* use a fatter pen */
|
||||||
|
SetPenMode(copyMode); /* use the copy pen mode */
|
||||||
|
GetPortRect(&r);
|
||||||
|
maxX = r.h2; maxY = r.v2; /* don't go beyond screen edges */
|
||||||
|
minX = r.h1; minY = r.v1;
|
||||||
|
|
||||||
|
i = maxX - minX; /* set initial points */
|
||||||
|
j = maxX >> 1;
|
||||||
|
x[0] = minX + j + 20; x[1] = minX + j - 20;
|
||||||
|
x[2] = x[3] = x[4] = x[5] = minX + j;
|
||||||
|
|
||||||
|
i = maxY - minY;
|
||||||
|
j = maxY >> 1;
|
||||||
|
y[3] = minY + j + 10; y[4] = minY + j - 10;
|
||||||
|
y[0] = y[1] = y[2] = y[5] = minY + j;
|
||||||
|
|
||||||
|
for (i = 0, j = 6; i < size; i++) { /* set velocity factors */
|
||||||
|
if (i & 0x0001) /* if i is odd... */
|
||||||
|
j = -j;
|
||||||
|
yv [i] = j;
|
||||||
|
xv [i] = -j;
|
||||||
|
j -= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* DrawShapes - This is the engine of the demo.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
void DrawShapes (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
for (k = white; k >= black; k--) { /* cycle thru 16 screens */
|
||||||
|
SetSolidPenPat(k); /* set the background color */
|
||||||
|
PaintRect(&r);
|
||||||
|
|
||||||
|
/* The number of shapes per screen depends on the size of the shape. */
|
||||||
|
/* The more points a shape has the less times it will be drawn and */
|
||||||
|
/* vice-versa. This keeps the time and density per screen approximately */
|
||||||
|
/* the same. */
|
||||||
|
|
||||||
|
for (i = 0; i < (((size-curSize) * 38) + 75); i++) {
|
||||||
|
/* draw this series of shapes */
|
||||||
|
NextPenColor (); /* change pen colors */
|
||||||
|
MoveTo (x[curSize], y[curSize]); /* initial from position */
|
||||||
|
UpDate (x+curSize, xv+curSize, y+curSize, yv+curSize);
|
||||||
|
for (j = 0; j < curSize; j++) { /* draw this shape */
|
||||||
|
LineTo (x[j], y[j]);
|
||||||
|
UpDate (x+j, xv+j, y+j, yv+j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
curSize++; /* next shape size */
|
||||||
|
if (curSize == size)
|
||||||
|
curSize = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Program Begins Here
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
startgraph(screenMode); /* set up graphics screen */
|
||||||
|
Initialize(); /* initialize global data */
|
||||||
|
DrawShapes(); /* draw the shapes */
|
||||||
|
endgraph(); /* shut down the graphics screen */
|
||||||
|
return 0;
|
||||||
|
}
|
94
C.Samples/Graphic.Samples/CallGSOS.cc
Normal file
94
C.Samples/Graphic.Samples/CallGSOS.cc
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* Call GS/OS
|
||||||
|
*
|
||||||
|
* This program shows how to call GS/OS directly. You should
|
||||||
|
* compare it with callp16.cc, which shows how to call ProDOS 16
|
||||||
|
* (an older operating system that is now a subset of GS/OS).
|
||||||
|
*
|
||||||
|
* This program dumps the contents of a screen image file to the
|
||||||
|
* graphics screen. It is assumed that the program callp16 was
|
||||||
|
* executed prior to running this program, and that you have
|
||||||
|
* made a note of the filename containing the screen dump that
|
||||||
|
* was created by callp16.
|
||||||
|
*
|
||||||
|
* DO NOT EXECUTE THIS PROGRAM FROM THE DESKTOP. It uses non-
|
||||||
|
* standard mechanisms for accessing the graphics screen.
|
||||||
|
*
|
||||||
|
* By Barbara Allred and Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "CallGSOS"
|
||||||
|
#pragma debug 1 /* check stack overflows */
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <orca.h>
|
||||||
|
#include <quickdraw.h>
|
||||||
|
#include <gsos.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define SCREENWIDTH 320 /* screen width in pixels */
|
||||||
|
|
||||||
|
static GSString255 filename; /* name of file having screen contents */
|
||||||
|
|
||||||
|
/* Data Control Blocks for GS/OS calls */
|
||||||
|
OpenRecGS openDCB = { 15, 0, NULL, 1, 0};
|
||||||
|
IORecGS readDCB = { 5, 0, (void *) 0x00E12000, 32768L, 0L, 0 };
|
||||||
|
RefNumRecGS closeDCB = { 1, 0 };
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Prompt user for the name of the file to load. */
|
||||||
|
printf ("Please enter the name of the file containing the screen image:\n");
|
||||||
|
scanf ("%s", filename.text);
|
||||||
|
filename.length = strlen(filename.text);
|
||||||
|
|
||||||
|
/* Initialize the pen and graphics screen. */
|
||||||
|
startgraph(SCREENWIDTH); /* start QuickDraw II */
|
||||||
|
SetPenSize(4, 2); /* use fatter pen */
|
||||||
|
|
||||||
|
/* Open the file and then write its contents to the graphics screen. */
|
||||||
|
openDCB.pathname = &filename; /* open the file */
|
||||||
|
OpenGS(&openDCB);
|
||||||
|
if (i = toolerror()) {
|
||||||
|
MoveTo(50, 100);
|
||||||
|
SetSolidPenPat(black);
|
||||||
|
sprintf(str, "Unable to open file for screen dump: err = %d\n", i);
|
||||||
|
DrawCString(str);
|
||||||
|
goto Fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
readDCB.refNum = openDCB.refNum; /* read the file, sending */
|
||||||
|
ReadGS(&readDCB); /* contents to screen */
|
||||||
|
if (i = toolerror()) {
|
||||||
|
MoveTo(50, 100);
|
||||||
|
SetSolidPenPat(black);
|
||||||
|
sprintf(str, "Unable to read file for screen dump: err = %d\n", i);
|
||||||
|
DrawCString(str);
|
||||||
|
goto Fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
closeDCB.refNum = openDCB.refNum; /* close the file */
|
||||||
|
CloseGS (&closeDCB);
|
||||||
|
|
||||||
|
/* Wrap up: Wait for user to signal end, then shut down tools started. */
|
||||||
|
Fail:
|
||||||
|
SetSolidPenPat(black); /* wait for user to signal end */
|
||||||
|
str = "Press RETURN when ready to quit program";
|
||||||
|
MoveTo(SCREENWIDTH-CStringWidth(str), 40);
|
||||||
|
DrawCString(str);
|
||||||
|
getchar(); getchar();
|
||||||
|
endgraph();
|
||||||
|
return 0;
|
||||||
|
}
|
121
C.Samples/Graphic.Samples/CallP16.cc
Normal file
121
C.Samples/Graphic.Samples/CallP16.cc
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* Call ProDOS 16
|
||||||
|
*
|
||||||
|
* This program draws ovals on the 16 color screen. It then
|
||||||
|
* dumps the contents of the graphics screen to a file. If the
|
||||||
|
* file is loaded and then stored to the graphics screen, the
|
||||||
|
* image dumped is displayed.
|
||||||
|
*
|
||||||
|
* DO NOT EXECUTE THIS PROGRAM FROM THE DESKTOP. It uses non-
|
||||||
|
* standard mechanisms for accessing the graphics screen.
|
||||||
|
*
|
||||||
|
* By Barbara Allred and Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "CallP16"
|
||||||
|
#pragma debug 1 /* check stack overflows */
|
||||||
|
|
||||||
|
#include <prodos.h>
|
||||||
|
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <quickdraw.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <orca.h>
|
||||||
|
|
||||||
|
Rect ovalRect, *ovalPtr = &ovalRect; /* bounds rectangle for ovals */
|
||||||
|
|
||||||
|
/* Data Control Blocks for ProDOS 16 calls */
|
||||||
|
FileRec createDCB = { NULL, 0x00E3, 0x06, 0, 0x01, 0, 0 };
|
||||||
|
OpenRec openDCB;
|
||||||
|
FileIORec writeDCB;
|
||||||
|
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
#define SCREENWIDTH 320 /* screen width in pixels */
|
||||||
|
|
||||||
|
int x = 40; /* horizontal location in global coords */
|
||||||
|
int y = 20; /* vertical location in global coords */
|
||||||
|
int color; /* initial pen color */
|
||||||
|
char *str; /* work pointer */
|
||||||
|
|
||||||
|
char filename [L_tmpnam+1] = ""; /* name of file receiving screen dump */
|
||||||
|
char *fn;
|
||||||
|
|
||||||
|
/* Start Quick Draw II */
|
||||||
|
startgraph(SCREENWIDTH);
|
||||||
|
SetPenSize(4, 2); /* use fatter pen */
|
||||||
|
|
||||||
|
/* Draw ovals in different colors on the screen. */
|
||||||
|
for (color = 0; color < 15; color++) {
|
||||||
|
ovalRect.v1 = x; ovalRect.h1 = y;
|
||||||
|
ovalRect.v2 = x + 15; ovalRect.h2 = y + 15;
|
||||||
|
SetSolidPenPat(color+1);
|
||||||
|
MoveTo(y, x);
|
||||||
|
PaintOval(ovalPtr);
|
||||||
|
SetSolidPenPat(color);
|
||||||
|
MoveTo(y, x);
|
||||||
|
FrameOval(ovalPtr);
|
||||||
|
if (toolerror()) {
|
||||||
|
DrawCString("Failure in drawing routine\n");
|
||||||
|
goto Fail;
|
||||||
|
}
|
||||||
|
y += 10; x += 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dump contents of screen to a file. */
|
||||||
|
fn = tmpnam(&filename[1]); /* get unique filename for dump */
|
||||||
|
if (fn == NULL) {
|
||||||
|
MoveTo (100, 50);
|
||||||
|
SetSolidPenPat(black);
|
||||||
|
DrawCString("Unable to obtain unique filename for screen dump");
|
||||||
|
goto Fail;
|
||||||
|
}
|
||||||
|
filename[0] = strlen(&filename[1]); /* convert C-string to P-string */
|
||||||
|
|
||||||
|
createDCB.pathname = filename; /* create screen dump file */
|
||||||
|
CREATE(&createDCB);
|
||||||
|
if (toolerror()) {
|
||||||
|
MoveTo(50, 100);
|
||||||
|
SetSolidPenPat(black);
|
||||||
|
DrawCString("Unable to create file for screen dump");
|
||||||
|
goto Fail;
|
||||||
|
}
|
||||||
|
openDCB.openPathname = filename; /* open the screen dump file */
|
||||||
|
OPEN(&openDCB);
|
||||||
|
if (toolerror()) {
|
||||||
|
MoveTo(50, 100);
|
||||||
|
SetSolidPenPat(black);
|
||||||
|
DrawCString("Unable to open file for screen dump");
|
||||||
|
goto Fail;
|
||||||
|
}
|
||||||
|
writeDCB.fileRefNum = openDCB.openRefNum; /* write screen contents to file */
|
||||||
|
writeDCB.dataBuffer = (void *) 0x00E12000;
|
||||||
|
writeDCB.requestCount = 32768L;
|
||||||
|
WRITE(&writeDCB);
|
||||||
|
if (toolerror()) {
|
||||||
|
MoveTo(50, 100);
|
||||||
|
SetSolidPenPat(black);
|
||||||
|
DrawCString("Unable to write screen contents to file");
|
||||||
|
goto Fail;
|
||||||
|
}
|
||||||
|
CLOSE(&openDCB); /* close the screen dump file */
|
||||||
|
|
||||||
|
/* Wrap up: Wait for key press and then shut down QuickDraw II. */
|
||||||
|
Fail:
|
||||||
|
SetSolidPenPat(black); /* wait for user to signal end */
|
||||||
|
str = "Press return when ready to quit program";
|
||||||
|
MoveTo(SCREENWIDTH-CStringWidth(str), 40);
|
||||||
|
DrawCString(str);
|
||||||
|
getchar();
|
||||||
|
endgraph();
|
||||||
|
printf("The name of the file containing the screen dump is:\n%b", filename);
|
||||||
|
}
|
73
C.Samples/Graphic.Samples/Pipe.cc
Normal file
73
C.Samples/Graphic.Samples/Pipe.cc
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Pipe
|
||||||
|
*
|
||||||
|
* A simple graphics demo.
|
||||||
|
*
|
||||||
|
* by Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1987-1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Pipe"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <quickdraw.h>
|
||||||
|
|
||||||
|
#define xWidth 20
|
||||||
|
#define yWidth 10
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
Rect r; /* drawing rectangle */
|
||||||
|
int x = xWidth; /* horizontal width of pipe */
|
||||||
|
int y = yWidth; /* vertical width of pipe */
|
||||||
|
int color = 1; /* pen color */
|
||||||
|
int maxX; /* maximum horizontal pixel */
|
||||||
|
int maxY; /* maximum vertical pixel */
|
||||||
|
int minX; /* minimum horizontal pixel */
|
||||||
|
int minY; /* minimum vertical pixel */
|
||||||
|
int deltaX = 6; /* pipe width increment */
|
||||||
|
int deltaY = 3; /* pipe depth increment */
|
||||||
|
int i;
|
||||||
|
|
||||||
|
GetPortRect(&r); /* initialize drawing rectangle */
|
||||||
|
maxX = r.h2 - xWidth; /* don't go beyond rect edges */
|
||||||
|
maxY = r.v2 - yWidth;
|
||||||
|
minX = r.v1;
|
||||||
|
minY = r.h1;
|
||||||
|
|
||||||
|
for (i = 0; i < 150; ++i) { /* main loop: draw pipe, a series of ovals */
|
||||||
|
r.h1 = x - xWidth;
|
||||||
|
r.h2 = x + xWidth;
|
||||||
|
r.v1 = y - yWidth;
|
||||||
|
r.v2 = y + yWidth;
|
||||||
|
color ^= 3;
|
||||||
|
SetSolidPenPat(color);
|
||||||
|
PaintOval(&r);
|
||||||
|
SetSolidPenPat(0);
|
||||||
|
FrameOval(&r);
|
||||||
|
|
||||||
|
x += deltaX; /* bend pipe as needed to fit within rectangle */
|
||||||
|
if (x < xWidth) {
|
||||||
|
x = xWidth;
|
||||||
|
deltaX = -deltaX;
|
||||||
|
}
|
||||||
|
else if (x > maxX) {
|
||||||
|
x = maxX;
|
||||||
|
deltaX = -deltaX;
|
||||||
|
}
|
||||||
|
y += deltaY;
|
||||||
|
if (y < yWidth) {
|
||||||
|
y = yWidth;
|
||||||
|
deltaY = -deltaY;
|
||||||
|
}
|
||||||
|
else if (y > maxY) {
|
||||||
|
y = maxY;
|
||||||
|
deltaY = -deltaY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
46
C.Samples/Graphic.Samples/Spiral.cc
Normal file
46
C.Samples/Graphic.Samples/Spiral.cc
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Spiral
|
||||||
|
*
|
||||||
|
* A simple graphics demo. Uses the shell STOP command from the
|
||||||
|
* debug menu to stop the program early.
|
||||||
|
*
|
||||||
|
* by Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Spiral"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <quickdraw.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
float r, theta, rot;
|
||||||
|
int color = 1;
|
||||||
|
int stopFlag;
|
||||||
|
Rect rect;
|
||||||
|
|
||||||
|
GetPortRect(&rect);
|
||||||
|
SetPenSize(3, 1);
|
||||||
|
for (rot = 0.0002; rot < 0.0005; rot += 0.0001) {
|
||||||
|
theta = 0.0;
|
||||||
|
r = 40.0;
|
||||||
|
MoveTo ((int) (cos (theta) * r * 3) + 160,
|
||||||
|
(int) (sin (theta) * r) + 40);
|
||||||
|
while (r > 0.0) {
|
||||||
|
SetSolidPenPat (color);
|
||||||
|
color ^= 3;
|
||||||
|
theta += 3.1415926535 / 21.0 + rot;
|
||||||
|
LineTo ((int) (cos (theta) * r * 3) + 160,
|
||||||
|
(int) (sin (theta) * r) + 40);
|
||||||
|
r -= 0.02;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Out: ;
|
||||||
|
}
|
34
C.Samples/HyperCard/xcmd.cc
Normal file
34
C.Samples/HyperCard/xcmd.cc
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* HyperCard XCMD
|
||||||
|
*
|
||||||
|
* This sample is a framework program, showing the essential parts
|
||||||
|
* of a HyperCard XCMD.
|
||||||
|
*
|
||||||
|
* For complete details on the requirements for HyperCard XCMDs,
|
||||||
|
* see the HyperCard technical documentation on the System 6.0
|
||||||
|
* CD ROM.
|
||||||
|
*
|
||||||
|
* Build this program using the script xcmd.make. This script has
|
||||||
|
* quite a few comments about the build process, so it's worth
|
||||||
|
* loading the scrept and reading the comments.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1993
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "xcmd"
|
||||||
|
#pragma lint -1
|
||||||
|
#pragma xcmd main
|
||||||
|
|
||||||
|
#include <HyperXCMD.h>
|
||||||
|
#include <misctool.h>
|
||||||
|
|
||||||
|
void main (XCMDPtr parm)
|
||||||
|
|
||||||
|
{
|
||||||
|
SysBeep();
|
||||||
|
}
|
26
C.Samples/HyperCard/xcmd.make
Normal file
26
C.Samples/HyperCard/xcmd.make
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
*
|
||||||
|
* This file builds the sample xcmd.cc.
|
||||||
|
*
|
||||||
|
|
||||||
|
*
|
||||||
|
* There's nothing special about the compile -- just be sure the program
|
||||||
|
* itself uses the xcmd pragma, the small memory model, and does not use the
|
||||||
|
* segment directive.
|
||||||
|
*
|
||||||
|
|
||||||
|
compile xcmd.cc
|
||||||
|
|
||||||
|
*
|
||||||
|
* The -x flag is crutial! XCMDs must consist of a single segment, and
|
||||||
|
* without the -x flag on the link, the linker creates an expressload
|
||||||
|
* segment.
|
||||||
|
*
|
||||||
|
|
||||||
|
link -x xcmd keep=xcmd
|
||||||
|
|
||||||
|
*
|
||||||
|
* The Rez compiler packs the executable code and a name into a file for
|
||||||
|
* HyperCard.
|
||||||
|
*
|
||||||
|
|
||||||
|
compile xcmd.rez keep=Beep
|
23
C.Samples/HyperCard/xcmd.rez
Normal file
23
C.Samples/HyperCard/xcmd.rez
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* HyperCard XCMD
|
||||||
|
*
|
||||||
|
* This is the resource file for xcmd.cc.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1993
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
|
||||||
|
#include "types.rez"
|
||||||
|
|
||||||
|
read $801E(1, convert) "xcmd";
|
||||||
|
|
||||||
|
resource rResName ($0001801E) {
|
||||||
|
1,
|
||||||
|
{
|
||||||
|
1, "Beep";
|
||||||
|
}
|
||||||
|
};
|
35
C.Samples/HyperStudio/nba.cc
Normal file
35
C.Samples/HyperStudio/nba.cc
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* HyperStudio New Button Action (NBA)
|
||||||
|
*
|
||||||
|
* This sample is a framework program, showing the essential parts
|
||||||
|
* of a HyperStudio NBA.
|
||||||
|
*
|
||||||
|
* For complete details on the requirements for HyperStudio NBAs,
|
||||||
|
* contact Roger Wagner Publishing. When this sample was written,
|
||||||
|
* details for writing HyperStudio NDAs were available in disk form
|
||||||
|
* for $10.
|
||||||
|
*
|
||||||
|
* Build this program using the script xcmd.make. This script has
|
||||||
|
* quite a few comments about the build process, so it's worth
|
||||||
|
* loading the scrept and reading the comments.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1993
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "nba"
|
||||||
|
#pragma lint -1
|
||||||
|
#pragma nba main
|
||||||
|
|
||||||
|
#include "HyperStudio.h"
|
||||||
|
#include <misctool.h>
|
||||||
|
|
||||||
|
void main (HSParamPtr parm)
|
||||||
|
|
||||||
|
{
|
||||||
|
SysBeep();
|
||||||
|
}
|
27
C.Samples/HyperStudio/nba.make
Normal file
27
C.Samples/HyperStudio/nba.make
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
*
|
||||||
|
* This file builds the sample nba.cc.
|
||||||
|
*
|
||||||
|
|
||||||
|
*
|
||||||
|
* There's nothing special about the compile -- just be sure the program
|
||||||
|
* itself uses the nba pragma, the small memory model, and does not use the
|
||||||
|
* segment directive.
|
||||||
|
*
|
||||||
|
|
||||||
|
compile nba.cc
|
||||||
|
|
||||||
|
*
|
||||||
|
* The -x flag is crutial! NBAs must consist of a single segment, and
|
||||||
|
* without the -x flag on the link, the linker creates an expressload
|
||||||
|
* segment.
|
||||||
|
*
|
||||||
|
|
||||||
|
link -x nba keep=nba
|
||||||
|
|
||||||
|
*
|
||||||
|
* The Rez compiler packs the executable code and a name into a file for
|
||||||
|
* HyperStudio.
|
||||||
|
*
|
||||||
|
|
||||||
|
compile nba.rez keep=Beep
|
||||||
|
filetype Beep $BC $4007
|
23
C.Samples/HyperStudio/nba.rez
Normal file
23
C.Samples/HyperStudio/nba.rez
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* HyperStudio NBA
|
||||||
|
*
|
||||||
|
* This is the resource file for nba.cc.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1993
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
|
||||||
|
#include "types.rez"
|
||||||
|
|
||||||
|
read $8017($7FF0, convert) "nba";
|
||||||
|
|
||||||
|
resource rResName ($00018017) {
|
||||||
|
1,
|
||||||
|
{
|
||||||
|
$7FF0, "Beep";
|
||||||
|
}
|
||||||
|
};
|
64
C.Samples/Text.Samples/Ackermann.cc
Normal file
64
C.Samples/Text.Samples/Ackermann.cc
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* Ackermann
|
||||||
|
*
|
||||||
|
* This program implements a famous mathematical function that
|
||||||
|
* is often used to examine recursion. It is deceptively
|
||||||
|
* simple, but can take enormous amounts of time and stack
|
||||||
|
* space for relatively small arguments. For that reason,
|
||||||
|
* rangechecking has been enabled to ensure the integrity of the
|
||||||
|
* stack.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1987-1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Ackermann"
|
||||||
|
#pragma debug 0x0001
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* Constants */
|
||||||
|
#define maxm 2 /* max value of 1st argument */
|
||||||
|
#define maxn 3 /* max value of 2nd argument */
|
||||||
|
|
||||||
|
/* Global variables */
|
||||||
|
int a, m, n, depth, maxdepth;
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Ackermann - Demonstrates recursion in ORCA/C
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
int Ackermann (int m, int n)
|
||||||
|
|
||||||
|
{
|
||||||
|
depth++;
|
||||||
|
if (depth > maxdepth)
|
||||||
|
maxdepth = depth;
|
||||||
|
if (m == 0)
|
||||||
|
return (n + 1);
|
||||||
|
if (n == 0)
|
||||||
|
return (Ackermann (m-1, 1));
|
||||||
|
return (Ackermann (m-1, Ackermann (m, n-1)));
|
||||||
|
depth--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
for (m = 0; m <= maxm; m++)
|
||||||
|
for (n = 0; n <= maxn; n++) {
|
||||||
|
depth = 0;
|
||||||
|
maxdepth = 0;
|
||||||
|
a = Ackermann (m, n);
|
||||||
|
printf ("Ackermann(%d, %d) = %-4d ", m, n, a);
|
||||||
|
printf ("Max recursion depth was %d\n", maxdepth);
|
||||||
|
}
|
||||||
|
}
|
101
C.Samples/Text.Samples/Artillery.cc
Normal file
101
C.Samples/Text.Samples/Artillery.cc
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
/************************************************
|
||||||
|
*
|
||||||
|
* Artillery
|
||||||
|
*
|
||||||
|
* This classic interactive text game lets you
|
||||||
|
* pick the angle of your artillery gun in
|
||||||
|
* an attempt to knock out the enemy position.
|
||||||
|
* The computer picks a secret distance. When
|
||||||
|
* you fire, you will be told how much you
|
||||||
|
* missed by, and must fire again. The object
|
||||||
|
* is to hit the target with the fewest shells.
|
||||||
|
*
|
||||||
|
************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Artillery"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <misctool.h>
|
||||||
|
|
||||||
|
#define FALSE 0 /* boolean constants */
|
||||||
|
#define TRUE 1
|
||||||
|
|
||||||
|
#define BLASTRADIUS 50.0 /* max distance from target for a hit */
|
||||||
|
#define DTR 0.01745329 /* convert from degrees to radians */
|
||||||
|
#define VELOCITY 434.6 /* muzzle velocity */
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
float angle, /* angle */
|
||||||
|
distance, /* distance to the target */
|
||||||
|
flightTime, /* time of flight */
|
||||||
|
x, /* distance to impact */
|
||||||
|
vx,vy; /* x, y velocities */
|
||||||
|
int done, /* is there a hit, yet? */
|
||||||
|
tries, /* number of shots */
|
||||||
|
i; /* loop variable */
|
||||||
|
|
||||||
|
/* choose a distance to the target */
|
||||||
|
srand((int) time(NULL));
|
||||||
|
for (i = 0; i < 100; ++i)
|
||||||
|
rand();
|
||||||
|
distance = rand()/5.55373;
|
||||||
|
|
||||||
|
/* not done yet... */
|
||||||
|
done = FALSE;
|
||||||
|
tries = 1;
|
||||||
|
|
||||||
|
/* shoot 'til we hit it */
|
||||||
|
do {
|
||||||
|
/* get the firing angle */
|
||||||
|
printf("Firing angle: ");
|
||||||
|
scanf("%f", &angle);
|
||||||
|
|
||||||
|
/* compute the muzzle velocity in x, y */
|
||||||
|
angle *= DTR;
|
||||||
|
vx = cos(angle)*VELOCITY;
|
||||||
|
vy = sin(angle)*VELOCITY;
|
||||||
|
|
||||||
|
/* find the time of flight */
|
||||||
|
/* (velocity = acceleration*flightTime, two trips) */
|
||||||
|
flightTime = 2.0*vy/32.0;
|
||||||
|
|
||||||
|
/* find the distance */
|
||||||
|
/* (distance = velocity*flightTime) */
|
||||||
|
x = vx*flightTime;
|
||||||
|
|
||||||
|
/* see what happened... */
|
||||||
|
if (fabs(distance-x) < BLASTRADIUS) {
|
||||||
|
done = TRUE;
|
||||||
|
printf("A hit, after %d", tries);
|
||||||
|
if (tries == 1)
|
||||||
|
printf(" try!\n");
|
||||||
|
else
|
||||||
|
printf(" tries!\n");
|
||||||
|
switch (tries) {
|
||||||
|
case 1:
|
||||||
|
printf("(A lucky shot...)\n");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
printf("Phenomenal shooting!\n");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
printf("Good shooting.\n");
|
||||||
|
break;
|
||||||
|
otherwise:
|
||||||
|
printf("Practice makes perfect - try again.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (distance > x)
|
||||||
|
printf("You were short by %d feet.\n", (int)(distance-x));
|
||||||
|
else
|
||||||
|
printf("You were over by %d feet.\n", (int)(x-distance));
|
||||||
|
++tries;
|
||||||
|
}
|
||||||
|
while (!done);
|
||||||
|
}
|
45
C.Samples/Text.Samples/CLine.cc
Normal file
45
C.Samples/Text.Samples/CLine.cc
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/***************************************************************
|
||||||
|
*
|
||||||
|
* Command Line
|
||||||
|
*
|
||||||
|
* On the Apple IIgs, all EXE programs can expect three things
|
||||||
|
* to be passed to them by the shell: a user ID number for use
|
||||||
|
* with tool kits, an eight character shell ID which
|
||||||
|
* identifies the shell that executed the program, and the
|
||||||
|
* text from the command line itself. This program shows how
|
||||||
|
* to access these values from C, printing them to the
|
||||||
|
* screen. Be sure and execute the program with some text
|
||||||
|
* after the name - for example,
|
||||||
|
*
|
||||||
|
* CLINE Hello, world.
|
||||||
|
*
|
||||||
|
* When any EXE program returns to the shell, it passes an
|
||||||
|
* error code in the A register. You can set this value from
|
||||||
|
* C by returning an integer value as the result of main, as
|
||||||
|
* shown in this program.
|
||||||
|
*
|
||||||
|
* If you compile this program from the desktop, turn debug
|
||||||
|
* code off before executing the program from the shell window.
|
||||||
|
*
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "CLine"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <orca.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
char *shellName, *line;
|
||||||
|
int userNumber;
|
||||||
|
|
||||||
|
userNumber = userid();
|
||||||
|
shellName = shellid();
|
||||||
|
line = commandline();
|
||||||
|
printf("User ID: %d\n", userNumber);
|
||||||
|
printf("Shell ID: %s\n", shellName);
|
||||||
|
printf("Command line: %s\n", line);
|
||||||
|
return 0;
|
||||||
|
}
|
52
C.Samples/Text.Samples/ErrorExit.cc
Normal file
52
C.Samples/Text.Samples/ErrorExit.cc
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*******************************************************************
|
||||||
|
*
|
||||||
|
* Error Exit
|
||||||
|
*
|
||||||
|
* You can call the library routines that handle run-time errors
|
||||||
|
* from your own program. One of these, called strerror, will
|
||||||
|
* print a text run-time error message to standard output. You
|
||||||
|
* pass a single integer parameter, which is the run-time error
|
||||||
|
* number. This procedure is generally called from an error trap
|
||||||
|
* subroutine - see the sample program ERRORTRAP.CC for an example
|
||||||
|
* of how to trap errors. In this program strerror is used to
|
||||||
|
* list the current run-time error messages.
|
||||||
|
*
|
||||||
|
* The two built-in macros __FILE__ and __LINE__ are used to print
|
||||||
|
* the current line number and the name of the current source file.
|
||||||
|
*
|
||||||
|
* The library subroutine SystemErrorLocation provides trace-back
|
||||||
|
* information; it is further covered in the text sample program
|
||||||
|
* ERRORTRAP.CC.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield and Barbara Allred
|
||||||
|
*
|
||||||
|
* Copyright 1987-1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*********************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "ErrorExit"
|
||||||
|
#pragma debug 8 /* enable trace-back of code */
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
extern pascal void SystemErrorLocation (void);
|
||||||
|
/* A library procedure that prints the current location and a traceback. */
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
printf ("Run-time error messages are:\n\n");
|
||||||
|
for (i = 1; i <= sys_nerr; i++)
|
||||||
|
printf ("%3d: %s\n", i, strerror (i));
|
||||||
|
|
||||||
|
printf ("\nCurrent line: %d\nCurrent file: %s\n", __LINE__, __FILE__);
|
||||||
|
|
||||||
|
printf ("Exiting with a traceback.\n");
|
||||||
|
SystemErrorLocation ();
|
||||||
|
}
|
95
C.Samples/Text.Samples/ErrorTrap.cc
Normal file
95
C.Samples/Text.Samples/ErrorTrap.cc
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/******************************************************************
|
||||||
|
*
|
||||||
|
* Error Trap
|
||||||
|
*
|
||||||
|
* You can trap run-time errors with ORCA/C. There are several
|
||||||
|
* reasons to do this, including:
|
||||||
|
*
|
||||||
|
* 1. Error messages take up space. By replacing the
|
||||||
|
* system error handler with your own, you can cut
|
||||||
|
* out the space needed to store the run-time error
|
||||||
|
* messages.
|
||||||
|
* 2. You may want to trap some kinds of run-time
|
||||||
|
* errors, like file not found or out of memory,
|
||||||
|
* and handle them yourself. If you do not, the
|
||||||
|
* error will cause the program to stop executing,
|
||||||
|
* which may not be the desired result.
|
||||||
|
*
|
||||||
|
* This program shows how to intercept and handle run-time
|
||||||
|
* errors. This is done by placing a function in your program
|
||||||
|
* called SYSTEMERROR. The function has a single parameter,
|
||||||
|
* which is an integer error number. SYSTEMERROR replaces a
|
||||||
|
* function by the same name that is normally linked in from
|
||||||
|
* the libraries. Another library function, SystemErrorLocation,
|
||||||
|
* provides the name of the function and the line number where
|
||||||
|
* the run-time error occurred.
|
||||||
|
*
|
||||||
|
* Note that if you do not want to handle a particular error,
|
||||||
|
* you can call the system error handlers from your program.
|
||||||
|
* See the sample program ERROREXIT.CC for an example.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield and Barbara Allred
|
||||||
|
*
|
||||||
|
* Copyright 1987-1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "ErrorTrap"
|
||||||
|
#pragma debug 9 /* enable range checking + trace-back */
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
extern pascal void SystemErrorLocation (void);
|
||||||
|
/* A library procedure that prints the current location and a traceback. */
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* BadFunction - Subroutine that will generate a run-time error
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
static void BadFunction (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
char ch [8000]; /* this array is too large for */
|
||||||
|
} /* the default run-time stack */
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* DoIt - Calls function that will generate a run-time error
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
static void DoIt (void)
|
||||||
|
{
|
||||||
|
BadFunction(); /* call function with large array */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* SystemError - Replaces SYSTEMERROR function in the ORCA library
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
static void SYSTEMERROR (int errorNumber)
|
||||||
|
|
||||||
|
{
|
||||||
|
printf ("Run-time error detected. error number = %d\n", errorNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Main program starts here
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
DoIt();
|
||||||
|
SystemErrorLocation();
|
||||||
|
}
|
61
C.Samples/Text.Samples/Finance.cc
Normal file
61
C.Samples/Text.Samples/Finance.cc
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/************************************************
|
||||||
|
*
|
||||||
|
* Finance
|
||||||
|
*
|
||||||
|
* This program prints the balance on an
|
||||||
|
* account for monthly payments, along with the
|
||||||
|
* total amount paid so far.
|
||||||
|
*
|
||||||
|
*************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Finance"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define LOANAMOUNT 10000.0 /* amount of the loan */
|
||||||
|
#define PAYMENT 600.0 /* monthly payment */
|
||||||
|
#define INTEREST 15 /* yearly interest (as %) */
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
float balance, /* amount left to pay */
|
||||||
|
monthlyInterest, /* multiplier for interest */
|
||||||
|
paid ; /* total amount paid */
|
||||||
|
int month; /* month number */
|
||||||
|
|
||||||
|
/* set up the initial values */
|
||||||
|
balance = LOANAMOUNT;
|
||||||
|
paid = month = 0;
|
||||||
|
monthlyInterest = 1.0 + INTEREST/1200.0;
|
||||||
|
|
||||||
|
/* write out the conditions */
|
||||||
|
printf("Payment schedule for a loan of %10.2f\n", LOANAMOUNT);
|
||||||
|
printf("with monthly payments of %5.2f at an\n", PAYMENT);
|
||||||
|
printf("interest rate of %d%%.\n\n", INTEREST);
|
||||||
|
printf(" month balance amount paid\n");
|
||||||
|
printf(" ----- ------- -----------\n");
|
||||||
|
|
||||||
|
/* check for payments that are too small */
|
||||||
|
if (balance*monthlyInterest - balance >= PAYMENT)
|
||||||
|
printf("The payment is too small!");
|
||||||
|
else
|
||||||
|
while (balance > 0) {
|
||||||
|
/* add in the interest */
|
||||||
|
balance *= monthlyInterest;
|
||||||
|
/* make a payment */
|
||||||
|
if (balance > PAYMENT) {
|
||||||
|
balance -= PAYMENT;
|
||||||
|
paid += PAYMENT;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
paid += balance;
|
||||||
|
balance = 0;
|
||||||
|
}
|
||||||
|
/* update the month number */
|
||||||
|
++month;
|
||||||
|
/* write the new statistics */
|
||||||
|
printf("%15d %14.2f %14.2f\n", month, balance, paid);
|
||||||
|
}
|
||||||
|
}
|
107
C.Samples/Text.Samples/Key.cc
Normal file
107
C.Samples/Text.Samples/Key.cc
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* Keyboard Handling
|
||||||
|
*
|
||||||
|
* This program shows one way to access the keyboard directly
|
||||||
|
* from ORCA/C. Keep in mind that the standard file input
|
||||||
|
* collects an entire line of characters before reporting the
|
||||||
|
* first character. This is necessary to allow editing of the
|
||||||
|
* input line. When using the desktop environment, you can get
|
||||||
|
* keypress events from the event manager. This program shows
|
||||||
|
* how to detect a keypress as soon as it is hit. It echoes
|
||||||
|
* keys until you type CONTROL-@ (ASCII 0).
|
||||||
|
*
|
||||||
|
* The program works by reading the keyboard (at $C000) until
|
||||||
|
* the value is negative, indicating that a key has been
|
||||||
|
* pressed. It then stores a value (any value will do) in
|
||||||
|
* $C010 to indicate that the key has been read. This makes
|
||||||
|
* the value at $C010 positive (bit 7 is clear). The value of
|
||||||
|
* the key is then ANDed with $7F to clear the high bit.
|
||||||
|
*
|
||||||
|
* THIS METHOD OF READING THE KEYBOARD ONLY WORKS IN THE TEXT
|
||||||
|
* ENVIRONMENT. When the event manager is active, as it always
|
||||||
|
* is in a desktop program, you should call the event manager
|
||||||
|
* to read keystrokes.
|
||||||
|
*
|
||||||
|
* Checking to see when a key has been pressed is bundled into
|
||||||
|
* the function KeyPress. Returning the key and clearing the
|
||||||
|
* strobe is done in ReadChar.
|
||||||
|
*
|
||||||
|
* See key2 for a version that splits the keyboard routines off
|
||||||
|
* into a separately compilable module.
|
||||||
|
*
|
||||||
|
* See key3 for a version that uses assembly language to do the
|
||||||
|
* same thing.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield and Barbara Allred
|
||||||
|
*
|
||||||
|
* Copyright 1987-1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Key"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
static char ch; /* character read from keyboard */
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* KeyPress - Check if a key has been pressed
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
int KeyPress(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
char *keyboard;
|
||||||
|
|
||||||
|
keyboard = (char *) 0x00C000;
|
||||||
|
return ((*keyboard) & 0x80) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* ReadChar - Return the last character typed on the keyboard.
|
||||||
|
* Note: Returns a character whether or not one has
|
||||||
|
* been typed!
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
char ReadChar (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
char *keyboard, *strobe;
|
||||||
|
|
||||||
|
keyboard = (char *) 0x00C000;
|
||||||
|
strobe = (char *) 0x00C010;
|
||||||
|
*strobe = 0;
|
||||||
|
return *keyboard & 0x7F;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Main program starts here
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
printf ("Press any key(s) and then RETURN. Enter CTRL-@ to quit.\n");
|
||||||
|
do {
|
||||||
|
while (! KeyPress()) /* wait for a keypress */
|
||||||
|
;
|
||||||
|
ch = ReadChar(); /* get character typed from keybrd */
|
||||||
|
if (ch == 0x0D) /* write character to the screen */
|
||||||
|
printf ("\n");
|
||||||
|
else
|
||||||
|
printf ("%c", ch);
|
||||||
|
}
|
||||||
|
while (ch != 0);
|
||||||
|
return 0;
|
||||||
|
}
|
20
C.Samples/Text.Samples/Key2.Build
Normal file
20
C.Samples/Text.Samples/Key2.Build
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
unset exit
|
||||||
|
echo compile key2.cc
|
||||||
|
compile key2.cc
|
||||||
|
if {status} == 0
|
||||||
|
echo compile key2.funcs
|
||||||
|
compile key2.funcs
|
||||||
|
if {status} == 0
|
||||||
|
echo link key2.cc key2.funcs
|
||||||
|
link key2 funcs keep=Key2
|
||||||
|
if {status} == 0
|
||||||
|
key2
|
||||||
|
else
|
||||||
|
echo Unable to link key2.cc key2.funcs
|
||||||
|
end
|
||||||
|
else
|
||||||
|
echo Unable to compile key2.funcs
|
||||||
|
end
|
||||||
|
else
|
||||||
|
echo Unable to compile key2.cc
|
||||||
|
end
|
43
C.Samples/Text.Samples/Key2.Funcs
Normal file
43
C.Samples/Text.Samples/Key2.Funcs
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* This file contains the functions for KEY2.CC. See that file
|
||||||
|
* for detailed comments.
|
||||||
|
*
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Funcs"
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* KeyPress - Check if a key has been pressed
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
int KeyPress(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
char *keyboard;
|
||||||
|
|
||||||
|
keyboard = (char *) 0x00C000;
|
||||||
|
return ((*keyboard) & 0x80) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* ReadChar - Returns the last character typed on the keyboard.
|
||||||
|
* Note: Returns a character whether or not one has
|
||||||
|
* been typed!
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
char ReadChar(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
char *keyboard, *strobe;
|
||||||
|
|
||||||
|
keyboard = (char *) 0x00C000;
|
||||||
|
strobe = (char *) 0x00C010;
|
||||||
|
*strobe = 0;
|
||||||
|
return *keyboard & 0x7F;
|
||||||
|
}
|
61
C.Samples/Text.Samples/Key2.cc
Normal file
61
C.Samples/Text.Samples/Key2.cc
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* Keyboard Handling
|
||||||
|
*
|
||||||
|
* This program demonstrates separate compilation by splitting
|
||||||
|
* the program KEY into two parts: the main program, and a
|
||||||
|
* separately compiled file with the keyboard subroutines that
|
||||||
|
* can then be called from many different programs without the
|
||||||
|
* need for recompiling. See KEY.CC for a full description of
|
||||||
|
* what this program does.
|
||||||
|
*
|
||||||
|
* The program now consists of four files:
|
||||||
|
*
|
||||||
|
* Key2.Build - EXEC file which separately compiles the two
|
||||||
|
* source files, then links their object
|
||||||
|
* modules to create the final program. To
|
||||||
|
* use the EXEC file, simply type KEY2.BUILD
|
||||||
|
* from the command line.
|
||||||
|
*
|
||||||
|
* Key2.cc - File containing main program.
|
||||||
|
*
|
||||||
|
* Key2.h - Header file accessed by the main program;
|
||||||
|
* Contains declarations of external functions.
|
||||||
|
*
|
||||||
|
* Key2.Funcs - File containing keyboard functions called
|
||||||
|
* by main program.
|
||||||
|
*
|
||||||
|
* See Key3 for a version that uses assembly language to read
|
||||||
|
* the keyboard.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield and Barbara Allred
|
||||||
|
*
|
||||||
|
* Copyright 1987-1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Key2"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include "Key2.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
printf ("Press any key(s) and then RETURN. Enter CTRL-@ to quit.\n");
|
||||||
|
do {
|
||||||
|
while (! KeyPress()) /* wait for a keypress */
|
||||||
|
;
|
||||||
|
ch = ReadChar(); /* get character typed from keybrd */
|
||||||
|
if (ch == 0x0D) /* write character to the screen */
|
||||||
|
printf ("\n");
|
||||||
|
else
|
||||||
|
printf ("%c", ch);
|
||||||
|
}
|
||||||
|
while (ch != 0);
|
||||||
|
return 0;
|
||||||
|
}
|
4
C.Samples/Text.Samples/Key2.h
Normal file
4
C.Samples/Text.Samples/Key2.h
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/* Header file for program Key2.CC */
|
||||||
|
|
||||||
|
extern int KeyPress(void);
|
||||||
|
extern char ReadChar(void);
|
41
C.Samples/Text.Samples/Key3.asm
Normal file
41
C.Samples/Text.Samples/Key3.asm
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
****************************************************************
|
||||||
|
*
|
||||||
|
* KeyPress - Check to see if a key has been pressed
|
||||||
|
*
|
||||||
|
* Outputs:
|
||||||
|
* A - 1 (true) if pressed, else 0
|
||||||
|
*
|
||||||
|
****************************************************************
|
||||||
|
*
|
||||||
|
KeyPress start
|
||||||
|
keyBoard equ $C000 keyboard location
|
||||||
|
|
||||||
|
sep #$30 use short regs for load
|
||||||
|
lda >keyBoard load keyboard value
|
||||||
|
asl A shift sign bit into bit 0
|
||||||
|
rol A
|
||||||
|
rep #$30 back to long regs
|
||||||
|
and #1 and out all but the bit we want
|
||||||
|
rtl
|
||||||
|
end
|
||||||
|
|
||||||
|
****************************************************************
|
||||||
|
*
|
||||||
|
* ReadChar - return the last character typed on the keyboard
|
||||||
|
*
|
||||||
|
* Outputs:
|
||||||
|
* A - character typed
|
||||||
|
*
|
||||||
|
****************************************************************
|
||||||
|
*
|
||||||
|
ReadChar start
|
||||||
|
keyBoard equ $C000 keyboard location
|
||||||
|
strobe equ $C010 strobe location
|
||||||
|
|
||||||
|
sep #$30 use short regs
|
||||||
|
sta >strobe clear strobe
|
||||||
|
lda >keyBoard load character
|
||||||
|
rep #$30 back to long regs
|
||||||
|
and #$007F and out high bits
|
||||||
|
rtl
|
||||||
|
end
|
64
C.Samples/Text.Samples/Key3.cc
Normal file
64
C.Samples/Text.Samples/Key3.cc
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* Keyboard Handling
|
||||||
|
*
|
||||||
|
* This is the final incarnation of the keyboard polling sample.
|
||||||
|
* See KEY.CC for complete comments on what the program does and
|
||||||
|
* how it works.
|
||||||
|
*
|
||||||
|
* In this version, we will write the two subroutines in
|
||||||
|
* assembly language. While you could use separate compilation
|
||||||
|
* to compile and assemble the two pieces separately, then
|
||||||
|
* link them, as in the last example, we will use chaining
|
||||||
|
* to avoid all of that. Chaining is a feature of all
|
||||||
|
* languages fully installed in ORCA or APW that allows a
|
||||||
|
* single program to be written in more than one language
|
||||||
|
* without resorting to separate compilation. Which method
|
||||||
|
* you prefer - chaining or separate compilation - depends
|
||||||
|
* on your own taste.
|
||||||
|
*
|
||||||
|
* To chain the two files together, we just place an append
|
||||||
|
* command after the end of the program. The rest is automatic
|
||||||
|
* To compile, assemble, link, and execute, we can now use the
|
||||||
|
* familiar RUN command:
|
||||||
|
*
|
||||||
|
* run key3.cc
|
||||||
|
*
|
||||||
|
* Note: both the assembler and compiler must be properly
|
||||||
|
* installed for this to work. The assembler is sold
|
||||||
|
* separately as ORCA/M 2.0 for the Apple IIGS.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield and Barbara Allred
|
||||||
|
*
|
||||||
|
* Copyright 1987-1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Key3"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
extern int KEYPRESS (void); /* declare assembly-language */
|
||||||
|
extern int READCHAR (void); /* routines to be called */
|
||||||
|
char ch; /* character read from keyboard */
|
||||||
|
|
||||||
|
printf("Press any key(s) and then RETURN. Enter CTRL-@ to quit.\n");
|
||||||
|
do {
|
||||||
|
while (! KEYPRESS()) /* wait for a keypress */
|
||||||
|
;
|
||||||
|
ch = READCHAR(); /* get character typed from keybrd */
|
||||||
|
if (ch == 0x0D) /* write character to the screen */
|
||||||
|
printf ("\n");
|
||||||
|
else
|
||||||
|
printf ("%c", ch);
|
||||||
|
}
|
||||||
|
while (ch != 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#append "Key3.asm"
|
34
C.Samples/Text.Samples/Print.cc
Normal file
34
C.Samples/Text.Samples/Print.cc
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*****************************************************************
|
||||||
|
*
|
||||||
|
* Text Printer Demo
|
||||||
|
*
|
||||||
|
* This example shows how to access the .PRINTER text printer
|
||||||
|
* driver from a C program. The .PRINTER driver must be installed
|
||||||
|
* before this sample is executed.
|
||||||
|
*
|
||||||
|
* There really isn't much to this sample, which may seem bad at
|
||||||
|
* first, but it's really good: accessing the text printer driver
|
||||||
|
* really is as simple as opening the printer and writing to it!
|
||||||
|
*
|
||||||
|
* By Mike Westerfield
|
||||||
|
*
|
||||||
|
* Copyright 1993
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
*****************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Print"
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
f = fopen(".printer", "w+");
|
||||||
|
fprintf(f, "Hello, printer!\n");
|
||||||
|
fputc('\f', f); /* on most printers, this will eject a page */
|
||||||
|
fclose(f);
|
||||||
|
}
|
62
C.Samples/Text.Samples/Trace.cc
Normal file
62
C.Samples/Text.Samples/Trace.cc
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Trace
|
||||||
|
*
|
||||||
|
* ORCA/C can give you a traceback when a run-time error occurs.
|
||||||
|
* A traceback shows the function and line number where the
|
||||||
|
* error occurred, then gives a list of functions and line
|
||||||
|
* numbers that show what subroutine calls were made to get to
|
||||||
|
* the point where the error occurred. This program illustrates
|
||||||
|
* this by deliberately failing in the function named Fail.
|
||||||
|
*
|
||||||
|
* By Mike Westerfield and Barbara Allred
|
||||||
|
*
|
||||||
|
* Copyright 1987-1989
|
||||||
|
* Byte Works, Inc.
|
||||||
|
*
|
||||||
|
******************************************************************/
|
||||||
|
|
||||||
|
#pragma keep "Trace"
|
||||||
|
#pragma debug 9
|
||||||
|
#pragma lint -1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Fail - Subroutine that will generate a run-time error
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
static void Fail (void)
|
||||||
|
{
|
||||||
|
char ch [8000]; /* this array is too large for */
|
||||||
|
} /* the default run-time stack */
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* DoIt - Calls subroutine that will generate a run-time error
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
static void DoIt (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
Fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
*
|
||||||
|
* Main program starts here
|
||||||
|
*
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
|
||||||
|
{
|
||||||
|
printf ("This program fails. Generating a traceback:\n");
|
||||||
|
DoIt();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user