1 ; **************************************************************************** 2 ; line5.s - TRDOS 386 (TRDOS v2.0.3) Test Program - 'sysvideo' pixel w/r tests 3 ; ---------------------------------------------------------------------------- 4 ; 5 ; 12/02/2021 (11/02/2021) 6 ; 7 ; **************************************************************************** 8 ; nasm line5.s -l line5.txt -o LINE5.PRG -Z error.txt 9 ; (modified from 'line4.s', 11/02/2021) 10 11 ; Draw lines by using 'sysvideo' bh=020Eh (VESA VBE mode version) 12 13 ; 14/07/2020 14 ; 31/12/2017 15 ; TRDOS 386 (v2.0) system calls 16 _ver equ 0 17 _exit equ 1 18 _fork equ 2 19 _read equ 3 20 _write equ 4 21 _open equ 5 22 _close equ 6 23 _wait equ 7 24 _create equ 8 25 _rename equ 9 26 _delete equ 10 27 _exec equ 11 28 _chdir equ 12 29 _time equ 13 30 _mkdir equ 14 31 _chmod equ 15 32 _rmdir equ 16 33 _break equ 17 34 _drive equ 18 35 _seek equ 19 36 _tell equ 20 37 _memory equ 21 38 _prompt equ 22 39 _path equ 23 40 _env equ 24 41 _stime equ 25 42 _quit equ 26 43 _intr equ 27 44 _dir equ 28 45 _emt equ 29 46 _ldrvt equ 30 47 _video equ 31 48 _audio equ 32 49 _timer equ 33 50 _sleep equ 34 51 _msg equ 35 52 _geterr equ 36 53 _fpstat equ 37 54 _pri equ 38 55 _rele equ 39 56 _fff equ 40 57 _fnf equ 41 58 _alloc equ 42 59 _dalloc equ 43 60 _calbac equ 44 61 _dma equ 45 62 63 %macro sys 1-4 64 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 65 ; 03/09/2015 66 ; 13/04/2015 67 ; Retro UNIX 386 v1 system call. 68 %if %0 >= 2 69 mov ebx, %2 70 %if %0 >= 3 71 mov ecx, %3 72 %if %0 = 4 73 mov edx, %4 74 %endif 75 %endif 76 %endif 77 mov eax, %1 78 ;int 30h 79 int 40h ; TRDOS 386 (TRDOS v2.0) 80 %endmacro 81 82 ; Retro UNIX 386 v1 system call format: 83 ; sys systemcall (eax) , , 84 85 [BITS 32] ; We need 32-bit intructions for protected mode 86 87 [ORG 0] 88 89 START_CODE: 90 ; clear bss 91 00000000 BF[A4050000] mov edi, bss_start 92 00000005 B97A000000 mov ecx, (bss_end - bss_start)/4 93 ;xor eax, eax 94 0000000A F3AB rep stosd 95 96 ; program message 97 0000000C BE[01030000] mov esi, program_msg 98 00000011 E85E010000 call print_msg 99 100 00000016 30E4 xor ah, ah 101 ;int 16h ; KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY 102 ; Return: AH = scan code, AL = character 103 00000018 CD32 int 32h ; TRDOS 386 Keyboard interrupt 104 105 ; Set Video Mode to 101h ; 640x480, 256 colors 106 sys _video, 08FFh, 101h 106 <1> 106 <1> 106 <1> 106 <1> 106 <1> %if %0 >= 2 106 0000001A BBFF080000 <1> mov ebx, %2 106 <1> %if %0 >= 3 106 0000001F B901010000 <1> mov ecx, %3 106 <1> %if %0 = 4 106 <1> mov edx, %4 106 <1> %endif 106 <1> %endif 106 <1> %endif 106 00000024 B81F000000 <1> mov eax, %1 106 <1> 106 00000029 CD40 <1> int 40h 107 0000002B 09C0 or eax, eax 108 ;jz short terminate 109 ;mov [LFB_ADDR], edx 110 0000002D 750E jnz short set_vesa_mode_101h_ok 111 112 terminate: 113 0000002F E83C020000 call set_text_mode 114 sys _exit 114 <1> 114 <1> 114 <1> 114 <1> 114 <1> %if %0 >= 2 114 <1> mov ebx, %2 114 <1> %if %0 >= 3 114 <1> mov ecx, %3 114 <1> %if %0 = 4 114 <1> mov edx, %4 114 <1> %endif 114 <1> %endif 114 <1> %endif 114 00000034 B801000000 <1> mov eax, %1 114 <1> 114 00000039 CD40 <1> int 40h 115 halt: 116 0000003B EBFE jmp short halt 117 118 set_vesa_mode_101h_ok: 119 0000003D B3A2 mov bl, 162 ; color 120 0000003F 881D[A4050000] mov [color], bl 121 122 ; initializing position difference parameters 123 ;mov al, [maxdx] 124 ;shr al, 1 125 ;mov [posdx], al 126 ;mov al, [maxdy] 127 ;shr al, 1 128 ;mov [posdy], al 129 130 next_phase: 131 00000045 E83B010000 call drawrect 132 waitforkey: 133 0000004A B401 mov ah, 1 134 0000004C CD32 int 32h 135 0000004E 740C jz short getkey 136 00000050 66FF05[AA050000] inc word [counter] 137 00000057 90 nop 138 00000058 90 nop 139 00000059 90 nop 140 0000005A EBEE jmp short waitforkey 141 getkey: 142 0000005C 30E4 xor ah, ah 143 0000005E CD32 int 32h 144 145 00000060 663D032E cmp ax, 2E03h 146 00000064 74C9 je short terminate 147 00000066 3C1B cmp al, 1Bh ; ESC key 148 00000068 74C5 je short terminate 149 150 0000006A 3C2B cmp al, '+' 151 0000006C 7517 jne short _0 152 153 0000006E FE05[A4050000] inc byte [color] 154 00000074 803D[A4050000]FF cmp byte [color], 255 155 0000007B 76C8 jna short next_phase 156 0000007D FE0D[A4050000] dec byte [color] 157 00000083 EBC5 jmp short waitforkey 158 _0: 159 00000085 3C2D cmp al, '-' 160 00000087 7510 jne short _1 161 162 00000089 FE0D[A4050000] dec byte [color] 163 0000008F 79B4 jns short next_phase 164 00000091 FE05[A4050000] inc byte [color] 165 00000097 EBB1 jmp short waitforkey 166 _1: 167 00000099 3C20 cmp al, 20h ; space 168 0000009B 750E jne short _3 169 0000009D 8005[A4050000]08 add byte [color], 8 170 000000A4 E8DC000000 call drawrect 171 _2: 172 000000A9 EB9F jmp short waitforkey 173 _3: 174 000000AB 80FC4B cmp ah, 4Bh 175 000000AE 7509 jne short _4 176 ; left arrow 177 000000B0 C605[A9050000]01 mov byte [direction], 1 178 000000B7 EB8C jmp next_phase 179 _4: 180 000000B9 80FC4D cmp ah, 4Dh 181 000000BC 750C jne short _5 182 ; right arrow 183 000000BE C605[A9050000]02 mov byte [direction], 2 184 000000C5 E97BFFFFFF jmp next_phase 185 _5: 186 000000CA 80FC50 cmp ah, 50h 187 000000CD 750C jne short _6 188 ; down arrow 189 000000CF C605[A9050000]03 mov byte [direction], 3 190 000000D6 E96AFFFFFF jmp next_phase 191 _6: 192 000000DB 80FC48 cmp ah, 48h 193 000000DE 750C jne short _7 194 ; up arrow 195 000000E0 C605[A9050000]04 mov byte [direction], 4 196 000000E7 E959FFFFFF jmp next_phase 197 _7: 198 000000EC 80FC47 cmp ah, 47h ; Home key 199 000000EF 750C jne short _9 200 _8: 201 000000F1 C605[A8050000]00 mov byte [phase], 0 202 000000F8 E948FFFFFF jmp next_phase 203 _9: 204 000000FD 80FC4F cmp ah, 4Fh ; End key 205 00000100 7509 jne short _10 206 00000102 C605[A4050000]A2 mov byte [color], 162 207 00000109 EBE6 jmp short _8 208 _10: 209 0000010B 663D0D1C cmp ax, 1C0Dh 210 0000010F 7520 jne short _12 211 212 00000111 FE05[A8050000] inc byte [phase] 213 00000117 803D[A8050000]05 cmp byte [phase], 5 214 0000011E 7705 ja short _11 215 00000120 E920FFFFFF jmp next_phase 216 _11: 217 00000125 C605[A8050000]00 mov byte [phase], 0 218 0000012C E914FFFFFF jmp next_phase 219 _12: 220 00000131 80FC49 cmp ah, 49h ; Page UP 221 00000134 751A jne short _14 222 00000136 FE0D[A8050000] dec byte [phase] 223 0000013C 790D jns short _13 224 0000013E E81B010000 call beep 225 00000143 FE05[A8050000] inc byte [phase] 226 00000149 EB24 jmp short _15 227 _13: 228 0000014B E9F5FEFFFF jmp next_phase 229 _14: 230 00000150 80FC51 cmp ah, 51h ; Page Down 231 00000153 751A jne short _15 232 00000155 FE05[A8050000] inc byte [phase] 233 0000015B 803D[A8050000]05 cmp byte [phase], 5 234 00000162 76E7 jna short _13 235 00000164 E8F5000000 call beep 236 00000169 FE0D[A8050000] dec byte [phase] 237 _15: 238 0000016F E9D6FEFFFF jmp waitforkey 239 240 print_msg: 241 00000174 B40E mov ah, 0Eh 242 00000176 BB07000000 mov ebx, 7 243 ;mov bl, 7 ; char attribute & color 244 p_next_chr: 245 0000017B AC lodsb 246 0000017C 08C0 or al, al 247 0000017E 7404 jz short p_retn ; retn 248 00000180 CD31 int 31h 249 00000182 EBF7 jmp short p_next_chr 250 p_retn: 251 00000184 C3 retn 252 253 drawrect: 254 ; draw rectangles 255 00000185 803D[A8050000]03 cmp byte [phase], 3 256 0000018C 7321 jnb short dr_x 257 0000018E 30C0 xor al, al 258 00000190 3805[A9050000] cmp byte [direction], al ; 0 259 00000196 7617 jna short dr_x 260 00000198 8605[A4050000] xchg al, [color] 261 0000019E 50 push eax 262 0000019F E80B000000 call dr_x 263 000001A4 58 pop eax 264 000001A5 A2[A4050000] mov [color], al 265 000001AA E8C8000000 call change_positions 266 dr_x: 267 000001AF 803D[A8050000]00 cmp byte [phase], 0 268 000001B6 772F ja short dr_2 269 ; position 1 rectangles 270 000001B8 BE[BC030000] mov esi, positions1 271 000001BD BF[AC050000] mov edi, rectbuffer1 272 dr_0: 273 000001C2 B914000000 mov ecx, 20 ; 20 lines, 5 rectangles 274 000001C7 57 push edi 275 dr_1: 276 000001C8 AD lodsd 277 000001C9 AB stosd ; position 278 000001CA AD lodsd ; 279 000001CB AB stosd ; length (and type, h/v) 280 000001CC E2FA loop dr_1 281 000001CE 5E pop esi 282 283 ; BL bit 5 = 1 -> write lines via user buffer 284 sys _video, 022Eh, [color], 20 284 <1> 284 <1> 284 <1> 284 <1> 284 <1> %if %0 >= 2 284 000001CF BB2E020000 <1> mov ebx, %2 284 <1> %if %0 >= 3 284 000001D4 8B0D[A4050000] <1> mov ecx, %3 284 <1> %if %0 = 4 284 000001DA BA14000000 <1> mov edx, %4 284 <1> %endif 284 <1> %endif 284 <1> %endif 284 000001DF B81F000000 <1> mov eax, %1 284 <1> 284 000001E4 CD40 <1> int 40h 285 000001E6 C3 retn 286 dr_2: 287 000001E7 803D[A8050000]01 cmp byte [phase], 1 288 000001EE 770C ja short dr_3 289 ; position 2 rectangles 290 000001F0 BE[5C040000] mov esi, positions2 291 000001F5 BF[4C060000] mov edi, rectbuffer2 292 000001FA EBC6 jmp short dr_0 293 dr_3: 294 000001FC 803D[A8050000]02 cmp byte [phase], 2 295 00000203 770C ja short dr_4 296 ; position 3 rectangles 297 00000205 BE[FC040000] mov esi, positions3 298 0000020A BF[EC060000] mov edi, rectbuffer3 299 0000020F EBB1 jmp short dr_0 300 dr_4: 301 00000211 803D[A8050000]03 cmp byte [phase], 3 302 00000218 771C ja short dr_6 303 ; delete position 1 rectangles 304 0000021A BE[AC050000] mov esi, rectbuffer1 305 dr_5: 306 ; clear previous positions (by using black color) 307 ; BL bit 5 = 1 -> write lines via user buffer 308 sys _video, 022Eh, 0, 20 308 <1> 308 <1> 308 <1> 308 <1> 308 <1> %if %0 >= 2 308 0000021F BB2E020000 <1> mov ebx, %2 308 <1> %if %0 >= 3 308 00000224 B900000000 <1> mov ecx, %3 308 <1> %if %0 = 4 308 00000229 BA14000000 <1> mov edx, %4 308 <1> %endif 308 <1> %endif 308 <1> %endif 308 0000022E B81F000000 <1> mov eax, %1 308 <1> 308 00000233 CD40 <1> int 40h 309 00000235 C3 retn 310 dr_6: 311 00000236 803D[A8050000]04 cmp byte [phase], 4 312 0000023D 7707 ja short dr_7 313 ; delete position 2 rectangles 314 0000023F BE[4C060000] mov esi, rectbuffer2 315 00000244 EBD9 jmp short dr_5 316 dr_7: 317 00000246 803D[A8050000]05 cmp byte [phase], 5 318 0000024D 7707 ja short dr_8 319 ; delete position 2 rectangles 320 0000024F BE[EC060000] mov esi, rectbuffer3 321 00000254 EBC9 jmp short dr_5 322 dr_8: 323 00000256 C605[A8050000]00 mov byte [phase], 0 324 0000025D C3 retn 325 326 beep: 327 ; call beep function (16/64 second, 886Hz) 328 sys _audio, 16, 1331 328 <1> 328 <1> 328 <1> 328 <1> 328 <1> %if %0 >= 2 328 0000025E BB10000000 <1> mov ebx, %2 328 <1> %if %0 >= 3 328 00000263 B933050000 <1> mov ecx, %3 328 <1> %if %0 = 4 328 <1> mov edx, %4 328 <1> %endif 328 <1> %endif 328 <1> %endif 328 00000268 B820000000 <1> mov eax, %1 328 <1> 328 0000026D CD40 <1> int 40h 329 0000026F C3 retn 330 331 set_text_mode: 332 00000270 30E4 xor ah, ah 333 00000272 B003 mov al, 3 334 ;int 10h ; al = 03h text mode, int 10 video 335 00000274 CD31 int 31h ; TRDOS 386 - Video interrupt 336 00000276 C3 retn 337 338 change_positions: 339 00000277 B93C000000 mov ecx, 60 ; 60 lines, 15 rectangles 340 0000027C 803D[A9050000]02 cmp byte [direction], 2 341 00000283 7749 ja short chgpos3 ; scroll down/up 342 00000285 8A25[9C050000] mov ah, [maxdx] 343 0000028B A0[A0050000] mov al, [posdx] 344 00000290 BE[BC030000] mov esi, positions1 ; start address 345 00000295 7422 je short chgpos1 ; slide to right 346 ; slide to left 347 00000297 20C0 and al, al 348 00000299 7611 jna short chgpos_beep 349 0000029B FEC8 dec al 350 0000029D A2[A0050000] mov [posdx], al 351 ; (horizontal positions) -L- 352 chgpos0: 353 000002A2 66FF0E dec word [esi] 354 000002A5 83C608 add esi, 8 355 000002A8 E2F8 loop chgpos0 356 000002AA EB05 jmp short chgpos_retn 357 chgpos_beep: 358 000002AC E8ADFFFFFF call beep 359 chgpos_retn: 360 000002B1 C605[A9050000]00 mov byte [direction], 0 361 000002B8 C3 retn 362 chgpos1: 363 000002B9 38E0 cmp al, ah ; right (dx) limit ? 364 000002BB 73EF jnb short chgpos_beep 365 000002BD FEC0 inc al 366 000002BF A2[A0050000] mov [posdx], al 367 ; (horizontal positions) -R- 368 chgpos2: 369 000002C4 66FF06 inc word [esi] 370 000002C7 83C608 add esi, 8 371 000002CA E2F8 loop chgpos2 372 000002CC EBE3 jmp short chgpos_retn 373 chgpos3: 374 000002CE 8A25[9E050000] mov ah, [maxdy] 375 000002D4 A0[A2050000] mov al, [posdy] 376 000002D9 BE[BE030000] mov esi, positions1+2 ; start address 377 000002DE 803D[A9050000]03 cmp byte [direction], 3 378 000002E5 770D ja short chgpos4 ; scroll up 379 ; scroll down 380 000002E7 38E0 cmp al, ah ; down (dy) limit ? 381 000002E9 73C1 jnb short chgpos_beep 382 000002EB FEC0 inc al 383 000002ED A2[A2050000] mov [posdy], al 384 ; (vertical positions) -D- 385 000002F2 EBD0 jmp short chgpos2 386 chgpos4: 387 ; scroll up 388 000002F4 08C0 or al, al 389 000002F6 76B4 jna short chgpos_beep 390 000002F8 FEC8 dec al 391 000002FA A2[A2050000] mov [posdy], al 392 ; (vertical positions) -U- 393 000002FF EBA1 jmp short chgpos0 394 395 program_msg: 396 00000301 5452444F5320333836- db "TRDOS 386 v2.0.3 - ('sysvideo') Test Program - Draw Lines" 396 0000030A 2076322E302E33202D- 396 00000313 202827737973766964- 396 0000031C 656F27292054657374- 396 00000325 2050726F6772616D20- 396 0000032E 2D2044726177204C69- 396 00000337 6E6573 397 0000033A 0D0A db 0Dh, 0Ah 398 0000033C 6279204572646F6761- db "by Erdogan Tan - 12/02/2021" 398 00000345 6E2054616E202D2031- 398 0000034E 322F30322F32303231 399 ;db 0Dh, 0Ah, 0 400 00000357 0D0A0D0A db 0Dh, 0Ah, 0Dh, 0Ah 401 0000035B 507265737320454E54- db "Press ENTER to draw SQUAREs .." 401 00000364 455220746F20647261- 401 0000036D 772053515541524573- 401 00000376 202E2E 402 00000379 0D0A db 0Dh, 0Ah 403 0000037B 507265737320535041- db "Press SPACE to change COLOR .." 403 00000384 434520746F20636861- 403 0000038D 6E676520434F4C4F52- 403 00000396 202E2E 404 00000399 0D0A db 0Dh, 0Ah 405 0000039B 0D0A db 0Dh, 0Ah 406 0000039D 507265737320616E79- db "Press any key to continue .." 406 000003A6 206B657920746F2063- 406 000003AF 6F6E74696E7565202E- 406 000003B8 2E 407 nextline: 408 000003B9 0D0A00 db 0Dh, 0Ah, 0 409 410 positions1: 411 ; rectangle 1 412 000003BC 30003C0024000000 dw 48,60,36,0 413 000003C4 53003C0024100000 dw 83,60,4096+36,0 414 000003CC 30005F0024000000 dw 48,95,36,0 415 000003D4 30003C0024100000 dw 48,60,4096+36,0 416 ; rectangle 2 417 000003DC 280178009C000000 dw 296,120,156,0 418 000003E4 C301780078100000 dw 451,120,4096+120,0 419 000003EC 2801EF009C000000 dw 296,239,156,0 420 000003F4 2801780078100000 dw 296,120,4096+120,0 421 ; rectangle 3 422 000003FC E801600018000000 dw 488,96,24,0 423 00000404 FF01600018100000 dw 511,96,4096+24,0 424 0000040C E801770018000000 dw 488,119,24,0 425 00000414 E801600018100000 dw 488,96,4096+24,0 426 ; rectangle 4 427 0000041C D80050016C000000 dw 216,336,108,0 428 00000424 430150010C100000 dw 323,336,4096+12,0 429 0000042C D8005B016C000000 dw 216,347,108,0 430 00000434 D80050010C100000 dw 216,336,4096+12,0 431 ; rectangle 5 432 0000043C 180246010C000000 dw 536,326,12,0 433 00000444 230246013C100000 dw 547,326,4096+60,0 434 0000044C 180281010C000000 dw 536,385,12,0 435 00000454 180246013C100000 dw 536,326,4096+60,0 436 positions2: 437 ; rectangle 6 438 0000045C EC00CC0018000000 dw 236,204,24,0 ; line 1, x1, y1, h 439 00000464 0301CC0054100000 dw 259,204,4096+84,0 ; line 2, x2, y1, v 440 0000046C EC001F0118000000 dw 236,287,24,0 ; line 3, x1, y2, h 441 00000474 EC00CC0054100000 dw 236,204,4096+84,0 ; line 4, x1, y1, v 442 ; rectangle 7 443 0000047C 54002C0160000000 dw 84,300,96,0 444 00000484 B3002C0154100000 dw 179,300,4096+84,0 445 0000048C 54007F0160000000 dw 84,383,96,0 446 00000494 54002C0154100000 dw 84,300,4096+84,0 447 ; rectangle 8 448 0000049C F801220118000000 dw 504,290,24,0 449 000004A4 0F02220118100000 dw 527,290,4096+24,0 450 000004AC F801390118000000 dw 504,313,24,0 451 000004B4 F801220118100000 dw 504,290,4096+24,0 452 ; rectangle 9 453 000004BC 2801480048000000 dw 296,72,72,0 454 000004C4 6F01480018100000 dw 367,72,4096+24,0 455 000004CC 28015F0048000000 dw 296,95,72,0 456 000004D4 2801480018100000 dw 296,72,4096+24,0 457 ; rectangle 10 458 000004DC 5C01140130000000 dw 348,276,48,0 459 000004E4 8B01140124100000 dw 395,276,4096+36,0 460 000004EC 5C01370130000000 dw 348,311,48,0 461 000004F4 5C01140124100000 dw 348,276,4096+36,0 462 positions3: 463 ; rectangle 11 464 000004FC D001480018000000 dw 464,72,24,0 465 00000504 E701480018100000 dw 487,72,4096+24,0 466 0000050C D0015F0018000000 dw 464,95,24,0 467 00000514 D001480018100000 dw 464,72,4096+24,0 468 ; rectangle 12 469 0000051C 84006C0048000000 dw 132,108,72,0 470 00000524 CB006C0048100000 dw 203,108,4096+72,0 471 0000052C 8400B30048000000 dw 132,179,72,0 472 00000534 84006C0048100000 dw 132,108,4096+72,0 473 ; rectangle 13 474 0000053C 0002780030000000 dw 512,120,48,0 475 00000544 2F02780024100000 dw 559,120,4096+36,0 476 0000054C 00029B0030000000 dw 512,155,48,0 477 00000554 0002780024100000 dw 512,120,4096+36,0 478 ; rectangle 14 479 0000055C 980108010C000000 dw 408,264,12,0 480 00000564 A301080118100000 dw 419,264,4096+24,0 481 0000056C 98011F010C000000 dw 408,287,12,0 482 00000574 9801080118100000 dw 408,264,4096+24,0 483 ; rectangle 15 484 0000057C A401460148000000 dw 420,326,72,0 485 00000584 EB0146013C100000 dw 491,326,4096+60,0 486 0000058C A401810148000000 dw 420,385,72,0 487 00000594 A40146013C100000 dw 420,326,4096+60,0 488 489 0000059C 6000 maxdx: dw 96 490 0000059E 6000 maxdy: dw 96 491 000005A0 3000 posdx: dw 48 492 000005A2 3000 posdy: dw 48 493 494 bss: 495 496 ABSOLUTE bss 497 498 alignb 4 499 500 bss_start: 501 000005A4 color: resd 1 502 000005A8 phase: resb 1 503 000005A9 direction: resb 1 504 000005AA counter: resw 1 505 ;posdx: resw 1 506 ;posdy: resw 1 507 508 rectbuffer1: 509 000005AC resd 40 510 rectbuffer2: 511 0000064C resd 40 512 rectbuffer3: 513 000006EC resd 40 514 515 bss_end: