1 ; **************************************************************************** 2 ; setmode4.s - TRDOS 386 (TRDOS v2.0.3) Test Program - Set Video Mode 3 ; ---------------------------------------------------------------------------- 4 ; 5 ; 05/12/2020 (Erdogan Tan) 6 ; 7 ; **************************************************************************** 8 9 ; 14/07/2020 10 ; 31/12/2017 11 ; TRDOS 386 (v2.0) system calls 12 _ver equ 0 13 _exit equ 1 14 _fork equ 2 15 _read equ 3 16 _write equ 4 17 _open equ 5 18 _close equ 6 19 _wait equ 7 20 _create equ 8 21 _rename equ 9 22 _delete equ 10 23 _exec equ 11 24 _chdir equ 12 25 _time equ 13 26 _mkdir equ 14 27 _chmod equ 15 28 _rmdir equ 16 29 _break equ 17 30 _drive equ 18 31 _seek equ 19 32 _tell equ 20 33 _memory equ 21 34 _prompt equ 22 35 _path equ 23 36 _env equ 24 37 _stime equ 25 38 _quit equ 26 39 _intr equ 27 40 _dir equ 28 41 _emt equ 29 42 _ldrvt equ 30 43 _video equ 31 44 _audio equ 32 45 _timer equ 33 46 _sleep equ 34 47 _msg equ 35 48 _geterr equ 36 49 _fpstat equ 37 50 _pri equ 38 51 _rele equ 39 52 _fff equ 40 53 _fnf equ 41 54 _alloc equ 42 55 _dalloc equ 43 56 _calbac equ 44 57 _dma equ 45 58 59 %macro sys 1-4 60 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 61 ; 03/09/2015 62 ; 13/04/2015 63 ; Retro UNIX 386 v1 system call. 64 %if %0 >= 2 65 mov ebx, %2 66 %if %0 >= 3 67 mov ecx, %3 68 %if %0 = 4 69 mov edx, %4 70 %endif 71 %endif 72 %endif 73 mov eax, %1 74 ;int 30h 75 int 40h ; TRDOS 386 (TRDOS v2.0) 76 %endmacro 77 78 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 79 ; sys systemcall (eax) , , 80 81 ;======================================================================== 82 ; SET VIDEO MODE 83 ;======================================================================== 84 85 ; Modified from setmod3.s (19/11/2020) 86 87 [BITS 32] ; We need 32-bit intructions for protected mode 88 89 [ORG 0] 90 START_CODE: 91 00000000 BE[6E000000] mov esi, message1 92 00000005 E850000000 call print_msg 93 94 0000000A 30E4 xor ah, ah 95 0000000C CD32 int 32h ; real mode: int 16h 96 97 0000000E 66B81300 mov ax, 13h ; mode 13h ; 98 00000012 CD31 int 31h ; real mode: int 10h 99 100 ;; DIRECT ACCESS TO VIDEO MEMORY 101 ;;xor ebx, ebx 102 ;mov bh, 4 ; Direct access/map to CGA memory (0B8000h) 103 ;;mov eax, _video ; 1Fh 104 ;mov ax, 1Fh ; sys _video ; TRDOS 386 Video functions 105 ;int 40h ; TRDOS 386 system call 106 107 ; eax = 0B8000h 108 ;and eax, eax 109 ;jz terminate ; error (eax = 0) 110 111 00000014 BE[94000000] mov esi, message2 112 ;call print_msg_x 113 00000019 E83C000000 call print_msg 114 key_loop: 115 0000001E 30E4 xor ah, ah 116 00000020 CD32 int 32h ; real mode: int 16h 117 118 00000022 3C0D cmp al, 13 ; ENTER key 119 00000024 7418 je short crlf 120 121 00000026 3C1B cmp al, 27 ; ESCape key 122 00000028 7420 je short terminate 123 124 0000002A 3C03 cmp al, 3 ; CTRL+C 125 0000002C 741C je short terminate 126 127 0000002E 6683F800 cmp ax, 0 ; CTRL+BREAK 128 00000032 7416 je short terminate 129 _next_char: 130 ; 17/11/2020 131 ;call print_char 132 133 print_char: 134 00000034 B40E mov ah, 0Eh 135 00000036 66BB0700 mov bx, 07h 136 0000003A CD31 int 31h ; real mode: int 10h 137 0000003C EBE0 jmp short key_loop 138 crlf: 139 0000003E B40E mov ah, 0Eh 140 ;mov al, 0Dh ; Carriage return 141 00000040 66BB0700 mov bx, 07h 142 00000044 CD31 int 31h ; real mode: int 10h 143 00000046 B00A mov al, 0Ah ; Line feed 144 145 00000048 EBEA jmp short print_char 146 147 ; 17/11/2020 148 ; jmp short key_loop 149 ;crlf: 150 ; call print_char 151 ; mov al, 10 152 ; jmp short _next_char 153 154 terminate: 155 0000004A 66B80300 mov ax, 3 ; mode 3 ; 156 0000004E CD31 int 31h ; real mode: int 10h 157 158 sys _exit 158 <1> 158 <1> 158 <1> 158 <1> 158 <1> %if %0 >= 2 158 <1> mov ebx, %2 158 <1> %if %0 >= 3 158 <1> mov ecx, %3 158 <1> %if %0 = 4 158 <1> mov edx, %4 158 <1> %endif 158 <1> %endif 158 <1> %endif 158 00000050 B801000000 <1> mov eax, %1 158 <1> 158 00000055 CD40 <1> int 40h 159 here: 160 00000057 EBFE jmp short here 161 162 _return: 163 00000059 C3 retn 164 165 ; 19/11/2020 166 print_msg: 167 sys _msg, esi, 255, 0Eh ; 05/12/2020 167 <1> 167 <1> 167 <1> 167 <1> 167 <1> %if %0 >= 2 167 0000005A 89F3 <1> mov ebx, %2 167 <1> %if %0 >= 3 167 0000005C B9FF000000 <1> mov ecx, %3 167 <1> %if %0 = 4 167 00000061 BA0E000000 <1> mov edx, %4 167 <1> %endif 167 <1> %endif 167 <1> %endif 167 00000066 B823000000 <1> mov eax, %1 167 <1> 167 0000006B CD40 <1> int 40h 168 ; message with yellow color 169 ; (max. 255 chars) 170 0000006D C3 retn 171 172 ; mov ah, 0Eh 173 ; mov bx, 0Fh 174 ;p_loop: 175 ; lodsb 176 ; or al, al 177 ; jz short _return 178 ; int 31h 179 ; jmp short p_loop 180 181 ; ; 17/11/2020 182 ;print_msg_x: 183 ; mov edi, eax ; 0B8000h 184 ; xor eax, eax 185 ; xor edx, edx 186 ; mov bh, 0Fh ; color (attribute) 187 ;_0: 188 ; lodsb 189 ; or al, al 190 ; jz short _ok 191 ; 192 ; call print_char 193 ;_ok: 194 ; retn 195 ; 196 ;print_char: 197 ; cmp al, 13 ; Carriage return 198 ; je short cr 199 ; cmp al, 10 ; Line feed 200 ; je short lf 201 ; 202 ; cmp al, 8 ; Backspace 203 ; jne short _alfanumeric 204 ; 205 ; mov bl, al 206 ; mov al, 80 ; columns * 2 207 ; mul dh ; * row 208 ; shl dl, 1 209 ; add al, dl ; column * 2 210 ; adc ah, 0 ; + 211 ; shr dl, 1 212 ; 213 ; mov word [edi+eax], 0720h ; clear current char 214 ; 215 ; dec dl 216 ; jns short _retn 217 ; mov dl, 39 ; column 39 218 ; dec dh 219 ; jns short _retn 220 ; xor edx, edx 221 ; retn 222 ;_alfanumeric: 223 ; mov bl, al 224 ; mov al, 80 ; columns * 2 225 ; mul dh ; * row 226 ; shl dl, 1 227 ; add al, dl ; column * 2 228 ; adc ah, 0 ; + 229 ; shr dl, 1 230 ; 231 ; mov bh, 0Fh 232 ; mov [edi+eax], bx ; char and color/attrib 233 ; 234 ; inc dl ; next column 235 ; cmp dl, 40 236 ; jb short _retn 237 ; 238 ; xor dl, dl ; column 0 239 ; inc dh ; next row 240 ; cmp dh, 25 241 ; jb short _retn 242 ; xor dh, dh ; row 0 243 ;_retn: 244 ; retn 245 ;cr: 246 ; xor dl, dl 247 ; jmp short _retn 248 ;lf: 249 ; inc dh 250 ; cmp dh, 25 251 ; jb short _retn 252 ; xor dh, dh 253 ; jmp short _retn 254 255 ;----------------------------------------------------------------- 256 ; MESSAGES 257 ;----------------------------------------------------------------- 258 259 message1: 260 0000006E 0D0A db 0Dh, 0Ah 261 00000070 50726573732061206B- db "Press a key to set video mode 13h" 261 00000079 657920746F20736574- 261 00000082 20766964656F206D6F- 261 0000008B 646520313368 262 00000091 0D0A00 db 0Dh, 0Ah, 0 263 message2: 264 00000094 0D0D db 0Dh, 0Dh 265 00000096 566964656F204D6F64- db "Video Mode 13h (320x200 graphics)" 265 0000009F 652031336820283332- 265 000000A8 307832303020677261- 265 000000B1 706869637329 266 000000B7 0D0A0D0A db 0Dh, 0Ah, 0Dh, 0Ah 267 000000BB 507265737320455343- db "Press ESC to exit" 267 000000C4 20746F2065786974 268 000000CC 0D0A0D0A00 db 0Dh, 0Ah, 0Dh, 0Ah, 0