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 

 Hilfsroutinen Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von GeKü - 12.11.2010 11:30)
GeKü nutzt:  Open-Mini, Open-Midi, Open-Macro
Hallo Dietmar,

anbei - zumindest für mich - nützliche Hilfsprogramme zu Inline-Assemblerprogrammierung:
Beste Grüße, GeKü

'Testroutine
   DEFINE ab BYTE[1]
 #main
    For ab=0 to 255     ' Demo, zeigt, dass alles von 0-255 funktioniert
       GOSUB Ausgab
    next
    ab=99
    GOSUB Ausgab2
#Faertsch
GOTo Faertsch

  PROC Ausgab INLASM
  ! LDA ab
  ! JSR FWPutDEZ
  ! JSR LF_CR
  ! JSR FwPrtDez

  ! JSR FWPutBin
  ! JSR LF_CR
  ! JSR FwPrtBin

  ! JSR FWPutHex
  ! JSR LF_CR
  ! JSR FwPrtHex

  ! JSR FwPrtAdA
  ! RTS

 PROC Ausgab2 INLASM  ' Demo, zeigt, dass PC weiterzählt und A unverädert bleibt
    ! LDA ab
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! JSR FwPrtAdA
    ! RTS






'--------------------------------------------------------------------------------------------------
'                      Hilfsprogramme zur Inline-Assemblierung
'
'--------------------------------------------------------------------------------------------------
' FwPrtAdA: Ausgabe des Programmcounters as Hex- und des Akkus als Binär&Dezimalzahl
'--------------------------------------------------------------------------------------------------
  #FwPrtAdA
   ! PSHA                 ' rette Akku
   ! LDA $2,SP
   ! JSR FwPutHex
   ! LDA $3,SP
   ! JSR FwPutHex
   ! LDA #":"
   ! JSR FWPutSCI
  ! PULA
   ! PSHA
   ! JSR FWPutBin
   ! LDA #32
   ! JSR FWPutSCI
  ! PULA
  ! JSR FWPrtDez
  ! RTS

'----------------------------------------------------------------------------------------------------
' FwPrtHex: Print&Put - HexAusgabe eines Akku-Wertes, keine Änderung von Registern
'----------------------------------------------------------------------------------------------------
 #FwPrtHex         'Wert im Akku als Hexadezmalzahl im Terminalprogramm ausgeben mit LF&CR
 ! PSHA            ' A retten
 ! JSR FwPutHex    ' Hexzahl ausgeben
 ! JSR LF_CR       ' LF & CR
 ! PULA            ' A retten
 ! RTS
#FwPutHex      'auszugebende Hex-Zahl in A
! PSHA                 ' Rette A
 ! PSHH               ' Rette H
  ! PSHX               ' Rette X
   ! LDX #16
   ! CLRH              ' Lösche H, da nur das byte in A
   ! DIV                ' dividiert werden soll mit dem Divisor in X
    ! PSHH              ' H-Ergebnis retten
    ! JSR HEX_Ausgab
   ! PULA               ' Bringe H in den Akku
   ! JSR HEX_Ausgab
  ! PULX               ' Bringe H:X wieder
 ! PULH               ' in alten Zustand
! PULA
! RTS

   #HEX_Ausgab           ' Wert in Akku, gibt entsprechende HEX-Zahl aus
    ! ADD #48            ' Akku + "0" => ASCII "0-9"
    ! CMP #58             ' wenn >= 10   dann Set Carry
    ! BGE  AusgabA_F     ' if (Accumulator) >= (Memory), then branch
     ! PSHX
     ! JSR FWPutSCI       ' gibt Ziffer 0-9 aus
    ! PULX
    ! BRA RTS_HEX_Ausgab
    #AusgabA_F
    ! ADD #7             ' 48+7=55=> 10+55 = ASCII-A
     ! PSHX
     ! JSR FWPutSCI       ' gibt "A.. -  .. F" aus
    ! PULX
     #RTS_HEX_Ausgab
    ! RTS

' ----------------------------------------------------------------------------------------------------
'   Subroutine: Dezimalausgabe  als Print und Put-Wert
'-----------------------------------------------------------------------------------------------------
 #FwPrtDez             ' mit Line Feed & Carriage Return
  ! PSHA            ' A retten
  ! JSR FwPutDez    ' Dezimalzahl ausgeben
  ! JSR LF_CR       ' LF & CR
 ! PULA            ' A retten
 ! RTS
 #FwPutDez    'Wert im Akku als Dezimalzahl im Terminalprogramm ausgeben
  ! PSHH                ' Rette H
   ! PSHX               ' Rette X
    ! PSHA              ' Rette Akku
    ! CMP #100           ' Set if the memory-value is larger than the unsigned value of the accumulator; cleared otherwise
    ! BCC  A100_255      ' if (Accumulator) > 99 GOTO
    ! CMP #10
    ! BCC  A10_99        ' if (Accumulator) > 9 GOTO
    ! BRA A0_9
    #A100_255
    ! LDX #100
    ! JSR Dez_CLRH_DIV_PUT
    #A10_99
    ! LDX #10
    ! JSR Dez_CLRH_DIV_PUT
    #A0_9
    ! ADD #48             '
     ! PSHH
     ! JSR FWPUTSCI
    ! PULA
   ! PULA
  ! PULX
 !  PULH
 ! RTS               ' Rette Akku

 #Dez_CLRH_DIV_PUT  ' DIV: Divides a 16-bit dividend (H:A) by an 8-bit divisor contained in X
    ! CLRH          ' Clean the conconated H
    ! DIV           ' The quotient is placed in A, and the remainder is placed in H. The divisor
    ! ADD #48       ' The quotient,  reamainder and divisor are placed in A, H and X.
     ! PSHH             'rette Rest
     ! JSR FWPUTSCI     ' Gib Akku aus
    ! PULA              ' übergib Rest in den Akku
    ! RTS
'-----------------------------------------------------------------------------------------------------
' Subroutine: Print&Put - Binaerausgabe eines Akku-Wertes, keine Änderung von Registern
'-----------------------------------------------------------------------------------------------------
 #FwPrtBin   'Wert im Akku als Binaerzahl im Terminalprogramm ausgeben mit LF&CR
 ! PSHA            ' A retten
 ! JSR FwPutBin    ' Binärzahl ausgeben
 ! JSR LF_CR       ' LF & CR
 ! PULA            ' A retten
 ! RTS
 #FwPutBin    'Wert im Akku als Binaerzahl im Terminalprogramm ausgeben ohne LF&CR
   ! PSHX                      ' X retten
    ! PSHA                     ' Akku retten, für terminale Restauration
    ! PSHA                     ' Akku retten
    ! LDA #"&"
    ! JSR FwPutSci             ' OMAC-Def-Datei
    ! LDA #"B"                 ' "&B" ausgeben
    ! JSR FwPutSci             '
   ! PULA                     ' Akku restaurieren
   ! LDX #8                   ' Zähler
   #FwPUTBin_Loop
    ! PSHX                     ' Rette X vor FwPutSci
    ! ROLA                     ' links Shift, setzt Cary, restauriert A
     ! PSHA                     ' Rette Akku
     ! LDA #0                  ' Setze Akku auf 0 ohne Carry-Änderung
     ! ADC #48                   ' Addiere Carry dazu
     ! JSR FwPutSci             ' gibt Ziffer 0 o. 1 aus
    ! PULA                     ' restauriere Akku
   ! PULX                     ' restauriere X
   ! DBNZX FwPUTBin_Loop
   '! JSR LF_CR                 ' Zeilenvorschub&Zeilenanfang
   ! PULA
   ! PULX                     'Bringe X wieder in alten Zustand
   ! RTS
'---------------------------------------------------------------------
'     Zeilenvorschub & Wagenrücklauf (Line Feed & Carriage Return)
'----------------------------------------------------------------------
    #LF_CR
    ! PSHA
    ! LDA #10                  ' Line Feed
    ! JSR FwPutSci             '
    ! LDA #13                  ' Cariage Return
    ! JSR FwPutSci             '
   ! PULA
   ! RTS

 Antwort schreiben

Bisherige Antworten: