INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' Demoprogramm: Turm von Hanoi - Rekursiver Algorithmus mit etwas Assembler ' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 28. Januar 2022 ' =========================================================================== ' Dieses Programm nutzt einen Algorithmus von der folgenden Webside: ' https://www.delftstack.com/de/howto/python/tower-of-hanoi-python/ ' Dieses Beispielprogramm demonstriert, wie mit Hilfe von Assembler ein ' Softwarestack auf der Open-Maxi realisiert werden kann. ' Bei 12 Scheiben und 4095 nötigen Verschiebungen benötigt dieses Programm in ' der interpretierten Variante mit etwas Assembler 0,56 Sekunden. Wird es mit ' dem echten BASIC-Compiler OCBASR32 kompiliert, benötigt es nur 0,22 Sekunden. ' An dieser Stelle möchte ich mich bei Dirk von "das |_ Team" und bei Norbert ' für ihre Unterstützung bedanken. In Memoriam Norbert Klein. ' --- Definitionen ---------------------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi DEFINE stack &h2aa 'Buffer an 1. Adresse hinter dem USER-RAM DIM bitarray BYTE 'ein Bitarray DIM debug BIT[1] OF bitarray 'ist HIGH, wenn Debugging aktiv DIM a,b,c BYTE 'temporäre Bytevariablen DIM n BYTE 'Anzahl Scheiben DIM stackp WORD 'Stackpointer DIM maxstack WORD 'Stackpointer überwachen DIM t WORD 'Benötigte Zeit messen DIM anzahl WORD 'Anzahl Verschiebungen ' --- Hauptprogramm --------------------------------------------------------- ' Titel: PRINT "Turm von Hanoi (rekursiv mit etwas Assembler)" PRINT "=============================================" ' Initialisierungen: PrintSpc=ON 'Bei PRINT dezimale Zahlen mit führendem Leerzeichen ausgeben End2Host=ON 'Bei Programmende (siehe END) gleich in den Host-Modus wechseln debug=OFF 'ON 'OFF 'Anzeige aller Schritte ' Das Hauptprogramm: n=12 '12 '3 '8 'n ist die Anzahl der Scheiben stackp=stack 'Stackpointer initialisieren maxstack=0 anzahl=0 IF debug THEN ? t=TIMER ToH n,"A","B","C" 'Aufruf der Subroutine t=TIMER-t ?:?"Ich habe"t"*20 ms Zeit für die"anzahl" Verschiebungen benötigt." ?:?"Es wurden"maxstack-stack" Byte Stack beansprucht." END 'Zurück in den Hostmodus. Neustart mit RETURN-Taste. ' --- Subroutinen und Funktionen -------------------------------------------- ' Turm von Hanoi - Rekursiver Algorithmus PROCEDURE ToH(n,a,b,c) 'COMPILE ' def ToH(n , A, B, C): ' if n==1: ' print("Disk 1 from",A,"to",B) ' return ' ToH(n-1, A, C, B) ' print("Disk",n,"from",A,"to",B) ' ToH(n-1, C, B, A) ' ' ToH(3,'A','B','C') IF n=1 THEN IF debug THEN PRINT "Disk 1 from "; PUT a PRINT " to "; PUT b PRINT "." END IF ADD anzahl,1 maxstack=MAX(maxstack,stackp) RETURN END IF SYS pushnabc ToH n-1, a, c, b SYS popcban IF debug THEN PRINT "Disk"n" from "; PUT a PRINT " to "; PUT b PRINT "." END IF ADD anzahl,1 ToH n-1, c, b, a RETURN END PROCEDURE ' Softwarestack: Die Variablen n, a, b und c auf Stack speichern PROCEDURE pushnabc INLASM ' POKE stackp,n ' ADD stackp,1 ' POKE stackp,a ' ADD stackp,1 ' POKE stackp,b ' ADD stackp,1 ' POKE stackp,c ' ADD stackp,1 ! ldhx stackp ! mov n,x+ ! mov a,x+ ! mov b,x+ ! mov c,x+ ! sthx stackp ! rts END PROCEDURE ' Softwarestack: Die Variablen c, b, a und n vom Stack holen PROCEDURE popcban INLASM ' SUB stackp,1 ' c=PEEK(stackp) ' SUB stackp,1 ' b=PEEK(stackp) ' SUB stackp,1 ' a=PEEK(stackp) ' SUB stackp,1 ' n=PEEK(stackp) ! ldhx stackp ! aix #-1 ! lda ,x ! sta c ! aix #-1 ! lda ,x ! sta b ! aix #-1 ! lda ,x ! sta a ! aix #-1 ! lda ,x ! sta n ! sthx stackp ! rts END PROCEDURE ' --- Programmende --------------------------------------------------------- Passender Link: Offizielle Infosite zu den OM-Mikrocontrollern Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |