Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Demoprogramm: Turm von Hanoi - Rekursiver Algorithmus mit etwas Assembler Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 29.01.2022 11:25)
 Als Antwort auf Turm von Hanoi von Dietmar - 29.01.2022 11:17
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station
' ===========================================================================
' 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
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

Bisherige Antworten: