สารบัญ:

6502 Minimal Computer (พร้อม Arduino MEGA) ตอนที่ 3: 7 ขั้นตอน
6502 Minimal Computer (พร้อม Arduino MEGA) ตอนที่ 3: 7 ขั้นตอน

วีดีโอ: 6502 Minimal Computer (พร้อม Arduino MEGA) ตอนที่ 3: 7 ขั้นตอน

วีดีโอ: 6502 Minimal Computer (พร้อม Arduino MEGA) ตอนที่ 3: 7 ขั้นตอน
วีดีโอ: Building a 6502 computer: Episode 3, all about clocks! (8 bit, apple, acorn, atari, commodore) 2024, กรกฎาคม
Anonim
6502 คอมพิวเตอร์ขนาดเล็ก (พร้อม Arduino MEGA) ตอนที่ 3
6502 คอมพิวเตอร์ขนาดเล็ก (พร้อม Arduino MEGA) ตอนที่ 3

ตอนนี้ฉันได้เพิ่ม Octal Latch, ไฟ LED รูปสี่เหลี่ยมผืนผ้า 8 ดวงและอาร์เรย์ตัวต้านทาน 220 โอห์มลงในกระดานหลัก นอกจากนี้ยังมีจัมเปอร์ระหว่างพินและกราวด์ทั่วไปของอาร์เรย์ เพื่อให้สามารถปิดไฟ LED ได้ เกท 74HC00 NAND ถูกแทนที่ด้วยเกท 78LS08 และการเดินสายไปยังเกทก็เปลี่ยนไปเช่นกัน ประตู AND หมายความว่า 6522 ตอนนี้อยู่ที่ $6000 แทนที่จะเป็น $E000

นอกจากนี้ยังมีพินสำหรับเชื่อมต่อนาฬิกาภายนอกเพื่อขับเคลื่อน 6502 ด้วยการเชื่อมต่อนี้ MEGA จึงไม่จำเป็นต้องให้สัญญาณนาฬิกา MEGA ยังคงตรวจสอบสิ่งที่เกิดขึ้นกับโปรเซสเซอร์เหมือนเมื่อก่อน

ฉันใช้สลัก 20 พิน 74HC373 เพราะฉันมีบางอย่าง สิ่งนี้ใช้ได้เมื่ออยู่บนเขียงหั่นขนม แต่ 74HC573 เข้ากันได้กับบัสและจะช่วยประหยัดการเดินสายได้มาก อาจพิจารณา UCN5801A ซึ่งเป็น IC 22 พินในวงจรด้วย แต่การเดินสายจะแตกต่างกันเล็กน้อย

ไฟ LED สีส้มเดี่ยวด้านบนเป็นไฟแสดงสถานะเปิด/ปิด และไฟสีแดงด้านล่างซ้ายจะระบุเวลาที่เขียน ส่วนหลังจะไม่มีนัยสำคัญหากบอร์ดทำงานด้วยความเร็วสูงกว่า

วงจรที่ดัดแปลงอยู่ด้านบน (ด้วย 74HC573)

ขั้นตอนที่ 1: โปรแกรมสาธิต

โปรแกรมสาธิต
โปรแกรมสาธิต

โปรแกรมสาธิตอย่างง่ายสองโปรแกรมรวมอยู่ในมอนิเตอร์ 6502 และโค้ดที่ถอดประกอบอยู่ที่นี่

โปรแกรมนี้โหลด 1 ลงในรีจิสเตอร์ 6502 A และเก็บไว้ในสลัก จากนั้นจะเพิ่ม 1 ลงในรีจิสเตอร์ A และเก็บไว้ในสลัก จากนั้นจะกระโดดกลับไปที่ $ 105 และกระบวนการนี้จะทำซ้ำตลอดไป

* = 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

โปรแกรมนี้ตั้งค่า DDR ของ 6522 พอร์ต B เป็นเอาต์พุตก่อน จากนั้นจะเก็บ $55 (B01010101) ไว้ในพอร์ตและสลัก จากนั้นรีจิสเตอร์ A จะหมุนไปทางขวา 1 ขั้น และตอนนี้ถือ $AA (B10101010) สิ่งนี้จะถูกเก็บไว้ในพอร์ต B และสลักอีกครั้ง โปรแกรมกระโดดกลับไปที่ $ 105 และดำเนินต่อไปตลอดกาล

* = 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

สายตาที่เฉียบแหลมในหมู่คุณอาจสังเกตเห็นว่าไฟ LED สีแสดงรูปแบบที่แตกต่างจากสีเขียว เนื่องจากสายทั่วไปเชื่อมต่อกับ 5v บนสายสี และสายสามัญบนสายสีเขียวเชื่อมต่อกับกราวด์

เปลี่ยนรหัสบรรทัดนี้เป็น program2 หรือ program3

setDataPins(โปรแกรม3[ออฟเซ็ต]);

6502 Assembler and Disassembler เป็นเครื่องมือที่มีประโยชน์ในการช่วยเข้ารหัสโปรแกรมของคุณ

ขั้นตอนที่ 2: การเพิ่ม EEPROM

การเพิ่ม EEPROM
การเพิ่ม EEPROM
การเพิ่ม EEPROM
การเพิ่ม EEPROM
การเพิ่ม EEPROM
การเพิ่ม EEPROM

สำหรับบอร์ด EEPROM ฉันใช้บอร์ดแบบสตริปขนาด 950 x 650 มม. และหมุดส่วนหัวตัวผู้ 19 มม. เพื่อให้บอร์ดสามารถเคลียร์อันที่อยู่ข้างใต้ได้ บอร์ดนี้เสียบเข้ากับบอร์ด 6502 ด้านล่าง EEPROM คือ ATMEL 28C256 ซึ่งมี 28 พินและมีหน่วยความจำ 32k x 8 บิต ซึ่งเพียงพอสำหรับโปรแกรมขนาดเล็กที่ใช้อยู่ในปัจจุบัน

ฉันไม่ได้ทำแผนภาพวงจรสำหรับบอร์ดนี้ แต่มันค่อนข้างตรงไปตรงมาว่าเชื่อมต่อกับบอร์ด 6502 ด้านล่างอย่างไร ชิป EEPROM เหล่านี้ไม่เป็นมิตรกับบัส จึงต้องต่อเข้ากับหมุดแต่ละตัว ดังนั้น "สปาเก็ตตี้สีเขียวและสีขาว" ทั้งหมด ฉันได้แก้ไขปัญหาการเชื่อมโยงบนบอร์ดก่อนหน้านี้โดยการเดินสายข้อมูลเข้าด้วยกันที่ด้านล่างของบอร์ด

หมุดที่อยู่ 14 อันของ EEPROM เชื่อมต่อกับพินที่เหมาะสมทางด้านซ้าย (สายสีเขียว) และพิน I/O กับพินข้อมูลทางด้านขวา (สายสีขาว) พิน 27 (WE) เชื่อมต่อกับพิน 28 (5v), พิน 22 (OE) เชื่อมต่อกับกราวด์และพิน 20 (CE) เชื่อมต่อกับเกต NAND อินพุต 2 ของเกต NAND เชื่อมต่อกับ A15 บน กระดานหลัก ซึ่งหมายความว่าเมื่อพินนี้สูงขึ้น ประตู NAND จะให้สัญญาณต่ำไปยังพิน CE ของ EEPROM ซึ่งทำให้พินทำงาน ด้วยการตั้งค่านี้ หมายความว่า EEPROM สามารถอ่านได้โดย 6502 เท่านั้น

เนื่องจาก EEPROM อยู่ในอันดับสูงสุด 32k บนแผนที่หน่วยความจำ หมายความว่า $FFFC และ $FFFD สามารถเก็บที่อยู่เริ่มต้นสำหรับ 6502 ได้หลังจากที่รีเซ็ตแล้ว ด้วย 6522 ที่มีที่อยู่ระหว่าง $6000 ถึง $600F และสลักอยู่ที่ $4100 มันจึงหยุดความขัดแย้งของหน่วยความจำ

เวกเตอร์ NMI ($FFFA และ $FFFB) และเวกเตอร์ BRK / IRQ ($FFFE และ $FFFF) สามารถเขียนในลักษณะเดียวกันได้เช่นกัน

ขั้นตอนที่ 3: การเขียนโปรแกรม EEPROM

การเขียนโปรแกรม EEPROM
การเขียนโปรแกรม EEPROM
การเขียนโปรแกรม EEPROM
การเขียนโปรแกรม EEPROM

ในการจัดเก็บโปรแกรมบน EEPROM จำเป็นต้องมีโปรแกรมเมอร์ ฉันสร้างหนึ่งจากกระดานแถบ, Arduino Pro Mini, 74HC595 สองสามตัวและซ็อกเก็ต ZIF ในขั้นต้น โปรแกรมเมอร์ถูกสร้างขึ้นสำหรับ AT28C16 ซึ่งมีบรรทัดที่อยู่น้อยกว่า AT28C256 จึงต้องแก้ไข

แผนภาพวงจรแสดงวิธีการต่อสาย EEPROM ทั้งสองนี้ จากภาพไม่ชัดเจนว่าชิป 595 สองตัวคว่ำและไม่เป็นไปตามที่แสดงในแผนภาพ พิน 1 ถึง 7 จาก 595/1 เรียงตาม A1 ถึง A7 ของ EEPROM ไม่ว่าจะใช้อันไหน ประหยัด 7 สายเชื่อมต่อ ตอนนี้บอร์ดดูแน่นไปหน่อย และนั่นเป็นเพราะตอนแรกฉันใช้ซ็อกเก็ต DIL 24 พิน ซึ่งตอนนี้ถูกแทนที่ด้วยซ็อกเก็ต ZIF 28 พินที่ใหญ่กว่ามาก

รวมโปรแกรมที่ใช้งานได้กับบอร์ดของฉัน โปรแกรมจะทำงานร่วมกับ Arduino และ 595s ในวงจรดังที่แสดง ฉันเลือก 5v Pro Mini เพราะมันกะทัดรัดและราคาถูกพอที่จะทิ้งไว้ในการตั้งค่า

ขั้นตอนที่ 4: โปรแกรม EEPROM

โปรแกรม EEPROM
โปรแกรม EEPROM

มีสามโปรแกรมง่าย ๆ ในโปรแกรมเมอร์ EEPROM หากต้องการใช้ เพียงยกเลิกการใส่เครื่องหมายบรรทัดที่คุณต้องการใช้

// อ่านจากพอร์ต A ของ 6522

//ข้อมูลไบต์คงที่ = {0xA9, 0x00, 0x8D, 0x03, 0x60, 0xAD, 0x01, 0x60, 0x4C, 0x05, 0x90, 0x00};

โปรแกรมแสดงการถ่ายโอนข้อมูลหน่วยความจำเมื่อเสร็จสิ้น ส่วนหนึ่งของโปรแกรมด้านล่างช่วยให้คุณควบคุมสิ่งที่คุณต้องการเขียนหรือลบได้อย่างเต็มที่ ตั้งค่า $FFFC & $FFFD จากนั้นแสดงเนื้อหาของช่วงที่กำหนด เพียงยกเลิกการใส่ความคิดเห็นหรือแก้ไขพารามิเตอร์ตามที่คุณต้องการ ที่อยู่สามารถป้อนในรูปแบบทศนิยมได้

// ลบ EEPROM (422, 930, 0x41); // ใช้เพื่อลบ EEPROM ทั้งหมดหรือบางส่วน - start, end, byte

Serial.println ("การเขียนโปรแกรม EEPROM"); จำนวน = program_numeric_data(0x1000); เขียนEEPROM(0x7ffc, 0x00); // ตั้งค่า $FFFC สำหรับ 6502 writeEEPROM(0x7ffd, 0x90); // ตั้งค่า $FFFD สำหรับ 6502 //writeEEPROM(0x1000, 0xA9); // เขียนข้อมูล 1 ไบต์ Serial.println(" done"); โครงร่างสตริง = " เขียนแล้ว " + (สตริง) จำนวน + " ไบต์"; Serial.println (เค้าร่าง); Serial.println("กำลังอ่าน EEPROM"); เนื้อหาการพิมพ์ (0x0000, 0x112f); // ตั้งค่าช่วงเพื่อแสดง printContents(0x7ff0, 0x7fff); // อ่าน 16 ไบต์สุดท้ายบน EEPROM

ผลลัพธ์โดยย่อจากโปรแกรมอยู่ด้านบน

ขั้นตอนที่ 5: เรียกใช้ 6502 จาก EEPROM

เรียกใช้ 6502 จาก EEPROM
เรียกใช้ 6502 จาก EEPROM
เรียกใช้ 6502 จาก EEPROM
เรียกใช้ 6502 จาก EEPROM
เรียกใช้ 6502 จาก EEPROM
เรียกใช้ 6502 จาก EEPROM

ตอนนี้ EEPROM ที่ตั้งโปรแกรมไว้สามารถแทรกลงในบอร์ดของมันได้ และเจ้าหมูตัวนี้ก็กลับไปที่บอร์ด 6502 หลักซึ่ง piggy back อยู่บน MEGA ภาพถ่ายด้านข้างและด้านบนแสดงให้เห็นว่ามันเข้ากันได้อย่างไร

ตอนนี้ 6502 สามารถอ่านเวกเตอร์เริ่มต้นจาก $FFFC และ $FFFD (ซึ่งก็คือ $9000) แล้วข้ามไปที่โปรแกรมที่เก็บไว้ที่นั่น MEGA ยังคงให้สัญญาณนาฬิกาและจำเป็นต้องแก้ไขโปรแกรมเพื่อให้ส่งสัญญาณนาฬิกาและตรวจสอบ 6502 เท่านั้น โปรแกรมที่แก้ไขมีไว้เพื่อทำสิ่งนี้

รูปภาพที่กำลังทำงานแสดงว่าโปรแกรมนี้กำลังทำงานอยู่

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

สวิตช์ถูกเสียบเข้ากับพอร์ต A และโปรแกรมแสดงค่าที่อ่านอยู่บนพอร์ต B และ 74HC373 (ซึ่งถูกบดบังอยู่ในปัจจุบัน) สวิตช์เชื่อมต่อกับกราวด์และไฟ LED เชื่อมต่อกับ 5v EOR #$FF แก้ไขปัญหาของแลตช์และพอร์ต B ที่แสดงรูปแบบต่างๆ โดยการพลิกบิตก่อนที่จะเขียนไปยังแลตช์

ขั้นตอนที่ 6: สัญญาณเวลาภายนอก

สัญญาณเวลาภายนอก
สัญญาณเวลาภายนอก

หากใช้สัญญาณนาฬิกากับพินที่ด้านบนของบอร์ด ตอนนี้ 6502 สามารถทำงานแยกจาก MEGA ได้ แน่นอนว่ามันต้องการแหล่งพลังงานด้วย ฉันได้ทดลองกับนาฬิกาที่แตกต่างกันและเรียกใช้ 6502 ที่ 1MHz ด้วยคริสตัลออสซิลเลเตอร์ MEGA ไม่สามารถตามให้ทันด้วยความเร็วที่เร็วกว่า จึงต้องถอดออก

ฉันยังลองเอาท์พุตจากตัวจับเวลา 555 แต่ก็ใช้ไม่ได้ ฉันคิดว่ามันอาจจะเป็นเพราะมันไม่ใช่คลื่นสี่เหลี่ยม? เมื่อเชื่อมต่อกับเอาท์พุต CD4017 ตัวใดตัวหนึ่ง มันขับ 6502 ได้ ฉันติดตั้งหนึ่งในชุดอุปกรณ์ด้านบนเพื่อลองรับสัญญาณนาฬิกา

ฉันยังคงดูวิธีต่างๆ เพื่อรับสัญญาณนาฬิกา

ขั้นตอนที่ 7: บทสรุป

ฉันได้แสดงวิธีสร้างวงจรที่ซับซ้อน และรับ "คอมพิวเตอร์" ที่ง่ายมากเพื่อทำงานกับชิ้นส่วนจำนวนน้อยที่สุด จริงอยู่ คอมพิวเตอร์ไม่สามารถทำอะไรได้มากในปัจจุบันหรือมีแนวโน้มว่าจะทำเช่นนั้นในอนาคต

ย้อนกลับไปในช่วงต้นยุค 80 กับ VIC20 ของฉัน ฉันเคยสงสัยในเครื่องจักรที่ยอดเยี่ยมและไม่มีความคิดแรกว่าจะเริ่มต้นประกอบเข้าด้วยกันได้อย่างไร เวลาผ่านไปอย่างรวดเร็วและมีเทคโนโลยี แต่ก็ยังดีที่จะกลับไปสู่พื้นฐานและภาคภูมิใจในสิ่งที่คุณสร้างขึ้นตั้งแต่เริ่มต้น

เพื่อพัฒนาคอมพิวเตอร์เครื่องนี้ต่อไป ฉันตั้งใจที่จะใส่ SRAM 2k ที่ $0000 ถึง $2047 และเพิ่มออสซิลเลเตอร์ 1 MHz อาจจะเพิ่มบางอย่างเช่น CD4040 (12-Stage Binary Ripple Counter / Divider) เพื่อให้ฉันสามารถแตะความเร็วสัญญาณนาฬิกาที่แตกต่างกัน

อาจเพิ่มจอ LCD เพื่อให้แสดงผลข้อความมากกว่าแค่ไฟกะพริบ โปรแกรมเมอร์ EEPROM จะต้องได้รับการแก้ไขเพื่อจัดการกับโปรแกรมขนาดใหญ่ที่จำเป็นในการเรียกใช้จอ LCD

แม้ว่า MEGA จะไม่จำเป็นสำหรับการรัน 6502 แต่ก็ยังมีประโยชน์สำหรับการดีบักรหัสเครื่อง อย่างที่ใครๆ ก็รู้ รหัสเครื่องมีข้อบกพร่องอยู่เสมอ!

แนะนำ: