flat assembler
Message board for the users of flat assembler.
Index
> Tutorials and Examples > New Art Program 4 Kids Goto page 1, 2 Next |
Author |
|
uart777 19 Feb 2013, 02:22
Mini-Artist
Features * Easy to use. Just select a brush then draw * Big clear text and controls for portable PCs, netbooks, tablets * Supports higher resolutions. XGA+ (1024x768) is recommended * Includes Z77 library + 970+ functions+macros (now I have a program that counts/lists them) * Z77 defines its own programming language - named "Future Assembler" - and graphics, images, fonts, controls, etc. * Royalty FREE. If you like this program, please do something with it: copy, edit, distribute, convert to MenuetOS, KolibriOS, DexOS, Linux, standalone (Android would be nice). Download: http://sungod777.zxq.net/miniart.zip * Updates: Easier dynamic array syntax: ".index array[i]" or "get [p]=.index[i]". New drawing functions: draw.bar, draw.shade, draw.edge. "endf" can return a value: "endf 1" = "let eax=1 | endf". "try/escape/fail" operate like "return v" and do not return the "endf value". INTERFACE.INC contains minimal custom controls (button, listbox, textbox) and basic dialogs. * Known Issues: Beta. Slow .BMP load/save. In future examples, it will be optimized to read/write entire file once then process in memory. Occassional crash when drawing. After 4 days of working on this, I'm mentally exausted. Good enough for now! Source Code Excerpts and Cool ASCII Art: Code: ; _______ ______ ___ ; / __/ _ | / __/ |/ / ; / _// __ |_\ \/ /|_/ / ; /_/ /_/ |_/___/_/ /_/ ; ___ __ ; / _/_ __/ /___ _________ ; / _/ // / __/ // / __/ -_) ; /_/ \_,_/\__/\_,_/_/ \__/_ __ ; ___ ____ ___ ___ __ _ / / / /__ ____ ; / _ `(_-<(_-</ -_) ' \/ _ \/ / -_) __/ ; \_,_/___/___/\__/_/_/_/_.__/_/\__/_/ ; create new blank image... function create.new.image let eax=[screen.h], eax-192 try create.image canvas, eax, eax set.image.colors canvas, WHITE text.copy filename, untitled.t let [saved?]=YES endf 1 ; load all brushes from \BRUSH\*.BMP... set.brush.folder try find.files brush.files, image.wild let [n]=[brush.files.n] .loop [i]=0 to [n] get [file]=.index brush.files[i] try [p]=.expand brushes try load.image [p], [file] remove.ext [file] .endl ; load icons from \ICON\*.BMP... set.icon.folder .loop [i]=0 to icon.files.$ try .expand icons let ecx=[i], edx=[icon.files+ecx*4] try load.image.t eax, edx .endl try load.title.icon eye.file set.title.text title ; load initial cursor... set.cursor.folder try [p]=.expand cursors load.cursor [p], cursor.file ; create remaining cursors from icon ; brush images... .loop [i]=ID.PEN to ID.HUE try [p]=.expand cursors .index icons[i] create.cursor [p], eax, 192 rotate.image [p], 'r' .endl ; _____ __ ; _/ ____\_ ___/ |_ __ _________ ____ ; \ __\ | \ __\ | \_ __ \_/ __ \ ; | | | | /| | | | /| | \/\ ___/ ; |__| |____/ |__| |____/ |__| \___/ ; undo canvas action... N.UNDOS=7 BOOLEAN save.undo?=YES TEXT no.undo.t='No undos remaining' function save.undo .if [save.undo?] .if [undo.images.n]>=N.UNDOS .discard undo.images .end try .expand undo.images try copy.image eax, canvas let [save.undo?]=NO .end endf 1 function undo .if [undo.images.n]>0 .recent undo.images try copy.image canvas, eax .reduce undo.images .end endf 1 ;################__########### ; ______ _____ / /____ __ _ ; / __/ // (_-</ __/ _ \/ ' \ ; \__/\_,_/___/\__/\___/_/_/_/ ; ___ __ ; ___/ (_)__ _/ /__ ___ ____ ; / _ / / _ `/ / _ \/ _ `(_-< ; \_,_/_/\_,_/_/\___/\_, /___/ ; /___/ ;############################# function message.box, t, m set.dialog 'm' ; message set.dialog.text [t], [m] endf function load.file.dialog set.dialog 's' ; select set.dialog.text load.title set.image.folder try list.find.files image.wild list.arrange 'a' endf 1 function save.file.dialog set.dialog 'i' ; input set.dialog.text save.title set.text.box filename endf macro close.dialog { set.dialog NOTHING } ; ###############__################ ; ______ _____ / /____ __ _ ; / __/ // (_-</ __/ _ \/ ' \ ; \__/\_,_/___/\__/\___/_/_/_/ __ ; _______ ___ / /________ / /__ ; / __/ _ \/ _ \/ __/ __/ _ \/ (_-< ; \__/\___/_//_/\__/_/ \___/_/___/ ; ################################# ; draw title and toolbar icons... draw.title.bar let [icon.select]=NOTHING,\ [icon.click]=NOTHING .loop [i]=ID.NEW to ID.HELP+1 let eax=[i], eax*64, eax+340 set.box box, eax, [y], 64, 64 .if [icon.select]=NOTHING .if.select box let [icon.select]=[i] .if [mouse.1] let [icon.click]=[i] .end draw.panel box, [theme.color] .end .end .index icons[i] draw.image.b eax, box .endl ; input to title bar... function title.bar.input .if [mouse.id]='c' .if.select minimize.box let [mouse.1]=0,\ [mouse.x]=0, [mouse.y]=0 minimize.window return 1 .else .if.select close.box exit .end .end .end endf 0 ; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ____ _____ ____ ; / __/____ ____ __ / ___/_ _______ _____ / __/ ; _\ \/ $_) \ / // / / /__/ // / __/ |/ / $_)\ \ ;/___/\__/_\_\\_, / \___/\_,_/_/ |___/\__/___/ ; /___/ ; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ; check out the sexy french curve 'S' indents! ; Z77 features the most stylish, slickest, ; compact ASM code ever written function scroll.timer .if [mouse.1] .if.select sb.up.box call !list.scroll.up jmp .paint .end .if.select sb.down.box call !list.scroll.down jmp .paint .end .if.select sb.box let eax=[sb.knob.box.y],\ ecx=[sb.knob.box.h],\ ecx/2, eax+ecx .if [mouse.y] not eax .if [mouse.y]<eax let eax-[mouse.y] .if eax>12 call !list.scroll.up jmp .paint .end .else let ecx=[mouse.y], ecx-eax .if eax>12 call !list.scroll.down jmp .paint .end .end .end .end .end escape .paint: redraw endf ; __ ____ _ __ ; / / / __ \ | /| / /___ ; / /__/ /_/ / |/ |/ /___/ ; /____/\____/|__/|__/ ; __ _____ ________ ; / / / __/ | / / __/ / ; / /__/ _/ | |/ / _// /__ ; /____/___/ |___/___/____/ ; ________ _____.__ ; / _____/___________ _/ ____\__|__ ___ ; / \ __\_ __ \__ \\ __\| \ \/ / ; \ \_\ \ | \// __ \| | | |> < ; \______ /__| (____ /__| |__/__/\_ \ ; \/ \/ \/ function convert.image.alpha, image, source push esi edi let esi=[source], esi=[?image.p+esi],\ edi=[image], eax=edi, edi=[?image.p+edi],\ ecx=[?image.w+eax], edx=[?image.h+eax], ecx*edx .convert: let eax=[esi], eax&0FFh, eax<<24,\ [edi]|eax, edi+4, esi+4, ecx-- jnz .convert pop edi esi endf function size.image.p, image, p locals w, h, iw, ih let eax=[image],\ [iw]=[?image.w+eax], [ih]=[?image.h+eax],\ eax=[iw], eax*[p], ecx=100, eax/ecx, [w]=eax,\ eax=[ih], eax*[p], ecx=100, eax/ecx, [h]=eax size.image [image], [w], [h] endf function rotate.image, image, way locals x, y, w, h, p, s, col, row let eax=[image], [s]=[?image.p+eax],\ [w]=[?image.w+eax], [h]=[?image.h+eax] try [p]=scratch [h], [w] ; w/h reversed .if [way]='r' ; right, 90 let eax=[h], eax--, [col]=eax .loop [y]=0 to [h] .loop [x]=0 to [w] let eax=[x], eax*[h], eax+[col], eax<<2,\ eax+[p], edx=[y], edx*[w], edx+[x], edx<<2,\ edx+[s], [eax]=[edx] .endl let [col]-- .endl .else.if [way]='l' ; left, 270 let [col]=0 .loop [y]=0 to [h] let eax=[w], eax--, [row]=eax .loop [x]=0 to [w] let eax=[row], eax*[h], eax+[col], eax<<2,\ eax+[p], edx=[y], edx*[w], edx+[x], edx<<2,\ edx+[s], [eax]=[edx], [row]-- .endl let [col]++ .endl .end end.scratch [image] let eax=[image],\ ; adjust location edx=[?image.x+eax], ecx=[w], ecx>>1, edx+ecx,\ ecx=[h], ecx>>1, edx-ecx, [?image.x+eax]=edx,\ edx=[?image.y+eax], ecx=[h], ecx>>1, edx+ecx,\ ecx=[w], ecx>>1, edx-ecx, [?image.y+eax]=edx endf ; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ; __ _ ____ ___ ; / /__ (_)__ ___ _ / __ \/ _/ ; / '_// / _ \/ _ `/ / /_/ / _/ ;/_/\_\/_/_//_/\_, / \____/_/ ; __ ____ /___/ ______ ___ ; / // / / / _ | / __/ |/ / ; / _ / /__ / __ |_\ \/ /|_/ / ;/_//_/____/ /_/ |_/___/_/ /_/ ; ; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ let \ ; extract r/g/b components ecx=eax, ecx>>16, ecx&0FFh, [sr]=ecx,\ ecx=eax, ecx>>8, ecx&0FFh, [sg]=ecx,\ ecx=eax, ecx&0FFh, [sb]=ecx,\ ecx=edx, ecx>>16, ecx&0FFh, [dr]=ecx,\ ecx=edx, ecx>>8, ecx&0FFh, [dg]=ecx,\ ecx=edx, ecx&0FFh, [db]=ecx let \ ; calculate deltas: (((s-d)*a)/256)+d eax=[sr], eax-[dr], eax*[n], eax>>8, eax+[dr],\ ecx=[sg], ecx-[dg], ecx*[n], ecx>>8, ecx+[dg],\ edx=[sb], edx-[db], edx*[n], edx>>8, edx+[db] let \ ; construct RGB eax<<16, ecx<<8, eax|ecx, eax|edx
Last edited by uart777 on 27 Aug 2013, 03:16; edited 2 times in total |
|||||||||||
19 Feb 2013, 02:22 |
|
uart777 19 Feb 2013, 11:14
Hey, hopcode Just read your PM. Thanks for your words of encouragement. For someone who doesn't get paid for programming (or anything else!), there must be some kind of motivation. Otherwise, no reason to do it.
PS: Previews of my games+programs if anyone cares: http://www.youtube.com/watch?v=CpLKyxS1tMo Last edited by uart777 on 07 Aug 2013, 19:06; edited 2 times in total |
|||
19 Feb 2013, 11:14 |
|
HaHaAnonymous 19 Feb 2013, 12:12
[ Post removed by author. ]
Last edited by HaHaAnonymous on 28 Feb 2015, 21:23; edited 1 time in total |
|||
19 Feb 2013, 12:12 |
|
TmX 19 Feb 2013, 12:45
uart777 wrote:
No, it's not impossible. Most Android devices are powered by ARM cpus, and revolution's FASMARM can be used. I guess the problem is how to interact with Android API. Lazarus uses JNI: http://wiki.freepascal.org/Custom_Drawn_Interface/Android Maybe we would could try that approach. |
|||
19 Feb 2013, 12:45 |
|
MHajduk 19 Feb 2013, 13:30
uart777
I'm glad to see your program because it's the first (correct me if I'm wrong) such an advanced utility written with FASM by you and posted here, on this forum. The graphical user interface is clear, neat and easy to use. What is even more important it's extremely readable and intuitive too. I would keep my fingers crossed for your project hoping for the future progress. Nevertheless, I have some minor remarks to the GUI as a potential user of your application:
|
|||
19 Feb 2013, 13:30 |
|
malpolud 19 Feb 2013, 19:40
uart777:
-Great software - nice skills -Great examples - very high educational values -Great GUI - I love that style, incredibly clear and simple |
|||
19 Feb 2013, 19:40 |
|
uart777 19 Feb 2013, 23:33
[ Post removed by author. ]
Last edited by uart777 on 07 Aug 2013, 19:07; edited 1 time in total |
|||
19 Feb 2013, 23:33 |
|
Dex4u 20 Feb 2013, 01:14
Great work uart777, as well as trying it in windows, i tried to get it to work in wine, on linux, but it only half worked, but it is a old ver of wine.
I would like to port to DexOS, but i am working 100% on the Arm side of DexOS. But as soon as i take a break, i will port it. |
|||
20 Feb 2013, 01:14 |
|
uart777 20 Feb 2013, 09:21
Here are 3 small examples of custom controls: http://sungod777.zxq.net/controls.zip
Listbox displays 970+ macros+functions I have written. Last edited by uart777 on 07 Aug 2013, 19:08; edited 1 time in total |
|||
20 Feb 2013, 09:21 |
|
JohnFound 20 Feb 2013, 12:16
uart777, I would not say it is assembly language. Anyway, it does not work in Wine.
|
|||
20 Feb 2013, 12:16 |
|
hopcode 20 Feb 2013, 13:41
hallo uart,
please join the x64lab community. your opensource creativity may help us to evolve in a human way. dont worry if this application isnt perfect now. it will be in the future, of course. it gets future because as ahead in the goal of the thread addressing a "New Art Program 4 Kids", kids are the future of our world. anyways, whatever you like to do, stay tuned because i plan in the next days a videoclip on x64lab -weekend-, showing a bit of the sintax of the macro language. Cheers, p.s. the little puppy there is very funny and in the videoclip too. i have a puppy too with me, a dackel hund, rauhhaar and pooch too !! i may be wrong, because i know from friends telling those puppies there have 1000 different emotional moods in 3 seconds. but if i read it correctly now (i. e in the videoclip but not in the foto above) it needs lot of attentions from you... this is part and consequence of their native herd behaviour. very important. i think, you know already what i mean, but please dont understimate the power of that instinkt. _________________ ⠓⠕⠏⠉⠕⠙⠑ |
|||
20 Feb 2013, 13:41 |
|
uart777 20 Feb 2013, 19:47
JohnFound: When did I make that claim? Stop putting words in my mouth. You must know ASM well in order to use my syntaxes which I see as pure expanded ASM.
Last edited by uart777 on 07 Aug 2013, 19:09; edited 1 time in total |
|||
20 Feb 2013, 19:47 |
|
malpolud 20 Feb 2013, 20:22
uart777 I have and I never had any problems with you.
But why do you always have to wreck the good feeling about you by being defiant? |
|||
20 Feb 2013, 20:22 |
|
AsmGuru62 20 Feb 2013, 20:50
@uart777: your macros are great to quickly produce code, but they are no
match for a set of instructions optimized by hand for some certain cases. |
|||
20 Feb 2013, 20:50 |
|
uart777 20 Feb 2013, 20:56
[ Post removed by author. ]
Last edited by uart777 on 07 Aug 2013, 19:09; edited 1 time in total |
|||
20 Feb 2013, 20:56 |
|
uart777 20 Feb 2013, 21:07
Guru: Well, I prefer to write macros that are useful and sophisticated:
Code: ; create locals of specified sizes or 32BIT. ; example: ; locale x, y, username(32), filename(256),\ ; image(IMAGE.$), my.font(FONT.$), etc macro locale [p] { common ..locals.size=0 forward ; get names and sizes define ?s 0 match name(size), p \{ ; size specified ?list.attach local.names, name verify.size size ..locals.size=..locals.size+size define ?s 1 \} match =0 name, ?s p \{ ; default 32BIT ?list.attach local.names, name ..locals.size=..locals.size+4 define ?s 1 \} ..n.locals=..n.locals+1 common virtual at ebp-..locals.size ; get offsets forward local ..l define ?s 0 match name(size), p \{ ..l dd (size/4) dup(?) name equ ..l define ?s 1 \} match =0 name, ?s p \{ ; default 32BIT ..l dd ? name equ ..l define ?s 1 \} common end virtual if ..n.parameters=0 ; create stack frame? push ebp mov ebp, esp end if sub esp, ..locals.size ; allocate locals } Last edited by uart777 on 07 Aug 2013, 19:10; edited 1 time in total |
|||
20 Feb 2013, 21:07 |
|
malpolud 20 Feb 2013, 22:06
uart777 wrote: Just insane and can't help it. _________________ There's nothing special about it, It's either there when you're born or not. |
|||
20 Feb 2013, 22:06 |
|
hopcode 21 Feb 2013, 06:36
uart is... beyond, uart is... a special one.
i am sorry if i said something that may have irritated your way, your mood, your person that you are, what you do. i am fascinated from the human aspect of the "whole", i.e. not only you for yourself but you yourself and all that happens around you (persons included) in this and all thread, and even on other messageboard -i am a curious one- and how around you all persons are actually nude like Adam. Thanks for all Cheers, _________________ ⠓⠕⠏⠉⠕⠙⠑ |
|||
21 Feb 2013, 06:36 |
|
uart777 21 Feb 2013, 09:38
[ Post removed by author. ]
Last edited by uart777 on 07 Aug 2013, 19:11; edited 1 time in total |
|||
21 Feb 2013, 09:38 |
|
Goto page 1, 2 Next < Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.