News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests
NB: Posting URL's See here: Posted URL Change

Main Menu

MACRO problems

Started by herge, July 20, 2015, 08:42:03 PM

Previous topic - Next topic

herge

Hello:

I am trying to make InsertTime into a MACRO called IT.

Error Messages:

swissM.asm(123) : warning A4006: too many arguments in macro call
IT(1): Macro Called From
  swissM.asm(123): Main Line Code
swissM.asm(123) : error A2008: syntax error : ,
IT(5): Macro Called From
  swissM.asm(123): Main Line Code
swissM.asm(123) : error A2042: statement too complex
IT(5): Macro Called From
  swissM.asm(123): Main Line Code
_
Assembly Error
Press any key to continue . . .



The source code SWISSM.ASM


; SWISSM.ASM 11:46 AM 6/23/2008
; Modified Monday, July 20, 2015 3:40:28 AM
; SUBSYSTEM:CONSOLE
; Program displays the Time in Switzerland.
;
       include \masm32\include\masm32rt.inc
;
; Remove Zero At End of Buffer MACRO. X is End or Exit
;
remzeroXbuf MACRO BufName:REQ
       lea esi, offset BufName
       add esi, eax
       mov byte ptr [ esi - 1 ], " "
       ENDM
IT MACRO stmX;REQ, lcidX:REQ
    push esi   
    mov esi, offset stmX
    call zeroHour
    pop esi
    INVOKE  GetTimeFormat, lcidX, TIME_FORCE24HOURFORMAT, addr stmX, addr tf, esi, 32
    ret
    ENDM

.data
            public stm, stmC
stm    SYSTEMTIME<>
;typedef struct _SYSTEMTIME {  // st 
;    WORD wYear;  +00
;    WORD wMonth;  +02
;    WORD wDayOfWeek; + 04
;    WORD wDay;  +06
;    WORD wHour; +08
;   WORD wMinute; + 10
;   WORD wSecond; +12
;    WORD wMilliseconds; +14
;} SYSTEMTIME;

stmC   SYSTEMTIME<>; CANADA
lcidCAN dd  4105
lcidPQ  dd  3084    ; Quebec
lcidUK  dd  2057    ; UK
lcidSF  dd  4108    ; Swiss French
lcidSG  dd  2055    ; Swiss German
lcidSI  dd  2064      ; Swiss italian
lcidSR  dd  2073    ; Swiss Romanish(DNW) Does Not Work!
lcidFRA dd  1036    ; France
lcidGER dd  1031    ; Germany
lcidITA dd  1040      ; Italy
lcidSPA dd  1034     ; Spain
             dd  0
public dtbufE, dtbufF, dtbufG, dtbufI, dtbufR
                 db 0
dtbufCb     db " "; Space           
dtbufC      db 260 dup(0); Canada(4105)
                dw 0
                db 0
dtbufQb     db " "
dtbufQ      db 260 dup(0); CANADA (Quebec) 3084
                 db 0           
dtbufEb     db " "; Space           
dtbufE      db 260 dup(0); England UTC(2057)
            dw 0
dtbufF db 260 dup(0); Swiss French(4108)
            dw 0
            db 0
dtbufGb     db " "; Space
dtbufG      db 260 dup(0); Swiss German(2055)
            dw 0
dtbufI      db 260 dup(0); Swiss italian(2064)
            dw 0
dtbufR      db 260 dup(0); Swiss Romanish(2072)
            dw 0
            db 0
dtbufSb     db " "
dtbufS      db 260 dup(9); Spain Spanish(3082)
                dw 0             

AppName      db "Date & Time in Switzerland ", 0
AppNameC    db "Date & Time in Ottawa, Ontario, CANADA ", 0
AppNameE    db "Date & Time in London, England ", 0
AppNameF    db "Date & Time in Geneva - French Suisse ",0
AppNameG    db "Date & Time in Zurich - German Schweiz ",0
AppNameI      db "Date & Time in Switzerland - Italian Svizzera ", 0
AppNameQ    db "Date & Time in Montreal, PQ, CANADA ", 0
AppNameR    db "Date & Time in Switzerland - Romanish ", 0
AppNameS    db "Date & Time in Madrid, Spain - Spanish ", 0
crlf db 13, 10, 0
tf db "HH':'mm':'ss tt", 0
dtError db " << waitExit >> ", 13, 10, 7, 0
Putc  db    " UTC ", 13, 10, 0
Pbst  db    " BST ", 13, 10, 0
Pedt  db    " EDT ", 13, 10, 0
Pcest  db    " CEST ", 13, 10, 0 
      db 0
.code

    align 8
SetTextColor proc fore:DWORD,back:DWORD

    LOCAL hStdOut:DWORD
    invoke GetStdHandle,STD_OUTPUT_HANDLE
    mov   hStdOut,eax
    mov   eax,back
    shl   eax,4
    or    eax,fore
    invoke SetConsoleTextAttribute,hStdOut,eax
    ret
SetTextColor endp

      align 8
zeroHour proc uses eax
; ESI > stm if midnight hour change 0 to 12
    mov ax, word ptr [esi+08]; get Hour
    and ax, ax
    jnz @F
    mov ax,12
    mov [esi+8], ax
@@:
    ret
zeroHour endp

insertTime proc
   IT,stm,lcidUK
insertTime endp
      align 8 

insertTimeC proc
    push esi   
    mov esi, offset stmC
    call zeroHour
    pop esi
    INVOKE  GetTimeFormat, lcidCAN, TIME_FORCE24HOURFORMAT, addr stmC, addr tf, esi, 32
     ret
insertTimeC endp

      align 8
insertTimeQ proc
    push esi   
    mov esi, offset stmC
    call zeroHour
    pop esi
    INVOKE GetTimeFormat, lcidUK, TIME_FORCE24HOURFORMAT, addr stmC, addr tf, esi, 32
    ret
insertTimeQ endp
        align 8
       
; DI >s to Buffer Output
; SI >s to Source Input 
; Make sure Direction Flag is UP!     
CopyUntilNull proc
        lodsb
        stosb
        and al, al
         jnz CopyUntilNull
        ret 
CopyUntilNull endp 

      align 8
start proc
    invoke SetTextColor, 15, 0
    invoke GetLocalTime, addr stmC
    invoke GetDateFormat, lcidCAN, DATE_LONGDATE, addr stmC, 0, addr dtbufC, sizeof dtbufC
    and eax, eax
     jz ErGDFCanada
     remzeroXbuf dtbufC
     call insertTimeC
     mov  esi, offset dtbufC
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pedt
      call CopyUntilNull
      invoke GetDateFormat, lcidPQ, DATE_LONGDATE, addr stmC, 0, addr dtbufQ, sizeof dtbufQ
      and eax, eax
      jz ErGDFQuebec
      remzeroXbuf dtbufQ
      call insertTimeQ
      mov  esi, offset dtbufQ
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pedt
      call CopyUntilNull
   
      invoke GetSystemTime, addr stm; Get UTC
      ; Kludge to get BST
      mov ax, stm.wHour
      cmp ax, 23
      jnz @F
      xor ax, ax
      jmp saveAX
@@:
      inc ax
      public saveAX
saveAX::
      mov stm.wHour, ax
           
      invoke GetDateFormat, lcidUK , DATE_LONGDATE, addr stm, 0, addr dtbufE, sizeof dtbufE
      and eax, eax
      jz ErGDFEnglish
      remzeroXbuf dtbufE   
      call insertTime

      mov  esi, offset dtbufE
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pbst
      call CopyUntilNull
     
      mov ax, stm.wHour; This is a Kludge to get Swiss Time
      ; or European Time i e France, Germany, Italy
      inc ax; GET UTC +1 i e CET
      mov stm.wHour, ax
       
      invoke GetDateFormat, lcidSF , DATE_LONGDATE, addr stm, 0, addr dtbufF, sizeof dtbufF; was lcidSF
      and eax, eax
      jz ErGDFFrench
      remzeroXbuf dtbufF
      call insertTime

      mov  esi, offset dtbufF
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pcest
      call CopyUntilNull
      invoke GetDateFormat, lcidGER , DATE_LONGDATE, addr stm, 0, addr dtbufG, 260; was lcidSG
      and eax, eax
      jz ErGDFGerman
      remzeroXbuf dtbufG
      call insertTime
      mov  esi, offset dtbufG
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pcest
      call CopyUntilNull
      invoke StdOut, addr dtbufGb
      invoke GetDateFormat, lcidITA, DATE_LONGDATE, addr stm, 0, addr dtbufI, 260; was lcidSI
      and eax, eax
      jz ErGDFItalian
      remzeroXbuf dtbufI
      call insertTime
      invoke GetDateFormat, lcidSPA , DATE_LONGDATE, addr stm, 0, addr dtbufS, 260
      and eax, eax
      jz ErGDFSpain
      public SpainTime
