Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   БК-0010/0011 (http://zx-pk.ru/forumdisplay.php?f=59)
-   -   БК-0010/0011: Разное (http://zx-pk.ru/showthread.php?t=16500)

vinxru 8th March 2012 19:31

Я подумал, что речь идет о возможности компиляции одной и той же программы Си для разных процессоров.

Вот оконный интерфейс можно было бы написать на Си. Программа была бы понятнее и её можно было бы перенести на другой компьютер. Но 90% кода это работа с графикой (рисование с отсечением, это когда одно окно закрывает другое), на Си писать максимально производительные алгоритмы неудобно.

---------- Post added at 17:31 ---------- Previous post was at 17:29 ----------

Кстати, целью написания этой игры и ассемблера было как раз изучение ассемблера. :)

svofski 8th March 2012 19:35

Код на Си, конечно же, можно компилировать для разных процессоров. Преимущества в том, что можно использовать уже написанный другими код и не обязательно для PDP-11, в том, что новый код писать сильно быстрее и в том, что другим людям потом его понимать и исправлять будет проще.

Можно делать графику на ассемблере, а высокоуровневые вещи на си, например. Если писать для БК, без ассемблера по-любому никак не обойтись.

vinxru 8th March 2012 19:56

Посмотрю. А где скачать можно?

А C# нет? (стебусь)

svofski 8th March 2012 19:59

Наверное можно сделать маленькую JVM, почему нет? =)

Patron 10th March 2012 13:47

Quote:

Originally Posted by vinxru (Post 477010)
У меня есть идея, добавить в ассемблер конструкции

if(R0>R4) {
..do {
..} while(--R4>0)
}

Обычный макроассемблер RT-11 ( MACRO-11 ) позволяет модифицировать синтаксические конструкции при помощи макросов.

Вот пример реализации конструкций IF, CASE и других:
Code:

.MACRO MACSP L,I
.IF B,I
        .MCALL IF,IFB,IFC,ELSE,FI,CALL,PROC,BEGIN,END
        .MCALL LOOP,LOOPB,EXLOOP,REPEAT,CASE
        .MCALL $20,$22,$90,$91,$92,$93,$94
        $10=0
        .IIF NB,L,$10=1
        $11=1000
.ENDC
$0=20
$1=1
$2=0
$3=0
$4=0
$8=0
$9=1
$12=77777
.ENDM
.MACRO IF S,Q,D,T
$20 ,<S>,<Q>,<D>
IFC <Q>,<T>
.ENDM
.MACRO IFB S,Q,D,T     
$20 B,<S>,<Q>,<D>
IFC <Q>,<T>
.ENDM
.MACRO $20  V,S,Q,D
.IF DIF,<Q>,<IN>
        .IF DIF,<Q>,<NI>
                .IF IDN,<D>,<#0>
                        $93 <TST'V S>
                .IFF
                        $93 <CMP'V S,D>
                .ENDC
                .MEXIT
        .ENDC
.ENDC
$93 <BIT'V S,D>
.ENDM
.MACRO IFC Q,T
.IF IDN,<T>,<THEN>
        .IIF NE,$4,.ERROR ;U
        .IIF EQ,$2,$92 $2
        $90 $2*2,4,\$0
        $22 F,<Q>,\$2
        $2=0
        .IIF NE,$3,$94 \$3,$:
        $3=0
        .MEXIT                                                               
.ENDC
.IF B,T
        .IIF EQ,$4,.ERROR ;U
        $4=0
        $22 ,<Q>,\$3
        $3=0
        .IIF NE,$2,$94 \$2,$:
        $2=0
        .MEXIT
.ENDC
.IF IDN <T>,<AND>
        .IIF EQ,$2,$92 $2
        $22 F,<Q>,\$2
        .MEXIT
.ENDC
.IF IDN,<T>,<OR>
        .IIF EQ,$3,$92 $3
        $22 ,<Q>,\$3
        .MEXIT
.ENDC
.ERROR ;U
.ENDM
.MACRO $22 F,Q,L
$6=0
.IIF IDN,<Q>,<SLT>,$6=BLT
.IIF IDN,<Q>,<SLE>,$6=BLE
.IIF IDN,<Q>,<SGE>,$6=BGE
.IIF IDN,<Q>,<SGT>,$6=BGT
.IIF IDN,<Q>,<ULT>,$6=BLO
.IIF IDN,<Q>,<ULE>,$6=BLOS
.IIF IDN,<Q>,<UGE>,$6=BHIS
.IIF IDN,<Q>,<UGT>,$6=BHI
.IIF IDN,<Q>,<IN>,$6=BNE
.IIF IDN,<Q>,<NI>,$6=BEQ
.IIF EQ,$6,$6=B'Q
.IIF NE,$6&74377,.ERROR ;U
$6=$6/400&377
.IIF NB,F,$6=$6!1-<$6&1>
$93 BR,L
$94 .=.-1
$93 <.BYTE $6>
.ENDM
.MACRO ELSE
$91 $6,4,\$0-1
.IIF NE,$6&1,.ERROR ;N
$93 BR,\$1
$90 $1*2+1,4,\$0
$92
$94 \$6/2,$:
.ENDM
.MACRO FI
$91 $6,4,\$0-1
$94 \$6/2,$:
.ENDM
.MACRO CALL L
$93 <JSR %7,L>
.ENDM
.MACRO PROC L,S,B,C,T
;IF 'T' BLANK - FOR PDP-11, IF 'T' LSI - FOR LSI-11
$6=0
.IF NB,L
        .IIF NE,$0-20,.ERROR ;N
        MACSP ,I
        $6=4
        $90 7,0,\$0
        $94 L:
.ENDC
$5=-1
.IRP R,<S>
        .NTYPE $5,R
        .IIF GT,$5-5,.ERROR ;T
        $6=$6+4
        $90 $5,0,\$0
        $93 <MOV R,-(%6)>
.ENDR
.IF NB,B
        .IIF LT,$5,.ERROR ;P
        .IIF LE,B,.ERROR ;V
        $7=B+1/2*2
        .IIF GT,$7-7776,.ERROR ;V
        $93 <SUB #$7,%6>
        $93\10600+$5
        $90 $7,0,\$0
        $6=$6+2
.ENDC
.IF NB,C
        .IIF DIF,<C>,<CRITICAL>,.ERROR ;U
        $6=$6+1
        .IF B,T
        $93 <MOV @#-2,-(%6)>
        $93 <MOV #340,@#-2>
        $13=0
        .IFF
                .IIF DIF,<T>,<LSI>,.ERROR ;U
        $93 <MFPS -(%6)>
        $93 <MTPS #340>
        $13=1
        .ENDC
.ENDC
$90 $6,1,\$0
$9=$9+1
.ENDM
.MACRO BEGIN S,B,C
PROC ,<S>,<B>,<C>
.ENDM
.MACRO END
$9=$9-1
$91 $6,1,\$0-1
;.IIF NE,$6&1,$93 <MOV (%6)+,@#-2>
.IF NE,$6&1
.IF EQ,$13
        $93 <MOV (%6)+,@#-2>
.IFF
        $93 <MTPS (%6)+>
.ENDC
.ENDC
.IF NE,$6&2
        $91 $7,0,\$0-1
        $93 <ADD #$7,%6>
.ENDC
.REPT $6/4
        $91 $5,0,\$0-1
        $93 \12600+$5
.ENDR
.ENDM
.MACRO LOOP S
$90 $8,0,\$0
$8=0
$90 $9,0,\$0
$9=0
$5=0
.IF NB,S
        .NTYPE $5,S
        .IF EQ,$5-26
                $93 <TST @%6>
        .IFF
                .IIF NE,$5-47,$93 <MOV S,-(%6)>
        .ENDC
        .IF EQ,$5-27
                $94 <$94 $5=,^>,S,#
                .IIF EQ,$5,.ERROR ;Z
        .IFF
                $92 $8
                $93 BEQ,\$8
        .ENDC
        $5=1
.ENDC
$90 $1*2+$5,2,\$0
$94 \$1,$:
$92
.ENDM
.MACRO LOOPB S
.NTYPE $5,S
.IF EQ,$5&7-6
        .IIF NE,$5-26,$93 <MOVB S,-(%6)>
        $93 <BIC #177400,@%6>
.IFF
        $93 <CLR -(%6)>
        $93 <MOVB S,@%6>
.ENDC
LOOP -(%7)
.ENDM
.MACRO EXLOOP I,S,Q,D,T
.IIF NE,$9,.ERROR ;N
.IIF EQ,$8,$92 $8
.IF B,I
        $93 BR,\$8
.IFF
        $4=1
        $3=$8
        I S Q D T
.ENDC
.ENDM
.MACRO REPEAT
$91 $6,2,\$0-1
.IF NE,$6&1
        $93 <DEC @%6>
        $93 BNE,\$6/2
.IFF
        $93 BR,\$6/2
.IFTF
        .IIF NE,$8,$94 \$8,$:
.IFT
        $93 <TST (%6)+>
.ENDC
$91 $9,0,\$0-1
$91 $8,0,\$0-1
.ENDM
.MACRO CASE R,L,P
.MCALL $24,VALUE,CASEND
$24 <R>,<L>,<P>
.ENDM
.MACRO $24 R,L,P
.IIF LE,L,.ERROR ;V
.IIF GT,L-7777,.ERROR ;V
$93 <CMP R,#L>
$5=$11*2
.IF B,P
        .IF LE,L-172
                $93 <BHI L+6*2+.>
        .IFF
                $93 <BLOS .+6>
                $93 <JMP L+7*2+.>
        .ENDC
        $93 <ASL R>
        $93 <ADD %7,R>
        $93 <ADD 4(R),%7>
        $94 $,\$11,=.
        $94 $6=$,\$11+1,-.
        .REPT L+1
                $93 <.WORD $6>
        .ENDR
.IFF
        .IIF DIF,<P>,<PACKED>,.ERROR ;U
        .IF LE,L-357
                $93 <BHI L/2+11*2+.>
        .IFF
                $93 <BLOS .+6>
                $93 <JMP L/2+12*2+.>
        .ENDC
        $93 <ADD %7,R>
        $93 <MOVB 14(R),R>
        $93 <BIC #177400,R>
        $93 <ASL R>
        $93 <ADD R,%7>
        $94 $,\$11,=.
        $94 $6=$,\$11+1,-.
        .REPT L+1
                $93 <.BYTE $6/2>
        .ENDR
        .EVEN
        $5=$5+1
.ENDC
$94 $,\$11+1,=.
$90 <L>,0,\$0
$90 $5,3,\$0
$11=$11+3
.ENDM
.MACRO VALUE L
$91 $5,3,\$0-1
$94 $6=$,\$5/2+2
$93 <JMP $6>
.IF IDN,<L>,<>
        $0=$0+1
        $94 $,\$5/2+1,=.
.IFF
        $91 $7,0,\$0-1
        $0=$0+2
        $94 $6=.-$,\$5/2
        .IRP V,<L>
                .IF GE,V
                        .IIF GT,V-$7,.ERROR ;R
                        .IF EQ,$5&1
                                $94 .=V*2+$,\$5/2
                                $93 <.WORD $6>
                        .IFF
                                $94 .=V+$,\$5/2
                                $93 <.BYTE $6/2>
                        .ENDC
                        $12=V
                .IFF
                        .IIF GT,-<V>-$7,.ERROR ;R
                        .IIF LE,-<V>-$12,.ERROR ;R
                        .REPT -<V>-$12
                                .IF EQ,$5&1
                                        $93 <.WORD $6>
                                .IFF
                                        $93 <.BYTE $6/2>
                                .ENDC
                        .ENDR
                        $12=77777
                .ENDC
        .ENDR
        $12=77777
        $94 .=$6+$,\$5/2
.ENDC
.ENDM
.MACRO CASEND
$91 $5,3,\$0-1
$94 $,\$5/2+2,=.
$0=$0-1
.ENDM               
.MACRO $90 V,T,X
$'X=V*10+T
$0=$0+1
.ENDM
.MACRO $91 V,T,X
$0=$0-1
.IIF LT,$0-20,.ERROR ;N
.IIF NE,$'X&7-T,.ERROR ;N
V=$'X/10
.ENDM
.MACRO $92 D
.IIF NB,D,D=$1
$1=$1+1
.ENDM
.MACRO $93 I,L
.IIF NE,$10,.LIST MEB
.IF B,L
                                                I
.IFF
                                                I L'$
.ENDC
.IIF NE,$10,.NLIST MEB
.ENDM
.MACRO $94 L,M,R
                                                .IIF NE,$10,.LIST ME
                                L''M''R
.IIF NE,$10,.NLIST ME
.ENDM


vinxru 10th March 2012 15:46

1 Attachment(s)
Понятно, но хочется Си. Только вот Си - это стековый язык, то есть слегка тормозной. В примере ниже используются некоторые конструкции Си, но есть только 6 регистров.

Обращаю внимание, что язык ниже - это асемблер. Только MOV заменено на = и т.п.

Code:

                // Вывод меню
                R0 = #txtMenu;
                print();

                do {
                  // Инициализируем генератор случайных чисел.
                  R1 = #256;
                  rand();

                  // Обрабатываем клавиши
                  R0 = @#0177662;

                  // Анализ клавиши
                  R5 = #menuItems;
                  do {
                    R1 = (R5)+;
                    if(R1 == #0) break;
                    if(R1 == R0) goto startGame;
                    R5 += #8;
                  };
                };

//----------------------------------------------------------------------------
// ИГРА

startGame:      // Параметры игрового поля
                gameWidth  = (R5)+;
                gameHeight  = (R5)+;
                bombsCnt    = (R5)+;
                playfieldVA = (R5)+;

                // Очистка экрана
                clearScreen();
                fillBlocks();

                // Устанавливаем курсор в центр поля
                cursorX = gameWidth >> #1;
                cursorY = gameHeight >> #1;

                // Очистка основных переменных
                bombsPutted = #0;
                gameOverFlag = #0;
                time = #0;

                // Очистка игрового поля
                R0 = #0;
                R1 = #254;
                do {
                  playfield(R0b) = R1b;
                  userMarks(R0b) = #0;
                } while(R0b++);

                // Вывод смайлика
                R0 = #bmpGood;
                drawSmile();

                // Рисование игрового поля
                drawPlayField();
       
                // Вывод чисел
                leftNumber();
                rightNumber();
               
               
mainLoop:      do {
                  do {
                    // Время
...
                    // Ждем, пока не нажмут клавишу
                  } while(#128 & @#0177660 == #0);

                  // Стираем курсора
                  hideCursor();

                  // Код нажатой клавиши
                  R0 = @#0177662;

                  if(R0==#8  ) {
                    if(cursorX != #0) cursorX--;
                  } else
                  if(R0==#1Ah) {
                    if(cursorY != #0) cursorY--; } else
                  if(R0==#19h) {
                    cursorX++; if(cursorX == gameWidth) cursorX--;
                  } else
                  if(R0==#1Bh) {
                    cursorY++; if(cursorY == gameHeight) cursorY--;
                  } else
                  if(R0==#' ') {
                    leftClick();
                  } else {
                    rightClick();
                      hideCursor();
                  };

                  // Рисуем курсор
                  showCursor();
                };

//----------------------------------------------------------------------------
// ЛЕВАЯ КНОПКА МЫШИ

leftClick:        // Если бомбы не установлены, установить бомбы
                if(bombsPutted == #0) goto putBombs;

                // Если игра завершена, то выйти в меню
putBombsRet:        if(gameOverFlag != #0) goto MenuFar;

                // Попали в бомбу?
                R0 = cursorX;
                R1 = cursorY;
                mul01();
                if(playfield(R2b) == #255) goto die;

                // Открыть клетку и все клетки вокруг
                open();

                // Проверить, выиграли ли мы
                checkWin();
       
                // Основной цикл игры       
                return;

//----------------------------------------------------------------------------
// ИГРОК УМЕР

die:                // Вывод смайлика
                R0 = #bmpBad;
                drawSmile();
                goto gameOver;

//----------------------------------------------------------------------------
// ЛЮБАЯ КНОПКА КЛАВИАТУРЫ - УСТАНОВКА ФЛАГА

rightClick:        // Если игра завершена, то ничего не делать
                if(gameOverFlag != #0) goto rightClickRet;

                // Меняем флажки
                R0 = cursorX;
                R1 = cursorY;
                mul01();
                userMarks(R2b)++;
                if(userMarks(R2b) == #3) userMarks(R2b) = #0;

                // Пересчитать левое число
                leftNumber();

rightClickRet:        return;

//----------------------------------------------------------------------------
// ПОМЕСТИТЬ БОМБЫ НА ПОЛЕ

putBombs:        bombsPutted++;

                // Цикл
                R4 = bombsCnt;
                do {
putBombs2:          // Координата Y
                  R1 = gameHeight;
                  rand();                // R1->R0, R1=R2=?
                  R3 = R0;

                  // Координата X
                  R1 = gameWidth;
                  rand();                // R1->R0, R1=R2=?
                  R1 = R3;

                  // Бомба не должна быть под крсором
                  if(cursorX==R0) if(cursorY==R1) goto putBombs2;

                  // Расчет адреса в массиве
                  mul01();                // R0,R1->R2

                  // Бомба в этой клетке уже есть
                  if(playfield(R2b) == #255) goto putBombs2;

                  // Ставим бомбу
                  playfield(R2b) = #255;
                } while(R4--);

                goto putBombsRet;

//----------------------------------------------------------------------------
// ПЕРЕРИСОВАТЬ КЛЕТКУ (СТЕРЕТЬ КУРСОР)

hideCursor:        R0 = cursorX;
                R1 = cursorY;
                mul01();                // R0+R1*16 -> R2
                calcCell2();                // R0,R1 -> R1
                R0b = playfield(R2b); 
                getBitmap();                // R0 -> R0
                if(R0b==#bmpUn) {
                  R5b = userMarks(R2b);
                  if(R5 == #1) R0 = #bmpF;
                  if(R5 == #2) R0 = #bmpQ;
                };
drawCursor5:        drawImage();                // R0=R1=R2=?
                return;

//----------------------------------------------------------------------------
// НАРИСОВАТЬ КУРСОР ПОВЕРХ КЛЕТКИ

showCursor:        R0 = cursorX;
                R1 = cursorY;
                calcCell2();                // R0,R1 -> R1
                R0 = #bmpCursor;
                goto drawTransImage;

//----------------------------------------------------------------------------
// РАСЧЕТ АДРЕСА В ВИДЕОПАМЯТИ ЯЧЕЙКИ ИГРОВОГО ПОЛЯ
// R0,R1 - Координаты => R1 - адрес

calcCell2:        ASM SWAB R1;
                R1 = R1 << #2 + R0 + R0 + R0 + R0 + playfieldVA;
                return;

//----------------------------------------------------------------------------
// ЛОГИКА ИГРЫ
// R0,R1 - координаты. R3 - счетчик => R2 - портит

check:                if(unsigned R0 >= gameWidth ) goto checkRet;
                if(unsigned R1 >= gameHeight) goto checkRet;
                mul01();
                if(playfield(R2b) == #255) R3++;
checkRet:        return;

//----------------------------------------------------------------------------
// ЛОГИКА ИГРЫ

call8:                R1--;      call81();
                R0--; R1++; (R5)();
                R0++; R0++; (R5)();
                R0--; R1++; call81();
                R1--;
                return;

//----------------------------------------------------------------------------
// ЛОГИКА ИГРЫ

call81:        R0--; (R5)();
                R0++; (R5)();
                R0++; (R5)();
                R0--;
                return;

//----------------------------------------------------------------------------
// R0+R1*16 => R2

mul01:                R2 = R1 << #4 + R0;
                return;

//----------------------------------------------------------------------------
// ЛОГИКА ИГРЫ

// Да, я вижу что тут все можно оптимизировать :)

open:                if(unsigned R0 >= gameWidth ) goto openRet;
                if(unsigned R1 >= gameHeight) goto openRet;
                mul01();
                if(userMarks(R2b) != #0) goto openRet;
                if(playfield(R2b) != #254) goto openRet;
                // Посчитать колво бомб вокруг. Результат в R3
                R5 = #check;
                R3 = #0;
                call8();
                R5 = #open;

                // Записываем результат
                mul01();
                playfield(R2b) = R3b;

                // Перерисовываем ячейку
                  push R0, R1 {
                  calcCell2();                // R0,R1 -> R1
                  R0 = R3;
                  getBitmap();                // R0 -> R0
                  drawImage();                // R0=R1=R2=?
                };

                // Если в ячейке 0, то открываем соседние ячейки
                if(R3 == #0) call8();
               
openRet:        return;

Остальное в аттаче

Команды этого языка:

break - выйти из цикла (1 команда BR)
return - выйти из подпрограммы (1 команда RTS PC)
push A, B; - сохранить в стек (1 команда MOV -(SP))
pop A, B; - извлечь из стека (1 команда MOV +(SP))
push A,B {команды } - сохранить и извлечь из стека
emt N; - прерывание (1 команда EMT)
trap N; - прерывание (1 команда TRAP)
goto A; - пейти на метку (1 команда BR)
do {} - бесконечный цикл (1 команда BR)
do {} while(A--); - цикл (1 команда SOB)
do {} while(условие); - цикл (2 команды. арифметическая+переход. Например INCB R0 / BNE или CMP R0, R1 / BGT)
if(A > B) goto C; - перейти по условию (две команды ассемблера)
if(A > B) {команды } - то же
if(A > B) {команды } else { команды } - то же, но 3 команды

И вычисления

A = B + #2 << 1 ^ R4;

Каждйы оператор - это одна команда ассемблера.

MOV B, A
ADD #2, A
ASL A
XOR R4, A

А вызов функции ().

redraw();
@#160000();
(R0) ();

Когда команда работает с байтами, то к имени регистра прибавляется b. То есть R0b, R1b, (SPb)+.

---

В архиве компилятор и исходники игры. Можно вносить в игру изменения, компилировать и получить собственную игру. А еще можно BMP файлы перерисовывать, из которых состоит интерфейс.

Patron 10th March 2012 16:29

Quote:

Originally Posted by vinxru (Post 477702)
Понятно, но хочется Си.

Есть у меня давняя идея сделать для PDP-11 пару [ операционная система + оптимизирующий кросскомпилятор C/C++ PC -> PDP-11 ]. Наверное, писать новые компиляторы под PDP-11 неправильно, поэтому кросскомпиляторы - единственное адекватное решение.

В приниципе - можно ввести в C и С++ небольшие расширения, которые будут выглядеть, как функции библиотеки, а именно [ BCS, BCC, BVS, BVC, SEC, CLC, SEV, CLV ] и использоваться, например, так:
Code:

if( BCS() ) { Error(); }
else        { SEV();  }

но при генерации кода для PDP-11 будут компилироваться не в вызовы библиотеки, а в соответствующие команды ассемблера PDP-11.

...

Quote:

Originally Posted by vinxru (Post 477702)
Си - это стековый язык, то есть слегка тормозной.

Но ведь никто не заставляет всегда использовать именно стек. Есть известный метод оптимизации, когда часть регистров используются компилятором, как верхушка стека, поэтому код функции, имеющей пару аргументов вызова и использующей пару временных переменных - может быть скомпилирован вообще без использования стека.

Кстати, Visual С++ (насколько мне показалось) в режиме полной оптимизации именно так и поступает - в результате реализации некоторых простых функций используют только регистры и не содержат кода пролога и эпилога.

vinxru 10th March 2012 17:04

Quote:

Originally Posted by Patron (Post 477714)
Кстати, Visual С++ (насколько мне показалось) в режиме полной оптимизации именно так и поступает - в результате реализации некоторых простых функций используют только регистры и не содержат кода пролога и эпилога.

Да, только при вызове функции из функции всё равно придется сохранять в стек регистры. И выхлоп от этого не большой.

Компилятор должен был расчитать дерево вызовов. И определить в какие моменты времени значения лучше хранить в регистрах. Например в одной функции, сначала лучше регистры использоваться под одну переменную, а потом под другую. В общем, ни один компилятор этого не делает.

А еще конструкция. В ней Print будет выполняться 1% времени:

if(A==1) print();

Компилируется в инструкцию

CMP A, #1
BNE Ptr1
JSR PC, Print
Ptr1:

То есть 1% времени безусловный переход не будет выполняться, а 99% будет. Это не оптимально. Надо бы компилировать:

CMP A, #1
BEQ Ptr1
Ptr2:
;-----
; Где то в другом месте
Ptr:
Mov Ptr2, (SP)-
Jmp Print

Но так так же не делает ни один компилятор.

P.S. Если модераторам не лень, то можно поделить тему пополам.

---------- Post added at 15:04 ---------- Previous post was at 14:54 ----------

Такой оптимизатор легко на Прологе можно написать (тупо перебором всех возможных вариантов), но будет ли он работать за допустимое время...

Patron 10th March 2012 17:08

Quote:

Originally Posted by vinxru (Post 477722)
А еще конструкция. В ней Print будет выполняться 1% времени: if(A==1) print();

Вероятность того, что A == 1 известна во время компиляции только в том случае, если A константа. Нельзя требовать от компилятора делать предсказания, которые он не может проверить на этапе компиляции.

Quote:

Originally Posted by vinxru (Post 477722)
1% времени безусловный переход не будет выполняться, а 99% будет

Для 1801ВМ1 это без разницы - обе ветви перехода выполняются у него за одинаковое время.

vinxru 10th March 2012 17:09

Quote:

Originally Posted by Patron (Post 477731)
Для 1801ВМ1 это без разницы - обе ветви перехода выполняются у него за одинаковое время.

Суровый процессор.

Patron 10th March 2012 17:16

Quote:

Originally Posted by vinxru (Post 477732)
Суровый процессор.

И главное - это может легко проверить каждый.

Берём такой фрагмент кода:
Code:

bcsS:
        Mov        #0, R1
LL:
        BCS        1$
6$:        BCS        2$
8$:        BCS        3$
7$:        BCS        4$
3$:        BCS        5$
4$:        BCS        6$
5$:        BCS        7$
1$:        BCS        8$
2$:
        SOB        R1, LL

И засекаем время его выполнения при установленном и сброшенном бите C.

Mad Killer/PG 25th March 2012 16:04

с позволения CD-Inc cхема БП STS-15 -http://rghost.ru/37211019/thumb.png
http://rghost.ru/download/37211019/3...-01_STS-15.jpg

13joe 2nd April 2012 09:31

Подскажите пожалуйста,
БК-0011 от АТ-шного БП будет нормально работать (в том числе и с НГМД и прочими девайсами) или ей для нормальной работы нужет только её родной БП ?

Mad Killer/PG 2nd April 2012 09:55

Тa будeт рaботaть конeчно,eй плюс 5в нaдо от чeго угодно.
У мeня от АТшного рaботaлa.

13joe 2nd April 2012 10:50

Еще один неумный вопрос (Извините, я в БК-0011 очень сильно новичок).
БК-0011 вообще без КМ-ок будет работать или есть какие-то обязательные КМ, которые нужно обязательно впаять, иначе ни о какой работе компа не может быть и речи ?

13joe 2nd April 2012 14:54

Если у кого-нибудь есть монтажка БК-0011 с расположением и обозначением всех конденсаторов, то выложите пожалуйста :)

P.S. Было бы просто замечательно если бы в разделе БК было выложено нечто вроде пошагового руководства по диагностике и/или ремонту БК-0011.

Mad Killer/PG 2nd April 2012 15:12

Бeз КМ рaботaть нe будeт,eсть вaжныe,монтaжки нe видeл в природe,инструкция очeнь большaя будeт,но подходит тeмa по рeмонту 0010-01.

13joe 3rd April 2012 14:50

Имею еще один очень ламерский вопрос по ПЗУ БК-0011.
В плату впаяны 2 ПЗУ и есть панельки еще для двух. Что записано в впаянные ПЗУ и какие ПЗУ вставляются в панельки ?

SKcorp. 3rd April 2012 14:52

Quote:

Originally Posted by 13joe (Post 489015)
Имею еще один очень ламерский вопрос по ПЗУ БК-0011.
В плату впаяны 2 ПЗУ и есть панельки еще для двух. Что записано в впаянные ПЗУ и какие ПЗУ вставляются в панельки ?

БСВВ.
Школьная локалка или программа пользователя.

13joe 3rd April 2012 15:33

Подскажите пожалуйста расположение и номиналы КМ-ок на плате БК-0011.

bigral 6th April 2012 02:31

Неплохо было бы перенести посты касающиеся компиляторов gcc/macro11/самодельного из сообщений в этой теме в спец тему - "Современный компилятор для PDP-11"

vinxru 7th April 2012 22:35

Интересно. 1801ВМ1 реализованный на AVR насколько будет быстрее оригинала?

Mick 7th April 2012 22:48

Quote:

Originally Posted by vinxru (Post 490938)
Интересно. 1801ВМ1 реализованный на AVR насколько будет быстрее оригинала?

Я вот дико извиняюсь конечно, но ты определись что тебе интересно делать. То ты игру на Апогей собрался писать, то ты контроллер PS2 клавы для Ориона делаешь, то для БК еще что там, то магнитофон ана AVR - уже всего не уследишь. Либо ты действительно многозадачный и многорукий человек, либо уж не знаю что и думать. Короче везде ты.

Спасибо что закончил для Апогей ром диск, но после этого тебя куда то унесло.

vinxru 7th April 2012 23:28

Quote:

Originally Posted by Mick (Post 490944)
Я вот дико извиняюсь конечно, но ты определись что тебе интересно делать. То ты игру на Апогей собрался писать, то ты контроллер PS2 клавы для Ориона делаешь, то для БК еще что там, то магнитофон ана AVR - уже всего не уследишь. Либо ты действительно многозадачный и многорукий человек, либо уж не знаю что и думать. Короче везде ты.

Спасибо что закончил для Апогей ром диск, но после этого тебя куда то унесло.

Многое из перечисленного вами, это были просто мои мысли, мои вопросы. Мне внезапно стало интересно, а делал ли кто нибудь магнитофон на AVR? Я спросил, получил ответ и всё. Так же с 1801ВМ1 на AVR. Это лишь вопрос.

Я думаю, что может быть мои мысли помогут кому нибудь. По поводу магнитофона, у меня родилась шикарная идея сделать видеовыход. То есть выбирать программу прямо на ТВ. Не надо лепить гигантский, дорогой и неудобный ЖК экран. Всё устройство будет размером меньше спичечного коробка.

Это про то что я пишу.

А занимаюсь я обычно двумя делами параллельно. Одно программирование - долгое, от месяца до нескольких лет. Сейчас это оконный интерфейс для БК. Я им неспешно занимаюсь все свободное время.

А еще есть быстрые железные проекты (от 30 минут до дня). Вот та же клавиатура для Ориона заняла ~5 часов разработки и уже закончена. Она спаяна, проверена и лежит на полке. В ветку форума я лишь пишу свои мысли, ничего не делая по этому проекту. Потом была схема Искры 1080, которую я уже перерисовал.

В данную секунду я травлю отладочную плату с ATMega8. То есть я треплюсь на форуме, а плата плавает в растворе FeCl3. С помощью этой платы я проверю, как работает моя прошивка клавиатуры Ориона на ATMega8. Это максимум час времени. А потом на основе этой же платы я буду делать Эмулятор флоповода и контроллер мыши для БК0010.

И в этот момент проекты объединяются. Эмулятор флоповода и контроллер мыши для БК0010 позволит запустить мою программу на реале!

P.S. Игрушку я только хочу сделать... очень хочу... но в этом году её не будет...

---------- Post added at 22:28 ---------- Previous post was at 22:22 ----------

Я кстати предвидел такой вопрос. Что я везде и ничего не сделал.

Поэтому на своей странице http://zx.pk.ru/member.php?u=6677 я уже давно отмечаю, что сделал, что делаю и что буду делать.

Mick 7th April 2012 23:37

Quote:

Originally Posted by vinxru (Post 490953)
Я кстати предвидел такой вопрос. Что я везде и ничего не сделал.

Я и говорю значит многозадачный ты человек. Что же ответ понятен и вопросов больше не имею. :)

vinxru 8th April 2012 00:05

Все проще.

Иногда хочется поработать руками, выпилить ножовкой кусок текстолита, перевести утюгом ЛУТ, вдохнуть облачко канифоли.

А иногда устаешь от кривизны своих рук. От того, что из за одной ошибки приходится всё переделывать заново. Что бы я не делал, у китайцев будет лучше и дешевле.

Программы никогда не сгорают, не взрываются и в редакторе всегда есть сохранение и откат. :) Это другой мир.

Woland 8th April 2012 15:29

vinxru, а нет ли желания/возможности в интеллектуальном плане помочь по проблемам с mp3-модулем в рамках проекта БК-0012 ?
Вкратце проблему сформулировал тут, в последнем сообщении:
http://zx.pk.ru/showthread.php?t=17159&page=3

vinxru 8th April 2012 15:45

Quote:

Originally Posted by Woland (Post 491142)
vinxru, а нет ли желания/возможности в интеллектуальном плане помочь по проблемам с mp3-модулем в рамках проекта БК-0012 ?
Вкратце проблему сформулировал тут, в последнем сообщении:
http://zx.pk.ru/showthread.php?t=17159&page=3

К сожалению я вообще ничего не знаю про аппаратный MP3, FPGA и современные микросхемы.

vinxru 13th April 2012 01:06

А что находится в 1801РЕ1-054?

и кому нужна золотая 1801ВП1-038 (вроде как таймер)

dk_spb 13th April 2012 01:27

vinxru, Если 038 новая - мне нужна.
По первому вопросу ответ здесь http://fincoins.spb.ru/oldpc/re2/1801PE2.html

vinxru 13th April 2012 01:36

Новая, выводы еще не отформованы (но уже немножко погнуты пальцами).

Розовая керамика, позолоченные выводы.

http://s15.radikal.ru/i188/1204/8c/eebd21360bda.jpg
http://s55.radikal.ru/i148/1204/2b/6e778d848c64.jpg

dk_spb 13th April 2012 08:07

vinxru, Интересно, отшите, пожалуйста, в личку цену вопроса.

GARNIZON 5th May 2012 01:58

Случайно наткнулся перебирая старые журналы "За рулем"
http://i021.radikal.ru/1205/69/0cbd41ca22b2t.jpg

13joe 30th July 2012 17:58

Уважаемые БК-Профи !
Подскажите по ремонту бк-0011. Симптомы убойные - на экране полная тишина (даже никакого намека хоть на какое-то изображение - только релюшка щелкает при включении или выключении). вп1-037 поменял на новую (грелась как процессор) - никаких изменений (по прежнему греется как процессор и никакого намека на изображение). Процессор менять ?


All times are GMT +4. The time now is 02:28.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.