Bài giảng Vi xử lý - Chương 2 đọc thêm: Các TD lập trình Z80 - Hồ Trung Mỹ

TD 7: Tìm bit kiểm tra chẵn lẽ cho 1 số 8 bit trong thanh ghi A.

Trong Z80 có hỗ trợ việc cập kiểm tra chẵn lẻ với cờ P/V ở bit thứ 2 trong thanh ghi F sau các lệnh

logic như AND, OR, . Tuy nhiên trong phần mềm mô phỏng của tác giả Peter J.Fondse không có

thực hiện chức năng này, do đó ta sẽ tự viết chương trình cập nhật P/V theo nội dung của thanh ghi

A: nếu số bit 1 ở A là số chẵn thì P/V=1 (điều kiện PE đúng), ngược lại thì P/V=0 (điều kiện PO đúng)

org 100H

program

; Hieu ung cap nhat co Parity sau lenh LOGIC

LD A,1

AND 0FFH ;P/V=0=Odd Parity(do so bit 1 cua ket qua AND la le)

LD A,3

AND 0FFH ;P/V=1=Even Parity(do so bit 1 cua ket qua AND la chan)

; Tuy nhien co P/V khong cap nhat vi Simulator nay bi loi trong phan cap nhat

; Parity. Neu dung phan mo phong Z80 Simulator IDE cua Oshon thi khong can

; Do do ta se 1 chuong trinh con se cap nhat Parity theo so bit 1 trong A

pdf8 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: tuando | Lượt xem: 509 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng Vi xử lý - Chương 2 đọc thêm: Các TD lập trình Z80 - Hồ Trung Mỹ, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 ADD HL,DE ; HL <- HL + DE = 1289 + 2578 = 3867 = 0F1BH 
; Thu lenh SBC voi toan hang 16 bit dung cap thanh ghi HL, DE 
 SCF 
 CCF ; Xoa co Carry (CF=0) hoặc có thể dùng 1 lệnh AND A 
 LD DE,BIN16_1 
 LD HL,BIN16_2 
 SBC HL,DE ; HL <- HL - DE = 1289 - 2578 = -1289 = FAF7H 
TD lập trình Z80 – trang 2 
; Thu lenh ADD voi toan hang 16 bit dung thanh ghi 8 bit 
 LD IX,BIN16_3 ; Lay byte thap truoc 
 LD A,(IX) 
 LD IY,BIN16_4 
 LD B,(IY) 
 ADD A,B 
 LD DE,RESULT_1 
 LD (DE),A 
 INC IX ; Pointer chi den byte cao 
 INC IY 
 INC DE 
 LD A,(IX) 
 LD B,(IY) 
 ADC A,B 
 LD (DE),A 
; Lenh SBC cung lam tuong tu!! 
 LD IX,BIN16_3 ; Lay byte thap truoc 
 LD A,(IX) 
 LD IY,BIN16_4 
 LD B,(IY) 
 SUB B 
 LD DE,RESULT_2 
 LD (DE),A 
 INC IX ; Pointer chi den byte cao 
 INC IY 
 INC DE 
 LD A,(IX) 
 LD B,(IY) 
 SBC A,B 
 LD (DE),A 
; Cong 2 so BCD 4 digits 
 LD IX,BIN16_5 ; Lay byte thap truoc 
 LD A,(IX) 
 LD IY,BIN16_6 
 LD B,(IY) 
 ADD A,B 
 DAA 
 LD DE,RESULT_3 
 LD (DE),A 
 INC IX ; Pointer chi den byte cao 
 INC IY 
 INC DE 
 LD A,(IX) 
 LD B,(IY) 
 ADC A,B 
 DAA 
 LD (DE),A 
 HALT 
BIN16_3 DEFW 1289 
BIN16_4 DEFW 2578 
BIN16_5 DEFW 1289H; Bieu dien BCD cua 1289 
BIN16_6 DEFW 2578H; Bieu dien BCD cua 2578 
RESULT_1 DEFS 2 
RESULT_2 DEFS 2 
RESULT_3 DEFS 2 
 end program 
TD 2: Tính tổng của 1 mảng dữ liệu trong bộ nhớ 
 org 100H 
; Chuong trinh tinh tong 1 array voi so bytes (trong B) va voi dia chi bat dau 
; trong HL 
TD lập trình Z80 – trang 3 
; Ket qua duoc cat trong DE 
program 
 LD A,(N) 
 LD B,A ; Lay so bytes dat vao B 
 LD HL, DATA 
 LD A, 0 
 LD DE,0 ; Sum <- 0 
LOOP: ADD A,(HL) 
 LD E,A ; Cap nhat byte thap cua Sum 
 JR NC, NEXT 
 INC D ; Cap nhat byte cao cua Sum 
NEXT: INC HL 
 DJNZ LOOP 
 HALT 
DATA: DEFB 10 
 defb 20 
 defb 30 
 defb 40 
 defb 50 
 defb 60 
 defb 70 
 defb 80 
N: defb $-DATA ; $ la dia chi hien tai 
 ; do $ - DATA = 8 
 end program 
TD 3: Thử lệnh IN/OUT 
; TD: LED ex1 
; cac LED o cong xuat (03H) se tat/sang theo trang thai cua khoa o 
; cong nhap (02H) 
 org 100h 
program 
loop: in A,(02H) 
 out (03H),A 
 jr loop 
 end program 
TD 4: LED sáng lần lượt từ phải sang trái và lặp lại 
; TD: LED ex2 - LED sang chay xoay sang trai 
PATTERN EQU 01H 
 org 100h 
program 
 LD C,PATTERN 
loop: LD A,C 
 OUT (03H),A 
 RLC C ; Dung RRC C se chay sang phai! 
 CALL DELAY 
 JR loop 
; Chuong trinh con DELAY lam tre 
DELAY: LD B,0 ; vong lap voi B la 256 lan! 
L1: LD D,0 ; vong lap voi D la 256 lan! 
L2: DEC D 
 JR NZ,L2 
 DJNZ L1 
 RET 
 end program 
TD 5: Điều khiển LED sáng chạy sang trái/phải theo trị số 0/1 ở công tắc 0 
; TD: LED ex3 - LED sang chay xoay sang trai/phai theo cong tac 0 la 0/1 
PATTERN EQU 01H 
 org 100h 
TD lập trình Z80 – trang 4 
program 
 LD C,PATTERN 
LOOP: IN A,(02H) 
 BIT 0,A 
 JR NZ,RIGHT 
 RLC C ; Dung RRC C se chay sang phai! 
 JR NEXT 
RIGHT: RRC C 
NEXT: CALL DELAY 
 LD A,C 
 OUT (03H),A 
 JR LOOP 
; Chuong trinh con DELAY lam tre 
DELAY: LD B,0 ; vong lap voi B la 256 lan! 
L1: LD D,0 ; vong lap voi D la 256 lan! 
L2: DEC D 
 JR NZ,L2 
 DJNZ L1 
 RET 
 end program 
TD 6: Hiển thị các số từ 0 đến 9 và lặp lại 
Các LED 7 đoạn trong hiển thị 4 ký số lần lượt có các địa chỉ là 0AH, 0BH, 0CH, và 0DH cho các ký 
số tương ứng từ vị trí cao xuống thấp. Trong TD này ta xuất LED 7 đoạn ở vị trí tận cùng bên phải, 
nên dùng địa chỉ 0DH! 
; TD: LED ex4 - Hien thi cac so tu 0 den 9 va lap lai 
 org 100h 
program 
 LD L,0 
LOOP: LD A,L 
 CALL DEC2LED 
 OUT (0DH),A ; Xuat ra LED 7 doan tai digit don vi! 
 CALL DELAY 
 INC L 
 LD A,9 
 CP L 
 JR NC,LOOP 
 LD L,0 
 JR LOOP 
; Chuong trinh con DELAY lam tre 
DELAY: LD B,0 ; vong lap voi B la 256 lan! 
L1: LD C,100; vong lap voi C la 100 lan! 
L2: DEC C 
 JR NZ,L2 
 DJNZ L1 
 RET 
; Chuong trinh doi so nhi phan 4 bit sang ma 7 doan 
DEC2LED:PUSH DE 
 PUSH IX 
 AND 0FH 
 LD E,A 
 LD D,0 
 LD IX,XLAT_TAB 
 ADD IX,DE 
 LD A,(IX+0) 
 POP IX 
 POP DE 
 RET 
XLAT_TAB: 
; LED 7 doan trong mo phong nay co thu tu cac doan nhu sau 
; hgfedcba - 0=LED tat, 1=LED sang 
TD lập trình Z80 – trang 5 
 DEFB 00111111B; 0 
 DEFB 00000110B; 1 
 DEFB 01011011B; 2 
 DEFB 01001111B; 3 
 DEFB 01100110B; 4 
 DEFB 01101101B; 5 
 DEFB 01111101B; 6 
 DEFB 00000111B; 7 
 DEFB 01111111B; 8 
 DEFB 01101111B; 9 
 end program 
TD 7: Tìm bit kiểm tra chẵn lẽ cho 1 số 8 bit trong thanh ghi A. 
Trong Z80 có hỗ trợ việc cập kiểm tra chẵn lẻ với cờ P/V ở bit thứ 2 trong thanh ghi F sau các lệnh 
logic như AND, OR,. Tuy nhiên trong phần mềm mô phỏng của tác giả Peter J.Fondse không có 
thực hiện chức năng này, do đó ta sẽ tự viết chương trình cập nhật P/V theo nội dung của thanh ghi 
A: nếu số bit 1 ở A là số chẵn thì P/V=1 (điều kiện PE đúng), ngược lại thì P/V=0 (điều kiện PO đúng) 
 org 100H 
program 
; Hieu ung cap nhat co Parity sau lenh LOGIC 
 LD A,1 
 AND 0FFH ;P/V=0=Odd Parity(do so bit 1 cua ket qua AND la le) 
 LD A,3 
 AND 0FFH ;P/V=1=Even Parity(do so bit 1 cua ket qua AND la chan) 
; Tuy nhien co P/V khong cap nhat vi Simulator nay bi loi trong phan cap nhat 
; Parity. Neu dung phan mo phong Z80 Simulator IDE cua Oshon thi khong can 
; Do do ta se 1 chuong trinh con se cap nhat Parity theo so bit 1 trong A 
 LD A,1 
 CALL PARITY_E ; P/V=0 
 LD A,3 
 CALL PARITY_E ; P/V=1 
 HALT 
PARITY_E: 
 PUSH BC 
 PUSH DE 
 PUSH AF 
 POP BC ; B = A , C= F 
 LD B,8 
 LD D,A 
 LD E,0 
 RES 2,C ; P/V = 0 (co P/V o vi tri bit 2 trong thanh ghi F) 
LOOP: SRL D 
 JR NC,SKIP 
 INC E 
SKIP: DJNZ LOOP ; Vong lap tren dem so bit 1 trong A va cat vao E 
 BIT 0,E 
 JR NZ,ODD 
 SET 2,C ; P/V = 1 
ODD: LD B,A 
 PUSH BC 
 POP AF ; A = khong doi, F duoc cap nhat theo so bit 1 cua A 
 POP DE 
 POP BC 
 RET 
 end program 
TD 8: Áp dụng lệnh dịch bit để thực hiện phép nhân không dấu X cho với 1 số có dạng 2n + 1 (như 3, 
5, 9, 17): X * (2n + 1) = X*2n + X = dịch X sang trái n bit + X 
Giả sử kết quả của phép nhân sẽ đặt trong 1 số 16 bit. 
TD lập trình Z80 – trang 6 
 Chương trình con MUL_2NA1 nhân 1 số ở thanh ghi A với 1 số có dạng 2n + 1 ở B 
và kết quả 16 bit được để trong cặp thanh ghi DE 
 org 100H 
program 
 LD A,27 
 LD C,17 
 CALL MUL_2NA1 
 HALT 
MUL_2NA1: 
 PUSH AF 
 PUSH BC 
 LD D,0 
 LD E,A 
 DEC C 
 RET Z 
 CALL SHIFT_N 
 ADD A,E 
 LD E,A 
 LD A,0 
 ADC A,D 
 POP BC 
 POP AF 
 RET 
; Tinh DE = A x 2^n bang cach dich DE sang trai n bit (dat trong C) 
SHIFT_N: 
 SRL C 
 RET C 
 SLA E ; ; Dich cap thanh ghi DE sang trai 1 bit 
 RL D 
 JR SHIFT_N 
 end program 
Chú ý: Tóm tắt hiệu ứng của các lệnh dịch và xoay bit trong Z80 
TD 9: Tính bù 2 của 1 số 16 bit trong bộ nhớ 
 org 100H 
program 
; Lay bu 2 cua 1 so 16 bit NUM1 trong bo nho o dia chi 200H 
; va cat lai vao bien 16 bit NUM2 trong bo nho o dia chi 202H 
 LD HL,(NUM1) ; Neu (NUM1) = 56D3H 
 LD A,L 
 CPL ; tinh bu 1 cua byte thap 
 LD L,A 
 LD A,H 
TD lập trình Z80 – trang 7 
 CPL ; tinh bu 1 cua byte cao 
 LD H,A 
 INC HL 
 LD (NUM2),HL ; thi bu 2 cua no o (NUM2) = A92DH 
; Cach 2 lay bu 2 bang lay 0 - NUM1 
 LD HL,(NUM1) 
 EX DE,HL 
 LD HL,0 
 AND A ; CF =0 
 SBC HL,DE 
 LD (NUM3),HL 
 HALT 
 org 200H 
NUM1 defw 56D3H 
NUM2 defs 2 ; bù 2 của 56D3H là A92DH 
NUM3 defs 2 
 end program 
TD 10: Minh họa chuyển đổi biểu diễn số theo ASCII sang BCD và ngược lại; và tính tổng 2 số BCD 
có nhiều ký số, trong TD này mỗi số BCD có 10 ký số. 
org 100H 
BCD_LEN EQU 5 
program 
 LD HL,NUM1 
 LD IX,NUM1_BCD 
 CALL ASCII_HEX 
 LD HL,NUM2 
 LD IX,NUM2_BCD 
 CALL ASCII_HEX 
 LD HL,NUM1_BCD + BCD_LEN - 1 ; chi den ky so BCD tan cung phai 
 LD IX,NUM2_BCD + BCD_LEN - 1 
 LD IY,BCD_SUM + BCD_LEN - 1 
 CALL SUM_BCD 
 LD HL,BCD_SUM 
 LD IX,ASCII_SUM 
 CALL BCD_ASCII 
 HALT 
ASCII_HEX: LD B,BCD_LEN 
LOOP: LD A,(HL) 
AND 0FH 
 RLA 
 RLA 
 RLA 
 RLA 
 LD C,A 
 INC HL 
 LD A,(HL) 
 AND 0FH 
 ADD A,C 
 LD (IX+0),A 
 INC HL 
 INC IX 
 DJNZ LOOP 
 RET 
SUM_BCD: 
 LD B,BCD_LEN 
 AND A ; CF=0 
L1: LD A,(IX+0) 
 ADC A,(HL) 
 DAA 
 LD (IY+0),A 
TD lập trình Z80 – trang 8 
 DEC IX 
 DEC IY 
 DEC HL 
 DJNZ L1 
 RET 
BCD_ASCII: 
 LD B,BCD_LEN 
L2: LD A,(HL) 
 LD C,A 
 AND 0F0H 
 RRA 
 RRA 
 RRA 
 RRA ; lay nua byte cao 
 OR 30H ; Doi sang ASCII tuong duong 
 LD (IX+0),A 
 INC IX 
 LD A,C 
 AND 0FH ; lay nua byte thap 
 OR 30H ; Doi sang ASCII tuong duong 
 LD (IX+0),A 
 INC IX 
 INC HL 
 DJNZ L2 
 RET 
 org 200H 
NUM1 DEFM '1234567890' 
NUM2 DEFM '1098765432' 
ASCII_SUM DEFS 10 ; Ket qua la '2333333322' 
 DEFB 0 
NUM1_BCD DEFS 5 ; Ket qua la 1234567890H (BCD cua thap phan 1234567890) 
NUM2_BCD DEFS 5 ; Ket qua la 1098765432H (BCD cua thap phan 1098765432) 
BCD_SUM DEFS 5 ; Ket qua la 2333333322H 
 end program 
TD 11: Tìm chiều dài của 1 chuỗi ký tự 
Chuỗi ký tự bắt đầu từ ô nhớ 0201H và đánh dấu hết chuỗi bằng ký tự “carriage return) (CR) có giá trị là 
0DH. Đặt chiều dài chuỗi (không kể CR) vào ô nhớ 0200H. 
TD: Từ ô nhớ 0201H ta thấy các byte: 52H, 41H, 54H, 48H, 45H, 52H, 0DH 
 Nghĩa là chuỗi ‘RATHER’,0D : ‘R’ , ‘A’ , ‘T’ , ‘H’ , ‘E’ , ‘R’, CR 
 Sau khi thực thi đoạn chương trình này tại ô nhớ 0200H có trị 06H. 
 Cách 1: 
 LD HL, 0201H ; Contrỏ HL chỉ đến đầu chuỗi 
 LD B,0 ; Chiều dài chuỗi = B = 0 
 LD A, 0DH : So sánh CR với ký tự trong chuỗi 
CHKCR: CP (HL) ; Ký tự đang xét là CR? 
 JR Z,DONE ; Đúng. Kết thúc. 
 INC B ; Cộng 1 vào chiều dài chuỗi 
 INC HL 
 JR CHKCR ; Kiểm tra ký tự kế 
DONE: LD A,B ; Cất chiều dài chuỗi 
 LD (0200H),A 
 HALT 
 Cách 2: Dùng CPIR 
LD HL, 0201H ; Contrỏ HL chỉ đến đầu chuỗi 
 LD BC,0 ; Bộ đếm số byte BC = 0 dùng cho CPIR 
 LD A, 0DH : Lặp lại so sánh CR với ký tự trong chuỗi 
 CPIR ; BC giảm 1, HL tăng 1, nếu BC=0 hoặc (HL)=A dừng 
 LD A,0FFH ; Vì BC chứa số lần đếm âm nên lấy bù 2 
 SUB C 
 LD (0200H),A 
 HALT 

File đính kèm:

  • pdfbai_giang_vi_xu_ly_chuong_2_doc_them_cac_td_lap_trinh_z80_ho.pdf