Blog PureBasic: Nouvel article

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Blog PureBasic: Nouvel article

Message par djes »

G-Rom a écrit : jeu. 13/mai/2021 13:50 Salut Djes , fait longtemps que je t'ai lu , tu fait quoi de beau avec python ? je vois qu'il y a plein "d'ancien" qui change , & tu as des nouvelles de polux ?
Salut ! C'est pour le boulot, je fais des plugins et des barres d'outils, rien de bien folichon. Je n'ai pas vraiment changé, je ne code quasiment plus depuis pas mal d'années déjà, juste du bricolage ici et là. J'ai récemment acheté un petit kit d'électronique mais je n'ai toujours rien fait, pourtant ça semble simple comme bonjour.
Polux va bien je pense, je n'ai de nouvelles que via Facebook, comme beaucoup. Il a récemment remis le couvert sur plusieurs jeux, refait des niveaux et des mises à jour, mais ça fait longtemps que ce n'est plus sur PB même s'il aime beaucoup.
Et toi, que fais-tu de beau?
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Blog PureBasic: Nouvel article

Message par G-Rom »

rien de bien passionnant hélas , je me bricole une borne d'arcade modèle géant ( 2,10m ) , je fait du godot engine & du blender à mes temps perdu avec un peu de pixel art. et j'ai codé un émulateur en PB pour le chip8 & super chip 8 pour le fun.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Blog PureBasic: Nouvel article

Message par djes »

G-Rom a écrit : jeu. 13/mai/2021 21:39 rien de bien passionnant hélas , je me bricole une borne d'arcade modèle géant ( 2,10m ) , je fait du godot engine & du blender à mes temps perdu avec un peu de pixel art. et j'ai codé un émulateur en PB pour le chip8 & super chip 8 pour le fun.
Pas si mal quand même. J'espère que tu nous posteras des photos de ta borne. J'ai un ami qui a fait plusieurs petits modèles, peaufinés à l'extrême, ça donne envie.
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Blog PureBasic: Nouvel article

Message par G-Rom »

A partir d'une planche de mdf, je dessine le gabarit ( que j'ai d'abord fait en 3d sur le pc )
Image

Je coupe à la scie sauteuse , le mieux possible
Image

je copie à la défonceuse :
Image

après , c'est du montage en suivant mes plans
Image

avec système de porte bouteille pour les longues partie de windjammers
Image

l'éclairage du marquee :
Image

et maintenant :
Image

il reste évidement plein de chose à faire , les stickers pour le devant ( theme retro 80 ) , le marquee , les angles en alu , et les leds.
et pourquoi pas , un jeu fait par moi même fait en PB ^^
Le tout tourne sous un RPI4 sous recalbox ( pas convaincu par l'os , notamment sur comment intégré ses propres exe )
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Blog PureBasic: Nouvel article

Message par djes »

Je ne connais pas cette marque de manette :lol:
En tous cas c'est très réussi, bravo ! Tu risques d'avoir des demandes du forum ;)
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Blog PureBasic: Nouvel article

Message par TazNormand »

Salut Tous,

Excellent G-Rom, j'hésite encore à m'acheter un Rpi4 sur AliExpress pour me faire une petite "multi-console" sur ma TV, mais pas avec RecalBox mais Batocera.

J'ai cherché un moment une ancienne borne d'arcade pour y installer un miniPC ou un Rpi, mais vu le prix qu'elle sont vendues, j'ai laissé tomber.

En ce moment je suis à la recherche de matos Amstrad et Amiga à vraiment pas cher, voire des dons par les amis ou la famille. On m'a récemment donné un Amstrad CPC 6128 en fond de sous-sol, malheureusement l'écran avait été déjà jeté. J'écume le bon coin à la recherche d'un écran, mais les prix c'est du n'importe quoi, et quand c'est pas trop cher, les gens ne veulent pas faire d'envoi de colis.

Concernant ta borne, si jamais tu décides de faire une page perso avec plan, références et liens pour les manettes marquée etc..., perso je suis preneur.

En tous cas, beau projet, et n'oublies pas le monnayeur pour payer les bières (sans alcool à ce que je vois)
Image
Image
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Blog PureBasic: Nouvel article

Message par G-Rom »

Merci,
J'ai cherché un moment une ancienne borne d'arcade
Pareil , les gens sont tombé sur la tête , vendre une merde qui ne marche pas avec du hardware pourri à un prix fou me sidère...
J'ai acheté l'alimentation électrique de ma borne chez lui : https://pm88.fr/ , j'ai eu le gars au téléphone , il est super sympa , il m'a filé en plus des connecteurs dupont. il fait même des bar top à des prix super raisonnable , le faire sois même , ca coûte un bras , sans compté le foirage dans les finitions... j'en sais quelque chose, et le temps passé , ca fait 3 mois que je suis dessus , pas tout les jours , mais facilement 200h dessus. il reste une vingtaine d'heure de boulot dessus. après , une borne de 2,10m , ca n'existe pas sur le marché, j'ai du voir du 1,70 max a 2000€.
là, entre le bois ( 200€ ) , (le hardware ~300€) , les finitions ( ~200€ ) , ca vaut le coup de se faire chier.
https://www.facebook.com/10004626728307 ... 265573780/
références et liens pour les manettes marquée
https://www.slagcoin.com/joystick/layout.html
En ce moment je suis à la recherche de matos Amstrad et Amiga à vraiment pas cher, voire des dons par les amis ou la famille. On m'a récemment donné un Amstrad CPC 6128 en fond de sous-sol, malheureusement l'écran avait été déjà jeté. J'écume le bon coin à la recherche d'un écran, mais les prix c'est du n'importe quoi, et quand c'est pas trop cher, les gens ne veulent pas faire d'envoi de colis.
Je crois que j'ai un voisin qui a sa dans son garage, je ne suis pas sur, quand il rentre de vacance , je lui poserais la question , je pourrais même te l'apporter , il m'arrive d'aller à Verson à coté de caen chez le frangin, t'est pas loin si mes souvenir sont bon.
j'hésite encore à m'acheter un Rpi4 sur AliExpress
RPI4 , achète le en France. c'est le même prix. tu peut prendre la "partie boutons & joystick", c'est la même chose qui vendent ici , mais surtout pas d'alimentation électrique. c'est de la chinoiserie qui n'est pas estampillé "CE" , sauf si tu veux foutre le feu chez toi :

https://fr.aliexpress.com/item/33040509 ... eb201603_

pareil , le son , tu peut le commander sur ali , c'est pas super "quali" , mais ca rend super bien pour une borne rétro :

https://fr.aliexpress.com/item/10050014 ... 5617%23863
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Blog PureBasic: Nouvel article

Message par venom »

G-Rom a écrit : jeu. 13/mai/2021 21:39 et j'ai codé un émulateur en PB pour le chip8 & super chip 8 pour le fun.
Tiens c'est drôle ça. Je suis tomber sur un article il y a peu, qui "expliquer" le déroulement pour émuler la chip-8.
Il fonctionne bien ? :roll: :)

