?

Log in

No account? Create an account
   Journal    Friends    Archive    Profile    Memories
 

386DX-40 - morfizm


Oct. 9th, 2018 06:00 am 386DX-40

Разбирая старые файлы, наткнулся на custom-made заставку, которую я когда-то ставил себе на загрузку.
Думаю, оригинал написан на Паскале, но сохранился только hello.exe. Запустил его через DOSBox:



Update: нашёл исходник.

program Hello;

uses graph,crt;

const
  delay0 = 15;
  wait = 300; { tiks }

{$L egavga.obj}
{$L trip.obj}
var
  timer : longint absolute $40:$6c;

procedure setcreg(regnum : word; r,g,b : byte); assembler;
asm
  mov bx,regnum
  mov ch,g
  mov cl,b
  mov dh,r
  mov ah,10h
  mov al,10h
  int 10h
end;

procedure getcreg(regnum : word; var r,g,b : byte);
var
  r0,g0,b0 : byte;
begin
  asm
    mov bx,regnum
    mov ah,10
    mov al,15
    int 10h
    mov g0,ch
    mov b0,cl
    mov r0,dh
    end;
  r:=r0;
  g:=g0;
  b:=b0;
end;

procedure egavgadriverproc; external;
procedure triplexfontproc; external;

function since(i : longint): longint;
var
  j : longint;
begin
  j:=timer;
  while j<i do
        inc(j,1573040);
  since:=j-i;
end;

procedure init;
const
  maxtext = 7;
  text : array [1..maxtext] of string[50] = (
  'Welcome on IBM PC/AT 386DX-40!',
  'MS-DOS 6.22 is glad to see you now!',
  'Hard disk WDC AC21600H is ready for hard work',
  'SVGA monochrome "Sunny" is ready to output',
  'everything whatever you would dream about',
  '* * *',
  'Start working, please!');
var
  r,g,b : byte;
  procedure rgb(k : byte);
  begin
    setcreg(63,k,k,k);
  end;
  procedure rgb01;
  var
    i : integer;
  begin
    for i:=0 to 63 do begin
        delay(delay0);
        setcreg(63,i,i,i);
        end;
  end;
  procedure rgb10;
  var
    i : integer;
  begin
    for i:=63 downto 0 do begin
        delay(delay0);
        setcreg(63,i,i,i);
        end;
  end;
var
  grdriver,grmode,errorcode : integer;
  i,j,k : integer;
  p : longint;
  s,t : string;
begin
  grdriver:=detect;
  registerbgidriver(@egavgadriverproc);
  registerbgifont(@triplexfontproc);
  initgraph(grdriver,grmode,'');
  errorcode:=graphresult;
  if errorcode=grok then begin
     rgb(0);
     setcolor(white);
     ellipse((getmaxx div 2),(getmaxy div 2),0,360,
             (getmaxx div 2),(getmaxy div 2));
     ellipse((getmaxx div 2),(getmaxy div 2),0,360,
             (getmaxx div 2)-2,(getmaxy div 2)-2);
     settextstyle(triplexfont,horizdir,3);
     k:=122;
     for i:=1 to maxtext do begin
         j:=textwidth(text[i]);
         outtextxy((getmaxx-j) div 2,k,text[i]);
         k:=k+textheight(text[i])+10;
         end;
     rgb01;
     p:=timer;
     s:='';
     settextstyle(defaultfont,horizdir,0);
     repeat
       t:=s;
       str(round((wait-since(p))/18.2),s);
       s:=s+' seconds';
       if t<>s then begin
          setcolor(black);
          outtextxy(0,getmaxy-textheight(t)-5,t);
          setcolor(white);
          outtextxy(0,getmaxy-textheight(s)-5,s);
          end;
       if keypressed then
          break;
     until since(p)>wait;
     setcolor(black);
     outtextxy(0,getmaxy-textheight(s)-5,s);
     while keypressed do
           readkey;
     rgb10;
     cleardevice;
     rgb(63);
     closegraph;
     end;
end;

begin
  init;
end.


16 comments - Leave a commentPrevious Entry Share Next Entry

