Важная информация

User Tag List

Страница 5 из 8 ПерваяПервая 12345678 ПоследняяПоследняя
Показано с 41 по 50 из 74

Тема: БК-0010/0011: Разное

  1. #41
    Banned
    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

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

  2. #42
    Guru Аватар для svofski
    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,105
    Спасибо Благодарностей отдано 
    772
    Спасибо Благодарностей получено 
    643
    Поблагодарили
    398 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  3. #43
    Banned
    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  4. #44
    Guru Аватар для svofski
    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,105
    Спасибо Благодарностей отдано 
    772
    Спасибо Благодарностей получено 
    643
    Поблагодарили
    398 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Наверное можно сделать маленькую JVM, почему нет? =)
    Последний раз редактировалось Mick; 07.04.2012 в 08:42.
    Больше игр нет

  5. #45
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,777
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    61 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение
    У меня есть идея, добавить в ассемблер конструкции

    if(R0>R4) {
    ..do {
    ..} while(--R4>0)
    }
    Обычный макроассемблер RT-11 ( MACRO-11 ) позволяет модифицировать синтаксические конструкции при помощи макросов.

    Вот пример реализации конструкций IF, CASE и других:
    Код:
    .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

  6. #46
    Banned
    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

    Код:
    		// Вывод меню
    		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 файлы перерисовывать, из которых состоит интерфейс.
    Вложения Вложения
    Последний раз редактировалось vinxru; 10.03.2012 в 16:11.

  7. #46
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #47
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,777
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    61 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    В приниципе - можно ввести в C и С++ небольшие расширения, которые будут выглядеть, как функции библиотеки, а именно [ BCS, BCC, BVS, BVC, SEC, CLC, SEV, CLV ] и использоваться, например, так:
    Код:
    if( BCS() ) { Error(); }
    else        { SEV();   }
    но при генерации кода для PDP-11 будут компилироваться не в вызовы библиотеки, а в соответствующие команды ассемблера PDP-11.

    ...

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

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

  9. #48
    Banned
    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    Кстати, 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 ----------

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

  10. #49
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,777
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    61 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от vinxru Посмотреть сообщение
    А еще конструкция. В ней Print будет выполняться 1% времени: if(A==1) print();
    Вероятность того, что A == 1 известна во время компиляции только в том случае, если A константа. Нельзя требовать от компилятора делать предсказания, которые он не может проверить на этапе компиляции.

    Цитата Сообщение от vinxru Посмотреть сообщение
    1% времени безусловный переход не будет выполняться, а 99% будет
    Для 1801ВМ1 это без разницы - обе ветви перехода выполняются у него за одинаковое время.

  11. #50
    Banned
    Регистрация
    01.12.2010
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,657
    Записей в дневнике
    21
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

Страница 5 из 8 ПерваяПервая 12345678 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Продается БК 0011 без М за 50 у.е.
    от Mad Killer/PG в разделе Барахолка (архив)
    Ответов: 26
    Последнее: 04.08.2011, 08:59
  2. AY-музыка для БК-0011(М)
    от Gryphon в разделе БК-0010/0011
    Ответов: 1
    Последнее: 14.08.2010, 14:44
  3. Изучаю спрос на БК-0011
    от Kronshou в разделе Барахолка (архив)
    Ответов: 2
    Последнее: 20.07.2010, 17:57
  4. Москва - куплю все связанное с БК-0010/0011
    от kt315b в разделе Барахолка (архив)
    Ответов: 0
    Последнее: 04.10.2008, 05:09
  5. Куплю БК-0011
    от СергейВ в разделе Барахолка (архив)
    Ответов: 0
    Последнее: 18.08.2006, 14:05

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •