HP-42S – Türme von Hanoi

Programm für den HP-42S zum Lösen des Puzzles ‚Türme von Hanoi‘.

Bedienung

  • XEQ ‚HANOI‘
  • Anzahl Scheiben [1..7] eingeben und R/S drücken
  • Die Scheiben werden jetzt umgeschichtet
  • Wenn das Puzzle gelöst ist, R/S drücken für Neustart

Programm

(Jetzt auch auf Github verfügbar)

{ 262-Byte Prgm }

;----------------------------------------------------------
; Towers of Hanoi

001 § LBL "HANOI"

; ask user to enter number of disks and limit it to
; the supported range [1..7]

002   INPUT "DISKS"
003   7
004   X>Y?
005   X<>Y
006   1
007   X<Y?
008   X<>Y
009   STO "DISKS"

010   STO 08             ; current disk size

; smallest disk is moved to the right if number of disks
; is even, otherwise it is moved to the left

011   1
012   AND
013   LASTX
014   +
015   STO 07

; disk 8 represents the basement and acts as a sentinel
; when moving disks

016   8
017   STO 00
018   STO 01
019   STO 02

; initialize other data registers to zero

020   CLX
021   STO 03
022   STO 04
023   STO 05
024   STO 06
025   STO 09

; set default AGRAPH mode

026   CF 34
027   CF 35

; draw basement

028   CLLCD
029   -15
030   X<>Y
031   PIXEL
032   -16
033   X<>Y
034   PIXEL

; set up initial tower

035 § LBL 00
036   XEQ 04
037   XEQ 02
038   DSE 08
039   GTO 00

; start solving puzzle

040   TONE 3
041   TONE 1
042   GTO 08

;----------------------------------------------------------
; remove disk of size R08 from pile R09

043 § LBL 01

; erase disk

044   SF 34
045   XEQ 03

; decrease tower height

046   RCL 09
047   3
048   +
049   DSE IND ST X
050   CLX

; update tower configuration
; (4 bits per disk)

051   RCL IND 09
052   16
053   ÷
054   IP
055   STO IND 09

056   RTN

;----------------------------------------------------------
; put disk of size R08 onto pile R09

057 § LBL 02

; update tower configuration
; (4 bits per disk)

058   RCL IND 09
059   16
060   x
061   RCL 08
062   +
063   STO IND 09

; increase tower height

064   RCL 09
065   3
066   +
067   ISG IND ST X
068   CLX

; draw disk and return

069   CF 34

;----------------------------------------------------------
; draw topmost disk of size R08 on pile R09
; assumes ALPHA register contains disk pattern
; SF 34, CF 35 will erase the disk

070 § LBL 03

; compute display row
; r := 15 - 2h(p)

071   RCL 09
072   3
073   +
074   15
075   RCL IND ST Y
076   ENTER
077   +
078   -

; compute display column
; c := 35p + 31 - 2s

079   RCL 09
080   35
081   x
082   31
083   +
084   RCL 08
085   ENTER
086   +
087   -

; finally, draw the disk

088   AGRAPH
089   RTN

;----------------------------------------------------------
; build string for drawing disk of size R08

090 § LBL 04

; width of disk in pixels := 4s + 1

091   "x"                ; hex 01
092   RCL 08
093   LBL 05
094   |-"xxxx"           ; hex 01 01 01 01
095   DSE ST X
096   GTO 05

097   RTN

;----------------------------------------------------------
; main loop

098 § LBL 06

; determine the one and only possible move after the
; smallest disk has been moved

; get indices of piles next to smallest disk

099   RCL 06
100   1
101   +
102   3
103   MOD
104   STO 09

105   1
106   +
107   3
108   MOD
109   STO 10

; get sizes of topmost disks on these piles

110   RCL IND 09
111   15
112   AND
113   STO 08

114   LASTX
115   RCL IND 10
116   AND

; test which move is legal

117   X>Y?
118   GTO 07

; move disk from pile R10 to pile R09

119   STO 08
120   RCL 10
121   X<> 09
122   STO 10

; move disk from pile R09 to pile R10

123 § LBL 07
124   XEQ 04
125   XEQ 01
126   RCL 10
127   STO 09
128   XEQ 02

129 § LBL 08

; remove smallest disk

130   1
131   STO 08
132   RCL 06
133   STO 09
134   XEQ 04
135   XEQ 01

; move it to the next pile

136   RCL 06
137   RCL 07
138   +
139   3
140   MOD
141   STO 06
142   STO 09
143   XEQ 02

; puzzle solved if all disk are on target pile

144   RCL "DISKS"
145   RCL 05
146   X<Y?
147   GTO 06

148   TONE 5
149   TONE 8
150   END

Register Usage
--------------
R00   configuration of tower 1
R01   configuration of tower 2
R02   configuration of tower 3
R03   height of tower 1
R04   height of tower 2
R05   height of tower 3
R06   pile with smallest disk
R07   smallest disk move
R08   current disk
R09   current pile
R10   destination pile

Definitions
-----------
s     size of disk [1..7]
p     pile number [0..2]
h     height of pile p
w     width of disk in pixels
      w := 4s + 1
r     display row of topmost disk on pile p
      r := 15 - 2h
c     display column of topmost disk on pile p
      c := 35p + 31 - 2s

14 Kommentare

  1. Hex 01 is the multiplication sign, refer to the ‚Character Table‘ in the HP-42S manual (page 288 et seq.).

  2. Deine Seite gefällt mir sehr gut! Gestern habe ich meinen ersteigerten HP42S bekommen und gleich versucht ‚HANOI‘ abzutippen. An dieer Sequenz bin ich allerdings erst einmal gescheitert: |-„xxxx“

    Wie gibt man das ein?

    Und auch bei -15 habe ich Probleme. Wie gibt man das ein?

    Vor vielen, vielen Jahren habe ich auch einmal eine Story über meine Programmiervergangenheit ins Netz gestellt: http://www.steinlaus.de/articles/articles2.html

    Vielleicht interessiert es Dich!

    Liebe Grüße

    Tinkerpete

  3. Mittlerweile habe ich heraus gefunden, wie man das komische Zeichen eingibt. Erst ALPHA und dann einmal ENTER.

    Dafür eine neue Frage: Im Programm wird oft XY? verwendet, im HP-42S gibt es aber nur X/=Y?, also mit dem durchgestrichenen Gleichheitszeichen. Sind die identisch?

  4. Da war ich wohl zu spät, aber selber rausfinden macht doch mehr Spass! 🙂 ALPHA ENTER und 4 mal das Multiplikationszeichen stimmt. Für -15 brauchst du die +/- Taste.
    Deine Taschenrechner Story hat mir gut gefallen, da haben wir eine sehr ähnliche Karriere durchgemacht. Danke für den Link!

  5. Da bin ich mir jetzt nicht sicher, was du meinst. Vielleicht die Funktion X<>Y (exchange X and Y register)? Diese Taste findest du neben der ENTER Taste. An Verleichsoperatoren wird eigentlich nur X>Y? und X

  6. Da hatte ich wohl ein Brett vor dem Kopf! Ich habe vergessen, dass es ja diese Funktion gibt um X und Y Register auszutauschen! Ich habe es für eine Vergleichsfunktion gehalten.

    Vielen Dank für den Tipp!

    Hier noch ein Bericht von mir: http://www.steinlaus.de/articles/articles17.html

    Alles in allem fand ich den eigentlich für damalige Verhältnisse perfekt. Die Gründe dafür finden sich im Artikel.

    Aber der HP-42S ist auch eine Wucht, wie ich gerade entdecke.

  7. Dein Programm läuft jetzt. Trotzdem sieht die Darstellung nicht so aus wie bei Dir. Es scheint so, als ob die Scheiben etwas weiter unten gezeichnet werden und es gibt auch keinen Zwischenraum, wie bei Dir auf dem Bild. Den Code habe ich mittlerweile 3 Mal geprüft. Gibt es irgend eine Anweisung, die man leicht falsch interpretieren kann?

  8. Das hört sich so an, wie beim Zeichnen etwas schief läuft. Schau Dir nochmals den Code ab LBL 03 bis und mit LBL 04 an. Bis auf die Anweisungen unter LBL 04 sind eigentlich alle eindeutig.

  9. Ich habe es jetzt noch ein zweites Mal unter Free42 auf einem Galaxy Tab abgetippt – gleiches Problem! Im Gegensatz zu Deinem Bild gibt es bei der Ausführung keinen Zwischenraum bei den Scheiben und die Bodenplatte wird angeknabbert. Wann hast Du das Programm das letzte Mal abgetippt und ausprobiert? 😉

  10. Das Multiplikationszeichen hatte ich in meiner ersten Antwort bereits erwähnt, darum habe ich das (wohl zu voreilig) als Fehlerquelle ausgeschlossen. Aber Hauptsache, das Programm läuft jetzt!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.