Как стать автором
Обновить
2
0
andrey @kekoz

Пользователь

Отправить сообщение

После ассемблеров DEC (PDP-11) и Motorola (6800, 68000) c ассемблера x86 меня всегда тошнило и выворачивало мехом внутрь :)

За “говнориски” ты зело неправ. Видимо, ты просто в них не смог :) Но спешу тебя порадовать — их создавали не для “торчков по ассемблерам”. “говнориск” показывает ту же условную производительность, что и “шоколадциск”, только содержит при этом на два порядка меньше транзисторов, работает на порядок ниже частоте, при на два порядка меньших энергозатратах. Сама Intel не раз порывалась (432, 93x), но пипл хотел и дальше хавать говно (и это было х86), и требовал только ложку по-больше (мегагерц).

И за “разумных инженеров” замечу — ни одному действительно разумному инженеру не придёт в голову мысль сделать “что-то одно и для всего вообще”. Любое универсальное решение практически всегда и во всём проиграет частному. Почему-то в IBM в своё время не нашлось (к счастью) “разумного” инженера, который такой “А давайте видеокарту тоже на 8086 забульбеним, йопта, чё мудрить-то?!”

Хотя systemd был определенным шагом вперед.

“Вперёд” в сторону чего? Без уточнения непонятно, знаешь ли. В качестве примера: “Кругом и вперёд!” — это как бы “Назад!” по своей сути :)
Есть ещё более весёлый момент: сам Торвальдс прямо говорил, что не было бы никакого Linux, если бы не копирастический наезд на BSD со стороны AT&T/SCO.
При этом сам bash — один из этих самых “убийц sh” (который IEEE Std 1003.1 aka POSIX), точно так же оказавшийся в роли ещё одного «интерактивного шелла и интерпретатора простеньких скриптов»

$ ls -d /usr/ports/shells/*sh | wc -l
     24

Это ещё и к имеющемуся запросу на новый шелл (об оном запросе я слышу непрерывно с конца 80-х :)
Тот же PS собирать в интерпретаторе — это боль, нельзя просто собрать пайп

Хм… Вот я давеча решил-таки наконец грохнуть дубликаты в иерархии директорий с примерно 120,000 изображений. Ровно один пайп в PowerShell. И довольно короткий — две строки (у меня 140 символов). В нём есть всё, чтобы не накосячить с удалением лишнего — сопоставление по размерам файлов, далее совпавшие по размерам сопоставляются по хэшам, и только при совпадении — удаление. Когда я думаю о том, как бы это пришлось делать в терминале FreeNAS (где всё это и хранится, то есть FreeBSD), я понимаю, что именно это-то и было бы болью на фоне PowerShell.

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

Гуглить? А Get-Help Cmdlet -Full мало разве? Больше ты всё равно вряд ли нагуглишь :)
В училище была своя собственная ЭВМ?
(вспоминая стоимость и дефицитность машинного времени в 1986 году)


Вспоминая свои поездки в пару военных училищ (одно в Ленинградской области, другое в Вильнюсе) — в главном ВЦ по ЕС-1022, на кафедрах АСУ — по две М-6000. 1981 год.
Меня не очень интересует мнение военных — они занимаются, на мой взгляд, довольно бессмысленной, а главное — ужасающе непродуктивной деятельностью


Это так и в общемировом масштабе


Огромное количество исследований, становящихся в конечном итоге национальным, а то и всемирным достоянием, финансируется US DoD. В конце концов, тот же Интернет по сути был заказан и проплачен военными США. Так что про общемировой масштаб бессмысленности и непродуктивности деятельности военных я бы аккуратнее выражался. Одна и та же “бессмысленная и непродуктивная” гонка вооружений второй половины ХХ века привела одну там сверхдержаву к её полному развалу и продолжающейся деградации “наследника традиций”, а другую — к процветанию.

«Я сама дочь офицера, не всё так однозначно»
На основе кода em Билл Джой разработал ex, что расшифровывается как «extended ed»

После em (который разработал Джордж Колорис) вообще-то был разработан en. Билл любит шутя говорить “Не помню, были ли там eo или ep, но в конце концов это каким-то образом стало ex”, потому и по расшифровке тоже есть вопрос, не придумана ли она кем угодно из совершенно непричастных к разработке.

Позже в операционных системах появился исполняемый файл vi, но мы по-прежнему можем пользоваться командами ex, вводя: в vi/vim. Редактор ex был выпущен в 1976 году, а исполняемый файл vi — в 1979 году

“Исполняемый файл vi” был всего лишь hardlink'ом ex. То есть vi версии 2.0 (май 1979) — это не новый редактор с возможностью исполнения команд ex, а сам ex и был, просто при запуске по имени vi он сразу оказывался в visual mode.

Очень распространён миф (их много в поддержку гениальности ряда программистов тех лет), будто vi был написан Джоем за неделю. Таки это миф. На создание vi у Джоя ушло несколько месяцев. Дело в том, что разрабатывал он его дома, сидя на “рабочей” PDP-11 через модемный линк 300 бод (в отличие от рожающего тогда emacs Столлмана, в распоряжении которого была мощнейшая (сравнительно) PDP-10 с локальным терминалом). Перерисовка экрана целиком была чудовищно долгой операцией, и Джой основные усилия затратил как раз на предельную минимизацию трафика, чтобы даже при такой скорости соединения экранный режим редактирования оставался комфортным.

А ещё у Джоя не было мышки.

Оценить vi (и влюбиться в него) сложновато большинству тех, из кто начал в фантастических по сравнению с Джоем условиях — персональный компьютер с суперскоростной консолью (даже если это Hercules), поскольку для Джоя даже 1200 бод в терминале были недоступной роскошью, а 9600 (на такой скорости человек уже не успевает читать вывод) — и вовсе фантастикой. Как говорит сам Джой, “vi был создан для мира, который сегодня исчез.”

Тем не менее, в SUS присутствует vi, таким образом любая ОС, претендующая считаться unix, обязана его иметь.

PS: Кстати, то, что Томпсон сделал grep за ночь — не миф :)
Слово “internal” как бы намекает :)
Ты правда думаешь, что говоря об отсутствии дома “маркерной доски”, он имеет ввиду именно “маркерную доску”? :)
Признаться, весьма удивлён, что ему пришлось это (про whiteboarding) объяснять. Видимо, недоумение огромного числа иностранцев. С другой стороны, я тоже иностранец с очень далёким от fluent английским, но прекрасно понимаю, что whiteboarding — это про групповое чесание языков по теме у доски, а не про саму доску.

Первоисточником подобного знания являются RFC и, к счастью, они с давних времен находятся в открытом доступе.

Кхе-кхе. Пардон, а что, когда-то было иначе, RFC не были в открытом доступе? Это шутка такая, или ментальные последствия жизни в тоталитарном государстве?

Ни у кого не получилось "не читать RFC", и при этом хорошо разбираться в протоколе.

Казалось бы, немыслимой сложности задача, но на самом деле всё довольно просто: открыть (всем доступно) “Kernel Programming Guide” на сайте developer.apple.com (надеюсь, это считается авторитетным источником? :), там открыть главу “BSD Overview” и прочитать собственноглазно всего лишь половинку самого первого предложения.

The BSD portion of the OS X kernel is derived primarily from FreeBSD.
А у Pascal и нет никакой “стандартной библиотеки”.
Всего лишь потому, что настоящий ANSI/ISO Pascal для реального программирования не подходил никоим образом. То есть вообще. У Pascal был международный Стандарт, но на этом стандартном Pascal никогда и ничего не было написано (студенческие “ввести два числа, вывести их сумму” не считаем). Но многим хотелось. В результате появилась куча Pascal-подобных языков. Некоторые из них даже назывались Pascal'ями, но при этом Pascal'ем с точки зрения ANSI/ISO Стандарта они не являлись. Не в том смысле, что шибко расширяли Стандарт, а в том, что вообще не реализовывали его. Apple, кстати, была в этом плане хорошей честной компанией, и не называла свой язык Pascal'ем, а в Object Pascal их Clascal превратился уже много позже (они вроде даже как с Виртом перетирали эту тему).

А у C хоть и не было международного (ANSI/ISO) стандарта, но был Unix. И этого оказалось более чем достаточно для всеобщего признания K&R C как Стандарта, который надлежит соблюдать. А потом уже ANSI/ISO подтянулись.
На “совок” и работали, на кого ж ещё. Противоракеты (В-1000) программировались проволокой :) Но ПРО же состоит не только из противоракет :) Одной только «Аргунью» управляли шесть ЭВМ (каждая в современной терминологии была гарвардской двухядерной). Одной единственной РЛС «Истра» даже без стрельбового комплекса.
Хм… Складывается впечатление, будто Вирт под прессом лет то ли подзапамятовал что-то, то ли решил, что пора бы уже прибрать всю славу к рукам. Не мне, конечно, спорить со столь уважаемым (абсолютно искренне) мэтром, но напомнить есть о чём.

“Algol 60 was intended for scientific calculations (numerical mathematics) only.”

Да ладно! Algol-60 был у меня первым в промышленном программировании. И то были не scientific calculations only, а очень даже real-time missile defense systems. В отличие от fortran (как же я признателен мирозданию за то, что первым у меня всё же был не он, а именно algol).

Pascal was easy to teach, and it covered a wide spectrum of applications, which was a significant advantage over Algol, Fortran, and Cobol. The Pascal System was efficient, compact, and easy to use.

О как! По прошествии 50 лет изначальный pascal (в том числе и стандартизованный ANSI) внезапно оказался универсальным языком! При том, что имел лишь жалкие намёки на io, и вообще не имел ничего подобного хотя бы сишной (читай “файловой”) модульности (да-да, вы правильно поняли — программа людого размера могла быть только в одном единственном исходном файле, что лишь подтверждает назначение языка, см.след.абзац), из-за чего мне в своё время пришлось написать для него препроцессор.

Дедушка Никлаус сам же и заявлял, что создавал pascal как язык не для практического программирования, но для обучения программированию (структурному). И я, кстати, преподавая программирование, с огромным удовольствием именно его и использовал, pascal для этого действительно был в те временя the best. Для работы Вирт сам же взялся за Modula-2 и Oberon. А увидев взрывную популярность pascal (куча несовместимых между собой диалектов, и при этом ни одного из опробованных мной соответствующего Стандарту ANSI), Вирт сам же и сказал что-то в стиле “Главная беда pascal в том, что очень многие восприняли его слишком всерьёз”. Спустя 50 лет это решил сделать и сам создатель? Только он путает свой pascal с тем, во что его превратили early adopters.

Впрочем, Вирта я и впредь буду уважать, не pascal'ем единственным (да и вообще не pascal'ем) ценен он отрасли. С 50-летием отпрыска тебя, дед!
А чем тебе bash/powershell не программирование? Снобизм?
Опытный админ, который не пишет код — это просто продвинутый эникейщик :)
Мало того, мы практически не увидим там и команд процессора (внезапно). Вместо этого, там будут сплошные вызовы макрокоманд из системных макробиблиотек.

Ну, уважаемый, столь откровенную чушь-то пороть не надо. Вот под спойлером один из модулей ядра RSX-11, отвечающий за запуск ядра.
INITL.MAC
        .TITLE  INITL
        .IDENT  /10/

;
; COPYRIGHT 1974, 1978
; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
; VERSION 10
;
; D. N. CUTLER 23-AUG-73
;
; PREVIOUSLY MODIFIED BY:
;
;       D. N. CUTLER
;       T. J. MILLER
;
; MODIFIED BY:
;
;       B. SCHREIBER 28-JUL-77
;
;               BS004 -- CHANGE TO V3.1.
;
;       T. J. MILLER 14-SEP-77
;
;               TM103 -- ENHANCE CLOCK SETUP AND ALIGN POOL ON EVEN
;                       BOUNDARY.
;
;               TM104 -- PROPERLY INITIALIZE VECTORS FOR HANDLING
;                       FLOATING POINT PROCESSOR EXCEPTION CONDITIONS.
;
;               TM105 -- ADD SUPPORT FOR ODD CSR'S AND DEVICE UNIT
;                       NUMBERS OVER 127.
;
; SYSTEM START UP AND INITIALIZATION ROUTINE
;
; MACRO LIBRARY CALLS
;

        .MCALL  HWDDF$
        HWDDF$                  ;DEFINE HARDWARE REGISTERS

;
; LOCAL DATA
;
; SYSTEM IDENTIFICATION MESSAGES
;

$POOL::                         ;START OF POOL


        .IF NDF R$$11S

SYSMG:  .ASCII  <15><12>/RSX11M V3.1 BL/

        .IFF

SYSMG:  .ASCII  <15><12>/RSX11S V2.1 BL/

        .ENDC


SYSID:  .ASCIZ  /XXXX/<15><12><12> ;
DEVMG:  .ASCIZ  <15><177><177><12>/ DEVICE DDUU: NOT IN CONFIGURATION/<15> ;
PROMT:  .ASCIZ  <15><12>/>/     ;
        .EVEN

;+
; **-$INITL-SYSTEM TRANSFER ADDRESS
;
; THIS ROUTINE CONTAINS THE TRANSFER POINT OF THE RESIDENT EXECUTIVE. WHEN
; THE SYSTEM IS BOOTED, CONTROL IS TRANSFERED HERE TO INITIALIZE AND START
; UP THE SYSTEM
;-

$INITL::RESET                   ;RESET PROCESSOR
        MOV     #$SYSIZ+2,R0    ;POINT TO SYSTEM CONFIGURATION VECTOR
        MOVB    R3,(R0)+        ;SAVE UNIT NUMBER
        MOVB    R1,(R0)+        ;SAVE LBN OF LOAD IMAGE
        MOV     R2,(R0)+        ;
        MOV     R4,(R0)+        ;SAVE DEVICE NAME
        MOV     R5,(R0)+        ;SAVE LENGTH OF LOAD FILE


        .IF DF  M$$MGE

        MOV     #PMODE+PR7,PS   ;SET MODE BITS AND LOCK OUT INTERRUPTS
        MOV     #$STACK-20,SP   ;SETUP EXEC STACK POINTER
        MOV     #KISAR0,R0      ;POINT TO KERNEL PAR 0
        MOV     #KISDR0,R1      ;POINT TO KERNEL PDR 0
        MOV     #UISAR0,R2      ;POINT TO USER PAR 0
        MOV     #UISDR0,R3      ;POINT TO USER PDR 0
        MOV     #8.,R4          ;SET LOOP COUNT
        CLR     R5              ;START AT BOTTOM OF MEMORY
10$:    MOV     R5,(R0)+        ;SET KERNEL AND USER RELOCATION BIAS
        MOV     R5,(R2)+        ;
        MOV     #77406,(R1)     ;SET KERNEL AND USER DESCRIPTOR  REGISTERS
        MOV     (R1)+,(R3)+     ;
        ADD     #200,R5         ;ADVANCE TO NEXT 4K BLOCK
        DEC     R4              ;ANY MORE REGISTERS TO LOAD?
        BGT     10$             ;IF GT YES
        MOV     #177600,-(R0)   ;SET KERNEL PAR 7 TO I/O PAGE
        INC     SR0             ;AND AWAY WE GO


        .IF DF  M$$EXT

        MOV     #UBMPR,R0       ;POINT TO FIRST UNIBUS MAPPING REG
        CLR     R1              ;SET INITIAL ADDRESS TO ZERO
        MOV     #5.,R2          ;SET NUMBER OF REGISTER PAIRS TO LOAD
11$:    MOV     R1,(R0)+        ;LOAD LOW 16 BITS OF ADDRESS
        CLR     (R0)+           ;CLEAR HIGH 6 BITS OF ADDRESS
        ADD     #20000,R1       ;ADVANCE 8K BYTES
        DEC     R2              ;ANY MORE TO LOAD?
        BGT     11$             ;IF GT YES
        MOV     #60,SR3         ;ENABLE 22 BIT ADDRESSING AND UB MAP

        .ENDC


        .IFF

        MTPS    #PR7            ;LOCK OUT INTERRUPTS
        MOV     #$STACK-10,SP   ;SETUP EXEC STACK POINTER

        .IFTF

        MOV     @#4,-(SP)       ;SAVE ADDRESS OF TRAP 4 ROUTINE
        MOV     #TRPRT,@#4      ;SET TRAP ADDRESS FOR NONEX MEM
        MOV     #$SYSID,R0      ;POINT TO SYSTEM IDENTIFICATION
        MOV     #SYSID,R1       ;POINT TO IDENTIFICATION MESSAGE
        MOVB    (R0)+,(R1)+     ;MOVE SYSTEM IDENTIFICATION INTO MESSAGE
        MOVB    (R0)+,(R1)+     ;
        MOVB    (R0)+,(R1)+     ;
        MOVB    (R0),(R1)       ;
        JSR     R5,OPMSG        ;TELL EVERYBODY WE'RE ON THE AIR
        .WORD   SYSMG           ;

        .IFT

        MOV     #140000,R0      ;SET INITIAL MEMORY ADDRESS
        CLR     KISAR6          ;SET ZERO RELOCATION BIAS

        .IFF

        CLR     R0              ;SET INITIAL MEMORY ADDRESS

        .IFTF

        CLR     R1              ;ZERO NUMBER OF 32W BLOCKS IN SYSTEM
13$:    TST     (R0)            ;MEMORY EXIST?
        BCS     17$             ;IF CS NO
        ADD     #40,R1          ;UPDATE NUMBER OF 32W BLOCKS

        .IFT

        ADD     #40,KISAR6      ;UPDATE RELOCATION BIAS BY 1K


        .IF DF  M$$EXT

        CMP     KISAR6,#170000  ;END OF MEMORY?

        .IFF

        CMP     KISAR6,#7600    ;END OF MEMORY?

        .ENDC


        BLO     13$             ;IF LO NO

        .IFF

        ADD     #4000,R0        ;UPDATE MEMORY ADDRESS BY 1K
        CMP     R0,#160000      ;END OF MEMORY?
        BLO     13$             ;IF LO NO

        .IFTF

17$:    MOV     R1,$SYSIZ       ;SET SIZE OF MEMORY IN 32W BLOCKS

        .IFT

        MOV     #1400,KISAR6    ;RESET MAPPING RELOCATION BIAS

        .ENDC


        MOV     #$DEVHD,R5      ;GET ADDRESS OF FIRST DCB ADDRESS
20$:    MOV     (R5),R5         ;GET ADDRESS OF NEXT DCB
        BEQ     80$             ;IF EQ NO MORE TO SCAN
        MOV     D.UCB(R5),R4    ;POINT TO FIRST UCB
        BIT     #DV.PSE,U.CW1(R4) ;PSEUDO DEVICE?
        BNE     20$             ;IF NE YES
        MOVB    D.UNIT(R5),-(SP) ;SET STARTING LOGICAL UNIT NUMBER
        MOVB    D.UNIT+1(R5),-(SP) ;CALCULATE NUMBER OF UCB'S TO SCAN
        SUB     D.UNIT(R5),(SP) ;
        INCB    (SP)            ;
        INCB    (SP)            ;
30$:    DECB    (SP)            ;ANY MORE UCB'S TO SCAN?
        BNE     40$             ;IF NE YES
        CMP     (SP)+,(SP)+     ;CLEAN STACK
        BR      20$             ;GO AGAIN
40$:    CMP     $SYSIZ+6,D.NAM(R5) ;DEVICE NAMES MATCH?
        BNE     45$             ;IF NE NO
        CMPB    $SYSIZ+2,2(SP)  ;UNIT NUMBERS MATCH?
        BNE     45$             ;IF NE NO
        MOV     R4,.SY0+2       ;REDIRECT SYSTEM DEVICE
        MOV     R4,.LB0+2       ;REDIRECT LB: AS WELL
45$:    MOV     U.SCB(R4),R2    ;GET ADDRESS OF SCB
        INCB    2(SP)           ;UPDATE LOGICAL UNIT NUMBER
        TSTB    @S.CSR(R2)      ;DEVICE IN SYSTEM?
        BCC     60$             ;IF CC YES
        BISB    #US.OFL,U.ST2(R4) ;SET DEVICE OFFLINE
        MOVB    D.NAM(R5),DEVMG+12. ;INSERT GENERIC DEVICE NAME
        MOVB    D.NAM+1(R5),DEVMG+13. ;
        MOV     R4,R0           ;COPY ADDRESS OF UCB
        SUB     D.UCB(R5),R0    ;CALCULATE ADDRESS OFFSET TO UCB
        MOV     D.UCBL(R5),R1   ;GET LENGTH OF UCB
        CALL    $DIV            ;CALCULATE RELATIVE UNIT NUMBER
        ADD     D.UNIT(R5),R0   ;CALCULATE LOGICAL UNIT NUMBER
        BIC     #177400,R0      ;CLEAR EXTRANEOUS BITS
        MOV     #8.,R1          ;SET DIVISOR
        CALL    $DIV            ;CONVERT UNIT NUMBER TO 2 DIGITS
        ADD     #'0,R0          ;ADD CHARACTER BIAS
        ADD     #'0,R1          ;ADD CHARACTER BIAS
        MOVB    R0,DEVMG+14.    ;INSERT DEVICE UNIT NUMBER
        MOVB    R1,DEVMG+15.    ;
        JSR     R5,OPMSG        ;OUTPUT DEVICE MESSAGE
        .WORD   DEVMG           ;
60$:    ADD     D.UCBL(R5),R4   ;CALCULATE ADDRESS OF NEXT UCB
        BR      30$             ;GO AGAIN
80$:                            ;REF LABEL


        .IF DF  P$$RTY

        MOV     #$PARTB,R0      ;GET ADDRESS OF PARITY CSR ADDRESS TABLE
        MOV     R0,R1           ;COPY ADDRESS OF TABLE
        MOV     #1,(R1)+        ;INSERT A ONE IN FIRST TABLE ENTRY
        MOV     #MPAR-2,R2      ;GET ADDRESS OF FIRST PARITY REGISTER-2
        MOV     #16.,R3         ;SET NUMBER OF PARITY REGISTERS
90$:    ADD     #2,R2           ;ADVANCE TO NEXT PARITY CSR REGISTER
        MOV     R2,(R1)+        ;ASSUME PARITY REGISTER PRESENT
        TST     (R2)            ;PARITY CSR REGISTER PRESENT?
        BCC     100$            ;IF CC YES
        MOV     R0,-2(R1)       ;POINT TO FIRST WORD OF TABLE
100$:   DEC     R3              ;ANY MORE TO SCAN?
        BGT     90$             ;IF GT YES
        MOV     (R1),R1         ;11/70 CACHE PARITY CSR SEARCH DONE?
        BEQ     105$            ;IF EQ YES
        MOV     #MPCSR-10,R2    ;POINT TO FIRST CSR ADDRESS - 2
        MOV     #6,R3           ;SET COUNT OF REGISTERS
        BR      90$             ;SEARCH FOR THEM
105$:                           ;REF LABEL

        .ENDC


        .IF DF  F$$LPP

        TST     PIRQ            ;IS THERE A PIRQ REGISTER?
        BCS     106$            ;IF CS NO
        MOV     #$FPPRQ,@#240   ;SET UP PIRQ VECTOR
        MOV     #$FPPR8,@#244   ;SET UP FLOATING POINT EXCEPTION VECTOR
106$:                           ;REF LABEL

        .ENDC


        JSR     R5,OPMSG        ;OUTPUT INITIAL PROMPT MESSAGE
        .WORD   PROMT           ;


        .IF DF  L$$SI1

        MOV     #$CKINT,@#100   ;SET CLOCK INTERRUPT VECTOR

        .IFF

        MOV     $CKCSR,R0       ;GET ADDRESS OF CLOCK CSR
        TST     (R0)            ;IS THE GENERATED CLOCK AVAILABLE?
        BCC     110$            ;IF CC YES
        MOV     #172540,R0      ;GET ADDRESS OF KW11-P CSR
        MOV     R0,$CKCSR       ;SETUP FOR KW11-P
        MOV     #172542,$CKCNT  ;
        MOV     #K$$LDC,$CKLDC  ;SET COUNT REGISTER LOAD COUNT
        MOV     #K$$TPS,$TKPS   ;SET TICKS PER SECOND
        TST     (R0)            ;KW11-P?
        BCC     110$            ;IF CC YES
        MOV     #177546,R0      ;GET ADDRESS OF KW11-L CSR
        MOV     R0,$CKCSR       ;SETUP FOR KW11-L
        MOV     R0,$CKCNT       ;
        CLR     $CKLDC          ;
        MOV     #H$$RTZ,$TKPS   ;SET TICKS PER SECOND TO LINE FREQUENCY
110$:   MOV     #$NONSI,@#100   ;RESET KW11-L INTERRUPT VECTOR
        MOV     #$CKINT,104     ;SETUP KW11-P VECTOR
        CMP     #172540,R0      ;KW11-P?
        BEQ     120$            ;IF EQ YES
        MOV     #$CKINT,100     ;SETUP KW11-L VECTOR
        MOV     #$NONSI,104     ;RESET KW11-P VECTOR
120$:   MOV     $CKCNT,R1       ;GET ADDRESS OF COUNT REGISTER
        MOV     $CKLDC,(R1)     ;SETUP CLOCK COUNT REGISTER
        MOV     #K$$IEN,(R0)    ;START CLOCK

        .ENDC


        .IF DF  M$$MGE

        MOV     #PMODE+PR7,PS   ;MAKE SURE PS IS SETUP PROPERLY

        .ENDC


        MOV     #SYSMG,R0       ;SET ADDRESS OF BLOCK TO RELEASE
        ADD     $CRAVL-2,R0     ;ROUND TO NEXT BOUNDARY
        BIC     $CRAVL-2,R0     ;
        MOV     #$SYBEG-SYSMG,R1 ;SET LENGTH OF BLOCK TO RELEASE
        CALL    $DEACB          ;DEALLOCATE INITIALIZATION CODE
        MOV     (SP)+,@#4       ;RESTORE TRAP 4 ROUTINE ADDRESS
        JMP     $DIRXT          ;START UP THE SYSTEM

;
; SUBROUTINE TO OUTPUT A MESSAGE TO THE SYSTEM CONSOLE TERMINAL
;

OPMSG:  MOV     (R5)+,R1        ;GET ADDRESS OF OUTPUT MESSAGE
10$:    MOVB    (R1)+,R0        ;GET NEXT BYTE TO OUTPUT
        BEQ     30$             ;IF EQ DONE
        MOVB    R0,TPS+2        ;LOAD BYTE IN OUTPUT BUFFER
20$:    TSTB    TPS             ;PRINTER BUSY?
        BCS     30$             ;IF CS NO CONSOLE TERMINAL
        BPL     20$             ;IF PL YES
        BR      10$             ;GO AGAIN
30$:    RTS     R5              ;

;
; NONEX MEM TRAP ROUTINE
;

TRPRT:  BIS     #1,2(SP)        ;SET CARRY BIT
        RTI                     ;

;
; END OF DYNAMIC STORAGE REGION
;


        .IF NE  <.-SYSMG>&3

        .BLKB   <.-SYSMG>&3

        .ENDC


;
; BEGINNING OF DYNAMIC STORAGE REGION
;

$SYBEG::.WORD   0               ;LINK TO NEXT BLOCK IN FREE LIST
        .WORD   <<<C$$ORE*2>+3>&177774> ;LENGTH OF FREE BLOCK
        .BLKB   <<<C$$ORE*2>+3>&177774>-4 ;ALLOCATE REMAINING STORAGE
$SYTOP::                        ;LAST ADDRESS IN EXECUTIVE

        .END    $INITL
>


Много ты здесь видишь “сплошных вызовов макрокоманд из системных библиотек”? А я вот вижу считанные единицы — CALL (который в макросе в зависимости от некоторых условий расширяется либо в JSR PC,SUBR, либо в JSR R5,SUBR), RETURN (который просто RTS PC), MTPS (который всего лишь либо чистит PSW, если аргумент #0, CLR @#PS, либо загоняет аргумент в младший байт PSW, MOVB ARG,@#PS). Прочее — самые что ни на есть чистые команды процессора (внезапно).

Могу показать RSXMC.MAC и RSXMC0.MAC — это как раз те самые “системные макрокоманды”, активно используемые в ядре. Активность использования — где-то в районе один макрос на 50 строк кода. Далековато от “сплошных вызовов макрокоманд”.

Информация

В рейтинге
4 637-й
Откуда
Россия
Зарегистрирован
Активность