The PCを自作するシリーズ。

前回はとりあえず、8088とBlackpillをつないだ

今回はとりあえず、クロックを入力してみる。

前回までの記事でHOLDがCPUからの出力って書いちゃってたけど、入力だった。 あと、TESTは出力だと思ったら入力だった。 修正した。

ソース

とりあえず、CPUからの出力をシリアルポートにダンプしながら、 クロックを与えてどう変わるか見てみた。 何も変わらなかったので、RESETも入れてみた。

#define ADDR9 PB11
#define ADDR8 PB10
#define ADDR7 PB9
#define ADDR6 PB8
#define ADDR5 PB7
#define ADDR4 PB6
#define ADDR3 PB5
#define ADDR2 PB4
#define ADDR1 PB3
#define ADDR0 PA15
#define CLK PB0
#define SSO PB12
#define RD PB13
#define HOLD PB14
#define WR PB15
#define DT PA8
#define DEN PA9
#define ALE PA10
#define READY PB1
#define RESET PA7

void setup() {
  // put your setup code here, to run once:
  Serial.begin();
  pinMode(ADDR9, INPUT);
  pinMode(ADDR8, INPUT);
  pinMode(ADDR7, INPUT);
  pinMode(ADDR6, INPUT);
  pinMode(ADDR5, INPUT);
  pinMode(ADDR4, INPUT);
  pinMode(ADDR3, INPUT);
  pinMode(ADDR2, INPUT);
  pinMode(ADDR1, INPUT);
  pinMode(ADDR0, INPUT);
  pinMode(CLK, OUTPUT);
  pinMode(SSO, INPUT);
  pinMode(RD, INPUT);
  pinMode(HOLD, OUTPUT);
  pinMode(WR, INPUT);
  pinMode(DT, INPUT);
  pinMode(DEN, INPUT);
  pinMode(ALE, INPUT);
  pinMode(READY, OUTPUT);
  pinMode(RESET, OUTPUT);
  delay(3000);
  Serial.println("setup");
}

void dump() {
  Serial.print("ADDR: ");
  Serial.print(digitalRead(ADDR9) == HIGH ? "1" : "0");
  Serial.print(digitalRead(ADDR8) == HIGH ? "1" : "0");
  Serial.print(digitalRead(ADDR7) == HIGH ? "1" : "0");
  Serial.print(digitalRead(ADDR6) == HIGH ? "1" : "0");
  Serial.print(digitalRead(ADDR5) == HIGH ? "1" : "0");
  Serial.print(digitalRead(ADDR4) == HIGH ? "1" : "0");
  Serial.print(digitalRead(ADDR3) == HIGH ? "1" : "0");
  Serial.print(digitalRead(ADDR2) == HIGH ? "1" : "0");
  Serial.print(digitalRead(ADDR1) == HIGH ? "1" : "0");
  Serial.print(digitalRead(ADDR0) == HIGH ? "1" : "0");
  Serial.println("");
  Serial.print("SSO RD WR DT DEN ALE: ");
  Serial.print(digitalRead(SSO) == HIGH ? "1" : "0");
  Serial.print(digitalRead(RD) == HIGH ? "1" : "0");
  Serial.print(digitalRead(WR) == HIGH ? "1" : "0");
  Serial.print(digitalRead(DT) == HIGH ? "1" : "0");
  Serial.print(digitalRead(DEN) == HIGH ? "1" : "0");
  Serial.print(digitalRead(ALE) == HIGH ? "1" : "0");
  Serial.println("");
}

void clock() {
  digitalWrite(CLK, HIGH);
  digitalWrite(CLK, LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("loop");
  dump();
  clock();
  digitalWrite(RESET, HIGH);
  Serial.println("RESET");
  clock();
  dump();
  clock();
  digitalWrite(RESET, LOW);
  Serial.println("UNRESET");
  digitalWrite(RESET, HIGH);
  clock();
  for (int i=0;i<100;i++) {
    dump();
    clock();
  }
  while(1);
}

結果

ALEだけLOWで、あとはHIGHで変わらない。 何が間違ってるんだろう。 あと、8088がかなり暖かくなってるんだけど、大丈夫か?

setup
loop
ADDR: 1111111111
SSO RD WR DT DEN ALE: 111110
RESET
ADDR: 1111111111
SSO RD WR DT DEN ALE: 111110
UNRESET
ADDR: 1111111111
SSO RD WR DT DEN ALE: 111110
ADDR: 1111111111
SSO RD WR DT DEN ALE: 111110
ADDR: 1111111111
SSO RD WR DT DEN ALE: 111110
(以下同じ)

原因考察

データシートを読んだり、指摘された事がいくつかある。

8088 8088

  • 普通の入力は2.0Vあればいいが、クロックだけは3.9V必要
  • 最低クロックが2Mhz必要

あとミスがあるかもしれない

  • 良くみたらTESTピンに何もつないでない。5Vじゃないとマズい?
  • 他の入力ピンの設定はこれでいいのか?
  • リセットの仕方はこれでいいのか?
  • 配線にミスはないか?

つづく

まず、配線のチェックをしたい。 TESTをなおしたり、レベルコンバーターを入れたい。

20円ぐらいの、i2c用のレベルコンバータなら沢山あるけど、これでいけるかな?

次回はその辺をやりたい。

と思ってたけど、別の事をすすめた