PDP11 портирование с Z80: различия между версиями
Nzeemin (обсуждение | вклад) (Новая страница: «{{Emuverse}} Маппинг регистров и команд при портировании с процессора Z80 на PDP-11. Маппинг реги…») |
Nzeemin (обсуждение | вклад) Нет описания правки |
||
| (не показано 10 промежуточных версий 2 участников) | |||
| Строка 15: | Строка 15: | ||
Типичные команды: | Типичные команды: | ||
<pre> | <pre> | ||
JR addr BR addr | JP addr JMP addr либо BR 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 | ||
| Строка 24: | Строка 26: | ||
SRL xx ASR xx | SRL xx ASR xx | ||
PUSH rr MOV rr, -(SP) | |||
POP rr MOV (SP)+, rr | |||
RET RETURN | |||
</pre> | |||
Битовые операции: | |||
<pre> | |||
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 | |||
</pre> | |||
DJNZ: | |||
<pre> | |||
1$: | |||
... | |||
SOB R1, 1$ | |||
</pre> | |||
LDI: | |||
<pre> | |||
MOVB (R3)+, (R2)+ | |||
DEC R1 | |||
</pre> | |||
LDIR: | |||
<pre> | |||
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$ | |||
</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, который обычно не занят: | |||
<pre> | |||
MOV R3, R5 | |||
MOV R2, R3 | |||
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 совместимые]] | |||
Текущая версия от 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 слова и быстрее).
На что обратить внимание при портировании:
- Z80 и PDP-11 по-разному работают с флагами. На Z80 инструкции копирования данных
ldне меняют флаги, на PDP-11 инструкцииMOV/MOVBустанавливают N,Z по результату и очищают V. - В системе команд PDP-11 источник инструкции
XORможет быть только регистром, т.е. инструкция видаXOR #12345, (R0)недопустима. - Инструкции
MULиDIVпо-разному ведут себя с чётными и нечётными реистрами.