SpainTime::
      remzeroXbuf dtbufS     
      call insertTime
      mov  esi, offset dtbufS
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pcest
      call CopyUntilNull
      jmp NoError

ErGDFCanada:
      invoke StdOut, addr crlf
      print " << GetDateFormat Canada >> ", 13, 10, 7 
      jmp waitExit 
ErGDFQuebec:
      invoke StdOut, addr crlf
      print " << GetDateFormat Quebec >> ", 13, 10, 7
      jmp waitExit   
ErGDFEnglish:
      invoke StdOut, addr crlf
      print " << GetDateFormat English >> ", 13, 10, 7
      jmp waitExit   
ErGDFFrench:
      invoke StdOut, addr crlf
      print " << GetDateFormat French >> ", 13, 10, 7
      jmp   waitExit
ErGDFGerman:
      invoke StdOut, addr crlf
      print 13,10," << GetDateFormat German >> ", 13, 10, 7
      jmp   waitExit
ErGDFItalian:
      invoke StdOut, addr crlf
      print 13,10," << GetDateFormat Italian >> ", 13, 10, 7
      jmp   waitExit
ErGDFRomanish:
      invoke StdOut, addr crlf
      print " << GetDateFormat Romanish >> ", 13, 10, 7
      jmp   waitExit
ErGDFSpain:
      invoke StdOut, addr crlf
      print " << GetDateFormat Spain >> ", 13, 10, 7

waitExit:
      INVOKE MessageBox, 0, addr dtError, addr AppName, MB_OK
NoError:
      invoke MessageBox, 0, addr dtbufC, addr AppNameC, MB_OK; CANADA Time                 GMT-4
      invoke MessageBox, 0, addr dtbufQ, addr AppNameQ, MB_OK; Quebec Time                  GMT-4 
      invoke MessageBox, 0, addr dtbufE, addr AppNameE, MB_OK; England Time                 GMT+0
      invoke MessageBox, 0, addr dtbufF, addr AppNameF, MB_OK; Swiss Time - French       GMT+1
      invoke MessageBox, 0, addr dtbufG, addr AppNameG, MB_OK; Swiss Time - German      GMT+1
      invoke MessageBox, 0, addr dtbufI, addr AppNameI, MB_OK; Swiss Time - Itailan            GMT+1
      invoke MessageBox, 0, addr dtbufS, addr AppNameS, MB_OK; Spanish Time - Spanish     GMT+1

      invoke StdOut, addr crlf
      invoke StdOut, addr dtbufEb; England or United Kingdom
      invoke StdOut, addr Putc
      invoke StdOut, addr crlf
      invoke StdOut, addr dtbufCb; CANADA - Eastern
      invoke StdOut, addr crlf
      invoke StdOut, addr dtbufQb; CANADA, PQ - Eastern(French)
      invoke StdOut, addr crlf
      invoke StdOut, addr dtbufGb; Swiss - German
      invoke StdOut, addr crlf
      invoke StdOut, addr dtbufSb; Spain - Spanish
      invoke StdOut, addr crlf
      inkey " << Wait For Space Bar or Any Key >> ", 13, 10
      invoke StdOut, addr crlf
      exit
      ret
start endp
      align 8
end_here:
      END start
; You Can Find this file at D:\masm32\bin\SWISSM.ASM



I am doing something wrong but I don't what
it is!

Regards herge
Regards herge
Read "Slow Death by Rubber Duck"
for chemical Laughs.

jj2007

Hi Herge,

1. macro usage:
use          IT stm, lcidUK
instead of   IT, stm, lcidUK

2. pull out your strongest glasses and turn the comment in your macro into a valid colon ;-)

herge


Hi JJ2007:

Thank you I often can't see the trees in the forest.
Often those Windows with the real small fonts for the
Filenames or Whatever input Box I copy it over to
qeditor so I can read it! But it's usually Dots and
Commas and obviously Colons and semi Colons.

Regards herge

Revised SWISSM.ASM


; SWISSM.ASM 11:46 AM 6/23/2008
; Modified Monday, July 20, 2015 3:40:28 AM
; SUBSYSTEM:CONSOLE
; Program displays the Time in Switzerland.
;
       include \masm32\include\masm32rt.inc
;
; Remove Zero At End of Buffer MACRO. X is End or Exit
;
remzeroXbuf MACRO BufName:REQ
       lea esi, offset BufName
       add esi, eax
       mov byte ptr [ esi - 1 ], " "
       ENDM
IT MACRO stmX:REQ,lcidX:REQ
    push esi   
    mov esi, offset stmX
    call zeroHour
    pop esi
    INVOKE  GetTimeFormat, lcidX, TIME_FORCE24HOURFORMAT, addr stmX, addr tf, esi, 32
    ret
    ENDM

.data
            public stm, stmC
stm    SYSTEMTIME<>
;typedef struct _SYSTEMTIME {  // st 
;    WORD wYear;  +00
;    WORD wMonth;  +02
;    WORD wDayOfWeek; + 04
;    WORD wDay;  +06
;    WORD wHour; +08
;   WORD wMinute; + 10
;   WORD wSecond; +12
;    WORD wMilliseconds; +14
;} SYSTEMTIME;

stmC   SYSTEMTIME<>; CANADA
lcidCAN dd  4105
lcidPQ  dd  3084    ; Quebec
lcidUK  dd  2057    ; UK
lcidSF  dd  4108    ; Swiss French
lcidSG  dd  2055    ; Swiss German
lcidSI  dd  2064      ; Swiss italian
lcidSR  dd  2073    ; Swiss Romanish(DNW) Does Not Work!
lcidFRA dd  1036    ; France
lcidGER dd  1031    ; Germany
lcidITA dd  1040      ; Italy
lcidSPA dd  1034     ; Spain
             dd  0
public dtbufE, dtbufF, dtbufG, dtbufI, dtbufR
                 db 0
dtbufCb     db " "; Space           
dtbufC      db 260 dup(0); Canada(4105)
                dw 0
                db 0
dtbufQb     db " "
dtbufQ      db 260 dup(0); CANADA (Quebec) 3084
                 db 0           
dtbufEb     db " "; Space           
dtbufE      db 260 dup(0); England UTC(2057)
            dw 0
dtbufF db 260 dup(0); Swiss French(4108)
            dw 0
            db 0
dtbufGb     db " "; Space
dtbufG      db 260 dup(0); Swiss German(2055)
            dw 0
dtbufI      db 260 dup(0); Swiss italian(2064)
            dw 0
dtbufR      db 260 dup(0); Swiss Romanish(2072)
            dw 0
            db 0
dtbufSb     db " "
dtbufS      db 260 dup(9); Spain Spanish(3082)
                dw 0             

AppName      db "Date & Time in Switzerland ", 0
AppNameC    db "Date & Time in Ottawa, Ontario, CANADA ", 0
AppNameE    db "Date & Time in London, England ", 0
AppNameF    db "Date & Time in Geneva - French Suisse ",0
AppNameG    db "Date & Time in Zurich - German Schweiz ",0
AppNameI      db "Date & Time in Switzerland - Italian Svizzera ", 0
AppNameQ    db "Date & Time in Montreal, PQ, CANADA ", 0
AppNameR    db "Date & Time in Switzerland - Romanish ", 0
AppNameS    db "Date & Time in Madrid, Spain - Spanish ", 0
crlf db 13, 10, 0
tf db "HH':'mm':'ss tt", 0
dtError db " << waitExit >> ", 13, 10, 7, 0
Putc  db    " UTC ", 13, 10, 0
Pbst  db    " BST ", 13, 10, 0
Pedt  db    " EDT ", 13, 10, 0
Pcest  db    " CEST ", 13, 10, 0 
      db 0
.code

    align 8
SetTextColor proc fore:DWORD,back:DWORD

    LOCAL hStdOut:DWORD
    invoke GetStdHandle,STD_OUTPUT_HANDLE
    mov   hStdOut,eax
    mov   eax,back
    shl   eax,4
    or    eax,fore
    invoke SetConsoleTextAttribute,hStdOut,eax
    ret
SetTextColor endp

      align 8
zeroHour proc uses eax
; ESI > stm if midnight hour change 0 to 12
    mov ax, word ptr [esi+08]; get Hour
    and ax, ax
    jnz @F
    mov ax,12
    mov [esi+8], ax
@@:
    ret
zeroHour endp

insertTime proc
   IT stm,lcidUK
insertTime endp
      align 8 

insertTimeC proc
    IT stmC,lcidUK
insertTimeC endp

      align 8
insertTimeQ proc
       IT stmC,lcidUK
insertTimeQ endp
        align 8
       
; DI >s to Buffer Output
; SI >s to Source Input 
; Make sure Direction Flag is UP!     
CopyUntilNull proc
        lodsb
        stosb
        and al, al
         jnz CopyUntilNull
        ret 
CopyUntilNull endp 

      align 8
start proc
    invoke SetTextColor, 15, 0
    invoke GetLocalTime, addr stmC
    invoke GetDateFormat, lcidCAN, DATE_LONGDATE, addr stmC, 0, addr dtbufC, sizeof dtbufC
    and eax, eax
     jz ErGDFCanada
     remzeroXbuf dtbufC
     call insertTimeC
     mov  esi, offset dtbufC
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pedt
      call CopyUntilNull
      invoke GetDateFormat, lcidPQ, DATE_LONGDATE, addr stmC, 0, addr dtbufQ, sizeof dtbufQ
      and eax, eax
      jz ErGDFQuebec
      remzeroXbuf dtbufQ
      call insertTimeQ
      mov  esi, offset dtbufQ
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pedt
      call CopyUntilNull
   
      invoke GetSystemTime, addr stm; Get UTC
      ; Kludge to get BST
      mov ax, stm.wHour
      cmp ax, 23
      jnz @F
      xor ax, ax
      jmp saveAX
@@:
      inc ax
      public saveAX
saveAX::
      mov stm.wHour, ax
           
      invoke GetDateFormat, lcidUK , DATE_LONGDATE, addr stm, 0, addr dtbufE, sizeof dtbufE
      and eax, eax
      jz ErGDFEnglish
      remzeroXbuf dtbufE   
      call insertTime

      mov  esi, offset dtbufE
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pbst
      call CopyUntilNull
     
      mov ax, stm.wHour; This is a Kludge to get Swiss Time
      ; or European Time i e France, Germany, Italy
      inc ax; GET UTC +1 i e CET
      mov stm.wHour, ax
       
      invoke GetDateFormat, lcidSF , DATE_LONGDATE, addr stm, 0, addr dtbufF, sizeof dtbufF; was lcidSF
      and eax, eax
      jz ErGDFFrench
      remzeroXbuf dtbufF
      call insertTime

      mov  esi, offset dtbufF
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pcest
      call CopyUntilNull
      invoke GetDateFormat, lcidGER , DATE_LONGDATE, addr stm, 0, addr dtbufG, 260; was lcidSG
      and eax, eax
      jz ErGDFGerman
      remzeroXbuf dtbufG
      call insertTime
      mov  esi, offset dtbufG
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pcest
      call CopyUntilNull
      invoke StdOut, addr dtbufGb
      invoke GetDateFormat, lcidITA, DATE_LONGDATE, addr stm, 0, addr dtbufI, 260; was lcidSI
      and eax, eax
      jz ErGDFItalian
      remzeroXbuf dtbufI
      call insertTime
      invoke GetDateFormat, lcidSPA , DATE_LONGDATE, addr stm, 0, addr dtbufS, 260
      and eax, eax
      jz ErGDFSpain
      public SpainTime
SpainTime::
      remzeroXbuf dtbufS     
      call insertTime
      mov  esi, offset dtbufS
@@:
      lodsb
      and al, al
      jnz @B
      dec esi     
      mov edi, esi
      mov esi, offset  Pcest
      call CopyUntilNull
      jmp NoError

ErGDFCanada:
      invoke StdOut, addr crlf
      print " << GetDateFormat Canada >> ", 13, 10, 7 
      jmp waitExit 
ErGDFQuebec:
      invoke StdOut, addr crlf
      print " << GetDateFormat Quebec >> ", 13, 10, 7
      jmp waitExit   
ErGDFEnglish:
      invoke StdOut, addr crlf
      print " << GetDateFormat English >> ", 13, 10, 7
      jmp waitExit   
ErGDFFrench:
      invoke StdOut, addr crlf
      print " << GetDateFormat French >> ", 13, 10, 7
      jmp   waitExit
ErGDFGerman:
      invoke StdOut, addr crlf
      print 13,10," << GetDateFormat German >> ", 13, 10, 7
      jmp   waitExit
ErGDFItalian:
      invoke StdOut, addr crlf
      print 13,10," << GetDateFormat Italian >> ", 13, 10, 7
      jmp   waitExit
ErGDFRomanish:
      invoke StdOut, addr crlf
      print " << GetDateFormat Romanish >> ", 13, 10, 7
      jmp   waitExit
ErGDFSpain:
      invoke StdOut, addr crlf
      print " << GetDateFormat Spain >> ", 13, 10, 7

waitExit:
      INVOKE MessageBox, 0, addr dtError, addr AppName, MB_OK
NoError:
      invoke MessageBox, 0, addr dtbufC, addr AppNameC, MB_OK; CANADA Time                 GMT-4
      invoke MessageBox, 0, addr dtbufQ, addr AppNameQ, MB_OK; Quebec Time                  GMT-4 
      invoke MessageBox, 0, addr dtbufE, addr AppNameE, MB_OK; England Time                 GMT+0
      invoke MessageBox, 0, addr dtbufF, addr AppNameF, MB_OK; Swiss Time - French       GMT+1
      invoke MessageBox, 0, addr dtbufG, addr AppNameG, MB_OK; Swiss Time - German      GMT+1
      invoke MessageBox, 0, addr dtbufI, addr AppNameI, MB_OK; Swiss Time - Itailan            GMT+1
      invoke MessageBox, 0, addr dtbufS, addr AppNameS, MB_OK; Spanish Time - Spanish     GMT+1

      invoke StdOut, addr crlf
      invoke StdOut, addr dtbufEb; England or United Kingdom
      invoke StdOut, addr Putc
      invoke StdOut, addr crlf
      invoke StdOut, addr dtbufCb; CANADA - Eastern
      invoke StdOut, addr crlf
      invoke StdOut, addr dtbufQb; CANADA, PQ - Eastern(French)
      invoke StdOut, addr crlf
      invoke StdOut, addr dtbufGb; Swiss - German
      invoke StdOut, addr crlf
      invoke StdOut, addr dtbufSb; Spain - Spanish
      invoke StdOut, addr crlf
      inkey " << Wait For Space Bar or Any Key >> ", 13, 10
      invoke StdOut, addr crlf
      exit
      ret
start endp
      align 8
end_here:
      END start
; You Can Find this file at D:\masm32\bin\SWISSM.ASM



I just realised you don't need Lcids for time and if you
want AM or PM use LcidUK or 2057.
You do need Lcids for The dates thou.

Thanks again JJ2007.
Regards herge
Regards herge
Read "Slow Death by Rubber Duck"
for chemical Laughs.

jj2007

Quote from: herge on July 20, 2015, 09:38:02 PMThanks again JJ2007

My pleasure :icon14:

It took me a while to spot the ; 8)