Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > alt.folklore.computers > #233649

Re: “Hello World” Under ITS On PDP-10

From jayjwa <jayjwa@atr2.ath.cx.invalid>
Newsgroups alt.folklore.computers
Subject Re: “Hello World” Under ITS On PDP-10
Date 2026-01-19 12:12 -0500
Organization atr2net 2026
Message-ID <87jyxd1q7t.fsf@atr2.ath.cx> (permalink)
References <10kkb2u$rfa$1@dont-email.me>

Show all headers | View raw


Lawrence D’Oliveiro <ldo@nz.invalid> writes:

> a debugger as your primary user interface, instead. Using the system
> involves issuing an interesting mix of debugging-specific commands
You're a glass is half full person, eh?

ITS has C, too, although it's far different than the C we know today or
even the C in TOPS-20.

/* guess.c
 * Simple number-guessing game. Enter your guess and try to 
 * match the winning number between BEGIN and END. Your
 * performance will be graded if you win. 
 * This version was ported from the TOPS-20 KCC version and is
 * for Synder CC. It is very hacky & does no error checking. It
 * will likely break if given wrong input. TODO: Fix this.
 *
 * Build:
 * copy clib; c10std c to your work area (change includes if needed)
 * cc c10std.c
 * cc guess.c
 * stinkr
 * =x c/clib
 * =l c10std.stk
 * =l guess.stk
 * =o ts.guess
 */
#include "c/stdio.h"
#include "c/cc.h"

/* Define the number span the user should guess in. */
#define BEGIN 1
#define END 50

int random( min, max );		/* Return rand int between min-max */
int get2int( void );		/* Get (up to) 2 digit integer from user */


int main( void ) {
	int guess;		/* The user's guess */
	int answer;		/* The winning number */
	int tries;		/* Running total of attempts by user */

	/* Init stdio and friends as directed by clib; c10std c */
	stdio();

	/* Initialize tries, get the user's guess, and explain
	 * what is being done in terms of the game.
	 */
	tries = 1;
	cprint( "\t *** Number guessing game! *** \n" );
	cprint( "Try to guess the number between %d and %d.\n", BEGIN, END );

	/* Get a randomish number from BEGIN to END */
	answer = random( BEGIN, END);

	/* Loop until success or the user exits with ctrl-z */
	do {
		cprint( "Your guess (ctrl-z to quit): " );
		/* There is no scanf() in Synder C nor strtol! */
		guess = get2int();
		
		/* cprint( "[DEBUG]: guess is %d.\n", guess );
		cprint( "[DEBUG]: answer is %d.\n", answer ); */

		/* Eval the guess */
		if ( guess < answer ) {
			cprint( "\nGuess higher! -->\n" );
		} else if ( guess > answer ) {
			cprint( "\n\t\t<-- Guess lower!\n" );
		} else {
			cprint( "\n\tBINGO!\n" );
		
			/* Grade player performance */
			switch ( tries ) {
			case 1:
				cprint( "\nRating: Guessing god. (%d try)\n", tries );
				break;
			case 2:
			case 3:
				cprint( "\nRating: Guessing pro. (%d tries)\n", tries );
				break;
			case 4:
			case 5:
			case 6:
				cprint( "\nRating: Average guesser. (%d tries)\n", tries );
				break;
			default:
				cprint( "\nRating: You're not very good at this game, are you?\n" );
			}
			/* Exit loop because the player won. */
			break;
		}
		/* Increment the number of tries the player will have
		 * needed to win.
		 */
		tries++;
	} while ( guess != answer );

	return 0;
}

/* Return a randomish integer between min and max integer */
int random( min, max ) int min, max; {
	int num;

	/* Until I know of a better way to do this, this will
	 * work for a game.
	 */
	srand( etime() );
	num = rand() % END + BEGIN;
	/* rand() gives a negative occasionally, and goes one
	 * below the minimum, BEGIN. Fix this here.
	 */
	if ( num < 0 ) num = num * -1;
	if ( num == 0 ) num++;
	return num;
}

/* Get (up to) a double digit ASCII Dec integer from stdin and return its
 * proper integer value to the caller, converting from the decimal
 * equal that ITS saves for the char the user enters.
 */
int get2int( void ) {
	int num1, num2;
	
	/* We must call cgeti twice if we want a two-digit integer. */
	num1 = cgeti( stdin );
	num2 = cgeti( stdin );

	/* Handle case where the user enters one digit then presses 
	 * Enter. Eat the user's newline if they enter two digits. 
	 */
	if ( num2 != '\n' ) getchar();
	/* cprint( "[DEBUG]: num1 is %c num2 is %c\n", num1, num2 ); */

	/* Now the decimal equal of the character must be converted
	 * to an actual single integer. Eg, if the user enters "6"
	 * the variable will store the number 54 (as in ASCII table).
	 */
	if ( (num1 >= 48) && (num1 <= 57) ) {
		/* Adjust to the integer else zero out */
		num1 = num1 - 48;
	} else num1 = 0;
	if ( (num2 >= 48) && (num2 <= 57) ) {
		/* Adust as above. There is a valid integer in
		 * slot 2. Return using both slots. That is,
		 * tens place and ones place.
		 */
		num2 = num2 - 48;
		return (num1 * 10) + (num2 * 1);
	} else {
		/* Slot 2 (one's place) is not valid (eg, users enters "3")
		 * because it is outside 0-9 range. Return just num1 
		 */
		return num1;
	}
}

/* EOF */


*guess↑K!
         *** Number guessing game! *** 
Try to guess the number between 1 and 50.
Your guess (ctrl-z to quit): 35

                <-- Guess lower!
Your guess (ctrl-z to quit): 25

                <-- Guess lower!
Your guess (ctrl-z to quit): 15

                <-- Guess lower!
Your guess (ctrl-z to quit): 10

Guess higher! -->
Your guess (ctrl-z to quit): 12

Guess higher! -->
Your guess (ctrl-z to quit): 13

        BINGO!

Rating: Average guesser. (6 tries)

:KILL 
*

-- 
PGP Key ID: 781C A3E2 C6ED 70A6 B356  7AF5 B510 542E D460 5CAE
       "The Internet should always be the Wild West!"

Back to alt.folklore.computers | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

“Hello World” Under ITS On PDP-10 Lawrence D’Oliveiro <ldo@nz.invalid> - 2026-01-19 04:14 +0000
  Re: “Hello World” Under ITS On PDP-10 jayjwa <jayjwa@atr2.ath.cx.invalid> - 2026-01-19 12:12 -0500
    Re: “Hello World” Under ITS On PDP-10 Anthk <bozo@dev.null> - 2026-04-02 14:03 +0000
      Re: “Hello World” Under ITS On PDP-10 Rich Alderson <news@alderson.users.panix.com> - 2026-04-02 14:59 -0400

csiph-web