Working ADB transfer at very low speeds (adding a delay in python terminal)
This commit is contained in:
parent
2678a2ebfd
commit
55f5d62082
@ -61,17 +61,14 @@ Term_readline:
|
|||||||
ld bc, incoming_string ; Returns read string pointer
|
ld bc, incoming_string ; Returns read string pointer
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Returns the number of bytes available on the parallel port using the
|
|
||||||
; DATA_AVAILABLE register.
|
|
||||||
; @return a the number of available bytes
|
|
||||||
Term_availb:
|
|
||||||
in a, (TERM_DATA_AVAIL_REG)
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Reads the first available byte on the serial port using the DATA register.
|
; Reads the first available byte on the serial port using the DATA register.
|
||||||
|
; Waits for the Terminal DATA_AVAILABLE register to be non-zero before reading.
|
||||||
; 0s are not ignored (cannot be used with keyboard)
|
; 0s are not ignored (cannot be used with keyboard)
|
||||||
; Affects NO condition bits!
|
; Affects NO condition bits!
|
||||||
; @return the available byte, even if 0
|
; @return the available byte, even if 0
|
||||||
Term_readb:
|
Term_readb:
|
||||||
|
in a, (TERM_DATA_AVAIL_REG)
|
||||||
|
cp 0
|
||||||
|
jp z, Term_readb
|
||||||
in a, (TERM_DATA_REG) ; reads a byte
|
in a, (TERM_DATA_REG) ; reads a byte
|
||||||
ret
|
ret
|
@ -274,8 +274,8 @@ monitor_adb:
|
|||||||
; start copying incoming data to application space
|
; start copying incoming data to application space
|
||||||
call monitor_copyTermToAppMem
|
call monitor_copyTermToAppMem
|
||||||
;jp APP_SPACE ; Start executing code
|
;jp APP_SPACE ; Start executing code
|
||||||
ld bc, APP_SPACE
|
; ld bc, APP_SPACE
|
||||||
call Sys_Print
|
; call Sys_Print
|
||||||
jp monitor_main_loop
|
jp monitor_main_loop
|
||||||
|
|
||||||
; Prints "0x" and read 1 hex byte (2 hex digits, e.g. 0x8C)
|
; Prints "0x" and read 1 hex byte (2 hex digits, e.g. 0x8C)
|
||||||
@ -482,11 +482,6 @@ monitor_copyTermToAppMem:
|
|||||||
ld d, 2
|
ld d, 2
|
||||||
ld hl, APP_SPACE ; we will write in APP_SPACE
|
ld hl, APP_SPACE ; we will write in APP_SPACE
|
||||||
monitor_copyTermToAppMem_loop:
|
monitor_copyTermToAppMem_loop:
|
||||||
; check if bytes are available
|
|
||||||
call Term_availb
|
|
||||||
cp 0
|
|
||||||
jp z, monitor_copyTermToAppMem ; no bytes available, next loop
|
|
||||||
; bytes are available
|
|
||||||
ld a, d
|
ld a, d
|
||||||
cp 2 ; check if we are receiving first header byte
|
cp 2 ; check if we are receiving first header byte
|
||||||
jp z, monitor_copyTermToAppMem_loop_rec_head_byte_1
|
jp z, monitor_copyTermToAppMem_loop_rec_head_byte_1
|
||||||
@ -494,20 +489,29 @@ monitor_copyTermToAppMem:
|
|||||||
cp 1 ; check if we are receiving second header byte
|
cp 1 ; check if we are receiving second header byte
|
||||||
jp z, monitor_copyTermToAppMem_loop_rec_head_byte_2
|
jp z, monitor_copyTermToAppMem_loop_rec_head_byte_2
|
||||||
; we are receiving binary stream: read byte and save to memory
|
; we are receiving binary stream: read byte and save to memory
|
||||||
call Term_readb
|
call Term_readb ; reads a byte from terminal
|
||||||
ld (hl), a ; copy byte to memory
|
ld (hl), a ; copy byte to memory
|
||||||
inc hl ; move to next memory position
|
inc hl ; move to next memory position
|
||||||
jp monitor_copyTermToAppMem_loop ; continue loop
|
dec bc ; decrement remaining bytes counter
|
||||||
|
; check if we reached the number of bytes to be transferred
|
||||||
|
ld a, b
|
||||||
|
cp 0
|
||||||
|
jp nz, monitor_copyTermToAppMem_loop ; continue loop
|
||||||
|
ld a, c
|
||||||
|
cp 0
|
||||||
|
jp nz, monitor_copyTermToAppMem_loop ; continue loop
|
||||||
|
; all bytes received, return
|
||||||
|
ret
|
||||||
|
|
||||||
monitor_copyTermToAppMem_loop_rec_head_byte_1:
|
monitor_copyTermToAppMem_loop_rec_head_byte_1:
|
||||||
; we are receiving first header byte: read byte and save to b
|
; we are receiving first header byte: read byte and save to b
|
||||||
call Term_readb
|
call Term_readb ; reads a byte from terminal
|
||||||
ld b, a
|
ld b, a
|
||||||
dec d
|
dec d
|
||||||
jp monitor_copyTermToAppMem_loop ; continue loop
|
jp monitor_copyTermToAppMem_loop ; continue loop
|
||||||
monitor_copyTermToAppMem_loop_rec_head_byte_2:
|
monitor_copyTermToAppMem_loop_rec_head_byte_2:
|
||||||
; we are receiving second header byte: read byte and save to c
|
; we are receiving second header byte: read byte and save to c
|
||||||
call Term_readb
|
call Term_readb ; reads a byte from terminal
|
||||||
ld c, a
|
ld c, a
|
||||||
dec d
|
dec d
|
||||||
jp monitor_copyTermToAppMem_loop ; continue loop
|
jp monitor_copyTermToAppMem_loop ; continue loop
|
||||||
|
@ -31,10 +31,13 @@ import os
|
|||||||
|
|
||||||
|
|
||||||
class TerminalEmulator:
|
class TerminalEmulator:
|
||||||
|
SYNC_SLEEP = 0.001
|
||||||
|
|
||||||
def __init__(self, w, ser):
|
def __init__(self, w, ser):
|
||||||
w.clear()
|
w.clear()
|
||||||
w.move(0,0)
|
w.move(0,0)
|
||||||
while True:
|
while True:
|
||||||
|
|
||||||
# read serial port and write to curses
|
# read serial port and write to curses
|
||||||
if ser.inWaiting():
|
if ser.inWaiting():
|
||||||
b = ser.read(1)
|
b = ser.read(1)
|
||||||
@ -45,6 +48,7 @@ class TerminalEmulator:
|
|||||||
key = w.getch()
|
key = w.getch()
|
||||||
if key == 10 or (key > 31 and key < 256):
|
if key == 10 or (key > 31 and key < 256):
|
||||||
# Is a character
|
# Is a character
|
||||||
|
time.sleep(self.SYNC_SLEEP)
|
||||||
ser.write(bytes([key]))
|
ser.write(bytes([key]))
|
||||||
elif int(key) == 1: # CTRL+A, enter ADB mode
|
elif int(key) == 1: # CTRL+A, enter ADB mode
|
||||||
# Save cursor position
|
# Save cursor position
|
||||||
@ -67,20 +71,29 @@ class TerminalEmulator:
|
|||||||
w.addstr(0, 0, '[ADB MODE] file to load:', curses.A_REVERSE)
|
w.addstr(0, 0, '[ADB MODE] file to load:', curses.A_REVERSE)
|
||||||
path = w.getstr()
|
path = w.getstr()
|
||||||
try:
|
try:
|
||||||
|
header = bytearray(2)
|
||||||
size = os.path.getsize(path)
|
size = os.path.getsize(path)
|
||||||
# Compute the two header bytes needed to declare the length of the stream
|
# Compute the two header bytes needed to declare the length of the stream
|
||||||
h1 = size & 255 # get lower 8 bits
|
header[1] = size & 255 # get lower 8 bits
|
||||||
size >>= 8 # shift by 8 bits
|
size >>= 8 # shift by 8 bits
|
||||||
h0 = size & 255 # get second lower 8 bits
|
header[0] = size & 255 # get second lower 8 bits
|
||||||
|
# Log size for debug
|
||||||
|
w.addstr("Header bytes: {}".format(header.hex()))
|
||||||
|
w.refresh()
|
||||||
|
|
||||||
# Send the two heading bytes (most significant first)
|
# Send the two heading bytes (most significant first)
|
||||||
ser.write(h0)
|
ser.write(header[0:1])
|
||||||
ser.write(h1)
|
time.sleep(self.SYNC_SLEEP)
|
||||||
|
ser.write(header[1:2])
|
||||||
|
time.sleep(self.SYNC_SLEEP)
|
||||||
|
|
||||||
# Send the actual binary stream
|
# Send the actual binary stream
|
||||||
with open(path, "rb") as f:
|
with open(path, "rb") as f:
|
||||||
byte = f.read(1)
|
byte = f.read(1)
|
||||||
while byte:
|
while byte:
|
||||||
ser.write(byte)
|
ser.write(byte)
|
||||||
byte = f.read(1)
|
byte = f.read(1)
|
||||||
|
time.sleep(self.SYNC_SLEEP)
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
w.move(0,0)
|
w.move(0,0)
|
||||||
w.clrtoeol()
|
w.clrtoeol()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user