lunedì 11 giugno 2018

Floating point numbers in C64

Continua l'esplorazione di tutto quanto mi sono perso su C64

Quando ho iniziato a studiare l'assembler avevo Olivetti M24 su processore 8086 e sul C64 usavo solo BASIC (al limite integrato con Simon Basic per qualche routine grafica). L'assembler 8086 non e' banalissimo ma la cosa che piu' mi infastidiva era quella di non poter gestire in modo nativo la matematica dei numeri float ....a meno che di non possedere un costosissimo coprocessore matematico (che e' stato integrato solo dalla serie x486)

Con sorpresa ho scoperto che usare i numeri a virgola mobile e fare conti su C64 e' incredibilmente banale anche in assembler.

Per prima cosa i numeri float hanno una struttura di 5 byte e sono nel formato esponenziale base 2 ...quindi qualcosa del tipo x.xxx 2^y

byte 1 : esponente : il valore dell'esponente e' nel formato exp-129 (quindi 2^0 avra' il valore 81, valore piu' bassi indicano esponenti negativi)

byte 2-5 : mantissa

Convertire da formato float decimale a float C64

per fare poca fatica conviene usare direttamente la conversione di C64

Per esempio si digiti da BASIC
NEW
X = 3.14159

IND = PEEK(71)+256*PEEK(72)

PRINT PEEK(IND)
PRINT PEEK(IND+2)
PRINT PEEK(IND+3)
PRINT PEEK(IND+4)
PRINT PEEK(IND+5)

quale e' il significato. Diciamo al BASIC di salvare il valore di float di pi greco in una variabile. Nelle locazioni a pagina zero 71 e 72 c'e' il puntato alla zona di memoria dove viene inserito effettivanemente il numero (gia' decodificato in formato C64). Nel mio caso l'indirizzo e' $805 (esadecimale) se sei aggiungono altre variabile si vedra' che il puntatore si aggiorna

La risposta al comando e'
$82 $49 $0F $CF $82

ovvero la traduzione in formato float C64
Per fare la riprova si puo' usare questo programma assembler in ACME
in pratica si popola la'accumulatore di float FAC con il valore di pi greco, si chiama il kernal per la conversione del valore in una stringa ($BDDD) e poi si mostra la stringa a schermo
-----------------------------------------------
Float

!source "./std.a"
!to "float.prg", cbm
!sl "float.map"
!cpu 6510

*=$1000

LDFAC = $bba2


!macro LoadFAC .addr {
lda #<.addr
ldy #>.addr
jsr LDFAC
}

+LoadFAC pi

MOVFA ; sposta FAC in ARG


;JSR $E264 ;COSENO NON UTILIZZATA

JSR $BDDD ;Convert FAC to zero-terminated string representation at memory addresses $0100-$010A.

 LDY   #0

loop:   LDA   $100,Y
        BEQ   done
        JSR   $FFD2        
        INY
        BNE   loop          
done:

RTS

pi !by $82, $49, $0F, $CF, $82
-----------------------------------------------

Per la riconversione l'algoritmo (preso da qui) e' il seguente

  • Exponent: exp-128
  • Mantissa: (m4 >= 128 ? -1 : +1) * ((m4 | 0x80) >> 8 + m3 >> 16 + m2 >> 24 + m1 >> 32) 

La cosa interessante e' che da Assembler si possono chiamare anche le funzioni trigonometriche, le stesse condivise con BASIC, ma che risultano decisamente piu' veloci (vedi la chiama alla subroutine in $E264 corrispondente al coseno)

c'e' da osservare che la precisione dell'arrotondamento delle routine non e' ottimale (vedi questo link)

sabato 9 giugno 2018

EACHINE R051

Mi e' stato dato il ricevitore EACHINE R051 (utlizzato per le camere FPV a 5 GHz dei droni) per vedere se riuscivo a creare una applicazione Android alternativa a quella originale della ditta....e sono iniziati i problemi


Il dispositivo si dichiara come segue su Linux

--------------------------------------------------
Jun  7 15:47:31 localhost kernel: usb 3-1: new high-speed USB device number 39 using xhci_hcd
Jun  7 15:47:31 localhost kernel: usb 3-1: New USB device found, idVendor=2537, idProduct=1081
Jun  7 15:47:31 localhost kernel: usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jun  7 15:47:31 localhost kernel: usb 3-1: Product: EACHINE
Jun  7 15:47:31 localhost kernel: usb 3-1: SerialNumber: 0123456789ABCDE
Jun  7 15:47:31 localhost kernel: usb-storage 3-1:1.0: USB Mass Storage device detected
Jun  7 15:47:31 localhost kernel: scsi host12: usb-storage 3-1:1.0
Jun  7 15:47:31 localhost mtp-probe: checking bus 3, device 39: "/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1"
Jun  7 15:47:31 localhost mtp-probe: bus: 3, device: 39 was not an MTP device
Jun  7 15:47:32 localhost kernel: usb 3-1: USB disconnect, device number 39
Jun  7 15:47:36 localhost kernel: usb 3-1: new high-speed USB device number 40 using xhci_hcd
Jun  7 15:47:36 localhost kernel: usb 3-1: New USB device found, idVendor=2537, idProduct=1081
Jun  7 15:47:36 localhost kernel: usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jun  7 15:47:36 localhost kernel: usb 3-1: Product: EACHINE
Jun  7 15:47:36 localhost kernel: usb 3-1: SerialNumber: 0123456789ABCDE
Jun  7 15:47:36 localhost kernel: usb-storage 3-1:1.0: USB Mass Storage device detected
Jun  7 15:47:36 localhost kernel: scsi host13: usb-storage 3-1:1.0
Jun  7 15:47:36 localhost mtp-probe: checking bus 3, device 40: "/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1"
Jun  7 15:47:36 localhost mtp-probe: bus: 3, device: 40 was not an MTP device
Jun  7 15:47:37 localhost kernel: scsi 13:0:0:0: Direct-Access     JKH Tech Fly Video             PQ: 0 ANSI: 6
Jun  7 15:47:37 localhost kernel: sd 13:0:0:0: [sdb] 2 512-byte logical blocks: (1.02 kB/1.00 KiB)
Jun  7 15:47:37 localhost kernel: sd 13:0:0:0: Attached scsi generic sg1 type 0
Jun  7 15:47:37 localhost kernel: sd 13:0:0:0: [sdb] Write Protect is on
Jun  7 15:47:37 localhost kernel: sd 13:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
Jun  7 15:47:37 localhost kernel: Dev sdb: unable to read RDB block 2
Jun  7 15:47:37 localhost kernel: sdb: unable to read partition table
Jun  7 15:47:37 localhost kernel: sdb: partition table beyond EOD, enabling native capacity
Jun  7 15:47:37 localhost kernel: Dev sdb: unable to read RDB block 2
Jun  7 15:47:37 localhost kernel: sdb: unable to read partition table
Jun  7 15:47:37 localhost kernel: sdb: partition table beyond EOD, truncated
Jun  7 15:47:37 localhost kernel: sd 13:0:0:0: [sdb] Attached SCSI removable disk
--------------------------------------------------

Come si vede c'e' una memoria interna (che pero' non sono mai riuscito a montare su Linux perche' il filesystem risultava sempre corrotto) mentre per la sigla  JKH Tech Fly Video non si trovano informazioni.
La cosa da notare e' che su Linux non viene montata una /dev/video* e la camera non e' vista ne' su Windows 10 ne' su Mac....eppure il prodotto viene venduto come UVC (Universal Video Camera) USB Video Class

Non era possibile trovare l'R051 nemmeno in /dev/input/by-path

Montando WireShark per sniffare il traffico USB non ha dato informazioni perche' una volta connessa
la ricevente non era presente nessuno stream (di nessun tipo) sui canali USB

Il preda allo scoraggiamento ho decompilato la applicazione.



All'interno e' presente la libVLC per Android e ci sono chiare chiamate ad stream video conosciuti...quindi non si tratta di un formato video proprietario e ci sono a chiamate ad UVC quindi i dati tecnici sembrano corretti. Ci sono inoltre funzioni che gestiscono l'enumerazione di dispositivi USB e controlli apparentemente su firmware, serial number

Mi viene da pensare che lo stream video non si attivi quando si connette il dispositivo ma solo con un comando software ...questo giustificherebbe perche' non viene montato /dev/video (nel codice puo' essere interessante la funzione UsbConnection

Frugando nella cartella lib, oltre al gia' citato VLC, si trova libns1081-lib che e' relativa al firmware di un controller USB 3.0 Norelsys NS1081. Quindi l'interfaccia con la USB non sembra standard

Una particolarita che ho scoperto dopo un bel po' di prove: il cavo USB non ha la corrente necessaria per tenere acceso il dispositivo. L'EACHINE sembra avere una batteria tampone interna che si ricarica (fino a quando il led rosso smette di pulsare). Se a batteria scarica si connette il dispositivo e si cerca di usarlo nel giro di pochi secondi si spenge. Mi sa che questo aspetto possa essere dovuto al fatto che il dispositivo e' internamente USB 3.0 mentre io lo ho attaccato sempre ad USB 2.0 (quindi a porte di potenza piu' bassa)

venerdì 8 giugno 2018

Serie di Fibonacci in Assembler C64

Il Commodore 64 e' stato il mio primo calcolatore e non sono mai riuscito ad imparare a programmare in Assembler...anche perche' all'epoca non esisteva Internet e se non avevi un amico "istruito" non andavi da nessuna parte....sto cercando di colmare la lacuna adesso a distanza di oltre trenta anni

Inizio con una cosa facile...ovvero la serie di Fibonacci limitata ai numeri sotto a 255 (la bellezza dei calcolatori 8bit)



il codice e' molto semplice
----------------------------------------------------
processor 6502
org $1000
       ; clear carry flag...leggendo in alcuni posti sembra che non sia obbligatorio
       ; settare a zero il flag di carry perche' viene fatto in automatico da adc
clc
torna
         ; mette nell'accumulatore il valore della variabile byte uno
         lda uno
         ; somma l'accumulatore con la variabile due
         adc due
         ; metti il risultato in somma
         sta somma
         ; se si ha un overflow la flag di carry e' a 1 ed esce
         bcs esci
        ; altrimenti scambia il contenuto delle variabili  per il prossimo calcolo
         lda due
         sta uno
         lda somma
         sta due

        ; qui chiama una funzione che stampa a video il valore di un numero a 16 bit
        ; nell'accumulatore viene messo il byte piu' significativo ,ma qui e' sempre a zero
lda #$00
ldx somma
JSR $BDCD
       
        ; funzione che stampa uno spazio a video
JSR $AB3F

         jmp torna
esci
         rts
uno
         .byte $01
due
         .byte $01
somma
         .byte $00

------------------------------------------------------

Per compilare il codice ho usato Dasm

/dasm.Linux.x86 fib2.asm -ofib2.prg

per eseguire il codice si compila Vice e si lancia

x64 fib2.prg

digitando poi

SYS 4096



martedì 5 giugno 2018

Pebble Time tearing

PS dopo una decina di giorni mi sono accorto che il problema persiste (meno di prima ma persiste) e non sembra legato alla flat del cavo. Lo schermo infatti si aggiorna solo premendo il pulsante in basso a destra...forse un problema software??? non e' possibile saperlo perche' non posso aggiornare il firmware

Livello di difficolta' : 1/5

Io amo Pebble Time per i seguenti motivi

1) la batteria dura ben oltre una settimana ed il cavo di ricarica ad aggancio magnetico e' comodissimo

2) Oramai su Ebay si trovano in offerta a circa 10 euro (basta aspettare)

3) Esiste GadgetBridge


Il problema e' che ogni tanto lo schermo si corrompe fino a che viene fatto il refresh manualmente premendo i tasti...negli ultimi tempi il fenomeno stava diventando molto frequente e fastidioso


Ho scoperto su internet che e' un problema comuni ai Pebble (indipendentemente dal modello) ed e' legato alla flat di connessione tra la scheda madre e lo schermo..fortunatamente si puo' facilmente riparare. Aprire il Pebble e' semplice...basta avere il giusto cacciavite. Dopo di cio' si deve rimuovere il coperchio con calma perche il sistema di vibrazione e' incollata alla cover e deve essere staccato prima di alzare completamente il coperchio..Meglio spengere il Pebble prima di operare



Dopo di cio' si puo' inserire uno spessore di carta per schiacciare in sede la flat (vedi la differenza tra le due foto)


Ricomposto il tutto lo schermo e' tornato a funzionare


questo invece un video non di mia produzione



lunedì 4 giugno 2018

Emulazione processore con QEMU



In alcuni casi (per esempio provare le prestazioni di software su macchine vecchie) puo' essere utile avere un emulatore che simuli anche la CPU. Virtualbox non permette questa funzione che e' invece presente in QEmu

Per esempio per emulare una Live CD su macchina Pentium 3 con 192 Mb di ram si puo' digitare

qemu-system-x86_64 -boot d -cdrom slitaz-rolling.iso -m 192 -cpu pentium3


cat /proc/cpuinfo in emulazione QEmu


Smontare Acer Travelmate 518TX

Tempo fa avevo cercato di resuscitare un Acer Travelmate 518TX ma la batteria del BIOS scarica impediva di installare Linux. Avevo abbandonato li' perche' non riuscivo ad aprire il computer senza fare danni....avendo avuto il permesso del proprietario anche di fare forza ho trovato il modo di accedere all'interno
Come era prevedibile l'accesso e' sotto la tastiera. Questa ha una serie di gancetti nascosti che, con un po' di forza e pazienza, si possono far saltare senza fare danni


al di sotto una piastra mettalica con alcune viti


e finalmente si accede alla piastra madre. Abbastanza curiosamente la culla dell'HD non presenta viti...che qualcuno sia passato prima di me?? La batteria non e' la classica CR2032 ma bensi' una CR1220


 il processore e' ovviamente saldato ed ha una curiosa copertura in rame. Non sembra un dissipatore passivo perche' il nucleo del processore e' scoperto


ed ecco il processore nudo


Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...