209 lines
No EOL
8.1 KiB
NASM
209 lines
No EOL
8.1 KiB
NASM
/* ARM assembly AARCH64 Raspberry PI 3B */
|
|
/* program disMessGraph64.s */
|
|
/* link with gcc options -lX11 -L/usr/lpp/X11/lib */
|
|
|
|
/*******************************************/
|
|
/* Constantes file */
|
|
/*******************************************/
|
|
/* for this file see task include a file in language AArch64 assembly*/
|
|
.include "../includeConstantesARM64.inc"
|
|
.equ ClientMessage, 33
|
|
|
|
/*******************************************/
|
|
/* Initialized data */
|
|
/*******************************************/
|
|
.data
|
|
szRetourligne: .asciz "\n"
|
|
szMessErreur: .asciz "Server X11 not found.\n"
|
|
szMessErrfen: .asciz "Error create X11 window.\n"
|
|
szMessErrGC: .asciz "Error create Graphic Context.\n"
|
|
szMessGoodBye: .asciz "Goodbye World!"
|
|
|
|
szLibDW: .asciz "WM_DELETE_WINDOW" // message close window
|
|
|
|
/*******************************************/
|
|
/* UnInitialized data */
|
|
/*******************************************/
|
|
.bss
|
|
.align 4
|
|
qDisplay: .skip 8 // Display address
|
|
qDefScreen: .skip 8 // Default screen address
|
|
identWin: .skip 8 // window ident
|
|
wmDeleteMessage: .skip 16 // ident close message
|
|
stEvent: .skip 400 // provisional size
|
|
|
|
buffer: .skip 500
|
|
|
|
/**********************************************/
|
|
/* -- Code section */
|
|
/**********************************************/
|
|
.text
|
|
.global main // program entry
|
|
main:
|
|
mov x0,#0 // open server X
|
|
bl XOpenDisplay
|
|
cmp x0,#0
|
|
beq erreur
|
|
// Ok return Display address
|
|
ldr x1,qAdrqDisplay
|
|
str x0,[x1] // store Display address for future use
|
|
mov x28,x0 // and in register 28
|
|
// load default screen
|
|
ldr x2,[x0,#264] // at location 264
|
|
ldr x1,qAdrqDefScreen
|
|
str x2,[x1] //store default_screen
|
|
mov x2,x0
|
|
ldr x0,[x2,#232] // screen list
|
|
|
|
//screen areas
|
|
ldr x5,[x0,#+88] // white pixel
|
|
ldr x3,[x0,#+96] // black pixel
|
|
ldr x4,[x0,#+56] // bits par pixel
|
|
ldr x1,[x0,#+16] // root windows
|
|
// create window x11
|
|
mov x0,x28 //display
|
|
mov x2,#0 // position X
|
|
mov x3,#0 // position Y
|
|
mov x4,600 // weight
|
|
mov x5,400 // height
|
|
mov x6,0 // bordure ???
|
|
ldr x7,0 // ?
|
|
ldr x8,qBlanc // background
|
|
str x8,[sp,-16]! // argument fot stack
|
|
bl XCreateSimpleWindow
|
|
add sp,sp,16 // for stack alignement
|
|
cmp x0,#0 // error ?
|
|
beq erreurF
|
|
ldr x1,qAdridentWin
|
|
str x0,[x1] // store window ident for future use
|
|
mov x27,x0 // and in register 27
|
|
|
|
// Correction of window closing error
|
|
mov x0,x28 // Display address
|
|
ldr x1,qAdrszLibDW // atom name address
|
|
mov x2,#1 // False create atom if not exist
|
|
bl XInternAtom
|
|
cmp x0,#0
|
|
ble erreurF
|
|
ldr x1,qAdrwmDeleteMessage // address message
|
|
str x0,[x1]
|
|
mov x2,x1 // address atom create
|
|
mov x0,x28 // display address
|
|
mov x1,x27 // window ident
|
|
mov x3,#1 // number of protocoles
|
|
bl XSetWMProtocols
|
|
cmp x0,#0
|
|
ble erreurF
|
|
// create Graphic Context
|
|
mov x0,x28 // display address
|
|
mov x1,x27 // window ident
|
|
bl createGC // GC address -> x26
|
|
cbz x0,erreurF
|
|
// Display window
|
|
mov x1,x27 // ident window
|
|
mov x0,x28 // Display address
|
|
bl XMapWindow
|
|
|
|
ldr x0,qAdrszMessGoodBye // display text
|
|
bl displayText
|
|
|
|
1: // events loop
|
|
mov x0,x28 // Display address
|
|
ldr x1,qAdrstEvent // events structure address
|
|
bl XNextEvent
|
|
ldr x0,qAdrstEvent // events structure address
|
|
ldr w0,[x0] // type in 4 fist bytes
|
|
cmp w0,#ClientMessage // message for close window
|
|
bne 1b // no -> loop
|
|
|
|
ldr x0,qAdrstEvent // events structure address
|
|
ldr x1,[x0,56] // location message code
|
|
ldr x2,qAdrwmDeleteMessage // equal ?
|
|
ldr x2,[x2]
|
|
cmp x1,x2
|
|
bne 1b // no loop
|
|
|
|
mov x0,0 // end Ok
|
|
b 100f
|
|
erreurF: // error create window
|
|
ldr x0,qAdrszMessErrfen
|
|
bl affichageMess
|
|
mov x0,1
|
|
b 100f
|
|
erreur: // error no server x11 active
|
|
ldr x0,qAdrszMessErreur
|
|
bl affichageMess
|
|
mov x0,1
|
|
100: // program standard end
|
|
mov x8,EXIT
|
|
svc 0
|
|
qBlanc: .quad 0xF0F0F0F0
|
|
qAdrqDisplay: .quad qDisplay
|
|
qAdrqDefScreen: .quad qDefScreen
|
|
qAdridentWin: .quad identWin
|
|
qAdrstEvent: .quad stEvent
|
|
qAdrszMessErrfen: .quad szMessErrfen
|
|
qAdrszMessErreur: .quad szMessErreur
|
|
qAdrwmDeleteMessage: .quad wmDeleteMessage
|
|
qAdrszLibDW: .quad szLibDW
|
|
qAdrszMessGoodBye: .quad szMessGoodBye
|
|
/******************************************************************/
|
|
/* create Graphic Context */
|
|
/******************************************************************/
|
|
/* x0 contains the Display address */
|
|
/* x1 contains the ident Window */
|
|
createGC:
|
|
stp x20,lr,[sp,-16]! // save registers
|
|
mov x20,x0 // save display address
|
|
mov x2,#0
|
|
mov x3,#0
|
|
bl XCreateGC
|
|
cbz x0,99f
|
|
mov x26,x0 // save GC
|
|
mov x0,x20 // display address
|
|
mov x1,x26
|
|
ldr x2,qRed // code RGB color
|
|
bl XSetForeground
|
|
cbz x0,99f
|
|
mov x0,x26 // return GC
|
|
b 100f
|
|
99:
|
|
ldr x0,qAdrszMessErrGC
|
|
bl affichageMess
|
|
mov x0,0
|
|
100:
|
|
ldp x20,lr,[sp],16 // restaur 2 registers
|
|
ret // return to address lr x30
|
|
qAdrszMessErrGC: .quad szMessErrGC
|
|
qRed: .quad 0xFF0000
|
|
qGreen: .quad 0xFF00
|
|
qBlue: .quad 0xFF
|
|
qBlack: .quad 0x0
|
|
/******************************************************************/
|
|
/* display text on screen */
|
|
/******************************************************************/
|
|
/* x0 contains the address of text */
|
|
displayText:
|
|
stp x1,lr,[sp,-16]! // save registers
|
|
mov x5,x0 // text address
|
|
mov x6,0 // text size
|
|
1: // loop compute text size
|
|
ldrb w10,[x5,x6] // load text byte
|
|
cbz x10,2f // zero -> end
|
|
add x6,x6,1 // increment size
|
|
b 1b // and loop
|
|
2:
|
|
mov x0,x28 // display address
|
|
mov x1,x27 // ident window
|
|
mov x2,x26 // GC address
|
|
mov x3,#50 // position x
|
|
mov x4,#100 // position y
|
|
bl XDrawString
|
|
100:
|
|
ldp x1,lr,[sp],16 // restaur 2 registers
|
|
ret // return to address lr x30
|
|
/********************************************************/
|
|
/* File Include fonctions */
|
|
/********************************************************/
|
|
/* for this file see task include a file in language AArch64 assembly */
|
|
.include "../includeARM64.inc" |