Solusi Permasalahan Bab 4 Kursus Karir Internet dan Database Ilmu Komputer Online Lengkap dari Awal

Solusi Permasalahan Bab 4 Kursus Karir Internet Dan Database Ilmu Komputer Online Lengkap Dari Awal



Permasalahan dan Solusinya

1) Tulis program bahasa rakitan yang dimulai dari $0200 untuk 6502 µP dan tambahkan nomor 2A94 yang tidak ditandatangani H (tambahkan) ke 2ABF H (Agustus). Biarkan input dan output berada dalam memori. Juga, buatlah dokumen program yang telah dirakit dengan tangan.







Larutan:



CLC
LDA $0213
ADC $0215
STA $0217
LDA $0214
ADC $0216
STA $0218



Program Rakitan:





2) Tulis program bahasa assembly yang dimulai dari $0200, untuk 6502 µP, dan kurangi angka yang tidak ditandatangani, 1569 H (kurangi) dari 2ABF H (Angka yang dikurangi). Biarkan input dan output berada dalam memori. Juga buatlah dokumen program yang telah dirakit, dengan tangan.



Larutan:

DETIK
LDA $0213
SBC $0215
STA $0217
LDA $0214
SBC $0216
STA $0218

Program Rakitan:

3) Tulis program bahasa assembly untuk 6502 µP yang menghitung dari $00 hingga $09 menggunakan loop. Program ini harus dimulai pada $0200. Juga, buatlah dokumen program yang telah dirakit dengan tangan.

Larutan:

LDA #$09
STA $0220 ; untuk membandingkan X dan $09
LDX #$00
lingkaran INX
CPX $0220
lingkaran BNE

Program Rakitan:

4) Tulis program bahasa assembly yang dimulai dari $0200 untuk 6502 µP. Program ini memiliki dua subrutin. Subrutin pertama menambahkan angka 0203 yang tidak ditandatangani H (Agustus) dan 0102 H (menambahkan). Subrutin kedua menambahkan jumlah dari subrutin pertama yaitu 0305 H ke 0006 H (Agustus). Hasil akhirnya disimpan dalam memori. Panggil subrutin pertama yaitu FSTSUB dan subrutin kedua yaitu SECSUB. Biarkan input dan output berada dalam memori. Juga, buatlah dokumen program yang telah dirakit untuk keseluruhan program dengan tangan.

Larutan:

SECSUB CLC
LDA $021A
ADC $0234
STA $0236
LDA $021M
ADC $0235
STA $0237
RTS

FSTSUB CLC
LDA $0216
ADC $0218
STA $021A
LDA $0217
ADC $0219
STA $021B
RTS

JSR FSTSUB

Program Rakitan:

5) Mengingat bahwa an ¯IRQ handler menambahkan $02 ke $01 di akumulator sebagai penanganan inti sementara ¯NMI diterbitkan, dan inti penanganannya ¯NMI menambahkan $05 hingga $04 di akumulator, tulis bahasa rakitan untuk kedua penangan termasuk panggilan mereka. Panggilan ke ¯IRQ handler harus berada di alamat $0200. Itu ¯IRQ handler harus dimulai pada alamat $0300. Itu ¯NMI handler harus dimulai pada alamat $0400. Hasil dari ¯IRQ handler harus diletakkan di alamat $0500, dan hasilnya ¯NMI handler harus diletakkan di alamat $0501.

Larutan:

NMISR PHA; Rutinitas NMI dimulai di sini di alamat $0400
PHX
PHY
;
LDA #$04
ADC #$05
STA $0501
;
LAPIS
tolong
TPR
RTI

ISR PHA; instruksi ini ada di alamat $0300
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR : dikomentari karena bukan bagian dari rutinitas
STA $0500 ; akan masuk ke tumpukan
;
LAPIS
tolong
TPR
RTI
;
JMP ISR ; instruksi ini ada di alamat $0200

6) Jelaskan secara singkat bagaimana instruksi BRK digunakan untuk menghasilkan interupsi perangkat lunak pada komputer 65C02.

Larutan:

Cara utama untuk melakukan interupsi perangkat lunak untuk 65C02 µP adalah dengan menggunakan instruksi alamat tersirat BRK. Asumsikan program utama sedang berjalan dan menemui instruksi BRK. Sejak saat itu, alamat instruksi selanjutnya di PC harus dikirim ke tumpukan saat instruksi saat ini selesai. Subrutin untuk menangani instruksi perangkat lunak harus dipanggil berikutnya. Subrutin interupsi ini harus mendorong isi register A, X, dan Y ke tumpukan. Setelah inti subrutin dieksekusi, isi register A, X, dan Y harus ditarik kembali dari tumpukan ke registernya dengan menyelesaikan subrutin. Pernyataan terakhir dalam rutinitas adalah RTI. Konten PC juga ditarik kembali dari tumpukan ke PC secara otomatis karena RTI.

7) Menghasilkan tabel yang membandingkan dan membedakan subrutin normal dengan rutin layanan interupsi.

Larutan:

8) Jelaskan secara singkat mode pengalamatan utama 65C02 µP dengan memberikan contoh instruksi bahasa assembly.

Larutan:

Setiap instruksi untuk 6502 berukuran satu byte, diikuti oleh nol atau lebih operan.

Mode Pengalamatan Segera
Dengan mode pengalamatan langsung, setelah operan, adalah nilai dan bukan alamat memori. Nilainya harus diawali dengan #. Jika nilainya dalam heksadesimal, maka “#” harus diikuti dengan “$”. Instruksi pengalamatan langsung untuk 65C02 adalah: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Pembaca harus membaca dokumentasi 65C02 µP untuk mengetahui cara menggunakan instruksi yang tercantum di sini yang belum dijelaskan dalam bab ini. Contoh instruksinya adalah:

LDA #$77

Mode Pengalamatan Absolut
Dengan mode pengalamatan absolut, hanya ada satu operan. Operan ini adalah alamat nilai di memori (biasanya dalam heksadesimal atau label). Ada 64K10 = 65,53610 alamat memori untuk 6502 µP. Biasanya, nilai satu byte ada di salah satu alamat ini. Instruksi pengalamatan absolut untuk 65C02 adalah: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA , STX, STY, STZ, TRB, TSB. Pembaca harus membaca dokumentasi 65C02 µP untuk mengetahui cara menggunakan instruksi yang tercantum di sini serta mode pengalamatan lainnya yang belum dijelaskan dalam bab ini. Contoh instruksinya adalah:

MEREKA $1234

Mode Pengalamatan Tersirat
Dengan mode pengalamatan tersirat, tidak ada operan. Setiap register µP yang terlibat tersirat dalam instruksi. Instruksi pengalamatan tersirat untuk 65C02 adalah: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, PAJAK, TAY, TSX, TXA, TXS, TYA. Contoh instruksinya adalah:

DEX: Kurangi register X sebanyak satu unit.

Mode Pengalamatan Relatif
Mode pengalamatan relatif hanya berhubungan dengan instruksi cabang. Dengan mode pengalamatan relatif, hanya ada satu operan. Nilainya dari -12810 hingga +12710. Nilai ini disebut offset. Berdasarkan tandanya, nilai ini ditambahkan atau dikurangi dari instruksi selanjutnya dari Program Counter ke hasil di alamat instruksi berikutnya yang dituju. Instruksi mode alamat relatif adalah: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Contoh instruksinya adalah:

BNE $7F : (cabang jika Z = 0 di status register, P)

yang menambahkan 127 ke penghitung program saat ini (alamat untuk dieksekusi) dan mulai mengeksekusi instruksi di alamat tersebut. Demikian pula:

BEQ $F9 : (cabang jika Z = : dalam status register, P)

yang menambahkan -7 ke penghitung program saat ini dan memulai eksekusi di alamat penghitung program baru. Operan adalah bilangan komplemen dua.

Pengalamatan Indeks Absolut
Dengan pengalamatan indeks absolut, isi register X atau Y ditambahkan ke alamat absolut yang diberikan (mulai dari $0000 hingga $FFFF, yaitu dari 010 hingga 6553610) untuk mendapatkan alamat sebenarnya. Alamat absolut yang diberikan ini disebut alamat dasar. Jika register X digunakan, instruksi perakitannya kira-kira seperti ini:

LDA $C453,X

Jika register Y yang digunakan maka akan menjadi seperti ini:

LDA $C453,Y

Nilai untuk register X atau Y disebut nilai hitungan atau indeks dan dapat berkisar antara $00 (010) hingga $FF (25010). Itu tidak disebut offset.

Instruksi pengalamatan indeks absolut adalah: ADC, AND, ASL (hanya X), BIT (dengan akumulator dan memori, dengan X saja), CMP, DEC (memori dan X saja), EOR, INC (memori dan X saja), LDA , LDX, LDY, LSR (hanya X), ORA, ROL (hanya X), ROR (hanya X), SBC, STA, STZ (hanya X).

Pengalamatan Tidak Langsung Mutlak
Ini hanya digunakan dengan instruksi lompat. Dengan ini, alamat absolut yang diberikan memiliki alamat penunjuk. Alamat penunjuk terdiri dari dua byte. Penunjuk dua byte menunjuk ke (adalah alamat) nilai byte tujuan dalam memori. Jadi, instruksi bahasa assembly adalah sebagai berikut:

JMP ($3456)

Dengan tanda kurung dan $13 di alamat $3456 sedangkan $EB di alamat $3457 (= $3456 + 1), alamat tujuan adalah $13EB dan $13EB adalah penunjuknya. Absolut $3456 ada dalam tanda kurung dalam instruksi.

9) a) Tulis program bahasa mesin 6502 untuk menuliskan pesan “Aku cinta kamu!” string kode ASCII di memori, dimulai dari alamat $0300 dengan panjang string. Program harus dimulai pada alamat $0200. Dapatkan setiap karakter dari akumulator, dengan asumsi bahwa karakter tersebut dikirim ke sana satu per satu oleh beberapa subrutin. Juga, rakit program dengan tangan. (Jika Anda ingin mengetahui kode ASCII untuk “Aku cinta kamu!”, ini dia: 'I':4916, spasi : 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516, dan '!':2116. Catatan: setiap kode menempati 1 byte).

b) Tulis program bahasa mesin 6502 untuk menuliskan pesan “Aku cinta kamu!” string kode ASCII dalam memori, dimulai dari alamat $0300 tanpa panjang string tetapi berakhir pada 0016. Program harus dimulai pada alamat $0200. Dapatkan setiap karakter dari akumulator, dengan asumsi bahwa karakter tersebut dikirim ke sana satu per satu oleh beberapa subrutin. Juga, rakit program dengan tangan.

Larutan:

a) Strategi: Ada 12 byte untuk string: 1 byte untuk panjang string dan 11 byte untuk string literal. Jadi harus ada 12 iterasi (perulangan) yang dihitung dari 0. Yaitu: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Ini adalah 12 angka.

Bilangan bulat 0 dimasukkan ke dalam register X dan bilangan 1110 = 1210 – 110 = B16 = $0B dimasukkan ke dalam lokasi alamat di memori, misalkan alamat $0250. Untuk setiap iterasi, nilai dalam register X bertambah, dan hasilnya dibandingkan dengan $0B di lokasi alamat $0250. Tepat setelah nilai di X sama dengan nilai $0B, iterasi berhenti. Pada titik ini, panjang (jumlah byte) string dan literal string menempati lokasi alamat $0300 hingga $030B (inklusif). Untuk menambah alamat memori dari $0300, register Y digunakan. Kodenya adalah:

LDA #$0M
MEREKA $0250
LDX #$00
LDY #$00
STA $0300 ; panjang 11 dimasukkan ke dalam A oleh beberapa subrutin dan menjadi $0300
lingkaran INX
DI SANA
CPY $0250
lingkaran BEQ

b) Strategi: Ada 12 byte untuk string: 1 byte untuk terminator Null $00 dan 11 byte untuk string literal. Jadi harus ada 12 iterasi (perulangan) yang dihitung dari 0. Yaitu: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Ini adalah 12 angka.

Bilangan bulat 0 dimasukkan ke dalam register X dan bilangan 1110 = 1210 – 110 = B16 = $0B dimasukkan ke dalam lokasi alamat di memori, misalkan alamat $0250. Untuk setiap iterasi, nilai dalam register X bertambah, dan hasilnya dibandingkan dengan $0B di lokasi alamat $0250. Tepat setelah nilai di X sama dengan nilai $0B, iterasi berhenti. Pada titik ini, jumlah byte string literal ditambah karakter Null menempati lokasi alamat $0300 hingga $030B (inklusif). Untuk menambah alamat memori dari $0300, register Y digunakan. Kodenya adalah:

LDA #$0M
MEREKA $0250
LDX #$00
LDY #$00
STA $0300 ; “I” dimasukkan ke dalam A oleh beberapa subrutin dan menjadi $0300
lingkaran INX
DI SANA
CPY $0250
lingkaran BEQ