Поэтому, я написал компилятор по родным спекам Intel и IBM. Целевая платформа у меня Радио-86РК, но для других машин на i8080 должно тоже получаться.
Итак...
Имеем программу "test.plm":
Code: Select all
PUTS: PROCEDURE (P) REGS(HL) AT (0F818H); DECLARE P ADDRESS; END PUTS;
PUTC: PROCEDURE (CH) REGS(C) AT (0F809H); DECLARE CH BYTE; END PUTC;
HEXB: PROCEDURE (B) REGS(A) AT (0F815H); DECLARE B BYTE; END HEXB;
DECLARE HELLO BYTE(24) INITIAL('PL/M-80 COMPILER HERE', 0DH, 0AH, 0);
DECLARE SUM_LABEL BYTE(16) INITIAL('SUM (0..10) = ', 0);
DECLARE CRLF BYTE(3) INITIAL(0DH, 0AH, 0);
DECLARE I BYTE;
DECLARE SUM BYTE;
CALL PUTS(.HELLO);
I = 0;
SUM = 0;
DO WHILE I <= 10;
CALL HEXB(I);
CALL PUTC(20H);
SUM = SUM + I;
I = I + 1;
END;
CALL PUTS(.CRLF);
CALL PUTS(.SUM_LABEL);
CALL HEXB(SUM);
CALL PUTS(.CRLF);Code: Select all
npx plm80 test.plm --org 0 --stack 76CFh -o test.asmCode: Select all
; generated by plm-80
puts equ 0F818h
putc equ 0F809h
hexb equ 0F815h
org 0000h
start:
lxi sp, 76CFh
lxi h, hello
call puts
mvi a, 00h
sta i
mvi a, 00h
sta sum
L1_while:
mvi a, 0Ah
push psw
lda i
mov b, a
pop psw
cmp b
jnc L3_ctrue
xra a
jmp L4_cend
L3_ctrue:
mvi a, 0FFh
L4_cend:
ora a
jz L2_endw
lda i
call hexb
mvi a, 20h
mov c, a
call putc
lda sum
push psw
lda i
mov b, a
pop psw
add b
sta sum
lda i
push psw
mvi a, 01h
mov b, a
pop psw
add b
sta i
jmp L1_while
L2_endw:
lxi h, crlf
call puts
lxi h, sum_label
call puts
lda sum
call hexb
lxi h, crlf
call puts
hlt
; --- data ---
hello: db "PL/M-80 COMPILER HERE", 0Dh, 0Ah, 00h
sum_label: db "SUM (0..10) = ", 00h
ds 1
crlf: db 0Dh, 0Ah, 00h
i: ds 1
sum: ds 1
end
Code: Select all
npx asm8080 test.asmЗапускаем в эмуляторе Радио-86РК
Code: Select all
npx rk86 test.bin --exit-haltЯ поддержал практически все более менее официальныe возможности PL/M.
