hachem.wtf
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2025-12-05 16:27:48 +0100
committerhachem <im@hachem.wtf>2025-12-05 16:27:48 +0100
commite92da05ceebffa2ef8c906c7f49e13ca5bc90a32 (patch)
treed19b4f1baa3965318e6db1bda4634bd907093935
parentaa41e4d289b997e48b333818707376a4469c47ca (diff)
[solve]: day1 part 1
-rw-r--r--.gitignore2
-rw-r--r--Makefile38
-rw-r--r--input/day1.txt4664
-rw-r--r--input/test-day1.txt10
-rw-r--r--src/Day1.asm276
5 files changed, 4981 insertions, 9 deletions
diff --git a/.gitignore b/.gitignore
index e660fd9..378eac2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-bin/
+build
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..5ca8b92
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,38 @@
+NASM ?= nasm
+LD ?= ld
+
+SRC_DIR := src
+BUILD_DIR := build
+
+NASMFLAGS ?= -f elf32 -g -F dwarf
+LDFLAGS ?= -m elf_i386
+
+DAYS := Day1 Day2 Day3 Day4
+ASM_SRCS := $(addprefix $(SRC_DIR)/,$(addsuffix .asm,$(DAYS)))
+OBJ_FILES := $(addprefix $(BUILD_DIR)/,$(addsuffix .o,$(DAYS)))
+BINARIES := $(addprefix $(BUILD_DIR)/,$(DAYS))
+
+.PHONY: all clean day1 list run-day%
+
+all: $(BINARIES)
+
+$(BUILD_DIR):
+ @mkdir -p $(BUILD_DIR)
+
+$(BUILD_DIR)/Day%.o: $(SRC_DIR)/Day%.asm | $(BUILD_DIR)
+ $(NASM) $(NASMFLAGS) $< -o $@
+
+$(BUILD_DIR)/Day%: $(BUILD_DIR)/Day%.o
+ $(LD) $(LDFLAGS) -o $@ $<
+
+day1: $(BUILD_DIR)/Day1
+
+run-day%: $(BUILD_DIR)/Day%
+ ./$(BUILD_DIR)/Day$*
+
+list:
+ @printf "Available days:\n"
+ @for day in $(DAYS); do echo " $$day"; done
+
+clean:
+ rm -rf $(BUILD_DIR)
diff --git a/input/day1.txt b/input/day1.txt
new file mode 100644
index 0000000..b8cc155
--- /dev/null
+++ b/input/day1.txt
@@ -0,0 +1,4664 @@
+L25
+L8
+L44
+L6
+R1
+R26
+R9
+L47
+R16
+R25
+R12
+L42
+R35
+L24
+R31
+R19
+L43
+L33
+L23
+R9
+L17
+R38
+R42
+L3
+L39
+R35
+L50
+L40
+R4
+L13
+R42
+L16
+L26
+L26
+R5
+R4
+L2
+R36
+L23
+L35
+L46
+L26
+L10
+R45
+R32
+L12
+L8
+L25
+R49
+R71
+L24
+R58
+R63
+R38
+R41
+L60
+L40
+R93
+R33
+R62
+R12
+L97
+R25
+R15
+R4
+R88
+R65
+R3
+R76
+L79
+L85
+L32
+L25
+L14
+L2
+L67
+R25
+L35
+R47
+L40
+R28
+R46
+L46
+L62
+R83
+R93
+L17
+L92
+R78
+R17
+R34
+R23
+R43
+R20
+L35
+L66
+R42
+L28
+R81
+R86
+L775
+R22
+L47
+L17
+L83
+L47
+R24
+R8
+R315
+R59
+R65
+R32
+R63
+R376
+R44
+R77
+R342
+R80
+R86
+L24
+R28
+L28
+L87
+L13
+L29
+L39
+L67
+L37
+L88
+L177
+L623
+L40
+L66
+R49
+L74
+R391
+R518
+L418
+R498
+L98
+R19
+R96
+L39
+L79
+R19
+L87
+R71
+L62
+L42
+R4
+R449
+L49
+R44
+L3
+R72
+R87
+R65
+L65
+R88
+R196
+L728
+R544
+R66
+L49
+L17
+L8
+L92
+L45
+L89
+L66
+L25
+R99
+L74
+R72
+R25
+R59
+R64
+L20
+L62
+R92
+L30
+L89
+R89
+R30
+L74
+L42
+R86
+R978
+L36
+L42
+L172
+R72
+L46
+R46
+L75
+L25
+L31
+L88
+L81
+L498
+L2
+L951
+R51
+R41
+L641
+L49
+L73
+L77
+L8
+L36
+L99
+R15
+L20
+L653
+L29
+R90
+R66
+L3
+L24
+R87
+R25
+R72
+R24
+R22
+R33
+L11
+L665
+L63
+R3
+R83
+L9
+R41
+R59
+L79
+R88
+L10
+R61
+R22
+L83
+L76
+R68
+L382
+L873
+R684
+R79
+L979
+L77
+L44
+L31
+R761
+L30
+R859
+L59
+L55
+R455
+L649
+R39
+L390
+L25
+L775
+L381
+R810
+R571
+L70
+L25
+L42
+R37
+R22
+R99
+L34
+L36
+L23
+R44
+R24
+L35
+R28
+L89
+L98
+R84
+L86
+R54
+R81
+R35
+L62
+L62
+R8
+R4
+R42
+L19
+L23
+L10
+L98
+R37
+L76
+R91
+R598
+R67
+L764
+R97
+L2
+L98
+R90
+L17
+R62
+R273
+R763
+L68
+L903
+L498
+L2
+R95
+R4
+R319
+R82
+R198
+L98
+R83
+L983
+R782
+R18
+R490
+L83
+R893
+L965
+L35
+R72
+L50
+L22
+L335
+R30
+R60
+R272
+L12
+R933
+R52
+R3
+R119
+R78
+R26
+R94
+L20
+R39
+L39
+R724
+R35
+R41
+L28
+L55
+R73
+L90
+R27
+L66
+L61
+R61
+R39
+R519
+R81
+R565
+R51
+R97
+L72
+L402
+L39
+L61
+L10
+R58
+L39
+R52
+L366
+R66
+R365
+R83
+R28
+L779
+L597
+L13
+R613
+L657
+R18
+L22
+L62
+L77
+L84
+R55
+R29
+R535
+R56
+R28
+L7
+L12
+R37
+R63
+R81
+L81
+L31
+L69
+R84
+R716
+L40
+R40
+L6
+R6
+R53
+R247
+R34
+L10
+R76
+L52
+L48
+L37
+R64
+L44
+L21
+R38
+L41
+L8
+R16
+R54
+L82
+L30
+R91
+L55
+R54
+L99
+R45
+R59
+R31
+R686
+L69
+L52
+L2
+R46
+L609
+R57
+L1
+R9
+L796
+R76
+L28
+L16
+R6
+L42
+R2
+L39
+L49
+R843
+R64
+R61
+R99
+R19
+L165
+R65
+L37
+L12
+L51
+L145
+L55
+R56
+R56
+R54
+R226
+R8
+L91
+R91
+L92
+R892
+R3
+L3
+L57
+R457
+R81
+R18
+R62
+L39
+R578
+R43
+R957
+L14
+R51
+R84
+R43
+R7
+L11
+R1
+R39
+L94
+L6
+R52
+L37
+R48
+R37
+L10
+R51
+R44
+L85
+L6
+L6
+R68
+L54
+L41
+R79
+L63
+L77
+R11
+R33
+L4
+R280
+L20
+R24
+L524
+R41
+L41
+L71
+L29
+R49
+L92
+L97
+L60
+R13
+L57
+L56
+R89
+R11
+L75
+R375
+L23
+L575
+R34
+L258
+L655
+R765
+L88
+R29
+R56
+L338
+R60
+L96
+L11
+L27
+R495
+L10
+L58
+L85
+L6
+R65
+R52
+L449
+R330
+L75
+L77
+R98
+L53
+L23
+R23
+R23
+R17
+L40
+L49
+R92
+L10
+L562
+L20
+L51
+R475
+L40
+R589
+R13
+L50
+R91
+L70
+R195
+L203
+L74
+L99
+L27
+R95
+R8
+L71
+R62
+R78
+L37
+R65
+R67
+L29
+L38
+L58
+L81
+R31
+R15
+R99
+R694
+R86
+R62
+L36
+R56
+L80
+R7
+R41
+L22
+R86
+L70
+L15
+L77
+L138
+L48
+L75
+L46
+R169
+R41
+R547
+L88
+R388
+L443
+L45
+L134
+R34
+L92
+L708
+L68
+R911
+L93
+L50
+R14
+R73
+L80
+L7
+R85
+R42
+R673
+R80
+R40
+L87
+R34
+L77
+R39
+R32
+L28
+L33
+L89
+R89
+R76
+L76
+R46
+L946
+R44
+L44
+R20
+R80
+L92
+L8
+R49
+R44
+R96
+L4
+L85
+L84
+L16
+R512
+L7
+L5
+L68
+L832
+L20
+R220
+L69
+L96
+R66
+R53
+R37
+R9
+R211
+L11
+R19
+L419
+R10
+R266
+R20
+L96
+L67
+R67
+L6
+L22
+L75
+L17
+L32
+L583
+R83
+L448
+L35
+L47
+L78
+L73
+L367
+R519
+R81
+L887
+L51
+L62
+R47
+L96
+L935
+R73
+R62
+L51
+R21
+L85
+R49
+L285
+L37
+R47
+R69
+L42
+R72
+R65
+L81
+R67
+R292
+R16
+L68
+R28
+L82
+L46
+L98
+R98
+L318
+R18
+L43
+R31
+L88
+R94
+L292
+R5
+R93
+R66
+L70
+R4
+L29
+L98
+L39
+R266
+L903
+L21
+L40
+R64
+L735
+L19
+R54
+R563
+R737
+R454
+R55
+L70
+L39
+R39
+L7
+R71
+L3
+L13
+R1
+R153
+L88
+L53
+L45
+L55
+R397
+R97
+L536
+L58
+R847
+R52
+L299
+R91
+R9
+R49
+R51
+R67
+L51
+L79
+L490
+R96
+L243
+R45
+R73
+L63
+L23
+R968
+R27
+R173
+L7
+L35
+R58
+R84
+R11
+R89
+R81
+L20
+L95
+L66
+L326
+L74
+R70
+R30
+L152
+R52
+R559
+R341
+R96
+L687
+L9
+L28
+R373
+R73
+R91
+R102
+L22
+R211
+R97
+L835
+L62
+L4
+L69
+L68
+L85
+R397
+L54
+L17
+L2
+L98
+R34
+R366
+R61
+L61
+R15
+L81
+R3
+L645
+L16
+R24
+L263
+R63
+R44
+R56
+R43
+L43
+L59
+L309
+R68
+R73
+R62
+R97
+R68
+R2
+L2
+L65
+L80
+L69
+R14
+L7
+L93
+R47
+L58
+R245
+R66
+L12
+L88
+L67
+L47
+L586
+R90
+L9
+L797
+L84
+R920
+R80
+R836
+R64
+R99
+L799
+R394
+L294
+R69
+L569
+L26
+R26
+L66
+R7
+L16
+L251
+R21
+R5
+L56
+L144
+L52
+R99
+L93
+L54
+L31
+R31
+L99
+L401
+L8
+R18
+L10
+L8
+R47
+L39
+L37
+R37
+L519
+R69
+R77
+L69
+L90
+R49
+L17
+R49
+R43
+R8
+L38
+L19
+R57
+R35
+L35
+L347
+L2
+L217
+R661
+L562
+L317
+R3
+R36
+L52
+R6
+R48
+L38
+L36
+R85
+L22
+L46
+L9
+R9
+R1
+R61
+R29
+R85
+L476
+R68
+R58
+L226
+R728
+R72
+L67
+L33
+R80
+L33
+R53
+R34
+L165
+L69
+L60
+L40
+L61
+R10
+R61
+L15
+L29
+L66
+L459
+R959
+L12
+L95
+L93
+R96
+R54
+R67
+R83
+R515
+L15
+R325
+L25
+L66
+L634
+R51
+R449
+R52
+R11
+L63
+L35
+R48
+R50
+R78
+R2
+L19
+R253
+R19
+L12
+R16
+L28
+L72
+L29
+L71
+L81
+L19
+R72
+R28
+R99
+R92
+R81
+R28
+R246
+R79
+R24
+L4
+L45
+R31
+L12
+L294
+L25
+R665
+R35
+L42
+L55
+R47
+L904
+L2
+R56
+R43
+R88
+L31
+L2
+R382
+L80
+L3
+R98
+L21
+R484
+L44
+L14
+L57
+L15
+R61
+L89
+R34
+L334
+L93
+L507
+L55
+L45
+R63
+R28
+L891
+R37
+L921
+R93
+L87
+L922
+L4
+L96
+R63
+L63
+L11
+L259
+L30
+L40
+L6
+R84
+R62
+R65
+L46
+R73
+L93
+L99
+L37
+R26
+L37
+L12
+L40
+R61
+L61
+L40
+L28
+R170
+R692
+L5
+L8
+L26
+R17
+L88
+L16
+L68
+L60
+R48
+R12
+R79
+L42
+L37
+R44
+R56
+R232
+R18
+L67
+L98
+L79
+R827
+R773
+R584
+R10
+L42
+L65
+R85
+R522
+L618
+L82
+L76
+L24
+L74
+R35
+L65
+R4
+R60
+R339
+L72
+R23
+R50
+L76
+L19
+R57
+R155
+R29
+L15
+R4
+L53
+R631
+R73
+R14
+R90
+R52
+L7
+L35
+R46
+R54
+R85
+L80
+R48
+R47
+R646
+R364
+L10
+R86
+L86
+L47
+R86
+L39
+L993
+R91
+L46
+L52
+R10
+R83
+L92
+L44
+R74
+R69
+L53
+R53
+L86
+R86
+R52
+L15
+R63
+R38
+L35
+R40
+R548
+L95
+L988
+R192
+L7
+R66
+R41
+R85
+R7
+L77
+L51
+R88
+R48
+L36
+R44
+R630
+L38
+R729
+R264
+R126
+L74
+L98
+L23
+R80
+R196
+R6
+R94
+L51
+R51
+L85
+R2
+L17
+R85
+L89
+L96
+L3
+L49
+L845
+R62
+L60
+L811
+L208
+R6
+R22
+R20
+R62
+L92
+R96
+R362
+L493
+R10
+R21
+R61
+L861
+L1
+R53
+L852
+L80
+L20
+R90
+L597
+R807
+L14
+L33
+L40
+R87
+R60
+R96
+R44
+R3
+L59
+R820
+L95
+L169
+R65
+R1
+L37
+L48
+L638
+R31
+R51
+R10
+L35
+L96
+R57
+R39
+L29
+R29
+R80
+L67
+L46
+R33
+L19
+R19
+L950
+L130
+L39
+R92
+L1
+L30
+L72
+L70
+R202
+R98
+R29
+L90
+R61
+R152
+L25
+L28
+L99
+L15
+R90
+R38
+L13
+R810
+R90
+L50
+L2
+R15
+L63
+L20
+R20
+L3
+L97
+R98
+R70
+R31
+R16
+L84
+L3
+R72
+L57
+R957
+R5
+R8
+L84
+R71
+R70
+R62
+R84
+R84
+L50
+R30
+R548
+R272
+R295
+L370
+L59
+L66
+R80
+L91
+R81
+L66
+R536
+L40
+L99
+L291
+L94
+R46
+R86
+L46
+R98
+L7
+R5
+R231
+L265
+R33
+L78
+L71
+L44
+R55
+L51
+R61
+R31
+L81
+L80
+R39
+L51
+R58
+R87
+R10
+R915
+L911
+L86
+L338
+R48
+R77
+R41
+L72
+R97
+R758
+L64
+R571
+R82
+L13
+L15
+R28
+L69
+L31
+L93
+R83
+R57
+R53
+R55
+R620
+L75
+L79
+R75
+R4
+R83
+L15
+L337
+L31
+R50
+L50
+R596
+R571
+R292
+R72
+L15
+L316
+L99
+L95
+L6
+R35
+R65
+R37
+L37
+L36
+L16
+L3
+L93
+R48
+L26
+L15
+L173
+L17
+L69
+L8
+L131
+L88
+R45
+L41
+R195
+R31
+L63
+R96
+L9
+R96
+L23
+R90
+R10
+R11
+R26
+L20
+L92
+R469
+L76
+L18
+L863
+R63
+L84
+L16
+L7
+L18
+L37
+L138
+L76
+L557
+L67
+R41
+L70
+R76
+L93
+L352
+L489
+R11
+L96
+L528
+R97
+R39
+L36
+L729
+R29
+L760
+R60
+L61
+R72
+R589
+L28
+R228
+L14
+L78
+R492
+L73
+L70
+R35
+L38
+L96
+R15
+R76
+L8
+R59
+R45
+L45
+L68
+L33
+R24
+L30
+R307
+L54
+L646
+R93
+L85
+L55
+L53
+L62
+L55
+R91
+R226
+R4
+L1
+R197
+L23
+L312
+R95
+R487
+L47
+L17
+R517
+L76
+R931
+R83
+L21
+L63
+L43
+R89
+L27
+R27
+R1
+R69
+R30
+R94
+R72
+R78
+L52
+L40
+R48
+R52
+L52
+R5
+R95
+L98
+R98
+L55
+R555
+L76
+R23
+L847
+L99
+R590
+L91
+R58
+L58
+R24
+L419
+R805
+L44
+L226
+L40
+R39
+R62
+L75
+L16
+R86
+R4
+L530
+L15
+L55
+L937
+R97
+R603
+R83
+R54
+L715
+R15
+R75
+R82
+L57
+L633
+L88
+L504
+R25
+R184
+R617
+R350
+L92
+R241
+L28
+L47
+R55
+L80
+L17
+R17
+L385
+R35
+R66
+L216
+R191
+L79
+R53
+L15
+R72
+R207
+R25
+L77
+L83
+R49
+L95
+L468
+R90
+L70
+L201
+L199
+R22
+L22
+R58
+L30
+L7
+L21
+R657
+R774
+L56
+L275
+L13
+R613
+L29
+R29
+L3
+R36
+R46
+L79
+R126
+L70
+R44
+L64
+R73
+L809
+R860
+L74
+R46
+R68
+L82
+R82
+L3
+L657
+L40
+L60
+R60
+R5
+L5
+L72
+R35
+R74
+R63
+L276
+R76
+R33
+R945
+L78
+L38
+R89
+L51
+L45
+L195
+R476
+L98
+R770
+L8
+R93
+L93
+L937
+R52
+R96
+L11
+R29
+L29
+L79
+R285
+R94
+R67
+R33
+R60
+R70
+R19
+R51
+R816
+L16
+L896
+L89
+L15
+R43
+R57
+L6
+L94
+L99
+L25
+L5
+R29
+L81
+R97
+L16
+L93
+L43
+R7
+R329
+R70
+R82
+L52
+L37
+L81
+L82
+R56
+L56
+R67
+L24
+R57
+L36
+L95
+R31
+R24
+L384
+R24
+R27
+L88
+L248
+L55
+L810
+L34
+R85
+R25
+R99
+R780
+R55
+R80
+L5
+R25
+R47
+R337
+L58
+L99
+R53
+R20
+R85
+R31
+L60
+R3
+R74
+L463
+R30
+R13
+L13
+L73
+L27
+L58
+R48
+L872
+L118
+R99
+R1
+L75
+R95
+L93
+L5
+R981
+L3
+R5
+L60
+L85
+R16
+L84
+R948
+R60
+L73
+R84
+R89
+L33
+L491
+L23
+R71
+L405
+L9
+R37
+L29
+R53
+R29
+L92
+R392
+L48
+R48
+L30
+R16
+L49
+L37
+L30
+R50
+R71
+R9
+R64
+R36
+L39
+R23
+R35
+R5
+L12
+L922
+R18
+L37
+R29
+R51
+L24
+L42
+L85
+R95
+R22
+R807
+R185
+L19
+R910
+R69
+L476
+R91
+L40
+L44
+R97
+R96
+L386
+L7
+L21
+L79
+R30
+L30
+R36
+L17
+L15
+L41
+R93
+L256
+L705
+R76
+L43
+L89
+R35
+L47
+L27
+L40
+L52
+L80
+L26
+R856
+L265
+R7
+R95
+R38
+L71
+L62
+R98
+R65
+R19
+L939
+R52
+L46
+R89
+L38
+L29
+R629
+R92
+L192
+L43
+R90
+L53
+L32
+L62
+L83
+R70
+R84
+R129
+R315
+L61
+R643
+R59
+R47
+R57
+L80
+R86
+L998
+L44
+L5
+R64
+R217
+L50
+L35
+R11
+R344
+L77
+R75
+R816
+L32
+R648
+L10
+R17
+R29
+R80
+L18
+L92
+R880
+R896
+L52
+L111
+R388
+L7
+L28
+R65
+L86
+R67
+R65
+R27
+L94
+R75
+R12
+L66
+L69
+R57
+L54
+L11
+L21
+L39
+R85
+L30
+L27
+R25
+L16
+L15
+L22
+L33
+L27
+R26
+L77
+L4
+L285
+L29
+R24
+R34
+L26
+L903
+L64
+L36
+L85
+R141
+R27
+R40
+L23
+R74
+R5
+L3
+L76
+L15
+L41
+R30
+R26
+L567
+L733
+L761
+R98
+L37
+R162
+L75
+R78
+R35
+R57
+R51
+R92
+R79
+L79
+R4
+L15
+L89
+L474
+R74
+L9
+R82
+L42
+R27
+L58
+R63
+R37
+L73
+L42
+R115
+L49
+R49
+R88
+R12
+R89
+L89
+L38
+L49
+R87
+R602
+L902
+L77
+L43
+R20
+R333
+R94
+L627
+L23
+L540
+R91
+L50
+L12
+L9
+L25
+L62
+R30
+R132
+R13
+R39
+R816
+R57
+L51
+R31
+R669
+R94
+L37
+R29
+R90
+L94
+L12
+L81
+R405
+L68
+R2
+R66
+L57
+R57
+L12
+L71
+R41
+R42
+R67
+R16
+L35
+R71
+L939
+L6
+L36
+R662
+L82
+L78
+L29
+R743
+L36
+L18
+L261
+R881
+R80
+L16
+R416
+L22
+R22
+R90
+R92
+R18
+R59
+L59
+R487
+L87
+L69
+R35
+L25
+L62
+R21
+L63
+R63
+R523
+R77
+L2
+L98
+L661
+R61
+L42
+L58
+L50
+R45
+L25
+R84
+L654
+L22
+L36
+R30
+R288
+L28
+L69
+R37
+L55
+R55
+R317
+R21
+R36
+R26
+R24
+R94
+R84
+L79
+R77
+L496
+L52
+R73
+L23
+R21
+L323
+L72
+R72
+L12
+R36
+R533
+L25
+L10
+L706
+L16
+R7
+L73
+R66
+L26
+R37
+R89
+L54
+R79
+R475
+L547
+L53
+L60
+R70
+R935
+L9
+R462
+R56
+L24
+R56
+L586
+R63
+L36
+R39
+R68
+L40
+L94
+L642
+L258
+R70
+L95
+R41
+R84
+R13
+L562
+R49
+L96
+L20
+R30
+R68
+L309
+R65
+R61
+R1
+R73
+L10
+L58
+R3
+R92
+R565
+L24
+R59
+L29
+R29
+R61
+R33
+L94
+R146
+L323
+L24
+L99
+L920
+R20
+L50
+L50
+R19
+R32
+L268
+R550
+L71
+R38
+R3
+L3
+R59
+L59
+R44
+L24
+L94
+L14
+R12
+L14
+L62
+R52
+R13
+R87
+L94
+L704
+R25
+L29
+L88
+R44
+R50
+L4
+L271
+L507
+R272
+L61
+L33
+R27
+L212
+L815
+R80
+L15
+L127
+R98
+L16
+L440
+L80
+L23
+R63
+R60
+R591
+R9
+L91
+R859
+L68
+R52
+R728
+L43
+L47
+R29
+R981
+L704
+R25
+R179
+L73
+R73
+R58
+L50
+L8
+R139
+L39
+R65
+L95
+L43
+L60
+R95
+L61
+R865
+L158
+L51
+R93
+L235
+R84
+R31
+R70
+L21
+L756
+R77
+R3
+R45
+R52
+R77
+R56
+R101
+R73
+R4
+R89
+R50
+R50
+L35
+R64
+R9
+L12
+L77
+R205
+L54
+L47
+L853
+R70
+L42
+L9
+L19
+R26
+L96
+R24
+R94
+R252
+L39
+L20
+L73
+L68
+R51
+R84
+R79
+R86
+R58
+L58
+L74
+L22
+R67
+L95
+L26
+R694
+R18
+R180
+L142
+L119
+R19
+R153
+R47
+R73
+L10
+R76
+L52
+L575
+R88
+L475
+R58
+L3
+R769
+R82
+R27
+R56
+R70
+R87
+L32
+R68
+R93
+L81
+L47
+L72
+R84
+R70
+L65
+R11
+R79
+L79
+L87
+L10
+L8
+L795
+L21
+L221
+L58
+R48
+R950
+R2
+R391
+L88
+L88
+L915
+R54
+R94
+R61
+L70
+R61
+R47
+L447
+R572
+R28
+R410
+L24
+L72
+L41
+L259
+L66
+R34
+L39
+L291
+R24
+R24
+L711
+L5
+L80
+R27
+L31
+L69
+L31
+L43
+R802
+L322
+L37
+L728
+L52
+R80
+L703
+R529
+R588
+L14
+L64
+R753
+L61
+R47
+R4
+L489
+L90
+L80
+L90
+L52
+L78
+L424
+L76
+R86
+R23
+L71
+L38
+R508
+L508
+R96
+R234
+R67
+R69
+L92
+R124
+L46
+R47
+R4
+R97
+R64
+L64
+R3
+L38
+L4
+L79
+R18
+L8
+L82
+R90
+L32
+L13
+R245
+L12
+L88
+R92
+L748
+L44
+L74
+R6
+R68
+R14
+L8
+R963
+L769
+R217
+L17
+L58
+L42
+L94
+L6
+L94
+R94
+L58
+L542
+R41
+R585
+R36
+R2
+R536
+L13
+R88
+L67
+L13
+L90
+R95
+R57
+R621
+R90
+R23
+R88
+R51
+R70
+L25
+R913
+L88
+L22
+L578
+R65
+L865
+L965
+L23
+R97
+L29
+R52
+R68
+L63
+L639
+L779
+R27
+R62
+R803
+R52
+R37
+R27
+R973
+L56
+R56
+L17
+R96
+L408
+R31
+L63
+R55
+R6
+R29
+R9
+R4
+R11
+R47
+R28
+R84
+R88
+R31
+L54
+R47
+R27
+L251
+R30
+R170
+R83
+R417
+L10
+L90
+L976
+R55
+R221
+R32
+R74
+L42
+R36
+L417
+R704
+R52
+R628
+L730
+R87
+L22
+L2
+L16
+R40
+R23
+R34
+L74
+L45
+L47
+R38
+R20
+L73
+R37
+L860
+L77
+L50
+L220
+L31
+R43
+R58
+L40
+L60
+R33
+L33
+L70
+R38
+L60
+R78
+R53
+L39
+L5
+L95
+L55
+L28
+R84
+L1
+R47
+R53
+L523
+R13
+L90
+R3
+L803
+L3
+R26
+R77
+L30
+R56
+L69
+L157
+R10
+R11
+L175
+R54
+R375
+R25
+L26
+R40
+R441
+R45
+R76
+R60
+R8
+R76
+L162
+R42
+L23
+R89
+R1
+L31
+L36
+R53
+L53
+L72
+L17
+L51
+R40
+R27
+R46
+R627
+L279
+L12
+R55
+R17
+L89
+R9
+L1
+R662
+L18
+L88
+L56
+L940
+R224
+L9
+L74
+R99
+L114
+R67
+R47
+R18
+R74
+R31
+L23
+R21
+L43
+R45
+R82
+R95
+L444
+R44
+R275
+L618
+L10
+L79
+R79
+L847
+R88
+L88
+L13
+R82
+R31
+L24
+R41
+R80
+R44
+L94
+L62
+L10
+L7
+R38
+L91
+L44
+R29
+L64
+L336
+L436
+L30
+L73
+R561
+L322
+R45
+R11
+L65
+L91
+R691
+R809
+R30
+R470
+R64
+L20
+R461
+R95
+R13
+L2
+L95
+R841
+R33
+L724
+R98
+L14
+L335
+L15
+R6
+R94
+L649
+L352
+R8
+R56
+R27
+L55
+R77
+R1
+R58
+L24
+L41
+L757
+R51
+L49
+R773
+R14
+R78
+L16
+R46
+L72
+R17
+L91
+L61
+R76
+R85
+L45
+R94
+R51
+L75
+L25
+R69
+R31
+R34
+L3
+R69
+L85
+R85
+L977
+R37
+R840
+R123
+R745
+L68
+R28
+R72
+L859
+L15
+L26
+R61
+L17
+R16
+R78
+L79
+L11
+L86
+L562
+R799
+L94
+L40
+L65
+R21
+L21
+L47
+R47
+R36
+L27
+L9
+R51
+L51
+L43
+R57
+L14
+R62
+R38
+R90
+L90
+R89
+R4
+L93
+R23
+R20
+R1
+R56
+R15
+L365
+R50
+L88
+R13
+L98
+R54
+L81
+L552
+L48
+R60
+R69
+R22
+R36
+L87
+R71
+L71
+R98
+R93
+L72
+L97
+R47
+R331
+L46
+R13
+R33
+R40
+R427
+L28
+L91
+R52
+R16
+L816
+L67
+R4
+L37
+L31
+R31
+L10
+L90
+L60
+R154
+R68
+L96
+R96
+L62
+R91
+R9
+L49
+L95
+R78
+L653
+R22
+R72
+R25
+L53
+L13
+R14
+L82
+R634
+L86
+L514
+L42
+R645
+R39
+L84
+L58
+L10
+L90
+R85
+L908
+L77
+L47
+R47
+L99
+L270
+L31
+R79
+L5
+R46
+L81
+L59
+R4
+R529
+R87
+L48
+R85
+L20
+R83
+L56
+L77
+R61
+L28
+L85
+L88
+L27
+R36
+R1
+R63
+R54
+R46
+R49
+L34
+R85
+L79
+R58
+R28
+R27
+L28
+L10
+R19
+L59
+R47
+L124
+R80
+L20
+R90
+R17
+R8
+L50
+R755
+L222
+R22
+R768
+L27
+L375
+L4
+R30
+R75
+L26
+L61
+L17
+R72
+L94
+R93
+L15
+L878
+L45
+L43
+R32
+R76
+R39
+R41
+R60
+R58
+R656
+L71
+L3
+L145
+L655
+R55
+R68
+R14
+L21
+L48
+R232
+L56
+R56
+L45
+R2
+R50
+R17
+L1
+L9
+L14
+R4
+R19
+L57
+L66
+L15
+R29
+R698
+L12
+R77
+L87
+R10
+L252
+L9
+R79
+L14
+R496
+R2
+R98
+L6
+L32
+R85
+R53
+L1
+L230
+L69
+L998
+L2
+L1
+L99
+R13
+L122
+R9
+L19
+R84
+L65
+R35
+R65
+L37
+R37
+L9
+L23
+L68
+L51
+R4
+R10
+R928
+R868
+R6
+L50
+R14
+R87
+L916
+R53
+R97
+R10
+R40
+R310
+R13
+R18
+L41
+R33
+L233
+R53
+L798
+R99
+L454
+L96
+L84
+R80
+L98
+L2
+R65
+L37
+R72
+R68
+R32
+L99
+L1
+L21
+R21
+L93
+L7
+R27
+R58
+R96
+L81
+L578
+L222
+R57
+L92
+R35
+L63
+R24
+L61
+L55
+R85
+L4
+L6
+R11
+L75
+L56
+R13
+L715
+L92
+R905
+L82
+R89
+R32
+R50
+L51
+L577
+R269
+R857
+R12
+L12
+L33
+L26
+L843
+L81
+L660
+R45
+L86
+R33
+L87
+L69
+R40
+R616
+R6
+L9
+R16
+L60
+R90
+L36
+L54
+R22
+R111
+R67
+L56
+L44
+R48
+L65
+L92
+R459
+L50
+L45
+L55
+R70
+L57
+L38
+R43
+R82
+R39
+R61
+L58
+L703
+R40
+L84
+R876
+L80
+R922
+R28
+L912
+L29
+R3
+R5
+R992
+R54
+L59
+R56
+R49
+R57
+L87
+L64
+L888
+R43
+R28
+L41
+L648
+R14
+L14
+R10
+L11
+L48
+L51
+L26
+R95
+L78
+L18
+L652
+R29
+R13
+L63
+L53
+R53
+L77
+L39
+R16
+L63
+L22
+R26
+R59
+R305
+R95
+R41
+R15
+R444
+L72
+R60
+R212
+R90
+L890
+L20
+R46
+R74
+R875
+L35
+L73
+L552
+L15
+L12
+R9
+R71
+L10
+R49
+R561
+L43
+L25
+L37
+R15
+L36
+R58
+R81
+R69
+R5
+R145
+L27
+L88
+L3
+L82
+L47
+L795
+R18
+L7
+R31
+R61
+R64
+L26
+R28
+L27
+L179
+L85
+L95
+L381
+L983
+R86
+R39
+R496
+R2
+R33
+R63
+L96
+L64
+L4
+R92
+R57
+L81
+L93
+R4
+L91
+R64
+R39
+R98
+L46
+L91
+L52
+R91
+L423
+L68
+L932
+L65
+R629
+L502
+L36
+R82
+L8
+L89
+R37
+R533
+R19
+R31
+L431
+L60
+L440
+L56
+R64
+R2
+R10
+R38
+L52
+L906
+L70
+L93
+R463
+L22
+R83
+L69
+L92
+R75
+L26
+L149
+L4
+R4
+R67
+R78
+L870
+R8
+L73
+R52
+R38
+L47
+R47
+L9
+L791
+R211
+L99
+L90
+R58
+R648
+L44
+R66
+L928
+R90
+R88
+L21
+L79
+R65
+R36
+L38
+R637
+L31
+L15
+L69
+L85
+R93
+R68
+R39
+R19
+L6
+L13
+R36
+L36
+R1
+R199
+R66
+L66
+L841
+R41
+R33
+R22
+R45
+R6
+L6
+L20
+L39
+L41
+R15
+R85
+R22
+L9
+R83
+L79
+L59
+R43
+L33
+R32
+R80
+R644
+L335
+L22
+R510
+R614
+R9
+L92
+L108
+R1
+L1
+L438
+R81
+L43
+L44
+L756
+R22
+L753
+R15
+R845
+R71
+L6
+R66
+L42
+R82
+L85
+R83
+R33
+L31
+R81
+R39
+R35
+L47
+R92
+L970
+L523
+R22
+R580
+L9
+R5
+L39
+L66
+L52
+R94
+L90
+R48
+R981
+L81
+R942
+R244
+L56
+R52
+L182
+L25
+R25
+R375
+L75
+L85
+R65
+L65
+R65
+L34
+L53
+R37
+R70
+L479
+R468
+R529
+L134
+R116
+R661
+R634
+R134
+R307
+L15
+L21
+L31
+R531
+L89
+R84
+L695
+L70
+R63
+R36
+L49
+L80
+R57
+R96
+R18
+R29
+R14
+R86
+R2
+L54
+L71
+R522
+R20
+L365
+R28
+R1
+R17
+R42
+R58
+R52
+L828
+R70
+R390
+R16
+R41
+R759
+L73
+L68
+R81
+R51
+L16
+L975
+R41
+L82
+L69
+L90
+L757
+L543
+R502
+R80
+L82
+R3
+L53
+R50
+L978
+R78
+R54
+L254
+R25
+R75
+L21
+R68
+L49
+R2
+R82
+R17
+L9
+L283
+R393
+L78
+L22
+L15
+L985
+R5
+R197
+L3
+R1
+L3
+R91
+R76
+R95
+L63
+R72
+R27
+L46
+R51
+R65
+L67
+R902
+R99
+L40
+L516
+L43
+L78
+L41
+R19
+L3
+L321
+L8
+L30
+R510
+L26
+L75
+R59
+R43
+R51
+R84
+R26
+R23
+L32
+R88
+R11
+L36
+L64
+L89
+R83
+R96
+L90
+L3
+R69
+L66
+R42
+R58
+R65
+R7
+L10
+R38
+R94
+R5
+R1
+R99
+R232
+L33
+L98
+L5
+R5
+L88
+R20
+R5
+R63
+L615
+L806
+L32
+R53
+L36
+R36
+L36
+L64
+R44
+L90
+L45
+R91
+L29
+R98
+R4
+L73
+R3
+L54
+L63
+R14
+L70
+L430
+R71
+R63
+L34
+R47
+L647
+R25
+L8
+R86
+L190
+L13
+L54
+R54
+L6
+L78
+R33
+L49
+L85
+R62
+L77
+R495
+R5
+R30
+L71
+L959
+L85
+L12
+L3
+R19
+L350
+L97
+R89
+L441
+R954
+L72
+R66
+R35
+L3
+L4
+L46
+R50
+R78
+R46
+L87
+L34
+L77
+R46
+L21
+L964
+R109
+L7
+L35
+L92
+R98
+R56
+R89
+R29
+L28
+R35
+R659
+L32
+L510
+R42
+L47
+R47
+R872
+L95
+R80
+L8
+L39
+R90
+L5
+L95
+L303
+L97
+R25
+R75
+R810
+L43
+R33
+R80
+L15
+R79
+L49
+L63
+L64
+R679
+L18
+L86
+R735
+R22
+L4
+L922
+L74
+L80
+R80
+R19
+L59
+R40
+R41
+R59
+L39
+R539
+L59
+R959
+R31
+R73
+L76
+R272
+L78
+L99
+L649
+R55
+L29
+L45
+R45
+L58
+L42
+L427
+L46
+L98
+R876
+L405
+L69
+L31
+L51
+L49
+R88
+R43
+R81
+R75
+R849
+R75
+R89
+L514
+R14
+L1
+L489
+L21
+L89
+R53
+L44
+L9
+L95
+R803
+R92
+L8
+R158
+L15
+R34
+L69
+L38
+R38
+R60
+R712
+L126
+L14
+L13
+L11
+R49
+L66
+L14
+R23
+L94
+R7
+L8
+R95
+L661
+R561
+L20
+L180
+L9
+R52
+R57
+R43
+L43
+R91
+L91
+R31
+L631
+L18
+R18
+R79
+R21
+R35
+L9
+L26
+L1
+R1
+L924
+L976
+L72
+L22
+L905
+R813
+R129
+L45
+L20
+L82
+R64
+R97
+L47
+L10
+L92
+L8
+L243
+L757
+L19
+L81
+R98
+L98
+R98
+L275
+L23
+L25
+L921
+L66
+R12
+L5
+R205
+R91
+L10
+R36
+R34
+R81
+R68
+L35
+R44
+R60
+R18
+L93
+L94
+R71
+R1
+L72
+L18
+L82
+L38
+R34
+R4
+R69
+L16
+R650
+R88
+L291
+L41
+L10
+R66
+L44
+R75
+R93
+R82
+L21
+R51
+R49
+L849
+R92
+R57
+R69
+R62
+R86
+L19
+L598
+L33
+R91
+L92
+R534
+R12
+L96
+L35
+R19
+R57
+R643
+R32
+R69
+L85
+L17
+R45
+L72
+R827
+R98
+R935
+R68
+R97
+L21
+R79
+R37
+L92
+L18
+R43
+L21
+L76
+R72
+L357
+R62
+L5
+L33
+L74
+L93
+L11
+R54
+L43
+L5
+R41
+R32
+L68
+L584
+L16
+R8
+L17
+R40
+L31
+R82
+R18
+L12
+R60
+R91
+R22
+R77
+R33
+L71
+R9
+R91
+L87
+L98
+R85
+R399
+L57
+L24
+R82
+L405
+L68
+L943
+L76
+L65
+L643
+R15
+L215
+L597
+R7
+L10
+R94
+R26
+L64
+R44
+L52
+R23
+R29
+R5
+R577
+R680
+R36
+L98
+R662
+R92
+L98
+L76
+L55
+R41
+L59
+L7
+L74
+R74
+L53
+L84
+L12
+L851
+L618
+L71
+L90
+R79
+R410
+L10
+L90
+L10
+L325
+L50
+L39
+R77
+L565
+R402
+L15
+R96
+R29
+L23
+R794
+R872
+L32
+L71
+R89
+R54
+L84
+R4
+R87
+R804
+R96
+L429
+L81
+L53
+L339
+R2
+R62
+R92
+R24
+R97
+L75
+L443
+L57
+L10
+L104
+L16
+R30
+L21
+R921
+L35
+R62
+R43
+R748
+R82
+R13
+R87
+L828
+L14
+L89
+R567
+L36
+R15
+L15
+R99
+L61
+R74
+R56
+R68
+R51
+R82
+L757
+R88
+L97
+L71
+L432
+L62
+L88
+L76
+L74
+R47
+R38
+L85
+L690
+R90
+L98
+L7
+R5
+L792
+R75
+L83
+L60
+L40
+R89
+R45
+R66
+R88
+R90
+L57
+R1
+R67
+L89
+L66
+L939
+R605
+L13
+L87
+L36
+L87
+R905
+R81
+R62
+R75
+L316
+L54
+R80
+L113
+L195
+L202
+R74
+L47
+L27
+R31
+R48
+R79
+R487
+R84
+L29
+L8
+R8
+R76
+L76
+L96
+R96
+L44
+L8
+L48
+R869
+L469
+R44
+R56
+L30
+R78
+L948
+R346
+R29
+L75
+L53
+L38
+R568
+R23
+L39
+L76
+L72
+R225
+R23
+R129
+L25
+L4
+L61
+L3
+R70
+R76
+L78
+R35
+L11
+R8
+L91
+R52
+R565
+R77
+L11
+R23
+R723
+R17
+R7
+R41
+R35
+R265
+R95
+R80
+L75
+R52
+R24
+R73
+L49
+R19
+R950
+L169
+L9
+R85
+L76
+R792
+L82
+L518
+L62
+R63
+L11
+L95
+L540
+R20
+R39
+R94
+L48
+L18
+L34
+L1
+L54
+R17
+R938
+R15
+R75
+L84
+R94
+L72
+L228
+L77
+L523
+L28
+R25
+R3
+R3
+R48
+L51
+L739
+L27
+L75
+L10
+L36
+L38
+L74
+L73
+R35
+L520
+L18
+L25
+L9
+R13
+L998
+R603
+R91
+R986
+L22
+L54
+L510
+L2
+R2
+R47
+R206
+R951
+R93
+R3
+R921
+R18
+L5
+R71
+R889
+L9
+L57
+L11
+L874
+R81
+R15
+L639
+R825
+R407
+R16
+L48
+L31
+R32
+L5
+R933
+R64
+L693
+R52
+R11
+L9
+L54
+L21
+L14
+R30
+R31
+R474
+R78
+L13
+L686
+L39
+R36
+L76
+L37
+R26
+L7
+R918
+R79
+R37
+L16
+L25
+L22
+L624
+R10
+R781
+R58
+R14
+R94
+L4
+L320
+L627
+L363
+L88
+L50
+R27
+L6
+R45
+L76
+L6
+R71
+R11
+R84
+L91
+L93
+R8
+R87
+L95
+R684
+L91
+R11
+R96
+L7
+L521
+R28
+R327
+R340
+L63
+R25
+R793
+R15
+L987
+L28
+R97
+R31
+L2
+L564
+R112
+L934
+L62
+L78
+R61
+L83
+L33
+L45
+L822
+R94
+R6
+L93
+R89
+R77
+R27
+L16
+L22
+R38
+R526
+R748
+R8
+R718
+R703
+L48
+R35
+L90
+L99
+R8
+R34
+R557
+R2
+L7
+R75
+L90
+L80
+L74
+L521
+L5
+L590
+L34
+R80
+L99
+L73
+R16
+L95
+L70
+L79
+L93
+L16
+L9
+L38
+L89
+R40
+L21
+R85
+L87
+R72
+R5
+L5
+L7
+R25
+L3
+L15
+R86
+L791
+L53
+R89
+L7
+R43
+R33
+L32
+R47
+R85
+L19
+L81
+L259
+R86
+L18
+L9
+L5
+R5
+R53
+R58
+R346
+L57
+L26
+L203
+L71
+R51
+R359
+L86
+L97
+L29
+L32
+L82
+R816
+L59
+L4
+L37
+R97
+L18
+L779
+R27
+L27
+L26
+L1
+R27
+L643
+L27
+R45
+R25
+R105
+R37
+R67
+R39
+L335
+R32
+L47
+R244
+R638
+L32
+L13
+L9
+L52
+R98
+R74
+L116
+L30
+R55
+L55
+R25
+L44
+L65
+L16
+L867
+L58
+R62
+L324
+L48
+L27
+L20
+L18
+L35
+R10
+R61
+L11
+R75
+L82
+L18
+L674
+R24
+L7
+L84
+R10
+R431
+R42
+R51
+L99
+L72
+R30
+R142
+R6
+L76
+R76
+R40
+L97
+R49
+L526
+L69
+L97
+R70
+L827
+R8
+L11
+L40
+L841
+L86
+R47
+L71
+R88
+L37
+L58
+L280
+R58
+L3
+L17
+L54
+R54
+L24
+R24
+R44
+L74
+L70
+L69
+R69
+L87
+L13
+L20
+L18
+L47
+R56
+L28
+L817
+L90
+R64
+R157
+R86
+R68
+L85
+R2
+R15
+L84
+L29
+L30
+L160
+L742
+R497
+L995
+L41
+R97
+L73
+L59
+R73
+L597
+L17
+L36
+R97
+R56
+R42
+R58
+L818
+L82
+R902
+L202
+R96
+L84
+R57
+R19
+R12
+L939
+R585
+R54
+L14
+L735
+L446
+L5
+R58
+L56
+R868
+R522
+L72
+R80
+L64
+L101
+L4
+L51
+R375
+L71
+L68
+L56
+L51
+R885
+R35
+L29
+R79
+R721
+R70
+R430
+L16
+L84
+R28
+L65
+R21
+L84
+R31
+L15
+L28
+L346
+R258
+R95
+L44
+L9
+R58
+L674
+R80
+R2
+L51
+R25
+L82
+L43
+R7
+R58
+L65
+R71
+R72
+R3
+L8
+L95
+R582
+R18
+L20
+R53
+L528
+L705
+L76
+L24
+L87
+R87
+L69
+L58
+L27
+R54
+L77
+R77
+R60
+L60
+L46
+L19
+R72
+L68
+L39
+L17
+R29
+L12
+R46
+L17
+L29
+R90
+R99
+L95
+L94
+L26
+L44
+L30
+R97
+R3
+L27
+L60
+R87
+R62
+R38
+R32
+L70
+L62
+R96
+R14
+R41
+L36
+L15
+L71
+R71
+L53
+R53
+L30
+L53
+R83
+R11
+L48
+R50
+R28
+L16
+L7
+R37
+L28
+R14
+R14
+R50
+R42
+R41
+R2
+L10
+R26
+R26
+R49
+L47
+R30
+R24
+R14
+R8
+R30
+R15
+R47
+R9
+L27
+L32
+R17
+R46
+L34
+R40
+R43
+R25
+L3
+L17
+L4
+L3
+R15
+L50
+R9
+L5
+R40
+L7
+R40
+L15
+R20
+R45
+R39
diff --git a/input/test-day1.txt b/input/test-day1.txt
new file mode 100644
index 0000000..53287c7
--- /dev/null
+++ b/input/test-day1.txt
@@ -0,0 +1,10 @@
+L68
+L30
+R48
+L5
+R60
+L55
+L1
+L99
+R14
+L82
diff --git a/src/Day1.asm b/src/Day1.asm
index 6203572..ba5eb57 100644
--- a/src/Day1.asm
+++ b/src/Day1.asm
@@ -1,22 +1,282 @@
-; Advent of Code 2025 - Day 1
+; Advent of Code 2025 - Day 1.1
+
+; #include <stddef.h>
+; #include <stdio.h>
+; #include <stdlib.h>
+; #include <stdint.h>
+;
+; int main(void)
+; {
+; FILE* input = fopen("input/day1.txt", "r");
+;
+; int32_t angle = 50;
+; int32_t password = 0;
+;
+; char line[256];
+; while (fgets(line, sizeof(line), input))
+; {
+; int32_t direction = (line[0] == 'L') ? -1 : 1;
+; int32_t steps = atoi(line + 1);
+;
+; angle += direction * steps;
+; angle = (angle % 100 + 100) % 100;
+;
+; if (angle == 0)
+; password++;
+; }
+;
+; fclose(input);
+; printf("Password: %d\n", password);
+; }
global _start
-%define SYS_EXIT 1
-%define SYS_WRITE 4
+%define SYS_EXIT 1
+%define SYS_READ 3
+%define SYS_WRITE 4
+%define SYS_OPEN 5
+%define SYS_CLOSE 6
+
+%define O_RDONLY 0
+%define STDOUT 1
section .data
- message: db "Hello World!", 0xA
- messageLen: equ $-message
+ inputPath db "input/day1.txt", 0
+ newline db 10 ; '\n'
+
+ angle dd 50 ; initial angle
+ password dd 0 ; result counter
+
+section .bss
+ buffer resb 4096 ; chunk read buffer
+ lineBuffer resb 256 ; one line max 255 chars + NUL
+ numberBuffer resb 16 ; for PrintInt
+ lineLen resd 1 ; current line length
section .text
+
_start:
+ ; open file
+ mov eax, SYS_OPEN
+ mov ebx, inputPath
+ mov ecx, O_RDONLY
+ int 0x80
+
+ mov esi, eax ; fd in ESI
+ mov dword [lineLen], 0 ; no chars in current line yet
+
+ReadLoop:
+ ; read up to 4096 bytes
+ mov eax, SYS_READ
+ mov ebx, esi
+ mov ecx, buffer
+ mov edx, 4096
+ int 0x80
+
+ cmp eax, 0
+ jle EOF ; 0 or negative = EOF or error
+
+ mov edi, buffer ; scan pointer
+ mov ecx, eax ; bytes remaining in this chunk
+
+ScanChunk:
+ cmp ecx, 0
+ je ReadLoop ; chunk done, read next
+
+ mov al, [edi]
+
+ ; windows can be a fucking bitch
+ ; handle CR (13) -> just skip
+ cmp al, 13
+ je SkipCR
+
+ ; handle LF (10) -> end of line
+ cmp al, 10
+ je EndOfLine
+
+ ; normal character: append to lineBuffer if space left
+ mov edx, [lineLen]
+ cmp edx, 255 ; leave 1 byte for NUL
+ jae SkipStore ; ignore extra chars if too long
+ mov [lineBuffer + edx], al
+ inc edx
+ mov [lineLen], edx
+
+SkipStore:
+ inc edi
+ dec ecx
+ jmp ScanChunk
+
+SkipCR:
+ inc edi
+ dec ecx
+ jmp ScanChunk
+
+EndOfLine:
+ ; terminate current line
+ mov edx, [lineLen]
+ mov byte [lineBuffer + edx], 0
+
+ ; if line isn't empty, process it
+ cmp edx, 0
+ je LineDone
+
+ push esi
+ mov esi, lineBuffer
+ call HandleLine
+ pop esi
+
+LineDone:
+ mov dword [lineLen], 0 ; reset line length
+ inc edi
+ dec ecx
+ jmp ScanChunk
+
+; process last line if not newline-terminated, then print result
+EOF:
+ ; if there is a partial line at EOF, process it
+ mov edx, [lineLen]
+ cmp edx, 0
+ jle FinishEOF
+ mov byte [lineBuffer + edx], 0
+
+ push esi
+ mov esi, lineBuffer
+ call HandleLine
+ pop esi
+
+FinishEOF:
+ mov eax, [password]
+ call PrintInt
+
+ ; newline after result
mov eax, SYS_WRITE
- mov ebx, 1
- mov ecx, message
- mov edx, messageLen
+ mov ebx, STDOUT
+ mov ecx, newline
+ mov edx, 1
+ int 0x80
+
+ ; close file and exit
+ mov eax, SYS_CLOSE
+ mov ebx, esi
int 0x80
mov eax, SYS_EXIT
xor ebx, ebx
int 0x80
+
+
+; Handle one line: ESI -> "L123" or "R45"
+HandleLine:
+ mov al, [esi]
+ cmp al, 'L'
+ je .left
+ mov ebx, 1 ; direction = +1 for 'R' or anything else
+ jmp .after
+.left:
+ mov ebx, -1 ; direction = -1 for 'L'
+.after:
+ inc esi ; skip 'L' or 'R'
+ call ParseInt ; EAX = steps
+
+ imul eax, ebx ; EAX = dir * steps
+
+ mov edx, [angle]
+ add edx, eax ; update angle (can be out of range, signed)
+
+ ; normalize edx into [0, 100[ using repeated +/-100 (no division)
+NormLoop:
+ cmp edx, 0
+ jl NormAdd
+ cmp edx, 100
+ jl NormDone
+ sub edx, 100
+ jmp NormLoop
+
+NormAdd:
+ add edx, 100
+ jmp NormLoop
+
+NormDone:
+ mov [angle], edx
+
+ cmp edx, 0
+ jne .done
+ mov eax, [password]
+ inc eax
+ mov [password], eax
+.done:
+ ret
+
+; ParseInt: - parse decimal number at [ESI] into EAX
+; - stops at first non-digit
+ParseInt:
+ xor eax, eax ; result = 0
+
+.parseLoop:
+ mov dl, [esi]
+ cmp dl, '0'
+ jl .done
+ cmp dl, '9'
+ jg .done
+
+ sub dl, '0' ; digit value 0..9
+ movzx edx, dl
+
+ imul eax, eax, 10 ; result *= 10
+ add eax, edx ; result += digit
+
+ inc esi
+ jmp .parseLoop
+
+.done:
+ ret
+
+; PrintInt: print unsigned integer in EAX to stdout
+PrintInt:
+ mov edi, numberBuffer+15 ; write digits from the end
+ mov byte [edi], 0 ; terminator
+ dec edi
+
+ cmp eax, 0
+ jne .convert
+ mov byte [edi], '0'
+ jmp .finish
+
+.convert:
+ ; we will repeatedly compute:
+ ; q = eax / 10
+ ; r = eax % 10
+ ; using only subtraction
+.nextDigit:
+ mov edx, eax ; tmp = current value
+ mov ecx, 0 ; q = 0
+
+ cmp edx, 10
+ jb .lastDigit ; if < 10, quotient = 0, remainder = edx
+.subLoop:
+ sub edx, 10
+ inc ecx ; q++
+ cmp edx, 10
+ jae .subLoop ; while tmp >= 10
+.lastDigit:
+ ; now:
+ ; ecx = quotient
+ ; edx = remainder (0..9)
+ add dl, '0'
+ mov [edi], dl ; store digit
+ dec edi
+
+ mov eax, ecx ; eax = quotient
+ test eax, eax
+ jnz .nextDigit ; more digits to extract?
+
+ inc edi ; move to first digit
+.finish:
+ mov eax, SYS_WRITE
+ mov ebx, STDOUT
+ mov ecx, edi
+ mov edx, numberBuffer+15
+ sub edx, edi ; length
+ int 0x80
+ ret