     1                                  ; ****************************************************************************
     2                                  ; font1.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'font1.prg')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; FONT1.PRG ! TEST program !  TRDOS 386 Video Function (font) test !
     5                                  ;
     6                                  ; 25/07/2016
     7                                  ;
     8                                  ; [ Last Modification: 29/07/2016 ]
     9                                  ;
    10                                  ; Assembler: NASM 2.11
    11                                  ;
    12                                  ; ****************************************************************************
    13                                  
    14                                  ; 19/05/2016
    15                                  ; 29/04/2016
    16                                  ; TRDOS 386 system calls (temporary list!)
    17                                  _ver 	equ 0
    18                                  _exit 	equ 1
    19                                  _fork 	equ 2
    20                                  _read 	equ 3
    21                                  _write	equ 4
    22                                  _open	equ 5
    23                                  _close 	equ 6
    24                                  _wait 	equ 7
    25                                  _creat 	equ 8
    26                                  _link 	equ 9
    27                                  _unlink	equ 10
    28                                  _exec	equ 11
    29                                  _chdir	equ 12
    30                                  _time 	equ 13
    31                                  _mkdir 	equ 14
    32                                  _chmod	equ 15
    33                                  _chown	equ 16
    34                                  _break	equ 17
    35                                  _stat	equ 18
    36                                  _seek	equ 19
    37                                  _tell 	equ 20
    38                                  _mount	equ 21
    39                                  _umount	equ 22
    40                                  _setuid	equ 23
    41                                  _getuid	equ 24
    42                                  _stime	equ 25
    43                                  _quit	equ 26	
    44                                  _intr	equ 27
    45                                  _fstat	equ 28
    46                                  _emt 	equ 29
    47                                  _mdate 	equ 30
    48                                  _video	equ 31
    49                                  _audio	equ 32
    50                                  _ilgins	equ 33
    51                                  _sleep	equ 34
    52                                  _msg    equ 35
    53                                  _geterr equ 36
    54                                  _rsrvd1	equ 37
    55                                  _pri	equ 38
    56                                  _rele 	equ 39
    57                                  
    58                                  %macro sys 1-4
    59                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    60                                      ; 03/09/2015	
    61                                      ; 13/04/2015
    62                                      ; Retro UNIX 386 v1 system call.	
    63                                      %if %0 >= 2   
    64                                          mov ebx, %2
    65                                          %if %0 >= 3    
    66                                              mov ecx, %3
    67                                              %if %0 = 4
    68                                                 mov edx, %4   
    69                                              %endif
    70                                          %endif
    71                                      %endif
    72                                      mov eax, %1
    73                                      ;int 30h
    74                                      int 40h ; TRDOS 386 (TRDOS v2.0)	   
    75                                  %endmacro
    76                                  
    77                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    78                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    79                                  
    80                                  [BITS 32] ; We need 32-bit intructions for protected mode
    81                                  
    82                                  [ORG 0] 
    83                                  
    84                                  start: 
    85                                  
    86                                  ; DIRECT CGA MEMORY ACCESS
    87                                  ;xor	ebx, ebx
    88 00000000 B704                    mov	bh, 4 ; Direct access/map to CGA memory (0B8000h)
    89                                  ;mov	eax, _video ; 1Fh
    90 00000002 B01F                    mov	al, 1Fh ; sys _video ; TRDOS 386 Video functions
    91 00000004 CD40                    int	40h	; TRDOS 386 system call
    92                                  
    93                                  ; eax = 0B8000h
    94 00000006 21C0                    and	eax, eax
    95 00000008 0F84BA000000            jz	terminate ; error (eax = 0)
    96                                  
    97 0000000E BE[6B010000]            mov     esi, prg_msg
    98 00000013 E8EF000000              call	print_msg
    99                                  
   100                                  ; set cursor position
   101 00000018 B402                    mov	ah, 2
   102 0000001A 6629D2                  sub	dx, dx ; row 0, column 0
   103 0000001D 28FF                    sub	bh, bh ; video page 0
   104 0000001F CD31                    int	31h
   105                                  
   106                                  ;xor	ebp, ebp
   107                                  
   108                                  _0:
   109 00000021 BB[1B010000]            mov	ebx, color_for_page
   110 00000026 BF00800B00              mov	edi, 0B8000h
   111                                  ; Fill all pages with characters
   112                                  _1:
   113 0000002B 8A23                    mov	ah, [ebx]
   114 0000002D E89F000000              call	full_page
   115 00000032 43                      inc	ebx
   116 00000033 81FB[23010000]          cmp	ebx, color_for_page + 8
   117 00000039 72F0                    jb	short _1
   118                                  
   119 0000003B BB00800B00              mov	ebx, 0B8000h
   120                                  _2:
   121 00000040 89DF                    mov	edi, ebx
   122 00000042 8B35[24010000]          mov	esi, [msg_font]
   123 00000048 E8AF000000              call	write_name
   124 0000004D 89DF                    mov	edi, ebx
   125 0000004F 81C7880F0000            add	edi, 4000 - (2*msg_vpg_len)		
   126 00000055 BE[35010000]            mov	esi, msg_page
   127 0000005A E89D000000              call	write_name
   128 0000005F 81FB00FD0B00            cmp	ebx, 0BFD00h
   129 00000065 730E                    jnb	short _3
   130 00000067 81C3A00F0000            add	ebx, 4000
   131 0000006D FE05[40010000]          inc	byte [msg_pg_num]
   132 00000073 EBCB                    jmp	short _2
   133                                  
   134                                  _3:
   135 00000075 B410                    mov	ah, 10h
   136 00000077 CD32                    int	32h
   137                                  
   138 00000079 45                      inc	ebp
   139 0000007A BE[24010000]            mov	esi, msg_font
   140 0000007F 83FD01                  cmp	ebp, 1
   141 00000082 7715                    ja	short _5
   142 00000084 66B81111                mov	ax, 1111h ; load and activate vga 8x14 font
   143 00000088 C706[4F010000]          mov	dword [esi], msg_vga_font_8_14
   144                                  _4:
   145 0000008E CD31                    int	31h
   146 00000090 C605[40010000]30        mov	byte [msg_pg_num], '0'
   147 00000097 EB88                    jmp	short _0
   148                                  
   149                                  _5:
   150 00000099 83FD03                  cmp	ebp, 3
   151 0000009C 771A                    ja	short _7	
   152 0000009E 740C                    je	short _6
   153 000000A0 66B81211                mov	ax, 1112h ; load and activate vga 8x8 font
   154 000000A4 C706[42010000]          mov	dword [esi], msg_vga_font_8_8
   155 000000AA EBE2                    jmp	short _4
   156                                  
   157                                  _6:
   158 000000AC 66B81411                mov	ax, 1114h ; load and activate vga 8x16 font
   159 000000B0 C706[5D010000]          mov	dword [esi], msg_vga_font_8_16
   160 000000B6 EBD6                    jmp	short _4
   161                                  
   162                                  _7:
   163                                  ; clear video page 0
   164 000000B8 66B82007                mov	ax, 0720h
   165 000000BC 66B9D007                mov	cx, 2000
   166 000000C0 BF00800B00              mov	edi, 0B8000h
   167 000000C5 F366AB                  rep	stosw
   168                                  
   169                                  terminate:
   170                                  	sys 	_exit   ; INT 40h
   170                              <1> 
   170                              <1> 
   170                              <1> 
   170                              <1> 
   170                              <1>  %if %0 >= 2
   170                              <1>  mov ebx, %2
   170                              <1>  %if %0 >= 3
   170                              <1>  mov ecx, %3
   170                              <1>  %if %0 = 4
   170                              <1>  mov edx, %4
   170                              <1>  %endif
   170                              <1>  %endif
   170                              <1>  %endif
   170 000000C8 B801000000          <1>  mov eax, %1
   170                              <1> 
   170 000000CD CD40                <1>  int 40h
   171                                  here:
   172 000000CF EBFE                    	jmp	short here
   173                                  
   174                                  full_page:
   175                                  	;mov	edi, 0B8000h
   176                                  	;mov	ah, 4Eh
   177                                  f_pg_0:
   178 000000D1 6650                    	push	ax
   179 000000D3 66B82007                	mov	ax, 0720h
   180 000000D7 66B96801                	mov	cx, 360
   181 000000DB F366AB                  	rep	stosw
   182 000000DE 6658                    	pop	ax
   183 000000E0 B205                    	mov	dl, 5
   184                                  f_pg_1:
   185 000000E2 B501                    	mov	ch, 1 ; cx = 256
   186 000000E4 30C0                    	xor	al, al
   187                                  f_pg_2:
   188 000000E6 66AB                    	stosw	
   189 000000E8 FEC0                    	inc	al
   190 000000EA E2FA                    	loop	f_pg_2
   191 000000EC FECA                    	dec	dl
   192 000000EE 75F2                    	jnz	short f_pg_1
   193                                  	;
   194 000000F0 66B82007                	mov	ax, 720h
   195 000000F4 66B96801                	mov	cx, 360
   196 000000F8 F366AB                  	rep	stosw
   197                                  f_pg_3:
   198 000000FB C3                      	retn
   199                                  
   200                                  write_name:
   201                                  	; esi = ASCIIZ string address
   202                                  	; edi = destination address
   203 000000FC B407                    	mov	ah, 07h
   204                                  w_n1:
   205 000000FE AC                      	lodsb
   206 000000FF 20C0                    	and	al, al
   207 00000101 74F8                    	jz	short f_pg_3
   208 00000103 66AB                    	stosw
   209 00000105 EBF7                    	jmp	short w_n1
   210                                  	
   211                                  print_msg:
   212 00000107 66BB0700                	mov	bx, 7
   213 0000010B B40E                            mov     ah, 0Eh
   214                                  pmsg_loop:
   215 0000010D AC                      	lodsb
   216 0000010E 20C0                    	and	al, al
   217 00000110 7404                    	jz	short pmsg_ok
   218 00000112 CD31                    	int	31h	; TRDOS 386 video interrupt
   219 00000114 EBF7                    	jmp	short pmsg_loop	
   220                                  pmsg_ok:
   221 00000116 B410                    	mov	ah, 10h ; Getchar
   222 00000118 CD32                    	int	32h	; TRDOS 386 keyboard interrupt
   223 0000011A C3                      	retn
   224                                  
   225                                  color_for_page:
   226 0000011B 0F0A0B0C0D0E0907        	db 0Fh, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 09h, 07h 	
   227                                  
   228 00000123 00                      db 	0
   229                                  msg_font:
   230 00000124 [28010000]              dd	msg_current_font
   231                                  msg_current_font:
   232 00000128 43555252454E542046-     db 	'CURRENT FONT'
   232 00000131 4F4E54             
   233 00000134 00                      db	0
   234                                  msg_page:
   235 00000135 564944454F20504147-     db 	'VIDEO PAGE '
   235 0000013E 4520               
   236                                  msg_pg_num:
   237 00000140 30                      db	'0'
   238                                  msg_vpg_len	equ $ - msg_page
   239 00000141 00                      db	0
   240                                  msg_vga_font_8_8:
   241 00000142 56474120464F4E5420-     db 	'VGA FONT 8x8'
   241 0000014B 387838             
   242 0000014E 00                      db	0
   243                                  msg_vga_font_8_14:
   244 0000014F 56474120464F4E5420-     db 	'VGA FONT 8x14'
   244 00000158 38783134           
   245 0000015C 00                      db	0
   246                                  msg_vga_font_8_16:
   247 0000015D 56474120464F4E5420-     db 	'VGA FONT 8x16'
   247 00000166 38783136           
   248 0000016A 00                      db	0
   249                                  
   250                                  prg_msg:
   251 0000016B 4552444F47414E2054-     db	'ERDOGAN TAN - TRDOS 386 - VGA FONT Test Program - FONT1.PRG'
   251 00000174 414E202D205452444F-
   251 0000017D 5320333836202D2056-
   251 00000186 474120464F4E542054-
   251 0000018F 6573742050726F6772-
   251 00000198 616D202D20464F4E54-
   251 000001A1 312E505247         
   252 000001A6 0D0A                    db 	0Dh, 0Ah,
   253 000001A8 32392F30372F323031-     db	'29/07/2016'
   253 000001B1 36                 
   254 000001B2 0D0A                    db	0Dh, 0Ah
   255 000001B4 507265737320616E79-     db	'Press any key to continue...'
   255 000001BD 206B657920746F2063-
   255 000001C6 6F6E74696E75652E2E-
   255 000001CF 2E                 
   256 000001D0 00                      db 	0
   257 000001D1 90                      align 2
   258 000001D2 [D401]                  dw	_end
   259                                  _end:
