lunedì 23 luglio 2018

FIxed point math

Questo argomento a cui volevo dedicare un po' di tempo e  finalmente ho trovato degli esempi semplici  come ad esempio https://spin.atomicobject.com/2012/03/15/simple-fixed-point-math/

La logica di base e' semplice..si deve descrivere un numero a virgola mobile con un numero intero e per farlo lo si moltiplica per un valore fisso (una potenza di 2 nel caso di uso di calcolatore) ed eliminando la parte oltre la virgola.

Fixed = round(float * scale_fact)

Per scale_fact si usando potenze di due perche' e' semplice con lo shift dei byte ottenere il valore desiderato (1<< 4 = 16, 4 shift a sinistra per esempio)

Le operazioni di somma e sottrazione non sono modificate
La moltiplicazione invece diventa

r = (x * y)/(1<<scale_fact)

mentre la divisione

r=(x*(1<<scale_fact))/y

Tutto cio' velocizza i calcoli ma introduce necessariamente una approssimazione (in base al fattore di scala)

Proviamo a fare un esempio concreto
x = 3.141592655
y = 2
scale_fact = 16 = 65536

x1 = pi*65536 = 205321.92 = 205887
y1 = 2*65536 = 131072

r =  x1*y1 = 205887*131072 / 655536 = 411744

(si vede chiaramente che, dovendo applicare questo metodo ad un calcolatore, durante l'operazione si deve prevedere una variabile di tipo superiore al risultato....cerco di spiegarmi meglio...anche se gli operando sono entrambi byte ed il risultato e' un byte durante il calcolo e' necessario l'uso di una word)

riconvertendo il tutto
r = 411744/65536 = 6.2831726 (il valore dovrebbe essere 6.2831853...)

passando ad uno scale_fact = 8 (256)

x1 = pi*256 = 804
y1 = 2*256 = 512
r = 2526*512/256 = 1608

r = 1608/256 =6.28125 (il valore dovrebbe essere 6.2831853...)

passando ad uno scale_factr = 4 si ha un valore di x*y=6.25

in sintesi l'ordine dell' errore e'
16 bit : E-6
8 bit : E-4
4 bit  :  E-3




Moltiplicazione Assembly per C64

Il set di opcode del 6510 (processore del C64) non comprende in modo nativo l'operazione di moltiplicazione e divisione. Su codebase64 sono disponibili algoritmi per il calcolo e' ho provato ad usare quello piu' semplice (8 bit * 8 bit = 8 bit) usando sia la sintassi di Acme che di KickAss (anche come promemoria)
Il risultato viene salvato nell'accumulatore e quindi spostato in una variabile


KickAss
--------------
*=$c000

//sys 49152



lda #$00
  beq enterLoop

doAdd:
  clc
  adc num1

loop:
  asl num1
enterLoop: 
  lsr num2
  bcs doAdd
  bne loop

end:
sta num3
rts

num1: .byte 7
num2: .byte 3
num3: .byte 0

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


Acme
--------------
; Moltiplicazione 8bit*8bit=8bit
!source "./stdlib/stdlib.a"
!to "fixed.prg", cbm
!sl "fixed.map"
!cpu 6510
!ct pet


*=$c000

;sys 49152



lda #$00
  beq enterLoop

doAdd:
  clc
  adc num1

loop:
  asl num1
enterLoop: 
  lsr num2
  bcs doAdd
  bne loop

end:
sta num3
rts

num1: !by 7
num2: !by 3
num3: !by 0

venerdì 20 luglio 2018

Kindle PaperWhite smontato

Mi e' stato chiesto di smontare un Kindle PaperWhite 2 Gen per recuperare la batteria dato che il dispositivo era stato "masticato" (nel vero senso della parola...basta guardare i segni dei denti in basso a sinistra) da un cane



Per aprire il dispositivo ci vuole un po' di coraggio perche' la copertura dello schermo e' fissata solo da adesivo .... nessuna clip e nessuna vite. Si deve entrare paralleli al vetro dal lato inferiore e procedere con attenzione ma anche con forza. Non si deve flettere verso l'alto


Una volta rimossa la cover dello schermo e' semplice...si tratta solo di svitare una decina di viti per separare il case inferiore



Ribaltando il dispositivo si raggiunge la batteria


lunedì 16 luglio 2018

Fauna fiorentina - Nidiaceo di colombaccio



PMII 21 - IBM A30

Parlare male dei portatili IBM e' difficile ma l'A30 era estremamente pesante e scomodo (anche per la strana presenza dei tasti acceleratori sul lato destro della tastiera....un utente IBM ha bisogno di queste cose da dilettanti??)


PMII 20 - Pioneer DE-S7001

Dispositivo SCSI magneto - ottico del 1991





PMII 19 - Philips DD 401 Cd Rom

Uno dei primissimi lettori CD Rom sul mercato. Non aveva un cassetto estraibile ma il disco doveva essere inserito ed estratto mediante un apposita guida in plastica (ovviamente aveva una scheda di interfaccia proprietaria da inserire nel PC che e' andata persa rendendo questo esemplare non funzionante)




Feature Matching OpenCv

Il problema e' il seguente: trovare le differenze tra le due foto. Le due immagini sono state riprese a distanza di oltre un anno ed il ...