Comments:

From:khulinich
Date:October 9th, 2018 01:04 pm (UTC)
(Link)
Nice! )
From:morfizm
Date:October 9th, 2018 05:25 pm (UTC)
(Link)
Диме 18 лет было, когда он это написал. Смотрю дату: 2000-08-13.
From:birdwatcher
Date:October 9th, 2018 02:36 pm (UTC)
(Link)
Как у вас understated. Я иначе чем готическим шрифтом не писал.
From:morfizm
Date:October 9th, 2018 05:21 pm (UTC)
(Link)
Мне тогда ещё было не настолько комфортно с латиницей, паскальный готический шрифт совсем не казался мне легкочитаемым (или именно в этом и смысл? :))
From:morfizm
Date:October 9th, 2018 05:24 pm (UTC)
(Link)
Обновил пост - нашёлся исходник!
From:birdwatcher
Date:October 9th, 2018 05:28 pm (UTC)
(Link)
С любовью сработано.
From:morfizm
Date:October 9th, 2018 05:27 pm (UTC)
(Link)
Я был ленив - в коде, как видно, есть лишняя функция getcreg, которую я, вероятно, скопировал вкупе с setcreg просто на всякий случай.
From:morfizm
Date:October 9th, 2018 05:31 pm (UTC)
(Link)
Уже тогда прослеживался уровень доверия:
- порты зе бест (сервисы мамки), палитру херачим прямо в них,
- BIOS services хорошие друзья, когда нельзя писать в порты (timer : longint absolute $40:$6c)
- Либы это зло, но если слишком накладно писать напрямую в видеопамять или использовать порты и биос, то можно либы.
- DOS services - максимальное зло, use as a last resort! :)
From:birdwatcher
Date:October 9th, 2018 05:35 pm (UTC)
(Link)
И, главное, все работало. Я тоже любил писать в массив, начинающийся с b800, а не на экране печатать.
From:morfizm
Date:October 9th, 2018 05:37 pm (UTC)
(Link)
Да, да. Причём на паскале можно было туда замаппить массив. А если сделать record с padding-ом на 96 байт, то можно было ещё массив по видеостраницам делать.

И ещё, конечно, a000 для графики, и самый лучший в мире видеорежим - 320x200, 256 цветов. Пиксель это байт и всё влезает в сегмент. Просто пишешь пиксель в массив и рисуешь.
From:birdwatcher
Date:October 9th, 2018 05:40 pm (UTC)
(Link)
Эх, что уж там говорить. Такую экосистему просрали.
From:morfizm
Date:October 9th, 2018 05:41 pm (UTC)
(Link)
+1, грустно.
From:morfizm
Date:October 9th, 2018 05:40 pm (UTC)
(Link)
Надо будет ещё повыкладывать всякие детские шалости с interrupt handler'ами.

Помню, когда я был маленький, и учился на компьютерных курсах (PCs in a lab are shared with many student groups), много чего такого делал. Помню написал резидент, который по вводу "," писал в буфер клавиатуры ", бля,". Я его несколько раз оставлял после себя включенным. Помню потом случайно увидел девочку (из следующей группы), которая ничего не сказала преподу, а терпеливо аккуратно стирала бэкспейсом лишнее после каждой запятой. Интересно, что она думала? (Типа, комп сегодня грубоват и не в духе? :)).
From:morfizm
Date:October 9th, 2018 05:33 pm (UTC)
(Link)
У меня была замечательная книжка Джордейна, которую я читал когда мне было 13-14 лет. По этой книжке я понял, что такое программирование на низком уровне, на среднем и на высоком. Там были все примеры на ассемблере, и низкий уровень это порты, средний это биос - int 10h etc, а высокий это дос - int 21h, etc :)
From:freeborn
Date:October 9th, 2018 05:38 pm (UTC)
(Link)
трубопаскакаль был наше всё
From:dennyrolling
Date:October 15th, 2018 11:18 pm (UTC)
(Link)
особенно с ассемблерными вставками и однобуквенными именами переменных!


кстати, где переменные l, m, n и o?