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
How do you actually enter line 91 and 94 (hex 01…) in the HP-42s ?
thanks !
Hex 01 is the multiplication sign, refer to the ‚Character Table‘ in the HP-42S manual (page 288 et seq.).
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
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?
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!
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
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.
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?
Danke auch für diesen Link, habe gerade diese Woche einen Casio FX-602P erstanden 🙂
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.
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? 😉
Ich habe das Problem gelöst! Ich habe in den Alpha-Strings immer ein kleines x angegeben, anstatt dem Multiplikatorzeichen!
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!