A2PDP11 (13) BASIC の実行
先例にならい、BASIC を実行してみます。
BASIC 起動時にペーパーテープリーダ状態レジスタが確認されるため、ダミーの応答をするようにします。
// PC11 Paper Tape Reader/Punch
parameter PC11 = 19'o1777755; // PC11 registers
parameter PRS = 22'o17777550; // Paper Tape Reader Status Register
parameter PRB = 22'o17777552; // Paper Tape Reader Buffer Register
parameter PPS = 22'o17777554; // Paper Tape Punch Status Register
parameter PPB = 22'o17777556; // Paper Tape Punch Buffer Register
assign nxm_n = sctl_n ? 1'b1 : !nxm;
logic nxm;
always_ff@(negedge sctl_n) begin
if ((maio[3:2] == 2'b10) || (maio[3:2] == 2'b00)) begin
// RMW_BUSLOCK, RMW_NOLOCK, DATA_READ, DEMAND_READ, WORD_WRITE, BYTE_WRITE
if (mbs == BS_MEM) begin
if (mdal >= 22'o17760000) begin
nxm <= 1'b1;
end
end
if (mbs == BS_EXT) begin
if ((mdal[21:3] == DLART) || (mdal[21:3] == PC11)) begin
nxm <= 1'b0;
end else begin
nxm <= 1'b1;
end
end
end else begin
nxm <= 1'b0;
end
end
logic [15:0] dal_out;
logic [15:0] odt_out;
logic [15:0] mem_out;
assign dal = bufctl_n ? 16'bz : dal_out | odt_out | mem_out;
always_ff@(negedge bufctl_n) begin
if ((maio == DATA_READ) && (mbs == BS_EXT)) begin
case (mdal)
RCSR : odt_out <= {8'b0, wxrdy, 7'b0};
XCSR : odt_out <= {8'b0, rxrdy, 7'b0};
RBUF : odt_out <= wdata;
PRS : odt_out <= 16'b1000_0000_0000_0000;
PRB : odt_out <= 16'b0;
PPS : odt_out <= 16'b0000_0000_1000_0000;
default : odt_out <= 16'bz;
endcase
end else begin
odt_out <= 16'bz;
end
end
PDP-11 GUI を使い、かんぱぱさんの、ASCIIART ベンチマークを実行してみました。
ASCIIART の実行に、13分50秒かかりました。全てのメモリ読み出しで、6 サイクルの遅延が入っているため、かなり遅いです。
参考文献
PC11 high-speed reader/punch and control manual, CHAPTER 3, 1974
http://www.bitsavers.org/pdf/dec/unibus/PC11_Reader-Punch_Manual.pdf#page=13
PDP-11 BASIC Programming Manual, 1970
きょうのかんぱぱ, 2024.08.02