Thiết kế và viết chương trình điều khiển mạch thực hành cho CPU Z80

MỤC LỤC

Đơn vị logic số học (ALU)

Các lệnh logic và số học 8 bit của CPU được thực hiện trong ALU. Giao tiếp giữa ALU với các thanh ghi và data bus bên ngoài được thực hiện trên data bus bên trong. Các chức năng ALU goàm:. học và logic).

Z80 CPU

Các giản đồ thời gian

Chu kỳ máy sau chuyển data giữa CPU và bộ nhớ hay thiết bi I/O và chúng có thể có từ 3 đến 5 chu kỳ T (trừ khi bị kéo dài bởi trạng thái Wait để đồng bộ với tốc độ thiết bị bên ngoài). Trong trường hợp ghi bộ nhớ, /MREQ cũng trở thành tích cực khi bus địa chỉ đã ở trạng thái ổn định do đó nó có thể được dùng trực tiếp như là tín hiệu chọn chip cho bộ nhớ RAM động. Lý do là trong quá trình hoạt động I/O, thời gian từ khi tín hiệu /IORQ trở nên tích cực cho đến khi CPU lấy mẫu đường /WAIT thì rất ngắn do đó nếu không thêm trạng thái này vào thì không đủ thời gian để cổng I/O giải mã địa chỉ của nó.

Hình 3-3 minh họa giản đồ thời gian của chu kỳ đọc, ghi bộ nhớ. Chu kỳ này thường được  kéo dài trong 3 chu kỳ xung clock trừ phi có trạng thái đợi được bộ nhớ yêu cầu qua tín hiệu  /WAIT
Hình 3-3 minh họa giản đồ thời gian của chu kỳ đọc, ghi bộ nhớ. Chu kỳ này thường được kéo dài trong 3 chu kỳ xung clock trừ phi có trạng thái đợi được bộ nhớ yêu cầu qua tín hiệu /WAIT

DATA OUT

TẬP LỆNH Z80 CPU

Ví dụ load thanh ghi tích lũy với dữ liệu trong bộ nhớ được trỏ bởi nội dung thanh ghi HL Định địa chỉ chỉ mục là một thể của định địa chỉ thanh ghi gián tiếp, khác nhau ở chỗ độ dời được cộng thêm trong định địa chỉ chỉ mục. Lệnh tìm và truyền khối trong Z80 là loại mở rộng của định địa chỉ này, ở đó thanh ghi được tăng, giảm và so sánh một cách tự động, Ký hiệu cho biết việc định địa chỉ thanh ghi gián tiếp là dấu ngoặc đơn bao quanh tên thanh ghi (được dùng như là pointer). Trong tất cả các lệnh Input và Output với cách định địa chỉ gián tiếp thanh ghi, nội dung thanh ghi C được đưa lên byte thấp của bus địa chỉ ( địa chỉ thiết bị ) trong khi nội dung thanh ghi B được ủua leõn byte cao cuỷa bus ủũa chổ.

Bảng 4-1 định nghĩa mã lệnh cho tất cả lệnh load 8 bit trong Z80 CPU. Bảng này cũng chỉ ra  kiểu định địa chỉ của mỗi lệnh
Bảng 4-1 định nghĩa mã lệnh cho tất cả lệnh load 8 bit trong Z80 CPU. Bảng này cũng chỉ ra kiểu định địa chỉ của mỗi lệnh

Mô tả tập lệnh Z80

Trong các lệnh RLA, RRA, RLS, và RRS bit carry được dùng như là mối liên kết giữa LSB và MSB cho các thanh ghi hay bộ nhớ bất kỳ. Đối với lệnh so sánh, cờ Z sẽ được set lên 1 nếu nội dung của thanh ghi tích lũy và nội dung của bộ nhớ được chỉ bởi cặp thanh ghi HL giống nhau. Dạng qui ước của thanh ghi được chỉ ra trong mỗi lệnh với bit có trọng số lớn nhất nằm bên trái và bit có trọng số nhỏ nhất nằm bên phải.

Thieát keá chi tieát

    Phần chi tiết về tập lệnh xin xem trong tài liệu Z80 CPU User’s Manual (chương Instruction Description). Dùng IC đệm 1 chiều 74LS244 để cách ly data bus của máy tính và KIT đồng thời cho mục đích điều khiển dữ liệu. Một IC Multiplex (74LS157) được sử dụng cho mục đích đọc dữ liệu về máy tính, 74LS157 là một Quad 2-input Multiplexer có 4 bit ở lối ra, 4 bit này được nối đến các bit tương ứng của thanh ghi trạng thái ở cổng máy in.

    Nguyên lý hoạt động

      Đầu tiên đặt pin A/B của 74LS157 ở mức logic '0' để đọc 4 bit thấp của data bus vào thanh ghi trạng thái, cất giá trị vừa đọc được, tiếp đó đặt pin này ở mức logic cao để đọc tiếp 4 bit cao vào thanh ghi trạng thái, tiến hành khôi phục byte data vừa đọc, so sánh với byte đã phát. Khi thực hiện chạy ở chế độ Debug, chương trình dịch sẽ dịch file này để có một file tương ứng có phần mở rộng là.bin và một file thứ hai có phần mở rộng là.lst (file này dùng khi người sử dụng muốn in hoặc xem mã máy của từng lệnh trong toàn bộ chương trình). Trong trường hợp CPU truy xuất (đọc) bộ nhớ, ta không xử lý gì cả mà chỉ cần set chân WAIT lên mức logic '1' để CPU tiếp tục chạy bình thường cho đến khi có tín hiệu truy xuất bộ nhớ tiếp theo CPU sẽ tự động bị đặt lại vào trạng thái chờ.

      Bước 2: Đưa giá trị C3 (mã lệnh của lệnh nhảy JP HiAddrLoAddr) lên data bus, sau đó set chân WAIT lên mức logic '1', Z80 CPU sẽ tiếp tục chạy và hoạt động tiếp theo sẽ là đọc byte thấp và byte cao của địa chỉ đi theo sau mã lệnh Jump (C3LLHH), lần lượt đưa byte thấp và byte cao của địa chỉ lên data bus thay cho dữ liệu từ Rom chương trình. Mã lệnh tiếp theo mà Z80 CPU cần lấy chính là byte đầu tiên của đoạn chương trình này, cho phép CS RAM chung bằng cách đưa /OER lên mức logic '1', /CER xuống mức logic '0', sau đó set chân WAIT lên mức logic '1' để CPU tiếp tục chạy. Bước 3: Sau khi đã đọc nội dung các thanh ghi và in ra màn hình, đưa giá trị C3 (mã lệnh của lệnh nhảy JP HiAddrLoAddr) lên data bus, sau đó set chân WAIT lên mức logic '1', Z80 CPU sẽ tiếp tục chạy và hoạt động tiếp theo sẽ là đọc byte thấp và byte cao của địa chỉ đi theo sau mã lệnh Jump, lần lượt đưa byte thấp và byte cao của địa chỉ trở về (chính là địa chỉ của lệnh mà CPU đã bị chặn lại trước đó) lên data bus thay cho dữ liệu từ Rom chương trình.

      Đọc mã lệnh, nếu mã lệnh chưa phải là C9 (mã lệnh RET) thì tiếp tục set chân WAIT lên mức logic '1' để CPU tiếp tục chạy bình thường, nếu mã lệnh đúng bằng C9 thì thực hiện đọc trạng thái các thanh ghi tương tự như khi thực hiện một lệnh đơn. Bước 3: Đưa giá trị C3 (mã lệnh của lệnh nhảy JP HiAddrLoAddr) lên data bus, sau đó set chân WAIT lên mức logic '1', Z80 CPU sẽ tiếp tục chạy và hoạt động tiếp theo sẽ là đọc byte thấp và byte cao của địa chỉ đi theo sau mã lệnh Jump, lần lượt đưa byte thấp và byte cao của địa chỉ lên data bus thay cho dữ liệu từ Rom chương trình. Mã lệnh tiếp theo mà Z80 CPU cần lấy chính là byte đầu tiên của đoạn chương trình này, cho phép CS RAM chung bằng cách đưa /OER lên mức logic '1', /CER xuống mức logic '0', sau đó set chân WAIT lên mức logic '1' để CPU tiếp tục chạy.

      Bước 4: Sau khi đã đọc nội dung bộ nhớ được chỉ định và in ra màn hình, ta tiếp tục đưa giá trị C3 (mã lệnh của lệnh nhảy JP HiAddrLoAddr) lên data bus khi có yêu cầu lấy mã lệnh từ CPU, sau đó set chân WAIT lên mức logic '1', Z80 CPU sẽ tiếp tục chạy và hoạt động tiếp theo sẽ là đọc byte thấp và byte cao của địa chỉ đi theo sau mã lệnh Jump, lần lượt đưa byte thấp và 54.

      Giới thiệu phần soạn thảo văn bản

      Các thành phần chính của main menu

        Bước 5: Thiết lập các điều kiện thích hợp để KIT tiếp tục hoạt động bình thường.

        Hướng dẫn sử dụng trong màn hình soạn thảo

        Do trong tiện ích Debug và Dump có sử dụng Stack để bảo toàn nội dung các thanh ghi, nên dòng đầu tiên của chương trình bao giờ cũng phải là dòng khai báo stack (vd: ld sp,0FFFEh). Khi bạn đã nhập xong tên file, ở dòng tiếp theo sẽ xuất hiện thông báo với nội dung bạn có muốn tạo file listing hay không, file này được dùng khi bạn muốn in, hoặc sẽ được dùng trong chế độ chạy Debug. Khi chương trình đã được dịch xong và không có lỗi, file *.bin sẽ được tạo và file này sẽ được tự động đưa ra RAM chung, sau đó Z80 CPU sẽ được khởi động và bắt đầu chạy theo chương trình đã định.

        Trong khi Z80 đang thực thi, trên màn hình sẽ xuất hiện thông báo hỏi bạn có muốn xem nội dung bộ nhớ trên KIT hay không (chú ý: địa chỉ bộ nhớ trên KIT bắt đầu từ 8000h - FFFFh), nếu muốn bạn phải nhấn F3. Chú ý rằng trong thời gian đọc nội dung bộ nhớ chương trình sẽ tạm thời bị treo cho đến khi việc đọc nội dung bộ nhớ hoàn tất. Trước hết đưa con trỏ đến vị trí cần đặt điểm dừng, sau đó nhấn Ctrl-F8, dòng hiện tại sẽ đổi màu, điểm dừng được xác lập.

        Khi bạn đã nhập xong tên file, ở dòng tiếp theo sẽ xuất hiện thông báo với nội dung bạn có muốn tạo file listing hay không, file này được dùng khi bạn muốn in, và được dùng trong chế độ chạy Debug. Khi chương trình đã được dịch xong và không có lỗi, file *.bin sẽ được tạo và file này sẽ được tự động đưa ra RAM chung, sau đó Z80 CPU sẽ được khởi động và bắt đầu chạy cho đến khi bắt gặp địa chỉ tương ứng với điểm dừng đã được thiết lập. Nếu lúc này bạn nhấn F7 thì chương trình sẽ thực thi từng lệnh một đồng thời trên màn hình sẽ hiển thị nội dung của tất cả các thanh ghi.

        Nếu muốn thoát khỏi chế độ Debug bạn chỉ cần nhấn ESC, khi đó chương trình sẽ tiếp tục chạy và bạn có thể tiến hành đọc trạng thái các thanh ghi giống như trong trường hợp chạy chương trình bình thường.

        Giải thuật

          Counter = 2 : Byte địa chỉ thấp của đoạn Dump trong bộ nhớ Ram chung Counter = 3 : Byte địa chỉ cao của đoạn Dump trong bộ nhớ Ram chung. Counter = các giá trị khác → set chân WAIT để Z80 chạy tiếp ẹửa leọnh Jump ra data bus. Đưa byte thấp của vòng lặp ra data bus Đưa byte cao của vòng lặp ra data bus.

          Đưa byte thấp của vòng lặp ra data bus Đưa byte cao của vòng lặp ra data bus N. Xử lý các phím : LEFT, UP, RIGHT, DOWN, HOME, END, DEL, BACKSPACE, PAGEUP, PAGEDOWN, ENTER, TAB.

          Chửụng trỡnh nguoàn

          Chửụng trỡnh ủửa data ra Ram chung, Debug, Dump, Run

          /* Hàm OutKIT trả về byte đ/c thấp + byte đ/c cao của phần bắt đầu chương trình đọc thanh ghi */. //ẹ/c caàn dump: DStartLoAddr,DStartHiAddr,DEndLoAddr,DEndHiAddr GetToDebug(); //Cho phép WAIT, cấm RAM, chờ đọc BUSY. /*Chương trình con tìm địa chỉ trong filename.lst trả về số dòng tương ứng*/.