
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
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 |