1 ; **************************************************************************** 2 ; m13x60hz.s (Mode 13h .. 320x200, 256 colors, 60hz test for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; M13X60HZ.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 m13x60hz.s -l m13x60hz.txt -o M13X60HZ.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 SQUARE_PIXELS equ 0 98 99 Start: 100 ; set videdo mode 13h (320x200, 256 colors) 101 00000000 B013 mov al, 13h 102 00000002 CD31 int 31h 103 104 ; DIRECT VGA MEMORY ACCESS 105 ; bl = 0, bh = 5 106 ; Direct access/map to VGA memory (0A0000h) 107 108 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 109 110 00000010 3D00000A00 cmp eax, 0A0000h 111 00000015 7558 jne short ENDPROG 112 113 00000017 31C0 xor eax, eax 114 115 00000019 BAD4030000 mov edx, 3D4h 116 117 ;cli 118 119 0000001E BB11000000 mov ebx, 0011h ; Turn off write protect to CRTC registers 120 ;mov ax, bx 121 ;out dx, ax 122 00000023 B403 mov ah, 3 123 00000025 CD34 int 34h 124 125 ;mov dx, 3D4h 126 00000027 66BB060B mov bx, 0B06h ; New vertical total=525 lines, bits 0-7 127 ;mov ax, bx 128 ;out dx, ax 129 0000002B B403 mov ah, 3 130 0000002D CD34 int 34h 131 132 ;mov dx, 3D4h 133 0000002F 66BB073E mov bx, 3E07h ; New vertical total=525 lines, bits 8-9 134 ;mov ax, bx 135 ;out dx, ax 136 00000033 B403 mov ah, 3 137 00000035 CD34 int 34h 138 139 %if SQUARE_PIXELS 140 ;mov dx, 3D4h 141 mov bx, 0B910h ; Vsync start=scanline 185 142 ;mov ax, bx 143 ;out dx, ax 144 mov ah, 3 145 int 34h 146 147 ;mov dx, 3D4h 148 mov bx, 8F12h ; Vertical display end=scanline 399, bits 0-7 149 ;mov ax, bx 150 ;out dx, ax 151 mov ah, 3 152 int 34h 153 154 ;mov dx, 3D4h 155 mov bx, 0B815h ; vertical blanking start=scanline 440, bits 0-7 156 ;mov ax, bx 157 ;out dx, ax 158 mov ah, 3 159 int 34h 160 161 ;mov dx, 3D4h 162 mov bx, 0E216h ; Adjust vblank end position 163 ;mov ax, bx 164 ;out dx, ax 165 mov ah, 3 166 int 34h 167 168 ;mov dx, 3D4h 169 mov bx, 8511h ; Vsync length=2 lines + turn write protect back on 170 ;mov ax, bx 171 ;out dx, ax 172 mov ah, 3 173 int 34h 174 %else 175 ;mov dx, 3D4h 176 00000037 66BB160B mov bx, 0B16h ; Adjust vblank end position=scanline 524 177 ;mov ax, bx 178 ;out dx, ax 179 0000003B B403 mov ah, 3 180 0000003D CD34 int 34h 181 182 ;mov dx, 3D4h 183 0000003F 66BB10D7 mov bx, 0D710h ; Vsync start=scanline 215 184 ;mov ax, bx 185 ;out dx, ax 186 00000043 B403 mov ah, 3 187 00000045 CD34 int 34h 188 189 ;mov dx, 3D4h 190 00000047 66BB1189 mov bx, 8911h ; Vsync length=2 lines + turn write protect back on 191 ;mov ax, bx 192 ;out dx, ax 193 0000004B B403 mov ah, 3 194 0000004D CD34 int 34h 195 %endif 196 ;sti 197 198 ; fill screen with VGA palette 199 0000004F BF00000A00 mov edi, 0A0000h 200 00000054 31F6 xor esi, esi 201 00000056 4E dec esi 202 00000057 B900FA0000 mov ecx, 64000 203 0000005C BB40010000 mov ebx, 320 204 filloop: 205 00000061 46 inc esi 206 00000062 89F0 mov eax, esi 207 00000064 31D2 xor edx, edx 208 00000066 F7F3 div ebx 209 00000068 AA stosb 210 00000069 E2F6 loop filloop 211 212 ; getchar (wait for keystroke before exit) 213 0000006B 31C0 xor eax, eax 214 0000006D CD32 int 32h 215 216 ENDPROG: 217 ; set video mode 03h 218 0000006F 66B80300 mov ax, 3 219 00000073 CD31 int 31h 220 221 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 00000075 B801000000 <1> mov eax, %1 82 <1> 83 0000007A CD40 <1> int 40h 222 hang: 223 0000007C 90 nop 224 0000007D EBFD jmp short hang 225 226 227 %if 0 228 229 60hz.cpp 230 231 // License: public domain. 232 233 #include 234 #include 235 236 void set_video_mode(int mode) 237 { 238 union REGS regs; 239 regs.x.ax = mode; 240 int86(0x10, ®s, ®s); 241 } 242 243 void main() 244 { 245 set_video_mode(0x13); 246 disable(); 247 outpw(0x3D4, 0x0011); // Turn off write protect to CRTC registers 248 outpw(0x3D4, 0x0B06); // New vertical total=525 lines, bits 0-7 249 outpw(0x3D4, 0x3E07); // New vertical total=525 lines, bits 8-9 250 #ifdef SQUARE_PIXELS 251 outpw(0x3D4, 0xB910); // Vsync start=scanline 185 252 outpw(0x3D4, 0x8F12); // Vertical display end=scanline 399, bits 0-7 253 outpw(0x3D4, 0xB815); // Vertical blanking start=scanline 440, bits 0-7 254 outpw(0x3D4, 0xE216); // Adjust vblank end position 255 outpw(0x3D4, 0x8511); // Vsync length=2 lines + turn write protect back on 256 #else 257 outpw(0x3D4, 0x0B16); // Adjust vblank end position=scanline 524 258 outpw(0x3D4, 0xD710); // Vsync start=scanline 215 259 outpw(0x3D4, 0x8911); // Vsync length=2 lines + turn write protect back on 260 #endif 261 enable(); 262 // fill screen with VGA palette 263 unsigned char far *s = (unsigned char far *)MK_FP(0xA000, 0); 264 for(unsigned int i = 0; i < 64000; ++i) s[i] = i%320; 265 getch(); 266 // restore DOS video mode 267 set_video_mode(0x03); 268 } 269 270 %endif 271