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: 01/11/2017 ] 9 ; 10 ; Derived from source code of 'DROPZ.COM' ('dropz.asm') by baze/3SC 11 ; (17/04/2000) 12 ; Assembler: NASM 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 ; 01/03/2017 32 ; 16/10/2016 33 ; 29/04/2016 34 ; TRDOS 386 system calls (temporary list!) 35 _ver equ 0 36 _exit equ 1 37 _fork equ 2 38 _read equ 3 39 _write equ 4 40 _open equ 5 41 _close equ 6 42 _wait equ 7 43 _creat equ 8 44 _link equ 9 45 _unlink equ 10 46 _exec equ 11 47 _chdir equ 12 48 _time equ 13 49 _mkdir equ 14 50 _chmod equ 15 51 _chown equ 16 52 _break equ 17 53 _stat equ 18 54 _seek equ 19 55 _tell equ 20 56 _mount equ 21 57 _umount equ 22 58 _setuid equ 23 59 _getuid equ 24 60 _stime equ 25 61 _quit equ 26 62 _intr equ 27 63 _fstat equ 28 64 _emt equ 29 65 _mdate equ 30 66 _video equ 31 67 _audio equ 32 68 _timer equ 33 69 _sleep equ 34 70 _msg equ 35 71 _geterr equ 36 72 _fpsave equ 37 73 _pri equ 38 74 _rele equ 39 75 _fff equ 40 76 _fnf equ 41 77 _alloc equ 42 78 _dalloc equ 43 79 _calbac equ 44 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[00000300] mov ecx, EOF 113 00000005 BF[A1010000] mov edi, bss_start 114 0000000A 29F9 sub ecx, edi 115 0000000C D1E9 shr ecx, 1 116 0000000E 31C0 xor eax, eax 117 00000010 F366AB rep stosw 118 119 00000013 6656 push si ; naplnime niecim zasobnik pre nahodne cisla 120 00000015 6656 push si 121 122 00000017 66B81300 mov ax, 13h 123 ;int 10h ; inicializacia grafickeho modu 320x200x256 124 0000001B 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 130 <1> 130 <1> 130 <1> 130 <1> 130 <1> %if %0 >= 2 130 0000001D BB00050000 <1> mov ebx, %2 130 <1> %if %0 >= 3 130 <1> mov ecx, %3 130 <1> %if %0 = 4 130 <1> mov edx, %4 130 <1> %endif 130 <1> %endif 130 <1> %endif 130 00000022 B81F000000 <1> mov eax, %1 130 <1> 130 00000027 CD40 <1> int 40h 131 00000029 3D00000A00 cmp eax, 0A0000h 132 0000002E 0F85FC000000 jne ENDPROG 133 134 ; VYPOCET PALETY FARIEB 135 136 00000034 B100 mov cl, 0 ; do CL hodnota "256" (CH = ?, minus 1 byte) 137 PALETTE: 138 00000036 66BAC803 mov dx, 3C8h ; do DX port PEL ADDRESS registra 139 0000003A 88C8 mov al, cl 140 ;out dx, al ; odoslanie indexu farby 141 0000003C B401 mov ah, 1 142 0000003E CD34 int 34h 143 00000040 6642 inc dx ; do DX port PEL DATA registra 144 00000042 B000 mov al, 0 145 ;out dx, al ; odoslanie zlozky R 146 00000044 CD34 int 34h 147 00000046 88C8 mov al, cl 148 00000048 D0E8 shr al, 1 149 ;out dx, al ; odoslanie zlozky G 150 0000004A CD34 int 34h 151 0000004C 88C8 mov al, cl 152 0000004E 3C40 cmp al, 64 153 00000050 7202 jb short OKPAL 154 ;mov ax, 4A3Fh ; do AH cislo DOS sluzby na realokaciu pamate 155 00000052 B03F mov al, 3Fh 156 OKPAL: 157 ;out dx, al ; odoslanie zlozky B 158 ;mov ah, 1 159 00000054 CD34 int 34h 160 ;loop PALETTE ; opakujeme pre vsetky farby 161 00000056 FEC9 dec cl 162 00000058 75DC jnz short PALETTE 163 164 ; ALOKACIA PAMATE POTREBNEJ PRE DVE 256 x 256 PIXELOVE MAPY 165 166 ; ;mov ah, 4Ah 167 ; mov bh, 3*16 ; do BX aspon 3*16*256 paragrafov (BL = ?, -1B) 168 ; int 21h ; alokujeme 3 segmenty (program + 2 mapy) 169 ; jc near ENDPROG ; ak je malo pamate, ukoncime program 170 171 ; mov ax, cs 172 ; add ah, 16 173 ; mov ds, ax ; do DS segmentova adresa prvej mapy 174 ; add ah, 16 175 ; mov es, ax ; do ES segmentova adresa druhej mapy 176 177 0000005A BA[00000100] mov edx, DrawSegment ; * 178 0000005F BD[00000200] mov ebp, EffectSegment ; * 179 180 ; VYPIS BITMAPOVEHO TEXTU 181 182 WATER: 183 ;push ebp ; *** 184 00000064 52 push edx ; *** 185 186 ;push es ; ulozime ES (budeme potrebovat pointer na mapu) 187 ;mov ax, 1130h ; sluzba VGA BIOS - informacie o fonte 188 00000065 B830110000 mov eax, 1130h 189 ;mov bh, 3 ; budeme pouzivat font 8 x 8 pixelov 190 ;int 10h ; v ES:BP je adresa fontu 191 0000006A BB01000000 mov ebx, 1 ; VGA Font 8x8 192 ;xor ecx, ecx 193 0000006F BA[A1010000] mov edx, VgaFont8Buffer 194 00000074 CD31 int 31h 195 196 00000076 5A pop edx ; *** 197 ;pop ebp ; *** 198 199 00000077 BB[78010000] mov ebx, TEXT ; ideme "virit hladinu" textom 200 0000007C BE26400000 mov esi, 64*256+38 ; do SI umiestnenie textu v mape 201 00000081 E8BB000000 call DRAWTEX ; zavolame vypis znakoveho retazca 202 00000086 BE64640000 mov esi, 100*256+100 203 0000008B E8B1000000 call DRAWTEX ; a to celkovo 3 krat 204 00000090 BE24880000 mov esi, 136*256+36 205 00000095 E8A7000000 call DRAWTEX 206 207 ;pop es ; obnovime pointer na pixelovu mapu 208 209 ; "KVAPNUTIE" NA HLADINU 210 211 RANDOM: 212 0000009A 665E pop si ; nahodne cisla x[n] = (5 * x[n-1] + 7) % 65536 213 0000009C 668D74B607 lea si, [esi+4*esi+7]; takto pocita uvedeny vyraz loveC :) 214 000000A1 C60432FF mov byte [edx+esi], 255 ; umiestnime na nahodne miesto mapy kvapku 215 000000A5 6656 push si ; ulozime nahodne cislo do buducej iteracie 216 217 ; VYPOCET SIRENIA VLNENIA V MAPE (nemam miesto na odvodenie vztahov z fyziky) 218 219 WATLINE: 220 000000A7 8A443A01 mov al, [edx+edi+1] 221 000000AB 02443AFF add al, [edx+edi-1] ; spocitame okolite pixely 222 000000AF 02843A00010000 add al, [edx+edi+256] 223 000000B6 02843A00FFFFFF add al, [edx+edi-256] 224 000000BD D0E8 shr al, 1 ; vydelime sucet dvoma 225 000000BF 2A443D00 sub al, [ebp+edi] ; odcitame predchadzajucu fazu 226 000000C3 7302 jnc short OK ; pripadne orezeme zaporne vlny ... 227 000000C5 B000 mov al, 0 ; ... ziskame tak vacsiu amplitudu (0 - 255) 228 OK: 229 ;stosb ; ulozime pixel 230 000000C7 88443D00 mov [ebp+edi], al 231 000000CB 6647 inc di 232 000000CD 6609FF or di, di 233 000000D0 75D5 jnz short WATLINE ; opakujeme pre vsetky pixely v mape 234 235 ;push ds ; ulozime DS (neskor POPneme do ES) 236 000000D2 52 push edx ; *(*) 237 ;push es 238 ;pop ds ; do DS hodnota ES (vymena pointrov na mapy) 239 ;mov edx, ebp ; ** 240 ;push word 0A000h 241 ;pop es ; do ES segmentova adresa zaciatku videoram 242 243 ; CAKANIE NA NOVY SNIMOK 244 245 FRAME: 246 000000D3 66BADA03 mov dx, 3DAh ; do DX port INPUT STATUS registra (DH = 3, -1B) 247 000000D7 B400 mov ah, 0 248 ;in al, dx 249 000000D9 CD34 int 34h 250 000000DB 2408 and al, 8 251 000000DD 74F4 jz short FRAME ; pockame na novy snimok 252 253 ; VYKRESLENIE MAPY NA OBRAZOVKU 254 000000DF 89EA mov edx, ebp ; ** 255 256 000000E1 BF20000000 mov edi, 32 ; budeme vykreslovat od 32. stlpca (centrovanie) 257 000000E6 31F6 xor esi, esi ; do SI zaciatok vykreslovanej mapy 258 000000E8 BDC8000000 mov ebp, 200 ; kreslime 200 riadkov 259 DRAW: 260 000000ED B180 mov cl, 128 ; prenasame 256 bajtov, cize 128 slov (word) 261 ;rep movsw ; prenos slov z mapy do videoram (rychlejsie) 262 draw_loop: 263 000000EF 668B0432 mov ax, [edx+esi] 264 000000F3 66898700000A00 mov [edi+0A0000h], ax 265 000000FA 6683C602 add si, 2 266 000000FE 6683C702 add di, 2 267 00000102 E2EB loop draw_loop 268 00000104 0FB61C32 movzx ebx, byte [edx+esi] ; vyberieme hodnotu z mapy kvoli "osciloskopu" 269 00000108 08DB or bl, bl ; je vyska hladiny v mape nulova? ... 270 0000010A 7412 jz short NOOSCIL ; ... ak ano, nevykreslujeme pixel (estetika) 271 0000010C C6843B80FF090050 mov byte [ebx+edi+0A0000h-128], 80 ; inak vykreslime symetricky dva pixely 272 00000114 F7DB neg ebx ; s danou intenzitou 273 00000116 C6843B80FF090050 mov byte [ebx+edi+0A0000h-128], 80 274 NOOSCIL: 275 0000011E 6683C740 add di, 64 ; posunieme sa na dalsi riadok obrazovky 276 00000122 4D dec ebp 277 00000123 75C8 jnz short DRAW ; a opakujeme pre vsetky riadky 278 279 ;pop es ; dokoncenie vymeny ES <-> DS 280 00000125 5D pop ebp ; *(*) 281 282 ;push edx ; **** 283 ;;in al, 60h ; test klavesy ESC 284 ;mov dx, 60h 285 ;;mov ah, 0 286 ;int 34h 287 ;pop edx ; **** 288 ;dec al 289 ;jnz WATER ; ak nebola stlacena, skok na dalsi snimok 290 291 00000126 B401 mov ah, 1 292 00000128 CD32 int 32h 293 0000012A 0F8434FFFFFF jz WATER 294 295 ENDPROG: 296 00000130 66B80300 mov ax, 03h 297 ;mov al, 3 298 ;int 10h ; nastavenie textoveho rezimu 299 00000134 CD31 int 31h 300 301 00000136 665E pop si 302 00000138 665E pop si ; oprava zasobnika po nahodnych cislach 303 304 sys _exit ; navrat do operacneho systemu 304 <1> 304 <1> 304 <1> 304 <1> 304 <1> %if %0 >= 2 304 <1> mov ebx, %2 304 <1> %if %0 >= 3 304 <1> mov ecx, %3 304 <1> %if %0 = 4 304 <1> mov edx, %4 304 <1> %endif 304 <1> %endif 304 <1> %endif 304 0000013A B801000000 <1> mov eax, %1 304 <1> 304 0000013F CD40 <1> int 40h 305 306 ; RUTINA NA VYPIS TEXTOVEHO RETAZCA 307 308 DRAWTEX: 309 00000141 0FB63B movzx edi, byte [ebx] ; do DI ASCII hodnota znaku 310 00000144 43 inc ebx ; zvysime ukazovatel na text 311 00000145 66C1E703 shl di, 3 ; DI = DI * 8, mame offset znaku vo fonte 312 00000149 742C jz short RETURN ; ak bol znak nulovy, koniec vypisu 313 0000014B B108 mov cl, 8 ; budeme vypisovat 8 riadkov 314 CHARLIN: 315 0000014D 8A87[A1010000] mov al, [VgaFont8Buffer+edi] ; vyberieme bajt z predlohy znaku 316 00000153 47 inc edi ; zvysime ukazovatel na dalsi bajt predlohy 317 00000154 B508 mov ch, 8 ; znak ma 8 stlpcov 318 ROTATE: 319 00000156 D0E0 shl al, 1 ; do CARRY pixel z predlohy 320 00000158 7307 jnc short NOPIXEL ; ak pixel nebol nastaveny, nic nekreslime 321 0000015A 81043204030402 add dword [edx+esi], 02040304h ; inak pripocitame "stvorpixel" 322 NOPIXEL: 323 00000161 6683C604 add si, 4 ; posunieme sa na dalsi pixel v mape 324 00000165 FECD dec ch 325 00000167 75ED jnz short ROTATE ; opakujeme 8-krat 326 00000169 6681C6E003 add si, 1024-32 ; posunieme sa na dalsi riadok 327 0000016E E2DD loop CHARLIN ; opakujeme 8-krat (LOOP trik, CH = 0, setrime) 328 00000170 6681C620E0 add si, 32-8192 ; posunieme sa na dalsi znak 329 00000175 EBCA jmp short DRAWTEX ; skok na vypis dalsieho znaku 330 RETURN: 331 00000177 C3 retn 332 333 ;------------------------------------------------------------------------------ 334 ; DATA 335 ;------------------------------------------------------------------------------ 336 337 TEXT: 338 00000178 64722829707A00 db "dr()pz", 0 ; hadajte co :) 339 0000017F 627900 db "by",0 340 00000182 2D62617A653E00 db "-baze>", 0 341 342 ;------------------------------------------------------------------------------- 343 ; Initially, this intro was hacked up during sleepless night before party. 344 ; Few days after Demobit 98 we made this refined version. Although it is not 345 ; as carefully optimized as it can be [loveC was able to make it in less than 346 ; 230 bytes], I decided to spread this [almost original] code. It is easier 347 ; to understand and it actually shows our poor mental state at given time :) 348 ;------------------------------------------------------------------------------- 349 350 00000189 4572646F67616E2054- db "Erdogan Tan [01/11/2017]" 350 00000192 616E205B30312F3131- 350 0000019B 2F323031375D 351 352 ;------------------------------------------------------------------------------ 353 ; UNINITIALIZED DATA 354 ;------------------------------------------------------------------------------ 355 356 bss_start: 357 358 ABSOLUTE bss_start 359 360 VgaFont8Buffer: 361 000001A1 resb 8*256 362 363 000009A1 alignb 65536 364 365 DrawSegment: 366 00010000 resb 65536 367 368 EffectSegment: 369 00020000 resb 65536 370 371 EOF: