[comp.sys.handhelds] HP28 memory-game

Y88.R-JANS@linus.ida.liu.se (Roger Jans) (02/05/90)

! Forwarded for Roger Jans (y88.r-jans@linus.ida.liu.se), who doesn't have   !
! access to comp.sys.handhelds.                                              !


                      Hello Mats!

  My name is Roger Jans. I'm a student in Y2c here at LiTH. 
I have come to know of your contacts with the HP28 - computer net
or whatever it's called and have taken the liberty to copy the files
on your HP28 - directory. To sort of pay my way I thought I'd give you
a program that I've made. Feel free to send it to the net or just dis-
card it. If you DO send it though, I would appreciate to be informed of 
any response to the program from the net members. You can just send me 
a mail on the address Y88.R-JANS@linus.ida.liu.se


-------------------------------------------------------------------------------

  The program allows you to play memory and consists of the following:
 

MEMORY {CHK1642}

<< CSTR 'BDSTR' STO
INIT RARR DUP 0 0 0
0 1 -> marr arr pch1
pch2 pair1 pair2
turn
  <<
     WHILE pair1
pair2 + 18 <
     REPEAT turn SHBD
arr CHCHK 'pch1' STO
arr marr pch1 turn 
DRCH arr marr turn
pch1 SHCH2 'pch2' 
STO arr pch1 GET arr 
pch2 GET arr marr
turn pch1 pch2 pair1 
pair2 PRCHK 'turn'
STO 'pair2' STO 
'pair1' STO 'arr'
STO 0 'pch1' STO 0
'pch2' STO
     END turn SHBD
pair1 pair2 WCHK 51
SF
  >>
>>

BDPT {CHK5529}

<< "" 1 5 
   START 0 PUTTE +
   NEXT 1 6
   START 1 3
     START 1110111
PUTTE +
     NEXT 0 PUTTE +
   NEXT 1 2
   START 1 5
     START 0 PUTTE +
     NEXT
   NEXT
>>

BELL1 {CHKE274}

<< 2000 .1 BEEP
>>

BELL2 {CHK9DFE}

<< 500 .1 DUP2 BEEP
.3 WAIT BEEP
>>

CD {CHK4045}

<< -> way
  << 
    WHILE way { } <>
    REPEAT way 1 GET
EVAL way 2 way SIZE
SUB 'way' STO
    END
  >>
>>

CDR0 {CHKA9CE}

<< 0 111110 1000101
1001001 1010001
111110 "" CRLOO
'DR0' STO
>>

CDR1 {CHK96DB}

<< 0 0 1000000
1111111 1000010 0 ""
CRLOO 'DR1' STO
>>

CDR2 {CHK3140}

<< 0 1000110 1001001
1001001 1010001
1100010 "" CRLOO 
'DR2' STO
>>

CDR3 {CHK2CCC}

<< 0 110110 1001001
1001001 1001001 
100010 "" CRLOO 
'DR3' STO
>>

CDR4 {CHKA055}

<< 0 10000 1111111
10010 10100 11000 ""
CRLOO 'DR4' STO
>>

CDR5 {CHK2BEC}

<< 0 111001 1000101
1000101 1000101
100111 "" CRLOO 
'DR5' STO

CDR6 {CHK4E8C}

<< 0 110000 1001001
1001001 1001010
111100 "" CRLOO
'DR6' STO
>>

CDR7 {CHK4158}

<< 0 11 101 1001
1110001 1 "" CRLOO
'DR7' STO
>>

CDR8 {CHKAD07}

<< 110110 PUTTE DR3 2
6 SUB + 'DR8' STO
>>

CDR9 {CHK4064}

<< 0 11110 101001
1001001 1001001 110
"" CRLOO 'DR9' STO
>>

CHCHK {CHK74A0}

<< -> arr
   << 1
      DO DROP REGCH
      UNTIL DUP arr
SWAP GET 0 <>
      END
   >>
>>

CORR? {CHKD505}

<< DUP DUP NUM 47 >
SWAP NUM 58 < AND
>>

CRLOO {CHK7738}

<< 1 6 
   START SWAP PUTTE +
   NEXT
>>

DR:00 {CHKA3B4}

<< 111110 1000101
1001001 1010001
111110 0 111110
1000101 1001001
1010001 111110 0 0 0
0 0 0 0 0 0 1101100
1101100 0 0 0
>>

DRCH {CHK1637}

<< -> arr marr pch
turn
  << FFL arr pch TAKE
     IF LPL pch POS 0
<> 
    THEN MLP 
      IF arr pch 6 -
GET 0 == THEN FFL marr
pch 6 - TAKE
      ELSE # 111b
# 111b # 111b
      END
    ELSE
      IF arr pch 6 +
GET 0 ==
      THEN FFL marr
pch 6 + TAKE MLP
      ELSE 
# 1110000b
# 1110000b
# 1110000b
      END 6 ROLL 6
ROLL 6 ROLL 
    END SPLOO PBL
pch GET RBDPT turn
SHBD
  >>
>>

DRPL {CHK1167}

<< 1000000 1111111
1000001 0 0 110 1001
1001 1001 1111111 0
0
>>

DSIZE {CHKD401}

<< ->STR DUP SIZE 1 -
3 SWAP SUB STR->
>>

FFL {CHKCB73}

{ { # 1b # 11b
# 111b } { # 111b
# 110b # 100b } {
# 111b # 10b # 111b
} { # 111b # 101b
# 111b } { # 1b
# 10b # 100b } {
# 100b # 10b # 1b }
{ # 0b # 111b # 0b }
{ # 10b # 10b # 10b
} { # 110b # 110b
# 110b } { # 10b
# 101b # 10b } {
# 101b # 10b # 101b
} { # 111b # 10b
# 0b } { # 0b # 10b
# 111b } { # 111b
# 1b # 111b } {
# 111b # 100b # 111b
} { # 111b # 100b
# 100b } { # 1b # 1b
# 111b } { # 101b 
# 101b # 101b } }

INIT {CHKBF2B}

<< CLLCD BIN 
"  Welcome to Memory"
33 CHR + 2 DISP
"Prepairing the board..."
3 DISP 51 CF
>>

IVIDEO {CHKA2B4}

<< # 11000011101111000b
SYSEVAL 
>> 

KEYIN {CHK5678}

<< 
  DO 
  UNTIL KEY
  END
>>

LPL {CHK941}

{ 7 8 9 10 11 12 19 
20 21 22 23 24 31 32
33 34 35 36 }

MLP {CHKC1E4}

<< # 10000b * SWAP
# 10000b * ROT
# 10000b *
>>

NEXTL {CHKAE6B}

<< DUP SIZE 136 - ABS
0 CHR -> a
  << a 1 3 ROLL
     START a +
     NEXT
  >> +
>>

NVIDEO {CHK52B5}

<<
# 11000011110001001b
SYSEVAL
>>

PBL {CHK1701}

{ 6 10 14 18 22 26 6
10 14 18 22 26 143
147 151 155 159 163
143 147 151 155 159 
163 280 284 288 292
296 300 280 284 288
292 296 300 }

PRCHK {CHKFC35}

<< -> arr marr turn
pch1 pch2 pair1
pair2
  <<
     IF == 
     THEN arr pch1 0
PUT pch2 0 PUT 'arr'
STO 1 
        IF turn 1 ==
        THEN BELL1
pair1 + DUP 'pair1'
STO
          IF DUP 10 <
          THEN 119
UDPAI
          ELSE ->STR
DUP 1 1 SUB STR-> 113
UDPAI 2 2 SUB STR-> 
119 UDPAI
          END
        ELSE BELL2
pair2 + DUP 'pair2'
STO 
          IF DUP 10 <
          THEN 256
UDPAI
          ELSE ->STR
DUP 1 1 SUB STR-> 250
UDPAI S 2 SUB STR-> 
256 UDPAI
          END
        END
      ELSE KEYIN DROP
arr pch1 marr RESTO
arr pch2 marr RESTO
        IF turn 1 ==
        THEN 2 'turn'
STO
        ELSE 1 'turn'
STO
        END
      END arr pair1
pair2 turn
  >>
>>

PUTTE {CHKADFB}

<< ->STR "#" SWAP +
STR-> B->R CHR
>>

RARR {CHKEDC5}

<< 15 SPEED { 6 6 } 0
CON 0 -> arr nr
  << 
    WHILE nr 18 <
    REPEAT 1 nr +
'nr' STO 1 2
      START 1
        DO DROP RAND
36 * CEIL DUP
        UNTIL arr
SWAP GET 0 ==
        END arr SWAP
nr PUT 'arr' STO
      NEXT
    END arr
  >>
>>

RBDPT {CHKBFCD}

<< -> bdpt pb
  << BDSTR 1 pb 1 -
SUB bdpt + BDSTR DUP
SIZE pb 3 + SWAP SUB
+ 'BDSTR' STO
  >>
>>

REGCH {CHK1746}

<< 0 -> pch
  << 
    WHILE pch 1 <
pch 36 > OR
    REPEAT KEYIN
      IF CORR?
      THEN STR->
'pch' STO KEYIN
        IF CORR?
        THEN STR->
pch 10 * + 'pch' STO
        ELSE DROP 0
'pch' STO
        END
      ELSE DROP
      END
    END pch 
  >> 
>>

RESTO {CHKD679}

<< -> arr pch marr 
  << # 111b # 111b 
# 111b
     IF LPL pch POS 0 
<> 
     THEN MLP 
       IF arr pch 6 -
GET 0 ==
       THEN FFL marr
pch 6 - TAKE 
       ELSE # 111b
# 111b # 111b
       END
     ELSE SWAP ROT
       IF arr pch 6 +
GET 0 == 
       THEN FFL marr
pch 6 + TAKE MLP
SWAP ROT
       ELSE
# 1110000b 
# 1110000b
# 1110000b
       END
     END SPLOO PBL
pch GET RBDPT
  >>
>>

SCCH {CHK47E6}

<< -> marr pch low
  << FFL marr pch 
TAKE
     IF low 
     THEN MLP FFL 
marr pch 6 - TAKE
     ELSE SWAP ROT
FFL marr pch 6 + 
TAKE MLP 6 ROLL 6 
ROLL 6 ROLL
     END SPLOO PBL
pch GET RBDPT
  >>
>>

SHBD {CHKF81D}

<< ->STR BDSTR ->LCD
IVIDEO 
" In turn to turn"
58 CHR + " Pl " +
SWAP + 4 DISP NVIDEO
>>

SHCH2 {CHKC518}

<< 0 -> arr marr turn
pch1 pch2
  << 
    DO arr CHCHK
'pch2' STO
    UNTIL pch1 pch2
<> 
    END
    IF PBL pch1 GET
PBL pch2 GET ==
    THEN marr pch2
pch1 pch2 < SCCH
    ELSE FFL arr
pch2 TAKE
      IF LPL pch2 
POS 0 <>
      THEN MLP
         IF arr pch2
6 - GET 0 <>
         THEN # 111b
# 111b # 111b
         ELSE FFL
marr pch2 6 - TAKE
         END
       ELSE SWAP ROT
         IF arr pch2
6 + GET 0 <>
         THEN 
# 1110000b
# 1110000b
# 1110000b
         ELSE FFL
marr pch2 6 + TAKE
MLP SWAP ROT
         END
       END SPLOO PBL
pch2 GET RBDPT
     END turn SHBD
pch2
  >>
>>

SPEED {CHKD299}

<< 'SPEED' -> s n
  << PATH RCWS 64
STWS s R->B # Fh AND
# 1000000000000h *             ( 12 zeros )
# C600302331DFFBCh 
OR {
# E60D51FFF00F1h
# C808461241131h } + 
HOME n RCL SWAP n
PURGE n STO # DFFB7h
SYSEVAL n STO STWS
CD
  >>
>>

SPLOO {CHK6F96}

<< 6 ROLL + DSIZE
SWAP 5 ROLL + DSIZE
ROT 4 ROLL + DSIZE
PUTTE SWAP PUTTE +
SWAP PUTTE +
>>

STR1 {CHK3AF1}

<< BDPT DRPL 1 1 STR2
DEPTH PICK 1 DEPTH 3
-
   START SWAP PUTTE +
   NEXT SWAP DROP
STR3
>>

STR2 {CHKF80B}

<< 11111110 0 0 0
11000000 11000000 0
0 1000000 1000000
1000000 1000000
10000000 0 1000000
1000000 1000000
10000000 11000000 0
0 0 11010000 1000000
0 0 10000000 1000000
1000000 1000000 0 0
1100000 10010000
10010000 10010000
11110000
>>

STR3 {CHKD928}

<< DR:00 0 1000000
1111111 1000010 0 0
0 0 DEPTH PICK 1 
DEPTH 3 -
   START SWAP PUTTE +
   NEXT NEXTL SWAP
DROP STR4
>>

STR4 {CHKA0DD}

<< BDPT + DR:00
1000110 1001001
1001001 1010001
1100010 0 0 0 DRPL
10000000 10000000
1111110 1 0 0 110
110 0 0 10 101 101
101 100 0 0 0 0 0
111 0 0 100 111 100
0 0 111 101 101 101
10 0 0 0 0 0 111
DEPTH PICK 1 DEPTH 3
- 
  START SWAP PUTTE +
  NEXT SWAP DROP DUP
1 137 SUB SWAP 138
274 SUB NEXTL + BDPT
+ DUP 1 274 SUB SWAP
275 411 SUB NEXTL +
DUP 'CSTR' STO 
'BDSTR' STO
>>

TAKE {CHK4A85}

<< GET GET LIST-> DROP
>>

UDPAI {CHKCCFF}

<< -> nr pb
  << BDSTR 1 pb 1 -
SUB { DR0 DR1 DR2
DR3 DR4 DR5 DR6 DR7
DR8 DR9 } nr 1 + GET
RCL + BDSTR pb 6 +
BDSTR SIZE SUB +
'BDSTR' STO
  >>
>>

WBELL {CHK55A1}

<< DUP2
   IF > 
   THEN 1 6
     START BELL1 .3
WAIT
     NEXT DROP2
   ELSE
     IF < 
     THEN 1 3
       START BELL2 .3
WAIT
       NEXT
     ELSE 1 4
       START BELL1 .3
WAIT BELL2 .3 WAIT
       NEXT
     END
   END
>>

WCHK {CHK257A} 

<< -> pair1 pair2
  << IVIDEO 
"     Winner" 58 CHR
+ " Pl " +
    IF pair1 pair2 >
    THEN "1" +
    ELSE 
      IF pair2 pair1 
> 
      THEN "2" +
      ELSE DROP
"     It's a draw"
      END
    END 4 DISP pair1
pair2 WBELL 51 SF
NVIDEO
  >>
>>

-------------------------------------------------------------------------------

These variables are created by the above given programs:

BDSTR {CHKC638}
CSTR {CHKC638}
DR0 {CHK3E0}, DR1 {CHKDB0}, DR2 {CHK1560}, DR3 {CHK7A0}, DR4 {CHK618},
DR5 {CHK7FC}, DR6 {CHK58}, DR7 {CHKED4}, DR8 {CHK2A0}, DR9 {CHKD00}

-------------------------------------------------------------------------------

These programs/variables can be PURGED after you have run/used them:

CDR0, CDR1, CDR2, CDR3, CDR4, CDR5, CDR6, CDR7, CDR8, CDR9

BDPT, CRLOO, DR:00, DRPL, STR1, STR2, STR3, STR4

WARNING: BEFORE you purge them, do the following:

1. Test the variables DR0 through DR9 by pressing "DR0 ->LCD", ..., 
   "DR9 ->LCD" and check that the numbers that are displayed in line 1 
   are similar to the ones you receive when you press the corresponding 
   number key. They should be if you have the checksums right. 
   If they are not, check that the program in question
   (CDR0, ..., CDR9) is correctly typed in.

2. Check that pressing "BDPT ..(wait a while).. ->LCD" results in 12 nice
   squares being shown in line 1.

3. Press "STR1..(wait quite a while)..  BDSTR ->LCD". The result should
   be this:

   x x x x x x                     Pl 1: 00
   x x x x x x             Pairs:  Pl 2: 00
   x x x x x x     
   x x x x x x
   x x x x x x
   x x x x x x

   with somewhat other proportions and a brace between "Pairs:" and the 
   following text. If you don't get this result there is most probably 
   something wrong in STR1, STR2, STR3 or STR4. CHECK THEM!
   
If everything seems right you can purge the above given programs/variables
to increase the amount of free memory.

-------------------------------------------------------------------------------

To be able to work out the checksums given after each program you need

CHK {CHK6A93}

<< RCLF STD HEX 64
STWS SWAP RCL ->STR
16 STWS DUP # 0h 1
ROT SIZE
  FOR j OVER j j SUB
NUM R->B XOR RL
  NEXT ->STR 3 OVER
SIZE 1 - SUB ROT
STOF SWAP DROP
>>

-------------------------------------------------------------------------------

                        How to play

  It's not at all difficult. 
The 36 cards, with the numbers 1 - 36 starting with 1 - 6 in the upper row
down to 31 - 36 in the lower row, each have a figure on their backside. 
There are 18 different figures and thus 18 pairs of cards. 
You and your friend are of course supposed to find the pairs by in turn 
turning two of the 36 cards and see if they match. If they do you may repeat
the procedure, else it's your friends turn.

To turn anyone of the cards numbered 1 to 9 you press 0 followed by the number
in question and to turn any of the rest you simply press the number.

If the two cards you choose don't match you (or more likely your friend) have
to turn them back again before another pair can be turned. You do that by
simply pressing any key EXCEPT ON.
If, on the other hand, the two cards DO form a pair their figures remain shown
and you can just go on turning another pair of cards.

NOTE: If you for example want to turn card number 12 and begin by pressing
the key 2 you can delete your choice of card by pressing any key except a 
number key or ON and then start over again by pressing the key 1 followed by
the key 2.

The current score is of course displayed continuosly and when all the 18 pairs
have been located the winner is announced and that's that.

-------------------------------------------------------------------------------

Any changes to make the set of programs smaller are of course very valuable
since it is rather huge. 
                  I hope you'll have some fun with it.
------------
--
Dept. of Electrical Engineering               matru@isy.liu.se(@uunet.uu.net)
University of Linkoping, Sweden       ...!uunet!(enea|sunic)!isy.liu.se!matru