1 ; **************************************************************************** 2 ; dropz3.s (for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; DROPZ3.PRG ! VGA DEMO (and LCD monitor MODE 13h test) program by Erdogan TAN 5 ; 6 ; 30/10/2017 7 ; 8 ; [ Last Modification: 07/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 SQUARE_PIXELS equ 1 ; 07/12/2023 111 112 Start: 113 ; clear bss 114 00000000 B9[00100200] mov ecx, EOF 115 00000005 BF[E2010000] mov edi, bss_start 116 0000000A 29F9 sub ecx, edi 117 0000000C C1E902 shr ecx, 2 118 0000000F 31C0 xor eax, eax 119 00000011 F3AB rep stosd 120 121 00000013 56 push esi ; naplnime niecim zasobnik pre nahodne cisla 122 00000014 56 push esi 123 124 00000015 B013 mov al, 13h 125 ;int 10h ; inicializacia grafickeho modu 320x200x256 126 00000017 CD31 int 31h 127 128 ; DIRECT VGA MEMORY ACCESS 129 ; bl = 0, bh = 5 130 ; Direct access/map to VGA memory (0A0000h) 131 132 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 133 00000025 3D00000A00 cmp eax, 0A0000h 134 ;jne ENDPROG 135 0000002A 7405 je short _x 136 0000002C E942010000 jmp ENDPROG 137 _x: 138 ; 07/12/2023 139 ; MODE 13h 60 Hz (for LCD monitor) Test program by Erdogan TAN 140 141 ;; start of 70Hz to 60Hz conversion - 07/12/2023 142 143 00000031 31C0 xor eax, eax 144 145 00000033 BAD4030000 mov edx, 3D4h 146 147 00000038 BB11000000 mov ebx, 0011h ; Turn off write protect to CRTC registers 148 ;mov ax, bx 149 ;out dx, ax 150 0000003D B403 mov ah, 3 151 0000003F CD34 int 34h 152 153 ;mov dx, 3D4h 154 00000041 66BB060B mov bx, 0B06h ; New vertical total=525 lines, bits 0-7 155 ;mov ax, bx 156 ;out dx, ax 157 00000045 B403 mov ah, 3 158 00000047 CD34 int 34h 159 160 ;mov dx, 3D4h 161 00000049 66BB073E mov bx, 3E07h ; New vertical total=525 lines, bits 8-9 162 ;mov ax, bx 163 ;out dx, ax 164 0000004D B403 mov ah, 3 165 0000004F CD34 int 34h 166 167 %if SQUARE_PIXELS 168 ;mov dx, 3D4h 169 00000051 66BB10B9 mov bx, 0B910h ; Vsync start=scanline 185 170 ;mov ax, bx 171 ;out dx, ax 172 00000055 B403 mov ah, 3 173 00000057 CD34 int 34h 174 175 ;mov dx, 3D4h 176 00000059 66BB128F mov bx, 8F12h ; Vertical display end=scanline 399, bits 0-7 177 ;mov ax, bx 178 ;out dx, ax 179 0000005D B403 mov ah, 3 180 0000005F CD34 int 34h 181 182 ;mov dx, 3D4h 183 00000061 66BB15B8 mov bx, 0B815h ; vertical blanking start=scanline 440, bits 0-7 184 ;mov ax, bx 185 ;out dx, ax 186 00000065 B403 mov ah, 3 187 00000067 CD34 int 34h 188 189 ;mov dx, 3D4h 190 00000069 66BB16E2 mov bx, 0E216h ; Adjust vblank end position 191 ;mov ax, bx 192 ;out dx, ax 193 0000006D B403 mov ah, 3 194 0000006F CD34 int 34h 195 196 ;mov dx, 3D4h 197 00000071 66BB1185 mov bx, 8511h ; Vsync length=2 lines + turn write protect back on 198 ;mov ax, bx 199 ;out dx, ax 200 00000075 B403 mov ah, 3 201 00000077 CD34 int 34h 202 %else 203 ;mov dx, 3D4h 204 mov bx, 0B16h ; Adjust vblank end position=scanline 524 205 ;mov ax, bx 206 ;out dx, ax 207 mov ah, 3 208 int 34h 209 210 ;mov dx, 3D4h 211 mov bx, 0D710h ; Vsync start=scanline 215 212 ;mov ax, bx 213 ;out dx, ax 214 mov ah, 3 215 int 34h 216 217 ;mov dx, 3D4h 218 mov bx, 8911h ; Vsync length=2 lines + turn write protect back on 219 ;mov ax, bx 220 ;out dx, ax 221 mov ah, 3 222 int 34h 223 %endif 224 225 ;; end of 70Hz to 60Hz conversion - 07/12/2023 226 227 ; VYPOCET PALETY FARIEB 228 229 00000079 B100 mov cl, 0 ; do CL hodnota "256" (CH = ?, minus 1 byte) 230 PALETTE: 231 0000007B 66BAC803 mov dx, 3C8h ; do DX port PEL ADDRESS registra 232 0000007F 88C8 mov al, cl 233 ;out dx, al ; odoslanie indexu farby 234 00000081 B401 mov ah, 1 235 00000083 CD34 int 34h 236 00000085 42 inc edx ; do DX port PEL DATA registra 237 00000086 B000 mov al, 0 238 ;out dx, al ; odoslanie zlozky R 239 00000088 CD34 int 34h 240 0000008A 88C8 mov al, cl 241 0000008C D0E8 shr al, 1 242 ;out dx, al ; odoslanie zlozky G 243 0000008E CD34 int 34h 244 00000090 88C8 mov al, cl 245 00000092 3C40 cmp al, 64 246 00000094 7202 jb short OKPAL 247 ;mov ax, 4A3Fh ; do AH cislo DOS sluzby na realokaciu pamate 248 00000096 B03F mov al, 3Fh 249 OKPAL: 250 ;out dx, al ; odoslanie zlozky B 251 ;mov ah, 1 252 00000098 CD34 int 34h 253 ;loop PALETTE ; opakujeme pre vsetky farby 254 0000009A FEC9 dec cl 255 0000009C 75DD jnz short PALETTE 256 257 ; ALOKACIA PAMATE POTREBNEJ PRE DVE 256 x 256 PIXELOVE MAPY 258 259 ; ;mov ah, 4Ah 260 ; mov bh, 3*16 ; do BX aspon 3*16*256 paragrafov (BL = ?, -1B) 261 ; int 21h ; alokujeme 3 segmenty (program + 2 mapy) 262 ; jc near ENDPROG ; ak je malo pamate, ukoncime program 263 264 ; mov ax, cs 265 ; add ah, 16 266 ; mov ds, ax ; do DS segmentova adresa prvej mapy 267 ; add ah, 16 268 ; mov es, ax ; do ES segmentova adresa druhej mapy 269 270 0000009E BA[00100000] mov edx, DrawSegment ; * 271 000000A3 BD[00100100] mov ebp, EffectSegment ; * 272 273 ; VYPIS BITMAPOVEHO TEXTU 274 275 WATER: 276 ;push ebp ; *** 277 000000A8 52 push edx ; *** 278 279 ;push es ; ulozime ES (budeme potrebovat pointer na mapu) 280 ;mov ax, 1130h ; sluzba VGA BIOS - informacie o fonte 281 000000A9 B830110000 mov eax, 1130h 282 ;mov bh, 3 ; budeme pouzivat font 8 x 8 pixelov 283 ;int 10h ; v ES:BP je adresa fontu 284 000000AE BB01000000 mov ebx, 1 ; VGA Font 8x8 285 ;xor ecx, ecx 286 000000B3 BA[E2010000] mov edx, VgaFont8Buffer 287 000000B8 CD31 int 31h 288 289 000000BA 5A pop edx ; *** 290 ;pop ebp ; *** 291 292 000000BB BB[B8010000] mov ebx, TEXT ; ideme "virit hladinu" textom 293 000000C0 BE26400000 mov esi, 64*256+38 ; do SI umiestnenie textu v mape 294 000000C5 E8B8000000 call DRAWTEX ; zavolame vypis znakoveho retazca 295 000000CA BE64640000 mov esi, 100*256+100 296 000000CF E8AE000000 call DRAWTEX ; a to celkovo 3 krat 297 000000D4 BE24880000 mov esi, 136*256+36 298 000000D9 E8A4000000 call DRAWTEX 299 300 ;pop es ; obnovime pointer na pixelovu mapu 301 302 ; "KVAPNUTIE" NA HLADINU 303 304 RANDOM: 305 000000DE 5E pop esi ; nahodne cisla x[n] = (5 * x[n-1] + 7) % 65536 306 000000DF 668D74B607 lea si, [esi+4*esi+7]; takto pocita uvedeny vyraz loveC :) 307 000000E4 C60432FF mov byte [edx+esi], 255 ; umiestnime na nahodne miesto mapy kvapku 308 000000E8 56 push esi ; ulozime nahodne cislo do buducej iteracie 309 310 ; VYPOCET SIRENIA VLNENIA V MAPE (nemam miesto na odvodenie vztahov z fyziky) 311 312 WATLINE: 313 000000E9 8A443A01 mov al, [edx+edi+1] 314 000000ED 02443AFF add al, [edx+edi-1] ; spocitame okolite pixely 315 000000F1 02843A00010000 add al, [edx+edi+256] 316 000000F8 02843A00FFFFFF add al, [edx+edi-256] 317 000000FF D0E8 shr al, 1 ; vydelime sucet dvoma 318 00000101 2A443D00 sub al, [ebp+edi] ; odcitame predchadzajucu fazu 319 00000105 7302 jnc short OK ; pripadne orezeme zaporne vlny ... 320 00000107 B000 mov al, 0 ; ... ziskame tak vacsiu amplitudu (0 - 255) 321 OK: 322 ;stosb ; ulozime pixel 323 00000109 88443D00 mov [ebp+edi], al 324 0000010D 6647 inc di 325 0000010F 6609FF or di, di 326 00000112 75D5 jnz short WATLINE ; opakujeme pre vsetky pixely v mape 327 328 ;push ds ; ulozime DS (neskor POPneme do ES) 329 00000114 52 push edx ; *(*) 330 ;push es 331 ;pop ds ; do DS hodnota ES (vymena pointrov na mapy) 332 ;mov edx, ebp ; ** 333 ;push word 0A000h 334 ;pop es ; do ES segmentova adresa zaciatku videoram 335 336 ; CAKANIE NA NOVY SNIMOK 337 338 FRAME: 339 00000115 66BADA03 mov dx, 3DAh ; do DX port INPUT STATUS registra (DH = 3, -1B) 340 00000119 B400 mov ah, 0 341 ;in al, dx 342 0000011B CD34 int 34h 343 0000011D 2408 and al, 8 344 0000011F 74F4 jz short FRAME ; pockame na novy snimok 345 346 ; VYKRESLENIE MAPY NA OBRAZOVKU 347 00000121 89EA mov edx, ebp ; ** 348 349 00000123 BF20000000 mov edi, 32 ; budeme vykreslovat od 32. stlpca (centrovanie) 350 00000128 31F6 xor esi, esi ; do SI zaciatok vykreslovanej mapy 351 0000012A BDC8000000 mov ebp, 200 ; kreslime 200 riadkov 352 DRAW: 353 0000012F B180 mov cl, 128 ; prenasame 256 bajtov, cize 128 slov (word) 354 ;rep movsw ; prenos slov z mapy do videoram (rychlejsie) 355 draw_loop: 356 00000131 668B0432 mov ax, [edx+esi] 357 00000135 66898700000A00 mov [edi+0A0000h], ax 358 0000013C 6683C602 add si, 2 359 00000140 6683C702 add di, 2 360 00000144 E2EB loop draw_loop 361 00000146 0FB61C32 movzx ebx, byte [edx+esi] ; vyberieme hodnotu z mapy kvoli "osciloskopu" 362 0000014A 08DB or bl, bl ; je vyska hladiny v mape nulova? ... 363 0000014C 7412 jz short NOOSCIL ; ... ak ano, nevykreslujeme pixel (estetika) 364 0000014E C6843B80FF090050 mov byte [ebx+edi+0A0000h-128], 80 ; inak vykreslime symetricky dva pixely 365 00000156 F7DB neg ebx ; s danou intenzitou 366 00000158 C6843B80FF090050 mov byte [ebx+edi+0A0000h-128], 80 367 NOOSCIL: 368 00000160 6683C740 add di, 64 ; posunieme sa na dalsi riadok obrazovky 369 00000164 4D dec ebp 370 00000165 75C8 jnz short DRAW ; a opakujeme pre vsetky riadky 371 372 ;pop es ; dokoncenie vymeny ES <-> DS 373 00000167 5D pop ebp ; *(*) 374 375 ;push edx ; **** 376 ;;in al, 60h ; test klavesy ESC 377 ;mov dx, 60h 378 ;;mov ah, 0 379 ;int 34h 380 ;pop edx ; **** 381 ;dec al 382 ;jnz WATER ; ak nebola stlacena, skok na dalsi snimok 383 384 00000168 B401 mov ah, 1 385 0000016A CD32 int 32h 386 ;jz WATER 387 0000016C 7505 jnz short ENDPROG 388 0000016E E935FFFFFF jmp WATER 389 390 ENDPROG: 391 00000173 66B80300 mov ax, 03h 392 ;mov al, 3 393 ;int 10h ; nastavenie textoveho rezimu 394 00000177 CD31 int 31h 395 396 00000179 5E pop esi 397 0000017A 5E pop esi ; oprava zasobnika po nahodnych cislach 398 399 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 0000017B B801000000 <1> mov eax, %1 96 <1> 97 00000180 CD40 <1> int 40h 400 401 ; RUTINA NA VYPIS TEXTOVEHO RETAZCA 402 403 DRAWTEX: 404 00000182 0FB63B movzx edi, byte [ebx] ; do DI ASCII hodnota znaku 405 00000185 43 inc ebx ; zvysime ukazovatel na text 406 00000186 C1E703 shl edi, 3 ; DI = DI * 8, mame offset znaku vo fonte 407 00000189 742C jz short RETURN ; ak bol znak nulovy, koniec vypisu 408 0000018B B108 mov cl, 8 ; budeme vypisovat 8 riadkov 409 CHARLIN: 410 0000018D 8A87[E2010000] mov al, [VgaFont8Buffer+edi] ; vyberieme bajt z predlohy znaku 411 00000193 47 inc edi ; zvysime ukazovatel na dalsi bajt predlohy 412 00000194 B508 mov ch, 8 ; znak ma 8 stlpcov 413 ROTATE: 414 00000196 D0E0 shl al, 1 ; do CARRY pixel z predlohy 415 00000198 7307 jnc short NOPIXEL ; ak pixel nebol nastaveny, nic nekreslime 416 0000019A 81043204030402 add dword [edx+esi], 02040304h ; inak pripocitame "stvorpixel" 417 NOPIXEL: 418 000001A1 6683C604 add si, 4 ; posunieme sa na dalsi pixel v mape 419 000001A5 FECD dec ch 420 000001A7 75ED jnz short ROTATE ; opakujeme 8-krat 421 000001A9 6681C6E003 add si, 1024-32 ; posunieme sa na dalsi riadok 422 000001AE E2DD loop CHARLIN ; opakujeme 8-krat (LOOP trik, CH = 0, setrime) 423 000001B0 6681C620E0 add si, 32-8192 ; posunieme sa na dalsi znak 424 000001B5 EBCB jmp short DRAWTEX ; skok na vypis dalsieho znaku 425 RETURN: 426 000001B7 C3 retn 427 428 ;------------------------------------------------------------------------------ 429 ; DATA 430 ;------------------------------------------------------------------------------ 431 432 TEXT: 433 000001B8 64722829707A00 db "dr()pz", 0 ; hadajte co :) 434 000001BF 627900 db "by",0 435 000001C2 2D62617A653E00 db "-baze>", 0 436 437 ;------------------------------------------------------------------------------- 438 ; Initially, this intro was hacked up during sleepless night before party. 439 ; Few days after Demobit 98 we made this refined version. Although it is not 440 ; as carefully optimized as it can be [loveC was able to make it in less than 441 ; 230 bytes], I decided to spread this [almost original] code. It is easier 442 ; to understand and it actually shows our poor mental state at given time :) 443 ;------------------------------------------------------------------------------- 444 445 ;db "Erdogan Tan [01/11/2017]" 446 000001C9 4572646F67616E2054- db "Erdogan Tan [05/12/2023]", 0 446 000001D2 616E205B30352F3132- 446 000001DB 2F323032335D00 447 448 ;------------------------------------------------------------------------------ 449 ; UNINITIALIZED DATA 450 ;------------------------------------------------------------------------------ 451 452 bss_start: 453 454 ABSOLUTE bss_start 455 456 alignb 2 457 458 VgaFont8Buffer: 459 000001E2 resb 8*256 460 461 ;alignb 65536 462 000009E2 alignb 4096 463 464 DrawSegment: 465 00001000 resb 65536 466 467 EffectSegment: 468 00011000 resb 65536 469 470 EOF: