1 ; **************************************************************************** 2 ; sinus4.s - TRDOS 386 (TRDOS v2.0.3) Test Program - 'sysvideo' pixel tests 3 ; ---------------------------------------------------------------------------- 4 ; 5 ; 19/02/2021 6 ; 7 ; **************************************************************************** 8 ; nasm sinus4.s -l sinus4.txt -o SINUS4.PRG -Z error.txt 9 ; (modified from 'sinus2.s', 19/02/2021) 10 11 ; Draw sinus wave/curve by using 'sysvideo' bx=0305h 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[00070000] mov edi, bss_start 92 00000005 B900080000 mov ecx, (bss_end - bss_start)/4 93 ;xor eax, eax 94 0000000A F3AB rep stosd 95 96 ; program message 97 0000000C BE[2F010000] mov esi, program_msg 98 00000011 E8A2000000 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 ; pointer to LFB info table/structure 110 0000002D 750E jnz short set_vesa_mode_101h_ok 111 112 terminate: 113 0000002F E8F4000000 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 C605[F8060000]1C mov byte [color], 28 ; initial pixel color 120 _0: 121 00000044 E880000000 call drawsinewave 122 waitforkey: 123 ;mov ah, 1 124 ;int 32h 125 ;jz short getkey 126 ;inc word [counter] 127 ;nop 128 ;nop 129 ;nop 130 ;jmp short waitforkey 131 getkey: 132 00000049 30E4 xor ah, ah 133 0000004B CD32 int 32h 134 135 0000004D 663D032E cmp ax, 2E03h 136 00000051 74DC je short terminate 137 00000053 3C1B cmp al, 1Bh ; ESC key 138 00000055 74D8 je short terminate 139 140 00000057 3C2B cmp al, '+' 141 00000059 7508 jne short _1 142 143 0000005B FE05[F8060000] inc byte [color] 144 00000061 EBE1 jmp short _0 145 _1: 146 00000063 3C2D cmp al, '-' 147 00000065 7508 jne short _2 148 149 00000067 FE0D[F8060000] dec byte [color] 150 0000006D EBD5 jmp short _0 151 _2: 152 0000006F 3C20 cmp al, 20h ; space 153 00000071 7509 jne short _3 154 00000073 8005[F8060000]08 add byte [color], 8 155 0000007A EBC8 jmp short _0 156 _3: 157 0000007C 80FC4B cmp ah, 4Bh 158 0000007F 7507 jne short _5 159 ; left arrow 160 _4: 161 00000081 E890000000 call beep 162 00000086 EBC1 jmp waitforkey 163 _5: 164 00000088 80FC4D cmp ah, 4Dh 165 0000008B 7502 jne short _6 166 167 ; right arrow 168 0000008D EBF2 jmp short _4 169 _6: 170 0000008F 80FC50 cmp ah, 50h 171 00000092 7502 jne short _7 172 ; down arrow 173 00000094 EBEB jmp short _4 174 _7: 175 00000096 80FC48 cmp ah, 48h 176 00000099 7502 jne short _8 177 ; up arrow 178 0000009B EBE4 jmp short _4 179 _8: 180 0000009D 663D0D1C cmp ax, 1C0Dh 181 000000A1 750E jne short _9 182 000000A3 E86E000000 call beep 183 000000A8 8005[F8060000]04 add byte [color], 4 184 000000AF EB93 jmp short _0 185 _9: 186 000000B1 E860000000 call beep 187 000000B6 EB91 jmp waitforkey 188 189 print_msg: 190 000000B8 B40E mov ah, 0Eh 191 000000BA BB07000000 mov ebx, 7 192 ;mov bl, 7 ; char attribute & color 193 p_next_chr: 194 000000BF AC lodsb 195 000000C0 08C0 or al, al 196 000000C2 7404 jz short p_retn ; retn 197 000000C4 CD31 int 31h 198 000000C6 EBF7 jmp short p_next_chr 199 p_retn: 200 000000C8 C3 retn 201 202 drawsinewave: 203 ; INPUT: 204 ; sinustable 205 ; 206 ; Modified registers: esi, edi, eax, ecx, ebx, edx 207 208 ; fill _fx table by using sine wave table 209 ; x = 0 to 639 210 ; y = +200 to -200 211 ; +200 --> 399 -> screen row position = (400-399)+39 = 40 212 ; -200 --> 0 -> screen row position = (400-0)+39 = 439 213 214 000000C9 BE[F5010000] mov esi, sinustable 215 000000CE BF[00070000] mov edi, _fx 216 ;xor eax, eax 217 000000D3 29DB sub ebx, ebx ; 0 ; x 218 000000D5 31ED xor ebp, ebp ; pixel count 219 ;lodsw 220 ;jmp short _dsw_5 221 _dsw_0: 222 000000D7 31C0 xor eax, eax 223 000000D9 66AD lodsw ; ax = 400-y value 224 ;; 225 ;cmp ax, cx ; [prevy] 226 ;je short _dsw_5 227 ;jb short _dsw_3 228 ;_dsw_1: 229 ;inc cx ; previous 400-y 230 ;cmp ax, cx 231 ;jna short _dsw_5 232 ;; ebx = x 233 ;; eax = 400 - y 234 ;call _dsw_4 235 ;jmp short _dsw_1 236 ;_dsw_2: 237 ;push eax 238 ;call getpixeloffset 239 ;stosd 240 ;pop eax 241 ;inc ebp ; increase pixel count 242 ;retn 243 ;_dsw_3: 244 ;dec cx ; previous 400-y 245 ;cmp ax, cx 246 ;jnb short _dsw_5 247 ;; ebx = x 248 ;; eax = 400 - y 249 ;call _dsw_4 250 ;jmp short _dsw_3 251 ;_dsw_4: 252 ;push ebx 253 ;mov ebx, [prevx] 254 ;xchg eax, ecx ; [prevy] 255 ;call _dsw_2 256 ;xchg ecx, eax 257 ;pop ebx 258 ;inc dword [prevx] 259 ;retn 260 ;_dsw_5: 261 ;mov [prevx], ebx ; previous x value 262 ;mov ecx, eax ; previous 400-y value 263 ;call _dsw_2 264 265 000000DB E825000000 call getpixeloffset 266 000000E0 AB stosd 267 000000E1 45 inc ebp ; increase pixel count 268 269 000000E2 43 inc ebx 270 000000E3 81FB80020000 cmp ebx, 640 271 000000E9 72EC jb short _dsw_0 272 273 000000EB BE[00070000] mov esi, _fx 274 ;mov edx, ebp 275 ; 276 ; edx = pixel count 277 ; esi = user's single color pixel buffer address 278 sys _video, 0305h, [color], ebp 278 <1> 278 <1> 278 <1> 278 <1> 278 <1> %if %0 >= 2 278 000000F0 BB05030000 <1> mov ebx, %2 278 <1> %if %0 >= 3 278 000000F5 8B0D[F8060000] <1> mov ecx, %3 278 <1> %if %0 = 4 278 000000FB 89EA <1> mov edx, %4 278 <1> %endif 278 <1> %endif 278 <1> %endif 278 000000FD B81F000000 <1> mov eax, %1 278 <1> 278 00000102 CD40 <1> int 40h 279 280 00000104 C3 retn 281 282 getpixeloffset: 283 ; ebx = x position 284 ; eax = 400 - y position 285 00000105 BAB7010000 mov edx, 439 286 0000010A 29C2 sub edx, eax ; convert row position from 400-y 287 ; row = (400-y)+39 288 0000010C B880020000 mov eax, 640 ; screen width 289 00000111 F7E2 mul edx 290 00000113 01D8 add eax, ebx ; add x to y*640 291 ; eax = pixel offset on display page 292 00000115 C3 retn 293 beep: 294 ; call beep function (16/64 second, 886Hz) 295 sys _audio, 16, 1331 295 <1> 295 <1> 295 <1> 295 <1> 295 <1> %if %0 >= 2 295 00000116 BB10000000 <1> mov ebx, %2 295 <1> %if %0 >= 3 295 0000011B B933050000 <1> mov ecx, %3 295 <1> %if %0 = 4 295 <1> mov edx, %4 295 <1> %endif 295 <1> %endif 295 <1> %endif 295 00000120 B820000000 <1> mov eax, %1 295 <1> 295 00000125 CD40 <1> int 40h 296 00000127 C3 retn 297 298 set_text_mode: 299 00000128 30E4 xor ah, ah 300 0000012A B003 mov al, 3 301 ;int 10h ; al = 03h text mode, int 10 video 302 0000012C CD31 int 31h ; TRDOS 386 - Video interrupt 303 0000012E C3 retn 304 305 program_msg: 306 0000012F 5452444F5320333836- db "TRDOS 386 v2.0.3 - ('sysvideo') Test Program - Draw Sine Wave" 306 00000138 2076322E302E33202D- 306 00000141 202827737973766964- 306 0000014A 656F27292054657374- 306 00000153 2050726F6772616D20- 306 0000015C 2D2044726177205369- 306 00000165 6E652057617665 307 0000016C 0D0A db 0Dh, 0Ah 308 0000016E 6279204572646F6761- db "by Erdogan Tan - 19/02/2021" 308 00000177 6E2054616E202D2031- 308 00000180 392F30322F32303231 309 ;db 0Dh, 0Ah, 0 310 00000189 0D0A0D0A db 0Dh, 0Ah, 0Dh, 0Ah 311 312 0000018D 557365205350414345- db "Use SPACE,ENTER,'+','-' keys to change COLOR .." 312 00000196 2C454E5445522C272B- 312 0000019F 272C272D27206B6579- 312 000001A8 7320746F206368616E- 312 000001B1 676520434F4C4F5220- 312 000001BA 2E2E 313 000001BC 0D0A db 0Dh, 0Ah 314 000001BE 507265737320455343- db "Press ESC to exit .." 314 000001C7 20746F206578697420- 314 000001D0 2E2E 315 000001D2 0D0A db 0Dh, 0Ah 316 000001D4 0D0A db 0Dh, 0Ah 317 000001D6 507265737320616E79- db "Press any key to continue .." 317 000001DF 206B657920746F2063- 317 000001E8 6F6E74696E7565202E- 317 000001F1 2E 318 nextline: 319 000001F2 0D0A00 db 0Dh, 0Ah, 0 320 321 sinustable: ; sine wave table (x=0 to 639, y= +200 to -200) 322 ; 19/02/2021 323 ; https://daycounter.com/Calculators/Sine-Generator-Calculator2.phtml 324 ; 640x400 (x= 0 to 639, y = 0 to 399) 325 000001F5 C800C900CB00CD00CF- dw 200,201,203,205,207,209,211,213,215,217,219,221,223,225,227,229 325 000001FE 00D100D300D500D700- 325 00000207 D900DB00DD00DF00E1- 325 00000210 00E300E500 326 00000215 E700E900EB00EC00EE- dw 231,233,235,236,238,240,242,244,246,248,250,252,254,256,257,259 326 0000021E 00F000F200F400F600- 326 00000227 F800FA00FC00FE0000- 326 00000230 0101010301 327 00000235 0501070109010B010D- dw 261,263,265,267,269,270,272,274,276,278,279,281,283,285,287,288 327 0000023E 010E01100112011401- 327 00000247 1601170119011B011D- 327 00000250 011F012001 328 00000255 220124012601270129- dw 290,292,294,295,297,299,300,302,304,305,307,309,310,312,314,315 328 0000025E 012B012C012E013001- 328 00000267 310133013501360138- 328 00000270 013A013B01 329 00000275 3D013E014001410143- dw 317,318,320,321,323,325,326,328,329,331,332,333,335,336,338,339 329 0000027E 014501460148014901- 329 00000287 4B014C014D014F0150- 329 00000290 0152015301 330 00000295 55015601570159015A- dw 341,342,343,345,346,347,349,350,351,352,354,355,356,357,359,360 330 0000029E 015B015D015E015F01- 330 000002A7 600162016301640165- 330 000002B0 0167016801 331 000002B5 69016A016B016C016D- dw 361,362,363,364,365,366,368,369,370,371,372,373,374,375,375,376 331 000002BE 016E01700171017201- 331 000002C7 730174017501760177- 331 000002D0 0177017801 332 000002D5 79017A017B017C017D- dw 377,378,379,380,381,381,382,383,384,385,385,386,387,387,388,389 332 000002DE 017D017E017F018001- 332 000002E7 810181018201830183- 332 000002F0 0184018501 333 000002F5 850186018601870188- dw 389,390,390,391,392,392,393,393,393,394,394,395,395,396,396,396 333 000002FE 018801890189018901- 333 00000307 8A018A018B018B018C- 333 00000310 018C018C01 334 00000315 8D018D018D018D018E- dw 397,397,397,397,398,398,398,398,398,399,399,399,399,399,399,399 334 0000031E 018E018E018E018E01- 334 00000327 8F018F018F018F018F- 334 00000330 018F018F01 335 00000335 8F018F018F018F018F- dw 399,399,399,399,399,399,399,399,398,398,398,398,398,397,397,397 335 0000033E 018F018F018F018E01- 335 00000347 8E018E018E018E018D- 335 00000350 018D018D01 336 00000355 8D018C018C018C018B- dw 397,396,396,396,395,395,394,394,393,393,393,392,392,391,390,390 336 0000035E 018B018A018A018901- 336 00000367 890189018801880187- 336 00000370 0186018601 337 00000375 850185018401830183- dw 389,389,388,387,387,386,385,385,384,383,382,381,381,380,379,378 337 0000037E 018201810181018001- 337 00000387 7F017E017D017D017C- 337 00000390 017B017A01 338 00000395 790178017701770176- dw 377,376,375,375,374,373,372,371,370,369,368,366,365,364,363,362 338 0000039E 017501740173017201- 338 000003A7 710170016E016D016C- 338 000003B0 016B016A01 339 000003B5 690168016701650164- dw 361,360,359,357,356,355,354,352,351,350,349,347,346,345,343,342 339 000003BE 016301620160015F01- 339 000003C7 5E015D015B015A0159- 339 000003D0 0157015601 340 000003D5 55015301520150014F- dw 341,339,338,336,335,333,332,331,329,328,326,325,323,321,320,318 340 000003DE 014D014C014B014901- 340 000003E7 480146014501430141- 340 000003F0 0140013E01 341 000003F5 3D013B013A01380136- dw 317,315,314,312,310,309,307,305,304,302,300,299,297,295,294,292 341 000003FE 013501330131013001- 341 00000407 2E012C012B01290127- 341 00000410 0126012401 342 00000415 220120011F011D011B- dw 290,288,287,285,283,281,279,278,276,274,272,270,269,267,265,263 342 0000041E 011901170116011401- 342 00000427 120110010E010D010B- 342 00000430 0109010701 343 00000435 0501030101010001FE- dw 261,259,257,256,254,252,250,248,246,244,242,240,238,236,235,233 343 0000043E 00FC00FA00F800F600- 343 00000447 F400F200F000EE00EC- 343 00000450 00EB00E900 344 00000455 E700E500E300E100DF- dw 231,229,227,225,223,221,219,217,215,213,211,209,207,205,203,201 344 0000045E 00DD00DB00D900D700- 344 00000467 D500D300D100CF00CD- 344 00000470 00CB00C900 345 00000475 C800C600C400C200C0- dw 200,198,196,194,192,190,188,186,184,182,180,178,176,174,172,170 345 0000047E 00BE00BC00BA00B800- 345 00000487 B600B400B200B000AE- 345 00000490 00AC00AA00 346 00000495 A800A600A400A300A1- dw 168,166,164,163,161,159,157,155,153,151,149,147,145,143,142,140 346 0000049E 009F009D009B009900- 346 000004A7 97009500930091008F- 346 000004B0 008E008C00 347 000004B5 8A0088008600840082- dw 138,136,134,132,130,129,127,125,123,121,120,118,116,114,112,111 347 000004BE 0081007F007D007B00- 347 000004C7 790078007600740072- 347 000004D0 0070006F00 348 000004D5 6D006B006900680066- dw 109,107,105,104,102,100,99,97,95,94,92,90,89,87,85,84 348 000004DE 006400630061005F00- 348 000004E7 5E005C005A00590057- 348 000004F0 0055005400 349 000004F5 520051004F004E004C- dw 82,81,79,78,76,74,73,71,70,68,67,66,64,63,61,60 349 000004FE 004A00490047004600- 349 00000507 44004300420040003F- 349 00000510 003D003C00 350 00000515 3A0039003800360035- dw 58,57,56,54,53,52,50,49,48,47,45,44,43,42,40,39 350 0000051E 003400320031003000- 350 00000527 2F002D002C002B002A- 350 00000530 0028002700 351 00000535 260025002400230022- dw 38,37,36,35,34,33,31,30,29,28,27,26,25,24,24,23 351 0000053E 0021001F001E001D00- 351 00000547 1C001B001A00190018- 351 00000550 0018001700 352 00000555 160015001400130012- dw 22,21,20,19,18,18,17,16,15,14,14,13,12,12,11,10 352 0000055E 001200110010000F00- 352 00000567 0E000E000D000C000C- 352 00000570 000B000A00 353 00000575 0A0009000900080007- dw 10,9,9,8,7,7,6,6,6,5,5,4,4,3,3,3 353 0000057E 000700060006000600- 353 00000587 050005000400040003- 353 00000590 0003000300 354 00000595 020002000200020001- dw 2,2,2,2,1,1,1,1,1,0,0,0,0,0,0,0 354 0000059E 000100010001000100- 354 000005A7 000000000000000000- 354 000005B0 0000000000 355 000005B5 000000000000000000- dw 0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2 355 000005BE 000000000000000100- 355 000005C7 010001000100010002- 355 000005D0 0002000200 356 000005D5 020003000300030004- dw 2,3,3,3,4,4,5,5,6,6,6,7,7,8,9,9 356 000005DE 000400050005000600- 356 000005E7 060006000700070008- 356 000005F0 0009000900 357 000005F5 0A000A000B000C000C- dw 10,10,11,12,12,13,14,14,15,16,17,18,18,19,20,21 357 000005FE 000D000E000E000F00- 357 00000607 100011001200120013- 357 00000610 0014001500 358 00000615 160017001800180019- dw 22,23,24,24,25,26,27,28,29,30,31,33,34,35,36,37 358 0000061E 001A001B001C001D00- 358 00000627 1E001F002100220023- 358 00000630 0024002500 359 00000635 2600270028002A002B- dw 38,39,40,42,43,44,45,47,48,49,50,52,53,54,56,57 359 0000063E 002C002D002F003000- 359 00000647 310032003400350036- 359 00000650 0038003900 360 00000655 3A003C003D003F0040- dw 58,60,61,63,64,66,67,68,70,71,73,74,76,78,79,81 360 0000065E 004200430044004600- 360 00000667 470049004A004C004E- 360 00000670 004F005100 361 00000675 520054005500570059- dw 82,84,85,87,89,90,92,94,95,97,99,100,102,104,105,107 361 0000067E 005A005C005E005F00- 361 00000687 610063006400660068- 361 00000690 0069006B00 362 00000695 6D006F007000720074- dw 109,111,112,114,116,118,120,121,123,125,127,129,130,132,134,136 362 0000069E 007600780079007B00- 362 000006A7 7D007F008100820084- 362 000006B0 0086008800 363 000006B5 8A008C008E008F0091- dw 138,140,142,143,145,147,149,151,153,155,157,159,161,163,164,166 363 000006BE 009300950097009900- 363 000006C7 9B009D009F00A100A3- 363 000006D0 00A400A600 364 000006D5 A800AA00AC00AE00B0- dw 168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198 364 000006DE 00B200B400B600B800- 364 000006E7 BA00BC00BE00C000C2- 364 000006F0 00C400C600 365 366 bss: 367 368 ABSOLUTE bss 369 370 000006F5 alignb 4 371 372 000006F8 color: resd 1 373 000006FC prevx: resd 1 374 ;prevy: resd 1 375 376 bss_start: 377 00000700 _fx: resd 640 ; for every X values from 0 to 639 378 00001100 resd 2048-640 ; used for repetitive x values for continuity 379 bss_end: