1 ; **************************************************************************** 2 ; m13_60hz.s (Mode 13h .. 320x200, 256 colors, 60hz test for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; M13_60HZ.PRG ! MODE 13h 60 Hz (for LCD monitor) Test program by Erdogan TAN 5 ; 6 ; 06/12/2023 7 ; 8 ; Assembler: NASM 2.15 (2.11) 9 ; ---------------------------------------------------------------------------- 10 ; nasm m13_60hz.s -l m13_60hz.txt -o M13_60HZ.PRG 11 ; **************************************************************************** 12 13 ;------------------------------------------------------------------------------ 14 ; TRDOS 386, TRDOS v2.0 15 ;------------------------------------------------------------------------------ 16 17 ; 14/07/2020 18 ; 31/12/2017 19 ; TRDOS 386 (v2.0) system calls 20 _ver equ 0 21 _exit equ 1 22 _fork equ 2 23 _read equ 3 24 _write equ 4 25 _open equ 5 26 _close equ 6 27 _wait equ 7 28 _create equ 8 29 _rename equ 9 30 _delete equ 10 31 _exec equ 11 32 _chdir equ 12 33 _time equ 13 34 _mkdir equ 14 35 _chmod equ 15 36 _rmdir equ 16 37 _break equ 17 38 _drive equ 18 39 _seek equ 19 40 _tell equ 20 41 _memory equ 21 42 _prompt equ 22 43 _path equ 23 44 _env equ 24 45 _stime equ 25 46 _quit equ 26 47 _intr equ 27 48 _dir equ 28 49 _emt equ 29 50 _ldrvt equ 30 51 _video equ 31 52 _audio equ 32 53 _timer equ 33 54 _sleep equ 34 55 _msg equ 35 56 _geterr equ 36 57 _fpstat equ 37 58 _pri equ 38 59 _rele equ 39 60 _fff equ 40 61 _fnf equ 41 62 _alloc equ 42 63 _dalloc equ 43 64 _calbac equ 44 65 _dma equ 45 66 67 %macro sys 1-4 68 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 69 ; 03/09/2015 70 ; 13/04/2015 71 ; Retro UNIX 386 v1 system call. 72 %if %0 >= 2 73 mov ebx, %2 74 %if %0 >= 3 75 mov ecx, %3 76 %if %0 = 4 77 mov edx, %4 78 %endif 79 %endif 80 %endif 81 mov eax, %1 82 ;int 30h 83 int 40h ; TRDOS 386 (TRDOS v2.0) 84 %endmacro 85 86 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 87 ; sys systemcall (eax) , , 88 89 ;------------------------------------------------------------------------------ 90 ; CODE 91 ;------------------------------------------------------------------------------ 92 93 [BITS 32] 94 [org 0] 95 96 SQUARE_PIXELS equ 1 97 98 Start: 99 ; set videdo mode 13h (320x200, 256 colors) 100 00000000 B013 mov al, 13h 101 00000002 CD31 int 31h 102 103 ; DIRECT VGA MEMORY ACCESS 104 ; bl = 0, bh = 5 105 ; Direct access/map to VGA memory (0A0000h) 106 107 sys _video, 0500h 68 <1> 69 <1> 70 <1> 71 <1> 72 <1> %if %0 >= 2 73 00000004 BB00050000 <1> mov ebx, %2 74 <1> %if %0 >= 3 75 <1> mov ecx, %3 76 <1> %if %0 = 4 77 <1> mov edx, %4 78 <1> %endif 79 <1> %endif 80 <1> %endif 81 00000009 B81F000000 <1> mov eax, %1 82 <1> 83 0000000E CD40 <1> int 40h 108 109 00000010 3D00000A00 cmp eax, 0A0000h 110 00000015 7568 jne short ENDPROG 111 112 00000017 31C0 xor eax, eax 113 114 00000019 BAD4030000 mov edx, 3D4h 115 116 ;cli 117 118 0000001E BB11000000 mov ebx, 0011h ; Turn off write protect to CRTC registers 119 ;mov ax, bx 120 ;out dx, ax 121 00000023 B403 mov ah, 3 122 00000025 CD34 int 34h 123 124 ;mov dx, 3D4h 125 00000027 66BB060B mov bx, 0B06h ; New vertical total=525 lines, bits 0-7 126 ;mov ax, bx 127 ;out dx, ax 128 0000002B B403 mov ah, 3 129 0000002D CD34 int 34h 130 131 ;mov dx, 3D4h 132 0000002F 66BB073E mov bx, 3E07h ; New vertical total=525 lines, bits 8-9 133 ;mov ax, bx 134 ;out dx, ax 135 00000033 B403 mov ah, 3 136 00000035 CD34 int 34h 137 138 %if SQUARE_PIXELS 139 ;mov dx, 3D4h 140 00000037 66BB10B9 mov bx, 0B910h ; Vsync start=scanline 185 141 ;mov ax, bx 142 ;out dx, ax 143 0000003B B403 mov ah, 3 144 0000003D CD34 int 34h 145 146 ;mov dx, 3D4h 147 0000003F 66BB128F mov bx, 8F12h ; Vertical display end=scanline 399, bits 0-7 148 ;mov ax, bx 149 ;out dx, ax 150 00000043 B403 mov ah, 3 151 00000045 CD34 int 34h 152 153 ;mov dx, 3D4h 154 00000047 66BB15B8 mov bx, 0B815h ; vertical blanking start=scanline 440, bits 0-7 155 ;mov ax, bx 156 ;out dx, ax 157 0000004B B403 mov ah, 3 158 0000004D CD34 int 34h 159 160 ;mov dx, 3D4h 161 0000004F 66BB16E2 mov bx, 0E216h ; Adjust vblank end position 162 ;mov ax, bx 163 ;out dx, ax 164 00000053 B403 mov ah, 3 165 00000055 CD34 int 34h 166 167 ;mov dx, 3D4h 168 00000057 66BB1185 mov bx, 8511h ; Vsync length=2 lines + turn write protect back on 169 ;mov ax, bx 170 ;out dx, ax 171 0000005B B403 mov ah, 3 172 0000005D CD34 int 34h 173 %else 174 ;mov dx, 3D4h 175 mov bx, 0B16h ; Adjust vblank end position=scanline 524 176 ;mov ax, bx 177 ;out dx, ax 178 mov ah, 3 179 int 34h 180 181 ;mov dx, 3D4h 182 mov bx, 0D710h ; Vsync start=scanline 215 183 ;mov ax, bx 184 ;out dx, ax 185 mov ah, 3 186 int 34h 187 188 ;mov dx, 3D4h 189 mov bx, 8911h ; Vsync length=2 lines + turn write protect back on 190 ;mov ax, bx 191 ;out dx, ax 192 mov ah, 3 193 int 34h 194 %endif 195 ;sti 196 197 ; fill screen with VGA palette 198 0000005F BF00000A00 mov edi, 0A0000h 199 00000064 31F6 xor esi, esi 200 00000066 4E dec esi 201 00000067 B900FA0000 mov ecx, 64000 202 0000006C BB40010000 mov ebx, 320 203 filloop: 204 00000071 46 inc esi 205 00000072 89F0 mov eax, esi 206 00000074 31D2 xor edx, edx 207 00000076 F7F3 div ebx 208 00000078 AA stosb 209 00000079 E2F6 loop filloop 210 211 ; getchar (wait for keystroke before exit) 212 0000007B 31C0 xor eax, eax 213 0000007D CD32 int 32h 214 215 ENDPROG: 216 ; set video mode 03h 217 0000007F 66B80300 mov ax, 3 218 00000083 CD31 int 31h 219 220 sys _exit 68 <1> 69 <1> 70 <1> 71 <1> 72 <1> %if %0 >= 2 73 <1> mov ebx, %2 74 <1> %if %0 >= 3 75 <1> mov ecx, %3 76 <1> %if %0 = 4 77 <1> mov edx, %4 78 <1> %endif 79 <1> %endif 80 <1> %endif 81 00000085 B801000000 <1> mov eax, %1 82 <1> 83 0000008A CD40 <1> int 40h 221 hang: 222 0000008C 90 nop 223 0000008D EBFD jmp short hang 224 225 226 %if 0 227 228 60hz.cpp 229 230 // License: public domain. 231 232 #include 233 #include 234 235 void set_video_mode(int mode) 236 { 237 union REGS regs; 238 regs.x.ax = mode; 239 int86(0x10, ®s, ®s); 240 } 241 242 void main() 243 { 244 set_video_mode(0x13); 245 disable(); 246 outpw(0x3D4, 0x0011); // Turn off write protect to CRTC registers 247 outpw(0x3D4, 0x0B06); // New vertical total=525 lines, bits 0-7 248 outpw(0x3D4, 0x3E07); // New vertical total=525 lines, bits 8-9 249 #ifdef SQUARE_PIXELS 250 outpw(0x3D4, 0xB910); // Vsync start=scanline 185 251 outpw(0x3D4, 0x8F12); // Vertical display end=scanline 399, bits 0-7 252 outpw(0x3D4, 0xB815); // Vertical blanking start=scanline 440, bits 0-7 253 outpw(0x3D4, 0xE216); // Adjust vblank end position 254 outpw(0x3D4, 0x8511); // Vsync length=2 lines + turn write protect back on 255 #else 256 outpw(0x3D4, 0x0B16); // Adjust vblank end position=scanline 524 257 outpw(0x3D4, 0xD710); // Vsync start=scanline 215 258 outpw(0x3D4, 0x8911); // Vsync length=2 lines + turn write protect back on 259 #endif 260 enable(); 261 // fill screen with VGA palette 262 unsigned char far *s = (unsigned char far *)MK_FP(0xA000, 0); 263 for(unsigned int i = 0; i < 64000; ++i) s[i] = i%320; 264 getch(); 265 // restore DOS video mode 266 set_video_mode(0x03); 267 } 268 269 %endif 270