Ок, посмотрю, но когда получится - наверняка не скажу. Точнее так - в выходные - да, а вот до выходных получится или нет..
Ок, посмотрю, но когда получится - наверняка не скажу. Точнее так - в выходные - да, а вот до выходных получится или нет..
В FPP команды одинарной и двойной точности имеют один и тот же код. Перед их использованием нужно указать точность с помощью команд SETF или SETD.
- - - Добавлено - - -
Если вы про DECUS C, то он с FPP работает в режиме двойной точности, в библиотеке она устанавливается командой SETD (170011). При работе с переменными одинарной точности происходит загрузка и сохранение регистров с преобразованием точности. В качестве примера небольшая программка и полученный результат на ассемблере:
Код:float a1,a2,a3; double b1,b2,b3; int main() { a1=1; a2=2; a3=a1/a2; b1=1; b2=2; b3=b1/b2; }Код:.comm _a1,4 .comm _a2,4 .comm _a3,4 .comm _b1,10 .comm _b2,10 .comm _b3,10 .globl _main .text _main: ~~main: jsr r5,csv~ movf $40200,r0 movfo r0,_a1 movf $40400,r0 movfo r0,_a2 movof _a1,r0 movof _a2,r1 divf r1,r0 movfo r0,_a3 movf $40200,r0 movf r0,_b1 movf $40400,r0 movf r0,_b2 movf _b1,r0 divf _b2,r0 movf r0,_b3 jmp cret~ .globl fpin~~ .globl fppr~~ .globl fpem~~
vva (17.05.2023)
Уже разобрался (ранее ориентировался только на код, генерируемый компилятором). Вывод, сделанный ранее про PDP-11 C V1.2-006 был неверен, идет работа с double:
#include <stdio.h>
#define N 20
int main()
{
int i;
static double o1, o2, v1, v2, v3, v4;
for(i=0; i<N; i++)
{
o1=i+1; o2=o1; v1=o1+o2; v2=o1-o2;
v3=o1*o2; v4=o1/o2;
}
}
.TITLE TOP8NP
.IDENT /V1.0 /
.PSECT $CODEI,RO,I,LCL,REL,CON
$CODEI:
.PSECT $READW,RW,D,GBL,REL,CON,SAV
$READW:
.BLKB 8. ; o1
.BLKB 8. ; o2
.BLKB 8. ; v1
.BLKB 8. ; v2
.BLKB 8. ; v3
.BLKB 8. ; v4
.GLOBL C$SVFR,C$MAI
.PSECT $CODEI
MAIN:: ; main
CALL C$SVFR ; 227
CLR R4 ; 232 i
BR 2$
1$: MOV R4,R5 ; 234 i,
INC R5
SETD
SETI
LDCIF R5,F3
STF F3,$READW+0 ; ,o1
LDF $READW+0,F3 ; o1,
STF F3,$READW+8. ; ,o2
LDF $READW+0,F3 ; o1,
ADDF $READW+8.,F3 ; o2,
STF F3,$READW+16. ; ,v1
LDF $READW+0,F3 ; o1,
SUBF $READW+8.,F3 ; o2,
STF F3,$READW+24. ; ,v2
LDF $READW+0,F3 ; 235 o1,
MULF $READW+8.,F3 ; o2,
STF F3,$READW+32. ; ,v3
LDF $READW+0,F3 ; o1,
DIVF $READW+8.,F3 ; o2,
STF F3,$READW+40. ; ,v4
INC R4 ; 232 i
2$: CMP R4,#20. ; i,
BLT 1$
RETURN
.END
- - - Добавлено - - -
Эта програмка на PDP-11 C выглядит нагляднее:
.PSECT $CODEI,RO,I,LCL,REL,CON
$CODEI:
.PSECT $READW,RW,D,GBL,REL,CON,SAV
$READW:
A1:: .BLKB 4 ; a1
A2:: .BLKB 4 ; a2
A3:: .BLKB 4 ; a3
B1:: .BLKB 8. ; b1
B2:: .BLKB 8. ; b2
B3:: .BLKB 8. ; b3
.GLOBL C$SVFP,C$MAI
.PSECT $CONST,RO,D,LCL,REL,CON
$CONST:
.FLT4 2.
.FLT4 1.
.FLT2 2.
.FLT2 1.
.PSECT $CODEI
MAIN:: ; main
CALL C$SVFP ; 228
SETF ; 230
LDF $CONST+20.,F3
STF F3,A1 ; ,a1
LDF $CONST+16.,F3
STF F3,A2 ; ,a2
LDF A1,F3 ; a1,
DIVF A2,F3 ; a2,
STF F3,A3 ; ,a3
SETD ; 231
LDF $CONST+8.,F3
STF F3,B1 ; ,b1
LDF $CONST+0,F3
STF F3,B2 ; ,b2
LDF B1,F3 ; b1,
DIVF B2,F3 ; b2,
STF F3,B3 ; ,b3
RETURN
.END
Читал, сейчас вспомнил, но так как судьба меня не сводила с FPU
Из лайфхаков, под XM можно собирать компилятор с ключами /V вместо /O при генерации. Процесс компиляции сильно ускоряется, так как компилятор грузится в память и от туда работает...
Плюс VBGEXE, тоже способ ускорения ...
Можно в XM держать постоянно в памяти редактор, компилятор и линкер
VBGEXE вполне запускается и как системное задание тоже...
Насчёт работы без FPU F77, у меня работал на 1801ВМ3, но нужно ключ соответствующий и не обращаться к плавающий арифметике... Целые считаются через EIS.
И прочитал года 4 назад, что есть специальная библиотека для работы F77 на процессорах без FPU.
Ну плюс существует драйвер - эмулятор FPU
Последний раз редактировалось Alex; 17.05.2023 в 10:35.
Насчёт RT не скажу, но в варианте исполняющей библиотеки под RSX нужно было слегка модуль инициализации хакнуть - оно чего-то там делало, детали с ходу не вспомню, надо свои файлы с ДВК глянуть.
И именно для комплятора под RSX такого ключа не помню.
Гляну сво файлы (постараюсь сегодня), когда и если найду - отпишусь. Скорее всего это будет с одновременной проверкой на PDP-11/23+
С FPU напрямую тоже дела не имел, решил попробовать:
.TITLE FDIV
.IDENT /X1.0/
.MCALL .EXIT
.PSECT $CODE1
; JSR PC,OTI$
; MOV #-73200,-(SP)
; MOV #23051,R4
; JSR R4,@$NAM$
; MOV #-5,$SEQC
START: MOV #1,R2
SETD
SETI
L$GANC:
; MOV #-6,$SEQC
LDCIF R2,%1
LDF %1,%0
DIVF %1,%0
STF %0,V
INC R2
CMP R2,#24
BLE L$GANC
MOV R2,I
; CLR -(SP)
; JSR PC,STOP$
.EXIT
;
V: .BLKB 8.
I: .BLKB 2
;
.END START
В итогк получил: ?MON-F-FPU trap 001014
- - - Добавлено - - -
Как получить доступ к регистрам FPU?
%0-%3, в некоторых командах %4 и %5
Ну или стандартное R0-R5
Основной нюанс - какой регистр - CPU или FPP - определяется командной, скажем, если это LDF/LDD, то источник - процессор, а приёмник - FPP.
Доп нюанс. В некоторых командах, когда в качетстве источника/приёмника указан регистр - то это будет не регистр процессора, а FPP.
Проверил с % и без -- работает в обоих случаях (очевидно ранее где-то была ошибка)
Примеры:
172367 000172 ADDF V1,3
172567 000112 LDF V2,1
172467 000054 LDF V2,0
172367 000172 ADDF V1,%3
172567 000112 LDF V2,%1
172467 000054 LDF V2,%0
Результат работы:
.RUN FTEST
Enter first value (int dec): 3
Enter second value (int dec): 15
ADD result=00018.
SUB result=00012.
MUL result=00045.
DIV result=00005.
- - - Добавлено - - -
Прога:
.TITLE FDIV
.IDENT /X1.0/
.MCALL .EXIT, .DEBUG, .DPRINT, .PRINT
.ENABL LSB
.DEBUG SWITCH=ON,VALUE=YES
.PSECT $CODE1
START: CLR R1
1$: .PRINT PRTMSG(R1)
CALL INDEC
BCC 2$
.EXIT
2$: MOV R0, INVAL(R1)
TST (R1)+
CMP R1, #4
BNE 1$
;
CLR R0
;
SETD
SETI
L$GANC:
LDCIF INVAL,%3
STF %3,V1
LDCIF INVAL+2,%3
STF %3,V2
ADDF V1,%3
STCFI %3,IRES
.DPRINT ^"ADD result=",IRES,DEC
;
LDF V2,%2
SUBF V1,%2
STCFI %2,IRES
.DPRINT ^"SUB result=",IRES,DEC
;
LDF V2,%1
MULF V1,%1
STCFI %1,IRES
.DPRINT ^"MUL result=",IRES,DEC
;
LDF V2,%0
DIVF V1,%0
STCFI %0,IRES
.DPRINT ^"DIV result=",IRES,DEC
.EXIT
;
V: .BLKB 8.
V1: .BLKB 8.
V2: .BLKB 8.
INVAL: .BLKW 2
IRES: .BLKW 1
;
PRTMSG: .WORD EFVMSG
.WORD ESVMSG
EFVMSG: .ASCII /Enter first value (int dec): /<200>
ESVMSG: .ASCII /Enter second value (int dec): /<200>
.EVEN
.END START
- - - Добавлено - - -
Нужно поменять - не порядок...
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)