User input/Graphical: Difference between revisions

add task to ARM64 assembly Raspberry Pi
(add task to ARM64 assembly Raspberry Pi)
Line 3:
 
See also: [[User input/Text]]
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program inputWin64.s */
 
/*******************************************/
/* Constantes file */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
 
.equ YPOSTEXTINPUT, 18
.equ LGBUFFER, 50
.equ FONTSIZE, 6
/* constantes X11 */
.equ KeyPressed, 2
.equ ButtonPress, 4
.equ ButtonPress, 4
.equ EnterNotify, 7
.equ LeaveNotify, 8
.equ ClientMessage, 33
.equ KeyPressMask, 1
.equ ButtonPressMask, 4
.equ ButtonReleaseMask, 8
.equ ExposureMask, 1<<15
.equ StructureNotifyMask, 1<<17
.equ EnterWindowMask, 1<<4
.equ LeaveWindowMask, 1<<5
 
.equ CWBorderWidth, 1<<4
 
 
/* structures descriptions are in end oh this program */
 
/*******************************************/
/* 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"
szMessErrButton: .asciz "Error create button.\n"
szMessErrButtonGC: .asciz "Error create button Graphic Context.\n"
szMessErrInput: .asciz "Error create input window.\n"
szMessErrInputGC: .asciz "Error create input Graphic Context.\n"
//szMessGoodBye: .asciz "There have been no clicks yet"
szCursor: .asciz "_"
szTextButton: .asciz "PUSH"
szMessResult: .asciz "Text : @ Value @ "
szLibText: .asciz "Text :"
szLibValue: .asciz "Value : "
 
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
qCounterClic: .skip 8 // counter clic button
//qLongTexte: .skip 8
//ptZoneS: .skip 8 // pointeur zone saisie
ptMessage: .skip 8 // final message pointer
sZoneConv: .skip 24
wmDeleteMessage: .skip 16 // ident close message
stEvent: .skip 400 // provisional size
 
stButton: .skip BT_fin
buffer: .skip 500
stInputText: .skip Input_fin
stInputValue: .skip Input_fin
stWindowChge: .skip XWCH_fin
sSaisieCar: .skip LGBUFFER
sTexteSaisi: .skip LGBUFFER
sValueSaisi: .skip LGBUFFER
key: .skip 4 // code touche
/**********************************************/
/* -- Code section */
/**********************************************/
.text
.global main // program entry
main: // INFO: 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
ldr x2,[x28,Disp_default_screen] // load default screen
ldr x1,qAdrqDefScreen
str x2,[x1] //store default_screen
mov x2,x28
ldr x0,[x2,Disp_screens] // screen list
//screen areas
ldr x5,[x0,Screen_white_pixel] // white pixel
ldr x3,[x0,Screen_black_pixel] // black pixel
ldr x4,[x0,Screen_root_depth] // bits par pixel
ldr x1,[x0,Screen_root] // 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
// authorization of seizures
mov x0,x28 // display address
mov x1,x27 // window ident
ldr x2,qFenetreMask // mask
bl XSelectInput
cmp x0,#0
ble 99f
// create Graphic Context
mov x0,x28 // display address
mov x1,x27 // window ident
bl createGC // GC address -> x26
cbz x0,erreurF
// create Graphic Context 1
mov x0,x28 // display address
mov x1,x27 // window ident
bl createGC1 // GC address -> x25
cbz x0,erreurF
// Display window
mov x1,x27 // ident window
mov x0,x28 // Display address
bl XMapWindow
 
ldr x0,qAdrszLibText
mov x1,x27
mov x2,5
mov x3,70
bl displayText
ldr x0,qAdrszLibValue
mov x1,x27
mov x2,280
mov x3,70
bl displayText
bl createButton // create button on screen
 
bl createInputText // create input text window
 
bl createInputValue // create input value window
 
1: // events loop
bl traitEvents
// other events
cbz x0,1b // and loop
//TODO: close ??
mov x0,0 // end Ok
b 100f
//TODO: close ??
 
3:
ldr x0,qAdrstEvent // events structure address
bl evtButtonMouse
b 1b
 
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
qAdrszLibText: .quad szLibText
qAdrszLibValue: .quad szLibValue
qFenetreMask: .quad KeyPressMask|ButtonPressMask|StructureNotifyMask|ExposureMask|EnterWindowMask
/********************************************************************/
/* Events ***/
/********************************************************************/
traitEvents: // INFO: traitEvents
stp x20,lr,[sp,-16]! // save registers
mov x0,x28 // Display address
ldr x1,qAdrstEvent // events structure address
bl XNextEvent
ldr x0,qAdrstEvent // events structure address
ldr x1,[x0,#XAny_window] // what window ?
cmp x1,x27 // main window ?
bne 1f
bl evtMainWindow // yes
b 100f
1:
ldr x10,qAdrstInputText // input text window ?
ldr x11,[x10,Input_adresse]
cmp x1,x11
bne 2f
bl evtInputWindowText
mov x0,0 // other events
b 100f
2:
ldr x10,qAdrstInputValue // input value window
ldr x11,[x10,Input_adresse]
cmp x1,x11
bne 3f
bl evtInputWindowValue
mov x0,0 // other events
b 100f
3:
ldr x10,[x0,XAny_window] // window of event
ldr x11,qAdrstButton // load button ident
ldr x12,[x11,BT_adresse]
cmp x10,x12 // equal ?
bne 4f // no
bl evtButton
mov x0,0 // other events
b 100f
4: // other windows
mov x0,0 // other events
100:
ldp x20,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
/******************************************************************/
/* main windows events */
/******************************************************************/
/* x0 contains the events */
/* x1 contains the ident Window */
/* x0 return 0 if continue , 1 if program end */
evtMainWindow: // INFO: evtMainWindow
stp x20,lr,[sp,-16]! // save registers
ldr w0,[x0] // type in 4 first bytes
cmp w0,#ClientMessage // message for close window
beq 2f // yes -> end
mov x0,0 // other events
b 100f // and loop
2:
ldr x0,qAdrstEvent // events structure address
ldr x1,[x0,56] // location message code
ldr x2,qAdrwmDeleteMessage // equal ?
ldr x2,[x2]
mov x0,0
cmp x1,x2
bne 100f // no loop
mov x0,1 // end program
100:
ldp x20,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
/******************************************************************/
/* input text windows events */
/******************************************************************/
/* x0 contains the events */
/* x1 contains the ident Window */
evtButton: // INFO: evtButton
stp x20,lr,[sp,-16]! // save registers
ldr x10,[x0,#XAny_type]
cmp x10,ButtonPress
bne 1f
bl evtButtonMouse
b 100f
1:
cmp x10,#EnterNotify // mouse is on the button
bne 2f
ldr x3,qAdrstWindowChge // and change window border
mov x2,3
str x2,[x3,#XWCH_border_width]
mov x0,x28 // display
ldr x2,qFenSMask
bl XConfigureWindow
b 100f
2:
cmp x10,#LeaveNotify // mouse is off the button
bne 3f
ldr x3,qAdrstWindowChge // and change window border
mov x2,1
str x2,[x3,#XWCH_border_width]
mov x0,x28 // display
ldr x2,qFenSMask
bl XConfigureWindow
b 100f
3: // other event
100:
ldp x20,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
/******************************************************************/
/* input text windows events */
/******************************************************************/
/* x0 contains the events */
/* x1 contains the ident Window */
evtInputWindowText: // INFO: evtInputWindowText
stp x20,lr,[sp,-16]! // save registers
ldr x10,[x0,#XAny_type]
mov x20,x1
cmp x10,#KeyPressed // key character ?
bne 2f
// x0 events x1 window ident
ldr x2,qAdrstInputText
bl traitImput
b 100f
2:
cmp x10,#EnterNotify // mouse is on the window
bne 3f
ldr x0,qAdrstInputText // display text and cursor
bl displayInput
mov x1,x20
ldr x3,qAdrstWindowChge // and change window border
mov x2,3
str x2,[x3,#XWCH_border_width]
mov x0,x28 // display
ldr x2,qFenSMask
bl XConfigureWindow
b 100f
3:
cmp x10,#LeaveNotify // the mouse is out the window
bne 4f
ldr x0,qAdrszCursor // erase the cursor
ldr x2,qAdrstInputText
ldr x2,[x2,Input_cursor]
mov x10,FONTSIZE
mul x2,x2,x10
mov x3,YPOSTEXTINPUT
bl eraseText1
mov x1,x20
ldr x3,qAdrstWindowChge // and chane window border
mov x2,1
str x2,[x3,#XWCH_border_width]
mov x0,x28 // display
ldr x2,qFenSMask
bl XConfigureWindow
b 100f
4: // other event
100:
ldp x20,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
qFenSMask: .quad CWBorderWidth
qAdrstWindowChge: .quad stWindowChge
/******************************************************************/
/* input text windows events */
/******************************************************************/
/* x0 contains the events */
/* x1 contains the ident Window */
evtInputWindowValue: // INFO: evtInputWindowValue
stp x20,lr,[sp,-16]! // save registers
ldr x10,[x0,#XAny_type]
mov x20,x1
cmp x10,#KeyPressed // cas d'une touche
bne 2f
// x0 events x1 window ident
ldr x2,qAdrstInputValue
bl traitImput
b 100f
2:
cmp x10,#EnterNotify // mouse is on the window
bne 3f
ldr x0,qAdrstInputValue // display text and cursor
bl displayInput
mov x1,x20
ldr x3,qAdrstWindowChge // and change window border
mov x2,3
str x2,[x3,#XWCH_border_width]
mov x0,x28 // display
ldr x2,qFenSMask
bl XConfigureWindow
b 100f
3:
cmp x10,#LeaveNotify // the mouse is out the window
bne 4f
ldr x0,qAdrszCursor // erase the cursor
ldr x2,qAdrstInputValue
ldr x2,[x2,Input_cursor]
mov x10,FONTSIZE
mul x2,x2,x10
mov x3,YPOSTEXTINPUT
bl eraseText1
mov x1,x20
ldr x3,qAdrstWindowChge // and chane window border
mov x2,1
str x2,[x3,#XWCH_border_width]
mov x0,x28 // display
ldr x2,qFenSMask
bl XConfigureWindow
b 100f
4: // other event
100:
ldp x20,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
 
/******************************************************************/
/* traitement Key pressed */
/******************************************************************/
/* x0 contains the event */
/* x1 contains the ident Window */
/* x2 contains address structure window*/
traitImput: // INFO: traitImput
stp x20,lr,[sp,-16]! // save registers
mov x20,x2 // save structure address
mov x21,x1 // save ident window
ldr x1,qAdrsSaisieCar // character input buffer
mov x2,#4 // buffer lenght
ldr x3,qAdrkey // code character
mov x4,0 // Specifies or returns the XComposeStatus structure or NULL.
bl XLookupString
cmp x0,#1 // character key ?
bne 1f
ldr x0,qAdrsSaisieCar // input character area
ldrb w22,[x0] // load byte
cmp x22,#13 // enter ?
beq 1f
ldr x0,[x20,Input_text] // erase input area
mov x1,x21
mov x2,0
mov x3,YPOSTEXTINPUT
bl eraseText1
ldr x0,qAdrszCursor
ldr x2,[x20,Input_cursor] // erase cursor
mov x1,x21
mov x10,FONTSIZE // Font size
mul x2,x2,x10
mov x3,YPOSTEXTINPUT
bl eraseText1
ldr x13,[x20,Input_text]
cmp x22,#8 // back
beq back
// voir autre touche
ldr x4,[x20,Input_cursor] //
strb w22,[x13,x4] // store input character at text end
add x4,x4,1
str x4,[x20,Input_cursor] // maj cursor location
b suiteaff
back:
ldr x4,[x20,Input_cursor] // text size
sub x4,x4,#1
str x4,[x20,Input_cursor] // maj cursor location
suiteaff:
strb wzr,[x13,x4] // zero -> text end
mov x0,x20
bl displayInput
b 100f
1: // other key
mov x0,x28
mov x1,#50
bl XBell // sound on
 
100:
ldp x20,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
qAdrsSaisieCar: .quad sSaisieCar
qAdrkey: .quad key
qAdrsTexteSaisi: .quad sTexteSaisi
/******************************************************************/
/* create Graphic Context */
/******************************************************************/
/* x0 contains the Display address */
/* x1 contains the ident Window */
createGC: // INFO: 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
/******************************************************************/
/* create Graphic Context 1 */
/******************************************************************/
/* x0 contains the Display address */
/* x1 contains the ident Window */
createGC1: // INFO: createGC1
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 x25,x0 // save GC
mov x0,x20 // display address
mov x1,x25
ldr x2,qBlanc // code RGB color
bl XSetForeground
cbz x0,99f
mov x0,x25 // return GC1
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
/******************************************************************/
/* create button on screen */
/******************************************************************/
createButton: // INFO: createButton
stp x21,lr,[sp,-16]! // save registers
// create button window
mov x0,x28 // display address
mov x1,x27 // ident window
mov x2,500 // X position
mov x3,50 // Y position
mov x4,60 // weight
mov x5,30 // height
mov x6,1 // border
ldr x7,qBlack
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 99f
ldr x21,qAdrstButton
str x0,[x21,BT_adresse] // save ident button
str xzr,[x21,BT_cbdata] // for next use
 
// autorisation des saisies
mov x0,x28 // display address
ldr x1,[x21,BT_adresse] // button address
ldr x2,qButtonMask // mask
bl XSelectInput
// create Graphic Contexte of button
mov x0,x28 // display address
ldr x1,[x21,BT_adresse] // button ident
mov x2,#0
mov x3,#0
bl XCreateGC
cmp x0,#0
beq 98f
str x0,[x21,BT_GC] // store GC
// display button
mov x0,x28 // display address
ldr x1,[x21,BT_adresse] // button address
bl XMapWindow
ldr x0,qAdrszTextButton // text address
ldr x1,[x21,BT_adresse] // ident button
mov x2,#18 // position x
mov x3,#18 // position y
bl displayText
b 100f
98:
ldr x0,qAdrszMessErrButtonGC
bl affichageMess
b 100f
99:
ldr x0,qAdrszMessErrButton
bl affichageMess
100:
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
qAdrstButton: .quad stButton
qAdrszTextButton: .quad szTextButton
qAdrszMessErrButtonGC: .quad szMessErrButtonGC
qAdrszMessErrButton: .quad szMessErrButton
qButtonMask: .quad ButtonPressMask|ButtonReleaseMask|StructureNotifyMask|ExposureMask|LeaveWindowMask|EnterWindowMask
/******************************************************************/
/* create window input text */
/******************************************************************/
createInputText: // INFO: createInputText
stp x21,lr,[sp,-16]! // save registers
// create button window
mov x0,x28 // display address
mov x1,x27 // ident window
mov x2,50 // X position
mov x3,50 // Y position
mov x4,200 // weight
mov x5,30 // height
mov x6,1 // border
ldr x7,qBlack
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 99f
ldr x21,qAdrstInputText
str x0,[x21,Input_adresse] // save ident button
 
// autorisation des saisies
mov x0,x28 // display address
ldr x1,[x21,Input_adresse] // button address
ldr x2,qInputMask // mask
bl XSelectInput
// create Graphic Contexte of button
mov x0,x28 // display address
ldr x1,[x21,Input_adresse] // button ident
mov x2,#0
mov x3,#0
bl XCreateGC
cmp x0,#0
beq 98f
str x0,[x21,Input_GC] // store GC
// display button
mov x0,x28 // display address
ldr x1,[x21,Input_adresse] // button address
bl XMapWindow
 
ldr x6,qAdrsTexteSaisi
 
str x6,[x21,Input_text]
str xzr,[x21,Input_cursor]
 
b 100f
98:
ldr x0,qAdrszMessErrInputGC
bl affichageMess
b 100f
99:
ldr x0,qAdrszMessErrInput
bl affichageMess
100:
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
qAdrstInputText: .quad stInputText
qAdrszMessErrInputGC: .quad szMessErrInputGC
qAdrszMessErrInput: .quad szMessErrInput
qInputMask: .quad KeyPressMask|StructureNotifyMask|ExposureMask|LeaveWindowMask|EnterWindowMask
/******************************************************************/
/* create window input text */
/******************************************************************/
createInputValue: // INFO: createInputValue
stp x21,lr,[sp,-16]! // save registers
// create window
mov x0,x28 // display address
mov x1,x27 // ident main window
mov x2,340 // X position
mov x3,50 // Y position
mov x4,50 // weight
mov x5,30 // height
mov x6,1 // border
ldr x7,qBlack
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 99f
ldr x21,qAdrstInputValue
str x0,[x21,Input_adresse] // save ident button
 
// autorisation des saisies
mov x0,x28 // display address
ldr x1,[x21,Input_adresse] // button address
ldr x2,qInputMask // mask
bl XSelectInput
// create Graphic Contexte of button
mov x0,x28 // display address
ldr x1,[x21,Input_adresse] // button ident
mov x2,#0
mov x3,#0
bl XCreateGC
cmp x0,#0
beq 98f
str x0,[x21,Input_GC] // store GC
// display button
mov x0,x28 // display address
ldr x1,[x21,Input_adresse] // button address
bl XMapWindow
 
ldr x6,qAdrsValueSaisi
 
str x6,[x21,Input_text]
str xzr,[x21,Input_cursor]
 
b 100f
98:
ldr x0,qAdrszMessErrInputGC
bl affichageMess
b 100f
99:
ldr x0,qAdrszMessErrInput
bl affichageMess
100:
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
qAdrstInputValue: .quad stInputValue
qAdrsValueSaisi: .quad sValueSaisi
/******************************************************************/
/* display text on screen */
/******************************************************************/
/* x0 contains the address of text */
/* x1 contains ident window */
/* x2 position X */
/* x3 position Y */
displayText: // INFO: 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 x4,x3 // position y
mov x3,x2 // position x
mov x2,x26 // GC address
bl XDrawString
100:
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
/******************************************************************/
/* erase text on screen */
/******************************************************************/
/* x0 contains the address of text */
/* x1 window ident */
/* x2 position x */
/* x3 position y */
eraseText1: // INFO: eraseText1
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 x4,x3
mov x3,x2
mov x2,x25 // GC1 address
bl XDrawString
100:
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
/******************************************************************/
/* events clic mouse button */
/******************************************************************/
/* x0 contains the address of event */
evtButtonMouse: // INFO: evtButtonMouse
stp x20,lr,[sp,-16]! // save registers
ldr x10,[x0,XBE_window] // windows of event
ldr x11,qAdrstButton // load button ident
ldr x12,[x11,BT_adresse]
cmp x10,x12 // equal ?
bne 100f // no
ldr x20,qAdrptMessage // first entry
ldr x0,[x20]
cbz x0,1f
mov x1,x27
mov x2,50
mov x3,200
bl eraseText1 // yes erase the text
1:
ldr x1,qAdrstInputText // input text
ldr x1,[x1,Input_text]
ldrb w2,[x1]
cbz w2,100f // no input text
ldr x0,qAdrszMessResult
bl strInsertAtCharInc // insert text at @ character
mov x5,x0
ldr x1,qAdrstInputValue // input text
ldr x0,[x1,Input_text]
bl conversionAtoD // conversion value to decimal
// x0 contains the input value
 
ldr x1,qAdrsZoneConv // and decimal conversion
bl conversion10
mov x0,x5
ldr x1,qAdrsZoneConv
bl strInsertAtCharInc // and insert result at @ character
str x0,[x20] // save message address
mov x1,x27
mov x2,50
mov x3,200
bl displayText // and display new text
 
100:
ldp x20,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
qAdrqCounterClic: .quad qCounterClic
qAdrsZoneConv: .quad sZoneConv
qAdrszMessResult: .quad szMessResult
qAdrptMessage: .quad ptMessage
 
/******************************************************************/
/* display input area */
/******************************************************************/
/* x0 contains area structure */
displayInput: // INFO: displayInput
stp x1,lr,[sp,-16]! // save registers
mov x10,x0 // save structure
ldr x0,[x10,Input_text] // text
ldr x6,[x10,Input_cursor] // position curseur
cbz x6,1f // if zero no text
mov x0,x28 // display address
ldr x1,[x10,Input_adresse] // ident window
ldr x2,[x10,Input_GC] // GC address
mov x3,0 // position x
mov x4,YPOSTEXTINPUT // position y
ldr x5,[x10,Input_text] // text
bl XDrawString
1: // display cursor
mov x0,x28 // Display address
ldr x1,[x10,Input_adresse] // ident window
ldr x2,[x10,Input_GC] // GC address
ldr x3,[x10,Input_cursor] // position x
mov x10,FONTSIZE
mul x3,x3,x10
mov x4,YPOSTEXTINPUT // position y
ldr x5,qAdrszCursor // cursor text
mov x6,1 // length
bl XDrawString
100:
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
qAdrszCursor: .quad szCursor
/********************************************************/
/* File Include fonctions */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
/*******************************************/
/* Structures */
/********************************************/
/*************************************************/
/* INFO: Structures */
/*********************************************/
/* Display définition */
.struct 0
Disp_ext_data: /* hook for extension to hang data */
.struct Disp_ext_data + 8
Disp_private1:
.struct Disp_private1 + 8
Disp_fd: /* Network socket. */
.struct Disp_fd + 4
Disp_private2:
.struct Disp_private2 + 4
Disp_proto_major_version: /* major version of server's X protocol */
.struct Disp_proto_major_version + 4
Disp_proto_minor_version: /* minor version of servers X protocol */
.struct Disp_proto_minor_version + 4
Disp_vendor: /* vendor of the server hardware OK*/
.struct Disp_vendor + 8
Disp_private3:
.struct Disp_private3 + 8
Disp_private8:
.struct Disp_private8 + 8
Disp_private5:
.struct Disp_private5 + 8
Disp_private6:
.struct Disp_private6 + 8
Disp_resource_alloc:
.struct Disp_resource_alloc + 8
Disp_byte_order: /* screen byte order, LSBFirst, MSBFirst */
.struct Disp_byte_order+ 4
Disp_bitmap_unit: /* padding and data requirements */
.struct Disp_bitmap_unit + 4
Disp_bitmap_pad: /* padding requirements on bitmaps */
.struct Disp_bitmap_pad + 4
Disp_bitmap_bit_order: /* LeastSignificant or MostSignificant */
.struct Disp_bitmap_bit_order + 4
Disp_nformats: /* number of pixmap formats in list */
.struct Disp_nformats + 8
Disp_pixmap_format: /* pixmap format list */
.struct Disp_pixmap_format + 8
Disp_private28:
.struct Disp_private28 + 4
Disp_release: /* release of the server */
.struct Disp_release + 4
Disp_private9:
.struct Disp_private9 + 8
Disp_private10:
.struct Disp_private10 + 8
Disp_qlen: /* Length of input event queue */
.struct Disp_qlen + 8 /* correction dec19 */
Disp_last_request_read: /* seq number of last event read */
.struct Disp_last_request_read + 8
Disp_request: /* sequence number of last request. */
.struct Disp_request + 8
Disp_private11:
.struct Disp_private11 + 8
Disp_private12:
.struct Disp_private12 + 8
Disp_private13:
.struct Disp_private13 + 8
Disp_private14:
.struct Disp_private14 + 8 /* correction Vim */
Disp_max_request_size: /* maximum number 32 bit words in request*/
.struct Disp_max_request_size + 8
Disp_db:
.struct Disp_db + 8 /* correction Vim */
Disp_private15:
.struct Disp_private15 + 8 /* correction Vim */
Disp_display_name: /* "host:display" string used on this connect*/
.struct Disp_display_name + 8
Disp_default_screen: /* default screen for operations */
.struct Disp_default_screen + 4
Disp_nscreens: /* number of screens on this server*/
.struct Disp_nscreens + 4
Disp_screens: /* pointer to list of screens */
.struct Disp_screens + 8
Disp_motion_buffer: /* size of motion buffer */
.struct Disp_motion_buffer + 8
Disp_private16:
.struct Disp_private16 + 8
Disp_min_keycode: /* minimum defined keycode */
.struct Disp_min_keycode + 4
Disp_max_keycode: /* maximum defined keycode */
.struct Disp_max_keycode + 4
Disp_private17:
.struct Disp_private17 + 8
Disp_private18:
.struct Disp_private18 + 8
Disp_private19:
.struct Disp_private19 + 8
Disp_xdefaults: /* contents of defaults from server */
.struct Disp_xdefaults + 8
Disp_fin:
/*****************************************/
/* Screen définition */
.struct 0
Screen_ext_data: /* hook for extension to hang data */
.struct Screen_ext_data + 8
Screen_Xdisplay: /* back pointer to display structure */
.struct Screen_Xdisplay + 8
Screen_root: /* Root window id. */
.struct Screen_root + 8
Screen_width:
.struct Screen_width + 4
Screen_height:
.struct Screen_height + 4
Screen_mwidth: /* width and height of in millimeters */
.struct Screen_mwidth + 4
Screen_mheight:
.struct Screen_mheight + 4
Screen_ndepths: /* number of depths possible */
.struct Screen_ndepths + 8
Screen_depths: /* list of allowable depths on the screen */
.struct Screen_depths + 8
Screen_root_depth: /* bits per pixel */
.struct Screen_root_depth + 8
Screen_root_visual: /* root visual */
.struct Screen_root_visual + 8
Screen_default_gc: /* GC for the root root visual */
.struct Screen_default_gc + 8
Screen_cmap: /* default color map */
.struct Screen_cmap + 8
Screen_white_pixel:
.struct Screen_white_pixel + 8
Screen_black_pixel:
.struct Screen_black_pixel + 8
Screen_max_maps: /* max and min color maps */
.struct Screen_max_maps + 4
Screen_min_maps:
.struct Screen_min_maps + 4
Screen_backing_store: /* Never, WhenMapped, Always */
.struct Screen_backing_store + 8
Screen_save_unders:
.struct Screen_save_unders + 8
Screen_root_input_mask: /* initial root input mask */
.struct Screen_root_input_mask + 8
Screen_fin:
/**********************************************/
/* Button structure */
.struct 0
BT_cbdata:
.struct BT_cbdata + 8
BT_adresse:
.struct BT_adresse + 8
BT_GC:
.struct BT_GC + 8
BT_Font:
.struct BT_Font + 8
BT_fin:
/****************************************/
/* Input text structure */
.struct 0
 
Input_adresse:
.struct Input_adresse + 8
Input_GC:
.struct Input_GC + 8
Input_text:
.struct Input_text + 8
Input_cursor:
.struct Input_cursor + 8
Input_Font:
.struct Input_Font + 8
Input_fin:
/***************************************************/
/* structure XButtonEvent */
.struct 0
XBE_type: //event type
.struct XBE_type + 8
XBE_serial: // No last request processed server */
.struct XBE_serial + 8
XBE_send_event: // true if this came from a SendEvent request */
.struct XBE_send_event + 8
XBE_display: // Display the event was read from
.struct XBE_display + 8
XBE_window: // "event" window it is reported relative to
.struct XBE_window + 8
XBE_root: // root window that the event occurred on
.struct XBE_root + 8
XBE_subwindow: // child window
.struct XBE_subwindow + 8
XBE_time: // milliseconds
.struct XBE_time + 8
XBE_x: // pointer x, y coordinates in event window
.struct XBE_x + 8
XBE_y:
.struct XBE_y + 8
XBE_x_root: // coordinates relative to root
.struct XBE_x_root + 8
XBE_y_root:
.struct XBE_y_root + 8
XBE_state: // key or button mask
.struct XBE_state + 8
XBE_button: // detail
.struct XBE_button + 8
XBE_same_screen: // same screen flag
.struct XBE_same_screen + 8
XBE_fin:
/***************************************************/
/* structure XAnyEvent */
.struct 0
XAny_type:
.struct XAny_type + 8
XAny_serial:
.struct XAny_serial + 8 /* # of last request processed by server */
XAny_send_event:
.struct XAny_send_event + 8 /* true if this came from a SendEvent request */
XAny_display:
.struct XAny_display + 8 /* Display the event was read from */
XAny_window:
.struct XAny_window + 8 /* window on which event was requested in event mask */
Xany_fin:
/****************************************/
/* structure de type XWindowChanges */
.struct 0
XWCH_x:
.struct XWCH_x + 4
XWCH_y:
.struct XWCH_y + 4
XWCH_width:
.struct XWCH_width + 4
XWCH_height:
.struct XWCH_height + 4
XWCH_border_width:
.struct XWCH_border_width + 4
XWCH_sibling:
.struct XWCH_sibling + 4
XWCH_stack_mode:
.struct XWCH_stack_mode + 4
XWCH_fin:
</lang>
 
=={{header|Ada}}==