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
実際に生成されたPDP-11コードは非常に非効率的です。レディビットは、意図的に下位バイトの上位ビットです。これにより、 'TSTB @#0177564'、' BLT。-6'でテストを行い、ループを完了させることができます。ちょうどあなたが知りたいと思うと思った。 – MAP
そのa Cコンパイラ。私は非常に単語を使用しません、それはレジスタを燃やし、単語のカップルを追加する、私は最適化をオフにする可能性があり、おそらくそれをさらに悪化させる。それの前にオペレーティングシステムを置くと、それはずっと悪くなる。ポインタをcharにすると、コンパイラはmovb * $ 177564、r0;を生成します。 bge ...は、レジスタを書き込みますが、tstb/bplと同じサイズです。パンチ・ステータスとパンチ・バッファは、未使用ビットを持つ16ビット・レジスタとして定義されているため、それらを定義するのは間違いではなく、16ビット・レジスタにバイトとしてアクセスすることが安全であることを知る必要があります。 –
もし我々が速度を議論したいのであれば、コンパイラがループをアンロールして、レジスタをttyバッファに供給するのではなく、movb $ 060、* $ 0177566のバイトを押し込んだだけで、それはCコンパイラであり、実際にはCコンパイラが行っているのでかなり良い仕事をしています。高水準言語のアプリケーションでも同じことが言えますが、出力を "改善"するための調整をいつでも見つけることができます。 –