Das Deutsche Casio-Taschenrechner Forum wurde zum 31.12.2013 geschlossen und kann weiterhin als Nachschlagewerk verwendet werden.
Wer mehr erfahren möchte: Ein sehr guter Beitrag von Elias

Display-Driver-Adresse

Hilfe beim Programmieren mit dem fx-9860G SDK.

Display-Driver-Adresse

Beitragvon afxi » Fr 19. Okt 2012, 10:38

Beim erstellen einer Bibliothek mit nützlichen Funktionen zur Verwendung mit GCC bräucht ich mal eine kleine Info:
Weiß jemand die Adresse des Display-Drivers ? (-> Simon ? cfxm ? ;-) )
Alles immer über den Umweg des VRAMS und Casio's Funktionen auf den Bildschirm zu schreiben ist ein klein wenig langsam für möglichst flüssige Graustufen und ich möchte wenn möglich ohne Revolution-FX auskommen (soll OS-unabhängig sein und RevFX ist gerade dafür ja leider nicht bekannt)...
Mein Plan ist, dann einfach mithilfe von memcpy meinen Buffer zur Adresse des Display-Drivers zu kopieren.
MfG,
afxi
Benutzeravatar
afxi
 
Beiträge: 58
Registriert: Mi 10. Dez 2008, 09:42
Taschenrechner: .
AFX 2.0 Plus Rom 1.05
fx 9860 G Rom 2.0

Re: Display-Driver-Adresse

Beitragvon Casimo » Fr 19. Okt 2012, 15:16

Hilft dir evtl. der Sourcecode von der MonochromeLib (http://www.planet-casio.com/Fr/logiciels/voir_un_logiciel_casio.php?logiciel=SDK_G85_-_MonochromeLib_Snippets&showid=86) weiter ?

Code: Alles auswählen
void ML_display_vram()
{
   char *LCD_register_selector = (char*)0xB4000000, *LCD_data_register = (char*)0xB4010000, *vram;
   int i, j;
   vram = ML_vram_adress();
   for(i=0 ; i<64 ; i++)
   {
      *LCD_register_selector = 4;
      *LCD_data_register = i|192;
      *LCD_register_selector = 4;
      *LCD_data_register = 0;
      *LCD_register_selector = 7;
      for(j=0 ; j<16 ; j++) *LCD_data_register = *vram++;
   }
}
Bild
Benutzeravatar
Casimo
 
Beiträge: 111
Registriert: Fr 3. Aug 2012, 14:48
Taschenrechner: fx9860 GII USB Power Graphic 2
fxCG20

Re: Display-Driver-Adresse

Beitragvon cfxm » Sa 20. Okt 2012, 15:43

Link: http://www.omnimaga.org/index.php?topic ... #msg284209

Aus Simon's Dokumentation:
It seems to be not too simple to write to the Prizm's LCD-driver-interface 0xB4000000.

First the LCD-driver-register has to be selected.

If the OS issues a LCD-driver-register-select (syscall 0x01a2), it first clears bit 4 of SH-7724 port R 0xA405013C (it looks as if this bit controls the LCD-driver's RS-bit; refer to the R61509-manual).
Then the SH-4A instruction SYNCO is performed.
Then the register number is written to 0xB4000000
Then the SH-4A instruction SYNCO is performed.
Then bit 4 of SH-7724 port R 0xA405013C is set again.
Then the SH-4A instruction SYNCO is performed.

After a LCD-driver-register has been selected, it can be written to (by writing to 0xB4000000 again)

Every time register 0xB4000000 as well as SH-7724 port R 0xA405013C are written to, the SH-4A-specific instruction SYNCO is immediately performed.

It is doubtful that directly writing to the LCD-driver enhances display-performance.
I observed, that writing to VRAM and moving the RAM to the LCD by DMA (syscall 0x025F/syscall 0x0260) is significantly faster than direct LCD-driver access.


Das bezieht sich allerdings auf den Prizm. Beim fx-9860G/GII ist einiges vermutlich ähnlich.
Zuletzt geändert von cfxm am Do 14. Feb 2013, 19:05, insgesamt 3-mal geändert.
cfxm
 
Beiträge: 739
Registriert: Mi 1. Apr 2009, 19:39

Re: Display-Driver-Adresse

Beitragvon afxi » Mo 26. Nov 2012, 22:07

Die Funktion von Monochrome-Lib funktioniert bei mir nicht - aber ich habs inzwischen (nach mehreren Anläufen) geschafft, nach der Vorlage im Prizm-Wiki das ganze in Gnu-Assembler kompatiblen Quelltext umzuschreiben und nebenbei ein klein wenig zu optimieren (2 Stackzugriffe gespart, da r2 noch frei war). Zudem nimmt diese Routine einen Pointer auf einen Puffer als Argument, sodass man damit auch recht einfach Graustufen realisieren kann (bereits erledigt ;-) ):
Code: Alles auswählen
! adapted from http://prizmwiki.omnimaga.org/wiki/Fx-9860G/GII_Display_Driver
! (c) afxi 2012
   .text;
   .align 2;
   
   .global _DrawAll

_DrawAll:
      mov.l   r11, @-r15            ! store register on stack
      mov.l   r10, @-r15            !
      mov.l   r9, @-r15            !
      mov.l   r8, @-r15            !

      mov      #4, r0               ! r0  = 4 (VR4)
      mov.l   LCD_Register_Select, r10! r10  = LCD register select address
      mov.l   LCD_Data_Access, r5      ! r5  = LCD data address
      mov      #1, r7                ! r7  = 1 (VR1)
      mov      #0x40, r8            ! r8  = 64 (total number of lines)
      mov      #0x10, r9            ! r9  = 16 (no of bytes per line, 16B*8b = 128b per line)
      mov      #7, r11               ! r11 = 7 (VR7)
      mov      #0, r2               ! r12 = 0
      mov      r2, r1               ! r1  = 0 (line counter)

   SelectLine:
      mov      r9, r6               ! reset bytecount to the value 16
      mov.b   r0, @r10            ! select LCD register VR4
      mov      #0xC0, r3            ! r3 = FFFFFFC0, 6 bits left to count the 64 display lines
      or      r1, r3               ! move line counter value onto the mask
      mov.b   r3, @r5               ! set LCD register VR4 to line number
      mov.b   r7, @r10            ! select LCD register VR1
      mov.b   r7, @r5               ! set LCD register VR1 to 1
      mov.b   r0, @r10            ! select LCD register VR4
      mov.b   r2, @r5               ! set LCD register VR4 to 0

   WriteLine:
      mov.b   r11, @r10            ! select LCD register VR7
      dt      r6                  ! decrease bytecount
      mov.b   @r4+, r3            ! move VRAM byte into r3, and advance VRAM pointer to next byte
      bf/s   WriteLine            !>if line is not finished (r6!=0), write next byte (delayed)
      mov.b   r3, @r5               !^move byte from VRAM into LCD register
      add        r7, r1               ! advance line counter
      cmp/ge  r8, r1               ! if this is not the last line
      bf      SelectLine            ! go to next line

      mov.l   @r15+, r8            ! restore registers from stack and finish
      mov.l   @r15+, r9            !
      mov.l   @r15+, r10            !
      mov.l   @r15+, r11            !
      rts

.align 4
      LCD_Register_Select: .long 0xB4000000
      LCD_Data_Access: .long 0xB4010000

Zur Verwendung in C braucht's jetzt nur noch eine kleine Definition im Header:
Code: Alles auswählen
void DrawAll(unsigned long *buffer);


Nebenbei hab ich dann auch noch die Funktion zum ändern des Kontrasts adaptiert:
Code: Alles auswählen
! adapted from http://prizmwiki.omnimaga.org/wiki/Fx-9860G/GII_Display_Driver
! (c) afxi 2012
   .text;
   .align 2;
   
   .global _ChangeContrast
   
_ChangeContrast:
   mov.l   LCD_Register_Select, r3   ! The address of the register selector
   mov      #6, r2               ! The register we want to select (R6)
   mov.b   r2, @r3               ! Write the register to select to the selector (B4000000)
   mov.l   LCD_Data_Access, r0      ! Now we want to write a value in the register so we must select the data line
   mov.b   r4, @r0               ! And write our value there. The contrast value is here given in R4
   rts                        ! Return to the calling function

   LCD_Register_Select: .long 0xB4000000
   LCD_Data_Access: .long 0xB4010000

Die ensprechende Definition für den Header:
Code: Alles auswählen
void Change_Contrast(char contrast);


Danke für die Hinweise ! Die MonochromeLib sieht sonst auch recht interessant aus, zumindest manche Funktionen davon - einige werde ich bestimmt noch portieren.
An die Clear-Screen-Funktion setz ich mich gleich mal dran.
mfg,
afxi
Benutzeravatar
afxi
 
Beiträge: 58
Registriert: Mi 10. Dez 2008, 09:42
Taschenrechner: .
AFX 2.0 Plus Rom 1.05
fx 9860 G Rom 2.0


Zurück zu fx-9860G SDK (Alle fx-9860G Modelle)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast