summary refs log tree commit diff homepage
path: root/day01.asm
blob: 083f971f41bcdcb91e356f4fea71371a8d004ccd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
%include "sys.asm"
%include "lib.asm"

%define rPosX r8
%define rPosY r9
%define rDirX r10
%define rDirY r11

global _start
_start:
  sub rsp, 4096
  syscall SYS_READ, FD_STDIN, rsp, 4096
  mov rdi, rax ;; Length.
  xor rcx, rcx ;; Index.

  xor rPosX, rPosX
  xor rPosY, rPosY
  xor rDirX, rDirX
  mov rDirY, -1 ;; North.

  .loopTurn:
    cmp byte [rsp + rcx], 'L'
    jne .right
    .left: ;; L(dx, dy) = (dy, -dx)
      neg rDirX
      jmp .swap
    .right: ;; R(dx, dy) = (-dy, dx)
      neg rDirY
    .swap:
    xchg rDirX, rDirY

    xor rax, rax
    .loopDigit:
      inc rcx
      movzx rdx, byte [rsp + rcx]
      cmp dl, '0'
      jb .breakDigit

      ;; rax = rax * 10 + rdx - '0'
      shl rax, 1
      lea rax, [rax + rax * 4 - '0']
      add rax, rdx
    jmp .loopDigit
    .breakDigit:
    add rcx, 2 ;; Discard comma and space.

    mov rdx, rax
    imul rdx, rDirX
    add rPosX, rdx

    mov rdx, rax
    imul rdx, rDirY
    add rPosY, rdx

  cmp rcx, rdi
  jb .loopTurn

  ;; abs(x) = (x ^ (x >> 63)) - (x >> 63)
  mov rax, rPosX
  sar rax, 63
  xor rPosX, rax
  sub rPosX, rax

  mov rax, rPosY
  sar rax, 63
  xor rPosY, rax
  sub rPosY, rax

  push `\n`
  lea rdi, [rPosX + rPosY]
  call hex32
  push rax
  syscall SYS_WRITE, FD_STDOUT, rsp, 9

  xor rax, rax
syscall SYS_EXIT, rax
w=1'>Sandbox up on both FreeBSD and OpenBSDJune McEnroe This is a bit messy. pledge(2) calls based on [1]. [1]: https://kristaps.bsd.lv/kcgi/tutorial6.html 2021-09-25Set SO_REUSEADDR in quickJune McEnroe 2021-09-25Revert "Add cat alias using less"June McEnroe This reverts commit 8e3eea73f069cdbbc16da14e48a44d610dd07a07. Yeah this really doesn't work on OpenBSD. I kind of got into the habit of explicitly running less anyway. 2021-09-24Pledge downgradeJune McEnroe 2021-09-24Set original socket CLOEXECJune McEnroe 2021-09-24Consume request headers using MSG_PEEKJune McEnroe Use MSG_PEEK to determine where the request headers end and consume only up to there, leaving the CGI process to read any request body directly from the socket. 2021-09-24Set only HTTP_HOSTJune McEnroe And only because kcgi expects it. This is what I wrote originally, because every HTTP_ variable should be unset between each request, but this doesn't track them. 2021-09-23Scroll by single lines in xtermJune McEnroe 2021-09-23Hide htop "function bar"June McEnroe Useless thing... 2021-09-23Allow FocusEvents in xtermJune McEnroe Oops! This whole time I thought OpenBSD xterm for some reason didn't support focus events. It turns out allowMouseOps: false disables them by default. Replace the disallowedMouseOps list with everything but. 2021-09-23Use NI_NUMERICSERVJune McEnroe 2021-09-23Make up build away from FreeBSDJune McEnroe 2021-09-23Add quickJune McEnroe 2021-09-23Add The HobbitJune McEnroe Surprisingly good for something written by a man like a hundred years ago! 2021-09-22Remove PSF fontsJune McEnroe They were fun to make but I never actually used them. 2021-09-22Remove Linux-specific utilitiesJune McEnroe I haven't used these in ages. 2021-09-22Call sandbox in CGI modeJune McEnroe Otherwise upload won't actually work. 2021-09-22Support HTTP PUT in upJune McEnroe For use by Palaver[1]. Unfortunately, at least in the current App Store version of Palaver, this doesn't work correctly with basic auth. [1]: https://palaverapp.com/guides/commands/set.html#ui-image_service 2021-09-22Remove default faviconJune McEnroe I hate these things and also this one sucks. 2021-09-21Use Z_FILTERED strategyJune McEnroe 2021-09-21Recalculate various lengths only as neededJune McEnroe This actually speeds things up quite a bit, saving roughly a second on a big PNG screenshot. Almost all the remaining time is spent in deflate. 2021-09-21Rewrite pngo, add explicit optionsJune McEnroe Interesting to see how my code habits have changed. 2021-09-16Fix /* **/ comment matchingJune McEnroe 2021-09-15Remove typer, add downgrade to READMEJune McEnroe 2021-09-15Set bot mode on downgradeJune McEnroe 2021-09-15Enter capsicum in downgradeJune McEnroe 2021-09-15Factor out common parts of downgrade messagesJune McEnroe Also bump the message cap to 1024 because that is ostensibly useful for replying to older messages. 2021-09-14Add downgrade IRC botJune McEnroe 2021-09-14Sort by title if authors matchJune McEnroe There are probably better things to sort by but title definitely always exists. 2021-09-13Swap-remove tags as they're foundJune McEnroe This makes it even faster. From ~1s on a sqlite3.c amalgamation to ~0.85s. 2021-09-12Replace htagml regex with strncmpJune McEnroe Since ctags only ever produces regular expressions of the form /^re$/ or /^re/ with no other special characters, instead unescape the pattern and simply use strncmp. Running on a sqlite3.c amalgamation, the regex version takes ~37s while the strncmp version takes ~1s, producing identical output. Big win! 2021-09-11Also defer printing comment for lone close-parensJune McEnroe 2021-09-10Publish "git-comment"June McEnroe 2021-09-10Add git comment --pretty optionJune McEnroe 2021-09-08Defer printing comment if line is blank or closing braceJune McEnroe This fixes badly indented comments. 2021-09-08Up default min-repeat to 30 linesJune McEnroe 2021-09-08Handle dirty lines in git-commentJune McEnroe 2021-09-08Document and install git-commentJune McEnroe 2021-09-08Add repeat and all options to git-commentJune McEnroe 2021-09-08Add group threshold to git-commentJune McEnroe