PDP-10 / its

Incompatible Timesharing System
Other
843 stars 80 forks source link

O - Othello game #788

Open atsampson opened 6 years ago

atsampson commented 6 years ago

In the list of games in JOBS.

MC:SYS2;TS O MC:.INFO.;O INFO MC:.INFO.;O ORDER

Compiled from MC:EJS;O 9. @eswenson1, do you still have that file?

eswenson1 commented 6 years ago

I don't have it handy, but I can get it and will post something here when I do. I've assigned this ticket to myself.

eswenson1 commented 6 years ago

The EJS; O > source is a midas program that just tells the user to use the "O" command in the GAME program. It does not include the source for Othello. In fact, I cannot find this source anywhere.

eswenson1 commented 6 years ago

Binary installed as part of #907. But need to locate source and build from source.

atsampson commented 6 years ago

TS O is a binary produced by Alan Snyder's C compiler (like STINKR, SHELL etc.).

larsbrinkhoff commented 6 years ago

In that case, maybe the source was on DM because that's where Alan Snyder did his work.

larsbrinkhoff commented 5 years ago

There's an XX:\O.-IPAK-.2. I wonder what an IPAK file is? There's a TS IPAK on ITS.

larsbrinkhoff commented 5 years ago

Maybe AS; OGAME 1.

larsbrinkhoff commented 5 years ago

No, not OGAME. That's just a record of one game.

larsbrinkhoff commented 4 years ago

I have studied the IPAK files, and now I'm quite sure the source code may be in an ITS or TOPS-20 "-IPAK-" file.

The file format seems designed to keep files private. The program checks the job UNAME and it must match a word in the file. There may also be encryption. To make matters worse, the format seems to exist in many incompatible versions. We have a 1977 TS IPAK, but there's also a 1978 TS OI and neither seem to work with some 1980 -IPAK- files.

larsbrinkhoff commented 4 years ago

Listing from \-O.-IPAK-.2 from 1979-12-13:


File name       Words  Timestamp
O      H          483  1979-12-13 20:23:36
O      MAKTAP      14  1977-11-25 18:45:21
O      NOTES      241  1977-08-01 10:40:02
O      OLD        865  1977-11-08 08:50:55
O      STINKR      30  1978-08-26 14:14:14
O-ITS  C          801  1979-02-05 10:06:30
O-T20  C          780  1979-12-13 20:36:36
O-T20  STK       1692  1979-12-13 20:37:09
O-UNIX C          256  1979-02-05 10:06:55
O1     C         2507  1979-02-05 10:07:29
O1     STK       4141  1979-12-13 20:25:28
O2     C         2848  1977-11-23 17:40:06
O2     STK       3222  1979-12-13 20:26:25
O20    STINKR      21  1979-12-13 20:00:52
O3     C         3535  1978-08-22 08:42:56
O3     STK       3091  1979-12-13 20:27:29
O4     C          443  1977-11-23 17:38:43
O4     STK        457  1979-12-13 20:27:53
O5     C          776  1977-11-26 09:21:19
O5     STK       1000  1979-12-13 20:28:15
O6     C          374  1978-02-12 15:44:27
O6     STK        663  1979-12-13 20:28:35
O7     C            5  1977-12-02 17:01:33
O7     STK        681  1979-12-13 20:28:56
O8     C         4895  1977-12-03 08:22:43
O8     STK       3931  1979-12-13 20:29:37
O9     C          258  1978-08-12 13:02:03
O9     STK        369  1979-12-13 20:30:00
O9N    C           83  1978-08-12 12:19:15
O9N    STK        115  1979-12-13 20:30:15
OB     H          298  1977-12-02 18:48:12
OB1    C         2372  1977-12-02 19:01:03
OB2    C          397  1977-12-02 18:30:55
OB3    C            8  1977-12-02 16:26:29
OBK    CODE       490  1978-08-26 14:07:12
OBKTST C          639  1977-12-02 19:01:14
OBKTST STINKR      21  1978-07-20 07:08:07
OD     CODE       560  1978-09-04 07:54:29
ODITS  C          157  1978-09-03 10:42:28
ODT20  C          364  1979-12-13 19:52:00
ODT20  STK       1513  1979-12-13 20:33:05
ODUNIX C          200  1978-09-03 10:42:40
OISMOV CMID       152  1979-02-05 10:02:24
OISMOV MIDAS      157  1977-12-03 08:48:06
OISMOV STK        112  1979-02-05 10:02:54
OM     STINKR      55  1978-08-12 12:41:22
OMEM   CLU        248  1978-08-12 10:56:22
OPRINT C          607  1977-05-20 18:59:01
OPRINT STINKR      17  1978-07-20 07:03:47
OXGP   C         2173  1977-12-02 08:33:04
TEST   BOOK        33  1977-11-20 13:27:48
eswenson1 commented 4 years ago

That's a lot of source code for this game! Are you going to try to compile/link it for ITS?

larsbrinkhoff commented 4 years ago

I think there are several programs. O, OB, and OD, then maybe OM too.

I'm not too keen on trying the files yet, since we are not free to share them.

larsbrinkhoff commented 2 years ago

This IPAK file has now been released to https://github.com/MITDDC/clu-1976-1989
It's the file clu/9005196/clusrc/}o.-ipak-

eswenson1 commented 2 years ago

Have we successfully reconstructed the (or an) Othello executable from source yet?

larsbrinkhoff commented 2 years ago

No we haven't, that's why this issue is still open.

I put the contents of the ipak file on a branch called lars/o.

larsbrinkhoff commented 2 years ago

I see @eswenson1 is still assigned. Will you work on this? @atsampson is also taking a look.

eswenson1 commented 2 years ago

If @atsampson wants to work on this feel free to reassign to him.

eswenson1 commented 2 years ago

I successfully compiled o1,o2,o3,o4,o5,o6,o7,o8, and stdio, but when I link, I get this:

*:stinkr
=x c/clib
=l stdio.stk
=l o1.stk
=l o2.stk
=l o3.stk
=l o4.stk
=l o5.stk
=l o6.stk
=l o7.stk
=l o8.stk
=o ts.o
=
 *** ZFPRIN multiply defined ***

 *** ZFPRIN multiply defined ***

 *** ZLOG   multiply defined ***

 *** ZLOG   multiply defined ***

 --- UNDEFINED SYMBOLS ---

Program O1

ZISMOV

 --- SEGMENTS ---

        0          0100 -  032172 (032073=13371)
        1        032173 -  037775 (05603=2947)
        2        040000 -  055530 (015531=7001)
        3        055531 -  061512 (03762=2034)

:KILL
*

Haven't yet found where the duplicates are coming from. The undefined symbol will come from ISMOV1.MIDAS.

eswenson1 commented 2 years ago

When I add in ISMOV1, I get:

*:stinkr
=x c/clib
=l stdio.stk
=l ismov1.stk
=l o1.stk
=l o2.stk
=l o3.stk
=l o4.stk
=l o5.stk
=l o6.stk
=l o7.stk
=l o8.stk
=o ts o
=
 *** ZFPRIN multiply defined ***

 *** ZFPRIN multiply defined ***

 *** ZLOG   multiply defined ***

 *** ZLOG   multiply defined ***

 --- SEGMENTS ---

        0          0100 -  032172 (032073=13371)
        1        032173 -  037775 (05603=2947)
        2        040000 -  055556 (015557=7023)
        3        055531 -  061514 (03764=2036)

Segments overlap.
Initialization routine lost.

:KILL
*
eswenson1 commented 2 years ago

And when I run the "TS O" from above, I get:

*:aso;o
ILOPR; 40005>>.CALL 55535

That makes sense, of course, given the messages:

Segments overlap.
Initialization routine lost.

I don't know enough about STINKR to know what to do here. @atsampson ?

