-
- for addr in proghex.addresses():
- # Ignore non-aligned steps
- if addr % 4 != 0:
- continue
-
- # Configuration registers must be treated separately
- if (addr>>1) >= 0xf80000 and (addr>>1) <= 0xf80017:
- wr_cfg_li = [0x040200, # GOTO 0x0200
- 0x040200, # GOTO 0x0200
- 0x000000, # NOP
- 0x200007 + ((addr<<3)&0xffff0), # MOV #addr<15:0>, W7
- 0x24000A, # MOV #0x4000, W10
- 0x883B0A, # MOV W10, NVMCON
- 0x200F80, # MOV #0xF8, W0
- 0x880190, # MOV W0, TBLPAG
- 0x200000 + ((proghex[addr]&0x00ff)<<4), # MOV #new_val<7:0>, W0
- 0xBB0B80, # TBLWTL W0, [W7]
- 0x000000, # NOP
- 0x000000, # NOP
- 0xA8E761, # BSET NVMCON, #WR
- 0x000000, # NOP
- 0x000000, # NOP
- 0x000000, # NOP
- 0x000000] # NOP
- runlist( wr_cfg_li )
+
+ for last_code_addr in reversed(ph_addrs):
+ if (last_code_addr>>1) < 0xf80000:
+ last_row_addr = (last_code_addr>>1) & 0xffff80
+ break
+ for addr in range((ph_addrs[0]>>1)&0xffff80,last_code_addr+2,128):
+ # Prevent crossing addresses where upper byte
+ # (i.e., address<23:16>) changes.
+ #if addr+126 > 0xffff:
+ # stop_addr = addr | 0xffff
+ #else:
+ # stop_addr = addr+126
+
+ runlist( wr_pm64_li_setaddr[:4]
+ + [0x200000 + ((addr>>12)&0xff0),
+ wr_pm64_li_setaddr[5],
+ 0x200007 + ((addr&0xffff)<<4)] )
+
+ instr_list = [0,0,0,0]
+ for mid_addr in range(addr,addr+126,8):
+ for offset in range(4):
+ if (mid_addr+offset*2)<<1 not in ph_addrs:
+ instr_list[offset] = 0xffffff
+ else:
+ instr_list[offset] = proghex[(mid_addr+offset*2)<<1]
+ instr_list[offset] |= proghex[((mid_addr+offset*2)<<1)+1] << 8
+ instr_list[offset] |= proghex[((mid_addr+offset*2)<<1)+2] << 16
+ packed_instr_list = instr2words( instr_list )
+ runlist( [0x200000 + ((packed_instr_list[0]&0xffff)<<4),
+ 0x200001 + ((packed_instr_list[1]&0xffff)<<4),
+ 0x200002 + ((packed_instr_list[2]&0xffff)<<4),
+ 0x200003 + ((packed_instr_list[3]&0xffff)<<4),
+ 0x200004 + ((packed_instr_list[4]&0xffff)<<4),
+ 0x200005 + ((packed_instr_list[5]&0xffff)<<4)]
+ + wr_pm64_li_wrlat )
+
+ runlist( wr_pm64_li_wr )
+ status = readNVMCON()
+ while status & 0x8000:
+ client.writecmd( PICAPP, 0x82, 3, [0x00,0x00,0x00] )