Je vois que la borne avance bien 8)






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Blog PureBasic: Nouvel article

Message par G-Rom »

oui, j'ai le code si tu veut.
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Blog PureBasic: Nouvel article

Message par venom »

Oui, pourquoi pas. C'est toujours intéressant je pense :wink: (Même si je n'ai pas les compétences pour le comprendre) :oops:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Blog PureBasic: Nouvel article

Message par G-Rom »

voila la partie chip8 / superchip8 de mon émulateur :

le principe est simple, comme un système de carte perforée, sauf qu'ici , c'est des bits, chaque instruction s'appelle un opcode

http://devernay.free.fr/hacks/chip8/C8TECH10.HTM

chaque instruction est codé sur 16 bits, exemple , l'instruction CALL :

2nnn - CALL addr

2 - numéro de l'opcode
nnn , l'adresse


dans la macro opcode, j'extrais ce que j'ai besoin avec le décalage de bits adéquat :

Code : Tout sélectionner

HEAD.a      = (*_C_\opcode & $F000) >> 12
  NNN.w       = (*_C_\opcode & $0FFF)
  NN.w        = (*_C_\opcode & $00FF)
  X.a         = (*_C_\opcode & $0F00) >> 8
  Y.a         = (*_C_\opcode & $00F0) >> 4
  N.a         = (*_C_\opcode & $000F)

pour l'instruction CALL , HEAD contiendra 0x2000
et NNN l'adresse ( 4096 possibilité )

voici l'include en question, je n'ai pas volontairement mis la partie application , elle est complexe , il faudrait que je simplifie , mais pour le moment , la flemme... :) :

Code : Tout sélectionner

; ///////////////////////////////////////////////////////////////////////////////////////////////// 
;
;          /$$$$$$$  /$$   /$$ /$$$$$$$  /$$$$$$$$  /$$$$$$  /$$   /$$ /$$$$$$ /$$$$$$$   /$$$$$$ 
;         | $$__  $$| $$  | $$| $$__  $$| $$_____/ /$$__  $$| $$  | $$|_  $$_/| $$__  $$ /$$__  $$
;         | $$  \ $$| $$  | $$| $$  \ $$| $$      | $$  \__/| $$  | $$  | $$  | $$  \ $$| $$  \ $$
;         | $$$$$$$/| $$  | $$| $$$$$$$/| $$$$$   | $$      | $$$$$$$$  | $$  | $$$$$$$/|  $$$$$$/
;         | $$____/ | $$  | $$| $$__  $$| $$__/   | $$      | $$__  $$  | $$  | $$____/  >$$__  $$
;         | $$      | $$  | $$| $$  \ $$| $$      | $$    $$| $$  | $$  | $$  | $$      | $$  \ $$
;         | $$      |  $$$$$$/| $$  | $$| $$$$$$$$|  $$$$$$/| $$  | $$ /$$$$$$| $$      |  $$$$$$/
;         |__/       \______/ |__/  |__/|________/ \______/ |__/  |__/|______/|__/       \______/ 
;                                                                                         
;                                      PURECHIP8 - BY G-ROM                                                                                         
;                                                                                         
; /////////////////////////////////////////////////////////////////////////////////////////////////

Structure Chip8
  i.w            ; index register
  pc.w           ; program counter
  spi.w          ; stack pointer
  st.a           ; sound timer
  dt.a           ; delay timer
  opcode.w       ; current opcode
  sp.w[16]       ; stack pointer
  r.a[8]         ; user register
  keyboard.a[16] ; keyboard 
  stack.w[16]    ; stack
  v.a[16]        ; 8 bits register
  mem.a[4096]    ; 4k ram
  video.a[1024]  ; 64x32 pixels or 128x64 pixels in superchip mode
  flags.l        ; cpu flags , include quirks implementation
  rf.a           ; custom flag for rendering
EndStructure

#CPU_FLAG_QUIRKS_S  =   1 << 0 
#CPU_FLAG_QUIRKS_F  =   1 << 1
#CPU_FLAG_SUPERCHIP =   1 << 2 
#PROGRAM_START_LOCATION = $200
#FONT_MEMORY_LOCATION   = $50

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Declare InitializeChip8(*chip.Chip8)
Declare reset_chip(*chip.Chip8)
Declare LoadRomFromFile(*chip.Chip8, filename.s)
Declare update_timer(*chip.Chip8,sound_id.i) ; 60hz
Declare enable_flag(*chip.Chip8, flag.a)
Declare disable_flag(*chip.Chip8, flag.a)
Declare cycle(*chip.Chip8)


; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;- MACRO HELPER
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Global *_C_.Chip8

Macro CHIP(_CHIP_):*_C_ = _CHIP_ : EndMacro

Macro set_pixel_on(_chip_, _xx_, _yy_)
  If(_yy_ >=0 And _yy_ <=63 And _xx_ >=0 And _xx_ <=127)
    _chip_\video[(_xx_ + 128 * _yy_) / 8] | (1 << ( 7 - (_xx_%8))) 
  EndIf
EndMacro

Macro set_pixel_off(_chip_, _xx_, _yy_)
  If(_yy_ >=0 And _yy_ <=63 And _xx_ >=0 And _xx_ <=127)
    _chip_\video[(_xx_ + 128 * _yy_) / 8] & ~(1 << ( 7 - (_xx_%8))) 
  EndIf
EndMacro

Macro get_pixel(_chip_, _pixel_, _xx_, _yy_)
  If(_yy_ >=0 And _yy_ <=63 And _xx_ >=0 And _xx_ <=127)
    _pixel_ = _chip_\video[(_xx_ + 128 * _yy_) / 8] >> ( 7 - (_xx_%8)) & 1
  EndIf
EndMacro

Macro clear_video(_chip_)
  For _i_ = 0 To 127
    PokeD(@_chip_\video + (_i_*8), 0)
  Next
EndMacro

Macro OPCODE()
  If *_C_\pc  => 4094
    *_C_\opcode = $0000
    *_C_\pc = 4092
  Else 
    *_C_\opcode = ((*_C_\mem[*_C_\pc] << 8) | (*_C_\mem[*_C_\pc+1]) & $FFFF)
  EndIf   
  HEAD.a      = (*_C_\opcode & $F000) >> 12
  NNN.w       = (*_C_\opcode & $0FFF)
  NN.w        = (*_C_\opcode & $00FF)
  X.a         = (*_C_\opcode & $0F00) >> 8
  Y.a         = (*_C_\opcode & $00F0) >> 4
  N.a         = (*_C_\opcode & $000F)
EndMacro  

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;-OPCODE Instructions
;
; /////////////////////////////////////////////////////////////////////////////////////////////////

