2

私は pdp-11 を使用するための初歩的な基本を理解しようとしています (大学で命令セットを学び、これを再検討したい)、最初のプログラムとして TTO/DL11 からいくつかのキャラクターを撃ちたいと思っています (それが最初に複雑すぎる場合を除きます)。プログラム)。

simhで実行しています。show dev が持っている

TTO, address=17777564-17777567, vector=64

ドキュメントを読み取ると、tx バッファーはオフセット 566 にあります。stackoverflow で他のコードを確認し、他のページに 177566 (8 進数) と言う上位アドレス空間に mmu がある/ある可能性があります。レジスタは 22 ビットではなく 16 ビットであるため、そこに配置されますショーの開発者が暗示しています。

mov $0x32,r1
movb r1, @$0177566
mov $0177566,r2
mov $0x30,r3
movb r3,(r2)
mov $0x31,r3
movb r3,(r2)
halt

そして何も出ません。

load test.bin
go

set console telnet=4444 と telnet を使用できますが、変更はありません。間違いなく、16 ビットを超えるアドレス指定については理解できませんが、これを理解するためにどこに行けばよいかわかりません。

基本的には、コンソールからいくつかの文字を表示するのに大量のコード (数千行の asm) が必要でない限り、そこから何かを「見て」始めてから構築したいと考えています。したがって、私が近くにいるが完全ではない場合、またはこれが開始するのに最適な周辺機器ではない場合、どこに行くべきか、それらはすべてその上位アドレス空間にあります.

私はgnuツールを使用しています

pdp11-aout-as --version
GNU assembler (GNU Binutils) 2.26.20160125
Copyright (C) 2015 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `pdp11-aout'.

そのため、構文は少し間抜け/非標準です。pdp11 は、少なくとも現在いくつかのリリースで binutils でサポートされており、それも利用したいと考えています。simh のバイナリ ファイル形式を理解するのはそれほど難しくありませんでした。シングル ステップは、私が必要としている命令と一致しており、gnu アセンブラーにフィードしています。

apt-got v3.8-1 バージョンの simh pdp11 と github の両方で試してみましたが、同じ結果が 4.0 バージョンでした。pdp11 シミュレーター/実行可能ファイルを使用します。

sim> show config
PDP-11 simulator configuration

CPU, 11/73, NOCIS, idle disabled, autoconfiguration enabled, 256KB
SYSTEM
RHA, address=17776700-17776753, vector=254
RHB, disabled
CLK, 60Hz, address=17777546-17777547, vector=100
PCLK, disabled
PTR, address=17777550-17777553, vector=70, not attached
PTP, address=17777554-17777557, vector=74, not attached
TTI, address=17777560-17777563, vector=60, 7b
TTO, address=17777564-17777567, vector=64, 7p
CR, address=17777160-17777167, vector=230, 285 cards per minute, translation 029, not attached, CR11, auto EOF, unknown format
LPT, address=17777514-17777517, vector=200, not attached
DLI, disabled
DLO, disabled
...

編集

#define TKS (*((volatile unsigned *)0177560))
#define TKB (*((volatile unsigned *)0177562))
#define TPS (*((volatile unsigned *)0177564))
#define TPB (*((volatile unsigned *)0177566))

void punch ( unsigned x )
{
    while((TPS&0x80)==0) continue;
    TPB=x;
}

void notmain ( void )
{
    //unsigned ra;
    //for(ra=0x30;ra<0x37;ra++) punch(ra);
    punch(0x30);
    while((TPS&0x80)==0) continue;
    return;
}

作るもの

Disassembly of section .text:

00000000 <start.o>:
   0:   15c6 2000       mov $20000, sp
   4:   09f7 001a       jsr pc, 22 <_punch+0x18>
    ...

0000000a <_punch>:
   a:   1166            mov r5, -(sp)
   c:   1185            mov sp, r5
   e:   17c0 ff74       mov *$177564, r0
  12:   45c0 ff7f       bic $-201, r0
  16:   03fb            beq e <_punch+0x4>
  18:   1d5f 0004 ff76  mov 4(r5), *$177566
  1e:   1585            mov (sp)+, r5
  20:   0087            rts pc
  22:   1166            mov r5, -(sp)
  24:   1185            mov sp, r5
  26:   17c0 ff74       mov *$177564, r0
  2a:   45c0 ff7f       bic $-201, r0
  2e:   03fb            beq 26 <_punch+0x1c>
  30:   15df 0030 ff76  mov $60, *$177566
  36:   17c0 ff74       mov *$177564, r0
  3a:   45c0 ff7f       bic $-201, r0
  3e:   03fb            beq 36 <_punch+0x2c>
  40:   1585            mov (sp)+, r5
  42:   0087            rts pc

2 つの問題、1 つ私は忙しいのを待っていませんでした。大丈夫な初期化/リセットでは、ビジーではありません。キッカーは、キャラクターを吐き出す前に立ち止まったことだと思います。ループが発生すると、ほとんどの文字が吐き出されました。1文字を送信して停止しても出てこないのですが、ビジー状態になるまで待つと(notmain()の最後のもの)、その文字が出てきます。

これに変えたら

#define TKS (*((volatile unsigned *)0177560))
#define TKB (*((volatile unsigned *)0177562))
#define TPS (*((volatile unsigned *)0177564))
#define TPB (*((volatile unsigned *)0177566))

void punch ( unsigned x )
{
    TPB=x;
    while((TPS&0x80)==0) continue;
}

void notmain ( void )
{
    unsigned ra;
    for(ra=0x30;ra<0x37;ra++) punch(ra);
    return;
}

それは非常にうまく機能します...私をキックスタートさせてくれてありがとう。

マニュアルからのメモ:

In addition to the word length constraint on basic memory addressing
space, the uppermost 4K words of address space is always reserved for
UNIBUS 1/0 device registers. In a basic PDP-11/40 memory configura·
tion (without Management) all address references to the uppermost 4K
words of 16-bit address space (170000-177777) are converted to full
18-bit reference5 with bits 17 and 16 always set to 1. Thus, a 16·bit
reference to the 1/0 device register at address 173224 is automatically
internally converted to a full 18-bit reference to the register at address
773224. Accordingly, the basic PDP-11/40 configuration can directly
address up to 28K words of true memory, and 4K words of UNIBUS 1/0
device registers.

その答えはすぐそこにあったので、私は正しい場所を見ませんでした。

EDIT2:

アセンブリでは、文字を tty から送信するという目標を達成するために、gnu アセンブラー構文 (@ の代わりに *、# の代わりに $) を使用します。

movb $0x32,*$0177566
pwait:
   tstb *$0177564
   bpl pwait
halt
4

1 に答える 1

2

問題は DL11 を正しく使用していないことだと思います。いつでも好きなときにキャラクターを与えることはできません。制御レジスタの「準備完了」フラグをテストする必要があります。次に、準備ができたら、キャラクターを送信します。また、データ レジスタから値を確実に読み取ることもできません。そして、その文字をメモリ ポインタとして使用しています (確かにそこにはメモリがありますが、そのメモリへの書き込みはおそらく意図したものではありませんでした)。

また、Retrocomputing Stack Exchange サイトもご覧ください。PDP-11 の経験を積んでいるのはおそらく私だけではありませんが、ここにいる可能性もあります。

于 2016-07-15T03:15:48.487 に答える