Portatile del 1987 funzionate con HD integrato della classe 80C86
martedì 10 luglio 2018
PMII 3 - Scheda di memoria ai noduli di ferrite
Esemplare piu' unico che raro nella mia collezione derivante da uno scambio. Una memoria di 4K ai noduli di ferrite derivante da una mitragliera francese del 1972 da 4K a 18 bit
Le memorie ai noduli di ferrite (presenti anche sullo Space Shuttle) erano importanti in ambito militare perche' non sono influenzate dallo shock elettromagnetico derivante dallo scoppio di una bomba atomica
Le memorie ai noduli di ferrite (presenti anche sullo Space Shuttle) erano importanti in ambito militare perche' non sono influenzate dallo shock elettromagnetico derivante dallo scoppio di una bomba atomica
PMII 2 - Scheda M24 Clone
Scheda madre di Olivetti M24. Ci sono un paio di cose curiose: la prima e' la patch manuale della scheda con un cavo azzurro non integrato sulla scheda madre. La seconda e' che la scheda non e' stata presa da un Olivetti M24 ma da un computer sotto diverso marchio costruito sotto licenza Olivetti (nello speficico un AT&T 6300)
PMII 1 - Coin Op MotherBoards
Durante il trasloco ho dovuto spostare la collezione del PMII (Piccolo Museo dell'Informatica Innocenti) e con l'occasione ho fatto qualche foto
Queste sono schede madri di alcuni giochi cabinati da bar coin-op anni 80 che ho trovato abbandonate in un magazzino
La scheda marchiata JALECO BR8953 e' una scheda in input output di un gioco chiamato Big Run di cui ho trovato il manuale operativo
C'e inoltre una scheda SEGA 1987, una scheda relativa al gioco Twin Cobra , una scheda Nichibutsu del 1984 ed una scheda del gioco coin op Raiden
Le schede erano fatte per essere montate in stack verticali ed in alcuni si vedono ancora i supporti
lunedì 9 luglio 2018
Sprites su C64
Un modifica del codice di MoveSprite.asm (qui su GitHub) che mostra due sprite. Il primo sprite
viene ubicato in una coordinata casuale con una routine random del SID. Il primo sprite si puo' muovere e quando tocca il secondo sprite il VIC sente la collisione ed il programma si arresta
Il codice ha una autoload in modo da non essere necessario digitare nessun comando SYS (che in ogni caso e' SYS 2304). Il codice dovrebbe essere sufficientemente commentato
Sviluppato con RelaunchC64 come IDE ed ACME come crosscompiler assembler. Lo sprite e' stato generato con http://www.spritemate.com/ che permette l'export sia in formato ACME che KickAssembler
-----------------------------------------------------------------------------
!cpu 6502
!to "move_2sprite.prg",cbm
; SYS 2034
;*=$0900
; LA DEFINIZIONE DELLE VARIABILI E' IN CODA AL CODICE
!macro start_at .address {
* = $0801
!byte $0c,$08,$00,$00,$9e
!if .address >= 10000 { !byte 48 + ((.address / 10000) % 10) }
!if .address >= 1000 { !byte 48 + ((.address / 1000) % 10) }
!if .address >= 100 { !byte 48 + ((.address / 100) % 10) }
!if .address >= 10 { !byte 48 + ((.address / 10) % 10) }
!byte $30 + (.address % 10), $00, $00, $00
* = .address
}
!macro sid_random{
; calcola un valore casuale usando il SID
; il byte random viene salvato nell'accumulatore
LDA #$FF
STA $D40E
STA $D40F
LDA #$80
STA $D412
LDA $D41B
}
;------------------------------------------------------------------------------------
!macro new_position{ ; cambia la posizione dello sprite 0 in modo casuale
LDA #0 ;stick with x0-255
STA $D010 ; la coordinata X puo' essere maggiore di 255 e non puo' essere
; contenuta in un byte. La parte alta e' inserita nella locazione $D010
; in questo esempio la parte alta e' settata a zero per imposizione
+sid_random
TAX
ricalcola
+sid_random
CMP #200 ; compara l'accumulatore con 200
BPL ricalcola
; qui c'e' il problema contrario rispetto a X
; la coordinata Y non puo' essere maggiore di 200 mentre un byte puo' essere 255
; quindi cicla nel calcolare numeri casuali fino a che non e' minore di 200
TAY
STX $D000 ; che contengono la posizione dello sprite 0
STY $D001
}
;------------------------------------------------------------------------------------
+start_at $0900
JSR $E09A
JSR $E544 ; vai alla subroutine che cancella lo schermo
LDA #13 ;
STA $C202
LDA #$0D ;ad $7F8 c'e' il puntatore dello sprite 0
STA $7F8
LDA #$0D ;ad $7F9 c'e' il puntatore dello sprite 1
STA $7F9
LDA #3 ;abilita lo sprite 0, e' una bit mask
STA $D015 ;che serve ad abilitare tutti gli sprite
;abilitare sprite 0 ed 1 si inserisce 3 (11b)
LDA #02 ; in D027 c'e' il colore dello sprite 0
STA $D027 ; viene inserito il valore 2 ovvero rosso
; setta il colore dello sprite 1
LDA #03
STA $D028
LDX #0
LDA #0
;a $0340 c'e' la locazione di memoria dello sprite 0
;ogni sprite e' lungo 63 byte (piu' un byte non utilizzato)
;il codice successivo cicla per pulire l'area di memoria
CLEANUP0 STA $0340,X
INX
CPX #63
BNE CLEANUP0
;ripulisce l'area dello sprite 1
LDX #0
CLEANUP1 STA $0340,X
INX
CPX #63
BNE CLEANUP1
;dopo aver ripulito l'area di memoria la riempie con
;la matrice DATA
LDX #0
BUILD LDA DATA,X
STA $0340,X
INX
CPX #63
BNE BUILD
;position
+new_position
;setta le variabili dello sprite 1
LDX #100 ;
LDY #100 ;
STX $D002 ;
STY $D003
SCAN JSR $FF9F ;richiede al Kernal lo stato della tastiera
JSR $FFE4 ;richiede al Kernal il valore del default input
;sposta lo sprite a seconda dello stato tastiera
START CMP #87 ;W - up
BEQ UP
CMP #83 ;S - down
BEQ DOWN
CMP #65 ;A - left
BEQ LEFT
CMP #68 ;D - right
BEQ RIGHT
CMP $C202 ;end if enter clicked
BEQ END
; controlla se ci sono state collision
LDA $D01E ; byte di collisione hardware tra sprite
CMP #0
BNE END
JMP SCAN
UP LDY $D001 ; carica la posizione Y dello sprite in Y
DEY ; decrementa Y (il sistema di riferimento e' rovesciato)
STY $D001 ; ed aggiorna la posizione dello sprite
;+new_position
JMP SCAN
DOWN LDY $D001
INY
STY $D001
JMP SCAN
LEFT LDX $D000
DEX
STX $D000
CPX #255
BNE SCAN
LDA #0
STA $D010
JMP SCAN
RIGHT LDX $D000
INX
STX $D000
CPX #255
BNE SCAN
LDA #1
STA $D010
JMP SCAN
;clean up at the end
END JSR $E544 ; pulisce lo schermo
LDA #0 ; disabilita lo sprite 0
STA $D015
RTS ; ritorna al prompt
;define the sprite
DATA !byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $38,$00,$00,$fc,$00,$00,$f2,$00
!byte $01,$c3,$00,$01,$89,$80,$03,$80
!byte $c0,$03,$83,$c0,$03,$82,$00,$07
!byte $03,$00,$07,$01,$80,$00,$c0,$80
!byte $00,$79,$80,$00,$0f,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$08
viene ubicato in una coordinata casuale con una routine random del SID. Il primo sprite si puo' muovere e quando tocca il secondo sprite il VIC sente la collisione ed il programma si arresta
Il codice ha una autoload in modo da non essere necessario digitare nessun comando SYS (che in ogni caso e' SYS 2304). Il codice dovrebbe essere sufficientemente commentato
Sviluppato con RelaunchC64 come IDE ed ACME come crosscompiler assembler. Lo sprite e' stato generato con http://www.spritemate.com/ che permette l'export sia in formato ACME che KickAssembler
-----------------------------------------------------------------------------
!cpu 6502
!to "move_2sprite.prg",cbm
; SYS 2034
;*=$0900
; LA DEFINIZIONE DELLE VARIABILI E' IN CODA AL CODICE
!macro start_at .address {
* = $0801
!byte $0c,$08,$00,$00,$9e
!if .address >= 10000 { !byte 48 + ((.address / 10000) % 10) }
!if .address >= 1000 { !byte 48 + ((.address / 1000) % 10) }
!if .address >= 100 { !byte 48 + ((.address / 100) % 10) }
!if .address >= 10 { !byte 48 + ((.address / 10) % 10) }
!byte $30 + (.address % 10), $00, $00, $00
* = .address
}
!macro sid_random{
; calcola un valore casuale usando il SID
; il byte random viene salvato nell'accumulatore
LDA #$FF
STA $D40E
STA $D40F
LDA #$80
STA $D412
LDA $D41B
}
;------------------------------------------------------------------------------------
!macro new_position{ ; cambia la posizione dello sprite 0 in modo casuale
LDA #0 ;stick with x0-255
STA $D010 ; la coordinata X puo' essere maggiore di 255 e non puo' essere
; contenuta in un byte. La parte alta e' inserita nella locazione $D010
; in questo esempio la parte alta e' settata a zero per imposizione
+sid_random
TAX
ricalcola
+sid_random
CMP #200 ; compara l'accumulatore con 200
BPL ricalcola
; qui c'e' il problema contrario rispetto a X
; la coordinata Y non puo' essere maggiore di 200 mentre un byte puo' essere 255
; quindi cicla nel calcolare numeri casuali fino a che non e' minore di 200
TAY
STX $D000 ; che contengono la posizione dello sprite 0
STY $D001
}
;------------------------------------------------------------------------------------
+start_at $0900
JSR $E09A
JSR $E544 ; vai alla subroutine che cancella lo schermo
LDA #13 ;
STA $C202
LDA #$0D ;ad $7F8 c'e' il puntatore dello sprite 0
STA $7F8
LDA #$0D ;ad $7F9 c'e' il puntatore dello sprite 1
STA $7F9
LDA #3 ;abilita lo sprite 0, e' una bit mask
STA $D015 ;che serve ad abilitare tutti gli sprite
;abilitare sprite 0 ed 1 si inserisce 3 (11b)
LDA #02 ; in D027 c'e' il colore dello sprite 0
STA $D027 ; viene inserito il valore 2 ovvero rosso
; setta il colore dello sprite 1
LDA #03
STA $D028
LDX #0
LDA #0
;a $0340 c'e' la locazione di memoria dello sprite 0
;ogni sprite e' lungo 63 byte (piu' un byte non utilizzato)
;il codice successivo cicla per pulire l'area di memoria
CLEANUP0 STA $0340,X
INX
CPX #63
BNE CLEANUP0
;ripulisce l'area dello sprite 1
LDX #0
CLEANUP1 STA $0340,X
INX
CPX #63
BNE CLEANUP1
;dopo aver ripulito l'area di memoria la riempie con
;la matrice DATA
LDX #0
BUILD LDA DATA,X
STA $0340,X
INX
CPX #63
BNE BUILD
;position
+new_position
;setta le variabili dello sprite 1
LDX #100 ;
LDY #100 ;
STX $D002 ;
STY $D003
SCAN JSR $FF9F ;richiede al Kernal lo stato della tastiera
JSR $FFE4 ;richiede al Kernal il valore del default input
;sposta lo sprite a seconda dello stato tastiera
START CMP #87 ;W - up
BEQ UP
CMP #83 ;S - down
BEQ DOWN
CMP #65 ;A - left
BEQ LEFT
CMP #68 ;D - right
BEQ RIGHT
CMP $C202 ;end if enter clicked
BEQ END
; controlla se ci sono state collision
LDA $D01E ; byte di collisione hardware tra sprite
CMP #0
BNE END
JMP SCAN
UP LDY $D001 ; carica la posizione Y dello sprite in Y
DEY ; decrementa Y (il sistema di riferimento e' rovesciato)
STY $D001 ; ed aggiorna la posizione dello sprite
;+new_position
JMP SCAN
DOWN LDY $D001
INY
STY $D001
JMP SCAN
LEFT LDX $D000
DEX
STX $D000
CPX #255
BNE SCAN
LDA #0
STA $D010
JMP SCAN
RIGHT LDX $D000
INX
STX $D000
CPX #255
BNE SCAN
LDA #1
STA $D010
JMP SCAN
;clean up at the end
END JSR $E544 ; pulisce lo schermo
LDA #0 ; disabilita lo sprite 0
STA $D015
RTS ; ritorna al prompt
;define the sprite
DATA !byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $38,$00,$00,$fc,$00,$00,$f2,$00
!byte $01,$c3,$00,$01,$89,$80,$03,$80
!byte $c0,$03,$83,$c0,$03,$82,$00,$07
!byte $03,$00,$07,$01,$80,$00,$c0,$80
!byte $00,$79,$80,$00,$0f,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$08
mercoledì 20 giugno 2018
Laser control e raycaster su Aframe
Per poter interagire con gli oggetti su Aframe si puo' utilizzare il laser-control, un componente che mostra un raggio laser che viene emesso dal controller (sia questo DayDream od Oculus) e che puo' interagire con gli oggetti della scena
Il laser-control puo' essere aggiunto con la semplice riga
<a-entity id="rightHand" laser-controls="hand: right" raycaster="objects:#cube"></a-entity>
e' importante inserire la entity in un rig che contenga anche l'oggetto camera in modo che il raggio laser parta sempre come origine dalla camera. E' inoltre importante indicare quali sono gli oggetti con cui il raggio interagira' mediante il comando raycaster
Nell'esempio viene creata una scena con un cubo ed un piano con una texture trasparente. Dopo che l'utente clicca sul cubo con in controller Daydream la texture del piano perde la trasparenza
-------------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Laser Controls</title>
<meta name="description" content="Laser Controls - A-Frame">
<script src="aframe-master.js"></script>
</head>
<body>
<script>
AFRAME.registerComponent('laser-listener', {
init: function () {
var self = this;
var el = this.el;
this.el.addEventListener('mousedown', function (evt) {
document.querySelector('#cube').setAttribute('material', 'color', '#EF2D5E');
document.querySelector('#piano').setAttribute('material','opacity',1.0);
});
this,el.addEventListener('mouseup', function (evt) {
el.setAttribute('material', 'color', self.isMouseEnter ? '#24CAFF' : initialColor);
document.querySelector('#piano').setAttribute('material','opacity',1.0);
});
}
});
</script>
<a-scene auto-enter-vr background="color: #212" antialias="true">
<a-entity id="rig" movement-controls="fly: true; speed: 30" position="300 50 140" rotation="0 45 0">
<a-entity position="50 30 410" camera look-controls wasd-controls></a-entity>
<a-entity id="rightHand" laser-controls="hand: right" raycaster="objects:#cube"></a-entity>
</a-entity>
<a-assets>
<img id="grafico" src="./sposta.jpg">
<img id="trasparente" src="./trasparente.png">
</a-assets>
<a-plane id="piano" src="#grafico" material="opacity:0.0" position="270 40 -10" rotation="0 20 0" width="100" height="60" scale="" visible="" geometry=""></a-plane>
<a-entity laser-listener position="230 7 15" id="cube" geometry="primitive: box; width: 5.5; height: 5.5; depth:5.5" material="color: red"></a-entity>
</a-scene>
</body>
</html>
Il laser-control puo' essere aggiunto con la semplice riga
<a-entity id="rightHand" laser-controls="hand: right" raycaster="objects:#cube"></a-entity>
Nell'esempio viene creata una scena con un cubo ed un piano con una texture trasparente. Dopo che l'utente clicca sul cubo con in controller Daydream la texture del piano perde la trasparenza
-------------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Laser Controls</title>
<meta name="description" content="Laser Controls - A-Frame">
<script src="aframe-master.js"></script>
</head>
<body>
<script>
AFRAME.registerComponent('laser-listener', {
init: function () {
var self = this;
var el = this.el;
this.el.addEventListener('mousedown', function (evt) {
document.querySelector('#cube').setAttribute('material', 'color', '#EF2D5E');
document.querySelector('#piano').setAttribute('material','opacity',1.0);
});
this,el.addEventListener('mouseup', function (evt) {
el.setAttribute('material', 'color', self.isMouseEnter ? '#24CAFF' : initialColor);
document.querySelector('#piano').setAttribute('material','opacity',1.0);
});
}
});
</script>
<a-scene auto-enter-vr background="color: #212" antialias="true">
<a-entity id="rig" movement-controls="fly: true; speed: 30" position="300 50 140" rotation="0 45 0">
<a-entity position="50 30 410" camera look-controls wasd-controls></a-entity>
<a-entity id="rightHand" laser-controls="hand: right" raycaster="objects:#cube"></a-entity>
</a-entity>
<a-assets>
<img id="grafico" src="./sposta.jpg">
<img id="trasparente" src="./trasparente.png">
</a-assets>
<a-plane id="piano" src="#grafico" material="opacity:0.0" position="270 40 -10" rotation="0 20 0" width="100" height="60" scale="" visible="" geometry=""></a-plane>
<a-entity laser-listener position="230 7 15" id="cube" geometry="primitive: box; width: 5.5; height: 5.5; depth:5.5" material="color: red"></a-entity>
</a-scene>
</body>
</html>
Iscriviti a:
Post (Atom)
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...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...