PL/M

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

PL/M

Post by Lavr »

Попробовал я тут немного взглянуть, какой код делает этот самый PL/M для i8080,
и был я несколько обескуражен, если не сказать разочарован... :-?

Простой код на PL/M был вот такой:

Code: Select all

declare houk address; /* двухбайтовая переменная */
declare aat based houk byte;  /* однобайтовая переменная по адресу houk */

/* очистка области */
/* от 4000h ... 5000h*/
do houk=16384 to 20480;
 aat=0;
end;
Если писать вручную на ассемблере, я бы, пожалуй, сделал это вот так:

Code: Select all

    LXI  H,4000h 
    LXI  B,5000h-4000h-1
MT:
    MVI  M,00H
    INX  H
    DCX  B
    MOV  A,B
    ORA  C
    JNZ  MT
    HLT
Ну или проверял бы достижение HL адреса 5000h...

Но PL/M сгенерировал код весьма задумчивый... :-?

Code: Select all

0000 JMP  0003

0003 LXI  SP,00FC

0006 LXI  H,00FC
0009 MVI  M,00H
000B INX  H ; FD
000C MVI  M,40H

000E XRA  A
000F MVI  B,50H
0011 LXI  H,00FC
0014 SUB  M
0015 INR  L
0016 MOV  C,A
0017 MOV  A,B
0018 SBB  M
0019 JC   0031
001C LHLD 00FC
001F MVI  M,00H
0021 LXI  H,00FC
0024 MOV  C,M
0025 INR  L
0026 MOV  B,M
0027 LXI  H,0001
002A DAD  B
002B SHLD 00FC
002E JMP  000E

0031 EI
0032 HLT
iLavr
User avatar
barsik
Doomed
Posts: 585
Joined: 19 Feb 2017 03:46
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь

Post by barsik »

Lavr wrote:Если писать вручную на ассемблере, я бы, пожалуй, сделал это вот так:

Code: Select all

LXI  B,5000h-4000h-1
Отнимать 1 не надо.
Lavr wrote:PL/M сгенерировал код весьма задумчивый
А у меня получилось, с учётом, что код от ЯВУ, вполне прилично.

Code: Select all

        EXTRN   LIBSUB, EXIT

        LD      HL,4000H
        LD      (ADDR),HL
        
LOOP:   LD      A,0
        LD      HL,(ADDR)
        LD      (HL),A
        
        LD      HL,(ADDR)
        INC     HL
        LD      (ADDR),HL
        
        EX      DE,HL
        LD      HL,5000H
        CALL    LIBSUB          ; возвр A=255 если HL>DE или 0
        RRC
        JP      NC,EXIT
        
        JP      LOOP

ADDR:   DS      2
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re:

Post by Lavr »

barsik wrote:А у меня получилось, с учётом, что код от ЯВУ, вполне прилично.
Это радует.
А теперь было бы неплохо, если бы вы скомпилировали пример, аналогичный исходному, на своём супер-Паскале,
а я попробую сделать то же самое на Best_C.
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Подсветка синтаксиса PL/M

Post by Lavr »

В общем поскольку PL/M язык древний, синтаксической подсветки для него я не нашел.
Есть одна подсказка с дружественного форума:
svofski wrote:Подсветка синтаксиса PL/M есть в vim/gvim в стандартной комплектации.
Но у меня такого не водится...
В Professional Notepad от A Tech Group, которым я пользуюсь, приблизительно подходит подсветка синтаксиса от Sql.

Поэтому я сделал свой вариант подсветки для текстового редактора из Folder Manager, которым я сам
также пользуюсь при программировании.
Его делали программисты для программистов как приложение DOS, и как консольное приложение Windows,
поэтому он под виндами весьма неплохо работает, и в нём достаточно удобных фич именно для написания
программ на многих языках.

 Подсветка синтаксиса PL/M

Code: Select all

; ----------------------------------------
;    0 - black          8 - gray
;    1 - blue dark      9 - blue light
;    2 - green dark    10 - green light
;    3 - cyan          11 - cyan light
;    4 - red           12 - red light
;    5 - magneta       13 - magneta light
;    6 - brown         14 - yellow light
;    7 - white         15 - white light
; ----------------------------------------
; PL/M files (by Lavr)
FILES *.PLM
;  Run = plm81.exe, plm82.exe
  Macro = ~P~LM file
    Print 'PROGRAM: DO'^M
    Home
    Print ^M^M^M
    Print 'END PROGRAM'^M
  EndMacro
  CommentStart = /*
  CommentEnd = */
; Assembler_Highlight = 2
; Declarations keywords - blue light
  Words = 9,declare,based,initial,data,literally,label,address,word,byte,structure,text,external,public,reentrant,use

; statement grouping & cycles 10 - green light
  Words = 10,do,end,to,by,case,while,if,then,else,procedure,asm,endasm,eof

; branching and flow control keywords - magneta light
  Words = 13,goto,go to,call,return,halt

; In/Out operations keywords
  Words = 15,input,output

; Built-in procedures and functions
  Words = 15,length,last,low,high,double

; boolean operators - red light
  Words = 12,not,and,or,xor

; math operators - red light
  Words = 12,plus,minus,mod,+,-,*,/,<,<=,=,>=,>,<>

; Shift functions - red light
  Words = 12,call time,rol,ror,scl,scr,shl,shr

; predefined variable
  Words = 15,carry,zero,sign,parity,memory,stackptr

; Misc keywords
  Words = 15,interrupt,disable,enable

; i8080 ASM Mnemonics
; Registers (16 & 8 bit)
  Words = 10,h,l,d,e,b,c,psw,sp,a,m
; Assembler directives
  Words = 10,org
  Words = 9,equ,dw,db,dt,ds
; Data transfer instructions
  Words = 15,mov,mvi,lda,sta,ldax,stax,lxi,lhld,shld,xchg,sphl,xthl,push,pop
; Arithmetic instructions
  Words = 12,add,adc,sub,sbb,adi,aci,sui,sbi,inr,dcr,inx,dcx,dad
; Binary logic instructions
  Words = 12,ana,ora,xra,cmp,ani,ori,xri,cpi
; Rotate instructions
  Words = 12,ral,rar,rrc,rlc
; System & special instructions
  Words = 15,nop,hlt,cma,in,out,stc,cmc,ei,di,daa
; Execution control instructions
  Words = 13,jmp,rst,pchl
  Words = 13,jnz,jz,jnc,jc,jpo,jpe,jp,jm
  Words = 13,cnz,cz,cnc,cc,cpo,cpe,cp,cm
  Words = 13,ret,rnz,rz,rnc,rc,rpo,rpe,rp,rm
END

Подсвечивает синтаксис и ассемблерных вставок в синтаксисе i8080.
Выглядит это примерно вот так:
plm0.gif
Я думаю, у кого свои любимые Notepad-ы программиста, адаптировать подсветку синтаксиса
PL/M по образцу будет нетрудно...

Сам компилятор PL/M я брал вот здесь: Разработка для i8080 на языке PL/M
И насколько там пишут - этот вариант скомпилирован из древних исходников на Фортране той версии PL/M,
которой, возможно, пользовался ещё Гэрри Килдол.

Адаптировал это Александр Завгородний (aka Kakos_Nonos) и расточил под компьютера "Апогей БК-01",
но это легко правится в библиотеке системных вызовов все эти наши 0F803H, 0F809H и т.д.
Александр Завгородний приделал несколько приятных фич в свой пакет, о которых прочитать можно здесь.
В частности, не надо заканчивать строки символом ' ; ' - это делается на лету при компиляции.

Результирующая программа в кодах i8080 не требует никакой CP/M и нормально работает даже под
"Специалистом", если заведомо не делать никаких некорректных вещей.
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: PL/M

Post by Lavr »

Lavr wrote:Простой код на PL/M был вот такой:

Code: Select all

declare houk address; /* двухбайтовая переменная */
declare aat based houk byte;  /* однобайтовая переменная по адресу houk */

/* очистка области */
/* от 4000h ... 5000h*/
do houk=16384 to 20480;
 aat=0;
end;
...
я попробую сделать то же самое на Best_C.
В общем попробовал я заполнить область 9000Н...0BFFFН экрана "Специалиста" байтом 0FFH на этом самом Best_C.

Код на Си был следующий:

Code: Select all

MAIN()
[[
CHAR *VAL;
VAL=36863; /*9000H - 1*/
/* FILL SCREEN AREA WITH 0FFH */
   WHILE ( VAL++<49152 ) /*0C000H*/
   [[
     *VAL=255;
   ]]
]]
Компилятор Best_C развернул его вот в такую "простыню":
C-CODE.gif
Так что по краткости - сестре таланта - компилятор PL/M пока лидирует! :D
You do not have the required permissions to view the files attached to this post.
iLavr