1 ; **************************************************************************** 2 ; dropz.s (for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; DROPZ.PRG ! VGA DEMO program by Erdogan TAN 5 ; 6 ; 30/10/2017 7 ; 8 ; [ Last Modification: 05/12/2023 ] 9 ; 10 ; Derived from source code of 'DROPZ.COM' ('dropz.asm') by baze/3SC 11 ; (17/04/2000) 12 ; Assembler: NASM 2.15 (2.11) 13 ; ---------------------------------------------------------------------------- 14 ; nasm dropz.s -l dropz.txt -o DROPZ.PRG 15 ; **************************************************************************** 16 17 ;------------------------------------------------------------------------------- 18 ; dr()pz [refined], 256B intro, 1st place at Demobit 98 demoparty 19 ; coded by -baze-> of 3SC [with help of bEETLE and loveC (many refinements)] 20 ; e-mail: baze@decef.elf.stuba.sk 21 ;------------------------------------------------------------------------------- 22 ; This source code is written to be compiled by cool Netwide Assembler (NASM). 23 ; Visit it's web site at www.web-sites.co.uk/nasm. 24 ;------------------------------------------------------------------------------- 25 ; And now few comments in worldwide used Slovak language :) 26 27 ;------------------------------------------------------------------------------ 28 ; TRDOS 386, TRDOS v2.0 29 ;------------------------------------------------------------------------------ 30 31 ; 14/07/2020 32 ; 31/12/2017 33 ; TRDOS 386 (v2.0) system calls 34 _ver equ 0 35 _exit equ 1 36 _fork equ 2 37 _read equ 3 38 _write equ 4 39 _open equ 5 40 _close equ 6 41 _wait equ 7 42 _create equ 8 43 _rename equ 9 44 _delete equ 10 45 _exec equ 11 46 _chdir equ 12 47 _time equ 13 48 _mkdir equ 14 49 _chmod equ 15 50 _rmdir equ 16 51 _break equ 17 52 _drive equ 18 53 _seek equ 19 54 _tell equ 20 55 _memory equ 21 56 _prompt equ 22 57 _path equ 23 58 _env equ 24 59 _stime equ 25 60 _quit equ 26 61 _intr equ 27 62 _dir equ 28 63 _emt equ 29 64 _ldrvt equ 30 65 _video equ 31 66 _audio equ 32 67 _timer equ 33 68 _sleep equ 34 69 _msg equ 35 70 _geterr equ 36 71 _fpstat equ 37 72 _pri equ 38 73 _rele equ 39 74 _fff equ 40 75 _fnf equ 41 76 _alloc equ 42 77 _dalloc equ 43 78 _calbac equ 44 79 _dma equ 45 80 81 %macro sys 1-4 82 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 83 ; 03/09/2015 84 ; 13/04/2015 85 ; Retro UNIX 386 v1 system call. 86 %if %0 >= 2 87 mov ebx, %2 88 %if %0 >= 3 89 mov ecx, %3 90 %if %0 = 4 91 mov edx, %4 92 %endif 93 %endif 94 %endif 95 mov eax, %1 96 ;int 30h 97 int 40h ; TRDOS 386 (TRDOS v2.0) 98 %endmacro 99 100 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 101 ; sys systemcall (eax) , , 102 103 ;------------------------------------------------------------------------------ 104 ; CODE 105 ;------------------------------------------------------------------------------ 106 107 [BITS 32] 108 [org 0] 109 110 Start: 111 ; clear bss 112 00000000 B9[00100200] mov ecx, EOF 113 00000005 BF[9A010000] mov edi, bss_start 114 0000000A 29F9 sub ecx, edi 115 0000000C C1E902 shr ecx, 2 116 0000000F 31C0 xor eax, eax 117 00000011 F3AB rep stosd 118 119 00000013 56 push esi ; naplnime niecim zasobnik pre nahodne cisla 120 00000014 56 push esi 121 122 00000015 B013 mov al, 13h 123 ;int 10h ; inicializacia grafickeho modu 320x200x256 124 00000017 CD31 int 31h 125 126 ; DIRECT VGA MEMORY ACCESS 127 ; bl = 0, bh = 5 128 ; Direct access/map to VGA memory (0A0000h) 129 130 sys _video, 0500h 82 <1> 83 <1> 84 <1> 85 <1> 86 <1> %if %0 >= 2 87 00000019 BB00050000 <1> mov ebx, %2 88 <1> %if %0 >= 3 89 <1> mov ecx, %3 90 <1> %if %0 = 4 91 <1> mov edx, %4 92 <1> %endif 93 <1> %endif 94 <1> %endif 95 0000001E B81F000000 <1> mov eax, %1 96 <1> 97 00000023 CD40 <1> int 40h 131 00000025 3D00000A00 cmp eax, 0A0000h 132 ;jne ENDPROG 133 0000002A 7405 je short _x 134 0000002C E9FA000000 jmp ENDPROG 135 _x: 136 137 ; VYPOCET PALETY FARIEB 138 139 00000031 B100 mov cl, 0 ; do CL hodnota "256" (CH = ?, minus 1 byte) 140 PALETTE: 141 00000033 66BAC803 mov dx, 3C8h ; do DX port PEL ADDRESS registra 142 00000037 88C8 mov al, cl 143 ;out dx, al ; odoslanie indexu farby 144 00000039 B401 mov ah, 1 145 0000003B CD34 int 34h 146 0000003D 42 inc edx ; do DX port PEL DATA registra 147 0000003E B000 mov al, 0 148 ;out dx, al ; odoslanie zlozky R 149 00000040 CD34 int 34h 150 00000042 88C8 mov al, cl 151 00000044 D0E8 shr al, 1 152 ;out dx, al ; odoslanie zlozky G 153 00000046 CD34 int 34h 154 00000048 88C8 mov al, cl 155 0000004A 3C40 cmp al, 64 156 0000004C 7202 jb short OKPAL 157 ;mov ax, 4A3Fh ; do AH cislo DOS sluzby na realokaciu pamate 158 0000004E B03F mov al, 3Fh 159 OKPAL: 160 ;out dx, al ; odoslanie zlozky B 161 ;mov ah, 1 162 00000050 CD34 int 34h 163 ;loop PALETTE ; opakujeme pre vsetky farby 164 00000052 FEC9 dec cl 165 00000054 75DD jnz short PALETTE 166 167 ; ALOKACIA PAMATE POTREBNEJ PRE DVE 256 x 256 PIXELOVE MAPY 168 169 ; ;mov ah, 4Ah 170 ; mov bh, 3*16 ; do BX aspon 3*16*256 paragrafov (BL = ?, -1B) 171 ; int 21h ; alokujeme 3 segmenty (program + 2 mapy) 172 ; jc near ENDPROG ; ak je malo pamate, ukoncime program 173 174 ; mov ax, cs 175 ; add ah, 16 176 ; mov ds, ax ; do DS segmentova adresa prvej mapy 177 ; add ah, 16 178 ; mov es, ax ; do ES segmentova adresa druhej mapy 179 180 00000056 BA[00100000] mov edx, DrawSegment ; * 181 0000005B BD[00100100] mov ebp, EffectSegment ; * 182 183 ; VYPIS BITMAPOVEHO TEXTU 184 185 WATER: 186 ;push ebp ; *** 187 00000060 52 push edx ; *** 188 189 ;push es ; ulozime ES (budeme potrebovat pointer na mapu) 190 ;mov ax, 1130h ; sluzba VGA BIOS - informacie o fonte 191 00000061 B830110000 mov eax, 1130h 192 ;mov bh, 3 ; budeme pouzivat font 8 x 8 pixelov 193 ;int 10h ; v ES:BP je adresa fontu 194 00000066 BB01000000 mov ebx, 1 ; VGA Font 8x8 195 ;xor ecx, ecx 196 0000006B BA[9A010000] mov edx, VgaFont8Buffer 197 00000070 CD31 int 31h 198 199 00000072 5A pop edx ; *** 200 ;pop ebp ; *** 201 202 00000073 BB[70010000] mov ebx, TEXT ; ideme "virit hladinu" textom 203 00000078 BE26400000 mov esi, 64*256+38 ; do SI umiestnenie textu v mape 204 0000007D E8B8000000 call DRAWTEX ; zavolame vypis znakoveho retazca 205 00000082 BE64640000 mov esi, 100*256+100 206 00000087 E8AE000000 call DRAWTEX ; a to celkovo 3 krat 207 0000008C BE24880000 mov esi, 136*256+36 208 00000091 E8A4000000 call DRAWTEX 209 210 ;pop es ; obnovime pointer na pixelovu mapu 211 212 ; "KVAPNUTIE" NA HLADINU 213 214 RANDOM: 215 00000096 5E pop esi ; nahodne cisla x[n] = (5 * x[n-1] + 7) % 65536 216 00000097 668D74B607 lea si, [esi+4*esi+7]; takto pocita uvedeny vyraz loveC :) 217 0000009C C60432FF mov byte [edx+esi], 255 ; umiestnime na nahodne miesto mapy kvapku 218 000000A0 56 push esi ; ulozime nahodne cislo do buducej iteracie 219 220 ; VYPOCET SIRENIA VLNENIA V MAPE (nemam miesto na odvodenie vztahov z fyziky) 221 222 WATLINE: 223 000000A1 8A443A01 mov al, [edx+edi+1] 224 000000A5 02443AFF add al, [edx+edi-1] ; spocitame okolite pixely 225 000000A9 02843A00010000 add al, [edx+edi+256] 226 000000B0 02843A00FFFFFF add al, [edx+edi-256] 227 000000B7 D0E8 shr al, 1 ; vydelime sucet dvoma 228 000000B9 2A443D00 sub al, [ebp+edi] ; odcitame predchadzajucu fazu 229 000000BD 7302 jnc short OK ; pripadne orezeme zaporne vlny ... 230 000000BF B000 mov al, 0 ; ... ziskame tak vacsiu amplitudu (0 - 255) 231 OK: 232 ;stosb ; ulozime pixel 233 000000C1 88443D00 mov [ebp+edi], al 234 000000C5 6647 inc di 235 000000C7 6609FF or di, di 236 000000CA 75D5 jnz short WATLINE ; opakujeme pre vsetky pixely v mape 237 238 ;push ds ; ulozime DS (neskor POPneme do ES) 239 000000CC 52 push edx ; *(*) 240 ;push es 241 ;pop ds ; do DS hodnota ES (vymena pointrov na mapy) 242 ;mov edx, ebp ; ** 243 ;push word 0A000h 244 ;pop es ; do ES segmentova adresa zaciatku videoram 245 246 ; CAKANIE NA NOVY SNIMOK 247 248 FRAME: 249 000000CD 66BADA03 mov dx, 3DAh ; do DX port INPUT STATUS registra (DH = 3, -1B) 250 000000D1 B400 mov ah, 0 251 ;in al, dx 252 000000D3 CD34 int 34h 253 000000D5 2408 and al, 8 254 000000D7 74F4 jz short FRAME ; pockame na novy snimok 255 256 ; VYKRESLENIE MAPY NA OBRAZOVKU 257 000000D9 89EA mov edx, ebp ; ** 258 259 000000DB BF20000000 mov edi, 32 ; budeme vykreslovat od 32. stlpca (centrovanie) 260 000000E0 31F6 xor esi, esi ; do SI zaciatok vykreslovanej mapy 261 000000E2 BDC8000000 mov ebp, 200 ; kreslime 200 riadkov 262 DRAW: 263 000000E7 B180 mov cl, 128 ; prenasame 256 bajtov, cize 128 slov (word) 264 ;rep movsw ; prenos slov z mapy do videoram (rychlejsie) 265 draw_loop: 266 000000E9 668B0432 mov ax, [edx+esi] 267 000000ED 66898700000A00 mov [edi+0A0000h], ax 268 000000F4 6683C602 add si, 2 269 000000F8 6683C702 add di, 2 270 000000FC E2EB loop draw_loop 271 000000FE 0FB61C32 movzx ebx, byte [edx+esi] ; vyberieme hodnotu z mapy kvoli "osciloskopu" 272 00000102 08DB or bl, bl ; je vyska hladiny v mape nulova? ... 273 00000104 7412 jz short NOOSCIL ; ... ak ano, nevykreslujeme pixel (estetika) 274 00000106 C6843B80FF090050 mov byte [ebx+edi+0A0000h-128], 80 ; inak vykreslime symetricky dva pixely 275 0000010E F7DB neg ebx ; s danou intenzitou 276 00000110 C6843B80FF090050 mov byte [ebx+edi+0A0000h-128], 80 277 NOOSCIL: 278 00000118 6683C740 add di, 64 ; posunieme sa na dalsi riadok obrazovky 279 0000011C 4D dec ebp 280 0000011D 75C8 jnz short DRAW ; a opakujeme pre vsetky riadky 281 282 ;pop es ; dokoncenie vymeny ES <-> DS 283 0000011F 5D pop ebp ; *(*) 284 285 ;push edx ; **** 286 ;;in al, 60h ; test klavesy ESC 287 ;mov dx, 60h 288 ;;mov ah, 0 289 ;int 34h 290 ;pop edx ; **** 291 ;dec al 292 ;jnz WATER ; ak nebola stlacena, skok na dalsi snimok 293 294 00000120 B401 mov ah, 1 295 00000122 CD32 int 32h 296 ;jz WATER 297 00000124 7505 jnz short ENDPROG 298 00000126 E935FFFFFF jmp WATER 299 300 ENDPROG: 301 0000012B 66B80300 mov ax, 03h 302 ;mov al, 3 303 ;int 10h ; nastavenie textoveho rezimu 304 0000012F CD31 int 31h 305 306 00000131 5E pop esi 307 00000132 5E pop esi ; oprava zasobnika po nahodnych cislach 308 309 sys _exit ; navrat do operacneho systemu 82 <1> 83 <1> 84 <1> 85 <1> 86 <1> %if %0 >= 2 87 <1> mov ebx, %2 88 <1> %if %0 >= 3 89 <1> mov ecx, %3 90 <1> %if %0 = 4 91 <1> mov edx, %4 92 <1> %endif 93 <1> %endif 94 <1> %endif 95 00000133 B801000000 <1> mov eax, %1 96 <1> 97 00000138 CD40 <1> int 40h 310 311 ; RUTINA NA VYPIS TEXTOVEHO RETAZCA 312 313 DRAWTEX: 314 0000013A 0FB63B movzx edi, byte [ebx] ; do DI ASCII hodnota znaku 315 0000013D 43 inc ebx ; zvysime ukazovatel na text 316 0000013E C1E703 shl edi, 3 ; DI = DI * 8, mame offset znaku vo fonte 317 00000141 742C jz short RETURN ; ak bol znak nulovy, koniec vypisu 318 00000143 B108 mov cl, 8 ; budeme vypisovat 8 riadkov 319 CHARLIN: 320 00000145 8A87[9A010000] mov al, [VgaFont8Buffer+edi] ; vyberieme bajt z predlohy znaku 321 0000014B 47 inc edi ; zvysime ukazovatel na dalsi bajt predlohy 322 0000014C B508 mov ch, 8 ; znak ma 8 stlpcov 323 ROTATE: 324 0000014E D0E0 shl al, 1 ; do CARRY pixel z predlohy 325 00000150 7307 jnc short NOPIXEL ; ak pixel nebol nastaveny, nic nekreslime 326 00000152 81043204030402 add dword [edx+esi], 02040304h ; inak pripocitame "stvorpixel" 327 NOPIXEL: 328 00000159 6683C604 add si, 4 ; posunieme sa na dalsi pixel v mape 329 0000015D FECD dec ch 330 0000015F 75ED jnz short ROTATE ; opakujeme 8-krat 331 00000161 6681C6E003 add si, 1024-32 ; posunieme sa na dalsi riadok 332 00000166 E2DD loop CHARLIN ; opakujeme 8-krat (LOOP trik, CH = 0, setrime) 333 00000168 6681C620E0 add si, 32-8192 ; posunieme sa na dalsi znak 334 0000016D EBCB jmp short DRAWTEX ; skok na vypis dalsieho znaku 335 RETURN: 336 0000016F C3 retn 337 338 ;------------------------------------------------------------------------------ 339 ; DATA 340 ;------------------------------------------------------------------------------ 341 342 TEXT: 343 00000170 64722829707A00 db "dr()pz", 0 ; hadajte co :) 344 00000177 627900 db "by",0 345 0000017A 2D62617A653E00 db "-baze>", 0 346 347 ;------------------------------------------------------------------------------- 348 ; Initially, this intro was hacked up during sleepless night before party. 349 ; Few days after Demobit 98 we made this refined version. Although it is not 350 ; as carefully optimized as it can be [loveC was able to make it in less than 351 ; 230 bytes], I decided to spread this [almost original] code. It is easier 352 ; to understand and it actually shows our poor mental state at given time :) 353 ;------------------------------------------------------------------------------- 354 355 ;db "Erdogan Tan [01/11/2017]" 356 00000181 4572646F67616E2054- db "Erdogan Tan [05/12/2023]", 0 356 0000018A 616E205B30352F3132- 356 00000193 2F323032335D00 357 358 ;------------------------------------------------------------------------------ 359 ; UNINITIALIZED DATA 360 ;------------------------------------------------------------------------------ 361 362 bss_start: 363 364 ABSOLUTE bss_start 365 366 alignb 2 367 368 VgaFont8Buffer: 369 0000019A resb 8*256 370 371 ;alignb 65536 372 0000099A alignb 4096 373 374 DrawSegment: 375 00001000 resb 65536 376 377 EffectSegment: 378 00011000 resb 65536 379 380 EOF: