
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
' =========================================================================== ' Demoprogramm: Turm von Hanoi - Rekursiver Algorithmus in Assembler ' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 29. 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 auch, wie mit Hilfe von Assembler ein ' Softwarestack auf der Open-Maxi realisiert werden kann. Außerdem werden ' Routinen des BASIC-Interpreters in Assembler nutzbar gemacht. ' Bei 15 Scheiben und 32767 nötigen Verschiebungen benötigt dieses Programm nur ' 0,14 Sekunden. Die Open-Maxi schafft demnach 234050 Verschiebungen pro Sekunde! ' 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 DEFINE bdebug 0 'für Zugriff in Assembler DIM a,b,c BYTE 'temporäre Bytevariablen DIM n BYTE 'Anzahl Scheiben DIM stackp WORD 'Stackpointer DIM t WORD 'Benötigte Zeit messen DIM anzahl WORD 'Anzahl Verschiebungen ' --- Hauptprogramm --------------------------------------------------------- ' Titel: PRINT "Turm von Hanoi (rekursiv in 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=15 '3 '8 'n ist die Anzahl der Scheiben stackp=stack 'Stackpointer initialisieren anzahl=0 IF debug THEN ? t=TIMER n=n a="A" b="B" c="C" ToH 'Aufruf der Subroutine t=TIMER-t ?:?"Ich habe"t"*20 ms Zeit für die"anzahl" Verschiebungen benötigt." END 'Zurück in den Hostmodus. Neustart mit RETURN-Taste. ' --- Subroutinen und Funktionen -------------------------------------------- ' Turm von Hanoi - Rekursiver Algorithmus in Assembler PROCEDURE ToH INLASM ' 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') ! lda n 'IF n=1 THEN ! cmpa #1 ! bne ToH_nnicht1 ! brclr bdebug,bitarray,ToH_nichtdebug 'IF debug THEN ! lda #1 'PRINT 1; ! jsr FwPush ! lda #30 'PRINT NUMBER ! jsr FwIntrprt ! lda a 'PUT a 'mit FwPutSCI würde es auch gehen ! jsr FwPush ! lda #32 'PUT ! jsr FwIntrprt ! lda b 'PUT b ! jsr FwPush ! lda #32 'PUT ! jsr FwIntrprt #ToH_nichtdebug ! ldhx anzahl 'ADD anzahl,1 ! aix #1 ! sthx anzahl ! rts 'RETURN #ToH_nnicht1 ! jsr pushnabc 'PUSH Variablen ! dec n 'ToH n-1, a, c, b ! lda b ! mov c,b ! sta c ! jsr ToH ! jsr popcban 'POP Variablen ! brclr bdebug,bitarray,ToH_nichtdebug2 'IF debug THEN ! lda n 'PRINT n; ! jsr FwPush ! lda #30 'PRINT NUMBER ! jsr FwIntrprt ! lda a 'PUT a ! jsr FwPush ! lda #32 'PUT ! jsr FwIntrprt ! lda b 'PUT b ! jsr FwPush ! lda #32 'PUT ! jsr FwIntrprt #ToH_nichtdebug2 ! ldhx anzahl 'ADD anzahl,1 ! aix #1 ! sthx anzahl ! dec n 'ToH n-1, c, b, a ! lda a ! mov c,a ! sta c ! jmp ToH 'inklusive 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 #-4 ! sthx stackp ! mov ,x+,n ! mov ,x+,a ! mov ,x+,b ! mov ,x+,c ! rts END PROCEDURE ' --- INCLUDE-Dateien ------------------------------------------------------- INCLUDE "om_fw.pro" 'INCLUDE-Datei für Firmwareroutinen ' --- Programmende --------------------------------------------------------- Passender Link: Offizielle Infosite zu den OM-Mikrocontrollern Meine Homepage: http://ccintern.dharlos.de |
| Antwort schreiben |