

In this task, the goal is to input a string and the integer 75000, from graphical user interface.



See also: User input/Text

 
/* 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:
 