1 ; **************************************************************************** 2 ; blocks1.s - TRDOS 386 (TRDOS v2.0.3) Test Program - 'sysvideo' pixel tests 3 ; ---------------------------------------------------------------------------- 4 ; 5 ; 21/02/2021 6 ; 7 ; **************************************************************************** 8 ; nasm blocks1.s -l blocks.txt -o BLOCKS1.PRG -Z error.txt 9 10 ; 'sysvideo' bh = 2, block copy and modification test (VESA VBE mode 101h) 11 12 ; 14/07/2020 13 ; 31/12/2017 14 ; TRDOS 386 (v2.0) system calls 15 _ver equ 0 16 _exit equ 1 17 _fork equ 2 18 _read equ 3 19 _write equ 4 20 _open equ 5 21 _close equ 6 22 _wait equ 7 23 _create equ 8 24 _rename equ 9 25 _delete equ 10 26 _exec equ 11 27 _chdir equ 12 28 _time equ 13 29 _mkdir equ 14 30 _chmod equ 15 31 _rmdir equ 16 32 _break equ 17 33 _drive equ 18 34 _seek equ 19 35 _tell equ 20 36 _memory equ 21 37 _prompt equ 22 38 _path equ 23 39 _env equ 24 40 _stime equ 25 41 _quit equ 26 42 _intr equ 27 43 _dir equ 28 44 _emt equ 29 45 _ldrvt equ 30 46 _video equ 31 47 _audio equ 32 48 _timer equ 33 49 _sleep equ 34 50 _msg equ 35 51 _geterr equ 36 52 _fpstat equ 37 53 _pri equ 38 54 _rele equ 39 55 _fff equ 40 56 _fnf equ 41 57 _alloc equ 42 58 _dalloc equ 43 59 _calbac equ 44 60 _dma equ 45 61 62 %macro sys 1-4 63 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 64 ; 03/09/2015 65 ; 13/04/2015 66 ; Retro UNIX 386 v1 system call. 67 %if %0 >= 2 68 mov ebx, %2 69 %if %0 >= 3 70 mov ecx, %3 71 %if %0 = 4 72 mov edx, %4 73 %endif 74 %endif 75 %endif 76 mov eax, %1 77 ;int 30h 78 int 40h ; TRDOS 386 (TRDOS v2.0) 79 %endmacro 80 81 ; Retro UNIX 386 v1 system call format: 82 ; sys systemcall (eax) , , 83 84 [BITS 32] ; We need 32-bit intructions for protected mode 85 86 [ORG 0] 87 88 START_CODE: 89 ; clear bss 90 00000000 BF[A0030000] mov edi, bss_start 91 00000005 B9002C0100 mov ecx, (bss_end - bss_start)/4 92 ;xor eax, eax 93 0000000A F3AB rep stosd 94 95 ; program message 96 0000000C BE[00030000] mov esi, program_msg 97 00000011 E8D9020000 call print_msg 98 99 00000016 30E4 xor ah, ah 100 ;int 16h ; KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY 101 ; Return: AH = scan code, AL = character 102 00000018 CD32 int 32h ; TRDOS 386 Keyboard interrupt 103 104 ; Set Video Mode to 101h ; 640x480, 256 colors 105 sys _video, 08FFh, 101h 105 <1> 105 <1> 105 <1> 105 <1> 105 <1> %if %0 >= 2 105 0000001A BBFF080000 <1> mov ebx, %2 105 <1> %if %0 >= 3 105 0000001F B901010000 <1> mov ecx, %3 105 <1> %if %0 = 4 105 <1> mov edx, %4 105 <1> %endif 105 <1> %endif 105 <1> %endif 105 00000024 B81F000000 <1> mov eax, %1 105 <1> 105 00000029 CD40 <1> int 40h 106 0000002B 09C0 or eax, eax 107 ;jz short terminate 108 ;mov [LFB_ADDR], edx ; pointer to LFB info table/structure 109 0000002D 7505 jnz short set_vesa_mode_101h_ok 110 0000002F E983020000 jmp terminate 111 112 set_vesa_mode_101h_ok: 113 ; Set initial block colors 114 00000034 B9C0120000 mov ecx, (120*160)/4 115 00000039 B80F0F0F0F mov eax, 0F0F0F0Fh ; white 116 0000003E BF[A0030000] mov edi, whiteblock 117 00000043 F3AB rep stosd 118 00000045 66B9C012 mov cx, 120*40 119 00000049 B820202020 mov eax, 20202020h ; blue 120 0000004E BF[A04E0000] mov edi, blueblock 121 00000053 F3AB rep stosd 122 00000055 66B9C012 mov cx, 120*40 123 00000059 B828282828 mov eax, 28282828h ; red 124 0000005E BF[A0990000] mov edi, redblock 125 00000063 F3AB rep stosd 126 00000065 66B9C012 mov cx, 120*40 127 00000069 B830303030 mov eax, 30303030h ; green 128 0000006E BF[A0E40000] mov edi, greenblock 129 00000073 F3AB rep stosd 130 00000075 66B9C012 mov cx, 120*40 131 00000079 B82C2C2C2C mov eax, 2C2C2C2Ch ; yellow 132 0000007E BF[A02F0100] mov edi, yellowblock 133 00000083 F3AB rep stosd 134 135 ; copy white block to screen 136 ; at row 70, column 120 137 ; (block size: 120(w)*160(h) 138 139 00000085 B978004600 mov ecx, (70*65536)+120 140 0000008A BA7800A000 mov edx, (160*65536)+120 141 0000008F BE[A0030000] mov esi, whiteblock 142 00000094 BB10020000 mov ebx, 0210h ; non masked window copy 143 sys _video 143 <1> 143 <1> 143 <1> 143 <1> 143 <1> %if %0 >= 2 143 <1> mov ebx, %2 143 <1> %if %0 >= 3 143 <1> mov ecx, %3 143 <1> %if %0 = 4 143 <1> mov edx, %4 143 <1> %endif 143 <1> %endif 143 <1> %endif 143 00000099 B81F000000 <1> mov eax, %1 143 <1> 143 0000009E CD40 <1> int 40h 144 145 000000A0 E820020000 call waitforkey 146 147 ; copy blue block to screen 148 ; at row 160, column 260 149 ; (block size: 120(w)*160(h) 150 151 000000A5 B90401A000 mov ecx, (160*65536)+260 152 000000AA BA7800A000 mov edx, (160*65536)+120 153 000000AF BE[A04E0000] mov esi, blueblock 154 000000B4 BB10020000 mov ebx, 0210h ; non masked window copy 155 sys _video 155 <1> 155 <1> 155 <1> 155 <1> 155 <1> %if %0 >= 2 155 <1> mov ebx, %2 155 <1> %if %0 >= 3 155 <1> mov ecx, %3 155 <1> %if %0 = 4 155 <1> mov edx, %4 155 <1> %endif 155 <1> %endif 155 <1> %endif 155 000000B9 B81F000000 <1> mov eax, %1 155 <1> 155 000000BE CD40 <1> int 40h 156 157 000000C0 E800020000 call waitforkey 158 159 ; copy red block to screen 160 ; at row 250, column 120 161 ; (block size: 120(w)*160(h) 162 163 000000C5 B97800FA00 mov ecx, (250*65536)+120 164 000000CA BA7800A000 mov edx, (160*65536)+120 165 000000CF BE[A0990000] mov esi, redblock 166 000000D4 BB10020000 mov ebx, 0210h ; non masked window copy 167 sys _video 167 <1> 167 <1> 167 <1> 167 <1> 167 <1> %if %0 >= 2 167 <1> mov ebx, %2 167 <1> %if %0 >= 3 167 <1> mov ecx, %3 167 <1> %if %0 = 4 167 <1> mov edx, %4 167 <1> %endif 167 <1> %endif 167 <1> %endif 167 000000D9 B81F000000 <1> mov eax, %1 167 <1> 167 000000DE CD40 <1> int 40h 168 169 000000E0 E8E0010000 call waitforkey 170 171 ; copy green block to screen 172 ; at row 70, column 400 173 ; (block size: 120(w)*160(h) 174 175 000000E5 B990014600 mov ecx, (70*65536)+400 176 000000EA BA7800A000 mov edx, (160*65536)+120 177 000000EF BE[A0E40000] mov esi, greenblock 178 000000F4 BB10020000 mov ebx, 0210h ; non masked window copy 179 sys _video 179 <1> 179 <1> 179 <1> 179 <1> 179 <1> %if %0 >= 2 179 <1> mov ebx, %2 179 <1> %if %0 >= 3 179 <1> mov ecx, %3 179 <1> %if %0 = 4 179 <1> mov edx, %4 179 <1> %endif 179 <1> %endif 179 <1> %endif 179 000000F9 B81F000000 <1> mov eax, %1 179 <1> 179 000000FE CD40 <1> int 40h 180 181 00000100 E8C0010000 call waitforkey 182 183 ; copy yellow block to screen 184 ; at row 250, column 400 185 ; (block size: 120(w)*160(h) 186 187 00000105 B99001FA00 mov ecx, (250*65536)+400 188 0000010A BA7800A000 mov edx, (160*65536)+120 189 0000010F BE[A02F0100] mov esi, yellowblock 190 00000114 BB10020000 mov ebx, 0210h ; non masked window copy 191 sys _video 191 <1> 191 <1> 191 <1> 191 <1> 191 <1> %if %0 >= 2 191 <1> mov ebx, %2 191 <1> %if %0 >= 3 191 <1> mov ecx, %3 191 <1> %if %0 = 4 191 <1> mov edx, %4 191 <1> %endif 191 <1> %endif 191 <1> %endif 191 00000119 B81F000000 <1> mov eax, %1 191 <1> 191 0000011E CD40 <1> int 40h 192 _2: 193 00000120 E8A0010000 call waitforkey 194 195 ; continue by using 196 ; full screen color modification sub functions 197 198 ; NOT pixel colors 199 00000125 BB07020000 mov ebx, 0207h 200 sys _video 200 <1> 200 <1> 200 <1> 200 <1> 200 <1> %if %0 >= 2 200 <1> mov ebx, %2 200 <1> %if %0 >= 3 200 <1> mov ecx, %3 200 <1> %if %0 = 4 200 <1> mov edx, %4 200 <1> %endif 200 <1> %endif 200 <1> %endif 200 0000012A B81F000000 <1> mov eax, %1 200 <1> 200 0000012F CD40 <1> int 40h 201 202 00000131 E88F010000 call waitforkey 203 204 ; NOT pixel colors 205 00000136 BB07020000 mov ebx, 0207h 206 sys _video 206 <1> 206 <1> 206 <1> 206 <1> 206 <1> %if %0 >= 2 206 <1> mov ebx, %2 206 <1> %if %0 >= 3 206 <1> mov ecx, %3 206 <1> %if %0 = 4 206 <1> mov edx, %4 206 <1> %endif 206 <1> %endif 206 <1> %endif 206 0000013B B81F000000 <1> mov eax, %1 206 <1> 206 00000140 CD40 <1> int 40h 207 208 00000142 E87E010000 call waitforkey 209 210 ; NEGate pixel colors 211 00000147 BB08020000 mov ebx, 0208h 212 sys _video 212 <1> 212 <1> 212 <1> 212 <1> 212 <1> %if %0 >= 2 212 <1> mov ebx, %2 212 <1> %if %0 >= 3 212 <1> mov ecx, %3 212 <1> %if %0 = 4 212 <1> mov edx, %4 212 <1> %endif 212 <1> %endif 212 <1> %endif 212 0000014C B81F000000 <1> mov eax, %1 212 <1> 212 00000151 CD40 <1> int 40h 213 214 00000153 E86D010000 call waitforkey 215 216 ; NEGate pixel colors 217 00000158 BB08020000 mov ebx, 0208h 218 sys _video 218 <1> 218 <1> 218 <1> 218 <1> 218 <1> %if %0 >= 2 218 <1> mov ebx, %2 218 <1> %if %0 >= 3 218 <1> mov ecx, %3 218 <1> %if %0 = 4 218 <1> mov edx, %4 218 <1> %endif 218 <1> %endif 218 <1> %endif 218 0000015D B81F000000 <1> mov eax, %1 218 <1> 218 00000162 CD40 <1> int 40h 219 220 00000164 E85C010000 call waitforkey 221 _0: 222 ; INCrease pixel colors 223 00000169 BB09020000 mov ebx, 0209h 224 sys _video 224 <1> 224 <1> 224 <1> 224 <1> 224 <1> %if %0 >= 2 224 <1> mov ebx, %2 224 <1> %if %0 >= 3 224 <1> mov ecx, %3 224 <1> %if %0 = 4 224 <1> mov edx, %4 224 <1> %endif 224 <1> %endif 224 <1> %endif 224 0000016E B81F000000 <1> mov eax, %1 224 <1> 224 00000173 CD40 <1> int 40h 225 226 00000175 E84B010000 call waitforkey 227 0000017A 3C2B cmp al, '+' 228 0000017C 74EB je short _0 229 _1: 230 ; DECrease pixel colors 231 0000017E BB0A020000 mov ebx, 020Ah 232 sys _video 232 <1> 232 <1> 232 <1> 232 <1> 232 <1> %if %0 >= 2 232 <1> mov ebx, %2 232 <1> %if %0 >= 3 232 <1> mov ecx, %3 232 <1> %if %0 = 4 232 <1> mov edx, %4 232 <1> %endif 232 <1> %endif 232 <1> %endif 232 00000183 B81F000000 <1> mov eax, %1 232 <1> 232 00000188 CD40 <1> int 40h 233 234 0000018A E836010000 call waitforkey 235 236 0000018F 3C2D cmp al, '-' 237 00000191 74EB je short _1 238 00000193 3C2B cmp al, '+' 239 00000195 74D2 je short _0 240 241 ; CHANGE color (full screen) 242 00000197 31C9 xor ecx, ecx ; 0 ; black 243 00000199 BB01020000 mov ebx, 0201h ; Full screen, new color 244 0000019E B900000100 mov ecx, 65536 245 blackloop: 246 000001A3 09C9 or ecx, ecx 247 000001A5 90 nop 248 000001A6 90 nop 249 000001A7 90 nop 250 000001A8 E2F9 loop blackloop 251 252 000001AA B90F0F0F0F mov ecx, 0F0F0F0Fh ; white 253 000001AF BB01020000 mov ebx, 0201h ; Full screen, new color 254 sys _video 254 <1> 254 <1> 254 <1> 254 <1> 254 <1> %if %0 >= 2 254 <1> mov ebx, %2 254 <1> %if %0 >= 3 254 <1> mov ecx, %3 254 <1> %if %0 = 4 254 <1> mov edx, %4 254 <1> %endif 254 <1> %endif 254 <1> %endif 254 000001B4 B81F000000 <1> mov eax, %1 254 <1> 254 000001B9 CD40 <1> int 40h 255 000001BB E805010000 call waitforkey 256 000001C0 B920202020 mov ecx, 20202020h ; blue 257 000001C5 BB01020000 mov ebx, 0201h ; Full screen, new color 258 sys _video 258 <1> 258 <1> 258 <1> 258 <1> 258 <1> %if %0 >= 2 258 <1> mov ebx, %2 258 <1> %if %0 >= 3 258 <1> mov ecx, %3 258 <1> %if %0 = 4 258 <1> mov edx, %4 258 <1> %endif 258 <1> %endif 258 <1> %endif 258 000001CA B81F000000 <1> mov eax, %1 258 <1> 258 000001CF CD40 <1> int 40h 259 000001D1 E8EF000000 call waitforkey 260 000001D6 B928282828 mov ecx, 28282828h ; red 261 000001DB BB01020000 mov ebx, 0201h ; Full screen, new color 262 sys _video 262 <1> 262 <1> 262 <1> 262 <1> 262 <1> %if %0 >= 2 262 <1> mov ebx, %2 262 <1> %if %0 >= 3 262 <1> mov ecx, %3 262 <1> %if %0 = 4 262 <1> mov edx, %4 262 <1> %endif 262 <1> %endif 262 <1> %endif 262 000001E0 B81F000000 <1> mov eax, %1 262 <1> 262 000001E5 CD40 <1> int 40h 263 000001E7 E8D9000000 call waitforkey 264 000001EC B930303030 mov ecx, 30303030h ; green 265 000001F1 BB01020000 mov ebx, 0201h ; Full screen, new color 266 sys _video 266 <1> 266 <1> 266 <1> 266 <1> 266 <1> %if %0 >= 2 266 <1> mov ebx, %2 266 <1> %if %0 >= 3 266 <1> mov ecx, %3 266 <1> %if %0 = 4 266 <1> mov edx, %4 266 <1> %endif 266 <1> %endif 266 <1> %endif 266 000001F6 B81F000000 <1> mov eax, %1 266 <1> 266 000001FB CD40 <1> int 40h 267 000001FD E8C3000000 call waitforkey 268 00000202 B92C2C2C2C mov ecx, 2C2C2C2Ch ; yellow 269 00000207 BB01020000 mov ebx, 0201h ; Full screen, new color 270 sys _video 270 <1> 270 <1> 270 <1> 270 <1> 270 <1> %if %0 >= 2 270 <1> mov ebx, %2 270 <1> %if %0 >= 3 270 <1> mov ecx, %3 270 <1> %if %0 = 4 270 <1> mov edx, %4 270 <1> %endif 270 <1> %endif 270 <1> %endif 270 0000020C B81F000000 <1> mov eax, %1 270 <1> 270 00000211 CD40 <1> int 40h 271 272 00000213 E8AD000000 call waitforkey 273 274 ; Full screen copy 275 00000218 BE[A0030000] mov esi, fullscreen_buffer 276 0000021D 89F7 mov edi, esi 277 0000021F 31C0 xor eax, eax ; black 278 00000221 B960090000 mov ecx, (640*15)/4 279 00000226 F3AB rep stosd 280 00000228 B80F0F0F0F mov eax, 0F0F0F0Fh ; white 281 0000022D B940060000 mov ecx, (640*10)/4 282 00000232 F3AB rep stosd 283 00000234 31C0 xor eax, eax ; black 284 00000236 B920030000 mov ecx, (640*5)/4 285 0000023B F3AB rep stosd 286 0000023D B820202020 mov eax, 20202020h ; blue 287 00000242 B9803E0000 mov ecx, (640*100)/4 288 00000247 F3AB rep stosd 289 00000249 31C0 xor eax, eax ; black 290 0000024B B920030000 mov ecx, (640*5)/4 291 00000250 F3AB rep stosd 292 00000252 B828282828 mov eax, 28282828h ; red 293 00000257 B9803E0000 mov ecx, (640*100)/4 294 0000025C F3AB rep stosd 295 0000025E 31C0 xor eax, eax ; black 296 00000260 B940060000 mov ecx, (640*10)/4 297 00000265 F3AB rep stosd 298 00000267 B830303030 mov eax, 30303030h ; green 299 0000026C B9803E0000 mov ecx, (640*100)/4 300 00000271 F3AB rep stosd 301 00000273 31C0 xor eax, eax ; black 302 00000275 B920030000 mov ecx, (640*5)/4 303 0000027A F3AB rep stosd 304 0000027C B82C2C2C2C mov eax, 2C2C2C2Ch ; yellow 305 00000281 B9803E0000 mov ecx, (640*100)/4 306 00000286 F3AB rep stosd 307 00000288 31C0 xor eax, eax ; black 308 0000028A B920030000 mov ecx, (640*5)/4 309 0000028F F3AB rep stosd 310 00000291 B80F0F0F0F mov eax, 0F0F0F0Fh ; white 311 00000296 B940060000 mov ecx, (640*10)/4 312 0000029B F3AB rep stosd 313 0000029D 31C0 xor eax, eax ; black 314 0000029F B960090000 mov ecx, (640*15)/4 315 000002A4 F3AB rep stosd 316 317 000002A6 BB00020000 mov ebx, 0200h ; Full screen copy 318 sys _video 318 <1> 318 <1> 318 <1> 318 <1> 318 <1> %if %0 >= 2 318 <1> mov ebx, %2 318 <1> %if %0 >= 3 318 <1> mov ecx, %3 318 <1> %if %0 = 4 318 <1> mov edx, %4 318 <1> %endif 318 <1> %endif 318 <1> %endif 318 000002AB B81F000000 <1> mov eax, %1 318 <1> 318 000002B0 CD40 <1> int 40h 319 320 000002B2 E80E000000 call waitforkey 321 322 terminate: 323 000002B7 E82C000000 call set_text_mode 324 sys _exit 324 <1> 324 <1> 324 <1> 324 <1> 324 <1> %if %0 >= 2 324 <1> mov ebx, %2 324 <1> %if %0 >= 3 324 <1> mov ecx, %3 324 <1> %if %0 = 4 324 <1> mov edx, %4 324 <1> %endif 324 <1> %endif 324 <1> %endif 324 000002BC B801000000 <1> mov eax, %1 324 <1> 324 000002C1 CD40 <1> int 40h 325 halt: 326 000002C3 EBFE jmp short halt 327 328 waitforkey: 329 000002C5 B401 mov ah, 1 330 000002C7 CD32 int 32h 331 000002C9 740B jz short getkey 332 000002CB FF05[9C030000] inc dword [counter] 333 000002D1 90 nop 334 000002D2 90 nop 335 000002D3 90 nop 336 000002D4 EBEF jmp short waitforkey 337 getkey: 338 000002D6 30E4 xor ah, ah 339 000002D8 CD32 int 32h 340 341 000002DA 663D032E cmp ax, 2E03h 342 000002DE 7405 je short _terminate 343 000002E0 3C1B cmp al, 1Bh ; ESC key 344 000002E2 7401 je short _terminate 345 000002E4 C3 retn 346 _terminate: 347 000002E5 58 pop eax ; return address 348 000002E6 EBCF jmp short terminate 349 350 set_text_mode: 351 000002E8 30E4 xor ah, ah 352 000002EA B003 mov al, 3 353 ;int 10h ; al = 03h text mode, int 10 video 354 000002EC CD31 int 31h ; TRDOS 386 - Video interrupt 355 000002EE C3 retn 356 357 print_msg: 358 000002EF B40E mov ah, 0Eh 359 000002F1 BB07000000 mov ebx, 7 360 ;mov bl, 7 ; char attribute & color 361 p_next_chr: 362 000002F6 AC lodsb 363 000002F7 08C0 or al, al 364 000002F9 7404 jz short p_retn ; retn 365 000002FB CD31 int 31h 366 000002FD EBF7 jmp short p_next_chr 367 p_retn: 368 000002FF C3 retn 369 370 program_msg: 371 00000300 5452444F5320333836- db "TRDOS 386 v2.0.3 - ('sysvideo') Test Program - Block Operations" 371 00000309 2076322E302E33202D- 371 00000312 202827737973766964- 371 0000031B 656F27292054657374- 371 00000324 2050726F6772616D20- 371 0000032D 2D20426C6F636B204F- 371 00000336 7065726174696F6E73 372 0000033F 0D0A db 0Dh, 0Ah 373 00000341 6279204572646F6761- db "by Erdogan Tan - 21/02/2021" 373 0000034A 6E2054616E202D2032- 373 00000353 312F30322F32303231 374 ;db 0Dh, 0Ah, 0 375 0000035C 0D0A0D0A db 0Dh, 0Ah, 0Dh, 0Ah 376 00000360 507265737320616E79- db "Press any key to continue .." 376 00000369 206B657920746F2063- 376 00000372 6F6E74696E7565202E- 376 0000037B 2E 377 0000037C 0D0A db 0Dh, 0Ah 378 0000037E 285072657373204553- db "(Press ESC to exit) .." 378 00000387 4320746F2065786974- 378 00000390 29202E2E 379 00000394 0D0A db 0Dh, 0Ah 380 00000396 0D0A db 0Dh, 0Ah 381 382 nextline: 383 00000398 0D0A db 0Dh, 0Ah 384 phase: 385 0000039A 00 db 0 386 387 bss: 388 389 ABSOLUTE bss 390 391 0000039B alignb 4 392 393 0000039C counter: resd 1 394 395 bss_start: 396 fullscreen_buffer: 397 whiteblock: 398 000003A0 resb 120*160 399 blueblock: 400 00004EA0 resb 120*160 401 redblock: 402 000099A0 resb 120*160 403 greenblock: 404 0000E4A0 resb 120*160 405 yellowblock: 406 00012FA0 resb 120*160 407 408 00017AA0 resb 307200-96000 409 bss_end: