1102 lines
39 KiB
Plaintext
1102 lines
39 KiB
Plaintext
/* 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:
|