Author Topic: The Coding Wizard - source code  (Read 8335 times)

0 Members and 1 Guest are viewing this topic.

Offline Rbz

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 2757
  • Karma: 493
    • View Profile
    • https://www.rbraz.com/
The Coding Wizard - source code
« on: March 22, 2007 »
For Fasm lovers  :) , here's the source code for the 20 Seconds Compo.

Code: [Select]
;-------------------------------------------------------------------------
;
;               The Coding Wizard
;               20Secs Compo entry
;               by rbraz March 2007
;
;-------------------------------------------------------------------------

format PE GUI 4.0
entry start

include '%fasminc%\win32a.inc'
include '%fasminc%\ufmodlib\ufmod-const.inc'

;-------------------Equates
Scr_Width      equ 640
Scr_Height     equ 600
ChipIcon       equ 1

section '.data' data readable writeable

  wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_WINDOW,NULL,_class
  msg         MSG
  hwnd        dd ?
  hdc         dd ?
  rc          RECT
  ps          PAINTSTRUCT

  _class  db 'Win32',0
  _title  db '** The Coding Wizard ** 20 Secs Compo ** by rbraz 2007 **',0
  _error1 db 'Unable to create Window !',0
  _error2 db 'Unable to open Image !',0

  ;----------------Images
  _wizardImages: db 'media\wizard0.bmp',0
                 db 'media\wizard1.bmp',0
                 db 'media\wizard2.bmp',0
                 db 'media\wizard3.bmp',0
                 db 'media\wizard4.bmp',0

  _balloonImages: db 'media\balloon0.bmp',0
                  db 'media\balloon1.bmp',0
                  db 'media\balloon2.bmp',0
                  db 'media\balloon3.bmp',0
                  db 'media\balloon4.bmp',0
                  db 'media\balloon5.bmp',0

  _demoImages: db 'media\256b.bmp',0
               db 'media\1kb_.bmp',0
               db 'media\64kb.bmp',0
               db 'media\demo.bmp',0

  hBitmap     dd 15 dup(?)

  FontName db 'Times New Roman',0

  timerBuffer  rd 2

  startTime    dd 0

  elapsedTime  dd -1

  ;----Xm music file
  xm file 'media\uuaaiiuu.xm'
  xm_length = $ - xm


section '.code' code readable executable

  start:

        invoke  GetModuleHandle,0
        mov     [wc.hInstance], eax
        invoke  LoadIcon,0,IDI_APPLICATION
        mov     [wc.hIcon],eax
        invoke  LoadCursor,0,IDC_ARROW
        mov     [wc.hCursor],eax
        invoke  LoadIcon,[wc.hInstance],ChipIcon ;Chip Icon
        mov     [wc.hIcon], eax
        invoke  RegisterClass,wc
        test    eax,eax
        jz      error

        mov     [rc.left]   , 0
        mov     [rc.top]    , 0
        mov     [rc.right]  , Scr_Width
        mov     [rc.bottom] , Scr_Height
        invoke  GetSystemMetrics, SM_CXFIXEDFRAME
        shl     eax, 1
        add     [rc.right], eax
        invoke  GetSystemMetrics, SM_CYFIXEDFRAME
        shl     eax, 1
        add     [rc.bottom], eax
        invoke  GetSystemMetrics, SM_CYCAPTION
        add     [rc.bottom], eax
        ;---Center window
        invoke  GetSystemMetrics, SM_CXSCREEN
        sub     eax, Scr_Width
        shr     eax, 1
        mov     [rc.left], eax
        invoke  GetSystemMetrics, SM_CYSCREEN
        sub     eax, Scr_Height
        shr     eax, 1
        mov     [rc.top], eax

        invoke  CreateWindowEx,WS_EX_APPWINDOW,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,\
                              [rc.left],[rc.top],[rc.right],[rc.bottom],NULL,NULL,[wc.hInstance],NULL
        test    eax,eax
        jz      error
        mov     [hwnd],eax

  msg_loop:
        invoke  InvalidateRect,[hwnd],NULL,FALSE
        invoke  GetMessage,msg,NULL,0,0
        or      eax,eax
        jz      end_loop
        invoke  TranslateMessage,msg
        invoke  DispatchMessage,msg
        jmp     msg_loop

  error:
        invoke  MessageBox,HWND_DESKTOP,_error1,_title,MB_OK or MB_ICONERROR

  end_loop:
        invoke  ExitProcess,[msg.wParam]

proc WindowProc hwnd,wmsg,wparam,lparam
        cmp     [wmsg],WM_CREATE
        je      .wmcreate
        cmp     [wmsg],WM_PAINT
        je      .wmpaint
        cmp     [wmsg],WM_KEYDOWN
        je      .wmkeydown
        cmp     [wmsg],WM_CLOSE
        je      .wmclose

  .defwndproc:
        invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
        jmp     .finish

  .wmcreate:
        invoke  GetDC,[hwnd]
        mov     [hdc],eax

        ;-------InitIntro
        stdcall initIntro

        xor     eax,eax
        jmp     .finish

  .wmpaint:
        invoke BeginPaint,[hwnd], ps
        mov    [ps.hdc], eax

        ;-------DrawIntro
        stdcall drawIntro

        invoke EndPaint,[hwnd], ps

        xor     eax,eax
        jmp     .finish

  .wmkeydown:
        cmp     [wparam],VK_ESCAPE
        jne     .defwndproc
        invoke  PostMessage,[hwnd],WM_CLOSE,0,0
        xor     eax,eax
        jmp     .finish

  .wmclose:
       invoke PostMessage,[hwnd],WM_QUIT,0,0
       xor     eax,eax

  .finish:
        ret
endp

;-------------Imports
section '.idata' import data readable writeable
  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL',\
          gdi32, 'GDI32.DLL',\
          winmm, 'WINMM.DLL'
  include '%fasminc%\api\kernel32.inc'
  include '%fasminc%\api\user32.inc'
  include '%fasminc%\api\gdi32.inc'
  include '%fasminc%\api\mmsystem.inc'

;-------------Resource
data resource
     directory RT_ICON,icons,RT_GROUP_ICON,group_icons
     resource icons,ChipIcon,LANG_NEUTRAL,icon_data
     resource group_icons,1,LANG_NEUTRAL,icon
     icon icon,icon_data,'chip.ico'
end data

;---------------------------------------------------------------------------------------------------
;---------------------------------------[Functions]-------------------------------------------------
;---------------------------------------------------------------------------------------------------
mediaLoadError:
     invoke  MessageBox,HWND_DESKTOP,_error2,_title,MB_OK or MB_ICONERROR
     invoke  ExitProcess,0
ret

proc initIntro
     push ebx edi

    ;----load 256b,1kb,64kb and demo images
    xor ebx, ebx
    .loop1:

        mov cl, 15
        mov eax, ebx
        mul cl
        mov edi, _demoImages
        add edi, eax
        invoke LoadImage,[wc.hInstance], edi, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE
        test eax, eax
        jz   mediaLoadError
        mov  [hBitmap+(ebx*4)], eax

    inc ebx
    cmp ebx, 4
    jne .loop1

    ;-----load wizard images
    xor ebx, ebx
    .loop2:

        mov cl, 18
        mov eax, ebx
        mul cl
        mov edi, _wizardImages
        add edi, eax
        invoke LoadImage,[wc.hInstance], edi, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE
        test eax, eax
        jz   mediaLoadError
        mov  [hBitmap+(4*4)+(ebx*4)], eax

    inc ebx
    cmp ebx, 5
    jne .loop2

    ;-----load balloon images
    xor ebx, ebx
    .loop3:

        mov cl, 19
        mov eax, ebx
        mul cl
        mov edi, _balloonImages
        add edi, eax
        invoke LoadImage,[wc.hInstance], edi, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE
        test eax, eax
        jz   mediaLoadError
        mov  [hBitmap+(9*4)+(ebx*4)], eax

    inc ebx
    cmp ebx, 6
    jne .loop3

     ;----Load Font
     mov     eax,96                        ;Height Of Font
     neg     eax
     invoke  CreateFont, eax,\             ;Height Of Font
                           0,\             ;Width Of Font
                           0,\             ;Angle Of Escapement
                           0,\             ;Orientation Angle
                     FW_BOLD,\             ;Font Weight
                           0,\             ;Italic
                           0,\             ;Underline
                           0,\             ;Strikeout
                ANSI_CHARSET,\             ;Character Set Identifier
               OUT_TT_PRECIS,\             ;Output Precision
         CLIP_DEFAULT_PRECIS,\             ;Clipping Precision
         ANTIALIASED_QUALITY,\             ;Output Quality
     FF_DONTCARE+DEFAULT_PITCH,\           ;Family And Pitch
                     FontName              ;Font Name
     invoke  SelectObject,[hdc],eax

     ;----Start playback
     stdcall uFMOD_PlaySong, xm, xm_length, XM_MEMORY

     pop edi ebx
ret
endp

proc drawIntro
     push   ebx

     mov    ebx, 1000
     invoke GetTickCount
     mov    ecx, eax
     sub    eax, [startTime]
     cmp    eax, ebx
     jge    .updateTime
     jmp    .skipUpdateTime
     .updateTime:
     mov    [startTime], ecx
     inc    [elapsedTime]

     ;----------------------Display timer
     stdcall itoa, [elapsedTime], timerBuffer, 10
     invoke TextOut,[hdc], 40, 480, timerBuffer, 2

     .skipUpdateTime:

     invoke SetBkMode,[ps.hdc],TRANSPARENT
     invoke SetTextColor,[ps.hdc],0

     ;----------------------Frame Display
     .256bimage:
     cmp [elapsedTime], 5
     jge .1kbimage
     stdcall drawImage, [hBitmap+(0*4)], 0,0,640,480
     jmp .wizard

     .1kbimage:
     cmp [elapsedTime], 10
     jge .64kbimage
     stdcall drawImage, [hBitmap+(1*4)], 0,0,640,480
     jmp .wizard

     .64kbimage:
     cmp [elapsedTime], 15
     jge .demoimage
     stdcall drawImage, [hBitmap+(2*4)], 0,0,640,480
     jmp .wizard

     .demoimage:
     stdcall drawImage, [hBitmap+(3*4)], 0,0,640,480

     ;----------------------Wizard animation
     .wizard:
     cmp [elapsedTime], 3
     jge .wizard1
     stdcall drawImage, [hBitmap+(4*4)], 150,480,140,120
     jmp .balloon0

     .wizard1:
     cmp [elapsedTime], 9
     jge .wizard2
     stdcall drawImage, [hBitmap+(5*4)], 150,480,140,120
     jmp .balloon0

     .wizard2:
     cmp [elapsedTime], 16
     jge .wizard3
     stdcall drawImage, [hBitmap+(6*4)], 150,480,140,120
     jmp .balloon0

     .wizard3:
     cmp [elapsedTime], 18
     jge .wizard4
     stdcall drawImage, [hBitmap+(7*4)], 150,480,140,120
     jmp .balloon0

     .wizard4:
     stdcall drawImage, [hBitmap+(8*4)], 150,480,140,120

     ;----------------------Balloon animation
     .balloon0:
     cmp [elapsedTime], 2
     jge .balloon1
     stdcall drawImage, [hBitmap+(9*4)], 290,480,350,120
     jmp .checkCounter

     .balloon1:
     cmp [elapsedTime], 6
     jge .balloon2
     stdcall drawImage, [hBitmap+(10*4)], 290,480,350,120
     jmp .checkCounter

     .balloon2:
     cmp [elapsedTime], 10
     jge .balloon3
     stdcall drawImage, [hBitmap+(11*4)], 290,480,350,120
     jmp .checkCounter

     .balloon3:
     cmp [elapsedTime], 15
     jge .balloon4
     stdcall drawImage, [hBitmap+(12*4)], 290,480,350,120
     jmp .checkCounter

     .balloon4:
     cmp [elapsedTime], 18
     jge .balloon5
     stdcall drawImage, [hBitmap+(13*4)], 290,480,350,120
     jmp .checkCounter

     .balloon5:
     stdcall drawImage, [hBitmap+(14*4)], 290,480,350,120

     ;----------------------Check time counter
     .checkCounter:
     cmp [elapsedTime], 20
     jne .skipEnd
     invoke PostMessage,[hwnd],WM_QUIT,0,0
     .skipEnd:

     pop   ebx
ret
endp

proc drawImage, handleBMP, x1, y1, x2, y2
     push edi

     invoke CreateCompatibleDC,[ps.hdc]
     mov edi, eax
     invoke SelectObject,edi,[handleBMP]
     invoke BitBlt,[ps.hdc],[x1],[y1],[x2],[y2],edi,0,0,SRCCOPY
     invoke DeleteDC,edi

     pop edi
ret
endp

proc itoa, integer, txtbuffer, base
        push  ecx edx edi ebx

        ; eax = number, ebx = base, edi = buffer
        mov     eax, [integer]
        mov     ebx, [base]
        mov     edi, [txtbuffer]

        xor     ecx,ecx
      .new:
        xor     edx,edx
        div     ebx
        push    edx
        inc     ecx
        test    eax,eax
        jnz     .new
      .loop:
        pop     eax
        add     al,30h
        cmp     al,'9'
        jng     .ok
        add     al,7
      .ok:
        stosb
        loop    .loop
        mov     al,32  ;add space, should be 0 (null terminated string)
        stosb

        pop  ebx edi edx ecx
ret
endp

;--------------------------------------------------------------------------
;                           uFmod library
;--------------------------------------------------------------------------
        ; Include the whole uFMOD  sources here. (Right after
        ; your main code to avoid naming conflicts, but still
        ; inside your code section.)
        macro PUBLIC symbol {} ; hide all publics
        include '%fasminc%\ufmodlib\fasm.asm'



Challenge Trophies Won:

Offline benny!

  • Senior Member
  • DBF Aficionado
  • ********
  • Posts: 4384
  • Karma: 228
  • in this place forever!
    • View Profile
    • bennyschuetz.com - mycroBlog
Re: The Coding Wizard - source code
« Reply #1 on: March 22, 2007 »
Thanks for sharing the code, rbraz. And nice having a pure asm entry
in the competition !

inc karma
[ mycroBLOG - POUET :: whatever keeps us longing - for another breath of air - is getting rare ]

Challenge Trophies Won:

Offline rdc

  • Pentium
  • *****
  • Posts: 1495
  • Karma: 140
  • Yes, it is me.
    • View Profile
    • Clark Productions
Re: The Coding Wizard - source code
« Reply #2 on: March 22, 2007 »
Wow, I think I understand most of this. I'll have to check out FASM I think.

Offline .:] Druid [:.

  • freebasic n00b
  • Pentium
  • *****
  • Posts: 563
  • Karma: 47
    • View Profile
    • Intro-Inferno
Re: The Coding Wizard - source code
« Reply #3 on: March 22, 2007 »
thanks for your support!  karma included of course!
[sheep]: im sure he wants to goto prison.. they didnt get him last time.. he was promised a big cock up his arse.. and no doubt looking forward to it.. lets hope he gets his wish this year.

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17426
  • Karma: 499
  • evil/good
    • View Profile
    • My Homepage
Re: The Coding Wizard - source code
« Reply #4 on: March 22, 2007 »
Thanks for sharing the source Rbraz :) I didn't realise that your entry was in asm :D
Shockwave ^ Codigos
Challenge Trophies Won:

Offline Voltage

  • Professor
  • Pentium
  • *****
  • Posts: 857
  • Karma: 53
    • View Profile
Re: The Coding Wizard - source code
« Reply #5 on: March 22, 2007 »
Yeah, I didn't realize that it was a Win 32 ASM entry!  Kick ass.  Windows programming is difficult enough with visual basic :) 

Great work mate.
Challenge Trophies Won:

Offline Clyde

  • A Little Fuzzy Wuzzy
  • DBF Aficionado
  • ******
  • Posts: 7271
  • Karma: 71
    • View Profile
Re: The Coding Wizard - source code
« Reply #6 on: March 23, 2007 »
Nice one Rbraz dude :)
Still Putting The IT Into Gravy
If Only I Knew Then What I Know Now.

Challenge Trophies Won:

Offline rain_storm

  • Here comes the Rain
  • DBF Aficionado
  • ******
  • Posts: 3088
  • Karma: 182
  • Rain never hurt nobody
    • View Profile
    • org_100h
Re: The Coding Wizard - source code
« Reply #7 on: March 23, 2007 »
This is really impressive to see especially since we had less than one month to put our entries together and still the quality did not suffer as a result thanks for posting it rbraz

Challenge Trophies Won:

Offline Rbz

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 2757
  • Karma: 493
    • View Profile
    • https://www.rbraz.com/
Re: The Coding Wizard - source code
« Reply #8 on: March 23, 2007 »
Thanks dudes, much appreciated !

Btw, coding in asm it's not that hard, I've spended much more time thinking on what to do :)

 
Challenge Trophies Won:

Offline mike_g

  • Amiga 1200
  • ****
  • Posts: 435
  • Karma: 34
    • View Profile
Re: The Coding Wizard - source code
« Reply #9 on: March 24, 2007 »
Looks hard to me :o Its quite impressive what you can do with just ASM. Well done done man :)