; Datei: arithmetik_header.asm ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Ganzzahlarthmetik mit den Registern ; R2 : Stellenanzahl beim Dividieren ; R6 : Stellenzähler beim Multiplizieren ; R3,4,5 : Akkumulator B ; R6,7,8 : Akkumulator A ; R2,3,4,5: Ergebnis bei 16-Bit-Multiplikation ; Weiter werden __keine__ Register verändert ; kleinster Wert 0 ; maximaler Wert 256^3 -1 = 16.777.215 bei Addition, Subtraktion und Division ; maximaler Wert 256^4 -1 = 4.294.967.295 bei Multiplikation ; ; Interface ; ================================================================ ; bmal10: Multipliziert die Zahl in Akku B mit 10 ; bmal2: Multipliziert die Zahl in Akku B mit 2 ; addba: Addiert die Akkuinhalte A und B -> B ; addbtemp1: Addiert den Inhalt von temp1 mit Akku B ; bdiva: akku b enthält den dividenden dann den quotienten ; akku a enthält den divisor und dann den rest ; die register r9:r11 dienen als zwischenspeicher (keine Veränderung) ; r2 ist der Zähler für die durchgänge ; R2 wird aus temp2 geladen, das die anzahl zu verarbeitender Stellen vorgibt ; asc2bin: erzeugt aus einer HEX-Ziffer den Nibble-wert ; übergabe in temp2 als Ascii ; rückgabe in temp2 als hexwert (lownibble) ; ascnib: erzeugt aus einem Hex-Nibble das zugehörige Ascii-Zeichen ; Übergabe im Lownibble von temp1 als hex-wert ; rückgabe in temp1 als ascii-zeichen ; ascbyte: macht aus einem Byte (Hexwert in temp1) zwei Ascii-Zeichen ; Rückgabe in temp1:temp2 (H;L) ; bin2asc: akku b enthält die dazustellende Zahl (3 Bytes) oder den quotienten ; akku a enthält nach dem Divisionsaufruf im lowbyte den 10er-Rest ; Die Zahl wird in einen 0-terminierten ascii-string transformiert ; und in buffer abgelegt. Die niederwertigste Ziffer steht am Anfang! ; die Anzahl von Stellen (ohne die Schluss-Null) wird in temp2 zurückgegeben ; mulx16 Softwaremultiplikation R5:R4:R3:R2 <- R25:R24 * R23:R22 ; MSB : LSB <- MSB:LSB * MSB:LSB ; divbr2_1024 Softwaredivision R5:R4:R3 <- R5:R4:R3:R2 / 1024 ; ; ================================================================ ; .def stellen = r2 ; Zähler für eingegebene Zeichen im Zeichen-Buffer .def lb = r3 .def mb = r4 .def hb = r5 ; Akkubytes für die Verarbeitung von Ganzzahlen .def la = r6 .def ma = r7 .def ha = r8 ; Akkubytes für die Verarbeitung von Ganzzahlen .def akkub_l = r3 .def akkub_m = r4 .def akkub_h = r5 .def akkua_l = r6 .def akkua_m = r7 .def akkua_h = r8 ; .dseg buffer: .byte 20 ; Eingabepuffer im SRAM-Bereich ;