2016-07-15 8 views
2

pdp-11(大学での説明を学び、これを見直したい)の基本的な基本を理解しようとしています.TTO/DL11からいくつかの文字を最初のプログラム(最初のプログラムが複雑すぎる場合を除きます)。初心者のベアメタルpdp11コンソール出力

simhで実行中です。ショーdevのはstackoverflowの、そこにあるいくつかの他のページで他のコードを見て566をオフセットでTXバッファがあるドキュメントを読む

TTO, address=17777564-17777567, vector=64 

あり/ 177566(8進数)を言う上位アドレス空間のMMUあなたを置いてもよいかもしれませんshow devが示すように、レジスタは16ビットではなく22ビットです。

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 

コンソールの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アセンブラを手に入れたいと思っています。

simpt pdp11のapt-got v3.8-1と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 
... 

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つの問題、私は忙しいのを待っていなかったものを作るEDIT

#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; 
} 

。 init/resetでは大丈夫ではありません。キッカーはキャラクターを吐き出す前に止めていたと思う。ループがあると、ほとんどの文字が吐き出されます。私が一人のキャラクターを送り出してそれを止めてもそれが出てこないのですが、忙しく待ってから(最後のものは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:(代わりに、@の*、代わりに#の$)アセンブリで

、GNUアセンブラ構文を使用して、TTYから文字を送信するという目標を満たすために

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

実際に生成されたPDP-11コードは非常に非効率的です。レディビットは、意図的に下位バイトの上位ビットです。これにより、 'TSTB @#0177564'、' BLT。-6'でテストを行い、ループを完了させることができます。ちょうどあなたが知りたいと思うと思った。 – MAP

+0

そのa Cコンパイラ。私は非常に単語を使用しません、それはレジスタを燃やし、単語のカップルを追加する、私は最適化をオフにする可能性があり、おそらくそれをさらに悪化させる。それの前にオペレーティングシステムを置くと、それはずっと悪くなる。ポインタをcharにすると、コンパイラはmovb * $ 177564、r0;を生成します。 bge ...は、レジスタを書き込みますが、tstb/bplと同じサイズです。パンチ・ステータスとパンチ・バッファは、未使用ビットを持つ16ビット・レジスタとして定義されているため、それらを定義するのは間違いではなく、16ビット・レジスタにバイトとしてアクセスすることが安全であることを知る必要があります。 –

+0

もし我々が速度を議論したいのであれば、コンパイラがループをアンロールして、レジスタをttyバッファに供給するのではなく、movb $ 060、* $ 0177566のバイトを押し込んだだけで、それはCコンパイラであり、実際にはCコンパイラが行っているのでかなり良い仕事をしています。高水準言語のアプリケーションでも同じことが言えますが、出力を "改善"するための調整をいつでも見つけることができます。 –

答えて

2

私は思います問題はDL11を正しく使用していません。あなたはいつでもあなたにそれを与えることができます文字をしたい。コントロールレジスタの "ready"フラグをテストする必要があります。それで準備ができたらキャラクターを送ってください。また、データレジスタから値を確実に読み取ることはできません。そして、あなたはその文字をメモリポインタとして使用しています(そこには確かにメモリがありますが、それに書き込むのはおそらくあなたが意図したものではありません)。

また、Retrocomputing Stack Exchangeサイトを参照してください。私はたぶんPDP-11の経験でそこにぶら下がっている唯一の人ではないでしょうが、私はここにいるかもしれません。

+0

理解していますが、いくつかのシミュレータでは、initをバイパスして、txバッファのために右に行くことができます。より大きな問題は、私が正しい道筋に遠く離れていても、64Kアドレス空間内でアドレス指定し、16ビットアドレスよりも大きいと主張するこれらの周辺機器にヒットすることができるか、余分なアドレスビットを生成するためにこれらのアクセスをしていますか? –

+0

177xxxタイプのアドレスで周辺空間またはメモリ空間をアドレス指定しているかどうかを判断する簡単な方法はありますか? –

+1

176000以上のベアメタル上のすべての通常参照はI/Oページを参照します。唯一の時間は、メモリ管理が有効になっている場合です。 – MAP