; ub -- load binary file into Banked memory, address 4000 lxi sp,0 ; init DTP serial port mvi a,0 out DTP_CTRL_O ; wait for '*' from U l1: call get cpi '*' jnz l1 ; get the bank code call get ; select bank out BANK_SELECT_O ; echo '$' to say we're ready mvi a,'$' call put ; start loading lxi h,4000h ; bytes come in groups, starting with a count byte l3: call get cpi 0 jz done call put mov c,a ; count l4: call get ;**** call unlock ; temporarily unlock EEPROM mov M,a ; store byte take: out WATCHDOG_PET_O cmp M jnz take call put ; echo inx h ; incr addr mov a,h cpi 80h ; end of banked area? jz done dcr c jnz l4 jmp l3 ; done: call put ; send "Exit U" sequence, to shut down U mvi a,0FEh call put mvi a,7Fh call put mvi a,6 call put hlt get: out WATCHDOG_PET_O in DTP_STS_I ani 2 jz get in DTP_RX_I ret put: push psw l2: out WATCHDOG_PET_O in DTP_STS_I ani 1 jz l2 pop psw out DTP_TX_O ret wait_50ms: push b mvi c,250 www: call wait_1ms out WATCHDOG_PET_O dcr c jnz www pop b ret ; wait at least 1 millisecond WAIT_1MS: push psw ; 1 instruction is about 1.5us ; so each 167 loop is about 500us ; ; Experimentally, this seems 3x too long, ; so we cut back mvi a,167/3 WL1: dcr a jnz wl1 mvi a,167/3 WL2: dcr a jnz wl2 pop psw ret ; ; temporarily unlock bank for a 128-byte write unlock: push psw push b push h ; di ; time-critical; no interrupts ; in BANK_SELECT_I mov b,a ; mov a,b ani 0F0h ori 1 ; bank y1 out BANK_SELECT_O lxi h,5555h mvi M,0AAh ; mov a,b ani 0F0h ; bank y0 out BANK_SELECT_O lxi h,6AAAh mvi M,55h ; mov a,b ani 0F0h ori 1 ; bank y1 out BANK_SELECT_O lxi h,5555h mvi M,0A0h ; mov a,b out BANK_SELECT_O pop h pop b pop psw ret