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 in Assembler Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 29.01.2022 11:27)
 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 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
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

Bisherige Antworten: