PDP11 портирование с Z80: различия между версиями

Материал из Emuverse
Нет описания правки
Нет описания правки
 
(не показано 7 промежуточных версий этого же участника)
Строка 15: Строка 15:
Типичные команды:
Типичные команды:
<pre>
<pre>
JP addr      JMP addr
JP addr      JMP addr  либо  BR addr
JR addr      BR addr  либо  JMP addr


JR addr      BR addr / JMP addr
JR C, addr    BLO addr
JR C, addr    BLO addr
JR NC, addr  BHIS addr
JR NC, addr  BHIS addr
Строка 33: Строка 33:
</pre>
</pre>


Проверка бит:
Битовые операции:
<pre>
<pre>
BIT 0,A      BIT #1, R0
BIT 0,A      BIT #1, R0
Строка 43: Строка 43:
BIT 6,A      BIT #64., R0
BIT 6,A      BIT #64., R0
BIT 7,A      BIT #128., R0
BIT 7,A      BIT #128., R0
SET 0,A      BIS #1, R0
...
SET 7,A      BIS #128., R0
RES 0,A      BIC #1, R0
...
RES 7,A      BIC #128., R0
</pre>
</pre>


Строка 52: Строка 58:
</pre>
</pre>


LDI:
<pre>
MOVB (R3)+, (R2)+
DEC R1
</pre>
LDIR:
LDIR:
<pre>
<pre>
Строка 60: Строка 71:
SOB R1, 1$
SOB R1, 1$
</pre>
</pre>
LDD:
<pre>
MOVB (R3), (R2)
DEC R3
DEC R2
DEC R1
</pre>
LDDR:
<pre>
1$: MOVB (R3), (R2)
DEC R3
DEC R2
SOB R1, 1$
</pre>
LDDR более короткий вариант, но нужно перед этим увеличить R3 и R2 на единицу:
<pre>
1$: MOVB -(R3), -(R2)
SOB R1, 1$
</pre>
EX DE,HL -- через регистр R5, который обычно не занят:
EX DE,HL -- через регистр R5, который обычно не занят:
<pre>
<pre>
MOV R3, R5 ; A1A9 EX DE,HL
MOV R3, R5
MOV R2, R3
MOV R2, R3
MOV R5, R2
MOV R5, R2
</pre>
</pre>
EX DE,HL -- тремя XOR:
<pre>
XOR R3, R2
XOR R2, R3
XOR R3, R2
</pre>
Чтение DE из (HL), для случая когда в HL может быть нечётный адрес:
<pre>
CLR R2 ;
BISB R2, (R3)+ ; LD E,(HL)
SWAB R2 ; INC HL
BISB R2, (R3) ; LD D,(HL)
SWAB R2 ;
</pre>
Паттерн взятия байта из памяти в регистр:<br>
Вместо <code>MOVB (R1),R0 / BIC #177400,R0</code> (3 слова, BIC нужен из-за расширения знака из байта в слово) лучше испольовать <code>CLR R0 / BISB (R1),R0</code> (2 слова и быстрее).
На что обратить внимание при портировании:
# Z80 и PDP-11 по-разному работают с флагами. На Z80 инструкции копирования данных <code>ld</code> не меняют флаги, на PDP-11 инструкции <code>MOV</code>/<code>MOVB</code> устанавливают N,Z по результату и очищают V.
# В системе команд PDP-11 источник инструкции <code>XOR</code> может быть только регистром, т.е. инструкция вида <code>XOR #12345, (R0)</code> недопустима.
# Инструкции <code>MUL</code> и <code>DIV</code> по-разному ведут себя с чётными и нечётными реистрами.


[[Категория:PDP-11 совместимые]]
[[Категория:PDP-11 совместимые]]

Текущая версия от 03:35, 7 июля 2026

Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0.

Маппинг регистров и команд при портировании с процессора Z80 на PDP-11.

Маппинг регистров:

A       R0
BC      R1
DE      R2
HL      R3
IX      R4
IY      R5

Типичные команды:

JP addr       JMP addr  либо  BR addr
JR addr       BR addr  либо  JMP addr

JR C, addr    BLO addr
JR NC, addr   BHIS addr
JR Z, addr    BEQ addr
JR NZ, addr   BNE addr

CP $xx        CMP R0, #xx / CMPB R0, #xx

SRL xx        ASR xx

PUSH rr       MOV rr, -(SP)
POP rr        MOV (SP)+, rr

RET           RETURN

Битовые операции:

BIT 0,A       BIT #1, R0
BIT 1,A       BIT #2, R0
BIT 2,A       BIT #4, R0
BIT 3,A       BIT #8., R0
BIT 4,A       BIT #16., R0
BIT 5,A       BIT #32., R0
BIT 6,A       BIT #64., R0
BIT 7,A       BIT #128., R0
SET 0,A       BIS #1, R0
...
SET 7,A       BIS #128., R0
RES 0,A       BIC #1, R0
...
RES 7,A       BIC #128., R0

DJNZ:

1$:
	...
	SOB	R1, 1$

LDI:

	MOVB	(R3)+, (R2)+
	DEC	R1

LDIR:

	MOV	#LDB05, R3		; 97DF	LD HL,$DB05	
	MOV	#LEB00, R2		; 97E2	LD DE,$EB00	
	MOV	#4096., R1		; 97E5	LD BC,$1000	
1$:	MOVB	(R3)+, (R2)+		; 97E8	LDIR
	SOB	R1, 1$

LDD:

	MOVB	(R3), (R2)
	DEC	R3
	DEC	R2
	DEC	R1

LDDR:

1$:	MOVB	(R3), (R2)
	DEC	R3
	DEC	R2
	SOB	R1, 1$

LDDR более короткий вариант, но нужно перед этим увеличить R3 и R2 на единицу:

1$:	MOVB	-(R3), -(R2)
	SOB	R1, 1$

EX DE,HL -- через регистр R5, который обычно не занят:

	MOV	R3, R5
	MOV	R2, R3
	MOV	R5, R2

EX DE,HL -- тремя XOR:

	XOR	R3, R2
	XOR	R2, R3
	XOR	R3, R2

Чтение DE из (HL), для случая когда в HL может быть нечётный адрес:

	CLR	R2			; 
	BISB	R2, (R3)+		; LD E,(HL)
	SWAB	R2			; INC HL
	BISB	R2, (R3)		; LD D,(HL)
	SWAB	R2			; 

Паттерн взятия байта из памяти в регистр:
Вместо MOVB (R1),R0 / BIC #177400,R0 (3 слова, BIC нужен из-за расширения знака из байта в слово) лучше испольовать CLR R0 / BISB (R1),R0 (2 слова и быстрее).

На что обратить внимание при портировании:

  1. Z80 и PDP-11 по-разному работают с флагами. На Z80 инструкции копирования данных ld не меняют флаги, на PDP-11 инструкции MOV/MOVB устанавливают N,Z по результату и очищают V.
  2. В системе команд PDP-11 источник инструкции XOR может быть только регистром, т.е. инструкция вида XOR #12345, (R0) недопустима.
  3. Инструкции MUL и DIV по-разному ведут себя с чётными и нечётными реистрами.