# Tugas Pendahuluan Modul 2
Pembuat soal : AX
```text
Nama : Raihan Muhammad Nafis Al-Kautsar
NPM : 2406413451
```
## 1. Sebutkan beberapa perbedaan dari assembly yang kalian pernah belajar pada mata kuliah OAK dengan assembly yang digunakan pada arduino (5 poin)
Perbedaannya adalah pada penggunaan kode yang dimana pada OAK, assembly lebih ditujukan pada hardware x86/x64 yang menggunakan CISC (Complex Instruction Set Computer). Tipe CISC ini membuat satu line instruction di assembly dapat melakukan banyak hal sekaligus dan dilakukan dalam banyak cycle.
Sedangkan, pada assembly yang digunakan pada Arduino menggunakan RISC (Reduced Instruction Set Computer) dimana hal yang dapat dilakukan dalam satu buah instruction lebih terbatas dibadingkan dengan CISC dan hanya menjalankan instruction satu cycle saja.
### Referensi
1. GeeksforGeeks, “RISC and CISC in Computer Organization,” GeeksforGeeks, Jul. 23, 2018. https://www.geeksforgeeks.org/computer-organization-architecture/computer-organization-risc-and-cisc/
2. E. Roberts, “RISC vs. CISC,” Stanford.edu, 2019. https://cs.stanford.edu/people/eroberts/courses/soco/projects/risc/risccisc/
## 2. Isi tabel berikut (Ini akan mempermudah anda pada praktikum kedepannya) (15 poin)
| Register | Nama Lengkap | Fungsi | Penjelasan Bit | Contoh Pemakaian |
| :--- | :--- | :--- | :--- | :--- |
| DDRx | Data Direction Register | Mengatur arah pin sebagai Input atau Output | Bit = 0: Input, Bit = 1: Output | `SBI DDRB, 5` |
| PORTx (saat DDRx = 1) | Data Register | Mengatur output untuk sebuah pin fisik | Bit = 1: Output pin HIGH (1),<br> Bit = 0: Output pin LOW (0) | `CBI DDRB, 3`<br>`CBI PORTB, 3` |
| PORTx (saat DDRx = 0) | Data Register | Mengatur jenis input untuk pin fisik | Bit = 1: Input dengan resistor internal (internal pull-up),<br> Bit = 0: Floating, dimana resistor pull-up/pull-down akan diatur dari luar AVR (rangkaian eksternal) | `SBI DDRB, 3`<br>`SBI PORTB, 3` |
| PINx | Input Pins Address | Membaca input dari pin fisik | Bit = 1: Membalikkan hasil baca bit input saat ini (dari 1 ke 0 dan sebaliknya) | `SBI DDRB, 6`<br>`SBI PORTB, 6`<br>`IN R20, PINB` |
### Referensi
1. E. Team, “AKSES INPUT OUTPUT (I/O) AVR,” elektro-kontrol.blogspot.com, Apr. 13, 2011. https://electrocontrol.wordpress.com/2011/04/13/aksesioavr/
2. GPIO Ports and Registers in AVR ATmega16/ATmega32 | AVR ATmega Co..,” www.electronicwings.com. https://www.electronicwings.com/avr-atmega/atmega1632-gpio-ports-and-registers
## 3. Jelaskan Sebanyak - banyaknya Instruction Set dengan rinci pada tabel di bawah ini. (Ini akan mempermudah anda pada praktikum kedepannya) (15 poin)
| Mnemonic | Operand | Deskripsi | Contoh Pemakaian |
| :--- | :--- | :--- | :--- |
| LDI | Rd, K | Load Immediate - Memuat nilai konstanta 8-bit (K) ke register tujuan (Rd). Hanya bisa digunakan untuk register R16-R31. | `LDI R16, 0xFF` |
| ADC | Rd,Rr ; 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 | ADD with Carry - Menambahkan nilai yang ada di register berbeda dengan menyertakan carry | `ADC R16, R18` |
| ADD | Rd,Rr ; 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 | ADD - Menambahkan 2 nilai pada 2 register berbeda dan menyimpannya di register pertama | `ADD R16, R20` |
| AND | Rd,Rr ; 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 | Logika AND - melakukan operasi AND pada nilai di 2 register dan menyimpannya di register pertama | `AND R21, R23` |
| ANDI | Rd,K; 16 ≤ d ≤ 31, 0 ≤ K ≤ 255 | AND Immediate - Melakukan operasi AND pada register d dengan konstanta k dan menyimpannya di register d | `ANDI R16, 0xAF` |
| ASR | Rd; 0 ≤ d ≤ 31 | Arithmetic Shift Right - Melakukan shift right terhadap nilai di register d | `ASR R17` |
| BREQ | k; -64 ≤ k ≤ +63 | Branch if Equal - melakukan branching ketika nilai setara atau flag Z (equal) bernilai 1 | `BREQ 0xFE` |
| BREAK | - | break - Menghentikan program dan memasuki debigging mode | `BREAK`|
| CBI | A,b | Clear Bit I/O - set bit untuk port/ddr/pin b menjadi 0 | `CBI PORTA, 2` |
| CLC | - | Clear Carry Flag - clear flag C menjadi 0 | `SEV` |
| CLV | - | Clear Overflow Flag - clear flag V menjadi 0 | `CLV` |
| CLZ | - | Clear Overflow Flag - clear flag Z menjadi 0 | `CLZ` |
| COM | Rd | One's Complement - Melakukan operasi one's Complement ke nilai di register d | `COM R23` |
| CP | Rd,Rr | Compare - Membandingkan isi dari 2 buah register | `CP R20, R28` |
| CPI | Rd,K | Compare with Immediate - Membandingkan nilai di register d dengan nilai K | `CPI R17, 0xF` |
| DEC | Rd | Decrement - Mengurangi nilai di register d sebanyak 1 dan menyimpan hasilnya di register yang sama | `DEC R28` |
| EOR | Rd, Rr | XOR - Melakukan operasi XOR kepada 2 nilai di register d dan r, kemudian menyimpannya di Rd | `EOR R21, R18` |
| IN | Rd, A | Load I/O location - Memuat data dari I/O ke register d | `IN R23, 0x16` |
| INC | Rd | Increment - Menambahkan nilai 1 kepada nilai di register d | `INC R29` |
| LSL | Rd | Logical Shift Left - Logical Shift bit data di register d ke arah kiri | `LSL R20` |
| LSR | Rd | Logical Shift Right - Logical Shift bit data di register d ke arah kanan | `LSL R20` |
| MOV | Rd, Rr | Copy Register - Menyalin nilai di register r dan menyimpannya di register d | `MOV R18 , R21` |
| MUL | Rd, Rr | Unsigned bit Multiplication - Perkalian untuk unsigned bit | `MUL R21, R22` |
| MULS | Rd, Rr | Signed bit Multiplication - Perkalian untuk signed bit | `MULS R23, R25` |
| MULSU | Rd, Rr | Multiplying unsinged bit with signed bit - Mengalikan signed bit dengan unsigned bit dan menyimpannya sebagai signed bit | `MULSU R17, R20` |
| NEG | Rd | Two's Complement - Melakukan two's complement kepada bilangan di register d | `NEG R19` |
| NOP | - | No Operation - Tidak melakukan apapun selama 1 cycle | `NOP` |
| OR | Rd, Rr | OR - Melakukan logika OR untuk register d dan r kemudian menyimpannya di register d | `OR R24` |
| ORI | Rd, K | OR with Immediate - Melakukan logika OR untuk nilai di register d dengan konstanta K dan menyimpan hasilnya di register d | `ORI R16, 0xF` |
| OUT | A, Rr | Store register to I/O - Menyimpan nilai yang ada di register ke I/O | `OUT 0x18, R20` |
| ROL | Rd | Rotate Left - Melakukan operasi rotate left dengan memanfaatkan carry untuk nilai bit di register d | `ROL R23` |
| ROR | Rd | Rotate Right - Melakukan operasi rotate right dengan memanfaatkan carry untuk nilai bit di register d | `ROR R23` |
| SBC | Rd, Rr | Substract with Carry - Mengurangi nilai di register d dan register r dengan memperhitungkan carry (C Flag) dan menyimpan hasilnya di register d | `SBC R20, R16` |
| SBI | A,b | Set Bit I/O - set bit untuk port/ddr/pin b menjadi 1 | `SBI PORTA, 2` |
| SEC | - | Set Carry Flag - set flag C menjadi 1 | `SEC` |
| SEV | - | Set Overflow Flag - set flag V menjadi 1 | `SEV` |
| SEZ | - | Set Zero Flag - set flag Z menjadi 1 | `SEV` |
| SLEEP | - | Sleep - Membuat rangkaian memasukki sleep mode | `SLEEP` |
| SUB | Rd, Rr | Subtract - Melakukan operasi pengurangan pada nilai di register d dan r kemudian menyimpan hasilnya di register d | `SUB R24` |
| SUBI | Rd, K | Subtract with Immediate - Melakukan operasi pengurangan terhadap nilai di register d dengan K | `SUBI R25, 10` |
| SWAP | Rd | Swap Nibble - Melakukan Swap untuk nibble HIGH menjadi LOW dan sebaliknya pada register d | `SWAP R18` |
| TST | Rd | Test for Zero or Minus - Melakukan test untuk mengecek apakah nilai di register d adalah negatif atau 0 | `TST R20` |
| WDR | - | Watchdog Timer Reset - melakukan reset pada watchdog timer dari MCU | `WDR` |
### Referensi
1. “AVR ® Instruction Set Manual AVR ® Instruction Set Manual.” Available: https://ww1.microchip.com/downloads/en/DeviceDoc/AVR-Instruction-Set-Manual-DS40002198A.pdf
2. M. Harditya and M. N. Faza, "MODUL 1: ASSEMBLY WITH ARDUINO". Digital Laboratory FTUI, 2024. Accessed: Feb. 07, 2026. [Online]. Available: https://drive.google.com/file/d/1cpx6xfgYUv8_mlxX13FcxF_ieHUXVZaC/view
## 4. Jelaskan salah satu cara untuk menerapkan delay tanpa library external, sertakan kode (5 poin)
Salah satu cara yang bisa dilakukan adalah dengan menggunakan loop yang berisi decrement dari nilai yang ada di register tertentu. Operasi decrement sendiri membutuhkan waktu 1 us untuk di execute, sehingga kita perlu melakukan banyak decrement di dalam loopnya. Namun, tentunya ada keterbatasan dimana di dalam satu kali loop, sebuah register hanya mampu menyimpan angka antara 0 - 255 sehingga diperlukan nested loop agar cara ini dapat berhasil.
contoh:
```
LDI R20, 2
loop1: LDI R21, 150
loop2: LDI R22, 216
loop3: LDI R23, 9
loop4: DEC R23
BRNE loop4
DEC R22
BRNE loop3
DEC R21
BRNE loop2
DEC R20
BRNE loop1
```
### Referensi
1. “AVR Tutorials - Assembly Delay Subroutine,” www.rjhcoding.com. http://www.rjhcoding.com/avr-asm-delay-subroutine.php
2. M. Harditya and M. N. Faza, "MODUL 1: ASSEMBLY WITH ARDUINO". Digital Laboratory FTUI, 2024. Accessed: Feb. 07, 2026. [Online]. Available: https://drive.google.com/file/d/1cpx6xfgYUv8_mlxX13FcxF_ieHUXVZaC/view
3. GeeksforGeeks, “Time Delay in AVR Microcontroller,” GeeksforGeeks, Dec. 18, 2020. https://www.geeksforgeeks.org/electronics-engineering/time-delay-in-avr-microcontroller/
## 5. Jelaskan apa itu Memory Mapped Input Output (MMIO) dan hubungannya dengan AVR assembly yang akan kita lakukan. (5 poin)
Memory Mapped Input Output adalah sistem komputer yang menganggap address dari input/output device sama dengan address register lainnya sehingga penggunaan instruction untuk Input/Output device juga tidak berbeda dengan address untuk memory. Hubungannya dengan AVR assembly disini adalah
kebanyakan kode assembly untuk AVR mengalokasikan address untuk device Input/Output sama dengan memory pada umumnya.
### Referensi:
1. S. Datta, “Memory-Mapped vs. Isolated I/O | Baeldung on Computer Science,” www.baeldung.com, Apr. 19, 2022. https://www.baeldung.com/cs/memory-mapped-vs-isolated-io
2. M. Harditya and M. N. Faza, "MODUL 1: ASSEMBLY WITH ARDUINO". Digital Laboratory FTUI, 2024. Accessed: Feb. 07, 2026. [Online]. Available: https://drive.google.com/file/d/1cpx6xfgYUv8_mlxX13FcxF_ieHUXVZaC/view
## 6. Buatlah sebuah proyek Arduino di https://wokwi.com/ atau dengan Proteus yang dapat men-toggle (kalau sedang menyala maka akan dimatikan, dan sebaliknya) sebuah LED saat sebuah button ditekan! Proyek memiliki file .ino yang kosong dan menerapkan kode assembly di file .S. Cantumkan screenshot rangkaian yang telah kalian buat serta copas kode ke dalam TP yang memiliki Nama&NPM serta komentar pada setiap barisnya. (55 poin)
sketch.ino
```C
extern "C" {
void setup_asm();
void loop_asm();
}
void setup() {
setup_asm();
}
void loop() {
loop_asm();
}
```
main.S
```
; =============================================
; Tugas Pendahuluan 1
; Nama : Raihan Muhammad Nafis Al-Kautsar
; NPM : 2406413451
; =============================================
#define __SFR_OFFSET 0
#include "avr/io.h"
.global setup_asm
.global loop_asm
setup_asm:
SBI DDRB, 4 ; port B 4 / Pin 12 sebagai output LED
CBI DDRB, 5 ; port B 5 / Pin 13 sebagai input Button
SBI PORTB, 5 ; mengatur pull-up internal untuk Port B 5 / pin 13
RET ; kembali ke setup di .ino
loop_asm:
SBIC PINB, 5 ; skip loop saat ini kalau PIN B bit 5 bernilai 0 / Tombol ditekan
RJMP exit_loop ; kembali ke loop Arduino di .ino kalau tidak di tekan
IN R16, PORTB ; membaca input dari pin 13 dan menyimpan hasilnya di register 16
ldi R17, 0x10 ; Mask untuk bit 4 dari port B (00010000)
EOR R16, R17 ; membalik nilai di register 16 dengan logika xor
OUT PORTB, R16 ; memindahkan nilai dari register 16 ke port B untuk mengubah output LED
wait_release:
SBIS PINB, 5 ; skip kalau PIN 13 bernilai 1 / tombol dilepas
RJMP wait_release ; kalau tombol masih ditekan, kode akan loop terus di sini
exit_loop:
RET ; Kembali ke loop Arduino di .ino
```
<div style="display: flex; flex-direction: row; justify-content: center; padding-top: 20px ">
<a href="https://drive.google.com/file/d/1ljuwW_D3xrwsAOrgy2us8wCkBcC1QvLn/view?usp=sharing" style="background: MidnightBlue; color: white; padding: 5px 10px; border-radius: 50px; border: 3px solid; border-color: gray">
Link Project
</a>
</div>