Các TD lập trình Z80 (phần đọc thêm của VXL-chương 2) - Hồ Trung Mỹ
Chú ý:
Các TD sau được chạy thử trên mô phỏng Z80 (Z80 IDE V1.0 của Peter J.Fondse). Trong mô phỏng
này, tác giả đã định nghĩa sẵn các ngoại vi như sau (ta có thể chỉnh lại ở cửa sổ Z80 Visual Simulator
Peripherals Configure Peripherals)
TD 1: Các thí dụ cộng/trừ số nhị phân và cộng BCD
; TD: binary numbers ex1
; Minh hoa cac phep toan nhi phan
Bạn đang xem tài liệu "Các TD lập trình Z80 (phần đọc thêm của VXL-chương 2) - Hồ Trung Mỹ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- cac_td_lap_trinh_z80_phan_doc_them_cua_vxl_chuong_2_ho_trung.pdf
Nội dung text: Các TD lập trình Z80 (phần đọc thêm của VXL-chương 2) - Hồ Trung Mỹ
- ĐHBK Tp HCM Khoa ĐĐT–BMĐT GVPT: Hồ Trung Mỹ Các TD lập trình Z80 (phần đọc thêm của VXL-chương 2) Chú ý: Các TD sau được chạy thử trên mô phỏng Z80 (Z80 IDE V1.0 của Peter J.Fondse). Trong mô phỏng này, tác giả đã định nghĩa sẵn các ngoại vi như sau (ta có thể chỉnh lại ở cửa sổ Z80 Visual Simulator Peripherals Configure Peripherals) STT Ngoại vi Loại Cổng Địa chỉ Chú thích 1 Các công tắc (Switches) Nhập 02H 2 8 đèn LED (LED’s) Xuất 03H 0=LED tắt; 1=LED sáng 3 Thanh trượt (Slider) Nhập 04H 4 Hiển thị vạch (Bar display) Xuất 05H 5 Hiển thị 7 đoạn (7 segment display) Xuất 0AH 4 digit với dấu chấm thập phân TD 1: Các thí dụ cộng/trừ số nhị phân và cộng BCD ; TD: binary numbers ex1 ; Minh hoa cac phep toan nhi phan NUM1 EQU 25 NUM2 EQU -17 BIN16_1 EQU 2578 ; = 0A12H BIN16_2 EQU 1289 ; = 0509H TEST EQU 1289-2578 ; = FAF7H org 100h program IN A,(02H) ; doc tu switches OUT (03H),A; xuat ra LED CPL ; lay bu 1 cua A OUT (03H),A; xuat ra LED bu 1 cua A CPL ; 2 lan bu 1 ve tri cu OUT (03H),A; xuat ra LED XOR 0FFH ; 1 cach lay bu 1 khac OUT (03H),A; xuat ra LED bu 1 cua A XOR 0FFH ; 2 lan bu 1 ve tri cu NEG ; bu 2 cua A OUT (03H),A; xuat ra LED bu 2 cua A NEG ; 2 lan bu 2 ve tri cu ; Thu lenh ADD voi toan hang 8 bit LD A,NUM1 LD B,NUM2 ADD A,B ; A <- A + B = 25 + (-17) = 8 OUT (03H),A; xuat ra LED ; Thu lenh SUB voi toan hang 8 bit LD A,NUM1 LD B,NUM2 SUB B ; A <- A - B = 25 - (-17) = 42 OUT (03H),A; xuat ra LED ; Thu lenh ADD voi toan hang 16 bit dung cap thanh ghi HL, DE LD DE,BIN16_1 LD HL,BIN16_2 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 ; 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) TD lập trình Z80 – trang 1
- 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 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 lập trình Z80 – trang 3
- ; 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. 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 lập trình Z80 – trang 5
- 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 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 TD lập trình Z80 – trang 7