LCD FX890P/Z1

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Avatar de l’utilisateur
jvernet
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7838
Inscription : 24 mai 2002 09:57
Localisation : France 69
Contact :

LCD FX890P/Z1

Message par jvernet » 20 janv. 2008 23:28

Chose promise, chose faite: écrire en assembleur sur l'ecran du FX890P.
La source est ici: http://homepage2.nifty.com/stear/fx890p/fxlcdc.htm

Le FX890P/Z1 utilise un HD66108T pour gérer l'écran. Pour afficher quelque chose, on doit piloter le HD66108. La gestion est un vrai beanz, il faut envoyer des ordres au HD66108T, puis les données, etc.
Le principe: On accède à celui ci à travers l'adresse 0A000:00000. On écrit les ordres et les données à cette adresse. A noter que l'on peut écrire dans tous les octets pairs de cette zone, ça fait la même chose.

Evidement (ça serait trop simple), la VRAM n'est pas lineaire. Du coup, il est compliqué de jongler avec le LCD, on peut partir sur un truc plus simple.



On suppose que l'on a un buffer video qui lui, est lineaire. Les pixels sont stockés bit à bit, regroupés en octets, oeuf corse.

Code : Tout sélectionner

SCREEN DB 800 DUP(?)
Il faut d'abord lui dire que l'on veut écrire en mémoire, selon une convention compliquée que je ne développe pas ici. Puis on commence à écrire les octets du buffer dans le registre

Code : Tout sélectionner

;-- PRINT SCREEN --
 PRINT:
 CLD
 MOV AX,0A000H  ; Segment du proc LCD
 MOV ES,AX		; dans ES
 XOR DI,DI		; DI à 0
 MOV AL,23H		; Première étape de la configuration du LCD
 STOSB          ; [ES:DI]<=23H
 MOV AL,0B5H    ; Deuxième étape
 STOSB          ;INC=1,WLS=0: c'est les registres du LCD que l'on configure
 MOV SI,OFFSET SCREEN
 MOV DL,0       ;Y=0
 MOV DH,32      ;Hauteur de l'écran

PRLP1:
 CALL PRSUB     ;Partie gauche de l'écran
 DEC SI
 ADD DL,32
 CALL PRSUB     ;Partie droite

 SUB DL,31      ;DL+32-31=DL+1
 DEC DH
 JNZ PRLP1

 MOV AL,23H     ; ne pas oublier de remettre le 
 STOSB          ; HD66108T
 MOV AL,75H     ; dans l'etat ou on l'a trouvé
 STOSB          ;INC=0,WLS=1
 MOV AL,20H
 STOSB          ;DRAM
 RET

PRSUB:
 MOV AL,21H
 STOSB          ; On va lui donner les coordonnées X
 MOV AL,4
 STOSB          ;X ADDRESS = 4
 MOV AL,22H
 STOSB          ; puis Y
 MOV AL,DL
 STOSB          ;Y ADDRESS = DL
 MOV AL,20H
 STOSB          ;on va écrire dans le HD66108T
 MOV CX,13		; 13h octets

PRSLP1:
 MOVSB          ;[ES:DI++]<=[DS:SI++]
 PUSH AX		; il faut attendre qu'il ait digéré
 PUSH AX
 POP AX
 POP AX         ;WAIT
 INC DI			; on écrira l'octet suivant dans [0A000:+2]
 LOOP PRSLP1
 INC DI
 RET



On peut essayer un petit bout de code plus complet:

Code : Tout sélectionner

ORG 2000H

JMP MAIN:
SCREEN DB 800 DUP(?)

MAIN:
CALL PRINT
IRET

PRINT:
 ...
 ...
 ... le code de ci dessus
 ...


En BASIC pour voir ce que ça donne:

Code : Tout sélectionner

10 CLS
20 FOR I=0 TO 20:POKE &H2003+I,85:NEXT I
30 CALL &H2000
Bon, rien d'original de ma part, c'est expliqué sur la page donnée ci dessus, en Japonais (vive google Translate).
Exercice: à partir de ça, écrire l'équivalent de l'instruction GPRINT des Sharps, dans le buffer.

Je cherche à savoir comment on lit dans le HD66108T pour sauvegarder l'écran.
"l'ordinateur et l'homme sont les deux opposés les plus intégraux qui existent. L'homme est lent, peu rigoureux et très intuitif. L'ordinateur est super rapide, très rigoureux et complètement con."

Avatar de l’utilisateur
chr!x
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 892
Inscription : 26 févr. 2007 11:35
Localisation : CasioLand
Contact :

Message par chr!x » 21 janv. 2008 01:06

Beau travail :)
.....::::: La Bible du FX-850P - Groupe OISAC ::::::::::: CASIOthèque :::::.....
Image

Avatar de l’utilisateur
Xerxes
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 291
Inscription : 02 avr. 2007 13:41
Localisation : Allemagne
Contact :

Message par Xerxes » 24 janv. 2008 02:07

jvernet a écrit : Je cherche à savoir comment on lit dans le HD66108T pour sauvegarder l'écran.
I don't know how to read out the HD66108T, but you can use these commands:

MODE54,(X1,Y1)-(X2.Y2) to get a dot image

MODE55,(X1,Y1)-(X2.Y2) to get a dot image and removing it from the display

MODE56,(X1,Y1) to put the dot image to the LCD


Edit: I have found the data sheet of the HD66108T as PDF.

http://www.datasheetarchive.com/preview/1554865.html

Avatar de l’utilisateur
jvernet
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7838
Inscription : 24 mai 2002 09:57
Localisation : France 69
Contact :

Message par jvernet » 24 janv. 2008 09:01

Xerxes a écrit :
I don't know how to read out the HD66108T, but you can use these commands:

MODE54,(X1,Y1)-(X2.Y2) to get a dot image

MODE55,(X1,Y1)-(X2.Y2) to get a dot image and removing it from the display

MODE56,(X1,Y1) to put the dot image to the LCD


Edit: I have found the data sheet of the HD66108T as PDF.

http://www.datasheetarchive.com/preview/1554865.html
I found these MODE5X instruction. The question is; where is in RAM the data ?
"l'ordinateur et l'homme sont les deux opposés les plus intégraux qui existent. L'homme est lent, peu rigoureux et très intuitif. L'ordinateur est super rapide, très rigoureux et complètement con."

Avatar de l’utilisateur
Xerxes
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 291
Inscription : 02 avr. 2007 13:41
Localisation : Allemagne
Contact :

Message par Xerxes » 25 janv. 2008 02:09

jvernet a écrit : The question is; where is in RAM the data ?
In fact, a very good question. :wink:

First I thought about the system area, but deeper investigation shows this:

The files P0-P9 and F0-F9 are arranged sequentially in the RAM. The image buffer
is located behind F9. That means the file end pointer of F9 in the system RAM
points to the image buffer (&H1AC2:Offset and &H1AC4:Segment).

In the virtual screen dot buffer (192*64 dots) 6 pixel are stored in a byte,
because of the arrangement of the LCD driver. But in the image buffer 8 pixels
are stored in a byte. The buffer has the following structure:

1. Byte: X1
2. Byte: Y1
3. Byte: X2 (>X1)
4. Byte: Y2 (>Y1)

Bytes needed for the buffer itself: INT((X2-X1+1)*(Y2-Y1+1)/8+1)

The data of the buffer is valid until an action takes place that moves
the RAM contents, like file operations or changing the system area size.

Répondre

Revenir vers « Tous les Pockets »