;CLS
Macro _00e0()
  For i = 0 To 1024-1
    *_C_\video[i] = 0 
  Next : *_C_\rf = 1 
  *_C_\pc + 2 
EndMacro

;RET
Macro _00ee()
  *_C_\spi-1
  *_C_\pc = *_C_\sp[*_C_\spi]
  *_C_\pc+2
EndMacro

;SYS
Macro _0nnn()
  *_C_\pc = NNN
EndMacro  

;JP addr
Macro _1nnn():
  *_C_\pc = NNN
EndMacro 

;CALL addr
Macro _2nnn()  
  *_C_\sp[*_C_\spi] = *_C_\pc
  *_C_\spi +1
  *_C_\pc = NNN
EndMacro 

;SE Vx byte
Macro _3xnn()
  If *_C_\v[X] = NN  
    *_C_\pc + 2 
  EndIf 
  *_C_\pc + 2 
EndMacro  
  
;SNE Vx byte
Macro _4xnn()
  If *_C_\v[X] <> NN  
    *_C_\pc + 2 
  EndIf 
  *_C_\pc + 2 
EndMacro  

;SE Vx Vy
Macro _5xy0()
  If *_C_\v[X] = *_C_\v[Y]
    *_C_\pc+4
  Else
    *_C_\pc+2
  EndIf
EndMacro 

;LD Vx byte
Macro _6xnn()
  *_C_\v[X] = NN
  *_C_\pc+2
EndMacro

;ADD Vx byte
Macro _7xnn()
  result = *_C_\v[X] + NN
  If result >= 256
    *_C_\v[X] = result - 256
  Else
    *_C_\v[X] = result
  EndIf
  *_C_\pc+2
EndMacro  

;LD Vx Vy
Macro _8xy0()
  *_C_\v[X] =  *_C_\v[Y]  
  *_C_\pc + 2
EndMacro 

;OR Vx Vy
Macro _8xy1()
  *_C_\v[X]=*_C_\v[X] | *_C_\v[Y]
  *_C_\pc+2
EndMacro    

;And Vx Vy  
Macro _8xy2()
  *_C_\v[X]=*_C_\v[X] & *_C_\v[Y]
  *_C_\pc+2
EndMacro

;XOR Vx Vy
Macro _8xy3()
  *_C_\v[X]=*_C_\v[X] ! *_C_\v[Y]
  *_C_\pc+2
EndMacro  

;ADD Vx Vy
Macro _8xy4()
  result = *_C_\v[X] + *_C_\v[Y]  
  If result>$FF
    *_C_\v[15]=1
  Else  
    *_C_\v[15]=0 
  EndIf
  *_C_\v[X]=result&$FF
  *_C_\pc+2
EndMacro  

;SUB Vx Vy
Macro _8xy5()
  result = (*_C_\v[X] - *_C_\v[Y]) 
  If *_C_\v[X] > *_C_\v[Y]
    *_C_\v[15] = 1
  Else
    *_C_\v[15] = 0
  EndIf
  *_C_\v[X] = result & $FF
  *_C_\pc+2
EndMacro

;SHR Vx
Macro _8xy6()
  If Not (*_C_\flags & #CPU_FLAG_QUIRKS_S)
    *_C_\v[15] = *_C_\v[X] & $1
    *_C_\v[X]  = *_C_\v[X] >> 1
  Else 
    *_C_\v[15] = *_C_\v[Y] & $1
    *_C_\v[X]  = *_C_\v[Y] >> 1
  EndIf  
  *_C_\pc + 2
EndMacro 
  
;SUBN Vx Vy
Macro _8xy7()
  If *_C_\v[Y]>*_C_\v[X]
    *_C_\v[15]=1
  Else
    *_C_\v[15]=0
  EndIf
  *_C_\v[X] = *_C_\v[Y] - *_C_\v[X]
  *_C_\pc+2
EndMacro  

;SHL Vx
Macro _8xyE()
    If Not (*_C_\flags & #CPU_FLAG_QUIRKS_S)
      *_C_\v[15] = *_C_\v[X] >> 7
      *_C_\v[X]  = *_C_\v[X] << 1
    Else 
      *_C_\v[15] = *_C_\v[Y] >> 7
      *_C_\v[X]  = *_C_\v[Y] << 1
    EndIf     
    
  *_C_\pc+2
EndMacro  

;SNE Vx Vy
Macro _9xy0()
  If *_C_\v[X] <> *_C_\v[Y]
    *_C_\pc+4
  Else
    *_C_\pc+2
EndIf:EndMacro  


;LD I addr
Macro _Annn()
  *_C_\i = NNN
  *_C_\pc+2
EndMacro  

;JP Addr + V[0]
Macro _Bnnn()
  *_C_\pc = (*_C_\v[0] + NNN) & $FFFF
EndMacro  

;RND
Macro _Cxnn()
  *_C_\v[X] = ((Random($FFFF)%$100) & NN)
  *_C_\pc+2
EndMacro 


;DRW Vx Vy nibble
Macro _Dxyn()
  *_C_\v[15] = 0
  _SH8_ = Bool(*_C_\flags & #CPU_FLAG_SUPERCHIP) ; superchip 

  _W_   = 128 >> (1 - _SH8_)                           ; divide screen if not superchip
  _H_   = 64  >> (1 - _SH8_)                           ; 
  
  For _row_ = 0 To N-1
    For _col_ = 0 To 8-1
      _pixels_  = (*_C_\mem[ *_C_\i + _row_] >> ( 7 - _col_)) & 1
      _px_      = (*_C_\v[X] + _col_) % _W_
      _py_      = (*_C_\v[Y] + _row_) % _H_; wrapping ?
      If _SH8_ ; collision
        _result_ = 0
        get_pixel(*_C_, _result_, _px_, _py_)
        *_C_\v[15] | ( _result_ & _pixels_ )
       Else
        _result_ = 0
        get_pixel(*_C_, _result_, (_px_ * 2) , (_py_ * 2))
        *_C_\v[15] | ( _result_ & _pixels_ )
      EndIf
      If _SH8_
        _result_ = 0
        get_pixel(*_C_, _result_, _px_, _py_)
        
        If _result_ ! _pixels_
          set_pixel_on(*_C_,_px_,_py_)
        Else 
          set_pixel_off(*_C_,_px_,_py_)
        EndIf
      Else 
        _result_ = 0
        get_pixel(*_C_, _result_, (_px_ * 2), (_py_ * 2))
        If _result_ ! _pixels_
          set_pixel_on(*_C_, (_px_*2),   (_py_*2))
          set_pixel_on(*_C_,((_px_*2)+1),(_py_*2))
          set_pixel_on(*_C_,((_px_*2)+1),((_py_*2)+1))
          set_pixel_on(*_C_, (_px_*2),   ((_py_*2)+1))
        Else 
          set_pixel_off(*_C_, (_px_*2),    (_py_*2))
          set_pixel_off(*_C_,((_px_*2)+1), (_py_*2))
          set_pixel_off(*_C_,((_px_*2)+1),((_py_*2)+1))
          set_pixel_off(*_C_, (_px_*2),   ((_py_*2)+1))
        EndIf
      EndIf
    Next
  Next  
  *_C_\rf = 1
  *_C_\pc + 2
EndMacro

;SKP Vx
Macro _Ex9E()
  If *_C_\keyboard[ *_C_\v[X] ]
    *_C_\pc+4
  Else
    *_C_\pc+2
  EndIf
  EndMacro  

;SKNP Vx
Macro _ExA1()
  If Not *_C_\keyboard[ *_C_\v[X] ]
    *_C_\pc+4
  Else
    *_C_\pc+2
EndIf:EndMacro  


; LD Vx DT
Macro _Fx07()
  *_C_\v[X] = *_C_\dt
  *_C_\pc+2
EndMacro 

; LD Vx K
Macro _Fx0A()
;   pressed=#False:
  For i=0 To 15
    If *_C_\keyboard[i]
      *_C_\v[X] = i
      *_C_\pc + 2
      ProcedureReturn 
    EndIf
  Next
EndMacro

; LD Dt Vx
  Macro _Fx15()
    *_C_\dt=*_C_\v[X]
    *_C_\pc+2
  EndMacro  
  
;LD ST Vx
Macro _Fx18()
  *_C_\st=*_C_\v[X]
  *_C_\pc+2
EndMacro 


;ADD I Vx
Macro _Fx1E()
   If *_C_\i + *_C_\v[X] > $FFF
     *_C_\v[15]=1
   Else
     *_C_\v[15]=0
   EndIf 
   *_C_\i = ((*_C_\i + *_C_\v[X]) & $FFF)
   *_C_\pc+2
EndMacro  

;LD F Vx
Macro _Fx29()
  *_C_\i = #FONT_MEMORY_LOCATION + (*_C_\v[X] * 5)
  *_C_\pc+2
EndMacro  

Macro _Fx33()
   *_C_\mem[*_C_\i]   = (*_C_\v[X] / 100)
   *_C_\mem[*_C_\i+1] = (*_C_\v[X] / 10)%10
   *_C_\mem[*_C_\i+2] = (*_C_\v[X] % 10)
   *_C_\pc+2
EndMacro  

;LD I Vx
Macro _Fx55()
  For i = 0 To X
    *_C_\mem[*_C_\i+i] = *_C_\v[i]
  Next
  
  If Not (*_C_\flags & #CPU_FLAG_QUIRKS_F)
    *_C_\i = *_C_\i + X + 1
  EndIf 
  
  *_C_\pc+2
EndMacro  

; LD Vx I
Macro _Fx65()
  For i = 0 To X
    *_C_\v[i] = *_C_\mem[*_C_\i+i]  & $FF
  Next 
  
  If Not (*_C_\flags & #CPU_FLAG_QUIRKS_F)
    *_C_\i = *_C_\i + X + 1
  EndIf 
  
  *_C_\pc+2  
EndMacro  

Macro _00bn()
  
  *line_buffer = AllocateMemory(1024-16-N)
  CopyMemory(@*_C_\video[16*N],*line_buffer,(1024-16-N))
  CopyMemory(*line_buffer,@*_C_\video[0],(1024-16-N))
  
  For i = 0 To (16 * N)-1
    *_C_\video[(1023-16*N)+i] = 0  
  Next
  
  FreeMemory(*line_buffer)
  *_C_\pc + 2
  
EndMacro

Macro _00cn()
  *line_buffer = AllocateMemory(1024-16-N)
  CopyMemory(@*_C_\video[0],*line_buffer,(1024-16-N))
  CopyMemory(*line_buffer,@*_C_\video[16*N],(1024-16-N))
  For i = 0 To (16 * N)-1
    *_C_\video[i] = 0  
  Next
  FreeMemory(*line_buffer)
  *_C_\pc + 2
EndMacro

Macro _00fb()
  For y = 0 To 64-1
    For x = 15 To 0 Step -1
      *_C_\video[x + 16 * y] = *_C_\video[x + 16 * y] >> 4
      If x > 0
        *_C_\video[x + 16 * y] | (*_C_\video[x - 1 + 16 * y] & $0F) << 4
      EndIf
    Next
  Next
  *_C_\pc + 2  
EndMacro

Macro _00fc()
  For y = 0 To 64-1
    For x = 0 To 16-1
      *_C_\video[x + 16 * y] = *_C_\video[x + 16 * y] << 4
      If x < 15
        *_C_\video[x + 16 * y] | (*_C_\video[x + 1 + 16 * y] & $F0) >> 4
      EndIf
    Next
  Next
  *_C_\pc + 2  
EndMacro

Macro _00fd()
EndMacro

Macro _00fe()
  *_C_\flags = *chip\flags ! #CPU_FLAG_SUPERCHIP
  *_C_\pc + 2
EndMacro

Macro _00ff()
  *_C_\flags = *chip\flags | #CPU_FLAG_SUPERCHIP
  *_C_\pc + 2
EndMacro

Macro _Dxy0()
  *_c_\v[15] = 0
  For _row_ = 0 To 15
    For _col_ = 0 To 15
      _sprite_row_.w = *_C_\mem[ *_C_\i + 2 * _row_] << 8 | *_C_\mem[ *_C_\i + 2 * _row_ + 1]
      _pixel_ = (_sprite_row_ >> (15 - _col_)) & 1
      _sx_ = (*_C_\v[X] + _col_)%128
      _sy_ = (*_C_\v[Y] + _col_)%64 ; Wrapping ?
      
      _cp_ = 0
      get_pixel(*_C_,_cp_, _sx_, _sy_)
      *_c_\v[15] = *_c_\v[15] | (_cp_ & _pixel_)
      If _cp_ ! _pixel_
        set_pixel_on(*_C_,_sx_, _sy_)  
      Else
        set_pixel_off(*_C_,_sx_, _sy_)
      EndIf
    Next
  Next 
  *_C_\rf = 1
  *_C_\pc + 2  
EndMacro

Macro _Fx30()
  *_C_\i = $A0 + *_C_\v[X] * 10
  *_C_\pc + 2
EndMacro

Macro _Fx75()
  If X <= 7
    CopyMemory(@*_C_\v[0],@*_C_\r[0],X+1)
  EndIf
  *_C_\pc + 2    
EndMacro

Macro _Fx85()
  If X <= 7
    CopyMemory(@*_C_\r[0],@*_C_\v[0],X+1)
  EndIf
  *_C_\pc + 2 
EndMacro

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
; Initialize chip8 and reset all data
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure InitializeChip8(*chip.Chip8)
  *chip\opcode = 0
  *chip\pc     = 0
  *chip\sp     = 0
  *chip\st     = 0
  *chip\dt     = 0
  
  For i = 0 To 15
    *chip\keyboard[i] = 0
    *chip\stack[i]    = 0
    *chip\v[i]        = 0
  Next 
  
  For i = 0 To 4096-1
    *chip\mem[0] = 0  
  Next
  
  For i = 0 To 1024-1
    *chip\video[i] = 0
  Next  
  CopyMemory(?charset_begin,@*chip\mem[#FONT_MEMORY_LOCATION], (?charset_end - ?charset_begin) )
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure reset_chip(*chip.Chip8)
  With *chip
    For i = 0 To 1024-1
      *chip\video[i] = 0
    Next
    
    *chip\opcode = 0
    *chip\pc     = $200
    *chip\sp     = 0
    *chip\st     = 0
    *chip\dt     = 0
    *chip\spi    = 0
    
    For i = 0 To 15
      *chip\keyboard[i] = 0
      *chip\stack[i]    = 0
      *chip\v[i]        = 0
    Next 
    
  EndWith
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure LoadRomFromFile(*chip.Chip8, filename.s)
  file = ReadFile(#PB_Any,filename)
  If file 
    InitializeChip8(*chip)
    *buffer = AllocateMemory(FileSize(filename))
    ReadData(file,*buffer,FileSize(filename))
    CopyMemory(*buffer,@*chip\mem[#PROGRAM_START_LOCATION],MemorySize(*buffer))
    FreeMemory(*buffer)
    CloseFile(file)
    *chip\pc = #PROGRAM_START_LOCATION
    ProcedureReturn 1
  EndIf 
  ProcedureReturn 0
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
; update chip timer, usualy run at 60hz
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure update_timer(*chip.Chip8,sound_id.i) ; 60hz
  If *chip\dt > 0 : *chip\dt - 1 : EndIf
  If *chip\st > 0 : If sound_id <> -1:PlaySound(sound_id,#PB_Sound_MultiChannel):EndIf:*chip\st - 1:EndIf
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure enable_flag(*chip.Chip8, flag.a)
  If Not (*chip\flags & flag)
    *chip\flags = *chip\flags | flag
  EndIf 
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure disable_flag(*chip.Chip8, flag.a)
  If (*chip\flags & flag)
    *chip\flags = *chip\flags ! flag
  EndIf 
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure cycle(*chip.Chip8)
  CHIP(*chip)
  
  OPCODE()  
 
  Select *chip\opcode & $F000
      
    Case $0000
      Select *chip\opcode & $FFF0
        Case $00B0: _00bn() : ProcedureReturn
        Case $00C0: _00cn() : ProcedureReturn
        Case $00E0:
          Select *chip\opcode
            Case $00E0 : _00e0() : ProcedureReturn
            Case $00EE : _00ee() : ProcedureReturn
          EndSelect
        Case $00F0
          Select *chip\opcode
            Case $00FB : _00fb() : ProcedureReturn              
            Case $00FC : _00fc() : ProcedureReturn
            Case $00FD : _00fd() : ProcedureReturn            
            Case $00FE : _00fe() : ProcedureReturn            
            Case $00FF : _00ff() : ProcedureReturn            
          EndSelect
      EndSelect
      
    Case $1000  : _1nnn() : ProcedureReturn    
    Case $2000  : _2nnn() : ProcedureReturn   
    Case $3000  : _3xnn() : ProcedureReturn   
    Case $4000  : _4xnn() : ProcedureReturn   
    Case $5000  : _5xy0() : ProcedureReturn
    Case $6000  : _6xnn() : ProcedureReturn
    Case $7000  : _7xnn() : ProcedureReturn
    Case $8000  
      Select *chip\opcode & $000F
        Case $0000:  _8xy0() : ProcedureReturn   
        Case $0001:  _8xy1() : ProcedureReturn  
        Case $0002:  _8xy2() : ProcedureReturn  
        Case $0003:  _8xy3() : ProcedureReturn  
        Case $0004:  _8xy4() : ProcedureReturn  
        Case $0005:  _8xy5() : ProcedureReturn  
        Case $0006:  _8xy6() : ProcedureReturn  
        Case $0007:  _8xy7() : ProcedureReturn  
        Case $000E:  _8xyE() : ProcedureReturn
      EndSelect
      
      Case $9000: _9xy0() : ProcedureReturn
      Case $A000: _Annn() : ProcedureReturn
      Case $B000: _Bnnn() : ProcedureReturn
      Case $C000: _Cxnn() : ProcedureReturn
      Case $D000
        Select *chip\opcode & $000F
          Case $0000: _Dxy0() : ProcedureReturn
          Default:    _Dxyn() : ProcedureReturn
        EndSelect
      Case $E000
        Select *chip\opcode & $00FF
          Case $009E:   _Ex9E() : ProcedureReturn 
          Case $00A1:   _ExA1() : ProcedureReturn 
        EndSelect
      Case $F000:
        Select *chip\opcode & $00FF
          Case $0007: _Fx07() : ProcedureReturn            
          Case $000A: _Fx0A() : ProcedureReturn           
          Case $0015: _Fx15() : ProcedureReturn           
          Case $0018: _Fx18() : ProcedureReturn           
          Case $001E: _Fx1E() : ProcedureReturn           
          Case $0029: _Fx29() : ProcedureReturn           
          Case $0030: _Fx30() : ProcedureReturn           
          Case $0033: _Fx33() : ProcedureReturn           
          Case $0055: _Fx55() : ProcedureReturn           
          Case $0065: _Fx65() : ProcedureReturn           
          Case $0075: _Fx75() : ProcedureReturn          
          Case $0085: _Fx85() : ProcedureReturn           
        EndSelect
  EndSelect

EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
DataSection
  charset_begin:
    Data.a $F0, $90, $90, $90, $F0 ; 0
    Data.a $20, $60, $20, $20, $70 ; 1
    Data.a $F0, $10, $F0, $80, $F0 ; 2
    Data.a $F0, $10, $F0, $10, $F0 ; 3
    Data.a $90, $90, $F0, $10, $10 ; 4
    Data.a $F0, $80, $F0, $10, $F0 ; 5
    Data.a $F0, $80, $F0, $90, $F0 ; 6
    Data.a $F0, $10, $20, $40, $40 ; 7
    Data.a $F0, $90, $F0, $90, $F0 ; 8
    Data.a $F0, $90, $F0, $10, $F0 ; 9
    Data.a $F0, $90, $F0, $90, $90 ; A
    Data.a $E0, $90, $E0, $90, $E0 ; B
    Data.a $F0, $80, $80, $80, $F0 ; C
    Data.a $E0, $90, $90, $90, $E0 ; D
    Data.a $F0, $80, $F0, $80, $F0 ; E
    Data.a $F0, $80, $F0, $80, $80 ; F
    charset_end:
EndDataSection 

pour le rendu sur ton écran , voici ce que j'ai codé , tu ne pourras le lancer tel quel , mais tout y est avec les bon timming pour emulé le chip 8 avec l'include du dessus :

Code : Tout sélectionner

; ///////////////////////////////////////////////////////////////////////////////////////////////// 
;
;          /$$$$$$$  /$$   /$$ /$$$$$$$  /$$$$$$$$  /$$$$$$  /$$   /$$ /$$$$$$ /$$$$$$$   /$$$$$$ 
;         | $$__  $$| $$  | $$| $$__  $$| $$_____/ /$$__  $$| $$  | $$|_  $$_/| $$__  $$ /$$__  $$
;         | $$  \ $$| $$  | $$| $$  \ $$| $$      | $$  \__/| $$  | $$  | $$  | $$  \ $$| $$  \ $$
;         | $$$$$$$/| $$  | $$| $$$$$$$/| $$$$$   | $$      | $$$$$$$$  | $$  | $$$$$$$/|  $$$$$$/
;         | $$____/ | $$  | $$| $$__  $$| $$__/   | $$      | $$__  $$  | $$  | $$____/  >$$__  $$
;         | $$      | $$  | $$| $$  \ $$| $$      | $$    $$| $$  | $$  | $$  | $$      | $$  \ $$
;         | $$      |  $$$$$$/| $$  | $$| $$$$$$$$|  $$$$$$/| $$  | $$ /$$$$$$| $$      |  $$$$$$/
;         |__/       \______/ |__/  |__/|________/ \______/ |__/  |__/|______/|__/       \______/ 
;                                                                                         
;                                      PURECHIP8 - BY G-ROM                                                                                         
;                                                                                         
; /////////////////////////////////////////////////////////////////////////////////////////////////
; XIncludeFile "./include/Config.pbi"
; XIncludeFile "./include/State.pbi"
; XIncludeFile "./include/BitmapFont.pbi"
; XIncludeFile "./include/Application.pbi"
; XIncludeFile "./include/Chip8.pbi"
; XIncludeFile "./include/SoundUtils.pbi"
XIncludeFile "./Terminal.pbi"


Structure Emulator Extends State  
  current_time.d
  previous_time.d  
  clock_60hz.d
  accumulator_60hz.d  
  variable_clock.d
  variable_accumulator.d  
  sprite_chip8.i     ; rendering emulator here
  sound_chip8.i      ; buzzer sound
  sprite_scale.i  
  lcd_screen.f[8192] ; simulate LCD 128x64
  bg_color.l         ; lcd colors
  fg_color.l         ;  
  keymap.l[16]  
  *app.Application 
  *chip_state.Chip8  
  List trace.w()  
EndStructure

Global *Emulator_state.Emulator


DECLARE_STATE(*Emulator_state,Emulator)

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure charge_lcd()
  With *Emulator_state
    For y = 0 To 64-1
      For x = 0 To 128-1
        index = x + 128 * y
        pixel = 0
        get_pixel(\app\chip8, pixel, x,y)
        If pixel 
          \lcd_screen[index] = 1
        EndIf 
      Next
    Next
  EndWith
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure discharge_lcd()
  With *Emulator_state
    For y = 0 To 64-1
      For x = 0 To 128-1
        index = x + 128 * y
        pixel = 0
        get_pixel(\app\chip8, pixel,  x,y)
        If pixel = 0 
          \lcd_screen[index] = \lcd_screen[index] * 0.85
        EndIf 
      Next
    Next
  EndWith
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure render_lcd()
  With *Emulator_state
    StartDrawing(SpriteOutput(\sprite_chip8))
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    For y = 0 To 64-1 
      For x = 0 To 128-1 
        
        intensity.f = \lcd_screen[x + 128 * y] * 255
        
        pixel = 0
        get_pixel(\app\chip8, pixel,x,y)
        
        Plot( x , y ,\bg_color)
        Plot(x,y,RGBA(Red(\fg_color),Green(\fg_color),Blue(\fg_color),intensity) )
      Next
    Next
    StopDrawing()
  EndWith 
EndProcedure




; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure Emulator_Initialize(*app.Application) 
    
  With *Emulator_state
    \app = *app
    \clock_60hz = 1.0 / 60.0
    \variable_clock = 1.0 / 600.0
    \sprite_chip8 = CreateSprite(#PB_Any,128,64,#PB_Sprite_AlphaBlending) 
    \sound_chip8  = generate_tone(840)
    \bg_color = RGBA(168,198,78,255)
    \fg_color = RGBA(60,65,44,255)
    \previous_time = ElapsedMilliseconds()/1000
    \chip_state = AllocateMemory(SizeOf(Chip8)) 
    \sprite_scale = 2
    
    KeyboardMode(#PB_Keyboard_International  )
    \keymap[0]  = #PB_Key_X
    \keymap[1]  = #PB_Key_1
    \keymap[2]  = #PB_Key_2
    \keymap[3]  = #PB_Key_3
    \keymap[4]  = #PB_Key_A
    \keymap[5]  = #PB_Key_Z
    \keymap[6]  = #PB_Key_E
    \keymap[7]  = #PB_Key_Q
    \keymap[8]  = #PB_Key_S
    \keymap[9]  = #PB_Key_D
    \keymap[10]  = #PB_Key_W
    \keymap[11]  = #PB_Key_C
    \keymap[12]  = #PB_Key_4
    \keymap[13]  = #PB_Key_R
    \keymap[14]  = #PB_Key_F
    \keymap[15]  = #PB_Key_V    
  EndWith
  
  Debug "test : "
  Debug *Terminal_state
  
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure Emulator_Event() 
  
  
  ExamineKeyboard()
  For i = 0 To 15
    
    If KeyboardPushed(*Emulator_state\keymap[i])
      *Emulator_state\app\chip8\keyboard[i] = 1
    EndIf 
    
    If KeyboardReleased(*Emulator_state\keymap[i])
      *Emulator_state\app\chip8\keyboard[i] = 0
    EndIf 
    
  Next
  
    ; reset chip
    ;
    If KeyboardPushed(#PB_Key_F1)
      reset_chip(@*Emulator_state\app\chip8)
    EndIf 
    
    ; save chip state
    ;
    If KeyboardPushed(#PB_Key_F2)
        CopyMemory(@*Emulator_state\app\chip8, *Emulator_state\chip_state, SizeOf(Chip8))
    EndIf
    
    ; load chip state
    ;
    If KeyboardPushed(#PB_Key_F3)
        CopyMemory(*Emulator_state\chip_state, @*Emulator_state\app\chip8, SizeOf(Chip8))
    EndIf
    
    ; change scale rendering
    ;
    If KeyboardReleased(#PB_Key_F4)
      *Emulator_state\sprite_scale + 1
    EndIf 
    
    If KeyboardReleased(#PB_Key_F5)
      *Emulator_state\sprite_scale - 1
    EndIf 
    
    If *Emulator_state\sprite_scale > 10 : *Emulator_state\sprite_scale = 10 : EndIf
    If *Emulator_state\sprite_scale < 1  : *Emulator_state\sprite_scale = 1  : EndIf   
    
    
    If KeyboardReleased(#PB_Key_Escape)
      *Emulator_state\app\chip_loaded = #False 
      ChangeState(*THIS,@Terminal_state) 
      Debug "released"
      Debug @Terminal_state
      Delay(100)
    EndIf 
    
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////

Procedure Emulator_Update(dt.d)
  
  With *Emulator_state
       
    current_time.d = ElapsedMilliseconds() / 1000
    elapsed_time.d = current_time - \previous_time
    \previous_time  = current_time
    
    If \app\chip_loaded = #True      
      
      
      ;
      ; update chip timer
      ;
      \accumulator_60hz + elapsed_time 
      
       While(\accumulator_60hz > \clock_60hz)
        update_timer(@\app\chip8,\sound_chip8)
         \accumulator_60hz - \clock_60hz
       Wend 
      
      ;
      ; cycle chip8
      ;
      \variable_accumulator + elapsed_time
      
      While(\variable_accumulator>\variable_clock)
        ; emergency exit if rate is too high
        If KeyboardPushed(#PB_Key_Escape)
;           ChangeState(*THIS,@Terminal_state) 
        EndIf   
        
        cycle(@\app\chip8)
        \variable_accumulator - \variable_clock
      Wend
      
      ;
      ; rendering
      ;
      
      If \app\chip8\rf = 1
        charge_lcd()
        \app\chip8\rf = 0
        render_lcd() 
        discharge_lcd()
      EndIf
      
      
    EndIf 
    
    
  EndWith
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure Emulator_Render()
  ClearScreen(RGB(5,5,10))
  
  w =128 * *Emulator_state\sprite_scale 
  h = 64 * *Emulator_state\sprite_scale 
  
  ZoomSprite(*Emulator_state\sprite_chip8,w,h)
  DisplaySprite(*Emulator_state\sprite_chip8,(640-w)>>1,(400-h)>>1)
  
  DrawBitmapFontText(0,0,"F1 RESET | F2 SAVE STATE | F3 LOAD STATE | F4 SCALE UP | F5 SCALE DOWN",1,RGB(50,50,0))
  
EndProcedure

; /////////////////////////////////////////////////////////////////////////////////////////////////
;
;
;
; /////////////////////////////////////////////////////////////////////////////////////////////////
Procedure Emulator_Exit() 
  FreeSprite(*Emulator_state\sprite_chip8)
  FreeSound(*Emulator_state\sound_chip8)
EndProcedure
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Blog PureBasic: Nouvel article

Message par venom »

Cool. Merci du partage G-Rom.
Je regarderai ça sur pc car la sur smartphone :? :lol:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Blog PureBasic: Nouvel article

Message par Kwai chang caine »

Ouaouhhh!!! beau boulot G-Rom 8)

Je croyais être le seul du forum passionné de "JEUTELS" (c'est comme ça que je les ai toujours nommé :oops: , bien que ce ne soit qu'une des marques, surement dans les premières d’où ce nom qui persiste comme "Frigidaire" pour les armoires frigorifiques) et autres "mobiliers" de bars 8O
Comme j'ai grandi dans un, ça m'a parfois traumatisé (Reglements de comptes à "la capone", visites de la police, du SAMU, bastons de mon père pour sortir les "déchets", viande saoule vautrées sur le comptoir, et autres joyeusetés de ce lieu de perdition. :| )

Mais aussi passionné...en effet quand on est gamin tout ça...reste gravé dans le bidet qui me sert de "cerveau" :mrgreen:
Des célébrités, la visite du maire de LYON de l'époque "Louis Pradel" pour une inauguration, mais aussi un client bizarre avec un chowchow en chien, comme j'en avais encore jamais vu, du haut de ma dizaine d'années 8O
Une machine à cacahuète big format posée sur le bar, un abruti bourré et cette personne "Baba cool" de l'autre coté de la machine, accompagnée de son chien, qui était il faut bien l'avouer, un peu "Zarbi" à mes yeux).
En fait, elle était en tournée avec Michel Fugain sur LYON, c'était son prof de danse et il faisait partie de la fameuse troupe du big bazar.
Comme mon père le connaissait par l'intermédiaire d'un autre client, il était passé boire un café (gratos :mrgreen:) et surtout dédicacer leur dernier album que mon frère avait acheté, comme des centaines d'autres et qui trônait donc sur le comptoir.
L'abruti s'en saisit sans rien demander, d’où la dénomination "d'abruti" :mrgreen: l'ouvre et dit à mon père : "C'est de la merde cette musique !!", tout en regardant la photo de la pochette.

Image

Et derrière Fugain il aperçoit un danseur, bien sur le prorio du chowchow car en fait, c'est vrai qu'il avait un peu la même coiffure que son chien :lol:
Et il rajoute : "Et regarde moi, la tronche de l'ébouriffé de Hippie là derrière !!!", ça doit être pratique pour ramasser la poussière une coiffure comme ça ... s'esclaffant tout seul, et blabla et blabla...il remettait le couvert... :?

Mon père commençant à être plus que gêné, lorsque l'abruti lui dit : "Si j'le voyais ce gland....je lui dirais ..."
Mon père le coupe et lui dit : "Bah... si t'as des trucs à lui dire, ça va pas être dur, il est juste à coté de toi, de l'autre coté de la machine à cacahuètes" :?
Le bouffon a tendu le cou, regardé de l'autre coté du dit distributeur et enfin fermé sa grande gueule, payé son verre et même voulu payer celui de la vedette, je crois....en s'excusant :oops:
Il était tellement cool ce "Johnny" (car c'était son nom de scène, ici à droite de Michel et Stéphanie sa femme) que tout ce que disait l'abruti n'avait fait que le faire rire, faut dire que quand on est célèbre, on doit en entendre des conneries :cry:

Image

Et dans cette vidéo de présentation d'une nouvelle équipe réduite, Michel avait bien sûr gardé le fameux "Johnny" (Prénommé apparemment Mr Stromboli dans la vidéo 8O ) de mon anecdote et qui a été un des derniers à le suivre en prof de danse, avec la femme de Michel Stéphanie bien sûr.
https://m.ina.fr/video/I05032503/michel ... video.html
Je viens même en visionnant la vidéo de découvrir que Magdane avait fait partie du big bazar (truc de ouf) 8O

Voilà mon bon G-Rom... pour planter un peu longuement :oops: .... le décor du "cani" de mon enfance, par une des nombreuses anecdotes qui accompagne dans ma mémoire ce lieu de réunion où l'on peut avouer, qu'il n'est pas vraiment comme les autres. :wink:

Donc pour en revenir aux boites de ce genre, j'en achète depuis prés de 30 ans, mais aussi des machines à sous, flippers, juke-box, enseignes, distributeurs, enfin tout ce qu'on peut trouver dans ce genre d'établissement qui me rappelle mes "tendres" années, où trône un bar et un comptoir.
Perso avec le temps, j'ai jamais vraiment payé cher les machines, j'ai même acheté un lot de machines à sous, dont une bonne partie en panne pour 300 francs pièce 8) et en plus au vide grenier 8O, j'ai rempli mon camion :lol:
Donc je n'avais pas vraiment vu l'augmentation des bornes depuis la création de ces petites boites dont vous parlez, avec noirs de jeux des années 80 et même avant dedans 8O
Alors à vous lire, je viens de me rendre compte que j'aurais peut-être trouvé le moyen de transformer le bois agglo en or. :lol:

En tout cas, j'ai créé tout comme toi, pas mal de choses en bois pour la sonorisation dans ma jeunesse, cercueil, charrette, décorations de scène, mais j'ai jamais eu le courage de me lancer dans une borne d'arcade :oops:
En plus, tu as l'air sacrément méticuleux...ça colle pas vraiment à ta manière de parfois t'exprimer, un peu "no vaseline" :lol: :wink:
Putain tu m'épates encore plus, non seulement le gadin plein, maintenant je vais pouvoir t’appeler, pas "Edouard aux mains d’argent", mais "G-Rom aux mains d'or" 8)
Je ne sais pas si c'est toi qui a peint le tableau derrière, parce que là.... 8O je saurais plus quoi dire .....et c'est rare :mrgreen:

En tout cas merci de partager tes œuvres avec la famille 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Blog PureBasic: Nouvel article

Message par G-Rom »

Salut kcc, t'est un gars de bar alors, j'adorais quand j'étais gosse fréquenté les bars à l'odeur anisé pour joué au baby ( bonzini ) , flippers & autre jeux.
quand j'étais gosse , les bornes d'arcade était géante pour moi , c'est l'effet que j'ai voulu reproduire avec celle ci , plus grand que moi et retrouver le "wahouu" de mon enfance ^^. Dommage que partout en France , nos petits villages sont des petits villages dortoirs , ou les petits commerce on foutu le camp au profit des centres commerciaux péri urbain ...

Image
Donc je n'avais pas vraiment vu l'augmentation des bornes depuis la création de ces petites boites dont vous parlez, avec noirs de jeux des années 80 et même avant dedans 8O
Alors à vous lire, je viens de me rendre compte que j'aurais peut-être trouvé le moyen de transformer le bois agglo en or.
Si tu les as encore, y a moyen que tu te fasses un beau paquet de blé , une partie de ma génération et celle du dessus cherche l'originalité et l'authentique ( c'est pas mon délire, d'ou la construction ).
En plus, tu as l'air sacrément méticuleux...ça colle pas vraiment à ta manière de parfois t'exprimer, un peu "no vaseline" :lol: :wink:
Putain tu m'épates encore plus, non seulement le gadin plein, maintenant je vais pouvoir t’appeler, pas "Edouard aux mains d’argent", mais "G-Rom aux mains d'or" 8)
Je ne sais pas si c'est toi qui a peint le tableau derrière, parce que là.... 8O je saurais plus quoi dire .....et c'est rare :mrgreen:
Merci , le tableau , c'est ma Femme, et encore, c'est juste du coloriage , on est pas une famille d'artiste ^^
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Blog PureBasic: Nouvel article

Message par Kwai chang caine »

Effectivement ...elle est plus grande que toi 8O :D
Heureusement que c'est pas les toilettes que t'as voulu reproduire chez toi comme quand tu étais petit, celles ou on montait une fesse et après l'autre, pour après se dandiner pour se mettre au fond, t'imagines la taille du WC aujourd'hui et la gueule des invités :lol:
En tout cas, c'est une bonne idée, et c'est vachement plus joli qu'une petite boite pleine de fils devant la télé ou le PC 8)
Si tu les as encore, y a moyen que tu te fasses un beau paquet de blé
Oui je les ai encore, mais pour l'instant je les vends pas, elles sont pleines de poussières et faudrait surement toutes les réviser :cry:
Et j'ai la maladie de l'hyper matérialisme, ça rentre, mais ça sort presque jamais :oops:
Pour moi, chaque objet a une âme et existe en tant que tel, je sais pas si c'est grave docteur :oops:

La seule ou je me suis éclaté dessus, c'est AstroBlaster on a passé des nuits complètes dessus avec des copains
Et un jour, je l'ai même retrouvé sur PC en gratuit, surement un barjo qui lui aussi avait passé ses nuits dessus et qui avait le talent de le reproduire 8)
C'était un jeu de dingue, et plus on avançait, plus c'était dur, et fallait tout recommencer quand on perdait...je ne compte pas le nombre de fois ou on avait envie de taper dans la machine, c'est surement pourquoi les plateaux sont en métal :lol:

D'ailleurs quand j'ai acheté le lot de machines à sous au vide grenier, y'a un mec qui me courait après en me disant qu'il me rachetait rien qu'une des vitres que je venais d'acheter sur une machine, le double de la machine complète 8O
Parce que son beauf, avait mis un coup de poing en plein dedans, quand il avait perdu et du coup pour refaire une vitre sérigraphiée ça coutait 3 x le prix de la machine.
Putain, si j'avais un beauf qui me pète une de mes machines dans ces conditions, aussi sec, je divorce :mrgreen:

Bon une fois celle là réalisée, il te restera plus qu'à faire celle ou on s'assoie dedans avec un siège :lol:
J'ai failli en acheter une y'a 30 ans, dans un dépôt vente traditionnel, j’étais gamin et mes yeux n'avaient fait qu'un tour quand je l'ai vu, un monstre presque gros comme une voiture, c'était justement un poste de pilotage de F1
En plus pas cher dans mes moyens, et comme un con, pour faire baisser encore un peu le prix, je dis pas au responsable que la pédale elle est cassée :?
Et cet abruti, me dit : "Effectivement monsieur, vous avez raison, veuillez nous excuser, je la retire de la vente et appelle immédiatement le propriétaire pour qu'il vienne la chercher, on ne vends pas d'objet qui ne sont pas en état de marche ici, on est une maison sérieuse !!!!"

La puuuuuuuuuuuuutaaaaaaaaaaaaaaaaain !!!!!
je bouillais dans mon slip, j'ai eu beau lui dire que je la prenais dans l'état, au prix, il a rien voulu savoir cet inhibé du bulbe :?
Depuis ce jour, je discute plus trop les prix quand c'est une affaire :mrgreen:
Merci , le tableau , c'est ma Femme, et encore, c'est juste du coloriage , on est pas une famille d'artiste ^^
Et ben j'aurais rêvé être pas un artiste comme ta femme 8O
Moi quand je dessine un chien, on me dit que pour que ma vache soit plus réaliste, il faudrait faire ses mamelles plus grandes :mrgreen:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre