flat assembler
Message board for the users of flat assembler.

flat assembler > Non-x86 architectures > [ARM] OS/Graphics/UI. Magic-Compiler+Emulator. 8 Examples

Author
Thread Post new topic Reply to topic
m3ntal



Joined: 08 Dec 2013
Posts: 296
Magic-Compiler + 8 Examples for the PL110 ARM Primecell Color LCD Controller.

Visual UI/interfaces/controls. High resolution fonts and icons. Drawing works with any display that supports RGB 16 5.6.5 (example: Raspberry PI).

Download: Magic-Compiler Package (8MB ZIP due to QEMU).

Source code is compatible with FASMARM (included in \BINARY\). No setup. All \EXAMPLES\ and \PROJECTS\ compile+run where they are located and they all have shared access to \MEDIA\ files. To run an example, click NAME.BAT. QEMU works most of the time. If it fails (black screen, "Stopped"), just retry. LANGUAGE.INC is never finished, always under construction. No input. I couldn't find any information online for this device except for ARM's documents and QEMU's source code. Preview:
Code:
; address &vga[(y*(screen.w*2))+(x*2)]... function vga.xy.16 . a3=SCREEN.PITCH, a4=a2*a3 . a4+(a1<<1), a2=VGA, a1=a2+a4 endf ; erase screen with color/a1... function clear.screen.16 alias vga=a3,\ w=a2, c=a1 . vga=VGA, w=SCREEN.N .repeat w . (u16) *vga++=c .endr endf ; create rgb16: a1/a2/a3 = 0-31/0-63/0-31 function rgb16 alias r=a1, g=a2, b=a3 . r&11111b, g&111111b, b&11111b . r<<11, r|(g<<5), r|b endf ; extract r/g/b 16 function get.rgb16 alias r=a1, g=a2, b=a3, c=a4 . c=r, r=c>>11, r&11111b, g=c>>5 . g&111111b, b=c&11111b endf ; draw pixel: a1-a3=x/y/c... function draw.pixel.16 alias vga=a1, c=v1 . c=a3 vga.xy . (u16) *vga=c endf ; draw horizontal line: a1-a4=x/y/w/c... function draw.line.h.16 alias vga=a1, c=v1, w=v2 . c=a4, w=a3 vga.xy .repeat w . (u16) *vga++=c .endr endf ; draw solid rectangle: a1-v1=x/y/w/h/c... function draw.box.16 alias vga=a1, c=v1,\ sw=v2, w=v3, h=v4,\ pitch=a2, wb=a3 . w=a3, sw=w, h=a4 ; save w/h vga.xy . pitch=SCREEN.PITCH ; screen+row . wb=w<<1 ; w in bytes .repeat h ; h # times . w=sw ; reset saved .repeat w ; w # times . (u16) *vga++=c ; copy color .endr . vga+pitch, vga-wb ; advance .endr endf ; draw rectangle outline... function draw.outline.16 alias c=v1,\ x=v2, y=v3, w=v4, h=v5 . x=a1, y=a2, w=a3, h=a4 vga.xy draw.line.h x, y, w, c ; top: x, y, w draw.line.v x, y, h, c ; left: x, y, h . a1=x+w, a1-- ; right: x+w-1 . a2=y+1, a3=h-1 ; y+1, h-1 draw.line.v a1, a2, a3, c . a1=x, a2=y+h, a2-- ; bottom: y+h-1 draw.line.h a1, a2, w, c endf ; draw rectangle with transparency... ; a1-a4=x/y/w/h. v5=color, v6=alpha function draw.box.t.16 alias vga=a1, c=v1,\ w=v3, h=v4, sw=v2,\ cl=v5, a=v6,\ pitch=a2,\ wb=a3, sc=v7 . w=a3, sw=w, h=a4 ; save w/h vga.xy . pitch=SCREEN.PITCH ; screen+row . wb=w<<1 ; w in bytes .repeat h ; h # times . w=sw ; reset saved .repeat w ; w # times . (u16) c=*vga ; screen color pusha mix c, cl, a ; combine . c=a1 popa . (u16) *vga++=c ; copy .endr . vga+pitch, vga-wb ; advance .endr endf ; draw 16BPP scanline. a1-a3/v1=x/y/w/pixels... function draw.scanline.16 alias vga=a1,\ ; aliases p=v1, w=v2 . w=a3 ; save w vga.xy ; &vga(x,y) .repeat w ; w # times . (u16) *vga++=*p++ ; copy pixel .endr endf ; draw with transparent color... function draw.scanline.t.16 alias vga=a1,\ ; aliases c=a2, key=v2,\ w=v3, p=v1 . w=a3, p=a4 ; save w/p vga.xy ; &vga(x,y) . (u16) key=*p ; color at 0x0 .repeat w ; w # times . (u16) c=*p++ ; get source pixel .if c<>key ; opaque? . (u16) *vga=c ; copy to screen .end . vga+2 ; next .endr endf ; draw 16BPP variant scanline. ; a1-v1=x/y/w/c/pixels... function draw.scanline.v.16 alias vga=a1,\ ; aliases p=v1, c=v2, s=v3,\ cl=v4, x=v5, w=v6,\ n=v7 . w=a3, cl=a4 ; save w, color vga.xy ; &vga(x,y) .repeat w ; w # times . (u16) c=*p++ ; get source pixel .if c=0 ; black, 100% invisible go .next .end . x=WHITE .if c=x ; white, 100% visible . c=cl go .draw .end . (u16) s=*vga ; else mixed . n=c&11111b, n<<3 ; alpha intensity .if n>=252 ; invisible go .next ; skip .end .if n<=4 ; pure . c=cl go .draw .end pusha mix s, cl, n ; combine . c=r0 ; screen+color popa .draw: . (u16) *vga=c .next: . vga+2 ; next .endr endf ; draw bitmap with transparency ; by upper left pixel color (0x0). ; a1-a4=x/y/w/h. v1=pixels... function draw.bitmap.t.16 alias \ ; aliases vga=a1, image=v1,\ w=v2, h=v3, sw=v4,\ ; sizes, saved w pitch=v5, iwb=v6,\ key=v7, c=a2 . w=a3, h=a4, sw=w ; save size . pitch=SCREEN.PITCH ; screen+image . iwb=w<<1 ; w in bytes . (u16) key=*image ; transparent color vga.xy ; &vga(x,y) .repeat h ; h # times . w=sw .repeat w ; w # times . (u16) c=*image++ .if c<>key ; opaque? . (u16) *vga++=c ; copy pixel .else . vga+2 ; next .end .endr . vga+pitch, vga-iwb ; advance .endr endf ; draw bitmap with alpha in v8 function draw.bitmap.a.16 alias \ ; aliases vga=a1, image=v1,\ w=v2, h=v3, sw=v4,\ ; sizes, saved w pitch=v5, iwb=v6,\ key=v7, a=v8, c=r12 . w=a3, h=a4, sw=w ; save size . pitch=SCREEN.PITCH ; screen+image . iwb=w<<1 ; w in bytes . (u16) key=*image ; transparent color vga.xy ; &vga(x,y) .repeat h ; h # times . w=sw .repeat w ; w # times . (u16) c=*image++ .if c<>key ; opaque? pusha . (u16) a2=*vga . a1=c, a3=a mix . c=a1 popa . (u16) *vga++=c ; copy pixel .else . vga+2 ; next .end .endr . vga+pitch, vga-iwb ; advance .endr endf ; mix(a, b, n) - alpha combination. colors: ; a1/a2=a/b. intensity: a3/n=0-31 function mix.rgb16 alias \ a=a1, b=a2,\ n=a3, d=a4,\ x=v1, s=v2,\ sr=v3, sg=v4, sb=v5 . d=a>>>11, d&1Fh ; dr=(c1>>11)&11111b . s=b>>>11, s&1Fh ; sr=(c2>>11)&11111b . s-d, s*n, s>>>8 ; ((sr-dr)*n)>>8)+dr . sr=s+d . d=a>>>5, d&3Fh ; dg=(c1>>5)&111111b . s=b>>>5, s&3Fh ; sg=(c2>>5)&111111b . s-d, s*n, s>>>8 ; ((sg-dg)*n)>>8)+dg . sg=s+d . d=a&1Fh, s=b&1Fh ; db=c1&11111b . s-d, s*n, s>>>8 ; ((sb-db)*n)>>8)+db . sb=s+d . a=sr<<11 ; c=(r<<11)|(g<<5)|b . a|(sg<<5), a|sb endf ; memory.copy(destiny, source, count) function memory.copy, a, b, n cmp a3, 4 ; if n<4 blt .8 ; copy 8BIT mov v2, a3, lsr 2 ; v2=n/4 .32: ; copy 32BIT ldr v1, [a2], 4 ; v1=*a2++ str v1, [a1], 4 ; *a1++=v1 subs v2, 1 ; v2 # times bne .32 ands a3, 3 ; modulo 4 beq .! ; remainder? .8: ; copy 8BIT ldrb v1, [a2], 1 ; v1=*a2++ strb v1, [a1], 1 ; *a1++=v1 subs a3, 1 ; a3 # times bne .8 endf ; text.n(t) - get text length, # characters function text.n alias t=a1, b=a2, c=v1 . c=1, b=t .while c ; until 0 . (u8) c=*t++ ; read c .endw . t--, t-b ; return current-start endf ; text.copy(a, b) - standard copy with 0 after function text.copy alias a=a1, b=a2, c=v1 . c=1 .while c . (u8) c=*b++ ; read . (u8) *a++=c ; copy .endw . a-- ; return end endf ; text.attach(a, b) - attach b to a function text.attach alias a=a1,\ b=a2, p=v1 . p=b text.end . b=p text.copy endf ; text.attach.c(t, c) - attach c to t function text.attach.c alias t=a1, c=v2 . c=a2 text.end . (u8) *t++=c, (u8) *t=0 endf ; text.compare(a, b) - lexical comparison. ; return <0> function text.compare alias a=a1, b=a2,\ c=v1, d=v2 . c=1, d=c .while c=d ; while equal . (u8) c=*a++ . (u8) d=*b++ . c|d ; and both nonzero .breakz ; break if either=0 .endw . a=c-d ; return *a-*b endf ; text.equal(a, b) - equal? return 1/0 function text.equal text.compare .if false return 1 .end endf 0 ; text.find(t, c) - search for character. ; return address or 0 function text.find alias t=a1,\ c=v1, key=a2 .forever ; loop . (u8) c=*t ; read c .if c=0 ; end? return 0 ; not found .end .if c=key ; found? return t ; t=address .end . t++ ; next .endfv endf ; text.find.last(t, c) - search for c reverse function text.find.last alias t=a1, c=a2,\ key=v1, p=v2 . key=c, p=t ; save begin . c=1 .while c ; advance to end-1, . (u8) c=*t++ ; last character .endw . t-2 .while t>p ; loop backwards . (u8) c=*t ; until beginning .if c=key ; found return t ; t=address .end . t-- ; previous .endw endf 0 ; not found
(Keywords for search engines to bring in new users: ARM assembler tutorial qemu bare metal asm instructions source code data example raspberry PI macro language assembler ARM X86 dex dexbasic hla rosasm assembler download if .if while .while loop let high level features raspberry PI RPI bare metal string graphics art font icon draw pixel image bitmap font converter file I/O input output memory manager card flash RiscOS raspbian programming ARM ASM assembler assembly tutorials how to learn introduction beginner manual bare metal GBA header gameboy advance SP raspberry pi instruction reference encodings list decode register memory ip sp lr pc load relative mov ldr adr immediate constant direct absolute address branch pipeline cache alu THUMB 1 2 FPA VFP SIMD NEON vector floating point FP FPA bios interrupt coprocessor emulator disassembler ARM simulator ARM keil DS-5 armulator PDF manual raspberry pi RPI raspberry pi RPI raspberry pi RPI raspberry pi RPI OS OS OS example source code tutorials DexOS Dex BASIC DexBASIC raspberry PI macro language assembler ARM X86 if .if while .while loop let high level features raspberry PI RPI RISC OS ARM bare metal string drawing graphics art font icon draw pixel image bitmap font converter file I/O input output memory manager card format address org start code data flash RiscOS raspbian install raspbian RPI programming ARM ASM assembler assembly tutorials how to learn introduction beginner manual bare metal GBA header gameboy advance SP raspberry pi instruction reference encode encodings list decode register memory ip sp lr pc load relative mov ldr adr immediate constant address branch pipeline cache alu T1 T2 THUMB 1 2 FPA VFP SIMD NEON vector floating point FP FPA bios interrupt coprocessor emulator disassembler simulator ARM keil DS-5 armulator PDF manual raspberry pi RPI raspberry pi RPI raspberry pi RPI raspberry pi RPI OS OS OS example source code tutorials ARM ASM assembler assembly tutorials how to learn introduction beginner ARM ASM assembler assembly tutorials how to learn introduction beginner)


Description: Zionos Operating System. EXAMPLES\ZOS\ZOS.BAT
Filesize: 179.48 KB
Viewed: 7525 Time(s)

zionos.jpg




Last edited by m3ntal on 12 Mar 2014, 07:47; edited 3 times in total
Post 07 Mar 2014, 16:43
View user's profile Send private message Reply with quote
m3ntal



Joined: 08 Dec 2013
Posts: 296
Z-IDE design in 640x480. Intended for higher resolutions, W/XGA+. To run, click EXAMPLES\ZIDE\ZIDE.BAT.


Description:
Filesize: 118.26 KB
Viewed: 7522 Time(s)

zidemc.jpg


Post 07 Mar 2014, 16:46
View user's profile Send private message Reply with quote
m3ntal



Joined: 08 Dec 2013
Posts: 296
7 examples + 3 project templates:


Description:
Filesize: 159.76 KB
Viewed: 7522 Time(s)

previews.jpg


Post 07 Mar 2014, 16:47
View user's profile Send private message Reply with quote
m3ntal



Joined: 08 Dec 2013
Posts: 296
Magic-Compiler with syntax highlighting:


Description:
Filesize: 284.31 KB
Viewed: 7516 Time(s)

magic.jpg


Post 07 Mar 2014, 16:48
View user's profile Send private message Reply with quote
m3ntal



Joined: 08 Dec 2013
Posts: 296
Update: I registered with sourceforge.net and updated download link.

My New SourceForge Page
Post 08 Mar 2014, 20:06
View user's profile Send private message Reply with quote
Gyver



Joined: 13 Jul 2009
Posts: 3
Mouse doesn' t work on my system : Win 8.1 pro 64 bit Crying or Very sad
Post 09 Mar 2014, 10:40
View user's profile Send private message Reply with quote
m3ntal



Joined: 08 Dec 2013
Posts: 296
Gyver: Sorry, no input.

QEMU supports serial+USB mouse+keyboard, but I can't find any information on how to initialize devices, setup interrupts and send/receive data. From ARM's documents, I managed to initialize the LCD and access a linear VGA. QEMU also supports Angel-ARM interrupts - see QEMU\TARGET-ARM\ARM-SEMI.C - so file I/O should be easy.


Last edited by m3ntal on 12 Mar 2014, 07:30; edited 1 time in total
Post 10 Mar 2014, 03:24
View user's profile Send private message Reply with quote
m3ntal



Joined: 08 Dec 2013
Posts: 296
UPDATE (3/12/14)

* Download Magic-Compiler. New Angel-ARM, FILE.ASM example, FILE.INC, open/create/read/write/seek/etc, CONSOLE.INC, more testing, functions with fast-call parameters (TEXT+DRAW is reduced and clearer), removed DRAW.INC suffixes. Fix: text.find.last.

\EXAMPLES\FILE\FILE.ASM: 100% portable.
Code:
text title.t='Angel-ARM',\ name='EXAMPLE.TXT',\ output='ABCDEFGHIJ',\ error.t='File I/O failed' size=output.$ main puts name putr get.filename name puts filename putr create filename .if false go .error .end text.copy buffer, output text.reverse buffer write buffer, size .if false go .error .end close open filename .if false go .error .end read buffer, size .if false go .error .end puts buffer text.reverse buffer puts buffer go .ok .error: puts error.t .ok: close draw.console endm
Post 12 Mar 2014, 07:27
View user's profile Send private message Reply with quote
m3ntal



Joined: 08 Dec 2013
Posts: 296
New: Convert text to number (i/u/h/b):
Code:
; convert text to unsigned 32BIT integer function t2u, t alias t=v1,\ c=v2, n=v3 . t=a1, (u8) c=*t .if c=30h ; skip preceding .while c=30h ; '0's... . (u8) c=*t++ .endw . t-- .end .if c=0 ; 0 value? return 0 .end . n=0 .forever . (u8) c=*t++ .if c=0 return n .end . n+(n<<2), n+n ; n=n*10+*t++-'0' . n-30h, n+c .endfv endf n ; convert text to signed 32BIT integer function t2i, t alias t=v1,\ c=v2, negate=v3 . t=a1, (u8) c=*t . negate=0 .if c='-' ; negative? . t++, negate=1 ; skip .end t2u t .if negate . -a1 .end endf ; convert hexadecimal text to number function t2h, t ; text to hexadecimal alias t=v1,\ c=v2, n=v3 . t=a1, (u8) c=*t .if c=30h ; skip preceding .while c=30h ; '0's... . (u8) c=*t++ .endw . t-- .end .if c=0 ; 0 value? return 0 .end . n=0 .forever . (u8) c=*t++ .if c=0 return n .end . n<<4 ; n=n*16+c2h(*t++) .if c<=39h ; 0-9 . c-30h .else.if c>=97 ; a-f . c-57h .else ; A-F . c-37h .end . n+c .endfv endf n ; convert binary text to number function t2b, t ; text to binary alias t=v1,\ c=v2, n=v3 . t=a1, (u8) c=*t .if c=30h ; skip preceding .while c=30h ; '0's... . (u8) c=*t++ .endw . t-- .end .if c=0 ; 0 value? return 0 .end . n=0 .forever . (u8) c=*t++ .if c=0 return n .end . n<<1, n+c ; n=n*2+*t++-'0' . n-30h .endfv endf n
Parse: Source, token. Skip/copy while/until:
Code:
;;;;;;;;;;;;;;;;;;; PARSE TEXT ;;;;;;;;;;;;;;;;;;; ; skip while type and not 0 ; get p=text.skip.while p, C.WHITE function text.skip.while, t, type alias t=a1,\ type=a2, c=a3, p=a4 .forever . (u8) c=*t .if c=0 return 0 .end . p=TLT, p+c . (u8) c=*p, c&type .breakz . t++ .endfv . (u8) c=*t .if c=0 return 0 .end endf ; skip until type and while not 0 ; get p=text.skip.until p, C.RETURN function text.skip.until, t, type alias t=a1,\ type=a2, c=a3, p=a4 .forever . (u8) c=*t .if c=0 return 0 .end . p=TLT, p+c . (u8) c=*p, c&type .breakn . t++ .endfv . (u8) c=*t .if c=0 return 0 .end endf ; copy while type and not 0 ; get s=text.copy.while t, s, C.NAME function text.copy.while, a, b, type alias a=a1, b=a2,\ type=a3, c=a4, p=v1 .forever . (u8) c=*b .if c=0 go .e .end . p=TLT, p+c . (u8) c=*p, c&type .breakz . (u8) *a++=*b++ .endfv .e: . (u8) *a=0, (u8) c=*b .if c=0 return 0 .end endf b ; copy until type and while not 0 ; get s=text.copy.until t, s, C.END function text.copy.until, a, b, type alias a=a1, b=a2,\ type=a3, c=a4, p=v1 .forever . (u8) c=*b .if c=0 return 0 .end . p=TLT, p+c . (u8) c=*p, c&type .breakn . (u8) *a++=*b++ .endfv . (u8) *a=0, (u8) c=*b .if c=0 return 0 .end endf b ;;;;;;;;;;;;;;;;;; SOURCE, TOKEN ;;;;;;;;;;;;;;;;; ; safer, easier global skip/copy while/until align 4 void source.p, token.p integer token.type, token.value, token.size macro set.source r { . r12=source.p, r11=r, (u32) *r12=r11 } macro set.token r { . r12=token.p, r11=r, (u32) *r12=r11 } macro set.stream s, t { set.source s set.token t } macro get.source s, t { . s=source.p, (u32) s=*s if ~t eq . t=token.p, (u32) t=*t end if } macro get.token.p t { . t=token.p, (u32) t=*t } macro set.token.x x, v { . r12=token#x, r11=v, (u32) *r12=r11 } macro set.token.type v { set.token.x .type, v } macro set.token.class v { set.token.x .class, v } macro set.token.value v { set.token.x .value, v } macro get.token.value x { . x=token.value, (u32) x=*x } ; skip/copy while/until type... function skip.while, type alias p=v1, type=v2 . type=a1 get.source p try p=text.skip.while p, type set.source p endf p function skip.until, type alias p=v1, type=v2 . type=a1 get.source p try p=text.skip.until p, type set.source p endf p function copy.while, type alias p=v1, t=v2, type=v3 . type=a1 get.source p, t try p=text.copy.while t, p, type set.source p endf p function copy.until, type alias p=v1, t=v2, type=v3 . type=a1 get.source p, t try p=text.copy.until t, p, type set.source p endf p macro skip.space { skip.while C.SPACE } macro skip.white { skip.while C.WHITE } macro skip.comment { skip.until C.RETURN } function skip.all alias s=v1, c=v2 .white: try skip.white get.source s . (u8) c=*s .if c=0 return 0 .end .if c=SEMI.C try skip.comment go .white .end endf 1 ; skip spaces then character. return 0 ; if next c not key function skip.c, key alias p=v1,\ c=v2, key=v3 . key=a1 skip.space get.source p . (u8) c=*p .if c<>key return 0 .end . p++ set.source p endf p ;;;;;;;;;;;;;;;;;;; GET TOKEN ;;;;;;;;;;;;;;;;;;;; macro get.name { copy.while C.NAME } macro get.digits { copy.while C.DIGIT } function get.number alias t=v1, s=v2,\ n=v3, c=v4, p=v5 try skip.space get.source s . (u8) c=*s .if c<30h ; must begin go .error ; with 0-9 .end .if c>39h go .error .end get.digits ; A-F/a-f, h,b,k,m get.token.p t get p=text.end t ; get last . p--, (u8) c=*p ; c of token . (u8) *p=0, p++ .if c>30h ; ends with .if c<39h ; 0-9? get n=t2u t .end .end .if c=68h ; h/exadecimal get n=t2h t .else.if c=62h ; b/inary get n=t2b t .else.if c=6Bh ; k/ilobyte get n=t2u t . n<<10 .else.if c=6Dh ; m/egabyte get n=t2u t . n<<20 .else go .error .end set.token.type C.NUMBER set.token.value n return C.NUMBER .error: syntax.error E.NUMBER endf 0 function verify.n.x, n, a, b alias n=a1, a=a2, b=a3 .if n>=a .if n<=b return 1 .end .end syntax.error E.VALUE endf 0 macro verify.i8 { verify.n.x n, -128, 127 } macro verify.8 { verify.n.x -255, 255 } macro verify.12 { verify.n.x -4095, 4095 } macro verify.u16 { verify.n.x 0, 0FFFFh } macro verify.16 { verify.n.x -0FFFFh, 0FFFFh } macro verify.i24 { verify.n.x -7FFFFFh, 7FFFFFh } macro verify.u24 { verify.n.x 0, 0FFFFFFh } function get.n.x, a, b alias a=v1, b=v2, n=v3 . a=a1, b=a2 try get.number get.token.value n verify.n.x n, a, b endf 1 macro get.number.i8 { get.n.x -128, 127 } macro get.number.8 { get.n.x -255, 255 } macro get.number.12 { get.n.x -4095, 4095 } macro get.number.u16 { get.n.x 0, 0FFFFh } macro get.number.16 { get.n.x -0FFFFh, 0FFFFh } macro get.number.i24 { get.n.x -7FFFFFh, 7FFFFFh } macro get.number.u24 { get.n.x 0, 0FFFFFFh } macro get.number.24 { get.n.x -0FFFFFFh, 0FFFFFFh }


Preview: Minimal Native ARM Assembler:
Code:
;;;;;;;;;;;;;;;;;; ASSEMBLER.INC ;;;;;;;;;;;;;;;;; ; Native ARM Assembler align 4 uinteger @ip=10000h,\ data.offset, data.size,\ code.offset, code.size,\ in.section text opcode.name(16),\ operand.1(96), operand.2(96),\ operand.3(96), operand.4(96) integer name.index, opcode.c,\ opcode.s, opcode.key text label.prefix(32) texts registers.ta[]='r0', 'r1', 'r2', 'r3',\ 'r4', 'r5', 'r6', 'r7', 'r8', 'r9', 'r10',\ 'r11', 'r12', 'r13', 'r14', 'r15' texts registers2.ta[]='a1', 'a2', 'a3', 'a4',\ 'v1', 'v2', 'v3', 'v4', 'v5', 'v6', 'v7',\ 'v8', 'ip', 'sp', 'lr', 'pc' numeric C.*,\ EQ, NE, HS, LO, MI, PL, VS, VC,\ HI, LS, GE, LT, GT, LE, AL, NV texts conditions.ta[]=\ 'eq', 'ne', 'hs', 'lo', 'mi', 'pl', 'vs', 'vc',\ 'hi', 'ls', 'ge', 'lt', 'gt', 'le', 'al', 'nv' numeric C.*,\ EQ, NE, HS, LO, MI, PL, VS, VC,\ HI, LS, GE, LT, GT, LE, AL, NV ; $ - s/tatus and/or condition ; example: add/adds/addgt/addsgt ; ? - condition ; @ - action: da, ia, db, ib textai opcodes.ta,\ I.ADC='adc$', I.ADD='add$', I.AND='and$',\ I.ASR='asr$', I.B='b?', I.BFC='bfc?',\ I.BFI='bfi?', I.BIC='bic$', I.BKPT='bkpt?',\ I.BL='bl?', I.BLX='blx?', I.BX='bx?',\ I.CLZ='clz?', I.CMN='cmn$', I.CMP='cmp$',\ I.CPS='cps', I.EOR='eor$', I.LDC='ldc?',\ I.LDM='ldm@', I.LDR='ldr?', I.LDRB='ldrb?',\ I.LDRD='ldrd?', I.LDRH='ldrh?',\ I.LDRSB='ldrsb?', I.LDRSH='ldrsh?',\ I.LSL='lsl$', I.LSR='lsr$', I.MCR='mcr?',\ I.MCRR='mcrr?', I.MLA='mla$', I.MLS='mls?',\ I.MOV='mov$', I.MOVT='movt?', I.MOVW='movw?',\ I.MRC='mrc?', I.MRRC='mrrc?', I.MRS='mrs?',\ I.MSR='msr?', I.MUL='mul$', I.MVN='mvn$',\ I.NOP='nop', I.ORR='orr$', I.POP='pop?',\ I.PUSH='push?', I.RBIT='rbit?', I.REV='rev?',\ I.REV16='rev16?', I.REVSH='revsh?',\ I.RFE='rfe', I.ROR='ror$', I.RRX='rrx?',\ I.RSB='rsb$', I.RSC='rsc$', I.SBC='sbc$',\ I.SBFX='sbfx?', I.SDIV='sdiv', I.SEL='sel?',\ I.SETEND='setend', I.SMLAL='smlal$',\ I.SMULL='smull$', I.SRS='srs', I.STC='stc?',\ I.STM='stm@', I.STR='str?', I.STRB='strb?',\ I.STRD='strd?', I.STRH='strh?', I.SUB='sub$',\ I.SWI='swi?', I.SWP='swp?', I.SWPB='swpb?',\ I.TEQ='teq$', I.TST='tst$', I.UBFX='ubfx?',\ I.UDIV='udiv', I.UMLAL='umlal$',\ I.UMULL='umull$', I.UXTB='uxtb?',\ I.UXTB16='uxtb16?', I.UXTH='uxth?',\ I.WFE='wfe?', I.WFI='wfi?', I.YIELD='yield?' ;;;;;;;;;;;;;;;;;;;;; ERRORS ;;;;;;;;;;;;;;;;;;;;; textai errors.ta,\ E.NONE ='None',\ E.SYNTAX ='Syntax',\ E.LOAD ='Load failed',\ E.UNEXPECT ='Unexpected',\ E.OPERANDS ='Invalid operand/s',\ E.AMODE ='Invalid addressing mode',\ E.CPU ='Unsupported by CPU',\ E.COMMA =', expected after',\ E.VALUE ='Value exceeds size',\ E.REGISTER ='Register expected',\ E.NUMBER ='Number expected',\ E.NAME ='Name expected',\ E.INAME ='Invalid name',\ E.RESERVE ='Reserved name',\ E.UNDEFINE ='Undefined',\ E.REDEFINE ='Redefinition',\ E.EXPECTT ='Text expected',\ E.ENDT ='Text has no end ''',\ E.MISMATCH ='Mismatched parenthesis'
Convert Instructions:
Code:
.if name=I.NOP . i=0E1A00000h go .ok .end .if name=I.BKPT try get.number.u16 get.token.value n . i=0E1200000h . x=n>>4, c=0FFFh, x&c, x<<8 . i|x, x=n&0Fh, i|x, i|1110000b go .ok .end .if name=I.SWI try get.number.u24 get.token.value n . i=0EF000000h, i|n go .ok .end .if name=I.MOVW . i=0E3000000h go .movwt .end .if name=I.MOVT . i=0E3400000h .movwt: try verify.cpu ARM.v6T2 get r=get.register fail? r=-1 try skip.comma try get.number.16 get.token.value n . i|(r<<12), x=n&0F000h, x<<4 . i|x, c=0FFFh, x=n&c, i|x go .ok .end
Note: All code is experimental, beta. I recently discovered this method of testing ARM. LANGUAGE.INC is far from finished.


Description:
Filesize: 75.6 KB
Viewed: 7175 Time(s)

narm.jpg


Post 22 Mar 2014, 10:23
View user's profile Send private message Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >

Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 2004-2018, Tomasz Grysztar.

Powered by rwasa.