1

Emotion, j'ai fait hier soir mon premier programme Gp32. J'ai meme pas la console.
Meme pas le kit de developement de GamePark. tout a la main, en assembleur triso
Qu'est-ce que ca fait ? Rien du tout. C'etait juste pour debugguer le bios de la becane grin

2

bon, tu nous préviens quand tu auras fait un truc intéressant, du stylé adaptation d'Half Life en assembleur golrotfl

3

Je peux faire un petit jeu 2D avant, chef ?

4

si y a plein de love filles a poil love dedans, ca peut passer tongue

5

Comment faire un jeu avec plein de filles a poils ?

6

tu peux avoir des infos sur ca sur www.google.com en cherchant filles a poil et jeux videos...winktongue

7

euh... commence par faire un jeu intéressant parce que bon pour les filles à poil fx, tu as ce qu'il te faut sur le web, hein ! pas besoin d'avoir des filles à poil partout avec toi, hein ?

8

grin

9

Ma premiere routine de sprite : ; Affichage d'un sprite par transparence sans clipping en mode 16 bits ! ; In: ;     r0 = x ;     r1 = y ;     r2 = Sprite ptr      DrawSprite      stmfd     sp!,{r4,r5,r6,lr}     ; Preserve registres      ldrh     r4,[r2],#2          ; Charge Taille Y      ldrh     lr,[r2],#2          ; Charge Taille X      ldr     r3,Screen          ; Charge l'ecran actuel      rsb     r0,r0,r0 lsl #4          ; x * 15      add     r0,r1,r0 lsl #4      ; x = 16 * (15 * x) + y      add     r3,r3,r0 lsl #1          ; r3 = Screen ptr            mov     r1,#31*32+31          ; Couleur de transparence (Attention a verifier si l'ássembleur genere bien 2 instructions).            mov     r5,#240*2      sub     r5,r5,lr lsl #1          ; Correction au ptr d'écran apres scan d'1 ligne LoopX           mov     r6,lr          ; Recharge nbr de pixel verticaux LoopY                ldrh     r0,[r2],#2     ; Charge pixel                cmp     r0,r1          ; Transparent ?                strne     r0,[r3]          ; Affichage                     add     r3,r3,#2     ; Avancee ptr ecran                subs     r6,r6,#1     ; Boucle Y                bne     LoopY           add     r3,r3,r5     ; Increment X           subs     r4,r4,#1     ; Boucle X           bne     LoopX                 ldmfd     sp!,{r4,r5,r6,pc}     ; Pop et retour a l'appelant
Pas franchement optimise, mais bon.

10

il me tu ce mec, il va remplacer le bios avec ses routines....

a quand le mode 7 sur GP32 PpHd ?

11

TU comtpes faire de l'ASM ou du C ?

12

qui ca ?

PpHd adore l'asm !

13

Je comptes faire de l'assembelur evidememnt ! Je suis pas un petit joeur oui.
Au fait, y'a un bug (C'est strhne), puis j'ai double ma vitesse d'áffichage dans ma nouvelle routine oui

14

tu a deja fait fait des bench avec les routine GP32 ?

15

Eho, du calme. On ne peut avancer correctement que lorsqu'on a appris a tomber

16

PpHd : moi la GP32, ca m'interresse aussi.
Si t'as besoin d'un site pour distribuer tes prods, je suis là grin
Franchement, je n'ai pas vu un seul bon site francais (desole fx-man) avec des vraies infos.
Du style comment faire tourner un jeu sur l'emu.
Quel est le hardware en detail de la GP32
Comment la programmer.
Des liens importants.
Des dl de roms, demos, betas, ...
Des puds détaillés avec images à l'appuie.
etc .etc ...

17

ca m'emeut de voir que ma coloration synthaxique marche, merci PpHd de t'en servir , j'en ai la larme a l'oeil, d'ailleur, si tu veux des améliorations, dis moi ce qui manque, ou ce qui bug wink

18

j'ai deja pensé a faire un site plutos sur tous ce qui est amateur, avec ému et tt....

mais fx-man lui sont site, il veut garder de bonne relation avec gamepark, alors.....

19

J'ai continue ce week-end. Manque de pot, ma disquette contenant le zip du sdk de Game Park foirait. Arg, deception. Ne pourrais-je developper ce week-end de tout mon coeur sur GP32. Non, je n'abondennerais pas. Je vais y arriver sans le sdk. Donc mon objectif est de retrouver les appels bios pour pouvoir travailler. On lance donc GeePee et on charge une demo dont j'ai le code source en C. Arg, le deboggueur de GeePee est pas top. Faut se faire tous les breakpoint a la main. Mais je n'abandonnerais pas ! Courage. Bon on lance en step. trois minutes plus tard, je laisse tomber cette approche. On resete, et on met un breakpoint a $C0000000 (L'adresse du depart de la RAM). Arg, marche pas. Bon resete.... a ben oui, c'est $0C000000 !. On recommence. A cool, ca marche. Bon j'ouvre mon petit init.s dans uedit, et je compare. Cool, j'ai GpSurfaceSet smile On continue... arg, comprend rien c'est quoi la suite. Bon ben on va sauter quelques appels de sous-routines, pour trouver celle qui m'interrese. Ok, c'est l'avant derniere. Resete, rebreakpoint. On y va. Oui, ca ressemble a du C. Une joli Stack Frame au debut. On saute la recopie de chaine, et on va voir la routine GetSurface. Cool, c'est juste un appel au bios (r2=1 / swi 8). On retrouve Lcd_enable aussi dans la foulee.
Bon a present je sais comment allouer des surfaces, les fixes. Il ne me reste plus qu'a trouver SetMode. Or en regardeant la suite logique des appels au swi 8, on remarque que c'ést en ordre croissant : 1 (GetSurface), 2 et 3. Je conjecture donc que c'est la 0.
J'ecris mon code, je deboguee. Arg, je peux pas acceder a mes donnees directement, faut mettre une etape d'indirection supplementaire (Because la ram en R/W est a $0C100000). Bon on le fout. On lance, on deboggue, on deboggue, #sic#. Ouf, ca a l'áir de marcher. je code rapidement un truc pour remplir avec un degrade de bleu. Cool ca marche. victory. Content mais epuise.
Bon maintenant faut que je deboggue Cf sad

20

allé, y a presque plus de boulot sur CF !!
et puis je vais dire aux autre que tu passe autant de temps sur GP32 au lieu de CF !!

21

iceman : on le sait déjà grin

(TechNIC l'espion venu de loin)

22

PpHd, ce serait bien que tu fasses une petite page avec toutes tes decouvertes. Entre autre la map de le memoire ou les registres, les interruptions, et tout les codes SWI !
Il doit bien avoir ces infos dans les docs, mais je suis tres feignant pour lire des docs de plusieurs centaines depages ^^

23

Lama : l'avantage de PpHd, c'est que c'est un bosseur.
Mais il est aussi prévoyant, en effet, tel que je le connais, si il écrit tout sur ce forum, c'est pour avoir une trace écrite (style de sauvegarde)

24

TechNIC
a écrit : l'avantage de PpHd, c'est que c'est un bosseur.


Je crois que tu n'avais pas besoin de le preciser, on avait tous compris que c'est un bosseur et un fonceur aussi smile

25

grin

26

TechNIC a écrit :
Franchement, je n'ai pas vu un seul bon site francais (desole fx-man) avec des vraies infos...
Du style comment faire tourner un jeu sur l'emu.
Quel est le hardware en detail de la GP32
Comment la programmer.
Des liens importants.
Des dl de roms, demos, betas, ...
Des puds détaillés avec images à l'appuie. etc .etc ...


héhé, pas la peine de t'excuser, au début, le site principal du site étaitd'informer les gens sur ce qui se passait sur GP32 officiellement...

La prochaine version qui sortira la semaine prochaine aura des tutoriaux, des tonnes de liens, bref, tout ce que tu veux sauf les truc interdits (du style roms officielles ou bios).
De toute facon, il n'y aura pas de downloads, je suis limité par mon hébergeur...
Mais il y aura les liens pour les trouver !

si tu veux participer au site, va voir l'annonce dans la section "divers"

27

Bon voila mes fichiers de test : ; GP32 Startup Boot Code      CODE32      AREA     Init, CODE, READONLY      IMPORT     |Image$$RO$$Base|      IMPORT     |Image$$RO$$Limit|      IMPORT     |Image$$RW$$Base|      IMPORT     |Image$$RW$$Limit|      IMPORT     |Image$$ZI$$Base|      IMPORT     |Image$$ZI$$Limit|      ; HEADER of the file         ENTRY      B          _GpInit      DCD     |Image$$RO$$Base|   ; Start of Read Only section      DCD     |Image$$RO$$Limit|  ; End "      DCD     |Image$$RW$$Base|   ; Start of Read/Write section      DCD     |Image$$RW$$Limit|  ; End "      DCD     |Image$$ZI$$Base|   ; Base of Zero Initialized section      DCD     |Image$$ZI$$Limit|  ; End "      DCD     0x44450011          ; Magic numbers ?      DCD     0x44450011      DCD     0x01234567      DCD     0x12345678      DCD     0x23456789      DCD     0x34567890      DCD     0x45678901      DCD     0x56789012      DCD     0x23456789      DCD     0x34567890      DCD     0x45678901      DCD     0x56789012      DCD     0x23456789      DCD     0x34567890      DCD     0x45678901      DCD     0x56789012      IMPORT     main      IMPORT     GenInit _GpInit      stmfd     sp!,{r0-r14}      bl     GenInit      bl     main      ldmfd     sp!,{r0-r13,pc}      END

28

La suite :   ; On se place en Read Write pour pouvoir acceder plus rapidement aux variables globales ; Sans indirection supplementaire      CODE32      AREA     Generic, CODE, READWRITE      EXPORT     GenInit GenInit      ; Save Lr      mov     r11,lr            ; Get pointer to GpSurfaceSet routine         mov     r0,#0         swi     0xb      str     r0,SurfaceSet            ; Get time passed         mov     r0,#6         swi     0xb      str     r0,Timer      ldr     r0,[r0]      str     r0,OldTime            ; 16-bits mode      mov     r0,#16      mov     r1,#0      mov     r2,#0                swi     8            ; Allocate 2 DrawSurface      ldr     r0,AdrSurface1      mov     r1,#0      mov     r2,#1      swi     8      ldr     r0,AdrSurface2      mov     r1,#1      mov     r2,#1      swi     8            ; Set Current Displayed Surface      ldr     r0,AdrSurface1      ldr     r1,SurfaceSet      mov     lr,pc          ; Y'a pas a dire l'arm      mov     pc,r1          ; C'est special !            ; Set Current Working Screen      ldr     r0,AdrSurface2      ldr     r0,[r0]          ; Ptr is the first one      str     r0,Screen            mov     pc,r11          ; Return            EXPORT     SwapBuffer SwapBuffer      ldr     r1,=AdrSurface1      ldr     r0,Flip               ; Current Flip      ldr     r2,[r1,r0]          ; Read current working DrawSurface      eor     r0,r0,#4          ; Swap Surface      ldr     r2,[r2]               ; Read Screen      str     r0,Flip               ; Save Flip value      str     r2,Screen          ; Save current working screen      ldr     r2,SurfaceSet          ; Read Surface Set function      ldr     r0,[r1,r0]          ; Read current displayed adress      mov     pc,r2               ; Jump to surface set            EXPORT     Synchro Synchro      ldr     r2,Timer          ; Read Timer      ldr     r1,OldTime          ; Read old Time      add     r1,r0,r1          ; Get new time Loop           ldr     r0,[r2]                          cmp     r0,r1           bls     Loop      mov     pc,lr           EXPORT     GetScreen GetScreen      ldr     r0,Screen      mov     pc,lr           EXPORT     BlendFunc ; In: ; r0 = x ; r1 = y ; r2 = r ; Out ; r0 warning r0.uw is corupted ! BlendFunc      ldr     r3,=0xFC1F03E          ; Masque      orr     r0,r0,r0 lsl #16      orr     r1,r1,r1 lsl #16      and     r0,r0,r3      and     r1,r1,r3      sub     r0,r0,r1      mul     r0,r0,r2      add     r0,r1,r0 lsr #5      and     r0,r0,r3      orr     r0,r0,r0 lsr #16      mov     pc,lr DrawSurface1     DCD     0,0,0,0,0,0,0 DrawSurface2     DCD     0,0,0,0,0,0,0 AdrSurface1     DCD     DrawSurface1 AdrSurface2     DCD     DrawSurface2 Flip          DCD     0 Screen          DCD     0 SurfaceSet     DCD     0 Timer          DCD     0 OldTime          DCD     0            END     

29

Et enfin le main :      AREA     Program, CODE, READONLY      EXPORT     main      IMPORT     GetScreen      IMPORT     SwapBuffer       main      bl     GetScreen      mov     r3,#0 mainloop     ldr     r2,=320*240/64 loop               strh     r3,[r0],#2                subs     r2,r2,#1                bne     loop           add     r3,r3,#1           cmp     r3,#32*2           bne     mainloop      bl     SwapBuffer Stop     b     Stop      END

Diverses infos : Le compilo C suppose qu'a chaque appel de fonction les registres r0,r1,r2,r3, ip(=r12) et lr(=r14) sont detruits.
Les 4 premiers arguments sont dans r0-r3, les autres dans la pile.
La valeur de retour est dans r0.

Le compilo C fait vraiment du bon boulot ! Ca va etre dur de le battre en asm sad
Surtout pour les fonctions tres simples.

Au fait, ce sont les docs sur les swi que j'ai trouves. Les fonctions du sdk font appels aux swi directement, sauf les fonctions d'affichages.
La fonction PutTransBlt16 est vraiment foutu byzarrement. J'ai l'impression qu'ils ont fait un code special pour afficher plus rapidement (lecture de 4 pixels en deux ldr), mais le code pour gerer ca a cote est tress complexe. Je crois que leur code au cas ou c'est pas aligne (Et donc le cas devarable selon eux) est plus rapide ! (A verifier).

30


-------------------------------------------------------------------------------
0x00000000 - 0x0003ffff 512kb system rom (BOOT_ROM)

Exception Vectors

0x00000000 Reset Supervisor
0x00000004 Undefined instruction Undefined
0x00000008 Software Interrupt Supervisor
0x0000000C Abort (prefetch) Abort
0x00000010 Abort (data) Abort
0x00000014 Reserved Reserved
0x00000018 IRQ IRQ
0x0000001C FIQ FIQ

-------------------------------------------------------------------------------
0x0c000000 - 0x0c7fffff 8mb workram (WORK_RAM)
0x0c780000 - 0x0c7fffff 0.5mb used by system
-------------------------------------------------------------------------------
0x14000000 - 0x15a0003f hardware registers

- The special registers have to be accessed by the recommended access unit.
- All registers except ADC registers, RTC registers and UART registers must be
read/written in word unit (32bit) at little endian.
- It is very important that the ADC registers, RTC registers and UART registers
be read/written by the specified access unit and the specified address.
Moreover, one must carefully consider which endian mode is used.

W: 32-bit register, access by LDR/STR or int type pointer(int *)
HW: 16-bit register, access by LDRH/STRH or short int type pointer(short int *)
B: 8-bit register, access by LDRB/STRB or char type pointer(char int *)
-------------------------------------------------------------------------------

MEMORY CONTROLLER

BWSCON 0x14000000 W r/w Bus Width & Wait Status Control
BANKCON0 0x14000004 Boot ROM Control
BANKCON1 0x14000008 BANK1 Control
BANKCON2 0x1400000c BANK2 Control
BANKCON3 0x14000010 BANK3 Control
BANKCON4 0x14000014 BANK4 Control
BANKCON5 0x14000018 BANK5 Control
BANKCON6 0x1400001c BANK6 Control
BANKCON7 0x14000020 BANK7 Control
REFRESH 0x14000024 DRAM/SDRAM Refresh Control
BANKSIZE 0x14000028 Flexible Bank Size
MRSRB6 0x1400002c Mode register set for SDRAM
MRSRB7 0x14000030 Mode register set for SDRAM

USB HOST CONTROLLER

HcRevision 0x14200000 W Control and Status Group
HcControl 0x14200004
HcCommonStatus 0x14200008
HcInterruptStatus 0x1420000c
HcInterruptEnable 0x14200010
HcInterruptDisable 0x14200014
HcHCCA 0x14200018 Memory Pointer Group
HcPeriodCuttentED 0x1420001c
HcControlHeadED 0x14200020
HcControlCurrentED 0x14200024
HcBulkHeadED 0x14200028
HcBulkCurrentED 0x1420002c
HcDoneHead 0x14200030
HcRmInterval 0x14200034 Frame Counter Group
HcFmRemaining 0x14200038
HcFmNumber 0x1420003c
HcPeriodicStart 0x14200040
HcLSThreshold 0x14200044
HcRhDescriptorA 0x14200048 Root Hub Group
HcRhDescriptorB 0x1420004c
HcRhStatus 0x14200050
HcRhPortStatus1 0x14200054
HcRhPortStatus2 0x14200058

INTERRUPT CONTROLLER

SRCPND 0x14400000 W R/W Interrupt Request Status
INTMOD 0x14400004 W Interrupt Mode Control
INTMSK 0x14400008 R/W Interrupt Mask Control
PRIORITY 0x1440000c W IRQ Priority Control
INTPND 0x14400010 R/W Interrupt Request Status
INTOFFSET 0x14400014 R Interrupt request source

DMA

DISRC0 0x14600000 W R/W DMA 0 Initial Source
DIDST0 0x14600004 DMA 0 Initial Destination
DCON0 0x14600008 DMA 0 Control
DSTAT0 0x1460000c R DMA 0 Count
DCSRC0 0x14600010 DMA 0 Current Source Address
DCDST0 0x14600014 DMA 0 Current Destination Address
DMASKTRIG0 0x14600018 R/W DMA 0 Mask Trigger
DISRC1 0x14600020 W R/W DMA 1 Initial Source
DIDST1 0x14600024 DMA 1 Initial Destination
DCON1 0x14600028 DMA 1 Control
DSTAT1 0x1460002c R DMA 1 Count
DCSRC1 0x14600030 DMA 1 Current Source Address
DCDST1 0x14600034 DMA 1 Current Destination Address
DMASKTRIG1 0x14600038 R/W DMA 1 Mask Trigger
DISRC2 0x14600040 W R/W DMA 2 Initial Source
DIDST2 0x14600044 DMA 2 Initial Destination
DCON2 0x14600048 DMA 2 Control
DSTAT2 0x1460004c R DMA 2 Count
DCSRC2 0x14600050 DMA 2 Current Source Address
DCDST2 0x14600054 DMA 2 Current Destination Address
DMASKTRIG2 0x14600058 R/W DMA 2 Mask Trigger
DISRC3 0x14600060 W R/W DMA 3 Initial Source
DIDST3 0x14600064 DMA 3 Initial Destination
DCON3 0x14600068 DMA 3 Control
DSTAT3 0x1460006c R DMA 3 Count
DCSRC3 0x14600060 DMA 3 Current Source Address
DCDST3 0x14600064 DMA 3 Current Destination Address
DMASKTRIG3 0x14600068 R/W DMA 3 Mask Trigger

CLOCK & POWER MANAGEMENT

LOCKTIME 0x14800000 W R/W PLL Lock Time Counter
MPLLCON 0x14800004 MPLL Control
UPLLCON 0x14800008 UPLL Control
CLKCON 0x1480000c Clock Generator Control
CLKSLOW 0x14800010 Slow Clock Control
CLKDIVN 0x14800014 Clock divider Control

LCD CONTROLLER

LCDCON1 0x14a00000 W R/W LCD Control 1
LCDCON2 0x14a00004 LCD Control 2
LCDCON3 0x14a00008 LCD Control 3
LCDCON4 0x14a0000c LCD Control 4
LCDCON5 0x14a00010 LCD Control 5
LCDSADDR1 0x14a00014 STN/TFT: Frame Buffer Start Address1
LCDSADDR2 0x14a00018 STN/TFT: Frame Buffer Start Address2
LCDSADDR3 0x14a0001c STN/TFT: Virtual Screen Address Set
REDLUT 0x14a00020 STN: Red Lookup Table
GREENLUT 0x14a00024 STN: Green Lookup Table
BLUELUT 0x14a00028 STN: Blue Lookup Table
DITHMODE 0x14a0004c STN: Dithering Mode
TPAL 0x14a00050 TFT: Temporary Palette

0x14A00400 palette memory
Palette format is 5:6:5 (or 5:5:5:1)
each entry is 32bit

UART

ULCON0 0x15000000 W R/W UART 0 Line Control
UCON0 0x15000004 UART 0 Control
UFCON0 0x15000008 UART 0 FIFO Control
UMCON0 0x1500000c UART 0 Modem Control
UTRSTAT0 0x15000010 R UART 0 Tx/Rx Status
UERSTAT0 0x15000014 UART 0 Rx Error Status
UFSTAT0 0x15000018 UART 0 FIFO Status
UMSTAT0 0x1500001c UART 0 Modem Status
UTXH0 0x15000020 B W UART 0 Transmission Hold
URXH0 0x15000024 R UART 0 Receive Buffer
UBRDIV0 0x15000028 W R/W UART 0 Baud Rate Divisor

ULCON1 0x15004000 W R/W UART 1 Line Control
UCON1 0x15004004 UART 1 Control
UFCON1 0x15004008 UART 1 FIFO Control
UMCON1 0x1500400c UART 1 Modem Control
UTRSTAT1 0x15004010 R UART 1 Tx/Rx Status
UERSTAT1 0x15004014 UART 1 Rx Error Status
UFSTAT1 0x15004018 UART 1 FIFO Status
UMSTAT1 0x1500401c UART 1 Modem Status
UTXH1 0x15004020 B W UART 1 Transmission Hold
URXH1 0x15004024 R UART 1 Receive Buffer
UBRDIV1 0x15004028 W R/W UART 1 Baud Rate Divisor