1 ; **************************************************************************** 2 ; m13y60hz.s (Mode 13h .. 320x200, 256 colors, 60hz test for TRDOS 386) 3 ; ---------------------------------------------------------------------------- 4 ; M13Y60HZ.PRG ! MODE 13h 60 Hz (for LCD monitor) Test program by Erdogan TAN 5 ; 6 ; 07/12/2023 7 ; 8 ; Assembler: NASM 2.15 (2.11) 9 ; ---------------------------------------------------------------------------- 10 ; nasm m13y60hz.s -l m13y60hz.txt -o M13Y60HZ.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 Start: 97 ; set videdo mode 13h (320x200, 256 colors) 98 00000000 B013 mov al, 13h 99 00000002 CD31 int 31h 100 101 ; DIRECT VGA MEMORY ACCESS 102 ; bl = 0, bh = 5 103 ; Direct access/map to VGA memory (0A0000h) 104 105 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 106 107 00000010 3D00000A00 cmp eax, 0A0000h 108 00000015 7405 je short _x 109 00000017 E989000000 jmp ENDPROG 110 _x: 111 0000001C 31C0 xor eax, eax 112 0000001E 31DB xor ebx, ebx 113 114 00000020 BACC030000 mov edx, 3CCh 115 ;in al, dx 116 ;mov ah, 0 117 00000025 CD34 int 34h 118 00000027 B2C2 mov dl, 0C2h ; misc. output (3C2h) 119 00000029 0CC0 or al, 0C0h 120 ;out dx, al 121 0000002B B401 mov ah, 1 122 0000002D CD34 int 34h 123 124 0000002F 66BAD403 mov dx, 3D4h ; CRTC port 125 126 00000033 B011 mov al, 11h 127 00000035 B401 mov ah, 1 128 00000037 CD34 int 34h 129 00000039 42 inc edx 130 0000003A B400 mov ah, 0 131 0000003C CD34 int 34h 132 0000003E 247F and al, 7Fh 133 00000040 B401 mov ah, 1 134 00000042 CD34 int 34h ; unlock cr0 - cr7 135 00000044 4A dec edx 136 137 ;mov ebx, 0011h ; Turn off write protect to CRTC registers 138 ;;mov ax, bx 139 ;;out dx, ax 140 ;mov ah, 3 141 ;int 34h 142 143 ;mov dx, 3D4h 144 ;mov bx, 0B06h ; New vertical total=525 lines, bits 0-7 145 00000045 66BB060B mov bx, 0B06h ; vertical total 146 ;mov ax, bx 147 ;out dx, ax 148 00000049 B403 mov ah, 3 149 0000004B CD34 int 34h 150 151 ;mov dx, 3D4h 152 ;mov bx, 3E07h ; New vertical total=525 lines, bits 8-9 153 0000004D 66BB073E mov bx, 3E07h ; overflow reg 154 ;mov ax, bx 155 ;out dx, ax 156 00000051 B403 mov ah, 3 157 00000053 CD34 int 34h 158 159 ;mov dx, 3D4h 160 ;mov bx, 0B910h ; Vsync start=scanline 185 161 00000055 66BB10C3 mov bx, 0C310h ; vertical retrace start 162 ;mov ax, bx 163 ;out dx, ax 164 00000059 B403 mov ah, 3 165 0000005B CD34 int 34h 166 167 0000005D 66BB118C mov bx, 8C11h ; vertical retrace end 168 00000061 B403 mov ah, 3 169 00000063 CD34 int 34h 170 171 ;mov dx, 3D4h 172 ;mov bx, 8F12h ; Vertical display end=scanline 399, bits 0-7 173 00000065 66BB128F mov bx, 8F12h ; vertical display enable end 174 ;mov ax, bx 175 ;out dx, ax 176 00000069 B403 mov ah, 3 177 0000006B CD34 int 34h 178 179 ;mov dx, 3D4h 180 ;mov bx, 0B815h ; vertical blanking start=scanline 440, bits 0-7 181 0000006D 66BB15B8 mov bx, 0B815h ; vertical blank start 182 ;mov ax, bx 183 ;out dx, ax 184 00000071 B403 mov ah, 3 185 00000073 CD34 int 34h 186 187 ;mov dx, 3D4h 188 ;mov bx, 0E216h ; Adjust vblank end position 189 00000075 66BB16E2 mov bx, 0E216h ; vertical blank end 190 ;mov ax, bx 191 ;out dx, ax 192 00000079 B403 mov ah, 3 193 0000007B CD34 int 34h 194 195 ;mov dx, 3D4h 196 0000007D 66BB1185 mov bx, 8511h ; Vsync length=2 lines + turn write protect back on 197 ;mov ax, bx 198 ;out dx, ax 199 00000081 B403 mov ah, 3 200 00000083 CD34 int 34h 201 202 ; fill screen with VGA palette 203 00000085 BF00000A00 mov edi, 0A0000h 204 0000008A 31F6 xor esi, esi 205 0000008C 4E dec esi 206 0000008D B900FA0000 mov ecx, 64000 207 00000092 BB40010000 mov ebx, 320 208 filloop: 209 00000097 46 inc esi 210 00000098 89F0 mov eax, esi 211 0000009A 31D2 xor edx, edx 212 0000009C F7F3 div ebx 213 0000009E AA stosb 214 0000009F E2F6 loop filloop 215 216 ; getchar (wait for keystroke before exit) 217 000000A1 31C0 xor eax, eax 218 000000A3 CD32 int 32h 219 220 ENDPROG: 221 ; set video mode 03h 222 000000A5 66B80300 mov ax, 3 223 000000A9 CD31 int 31h 224 225 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 000000AB B801000000 <1> mov eax, %1 82 <1> 83 000000B0 CD40 <1> int 40h 226 hang: 227 000000B2 90 nop 228 000000B3 EBFD jmp short hang 229 230 ; ref: VGA60HZ.COM - VGA 60hz vertical refresh 231 ; https://github.com/wbcbz7/dos-vga-tsr-goodies 232 ; ref: github, juj/60hz.cpp 233 ; https://gist.github.com/juj/