larsbrinkhoff commented 2 years ago

fprintf (ZFPRIN) is defined in clib (C10STD). Maybe C10STD and STDIO overlap in functionality.

I don't know about log though. It's not in clib.

Segment 2 ends at 055556, and segment 3 begins at 055531 so there's the overlap.

C; CLIB STINKR has s 100,n,p,n which says how to place the segments. n means "next locatation" and p means "next page". Segment 3 is n, next. It looks like STINKR isn't doing the right thing here.

larsbrinkhoff commented 2 years ago

Maybe try s 100,n,p,055557? This places segment 3 right after segment 2.

eswenson1 commented 2 years ago

Ok. Will try that. I can also remove the fprintf from stdio.c to get rid of that dupe. Maybe clib didn't have it when O was created. But I can't find the log dupe either.

eswenson1 commented 2 years ago

The dupes might not really be an issue if the loader uses the first or second and ignores the other. So the segment overlap issue is more important. I'll let you know what happens.

eswenson1 commented 2 years ago

Ok, here is some progress. With this:

*:stinkr
=x c/clib
=s 100,n,p,055557
=l o1.stk
=l o2.stk
=l o3.stk
=l o4.stk
=l o5.stk
=l o6.stk
=l o7.stk
=l o8.stk
=l stdio.stk
=l ismov1.stk
=o ts.o
=

I get the output:

 *** ZLOG   multiply defined ***

 *** ZLOG   multiply defined ***

 *** ZFPRIN multiply defined ***

 *** ZFPRIN multiply defined ***

 --- SEGMENTS ---

        0          0100 -  032172 (032073=13371)
        1        032173 -  037775 (05603=2947)
        2        040000 -  055556 (015557=7023)
        3        055557 -  061542 (03764=2036)

:KILL
*

But, when I run it, I get this:

··································································································································!
·········································* to move:

Running the TS O from GAMES, I get:

Othello

Have you played this program before (Y or N)?

So something isn't right yet.

eswenson1 commented 2 years ago

I don't see the string "Have" or "played" in any of the .c or .h files.

If I knew how to play, or enter moves, I'd try. I guess I have to read up on Othello.

larsbrinkhoff commented 2 years ago

Too bad we don't have a debugger for C. Debugging with DDT can be really painful, I have learned.

Maybe this is an early/unpolished version without the friendly splash screen.

Here's some help:


char    *helpmsg
"l - list legal moves\n\
a - analyze position (A=best)\n\
b - print board\n\
s - print score\n\
r - resign game (score is recorded)\n\
x - show board after move (toggle)\n\
h - set handicap (-4 .. 4)\n\
m - manual mode (user plays both sides)\n\
q - quit this game (score not recorded)\n\
rb - read board from file\n\
wb - write board to file\n";
larsbrinkhoff commented 2 years ago

There are lots of hints in o1.c.

        {if (stcmp (username, "AS")) wizard=TRUE;
larsbrinkhoff commented 2 years ago

I'm looking at the PROG -IPAK-. It has OHACK, which says

        cprint ("Play Othello and see if you can beat the system!\n");
        if (!ask ("Have you played the Othello program before", 0))
                {if (!ask ("Do you know how to play Othello", 0))
                        type_file ("DSK:.INFO.;O INFO");
                else cprint ("Type ? for help.\n\
Moves are entered by typing the XY coordinates of the\n\
legal move followed by carriage return (no commas please).\n\
Type R<CR> to resign.\n");
                cprint ("--MORE--");
                utyi ();
                }

And then runs SYS2; TS O.

eswenson1 commented 2 years ago

Ahh. Nice find. So that is what the TS O in GAME uses.

larsbrinkhoff commented 2 years ago

The file AS; ARC -LOAD- has stinker files for many programs, including O. It says:

x c/clib
l ar3:c;blt
l random
l ismov1
l o1
l o2
l o3
l o4
l o5
l o6
l o7
l o8
l stdio
o ts o