⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 io.s

📁 SOSSE,最简单的实现smart卡的教学用程序 内有电路图
💻 S
字号:
; Simple Operating system for Smart cards; Copyright (C) 2002  Matthias Bruestle <m@mbsks.franken.de>;; This program is free software; you can redistribute it and/or modify; it under the terms of the GNU General Public License as published by; the Free Software Foundation; either version 2 of the License, or; (at your option) any later version.;; This program is distributed in the hope that it will be useful,; but WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License; along with this program; if not, write to the Free Software; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA;========================================================================; T=0 character I/O routines for 9600bps at 3.58 MHz;========================================================================#include <config.h>	.arch	ARCHIO_PIN=6PINB=0x16DDRB=0x17PORTB=0x18	.text	.global recbytet0, sendbytet0, delay1etu	.comm	direction,1,1;========================================================================; Wait loops.; 70 cycles delay for intrabit delayintrabitdelay:	ldi		r22, 21			; 1; Wait t17*3+7 cyclesdelay:	dec		r22				; 1	brne	delay			; 1/2	ret						; 4delay1etu:	ldi		r22, 121		; 1	rjmp	delay			; 2;========================================================================; Receive a byte with T=0 error correction.; result r25(=0):r24recbytet0:	push	r23				; 2 - getbit	push	r22				; 2 - delay	push	r21				; 2 - loop counter	push	r20				; 2 - parity counter	; Set direction bit, to indicate, that we received a byte	ldi		r22, 1	sts		direction,r22restartrecbyte:	; Setup IN direction	cbi		DDRB, 6			; 2	cbi		PORTB, 6		; 2; Wait for start bit.waitforstart:	; Bit begins here.	sbic	PINB, IO_PIN	; 1/2!	rjmp	waitforstart	; 2/0	sbic	PINB, IO_PIN	; 1/2! - Recheck for spike	rjmp	waitforstart	; 2/0	; Sample start bit	clr		r24				; 1	clr		r25				; 1 - Clear zero byte for ADC	ldi		r22, 31			; 1	rcall	delay			; 100	rcall	getbit			; 3 (16bit PC)	;brcs	waitforstart	; 1/2 - Go on, even if not valid a start bit?	nop						; 1 - For brcs; Receive now 9 bits	ldi		r21, 0x09		; 1	clr		r20				; 1	ldi		r22, 66			; 1	nop						; 1	nop						; 1rnextbit:	rcall	delay			; 205/202	rcall	getbit			; 3	add		r20, r23		; 1	clc						; 1	sbrc	r23, 0			; 1/2	sec						; 1/0	ror		r24				; 1	ldi		r22, 65			; 1	dec		r21				; 1	brne	rnextbit		; 1/2; Check parity	rol		r24				; 1 - We've rotated one to much	sbrc	r20, 0			; 1/2	rjmp	regetbyte		; 2/0	; Wait halve etu	ldi		r22, 76			; 1	rcall	delay			; 235 - Precise enough	clr		r25	pop		r20				; 2 - parity counter	pop		r21				; 2 - loop counter	pop		r22				; 2 - delay	pop		r23				; 2 - getbit	retregetbyte:	; Wait halve etu	ldi		r22, 76			; 1	rcall	delay			; 235 - Precise enough	; Set OUT direction	sbi		DDRB, 6			; 2	; Signal low	cbi		PORTB, 6		; 2	ldi		r22, 182		; 2	rcall	delay			; 553 - about 1.5 etu	rjmp	restartrecbyte	; 2;========================================================================; Read a bit.; Uses r23, r25; Returns bit in r23.0.; 5 cycles before first bit; 8 cycles after last bit.getbit:	clr		r23				; 1	clc						; 1	; At start + 112 cycles	sbic	PINB, IO_PIN	; 1/2	sec						; 1/0	adc		r23, r25		; 1	rcall	intrabitdelay	; 70	clc						; 1	; At start + 186 cycles	sbic	PINB, IO_PIN	; 1/2	sec						; 1/0	adc		r23, r25		; 1	rcall	intrabitdelay	; 70	clc						; 1	; At start + 260 cycles	sbic	PINB, IO_PIN	; 1/2	sec						; 1/0	adc		r23, r25		; 1	; Get second bit of the sum.	lsr		r23				; 1	ret						; 4	(with 16bit PC);========================================================================; Send a byte with T=0 error correction.; byte r25(=0):r24sendbytet0:	push	r22				; 2 - delay	push	r23				; 2 - parity counter	lds		r22,direction	tst		r22	breq	resendbytet0	rcall	delay1etu		;	rcall	delay1etu		;	; Clear direction bit, to indicate, that we sent a byte	ldi		r22, 0	sts		direction,r22resendbytet0:	; Set OUT direction	sbi		PORTB, 6		; 2	sbi		DDRB, 6			; 2	; Send start bit	cbi		PORTB, IO_PIN	; 2	ldi		r22, 119		; 1	rcall	delay			; 364	; Send now 8 bits	ldi		r25, 0x08		; 1	clr		r23				; 1snextbit:	ror		r24				; 1	brcs	sendbit1		; 1/2	cbi		PORTB, IO_PIN	; 2	rjmp	bitset			; 2sendbit1:	sbi		PORTB, IO_PIN	; 2	inc		r23				; 1bitset:	ldi		r22, 118		; 1	rcall	delay			; 361	nop						; 1	dec		r25				; 1	brne	snextbit		; 1/2	; Send parity	sbrc	r23, 0			; 1/2	rjmp	sendparity1		; 2	nop						; 1	nop						; 1	cbi		PORTB, IO_PIN	; 2	rjmp	delayparity		; 2sendparity1:	nop						; 1	sbi		PORTB, IO_PIN	; 2	nop						; 1	nop						; 1delayparity:	ldi		r22, 112		; 1	rcall	delay			; 343	; Stop bit	sbi		PORTB, IO_PIN	; 2	ldi		r22, 119		; 1	rcall	delay			; 364	; Set IN direction	cbi		DDRB, 6			; 2	cbi		PORTB, 6		; 2	; Look for error signal	clc						; 1	sbic	PINB, IO_PIN	; 1/2	sec						; 1/0	brcs	retsendbytet0	; 1/2	; Resend byte	; Bring byte to starting position	ror		r24				; 1	; Wait for end of error signalwaitforendoferror:	sbic	PINB, IO_PIN	; 1/2!	rjmp	waitforendoferror	; 2/0	; Wait then a halve etu	ldi		r22, 58			; 1	rcall	delay			; 181	rjmp	resendbytet0	; 2	; returnretsendbytet0:	ldi		r22, 116		; 1	rcall	delay			; 355	pop		r23				; 2 - parity counter	pop		r22				; 2 - delay	ret						; 4;========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -