Advertisement
Guest User

Untitled

a guest
Dec 26th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 19.93 KB | None | 0 0
  1.  .global main
  2.  
  3.  
  4.  
  5. .text
  6.  
  7.  
  8. main:
  9.   push {lr}
  10.  
  11.   mov r11, r0
  12.   mov r12, r1
  13.   bl init_mem
  14.   tst r0, r0
  15.   bne exit
  16.   bl init_time
  17.   tst r0, r0
  18.   bne exit
  19.   mov r0, r11
  20.   mov r1, r12
  21.   bl init_uart
  22.   tst r0, r0
  23.   bne exit
  24.   bl canon
  25.   bl model_init
  26.   bl init_controller
  27.   bl main_loop
  28.   bl cleanup
  29.   bl nocanon
  30.   b exit
  31.  
  32. exit:
  33.   pop {pc}
  34.  
  35.  
  36. buff_print:
  37.   push {r1-r7, lr}
  38.  
  39.   mov r6, #2
  40.   mov r4, r1
  41.   mov r3, #2
  42.   mov r2, #0
  43.   mov r1, #10
  44.  
  45.   1:
  46.     udiv r7, r0, r1
  47.     mls r3, r7, r1, r0
  48.     cmp r3, #10
  49.     addge r3, r3, #87
  50.     addlt r3, r3, #48
  51.     strb r3, [sp, #-1]!
  52.     add r2, r2, #1
  53.     movs r0, r7
  54.   bne 1b
  55.  
  56.   mov r7, r6
  57.   sub r6, r6, r2
  58.   cmp r2, r7
  59.   movlt r5, r7
  60.   movge r5, r2
  61.   mov r7, #48
  62.  
  63.   2:
  64.     tst r6, r6
  65.     ble 3f
  66.     strb r7, [r4], #1
  67.     sub r6, r6, #1
  68.   b 2b
  69.  
  70.   3:
  71.     tst r2, r2
  72.     beq 4f
  73.     ldrb r3, [sp], #1
  74.     strb r3, [r4], #1
  75.     sub r2, r2, #1
  76.   b 3b
  77.  
  78.   4:
  79.   mov r0, r5
  80.  
  81.   pop {r1-r7, pc}
  82.  
  83.  
  84. zero_print:
  85.   push {r0-r2, r7, lr}
  86.   mov r1, r0
  87.   bl string_length
  88.   mov r2, r0
  89.   mov r0, #1
  90.   mov r7, #4
  91.   svc #0
  92.   pop {r0-r2, r7, pc}
  93.  
  94.  
  95. string_length:
  96.   push {r1-r2, lr}
  97.   mov r1, r0
  98.  
  99.   1:
  100.     ldrb r2, [r0]
  101.     tst r2, r2
  102.     addne r0, #1
  103.   bne 1b
  104.  
  105.   sub r0, r0, r1
  106.   pop {r1-r2, pc}
  107.  
  108.  
  109. copy_string:
  110.   push {r2-r3, lr}
  111.  
  112.   mov r2, #0
  113.  
  114.   1:
  115.     ldrb r3, [r0, r2]
  116.     strb r3, [r1, r2]
  117.     tst r3, r3
  118.     beq 2f
  119.     add r2, r2, #1
  120.   b 1b
  121.  
  122.   2:
  123.   mov r0, r2
  124.  
  125.   pop {r2-r3, pc}
  126.  
  127.  
  128. skip_lines:
  129.   push {r1-r5, lr}
  130.  
  131.   tst r2, r2
  132.   ble 4f
  133.   cmp r0, r1
  134.   bge 4f
  135.  
  136.   1:
  137.   mov r5, r3
  138.  
  139.   2:
  140.     ldrb r4, [r1], #-1
  141.     cmp r4, #10
  142.     beq 3f
  143.     subs r5, r5, #1
  144.     beq 3f
  145.     cmp r0, r1
  146.     bge 4f
  147.   b 2b
  148.  
  149.   3:
  150.     subs r2, #1
  151.     bne 1b
  152.     add r1, r1, #2
  153.  
  154.   4:
  155.   mov r0, r1
  156.  
  157.   pop {r1-r5, pc}
  158.  
  159.  
  160. compare_prefix:
  161.   push {r1-r3, lr}
  162.  
  163.   1:
  164.     ldrb r2, [r0], #1
  165.     tst r2, r2
  166.     beq 2f
  167.     ldrb r3, [r1], #1
  168.     cmp r2, r3
  169.     bne 3f
  170.   b 1b
  171.  
  172.   2:
  173.   mov r0, #0
  174.   b 4f
  175.  
  176.   3:
  177.   mov r0, #1
  178.  
  179.   4:
  180.   pop {r1-r3, pc}
  181.  
  182.  
  183. canon:
  184.   push {r0-r3, lr}
  185.  
  186.   mov r0, #1
  187.   ldr r1, =termios_old
  188.   bl tcgetattr
  189.   mov r0, #60
  190.   ldr r1, =termios_old
  191.   ldr r2, =termios_new
  192.  
  193.   1:
  194.     subs r0, #4
  195.     ldr r3, [r1, r0]
  196.     ldr r3, [r2, r0]
  197.   bne 1b
  198.  
  199.   ldr r0, [r2, #12]
  200.   mov r1, #-11
  201.   and r0, r0, r1
  202.   str r0, [r2, #12]
  203.   mov r0, #1
  204.   mov r1, #0
  205.   ldr r2, =termios_new
  206.   bl tcsetattr
  207.  
  208.   pop {r0-r3, pc}
  209.  
  210.  
  211. nocanon:
  212.   push {r0-r2, lr}
  213.  
  214.   mov r0, #1
  215.   mov r1, #0
  216.   ldr r2, =termios_old
  217.   bl tcsetattr
  218.  
  219.   pop {r0-r2, pc}
  220.  
  221.  
  222. kbdhit:
  223.   push {r1-r12,lr}
  224.  
  225.   mov r0, #1
  226.   ldr r1, =21531
  227.   ldr r2, =kbdhit_n
  228.   bl ioctl
  229.   ldr r0, [r2]
  230.  
  231.   pop {r1-r12,pc}
  232.  
  233.  
  234. reset_terminal:
  235.   push {r0, lr}
  236.  
  237.   ldr r0, =reset_sequence
  238.   bl zero_print
  239.  
  240.   pop {r0, pc}
  241.  
  242.  
  243. clear_screen:
  244.   push {r0-r1, lr}
  245.  
  246.   ldr r0, =clear_sequence
  247.   mov r1, #2
  248.   bl escape
  249.  
  250.   pop {r0-r1, pc}
  251.  
  252.  
  253. set_cursor_position:
  254.   push {r0-r3, lr}
  255.  
  256.   mov r2, r0
  257.   mov r3, r1
  258.   ldr r0, =vertical_offset_sequence
  259.   mov r1, r2
  260.   add r1, r1, #1
  261.   bl escape
  262.   ldr r0, =horizontal_offset_sequence
  263.   mov r1, r3
  264.   add r1, r1, #1
  265.   bl escape
  266.  
  267.   pop {r0-r3, pc}
  268.  
  269.  
  270. escape:
  271.   push {r0-r2, r7, lr}
  272.  
  273.   mov r2, r0
  274.   mov r7, r1
  275.   ldr r0, =sequence
  276.   ldr r1, =print_buf
  277.   bl copy_string
  278.   add r1, r1, r0
  279.   mov r0, r7
  280.   bl buff_print
  281.   add r1, r1, r0
  282.   mov r0, r2
  283.   bl copy_string
  284.   add r1, r1, r0
  285.   ldr r0, =print_buf
  286.   sub r2, r1, r0
  287.   mov r1, r0
  288.   mov r0, #1
  289.   mov r7, #4
  290.   svc #0
  291.  
  292.   pop {r0-r2, r7, pc}
  293.  
  294.  
  295. init_mem:
  296.   push {r1-r7, lr}
  297.  
  298.   ldr r0, =dev_mem
  299.   ldr r1, =4098
  300.   mov r7, #5
  301.   svc #0
  302.   tst r0, r0
  303.   blt 2f
  304.   ldr r1, =dev_mem_handle
  305.   str r0, [r1]
  306.   mov r0, #0
  307.   b 3f
  308.  
  309.   2:
  310.   ldr r0, =sudo_err
  311.   bl zero_print
  312.   mvn r0, #1
  313.  
  314.   3:
  315.   pop {r1-r7,pc}
  316.  
  317.  
  318. cleanup_mem:
  319.   push {r0, r7, lr}
  320.  
  321.   ldr r0, =dev_mem_handle
  322.   ldr r0, [r0]
  323.   mov r7, #6
  324.   svc #0
  325.  
  326.   pop {r0, r7, pc}
  327.  
  328.  
  329. mmap_mem:
  330.   push {r1-r7, lr}
  331.  
  332.   mov r5, r0
  333.   mov r0, #0
  334.   mov r1, #4096
  335.   mov r2, #3
  336.   mov r3, #1
  337.   ldr r4, =dev_mem_handle
  338.   ldr r4, [r4]
  339.   mov r7, #192
  340.   svc #0
  341.  
  342.   pop {r1-r7, pc}
  343.  
  344.  
  345. init_time:
  346.   push {r1, lr}
  347.  
  348.   ldr r0, =7936
  349.   bl mmap_mem
  350.   ldr r1, =rtc_mem_base
  351.   str r0, [r1]
  352.   mov r0, #0
  353.  
  354.   pop {r1, pc}
  355.  
  356.  
  357. get_current_time:
  358.   push {lr}
  359.  
  360.   ldr r0, =rtc_mem_base
  361.   ldr r0, [r0]
  362.   ldr r0, [r0, #20]
  363.  
  364.   pop {pc}
  365.  
  366.  
  367. init_uart:
  368.   push {r1, lr}
  369.  
  370.   bl parse_arguments
  371.   tst r0, r0
  372.   bne 1f
  373.   ldr r0, =7200
  374.   bl mmap_mem
  375.   ldr r1, =ccu_mem
  376.   str r0, [r1]
  377.   ldr r0, =7208
  378.   bl mmap_mem
  379.   ldr r1, =uart_mem
  380.   str r0, [r1]
  381.   bl setup_uart
  382.   mov r0, #0
  383.   b 2f
  384.  
  385.   1:
  386.   ldr r0, =usage_message
  387.   bl zero_print
  388.   mvn r0, #1
  389.  
  390.   2:
  391.   pop {r1, pc}
  392.  
  393.  
  394. parse_arguments:
  395.   push {lr}
  396.  
  397.   cmp r0, #2
  398.   bne 1f
  399.   ldr r0, [r1, #4]
  400.   ldrb r0, [r0]
  401.   sub r0, r0, #48
  402.   cmp r0, #1
  403.   beq 2f
  404.   cmp r0, #2
  405.   beq 2f
  406.  
  407.   1:
  408.   mvn r0, #1
  409.   b 3f
  410.  
  411.   2:
  412.   ldr r1, =uart_no
  413.   str r0, [r1]
  414.   mov r0, #0
  415.  
  416.   3:
  417.   pop {pc}
  418.  
  419.  
  420. setup_uart:
  421.   push {r0-r4, lr}
  422.  
  423.   ldr r1, =uart_no
  424.   ldr r1, [r1]
  425.   cmp r1, #1
  426.   ldreq r1, =17
  427.   ldreq r4, =1024
  428.   ldrne r1, =18
  429.   ldrne r4, =2048
  430.   mov r0, #1
  431.   lsl r0, r0, r1
  432.   ldr r1, =ccu_mem
  433.   ldr r1, [r1]
  434.   ldr r2, [r1, #108]
  435.   orr r2, r2, r0
  436.   str r2, [r1, #108]
  437.   ldr r2, [r1, #728]
  438.   orr r2, r2, r0
  439.   str r2, [r1, #728]
  440.   ldr r1, =uart_mem
  441.   ldr r1, [r1]
  442.   add r1, r1, r4
  443.   mov r0, #155
  444.   ldrb r2, [r1, #12]
  445.   orr r2, r2, r0
  446.   strb r2, [r1, #12]
  447.   mov r0, #13
  448.   strb r0, [r1, #0]
  449.   mov r0, #0
  450.   strb r0, [r1, #4]
  451.   ldr r0, [r1, #8]
  452.   orr r0, r0, #1
  453.   str r0, [r1, #8]
  454.   mov r0, #127
  455.   ldrb r2, [r1, #12]
  456.   and r2, r2, r0
  457.   strb r2, [r1, #12]
  458.  
  459.   pop {r0-r4, pc}
  460.  
  461.  
  462. poll_uart:
  463.   push {lr}
  464.  
  465.   bl get_uart_offset
  466.   ldrb r0, [r0, #20]
  467.   and r0, r0, #1
  468.  
  469.   pop {pc}
  470.  
  471.  
  472. recv_uart:
  473.   push {lr}
  474.  
  475.   bl get_uart_offset
  476.   ldrb r0, [r0, #0]
  477.  
  478.   pop {pc}
  479.  
  480.  
  481. send_uart:
  482.   push {r1-r2, lr}
  483.  
  484.   mov r1, r0
  485.   bl get_uart_offset
  486.  
  487.   1:
  488.     ldrb r2, [r0, #20]
  489.     ands r2, r2, #32
  490.   beq 1b
  491.  
  492.   strb r1, [r0, #0]
  493.  
  494.   pop {r1-r2, pc}
  495.  
  496.  
  497. get_uart_offset:
  498.   push {r1, lr}
  499.  
  500.   ldr r0, =uart_no
  501.   ldr r0, [r0]
  502.   cmp r0, #1
  503.   ldreq r0, =1024
  504.   ldrne r0, =2048
  505.   ldr r1, =uart_mem
  506.   ldr r1, [r1]
  507.   add r0, r0, r1
  508.  
  509.   pop {r1, pc}
  510.  
  511.  
  512. model_init:
  513.   push {lr}
  514.  
  515.   ldr r0, =input
  516.   ldrh r0, [r0]
  517.   ldr r1, =input_buf
  518.   strh r0, [r1]
  519.   ldr r0, =message_buf
  520.   ldr r1, =message_end
  521.   str r0, [r1]
  522.   ldr r0, =history_buf
  523.   ldr r1, =history_end
  524.   str r0, [r1]
  525.   mov r0, #0
  526.   ldr r1, =message_scroll
  527.   str r0, [r1]
  528.   ldr r1, =history_scroll
  529.   str r0, [r1]
  530.   ldr r0, =no_nick
  531.   ldr r1, =self_nick
  532.   bl copy_string
  533.   ldr r0, =no_nick
  534.   ldr r1, =other_nick
  535.   bl copy_string
  536.   mov r0, #0
  537.   ldr r1, =online_flag
  538.   str r0, [r1]
  539.   ldr r0, =first_message
  540.   bl add_log_to_history
  541.  
  542.   pop {pc}
  543.  
  544.  
  545. init_controller:
  546.   push {r0-r1, lr}
  547.  
  548.   ldr r0, =in_net_buf
  549.   ldr r1, =in_net_buf_end
  550.   str r0, [r1]
  551.  
  552.   pop {r0-r1, pc}
  553.  
  554.  
  555. handle_ui_input:
  556.   push {r0-r2, lr}
  557.  
  558.   cmp r0, #1
  559.   bne 1f
  560.   ldrb r0, [r1]
  561.   cmp r0, #127
  562.   beq 2f
  563.   cmp r0, #13
  564.   beq 5f
  565.   cmp r0, #10
  566.   beq 5f
  567.   cmp r0, #32
  568.   blt 7f
  569.   cmp r0, #126
  570.   bgt 7f
  571.   ldr r1, =message_end
  572.   ldr r2, [r1]
  573.   strb r0, [r2], #1
  574.   str r2, [r1]
  575.   b 7f
  576.  
  577.   1:
  578.   cmp r0, #3
  579.   bne 7f
  580.   ldrb r0, [r1]
  581.   cmp r0, #27
  582.   bne 7f
  583.   ldrb r0, [r1, #1]
  584.   cmp r0, #91
  585.   bne 7f
  586.   ldrb r0, [r1, #2]
  587.   cmp r0, #65
  588.   beq 3f
  589.   cmp r0, #66
  590.   beq 4f
  591.   b 7f
  592.  
  593.   2:
  594.   ldr r1, =message_end
  595.   ldr r0, [r1]
  596.   ldr r2, =message_buf
  597.   cmp r0, r2
  598.   beq 7f
  599.   sub r0, r0, #1
  600.   str r0, [r1]
  601.   ldrb r2, [r0, #-1]!
  602.   cmp r2, #13
  603.   streq r0, [r1]
  604.   b 7f
  605.  
  606.   3:
  607.   ldr r1, =history_scroll
  608.   cmp r1, #0
  609.   beq 7f
  610.   ldr r0, [r1]
  611.   add r0, #2
  612.   str r0, [r1]
  613.   b 7f
  614.  
  615.   4:
  616.   ldr r1, =history_scroll
  617.   ldr r0, [r1]
  618.   cmp r0, #0
  619.   beq 7f
  620.   sub r0, r0, #2
  621.   str r0, [r1]
  622.   b 7f
  623.  
  624.   5:
  625.   ldr r1, =message_end
  626.   ldr r1, [r1]
  627.   ldr r2, =message_buf
  628.   cmp r1, r2
  629.   beq 7f
  630.   mov r0, #0
  631.   str r0, [r1]
  632.   ldr r0, =message_buf
  633.   mov r1, #0
  634.   bl add_message_to_history
  635.   bl run_user_command
  636.   tst r0, r0
  637.   beq 6f
  638.   bl send_message
  639.   bl log_error
  640.  
  641.   6:
  642.   ldr r1, =message_end
  643.   ldr r0, =message_buf
  644.   str r0, [r1]
  645.  
  646.   7:
  647.   pop {r0-r2, pc}
  648.  
  649.  
  650. log_error:
  651.   push {r0-r1, lr}
  652.  
  653.   tst r0, r0
  654.   beq 1f
  655.  
  656.   ldr r0, =error_send
  657.   bl add_log_to_history
  658.  
  659.   1:
  660.   pop {r0-r1, pc}
  661.  
  662.  
  663. process_input:
  664.   push {r0-r2, lr}
  665.  
  666.   bl poll_uart
  667.   tst r0, r0
  668.   beq 3f
  669.   bl recv_uart
  670.   ldr r1, =in_net_buf
  671.   ldr r2, =in_net_buf_end
  672.   ldr r2, [r2]
  673.   cmp r2, r1
  674.   bne 1f
  675.   cmp r0, #47
  676.   bne 2f
  677.  
  678.   1:
  679.   strb r0, [r2], #1
  680.   ldr r0, =in_net_buf_end
  681.   str r2, [r0]
  682.  
  683.   2:
  684.   sub r0, r2, r1
  685.   cmp r0, #2
  686.   blt 3f
  687.   ldrb r0, [r2, #-2]
  688.   cmp r0, #10
  689.   bleq run_command
  690.  
  691.   3:
  692.   pop {r0-r2, pc}
  693.  
  694.  
  695. run_user_command:
  696.   push {r1, lr}
  697.  
  698.   ldr r0, =change_name
  699.   ldr r1, =message_buf
  700.   bl compare_prefix
  701.   tst r0, r0
  702.   beq 1f
  703.   mov r0, #1
  704.   b 2f
  705.  
  706.   1:
  707.   ldr r0, =name_command
  708.   bl string_length
  709.   ldr r1, =message_buf
  710.   add r0, r1, r0
  711.   bl set_nick
  712.   mov r0, #0
  713.   b 2f
  714.  
  715.   2:
  716.   pop {r1, pc}
  717.  
  718.  
  719. set_nick:
  720.   push {r0-r1, lr}
  721.  
  722.   ldr r1, =self_nick
  723.   bl copy_string
  724.   bl send_nick
  725.  
  726.   pop {r0-r1, pc}
  727.  
  728.  
  729. send_message:
  730.   push {r1-r2, lr}
  731.  
  732.   ldr r1, =out_net_buf
  733.   ldr r0, =message_command
  734.   bl copy_string
  735.   add r1, r1, r0
  736.   ldr r0, =message_buf
  737.   bl copy_string
  738.   add r1, r1, r0
  739.   mov r0, #10
  740.   str r0, [r1], #1
  741.   bl write_checksum
  742.   mov r2, #3
  743.  
  744.   1:
  745.     bl send_buffer
  746.     bl wait_ok
  747.     tst r0, r0
  748.     beq 2f
  749.     subs r2, r2, #1
  750.     beq 2f
  751.   b 1b
  752.  
  753.   2:
  754.   pop {r1-r2, pc}
  755.  
  756.  
  757. send_nick:
  758.   push {r0-r2, lr}
  759.  
  760.   ldr r1, =out_net_buf
  761.   ldr r0, =name_command
  762.   bl copy_string
  763.   add r1, r1, r0
  764.   ldr r0, =self_nick
  765.   bl copy_string
  766.   add r1, r1, r0
  767.   mov r0, #10
  768.   str r0, [r1], #1
  769.   bl write_checksum
  770.   mov r2, #3
  771.  
  772.   1:
  773.     bl send_buffer
  774.     bl wait_ok
  775.     tst r0, r0
  776.     beq 2f
  777.     subs r2, r2, #1
  778.     beq 2f
  779.   b 1b
  780.  
  781.   2:
  782.   pop {r0-r2, pc}
  783.  
  784.  
  785. send_ok:
  786.   push {r0-r1, lr}
  787.  
  788.   ldr r0, =ok_command
  789.   ldr r1, =out_net_buf
  790.   bl copy_string
  791.   add r1, r1, r0
  792.   mov r0, #10
  793.   str r0, [r1], #1
  794.   bl write_checksum
  795.   bl send_buffer
  796.  
  797.   pop {r0-r1, pc}
  798.  
  799.  
  800. send_sync:
  801.   push {r0-r1, lr}
  802.  
  803.   ldr r0, =sync_command
  804.   ldr r1, =out_net_buf
  805.   bl copy_string
  806.   add r1, r1, r0
  807.   mov r0, #10
  808.   str r0, [r1], #1
  809.   bl write_checksum
  810.   bl send_buffer
  811.  
  812.   pop {r0-r1,pc}
  813.  
  814.  
  815. write_checksum:
  816.   push {r0, r2-r3, lr}
  817.  
  818.   ldr r0, =out_net_buf
  819.   mov r2, #0
  820.  
  821.   1:
  822.     ldrb r3, [r0], #1
  823.     add r2, r2, r3
  824.     cmp r0, r1
  825.   bne 1b
  826.  
  827.   strb r2, [r1], #1
  828.  
  829.   pop {r0, r2-r3, pc}
  830.  
  831.  
  832. send_buffer:
  833.   push {r0-r2, lr}
  834.  
  835.   ldr r2, =out_net_buf
  836.  
  837.   1:
  838.     cmp r2, r1
  839.     beq 2f
  840.     ldrb r0, [r2], #1
  841.     bl send_uart
  842.   b 1b
  843.  
  844.   2:
  845.   pop {r0-r2, pc}
  846.  
  847.  
  848. wait_ok:
  849.   push {r1-r2, lr}
  850.  
  851.   mov r0, #0
  852.   ldr r1, =ok_flag
  853.   str r0, [r1]
  854.   ldr r2, =131072
  855.  
  856.   1:
  857.     bl process_input
  858.     ldr r0, [r1]
  859.     tst r0, r0
  860.     bne 2f
  861.     subs r2, r2, #1
  862.     beq 3f
  863.   b 1b
  864.  
  865.   2:
  866.   mov r0, #0
  867.   b 4f
  868.  
  869.   3:
  870.   mov r0, #1
  871.   b 4f
  872.  
  873.   4:
  874.   pop {r1-r2, pc}
  875.  
  876.  
  877. add_offset_to_history:
  878.   push {r3-r6, lr}
  879.  
  880.   cmp r3, #0
  881.   beq 2f
  882.   ldr r6, =ws_col
  883.   ldrh r6, [r6]
  884.  
  885.   1:
  886.     mov r0, #32
  887.     str r0, [r1], #1
  888.     subs r3, r3, #1
  889.   bne 1b
  890.  
  891.   2:
  892.   pop {r3-r6, pc}
  893.  
  894.  
  895. add_message_to_history:
  896.   push {r0-r9,lr}
  897.  
  898.   push {r0}
  899.   bl string_length
  900.   mov r5, r0
  901.   add r5, r5, #2
  902.   pop {r0}
  903.   mov r2, r0
  904.   push {r0}
  905.   bl string_length
  906.   mov r9, r0
  907.   pop {r0}
  908.   mov r3, r1
  909.   cmp r3, #0
  910.   beq 2f
  911.   ldr r6, =ws_col
  912.   ldrh r6, [r6]
  913.   mov r4, r6
  914.   mov r7, #2
  915.   udiv r6, r6, r7
  916.   cmp r3, r6
  917.   bgt 1f
  918.   sub r3, r4, r3
  919.   sub r3, r3, #4
  920.   b 3f
  921.  
  922.   1:
  923.   mov r3, r6
  924.   b 3f
  925.  
  926.   2:
  927.   push {r4, r7}
  928.   ldr r6, =ws_col
  929.   ldrh r6, [r6]
  930.   mov r4, r6
  931.   mov r7, #2
  932.   udiv r6, r6, r7
  933.   pop {r4, r7}
  934.   cmp r9, r6
  935.   blt 1f
  936.   mov r8, r6
  937.   add r8, r8, #4
  938.   b 4f
  939.  
  940.   1:
  941.   mov r8, r9
  942.   add r8, r8, #4
  943.   b 4f
  944.  
  945.   3:
  946.   ldr r8, =ws_col
  947.   ldrh r8, [r8]
  948.   sub r8, r8, r3
  949.  
  950.   4:
  951.   sub r8, r8, #2
  952.   udiv r7, r9, r8
  953.   add r8, r8, #2
  954.   ldr r4, =history_end
  955.   ldr r1, [r4]
  956.   bl add_offset_to_history
  957.   ldr r0, =t_l_b
  958.   bl copy_string
  959.   add r1, r1, r0
  960.   push {r8}
  961.   sub r8, r8, #2
  962.  
  963.   1:
  964.     ldr r0, =h_b
  965.     bl copy_string
  966.     add r1, r1, r0
  967.     subs r8, r8, #1
  968.   bne 1b
  969.  
  970.   pop {r8}
  971.   ldr r0, =t_r_b
  972.   bl copy_string
  973.   add r1, r1, r0
  974.   mov r0, #13
  975.   str r0, [r1], #1
  976.   mov r0, #10
  977.   str r0, [r1], #1
  978.  
  979.   3:
  980.   bl add_offset_to_history
  981.   ldr r0, =v_b
  982.   bl copy_string
  983.   add r1, r1, r0
  984.   mov r0, #32
  985.   str r0, [r1], #1
  986.   mov r0, r2
  987.   push {r2}
  988.   mov r2, r8
  989.   sub r2, r2, #4
  990.   bl copy_string
  991.   pop {r2}
  992.   add r2, r2, r8
  993.   sub r2, r2, #4
  994.   add r1, r1, r0
  995.   push {r8}
  996.   sub r8, r8, #4
  997.   cmp r0, r8
  998.   pop {r8}
  999.   blt 1f
  1000.   b 2f
  1001.  
  1002.   1:
  1003.   cmp r0, #0
  1004.   beq 2f
  1005.   sub r0, r8, r0
  1006.   sub r0, r0, #4
  1007.   push {r0}
  1008.  
  1009.   1:
  1010.     push {r0}
  1011.     mov r0, #0x20
  1012.     str r0, [r1], #1
  1013.     pop {r0}
  1014.     subs r0, r0, #1
  1015.   bne 1b
  1016.  
  1017.   pop {r0}
  1018.  
  1019.   2:
  1020.   mov r0, #32
  1021.   str r0, [r1], #1
  1022.   ldr r0, =v_b
  1023.   bl copy_string
  1024.   add r1, r1, r0
  1025.   cmp r7, #0
  1026.   beq 4f
  1027.   subs r7, r7, #1
  1028.   b 3b
  1029.  
  1030.   4:
  1031.   mov r0, #13
  1032.   str r0, [r1], #1
  1033.   mov r0, #10
  1034.   str r0, [r1], #1
  1035.   bl add_offset_to_history
  1036.   ldr r0, =b_l_b
  1037.   bl copy_string
  1038.   add r1, r1, r0
  1039.   push {r8}
  1040.   sub r8, r8, #2
  1041.  
  1042.   1:
  1043.     ldr r0, =h_b
  1044.     bl copy_string
  1045.     add r1, r1, r0
  1046.     subs r8, r8, #1
  1047.   bne 1b
  1048.  
  1049.   pop {r8}
  1050.   ldr r0, =b_r_b
  1051.   bl copy_string
  1052.   add r1, r1, r0
  1053.   mov r0, #13
  1054.   str r0, [r1], #1
  1055.   mov r0, #10
  1056.   str r0, [r1], #1
  1057.   str r1, [r4]
  1058.   ldr r1, =history_scroll
  1059.   mov r0, #0
  1060.   str r0, [r1]
  1061.  
  1062.   pop {r0-r9, pc}
  1063.  
  1064.  
  1065. add_log_to_history:
  1066.   push {r0-r4, lr}
  1067.  
  1068.   mov r2, r0
  1069.   ldr r4, =history_end
  1070.   ldr r1, [r4]  
  1071.   mov r0, #13
  1072.   str r0, [r1], #1
  1073.   mov r0, #10
  1074.   str r0, [r1], #1
  1075.   mov r0, #32
  1076.   str r0, [r1], #1
  1077.   mov r0, r2
  1078.   bl copy_string
  1079.   add r1, r1, r0
  1080.   mov r0, #13
  1081.   str r0, [r1], #1
  1082.   mov r0, #10
  1083.   str r0, [r1], #1
  1084.   mov r0, #10
  1085.   str r0, [r1], #1
  1086.   str r1, [r4]
  1087.   ldr r1, =history_scroll
  1088.   mov r0, #0
  1089.   str r0, [r1]
  1090.  
  1091.   pop {r0-r4, pc}
  1092.  
  1093.  
  1094. run_command:
  1095.   push {r0-r2, lr}
  1096.  
  1097.   ldr r0, =in_net_buf_end
  1098.   ldr r0, [r0]
  1099.   mov r2, #0
  1100.   strb r2, [r0, #-2]
  1101.   ldr r1, =in_net_buf
  1102.   ldr r0, =message_command
  1103.   bl compare_prefix
  1104.   tst r0, r0
  1105.   beq 1f
  1106.   ldr r0, =name_command
  1107.   bl compare_prefix
  1108.   tst r0, r0
  1109.   beq 2f
  1110.   ldr r0, =ok_command
  1111.   bl compare_prefix
  1112.   tst r0, r0
  1113.   beq 3f
  1114.   ldr r0, =sync_command
  1115.   bl compare_prefix
  1116.   tst r0, r0
  1117.   beq 4f
  1118.   b 5f
  1119.  
  1120.   1:
  1121.   ldr r0, =message_command
  1122.   bl string_length
  1123.   add r1, r1, r0
  1124.   mov r0, r1
  1125.   bl string_length
  1126.   mov r3, r0
  1127.   mov r0, r1
  1128.   mov r1, r3
  1129.   bl add_message_to_history
  1130.   bl send_ok
  1131.   b 5f
  1132.  
  1133.   2:
  1134.   ldr r0, =name_command
  1135.   bl string_length
  1136.   add r1, r1, r0
  1137.   mov r0, r1
  1138.   ldr r1, =other_nick
  1139.   bl copy_string
  1140.   bl send_ok
  1141.   b 5f
  1142.  
  1143.   3:
  1144.   mov r0, #1
  1145.   ldr r1, =ok_flag
  1146.   str r0, [r1]
  1147.   b 5f
  1148.  
  1149.   4:
  1150.   bl get_current_time
  1151.   ldr r1, =last_sync_recv
  1152.   str r0, [r1]
  1153.   b 5f
  1154.  
  1155.   5:
  1156.   ldr r0, =in_net_buf
  1157.   ldr r1, =in_net_buf_end
  1158.   str r0, [r1]
  1159.  
  1160.   pop {r0-r2, pc}
  1161.  
  1162.  
  1163. check_sync_state:
  1164.   push {r0-r3, lr}
  1165.  
  1166.   bl get_current_time
  1167.   ldr r1, =last_sync_sent
  1168.   ldr r2, [r1]
  1169.   sub r2, r0, r2
  1170.   cmp r2, #1
  1171.   strge r0, [r1]
  1172.   blge send_sync
  1173.   ldr r1, =last_sync_recv
  1174.   ldr r2, [r1]
  1175.   sub r2, r0, r2
  1176.   ldr r3, =online_flag
  1177.   cmp r2, #5
  1178.   ble 2f
  1179.   b 3f
  1180.  
  1181.   2:
  1182.   ldr r2, [r3]
  1183.   tst r2, r2
  1184.   bne 3f
  1185.  
  1186.   4:
  1187.   mov r0, #1
  1188.   str r0, [r3]
  1189.   bl send_nick
  1190.  
  1191.   3:
  1192.   pop {r0-r3, pc}
  1193.  
  1194.  
  1195. main_loop:
  1196.   push {lr}
  1197.  
  1198.   ldr r12, =131072
  1199.  
  1200.   1:
  1201.     subs r12, #1
  1202.     bne 2f
  1203.     bl clear_screen
  1204.     bl get_window_size
  1205.     bl draw_window
  1206.     bl draw_history
  1207.     bl draw_input
  1208.     bl check_sync_state
  1209.     ldr r12, =131072
  1210.  
  1211.     2:
  1212.     bl process_input
  1213.     bl kbdhit
  1214.     tst r0, r0
  1215.   beq 1b
  1216.  
  1217.   mov r2, r0
  1218.   ldr r1, =key_buf
  1219.   mov r0, #0
  1220.   mov r7, #3
  1221.   svc #0
  1222.   ldr r1, =key_buf
  1223.   ldrb r2, [r1]
  1224.   cmp r2, #3
  1225.   beq 3f
  1226.   bl handle_ui_input
  1227.   b 1b
  1228.  
  1229.   3:
  1230.   pop {pc}
  1231.  
  1232.  
  1233. cleanup:
  1234.   push {lr}
  1235.  
  1236.   bl reset_terminal
  1237.   mov r0, #0
  1238.   mov r1, #0
  1239.   bl set_cursor_position
  1240.  
  1241.   pop {pc}
  1242.  
  1243.  
  1244. draw_divider:
  1245.   push {r0-r3, r7, lr}
  1246.  
  1247.   ldr r3, =ws_col
  1248.   ldrh r3, [r3]
  1249.  
  1250.   1:
  1251.     mov r0, #1
  1252.     ldr r1, =win_divider
  1253.     mov r2, #lwin_divider
  1254.     mov r7, #4
  1255.     svc #0
  1256.     subs r3, r3, #1
  1257.   bne 1b
  1258.  
  1259.   pop {r0-r3, r7, pc}
  1260.  
  1261.  
  1262. draw_window:
  1263.   push {r0-r3, r7, lr}
  1264.  
  1265.   mov r0, #0
  1266.   mov r1, #1
  1267.   bl set_cursor_position
  1268.   mov r0, #1
  1269.   ldr r1, =welcome_message
  1270.   mov r2, #lwelcome_message
  1271.   mov r7, #4
  1272.   svc #0
  1273.   ldr r3, =ws_col
  1274.   ldrh r3, [r3]
  1275.   ldr r0, =other_nick
  1276.   bl string_length
  1277.   mov r4, r0
  1278.   sub r3, r3, r4
  1279.   sub r3, r3, #1
  1280.   mov r0, #0
  1281.   mov r1, r3
  1282.   bl set_cursor_position
  1283.   mov r0, #1
  1284.   ldr r1, =other_nick
  1285.   mov r2, r4
  1286.   mov r7, #4
  1287.   svc #0
  1288.   mov r0, #1
  1289.   mov r1, #0
  1290.   bl set_cursor_position
  1291.   bl draw_divider
  1292.   ldr r0, =ws_row
  1293.   ldrh r0, [r0]
  1294.   sub r0, r0, #1
  1295.   sub r0, r0, #1
  1296.   mov r1, #0
  1297.   bl set_cursor_position
  1298.   bl draw_divider
  1299.  
  1300.   pop {r0-r3, r7, pc}
  1301.  
  1302.  
  1303. draw_input:
  1304.   push {r0-r3, r7, lr}
  1305.  
  1306.   ldr r0, =self_nick
  1307.   bl string_length
  1308.   mov r4, r0
  1309.   ldr r0, =ws_row
  1310.   ldrh r0, [r0]
  1311.   sub r0, r0, #1
  1312.   mov r1, #0
  1313.   push {r0, r1}
  1314.   bl set_cursor_position
  1315.   mov r0, #1
  1316.   ldr r1, =self_nick
  1317.   mov r2, r4
  1318.   mov r7, #4
  1319.   svc #0
  1320.   mov r0, #1
  1321.   ldr r1, =input
  1322.   mov r2, #2
  1323.   mov r7, #4
  1324.   svc #0
  1325.   pop {r0, r1}
  1326.   add r1, r1, r4
  1327.   add r1, r1, #2
  1328.   bl set_cursor_position
  1329.   ldr r0, =input_buf
  1330.   ldr r1, =message_end
  1331.   ldr r1, [r1]
  1332.   mov r2, #1
  1333.   ldr r3, =ws_col
  1334.   ldrh r3, [r3]
  1335.   sub r3, r3, r4
  1336.   sub r3, r3, #1
  1337.   bl skip_lines
  1338.   sub r2, r1, r0
  1339.   mov r1, r0
  1340.   mov r0, #1
  1341.   mov r7, #4
  1342.   svc #0
  1343.  
  1344.   pop {r0-r3, r7, pc}
  1345.  
  1346.  
  1347. draw_history:
  1348.   push {r0-r12, lr}
  1349.  
  1350.   ldr r10, =ws_row
  1351.   ldrh r10, [r10]
  1352.   sub r10, r10, #1
  1353.   sub r10, r10, #2
  1354.   mov r11, #0
  1355.   add r11, r11, #2
  1356.   ldr r0, =history_buf
  1357.   ldr r1, =history_end
  1358.   ldr r1, [r1]
  1359.   ldr r2, =history_scroll
  1360.   ldr r2, [r2]
  1361.   ldr r3, =ws_col
  1362.   ldrh r3, [r3]
  1363.   bl skip_lines
  1364.   mov r9, r0
  1365.   ldr r0, =history_buf
  1366.   mov r1, r9
  1367.   mov r2, r10
  1368.   ldr r3, =ws_col
  1369.   ldrh r3, [r3]
  1370.   bl skip_lines
  1371.   mov r8, r0
  1372.   sub r2, r9, r8
  1373.   mov r0, r11
  1374.   mov r1, #0
  1375.   bl set_cursor_position
  1376.   mov r0, #1
  1377.   mov r1, r8
  1378.   mov r7, #4
  1379.   svc #0
  1380.  
  1381.   pop {r0-r12, pc}
  1382.  
  1383.  
  1384. get_window_size:
  1385.   push {r0-r2, lr}
  1386.  
  1387.   mov r0, #0
  1388.   ldr r1, =21523
  1389.   ldr r2, =winsize
  1390.   bl ioctl
  1391.  
  1392.   pop {r0-r2, pc}
  1393.  
  1394.  
  1395.  
  1396. .data
  1397.  
  1398.  
  1399. sequence: .asciz "\033["
  1400. vertical_offset_sequence: .asciz "d"
  1401. horizontal_offset_sequence: .asciz "G"
  1402. clear_sequence: .asciz "J"
  1403. reset_sequence: .asciz "\033c"
  1404. dev_mem: .asciz "/dev/mem"
  1405. sudo_err: .asciz "Cannot open /dev/mem\n"
  1406. usage_message: .ascii "Usage: ./chat <uart num>\n"
  1407. input: .ascii "> "
  1408. no_nick: .asciz "noname"
  1409. error_send: .asciz "Error: Destination Host Unreachable."
  1410. first_message: .asciz "Команда 'name: nick' меняет ник."
  1411. welcome_message: .asciz "⭐ SUPER CHAT ⭐"
  1412. lwelcome_message = . - welcome_message
  1413. message_command: .asciz "/message "
  1414. name_command: .asciz "/name "
  1415. change_name: .asciz "name:"
  1416. ok_command: .asciz "/ok"
  1417. sync_command: .asciz "/sync"
  1418. t_l_b: .ascii "┌\0"
  1419. h_b: .ascii "─\0"
  1420. v_b: .ascii "│\0"
  1421. v_b_n: .ascii "│\n\0"
  1422. t_r_b: .ascii "┐\0"
  1423. b_l_b: .ascii "└\0"
  1424. b_r_b: .ascii "┘\0"
  1425. dash: .ascii "—\0"
  1426. win_divider: .ascii "─"
  1427. lwin_divider = . - win_divider
  1428.  
  1429.  
  1430.  
  1431. .bss
  1432.  
  1433.  
  1434. kbdhit_n: .space 4
  1435. termios_old: .space 60
  1436. termios_new: .space 60
  1437. print_buf: .space 1000
  1438. dev_mem_handle: .space 4
  1439. rtc_mem_base: .space 4
  1440. ccu_mem: .space 4
  1441. uart_mem: .space 4
  1442. uart_no: .space 4
  1443. online_flag: .space 4
  1444. message_scroll: .space 4
  1445. message_end: .space 2
  1446. input_buf: .space 2
  1447. message_buf: .space 1000000
  1448. history_scroll: .space 4
  1449. history_end: .space 4
  1450. history_buf: .space 1000000
  1451. self_nick: .space 256
  1452. other_nick: .space 256
  1453. last_sync_sent: .space 4
  1454. last_sync_recv: .space 4
  1455. ok_flag: .space 4
  1456. in_net_buf_end: .space 4
  1457. out_net_buf: .space 1000
  1458. in_net_buf: .space 1000
  1459. winsize:
  1460. ws_row: .space 2
  1461. ws_col: .space 2
  1462. ws_xpixel: .space 2
  1463. ws_ypixel: .space 2
  1464. key_buf: .space 10
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement