📄 90stest.asm
字号:
;====== 'V' - Return Software Version ======================================
w1:
cpi u_data,'V' ; 'V' Return software version
brne w2
table SW_Ver
rcall put_string ; put software version
rjmp waitcmd
;====== 'v' - Return Hardware Version ======================================
w2:
cpi u_data,'v' ; 'v' Return hardware version
brne w3
table HW_Ver
rcall put_string ; put hardware version
rjmp waitcmd
;====== 't' - Show Supported Devices =======================================
w3:
cpi u_data,'t' ; 't' Show supported devices
brne w4
table Dev_S
rcall put_table ; put supported devices codes
table Dev_M
rcall put_table ; put supported devices codes
ldi u_data,0x00 ; putc(0x00) - end of device list
rcall putc
rjmp waitcmd
;====== 'p' - Return Programmer Type =======================================
w4:
cpi u_data,'p' ; 'p' Return programmer type
brne w5
ldi u_data,'S' ; putc('S') - serial programmer
rcall putc
rjmp waitcmd
;====== 'a' - Return autoincrement address support =========================
w5:
cpi u_data,'a' ; 'a' Return address auto increment
brne w51
ldi u_data,'Y' ; putc('Y') - supports autoinc
rcall putc
rjmp waitcmd
;====== 'M' - Return enhanced Mode support (Note 14) ========================
w51:
; cpi u_data,'M' ; 'M' Return enhanced mode Support
; brne w52
; ldi u_data,'Y' ; putc('Y') - supports enhanced Mode
; rcall putc
; rjmp waitcmd
;====== 'i' - Return Chip ID (Note 14) ======================================
w52:
cpi u_data,'i' ; 'i' Return Chip ID
brne w53
table ChipID
rcall put_string ; put Chip ID string
ldi u_data,0x0a ; putc(LF)
rcall putc
rjmp put_ret
;====== 'b' - Return Block write Mode support (Note 17) ========================
w53:
cpi u_data,'b' ; 'b' Return enhanced mode Support
brne w6
ldi u_data,'Y' ; putc('Y') - supports enhanced Mode
rcall putc
ldi u_data,high(BUFSIZE); putc((BUFSIZE>>8) & 0xff);
rcall putc
ldi u_data,low(BUFSIZE) ; putc(BUFSIZE&0xff);
rcall putc
rjmp waitcmd
;====== 'x' - Set LED ======================================================
w6:
cpi u_data,'x' ; 'x' Set LED (LED off or green)
brne w61
rcall getc ; get parameter
set_LED
rjmp put_ret
;====== 'y' - Clear LED ====================================================
w61:
cpi u_data,'y' ; 'y' Clear LED (LED on or red)
brne w7
rcall getc ; get parameter
clr_LED
rjmp put_ret
;===========================================================================
; We require that the device code be selected before any of the other commands
w7:
table Dev_S ; load pointer
rcall bel_table
brcc w71 ; device belongs to table
table Dev_M
rcall bel_table
brcc w71 ; device belongs to table
rjmp put_err ; not match, goto put_err();
;====== 'P' - Enter Programming Mode =======================================
w71:
cpi u_data,'P' ; 'P' Enter programming mode
breq w70
rjmp w8
w70:
clr_LED ; LED on
catch_ports ; catch ports
clr_SCK ; clear SCK
pas_RESET ; set RESET passive
ldi temp1,50 ; delay 50mS;
rcall delay
act_RESET ; set RESET active
ldi temp1,50 ; delay 50mS;
rcall delay
ldi s_data,0xac
rcall wrser ; wrser(0xac) SPI write (byte 1)
ldi s_data,0x53
rcall wrser ; wrser(0x53) SPI write (byte 2)
; SPI Synchronization (fix!)
cpi device,0x20 ; if ( (device >= 0x20) && (device <= 0x7F) )
brlo s2
tst device
brmi s2
ldi temp3,32 ; count = 32;
s1: rcall rdser ; SPI read (byte 3)
cpi s_data,0x53 ; if (rdser == 0x53)
breq s3 ; break
ldi s_data,0x00
rcall wrser ; wrser(0x00) SPI write (byte 4)
pulse_SCK ; pulse SCK
ldi s_data,0xac
rcall wrser ; wrser(0xac) SPI write (byte 1)
ldi s_data,0x53
rcall wrser ; wrser(0x53) SPI write (byte 2)
dec temp3 ; count-1
brne s1 ; loop
rjmp s3 ; else
s2: ldi s_data,0x00
rcall wrser ; wrser(0x00) SPI write (byte 3)
s3: tst device
brmi s4 ; S89 device
ldi s_data,0x00
rcall wrser ; wrser(0x00) SPI write (byte 4)
s4: ldi temp1,4 ; delay 4mS;
rcall delay
rjmp put_ret
;====== 'c' - Write Program Memory, Low Byte ===============================
w8:
cpi u_data,'c' ; 'c' Write program memory, low byte
brne w9
rcall getc ; get data byte
w8b: ldi s_data,0x40
mov pol_cmd,s_data ; save command for polling
tst device
brmi w81 ; S89 device
rcall wrser ; wrser(0x40) SPI write (byte 1)
mov s_data,addrh
rjmp w82
w81:
mov s_data,addrh ; s_data = (addrh << 3) | 0x02;
rcall shift_s_data3
ori s_data,0x02
w82:
rcall wrser ; wrser(addrh) SPI write (byte 2)
mov s_data,addrl
rcall wrser ; wrser(addrl) SPI write (byte 3)
mov s_data,u_data
rcall wrser ; wrser(u_data) SPI write (byte 4)
mov p_data,u_data ; save data for polling
mov pol_al,addrl ; save address for polling
mov pol_ah,addrh
tst device
brpl w83
adiw addrl,1 ; Auto increment address for S89 device
w83:
rjmp wait_S ; write FLASH delay
;====== 'C' - Write Program Memory, High Byte ==============================
w9:
cpi u_data,'C' ; 'C' Write program memory, high byte
brne w92
rcall getc ; get data byte
w9a: tst device
brmi w91 ; S89 device
ldi s_data,0x48
mov pol_cmd,s_data ; save command for polling
rcall wrser ; wrser(0x48) SPI write (byte 1)
mov s_data,addrh
rcall wrser ; wrser(addrh) SPI write (byte 2)
mov s_data,addrl
rcall wrser ; wrser(addrl) SPI write (byte 3)
mov s_data,u_data ; wrser(u_data) SPI write (byte 4)
rcall wrser
mov p_data,u_data ; save data for polling
mov pol_al,addrl ; save address for polling
mov pol_ah,addrh
adiw addrl,1 ; Auto increment address
rjmp wait_S ; write FLASH delay
w91:
rjmp put_err ; S89 device have byte wide program memory!
;====== 'B' Block Write Memory (see Note 17) ======================
w92:
cpi u_data,'B' ; 'B' Block Write Program Memory
breq w92a
rjmp w10
w92a:
rcall getc ; get count High Byte
tst u_data
breq w92b
ldi u_data,1
rjmp put_err
w92b:
rcall getc ; get count Low Byte
cpi u_data,BUFSIZE+1 ; check maximum count
brlo w92c
ldi u_data,2
rjmp put_err
w92c:
mov Bcnt1, u_data ; ignore BUFSIZE high Byte (must be 0 here)
mov Bcnt2, u_data
rcall getc ; get Memory type to write
mov Memtype,u_data ; Flag for Memtype
clr XH
ldi XL, RAMSTART ; set X pointer to SRAM begin
w93:
rcall getc ; get data until Bcnt1 is reached
st X+, u_data ; store data to SRAM
dec Bcnt1
brne w93
clr XH
ldi XL, RAMSTART ; set X pointer to SRAM begin
ldi temp3,1
mov B_Mode,temp3 ; B_Mode != 0
mov u_data,Memtype ; restore Memtype
cpi u_data,'F' ; 'F' Flash Memory ist to write
breq w94a
cpi u_data,'E' ; 'E' eeprom Memory ist to write
breq w94 ; Entry Point for Data Memory Block write
ldi u_data,3
rjmp put_err
w94: ; write Data (EEPROM) Memory
ld u_data,X+
rcall eeprom_write
dec Bcnt2
brne w94
rjmp put_ret
;Entry Point for Flash Block write
w94a:
table Dev_M
rcall bel_table
brcc w95 ; device belongs to table
rjmp w96 ; not match, goto "non Paged" Mode
w95: ; Entry Point for AVRProg Block Flash write
ldi s_data,0x40 ; write low byte
rcall spi123
ld s_data, X+
rcall wrser ; wrser(s_data) SPI write (byte 4)
ldi s_data,0x48 ; write high byte
mov pol_cmd,s_data ; save command for polling
rcall spi123
ld s_data, X+
mov p_data,s_data ; save data for polling
mov pol_al,addrl ; save address for polling
mov pol_ah,addrh
rcall wrser ; wrser(u_data) SPI write (byte 4)
adiw addrl,1 ; Auto increment address
dec Bcnt2
breq w95b
dec Bcnt2
breq w95b
tst B_Mode
breq w95 ; Loop for "Block Mode Commands" see Note 16
dec Bcnt3 ; count Bytes for Pagesize
brne w95
w95b:
tst B_Mode
brne w95c
rjmp put_ret
w95c:
dec Bcnt3 ; Bcnt3 will be set correct after write
ldi s_data,0x4c ; write Memory Page
rcall wrser ; wrser(0x4c) SPI write (byte 1)
mov s_data,pol_ah ; last written Adress is in Page to be programmed!
rcall wrser ; wrser(addrh) SPI write (byte 2)
mov s_data,pol_al ; last written Adress is in Page to be programmed!
rcall wrser ; wrser(addrl) SPI write (byte 3)
ldi s_data,0x00
rcall wrser ; wrser(0x00) SPI write (byte 4)
mov Bcnt3,Pagewords ; reload Counter für Pagesize
rjmp wait_M
;#@KL4 test for 89S8252 Device
w96: ; Non Page Mode Flash write
tst device
brmi w96b ; S89 device
ld p_data, X+ ; load byte to Poll data
cpi p_data,0xFF ; if (p_data == 0xFF)
breq w961 ; skip burning
ldi s_data,0x40 ; write low byte
mov pol_cmd,s_data ; save command for polling
rcall spi123
mov s_data,p_data ; reload data from Poll data
rcall wrser ; wrser(s_data) SPI write (byte 4)
mov pol_al,addrl ; save address for polling
mov pol_ah,addrh
rcall Bws_pol
w961:
dec Bcnt2
ld p_data, X+ ; load byte to Poll data
cpi p_data,0xFF ; if (p_data == 0xFF)
breq w962
ldi s_data,0x48 ; write high byte
mov pol_cmd,s_data ; save command for polling
rcall spi123
mov s_data,p_data ; reload data from Poll data
rcall wrser ; wrser(u_data) SPI write (byte 4)
w96a: mov pol_al,addrl ; save address for polling
mov pol_ah,addrh
rcall Bws_pol
w962:
adiw addrl,1 ; Auto increment address
dec Bcnt2
brne w96
rjmp put_ret ; reply
w96b: ; Code for 89S8252
; ldi s_data,0x40
; mov pol_cmd,s_data ; save command for polling
mov s_data,addrh ; s_data = (addrh << 3) | 0x02;
rcall shift_s_data3
ori s_data,0x02
rcall wrser ; wrser(addrh) SPI write (byte 1)
mov s_data,addrl
rcall wrser ; wrser(addrl) SPI write (byte 2)
ld s_data, X+
mov p_data,s_data ; save data for polling
rcall wrser ; wrser(u_data) SPI write (byte 3)
rjmp w96a
;====== 'R' - Read Program Memory ==========================================
w10:
cpi u_data,'R' ; 'R' Read program memory
brne w10B
tst device
brmi rpm1 ; S89 device
ldi s_data,0x28 ; read high Byte (order is different from Block Read!)
rcall wrser ; wrser(0x28) SPI write (byte 1)
mov s_data,addrh
rjmp rpm2
rpm1:
mov s_data,addrh ; s_data = (addrh << 3) | 0x01;
rcall shift_s_data3
ori s_data,0x01
rpm2:
rcall wrser ; wrser(addrh) SPI write (byte 2)
mov s_data,addrl
rcall wrser ; wrser(addrl) SPI write (byte 3)
rcall rdser ; SPI read (byte 4)
mov u_data,s_data
rcall putc ; send data
tst device
brmi rpm3 ; S89 device
ldi s_data,0x20 ; read Low Byte
rcall wrser ; wrser(0x20) SPI write (byte 1)
mov s_data,addrh
rcall wrser ; wrser(addrh) SPI write (byte 2)
mov s_data,addrl
rcall wrser ; wrser(addrl) SPI write (byte 3)
rcall rdser ; SPI read (byte 4)
mov u_data,s_data
rcall putc ; send data
rpm3:
adiw addrl,1 ; Auto increment address
rjmp waitcmd ; goto waitcmd();
;====== 'g' - Block Read Memory (See Note 17) ======================
w10B:
cpi u_data,'g' ; 'g' Block Read Program Memory
brne w11
rcall getc ; XH = getc();
mov XH,u_data
rcall getc ; XL = getc();
mov XL,u_data
rcall getc ; getc(Memorytype);
cpi u_data,'F'
breq w10B2
cpi u_data,'E'
breq w10B1
rjmp put_err
w10B1:
rcall read_send_datamem
sbiw XL, 1
brne w10B1
rjmp waitcmd ; goto waitcmd();
w10B2:
rcall read_send_progmem
tst device
brmi w10B3
sbiw XL, 2
brne w10B2
rjmp waitcmd
w10B3:
sbiw XL, 1
brne w10B2
rjmp waitcmd ; goto waitcmd();
;====== 'A' - Load Address =================================================
w11:
cpi u_data,'A' ; 'A' Load address
brne w12
rcall getc ; addrh = getc();
mov addrh,u_data
rcall getc ; addrl = getc();
mov addrl,u_data
rjmp put_ret ; goto reply();
;====== 'D' - Write Data Memory ============================================
w12:
cpi u_data,'D' ; 'D' Write data memory
brne w13
rcall getc ; get data
rcall eeprom_write
rjmp put_ret
;====== 'd' - Read Data Memory =============================================
w13:
cpi u_data,'d' ; 'd' Read data memory
brne w14
rcall read_send_datamem
rjmp waitcmd ; goto waitcmd();
;====== 'L' - Leave Programming Mode =======================================
w14:
cpi u_data,'L' ; 'L' Leave programming mode
brne w142
w141:
pas_RESET ; set RESET passive
release_ports ; release ports
set_LED ; LED off
rjmp put_ret
;====== 'E' - Exit , release all Ports, inhibit AVR910 =====================
w142:
cpi u_data,'E' ; 'E' xit
brne w15
rjmp w141 ; exit command for AVR Prog
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -