Mục lục:

Máy tính tối thiểu 6502 (với Arduino MEGA) Phần 3: 7 bước
Máy tính tối thiểu 6502 (với Arduino MEGA) Phần 3: 7 bước

Video: Máy tính tối thiểu 6502 (với Arduino MEGA) Phần 3: 7 bước

Video: Máy tính tối thiểu 6502 (với Arduino MEGA) Phần 3: 7 bước
Video: Biến hình khi văn phòng Schannel có khách đến 2024, Tháng bảy
Anonim
Máy tính tối thiểu 6502 (với Arduino MEGA) Phần 3
Máy tính tối thiểu 6502 (với Arduino MEGA) Phần 3

Tiếp tục, bây giờ tôi đã thêm một chốt Octal, 8 đèn LED hình chữ nhật và một mảng điện trở 220 Ohm vào bảng mạch chính. Ngoài ra còn có một dây nối giữa chân chung của mảng và mặt đất, để có thể tắt đèn LED. Cổng 74HC00 NAND đã được thay thế bằng cổng AND 78LS08, hệ thống dây dẫn đến cổng cũng được thay đổi. Cổng AND có nghĩa là 6522 hiện được đặt ở mức $ 6000 thay vì $ E000.

Ngoài ra còn có một chân để kết nối đồng hồ bên ngoài với ổ đĩa 6502. Với kết nối này, không cần MEGA cung cấp tín hiệu đồng hồ. MEGA vẫn theo dõi những gì đang diễn ra với bộ xử lý như trước đây.

Tôi đã sử dụng một 20 chân 74HC373 cho chốt vì tôi có một số. Điều này là ổn khi ở trên breadboard, nhưng 74HC573 tương thích với bus và sẽ tiết kiệm được rất nhiều dây. UCN5801A là IC 22 chân cũng có thể được xem xét trong mạch, nhưng cách đấu dây sẽ hơi khác.

Đèn LED đơn màu cam trên cùng là đèn báo nguồn và đèn LED màu đỏ phía dưới bên trái cho biết thời điểm ghi đang diễn ra. Sau đó sẽ không đáng kể nếu bảng được chạy ở tốc độ cao hơn.

Mạch đã sửa đổi ở trên (với 74HC573).

Bước 1: Chương trình trình diễn

Các chương trình trình diễn
Các chương trình trình diễn

Hai chương trình trình diễn đơn giản được bao gồm trong màn hình 6502 và mã tháo rời của chúng ở đây.

Chương trình này nạp 1 vào thanh ghi 6502 A và lưu trữ nó trong chốt. Sau đó, nó thêm 1 vào thanh ghi A và lưu trữ nó trong chốt. Sau đó, nó nhảy trở lại $ 1005 và quá trình lặp lại mãi mãi.

* = 1000

1000 A9 01 LDA # $ 01 1002 8D 00 41 STA $ 4100 1005 69 01 ADC # $ 01 1007 8D 00 41 STA $ 4100 100A 4C 05 10 JMP $ 1005 100D. END

Đầu tiên, chương trình này thiết lập đầu ra DDR của cổng B 6522. Sau đó, nó lưu trữ $ 55 (B01010101) trong cổng cũng như chốt. Thanh ghi A sau đó xoay sang phải 1 bước và bây giờ giữ $ AA (B10101010). Điều này một lần nữa được lưu trữ trong cổng B và chốt. Chương trình tăng trở lại $ 1005 và tiếp tục cho đến tận bây giờ.

* = 1000

1000 A9 FF LDA # $ FF 1002 8D 02 60 STA $ 6002 1005 A9 55 LDA # $ 55 1007 38 SEC 1008 8D 00 60 STA $ 6000 100B 8D 00 41 STA $ 4100 100E 6A ROR A 100F 8D 00 60 STA $ 6000 1012 8D 00 41 STA $ 4100 1015 4C 05 10 JMP $ 1005 1018. END

Những người tinh mắt trong số bạn có thể nhận thấy rằng các đèn LED màu đang hiển thị một mẫu khác với màu xanh lá cây. Điều này là do dây dẫn chung được kết nối với 5v trên các dây màu và dây dẫn chung trên dây màu xanh lá cây được kết nối với đất.

Thay đổi dòng mã này thành chương trình2 hoặc chương trình3.

setDataPins (program3 [offset]);

6502 Assembler và Disassembler là những công cụ hữu ích để giúp mã hóa các chương trình của bạn.

Bước 2: Thêm EEPROM

Thêm EEPROM
Thêm EEPROM
Thêm EEPROM
Thêm EEPROM
Thêm EEPROM
Thêm EEPROM

Đối với bảng EEPROM, tôi đã sử dụng bảng dải 950 x 650 mm và các chân tiêu đề nam 19mm để cho phép bảng xóa một bên dưới. Bo mạch này cắm vào bo mạch 6502 bên dưới. EEPROM là ATMEL 28C256 có 28 chân và chứa 32k x 8 bit bộ nhớ. Điều này là quá đủ cho các chương trình nhỏ đang được sử dụng hiện nay.

Tôi chưa thực hiện một sơ đồ mạch cho bảng này, nhưng nó khá thẳng về cách nó kết nối với bảng 6502 bên dưới. Các chip EEPROM này không thân thiện với bus vì vậy phải được nối dây với các chân riêng lẻ, do đó tất cả đều là "mì spaghetti xanh và trắng". Tôi đã giải quyết vấn đề bắc cầu trên bảng trước đó bằng cách kết nối các đường dữ liệu với nhau ở mặt dưới của bảng.

14 chân địa chỉ của EEPROM kết nối với các chân thích hợp ở phía bên trái (dây màu xanh lá cây) và chân I / O với chân dữ liệu ở bên phải (dây màu trắng). Chân 27 (WE) được kết nối với chân 28 (5v), chân 22 (OE) được kết nối với đất và chân 20 (CE) được kết nối với cổng NAND. 2 đầu vào của cổng NAND được kết nối với A15 trên bo mạch chủ. Điều này có nghĩa là khi chân này lên cao, cổng NAND đưa ra tín hiệu thấp đến chân CE của EEPROM để làm cho nó hoạt động. Với thiết lập này, điều đó có nghĩa là EEPROM chỉ có thể được đọc bởi 6502.

Vì EEPROM sống ở 32k hàng đầu trên bản đồ bộ nhớ, điều đó có nghĩa là $ FFFC và $ FFFD có thể giữ địa chỉ bắt đầu cho 6502 sau khi nó đã được đặt lại. Với 6522 có địa chỉ từ $ 6000 đến $ 600F và chốt ở mức $ 4100, nó sẽ ngăn chặn mọi xung đột bộ nhớ.

Vectơ NMI ($ FFFA và $ FFFB) và vectơ BRK / IRQ ($ FFFE anf $ FFFF) cũng có thể được viết theo cách tương tự.

Bước 3: Lập trình EEPROM

Lập trình EEPROM
Lập trình EEPROM
Lập trình EEPROM
Lập trình EEPROM

Để lưu trữ một chương trình trên EEPROM, nó cần một người lập trình. Tôi đã tạo một cái từ bảng mạch dải, Arduino Pro Mini, một vài chiếc 74HC595 và và một ổ cắm ZIF. Ban đầu, bộ lập trình được tạo ra cho AT28C16 có ít dòng địa chỉ hơn AT28C256 nên phải được sửa đổi.

Sơ đồ mạch cho thấy cách đấu dây của cả hai EEPROM này. Từ bức ảnh không thể hiện rõ hai con chip 595 bị lộn ngược và không như trên sơ đồ. Các chân 1 đến 7 của 595/1 xếp hàng với A1 đến A7 của EEPROM bất kể chân nào được sử dụng. Điều này giúp tiết kiệm 7 dây kết nối. Bo mạch bây giờ trông hơi chật và điều này là do ban đầu tôi sử dụng ổ cắm DIL 24 chân, nay đã được thay thế bằng ổ cắm ZIF 28 chân lớn hơn nhiều.

Một chương trình được bao gồm để làm việc với hội đồng quản trị của tôi. Chương trình sẽ hoạt động với bất kỳ Arduino và 595s nào trong một mạch như hình minh họa. Tôi đã chọn một chiếc 5v Pro Mini vì nó nhỏ gọn và đủ rẻ để thiết lập.

Bước 4: Chương trình EEPROM

Các chương trình EEPROM
Các chương trình EEPROM

Có ba chương trình đơn giản trong bộ lập trình EEPROM. Để sử dụng chúng, chỉ cần bỏ ghi chú dòng bạn muốn sử dụng.

// Đọc từ cổng A của 6522

// dữ liệu byte const = {0xA9, 0x00, 0x8D, 0x03, 0x60, 0xAD, 0x01, 0x60, 0x4C, 0x05, 0x90, 0x00};

Chương trình hiển thị kết xuất bộ nhớ khi nó kết thúc. Phần chương trình bên dưới cung cấp cho bạn toàn quyền kiểm soát những gì bạn muốn ghi hoặc xóa, đặt $ FFFC & $ FFFD và sau đó hiển thị nội dung của một phạm vi nhất định. Chỉ cần bỏ ghi chú hoặc thay đổi các tham số khi bạn yêu cầu. Các địa chỉ cũng có thể được nhập ở định dạng thập phân.

// xóaEEPROM (422, 930, 0x41); // Sử dụng để xóa toàn bộ hoặc một phần của EEPROM - bắt đầu, kết thúc, byte

Serial.println ("Lập trình EEPROM"); số lượng = số_liệu_chương_trình (0x1000); writeEEPROM (0x7ffc, 0x00); // Đặt $ FFFC cho 6502 writeEEPROM (0x7ffd, 0x90); // Đặt $ FFFD cho 6502 // writeEEPROM (0x1000, 0xA9); // Ghi 1 byte dữ liệu Serial.println ("xong"); String outline = "Đã viết" + (Chuỗi) số tiền + "byte"; Serial.println (dàn ý); Serial.println ("Đọc EEPROM"); printContents (0x0000, 0x112f); // Đặt dải ô để hiển thị printContents (0x7ff0, 0x7fff); // Đọc 16 byte cuối cùng trên EEPROM

Kết quả tóm tắt từ chương trình ở trên.

Bước 5: Chạy 6502 từ EEPROM

Chạy 6502 từ EEPROM
Chạy 6502 từ EEPROM
Chạy 6502 từ EEPROM
Chạy 6502 từ EEPROM
Chạy 6502 từ EEPROM
Chạy 6502 từ EEPROM

Giờ đây, EEPROM đã được lập trình có thể được đưa vào bo mạch của nó và con lợn này được gắn vào bo mạch chính 6502, được gắn vào MEGA. Ảnh bên và ảnh chụp từ trên xuống cho thấy tất cả đều khớp với nhau như thế nào.

6502 hiện có thể đọc vectơ bắt đầu từ $ FFFC và $ FFFD (là $ 9000) và sau đó chuyển đến chương trình được lưu trữ ở đó. MEGA vẫn đang cung cấp tín hiệu đồng hồ và chương trình của nó cần được thay đổi để chỉ cung cấp tín hiệu đồng hồ và giám sát 6502. Một chương trình đã sửa đổi được cung cấp để thực hiện việc này.

Hình ảnh đang chạy cho thấy chương trình này đang chạy.

9000 LDA # $ 00 A9 00

9002 STA $ 6003 8D 03 60 9005 LDA # $ FF A9 FF 9007 STA $ 6002 8D 02 60 900A LDA $ 6001 AD 01 60 900D STA $ 6000 8D 00 60 9010 EOR # $ FF 49 FF 9012 STA $ 4100 8D 00 41 9015 JMP $ 900A 4C 0A 90

Các công tắc được cắm vào cổng A và chương trình hiển thị giá trị mà nó đang đọc trên cổng B và 74HC373 (hiện bị che khuất). các công tắc được kết nối với đất và các đèn LED được kết nối với 5v. EOR # $ FF khắc phục sự cố của chốt và cổng B hiển thị các mẫu khác nhau bằng cách lật các bit trước khi ghi vào chốt.

Bước 6: Tín hiệu thời gian bên ngoài

Tín hiệu thời gian bên ngoài
Tín hiệu thời gian bên ngoài

Nếu tín hiệu đồng hồ được áp dụng cho chân ở đầu bo mạch, 6502 giờ đây có thể chạy độc lập với MEGA. Tất nhiên nó cũng cần một nguồn điện. Tôi đã thử nghiệm với các đồng hồ khác nhau và thậm chí chạy 6502 ở 1MHz với bộ dao động tinh thể. MEGA không thể bắt kịp với tốc độ nhanh hơn, vì vậy phải được gỡ bỏ.

Tôi cũng đã thử đầu ra từ bộ hẹn giờ 555 nhưng điều đó không hoạt động. Tôi nghĩ nó có thể là bởi vì nó không phải là một sóng vuông? Khi được kết nối với một trong các đầu ra CD4017, nó đã tạo ra ổ đĩa 6502. Tôi đã vá vào một trong các bộ dụng cụ ở trên để thử và nhận tín hiệu đồng hồ.

Tôi vẫn đang xem xét các phương pháp khác nhau để lấy tín hiệu đồng hồ.

Bước 7: Kết luận

Tôi đã chỉ ra cách xây dựng một số mạch phức tạp và có được một "máy tính" rất đơn giản hoạt động với số lượng bộ phận tối thiểu. Tuy nhiên, máy tính không thể làm được nhiều việc ở hiện tại hoặc có khả năng làm được như vậy trong tương lai.

Quay trở lại đầu những năm 80, với chiếc VIC20 của mình, tôi đã từng băn khoăn về chiếc máy tuyệt vời và không có ý tưởng đầu tiên về cách bắt đầu kết hợp chúng lại với nhau. Thời đại đã thay đổi và công nghệ cũng vậy, nhưng vẫn rất tuyệt khi quay lại những điều cơ bản và tự hào về những thứ bạn đã xây dựng từ đầu.

Để phát triển thêm máy tính này, tôi định đặt 2k SRAM ở mức $ 0000 đến $ 2047 và thêm một bộ dao động 1 MHz. Có thể sẽ thêm một cái gì đó như CD4040 (Bộ đếm / Bộ chia Ripple 12 giai đoạn nhị phân) để tôi có thể khai thác các tốc độ đồng hồ khác nhau.

Thậm chí có thể thêm màn hình LCD để cung cấp kết quả đầu ra văn bản thay vì chỉ có đèn nhấp nháy. Bộ lập trình EEPROM cũng sẽ cần được sửa đổi để đối phó với các chương trình lớn hơn cần thiết để chạy màn hình LCD.

Mặc dù MEGA ngày càng trở nên không cần thiết cho việc chạy 6502, nhưng nó vẫn rất hữu ích cho việc gỡ lỗi mã máy. Như bất kỳ ai cũng biết, mã máy luôn chứa lỗi!

Đề xuất: