微電腦 - Zipit Z1 - BootROM



Hw_UARTDR1      equ 0x480
Hw_UBRLCR1      equ 0x4c0
Hw_BR9600       equ 0x17
Hw_BR9600_13    equ 0x0b
Hw_WRDLEN8      equ 0x60000
StartFlag       equ '>'
EndFlag         equ '>'

uart_boot_base:
  mov r12, #HwRegisterBase          @ r12 = 0x80000000
  mov r8, #InternalRamBase          @ r8  = 0x10000000
  add r9, r8, #ImageSize            @ r9  = 0x10000800

  mov r0, #Hw_UART1EN
  str r0, [r12, #Hw_SYSCON]
  add r1, r12, #Hw_SYSFLG2
  ldr r7, [r1]                      @ r7 = SYSFLG2
  tst r7, #Hw_CKMODE
  movne r0, #Hw_BR9600_13           @ load 13MHz value if bit set
  moveq r0, #Hw_BR9600              @ if not set, load other divisor
  orr r0, r0, #Hw_WRDLEN8           @ insert 8-bit character mode
  str r0, [r12, #Hw_UBRLCR1]
  mov r0, #StartFlag
  str r0, [r12, #Hw_UARTDR1]
  
  @ receive the date
  @ store bytes at r9 address, stop loop when r8==r9
  @ leaves r8 set to 0x10000800
  @ wait for byte to be available
uart_ready_loop:
  ldr r1, [r12, #Hw_SYSFLG]         @ spin, if ex fifo is empty
  tst r1, #Hw_URXFE1
  bne uart_ready_loop

  @ read the data, store it, and accumulate checksum
  ldr r0, [r12, #Hw_UARTDR1]        @ read data
  strb r0, [r8], #1                 @ save it in memory
  cmp r8, r9
  blt uart_ready_loop

  @ all received, send end flag
  mov r0, #EndFlag
  strb r0, [r12, #Hw_UARTDR1]       @ send reply

  @ having loaded all the bytes, do the right thing to finish
  ldrb r0, [r8, #(3-ImageSize)]
  cmp r0, #BootImageFlagByte
  moveq pc, r14                     @ return to caller for secure image

  add r10, r12, #WWWWWWWWWW         @ r10 = 0x80002400
  str r12, [r10, #(ZZZZZZZZZZZ - YYYYYYYYYY)]
  sub pc, r8, #ImageSize            @ branch to 0x10000000

uart_checksum:
  dcd 0x436b74ab
  assert(. - start_of_rom) = 640    @ check that it is in the right place
  end