; ============ vbb ======================= ; re13j.asm === sou. re13i.asm ; 286-16 byte 296-16 byte ; ========= AVRASM2 v.2.1.3 ============== ; Purpose: Reanimator AVR tn13/24/25 ; ; Hard: file://D:/Work/13/.Re/Re_.spl7 ; Extra: Fuses tn13 : 0x61, 0xFF {Lo,Hi} ; Fuses tn85/44: 0x62, 0xDF {Lo,Hi} ; State: 2406/../2406 ; ========================== .nolist .include "tn13def.inc" .list ;***** Global Register Variables ;r0 used with lpm instruction .def zero =r1 .def cnt1 =r16 .def cnt0 =r20 .def Sign =r21 .def key_r =r22 .def tmp1 =r24 .def tmp2 =r25 ;r28,r29 used as Y register ;r30,r31 used as Z register ;***** Port Definitions ;DIRx = 1 - out ;PUPx = 1 - IN:pull-up on; OUT: =1 ;Port B: .equ SDI =PB0 .equ SII =PB1 .equ SDO =PB2 .equ SCI =PB3 .equ Pwr =PB4 ;***** Macros .macro ldiw ; load word immediate ldi @0L,low(@1) ldi @0H,high(@1) .endm .macro outi ; Output port immediate via tmp1 ldi tmp1,@1 out @0,tmp1 .endm ;***** Interrupt Vectors .cseg .org 0x0000 L0000: rjmp main rjmp OFF_ rjmp OFF_ rjmp OFF_ rjmp OFF_ rjmp OFF_ rjmp OFF_ rjmp OFF_ rjmp OFF_ rjmp OFF_ ; _reset: ; clr zero ; out SREG, zero ; initialized by reset ; outi SPL, RAMEND ; initialized by reset tn13/85 ;***** Main Loop: main: rcall PWR_ON rcall RD_SIGN ; OUT:Sign ;--- select_chip: clr key_r cpi Sign, 0x90 brne PC+2 ldi key_r, 0x10 ;/ rcall CHIP_ERASE rcall WRITE_FB rcall WRITE_FB+4 OFF_: rcall PWR_OFF ldi tmp1, 0x20 ; 0b00100000 : SE:Sleep Enable, mode Idle loop_sleep: out MCUCR, tmp1 ; control register sleep in tmp1, MCUCR ; Are you awake? Sleep! andi tmp1, 0xDF ; 0b11011111 mask SE<-0 rjmp loop_sleep ;---/ ;***** Subroutines ;----------------------* ; PowerON, delay, PB2 to the input PWR_ON: outi DDRB, 0x1F ; PB0-4 as output out PORTB, zero sbi PORTB, PWR ; PWR_ON rcall dly ; PB2 as input with pull-up cbi DDRB, SDO sbi PORTB, SDO ret ;----------------------* ; READ SIGNATURE BYTES ; OUT:Sing RD_SIGN: ldiw Z, RD_SGN*2 ldi cnt0, 4 rcall ld_byte ret ;----------------------* ; CHIP_ERASE CHIP_ERASE: ldiw Z, CH_ER*2 ldi cnt0, 3 rcall ld_byte rcall W_HSDO ldi cnt0, 1 rcall ld_byte ret ;----------------------* ; WRITE FUSES BITS: (by default) WRITE_FB: ldiw Z, FB_*2 add ZL, key_r adc ZH, zero ldi cnt0, 4 rcall ld_byte rcall W_HSDO ret ;----------------------* ; POWER OFF: PWR_OFF: out PORTB, zero rcall dly out DDRB, zero ret ;----------------------* ; LOAD_BYTE: ld_byte: lpm tmp1, Z+ lpm tmp2, Z+ rcall Tw_Rng dec cnt0 brne ld_byte ret ;----------------------* ; Twist Ring v7 ; IN: tmp1,tmp2 (INSTRUCTION), OUT=Sing Tw_Rng: mov r14, tmp1 ; data mov r15, tmp2 ; instruction ; clr Sign ; NEW clr cnt1 ldi tmp1, 0 rcall outPairBit loop_send: ;--- read SDO: lsl Sign sbic PINB, SDO sbr Sign, 1 ;/ mov tmp1, r15 rol tmp1 clr tmp1 rol tmp1 lsl tmp1 mov r25, r14 rol r25 clr r25 rol r25 or tmp1, r25 rcall outPairBit ;counter inc cnt1 cpi cnt1, 8 breq end_send ; / ; lsl r14 lsl r15 rjmp loop_send ; end_send: ldi tmp1, 0 rcall outPairBit ldi tmp1, 0 rcall outPairBit ret ; out: sync=0, sdo=push-up ;--- output pair bit ; v2 outPairBit: ; tmp1==serial input andi tmp1, 0x03 ;0b000 0 0 0 1 1 ori tmp1, 0x14 ;0b000 1 0 1 0 0 out PORTB, tmp1 ; PWR sci sdo sii sdi ; pulse SCI: sbi PORTB, SCI ; SCI set rcall dly+4 cbi PORTB, SCI ; SCI clear ret ;----------------------* ; dly ; (3F*3F)*4= 64764*0,1/1000=6,4mS dly: ldi tmp1, 0x3F mov tmp2, tmp1 sbiw tmp1, 0x01 brne PC-1 ret ;----------------------* ; Expect a high level at SDO W_HSDO: rcall dly sbis PINB, SDO rjmp PC-1 ret RD_SGN: .DB 0x08, 0x4C, 0x01, 0x0C, 0x00, 0x68, 0x00, 0x6C CH_ER: .DB 0x80, 0x4C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x4C FB_: .DB 0x40, 0x4C, 0xDF, 0x2C, 0x00, 0x74, 0x00, 0x7C .DB 0x40, 0x4C, 0x62, 0x2C, 0x00, 0x64, 0x00, 0x6C .DB 0x40, 0x4C, 0xFF, 0x2C, 0x00, 0x74, 0x00, 0x7C .DB 0x40, 0x4C, 0x6A, 0x2C, 0x00, 0x64, 0x00, 0x6C .org PC+0 IDF: .DB 20,20,20,20,">",">","r","e","1","3","j","<",20,20,20,20