En sak, du kan inte ha både "goto datain" och "call datain".
"Datain" måste antingen vara en subrutin eller *inte* vara en subrutin.
En CALL måste alltid avslutas med en RETURN, men en GOTO kan aldrig
avslutas med RETURN (om det inte var en CALL före GOTO, så klart...).
Om jag förstår rätt så kommer datat alltid i "paket" om 5 tecken :
1: <ESC> (h'1B')
2: Typ av paket (21=Tid 22=Bästa tid 23=inget)
3: Typ av värde (30=timmar, 32=minuter, 34=sekunder)
4-5: Själva värdet som två tecken.
Om det är så så skulle jag vänta med all analys av datat tills du har
ett komplett paket om fem tecken. D.v.s läs in tecken i en buffert (5 tecken lång).
Räkna efter ett <ESC> till totalt fem tecken och anropa då en rutin
som tittar igenom paketet och gör det som ska göras. Koden blir
lite renare med bättre separation mellan själva mottagandet av ett "paket"
och den följande analysen av datat.
Med lite smart programmering behöver du inte "veta" om det är
timmer, minuter eller sekunder. Du kan använda de 3 lägsta bitarna
i h'30', h'32' resp h'34' för addressering av rätt position i displayerna.
D.v.s det kan ske med samma kod, ingen separat kod för h/m/s...
D.v.s :
h'30' : b'00110000' : använd b'000' och b'001' för adress.
h'32' : b'00110010' : använd b'010' och b'011' för adress.
h'34' : b'00110100' : använd b'100' och b'101' för adress.
Man måste inte göra så, det var bara en liten optimering som jag såg...
Däremot tror jag stark på att läsa in ett helt data-paket *först* och
analysera innehållet när det är klart.