     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) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    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 <dos.h>
   233                                  #include <conio.h>
   234                                  
   235                                  void set_video_mode(int mode)
   236                                  {
   237                                  	union REGS regs;
   238                                  	regs.x.ax = mode;
   239                                  	int86(0x10, &regs, &regs);
   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                                  
