Source file: /~heha/basteln/Haus/Telefon/Impulswahl→DTMF/mfv.zip/mfv2c/util.S

#define __SFR_OFFSET 0
#include <avr/io.h>
/****************************
 * Sonstige Hilfsfunktionen *
 ****************************/
// Gemeinsamer Anfang für PutNib und GetNib
27:	movw	ZL,r24		// Basiszeiger
	mov	r0,r22		// Index
	lsr	r0
	add	ZL,r0
	adc	ZH,r1
	ld	r24,Z
	sbrs	r22,0
	 swap	r24
	ret

.global _Z6PutNibPhhc,_Z6GetNibPKhh,_Z3x10h,_Z9clock_seth
_Z6PutNibPhhc:
	rcall	27b
	andi	r24,0xF0
	or	r24,r20		// Nibble (muss 0..F sein)
	sbrs	r22,0
	 swap	r24
	st	Z,r24
	ret

_Z6GetNibPKhh:
	rcall	27b
	andi	r24,0x0F
	ret

// Unterprogramme für CompareNumber
28:	movw	ZL,r24
	movw	XL,r22
29:	ld	r22,Z+
	ld	r23,X+
	eor	r22,r23
	ret
// Vergleichsroutine über R23 Nibbles
// PA: R22=Differenzwert, Z passend: Z=1 bei Gleichheit
// VR: X,Z,R0,R23,T-Flag (aber nicht R25:R24!)
6:	mov	r0,r23
	bst	r0,0
	lsr	r0		// Anzahl Bytes
	rjmp	7f		// zum Fuß springen
1:	rcall	29b
	brne	9f		// 2 Ziffern ungleich
	dec	r0
7:	brne	1b		// Schleife über Bytes
	brtc	9f
	rcall	29b
	andi	r22,0xF0	// letzte Ziffer vergleichen
9:	ret

.global _Z8CompareNPKhS0_,_Z11KillVorwahlPhPKh
// S0_ steht wohl für "Same as Argument 0"?
_Z8CompareNPKhS0_:	// R25:R24 = 1. Nummer, R23:R22 = 2. Nummer
	rcall	28b		// X und Z laden, R22 = *X^(R23=*Z)
	brne	8f		// Länge ungleich
	rcall	6b
8:	mov	r24,r22		// nach R24 schaffen für gcc-API
	ret

_Z11KillVorwahlPhPKh:	// R25:R24 = Nummer, R23:R22 = Vorwahl
	rcall	28b		// X und Z laden, R22 = *X^(R23=*Z)
	tst	r23		// Vorwahl hat Länge Null?
	breq	9b		// Nichts tun, Returnwert egal
	eor	r22,r23		// XOR rückgängig
	sub	r22,r23		// Differenz
	movw	r20,r22		// Länge der Vorwahl (R21) und Differenz (R20) retten
	dec	r22		// muss mindestens 1 Ziffer länger sein
	brmi	9b		// Länge Vorwahl >= Länge Nummer: Nichts tun, R24!=0
	rcall	6b		// Vergleich <R23> Nibbles
	brne	8b		// raus mit R24!=0
	clr	r23		// Zielziffer-Index
	movw	XL,r24
	st	X+,r20		// Neue Länge speichern (>=1)
4:	mov	r22,r21		// Quellindex ab Vorwahl-Länge
	inc	r21
	movw	r24,XL
	rcall	_Z6GetNibPKhh
	push	r20
	 mov	r20,r24
	 mov	r22,r23		// Zielindex ab Null
	 inc	r23
	 movw	r24,XL
	 rcall	_Z6PutNibPhhc
	pop	r20
	dec	r20
	brne	4b
	clr	r24		// Treffer anzeigen
	ret

_Z3x10h:
	lsl	r24
	mov	r0,r24
	lsl	r24
	lsl	r24
	add	r24,r0
	ret

_Z9clock_seth:
	cli
	ldi	r25,0x80
	out	CLKPR,r25
	out	CLKPR,r24
	sei
	ret
Detected encoding: UTF-80