Последний раз редактировалось Cos(x-pi/2) 20.10.2025, 13:00, всего редактировалось 3 раз(а).
Присоединяюсь к аплодисментам под картинкой с Виндовсами. Правда, не как знаток IT, а наоборот - как отсталый диванный юзер старинных Виндовсов: да, нравятся они мне. (И сейчас-то я пишу это в Win 7; и ещё есть у меня комп более чем 20-летней давности, в нём - Win ME и Win XP с любимыми программами :). Жалею, что в Win 7 уже нет возможности напрямую запускать 16-разрядные программки, как это удавалось в Win XP. (В DOSBox запускаются, однако иногда "тормозят"; лучше - в Virtual Box с Win XP, но всё это в общем хлопотно.) (Оффтоп)
Не знаю, молодёжь, может быть знает, а может и нет: у старинных программистов было такое соревнование - сочинять короткие, но живописные программки. Назывался этот спорт "демосцена" и "интро". По-видимому, рекордной является программка lochfrass.com - в ней всего 52 байта, и при этом она создаёт цветное анимированное изображение. Оно абстрактное, но всё-таки на что-то похожее - вроде процесса рождения множественных вселенных :) Скачать программку можно здесь: https://www.pouet.net/prod.php?which=20120Браузер ругается на все архивы с такими программками, как будто там вирусы или что-то вредоносное, но там нет вируса и есть исходный код на ассемблере - можно самостоятельно скомпилировать исполняемый файл типа com (или exe, однако exe будет значительно больше размером). Правда, в когда-то популярном 16-битном TASM 4.1 тот исходный код не компилируется без ошибок, но я из любопытства внёс небольшие изменения, и com-файл с 52 байтами стал получаться в TASM 4.1, хотя программист я вообще никакой. Вот этот доработанный для TASM исходный код:
- model tiny
- .code
- .486
- org 100h
-
- start:
-
- mov al,13h
- int 10h
- lds ax,[bx]
-
- mov bx,36345
- inc byte ptr [bx]
-
- schleife:
-
- imul ebx,65539357
- add ebx,4237
-
- mov cl, [bx+1]
- add cl, [bx-1]
- add cl, [bx-320]
- add cl, [bx+320]
- cmp cl,[bx]
- jbe schleife
-
- inc byte ptr [bx]
-
- in al,60h
- dec al
- jnz schleife
- ret
-
- end start
Ещё один удивительный (на мой взгляд) пример - программка mebnasm1.com размером 252 байта из архива с компилятором NASM 2.05.01. Она создаёт не цветное, но реалистичное подвижное (автоматически по-всякому поворачивающееся) 3d-изображение некоего подобия ленты Мебиуса; вот скриншот из Win XP в Virtual Box в Win 7:  Её исходный код для NASM из файла mebnasm1.asm:
- bits 16
- org 0x100
- _N equ 700
- _M equ 70
-
- start:
- les bp,[bx]
- mov al,0x13
- int 0x10
-
- ; palette
- mov dx,0x3c8
- out dx,al
- inc dx
- .pal_loop:
- add ax,cx
- shr ax,2
- out dx,al
- out dx,al
- ;mov ax,cx
- ;shl ax,1
- out dx,al
- loop .pal_loop
- push 0x9000
- pop fs
- xchg bp,dx ; this segment will be used as our backbuffer
-
- mainloop:
- ; xor di,di
- ; mov cx,256
- ;.test:
- ; mov ax,cx
- ; stosb
- ; loop .test
-
- .getN:
- mov bx,_N
- .Nloop:
- mov si,_s
-
- fld dword [si] ; s
- fadd dword [si-16+2] ; s+=ds
- fstp dword [si] ; s'
-
- .getM:
- mov dx,_M
- .Mloop:
-
- mov si,_tmpw
-
- fld dword [si-12] ; s
- fsincos ; sin(s) cos(s)
- fld1 ; 1 s sin(s) cos(s)
- fdivr dword [si-12]
- fsincos ; sin(s/2) cos(s/2) cos(s) sin(s)
-
- mov word [si],dx
- fild word [si]
- fmul dword [si-24+2] ; _dt
- fadd dword [si-32+2] ; _t
-
- fmul st1,st0 ; t t*sin(s/2) cos(s/2) cos(s) sin(s)
-
-
- fmulp st2,st0 ; t t*sin(s/2) t*cos(s/2) cos(s) sin(s)
- fld st1 ; t*cos(s/2) z t*cos(s/2) cos(s) sin(s)
- fmul st3 ; t*cos(s/2)*cos(s) z t*cos(s/2) cos(s) sin(s)
- faddp st3,st0 ; z t*cos(s/2) x sin(s)
- fxch st3 ; sin(s) t*cos(s/2) x z
- fmul st1,st0 ; sin(s) sin(s)*t*cos(s/2) x z
- fsubp st1 ; y x z
- fxch ; x y z
-
- mov cl,3 ; rotate about x,y and z axis
- .rotation:
-
- fldpi ; PI
- fimul word [si-4] ; (_angle)
- fidiv word [._180+2]
-
- fsincos ; sin cos x y z
- fld st2 ; x sin cos x y z
- fmul st2 ; x*cos sin cos x y z
- fld st4 ; y x*cos sin cos x y z
- fmul st2 ; y*sin x*cos sin cos x y z
- fsubrp st1 ; x' sin cos x y z
- fxch ; sin x' cos x y z
- fmulp st3,st0 ; x' cos x*sin y z
- fxch ; cos x' x*sin y z
- fmulp st3,st0 ; x' x*sin*cos z
- fxch ; x*sin x' y*cos z
- faddp st2 ; y ' x' z
- fxch st2 ; z y x
- loop .rotation
- ; z y x
- fld st0 ; z z y x
- fimul word [._32+1] ; zcol
- fistp word [si] ; _tmpw
-
- mov ax,word [si] ; _tmpw
- add ax,128+21
-
- fiadd word [._180+2] ; z' y x (zdist)
- fxch ; y z x
-
- fimul word [si-20+2] ; (_persp)
- fdiv st1 ; y/z z x
- fistp word [si] ; z x (_tmpw)
-
- mov di,[si]
- lea di,[di+100] ; y = y+100, lea saves a byte here
- imul di,320
-
-
- fdivp st1 ; x/z
- fimul word [si-20+2] ; (_persp)
- fistp word [si] ; x in tmpw
-
- add di,word [si]
- ._180:
- lea di,[di+bp+180] ; the constant 180 is being
- ; also used from elsewhere in the
- cmp byte [fs:di],al ; code :)
- jnb .next
-
- ; z-buffer
- mov [fs:di],al
-
- ; texture and shading
- pusha
- xor dl,bl
- and dl,11111b
- sub dx,ax
- xchg ax,dx
- ._32:
- add ax,64
-
- mov [di],al
- ;stosb
- popa
- .next:
-
- inc di
- dec dx
- jnz .Mloop
-
- dec bx
- jnz .Nloop
-
- inc word [si-4] ; _angle
-
- mov dword [si-12+2],edx ; _s
-
- mov ch,0x7D
- mov si,bp
- xor di,di
- .copy_and_clear:
- mov word [fs:di],dx
- movsw
- ;mov bx,si
- ;xor bx,di
- mov word [si-2],dx
- loop .copy_and_clear
-
- in al,0x60
- dec ax
- jnz mainloop
-
- ret
-
- _vars:
- _t dd -0.4
- _ds dd 0.00897597901025655210989326680937
- _dt dd 0.011428571428571428571428571428571 ; dt = 0.8/M;
- _persp dw 11500
-
- _data:
-
- _s equ _data+4
- _tw equ _data+8
- _angle equ _data+12
- _tmpw equ _data+16
Преобразовать этот код для создания файла com в TASM мне не удалось; удалось только модифицировать этот код для создания файла exe в TASM:
- masm
- model tiny
- stack 256
- .486
-
- assume cs:text, ds:data
-
- data segment use16
-
- N equ 700
- M equ 70
-
- stov dw 00B4h
- trid dw 0040h
-
- v_t dd -0.4
- v_ds dd 0.00897597901025655210989326680937
- v_dt dd 0.011428571428571428571428571428571 ; dt = 0.8/M;
- v_persp dw 11500
-
- d_s dd 1
- d_tw dd 2
- d_angle dd 3
- d_tmpw dd 4
-
- data ends
- ;-----------------------------
-
- text segment use16
-
- start:
- xor bx,bx
- les bp,[bx]
- mov ax,0013h
- int 10h
-
- ; palette
- mov dx,03c8h
- out dx,al
- inc dx
- pal_loop:
- add ax,cx
- shr ax,02h
- out dx,al
- out dx,al
- out dx,al
- loop pal_loop
-
- push 9000h
- pop fs
- xchg bp,dx ; our backbuffer
-
- mainloop:
-
- mov bx,N
- Nloop:
- mov si, (offset d_s)+0200h ; mov si, d_s
-
- fld dword ptr ds:[si] ; s
- fadd dword ptr ds:[si-12+2] ; s+=ds
- fstp dword ptr ds:[si] ; s'
-
- mov dx,M
- Mloop:
- mov si, (offset d_tmpw)+0200h ;mov si,d_tmpw
-
- fld dword ptr ds:[si-12] ; s
- fsincos ; sin(s) cos(s)
- fld1 ; 1 s sin(s) cos(s)
- fdivr dword ptr ds:[si-12]
- fsincos ; sin(s/2) cos(s/2) cos(s) sin(s)
-
- mov ds:[si],dx
- fild word ptr ds:[si]
- fmul dword ptr ds:[si-20+2] ; _dt
- fadd dword ptr ds:[si-28+2] ; _t
-
- fmul st(1),st ; t t*sin(s/2) cos(s/2) cos(s) sin(s)
- fmulp st(2),st ; t t*sin(s/2) t*cos(s/2) cos(s) sin(s)
- fld st(1) ; t*cos(s/2) z t*cos(s/2) cos(s) sin(s)
- fmul st,st(3) ; t*cos(s/2)*cos(s) z t*cos(s/2) cos(s) sin(s)
- faddp st(3),st ; z t*cos(s/2) x sin(s)
- fxch st(3) ; sin(s) t*cos(s/2) x z
- fmul st(1),st ; sin(s) sin(s)*t*cos(s/2) x z
- fsubp st(1),st ; y x z
- fxch st(1) ; x y z
-
- mov cl,03h ; rotate about x,y and z axis
-
- rotation:
-
- fldpi ; PI
- fimul word ptr ds:[si-4] ; (v_angle)
- fidiv word ptr ds:[si-30]
-
- fsincos ; sin cos x y z
- fld st(2) ; x sin cos x y z
- fmul st,st(2) ; x*cos sin cos x y z
- fld st(4) ; y x*cos sin cos x y z
- fmul st,st(2) ; y*sin x*cos sin cos x y z
- fsubrp st(1),st ; x' sin cos x y z
- fxch st(1) ; sin x' cos x y z
- fmulp st(3),st ; x' cos x*sin y z
- fxch st(1) ; cos x' x*sin y z
- fmulp st(3),st ; x' x*sin*cos z
- fxch st(1) ; x*sin x' y*cos z
- faddp st(2),st ; y ' x' z
- fxch st(2) ; z y x
- loop rotation
-
- fld st(0) ; z z y x
- fimul word ptr ds:[si-28]
- fistp word ptr ds:[si] ; _tmpw
-
- mov ax,ds:[si] ; _tmpw
- add ax,128+21
-
- fiadd word ptr ds:[si-30]
- fxch st(1) ; y z x
-
- fimul word ptr ds:[si-16+2] ; (_persp)
- fdiv st,st(1) ; y/z z x
- fistp word ptr ds:[si] ; z x (_tmpw)
-
- mov di,ds:[si]
- lea di,ds:[di+100] ; y = y+100, lea saves a byte here
- imul di,320
-
- fdivp st(1),st ; x/z
- fimul word ptr ds:[si-16+2] ; (_persp)
- fistp word ptr ds:[si] ; x in tmpw
-
- add di,ds:[si]
-
- lea di,ds:[di+bp+180]
- cmp fs:[di],al
- jnb next
-
- ; z-buffer
-
- mov fs:[di],al
-
- ; texture and shading
-
- pusha
- xor dl,bl
- and dl,1Fh ; and dl,11111b
- sub dx,ax
- xchg ax,dx
-
- add ax,64
- mov ds:[di],al
- popa
-
- next:
-
- inc di
- dec dx
- jnz Mloop
-
- dec bx
- jnz Nloop
-
- inc word ptr ds:[si-4] ; _angle
-
- mov ds:[si-12],edx ; _s
-
- mov ch,7Dh
- mov si,bp
- xor di,di
-
- copy_and_clear:
- mov fs:[di],dx
- movsw
- mov [si-2],dx
- loop copy_and_clear
-
- in al,60h
- cmp al,1
- jne mainloop
-
- ;---------------
- mov ax,4c00h
- int 21h
-
- text ends
- end start
Программка mebnasm1.com небольшая, так что можно и не компилировать файл asm, а в каком-нибудь hex-редакторе прямо набрать её уже готовые байт-коды: Код: C4 2F B0 13 CD 10 BA C8 03 EE 42 01 C8 C1 E8 02 EE EE EE E2 F6 68 00 90 0F A1 87 EA BB BC 02 BE 00 02 D9 04 D8 44 F2 D9 1C BA 46 00 BE 0C 02 D9 44 F4 D9 FB D9 E8 D8 7C F4 D9 FB 89 14 DF 04 D8 4C EA D8 44 E2 DC C9 DE CA D9 C1 D8 CB DE C3 D9 CB DC C9 DE E9 D9 C9 B1 03 D9 EB DE 4C FC DE 36 AC 01 D9 FB D9 C2 D8 CA D9 C4 D8 CA DE E1 D9 C9 DE CB D9 C9 DE CB D9 C9 DE C2 D9 CA E2 DB D9 C0 DE 0E C0 01 DF 1C 8B 04 05 95 00 DE 06 AC 01 D9 C9 DE 4C EE D8 F1 DF 1C 8B 3C 8D 7D 64 69 FF 40 01 DE F9 DE 4C EE DF 1C 03 3C 8D BB B4 00 64 38 05 73 12 64 88 05 60 30 DA 80 E2 1F 29 C2 92 05 40 00 88 05 61 47 4A 0F 85 61 FF 4B 0F 85 4F FF FF 44 FC 66 89 54 F6 B5 7D 89 EE 31 FF 64 89 15 A5 89 54 FE E2 F7 E4 60 48 0F 85 2F FF C3 CD CC CC BE FC 0F 13 3C E7 3E 3B 3C EC 2C
И вот ещё одна замечательная программка - stoerfall_ost_final.com. Её размер: 4637 байт. Она строит сюжетное цветное анимированное 3d-изображение и сопровождает его музыкой; ссылка на скачивание есть здесь: https://www.pouet.net/prod.php?which=743Там же есть ссылка на архив с исходным кодом для MASM. Насколько понимаю, этот файл com - результат какой-то упаковки, а у распакованного файла exe размер почти в два раза больше, и он уже 32-битный, а не 16-битный. Ну, всё равно, это выглядит чудом (imho) по сравнению с современными "гига-размерами" файлов и требуемой для них памяти. Вообще, много было приятных сравнительно небольших программ под старые Windows, все не перечислить. Например, под Win ME у меня установилась "среда разработки" Visual C++6.0 1998 года; в дистрибутиве всего примерно 80 мегабайт. И это оказалась такая замечательная штука, что при практически полном незнании программирования (весь мой опыт - примитивное программирование в 1980-х на старинном Бейсике для ЭВМ "Электроника Д3-28") удалось, поддавшись ностальгии, сделать симулятор той самой любимой старинной ЭВМ Д3-28 :) Сочинял его без понятия об "ООП" и возможностях С++, а просто так же, как когда-то что-то сочинял на примитивном Бейсике. И, оказывается, этот симулятор работает даже в более новых системах - Win XP и Win 7 (наверное потому, что в этой проге нет обращений ни к каким вспомогательным библиотекам, кроме Win32 API из самой системы). В Win 8 и старше не проверял, у меня их нет; вероятно, в них уже не будет работать моя прога, так как по слухам (и если правильно понимаю слухи), начиная с Win 8 "винда испортилась" :) А мониторы раньше вот какие интересные были: 
|