     1                                  ; ****************************************************************************
     2                                  ; vgawrite.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'vgawrite.prg')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; VGA TELETYPE & SCROLL TEST program !  TRDOS 386 VGA Functionality test !
     5                                  ;
     6                                  ; 09/08/2016
     7                                  ;
     8                                  ; [ Last Modification: 09/08/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 00000000 BE[4E000000]            mov     esi, prg_msg
    87 00000005 E82F000000              call	print_msg
    88                                  
    89 0000000A 31C0                    xor	eax, eax
    90 0000000C 31DB                    xor	ebx, ebx
    91                                  
    92                                  ; DIRECT VGA MEMORY ACCESS
    93                                  ;xor	ebx, ebx
    94 0000000E B705                    mov	bh, 5 ; Direct access/map to VGA memory (0A0000h)
    95                                  ;mov	eax, _video ; 1Fh
    96 00000010 B01F                    mov	al, 1Fh ; sys _video ; TRDOS 386 Video functions
    97 00000012 CD40                    int	40h   ; TRDOS 386 system call
    98                                  
    99                                  ; eax = 0A0000h
   100 00000014 21C0                    and	eax, eax
   101 00000016 7418                    jz      terminate ; error (eax = 0)
   102                                  
   103                                  ; ah = 0
   104 00000018 B013                    mov	al, 13h ; set video mode to 13h 
   105                                  ;int	10h		; - VIDEO -
   106 0000001A CD31                    int	31h  ; TRDOS 386 - VIDEO Interrupt
   107                                  ;
   108                                  ;mov	ax, 1124h ; set (load) 8x16 VGA font
   109                                  ;mov	bl, 1	; 14 rows
   110                                  ;;int	10h  ; - VIDEO - TEXT-MODE CHARACTER GENERATOR FUNCTIONS
   111                                  ;int	31h  ; TRDOS 386 - VIDEO Interrupt
   112                                  
   113                                  getchar:
   114 0000001C B410                    mov	ah, 10h
   115 0000001E CD32                    int	32h
   116                                  
   117 00000020 6650                    push	ax
   118 00000022 B40E                    mov	ah, 0Eh
   119 00000024 66BB2200                mov	bx, 22h
   120 00000028 CD31                    int	31h	; write tty
   121 0000002A 6658                    pop	ax
   122 0000002C 3C1B                    cmp	al, 1Bh ; ESC key
   123 0000002E 75EC                    jne     short getchar
   124                                  
   125                                  terminate:
   126                                  	sys 	_exit   ; INT 40h
   126                              <1> 
   126                              <1> 
   126                              <1> 
   126                              <1> 
   126                              <1>  %if %0 >= 2
   126                              <1>  mov ebx, %2
   126                              <1>  %if %0 >= 3
   126                              <1>  mov ecx, %3
   126                              <1>  %if %0 = 4
   126                              <1>  mov edx, %4
   126                              <1>  %endif
   126                              <1>  %endif
   126                              <1>  %endif
   126 00000030 B801000000          <1>  mov eax, %1
   126                              <1> 
   126 00000035 CD40                <1>  int 40h
   127                                  here:
   128 00000037 EBFE                    	jmp	short here
   129                                  
   130                                  print_msg:
   131 00000039 66BB0700                	mov	bx, 7
   132 0000003D B40E                            mov     ah, 0Eh
   133                                  pmsg_loop:
   134 0000003F AC                      	lodsb
   135 00000040 20C0                    	and	al, al
   136 00000042 7404                    	jz	short pmsg_ok
   137 00000044 CD31                    	int	31h	; TRDOS 386 video interrupt
   138 00000046 EBF7                    	jmp	short pmsg_loop	
   139                                  pmsg_ok:
   140 00000048 B410                    	mov	ah, 10h ; Getchar
   141 0000004A CD32                    	int	32h	; TRDOS 386 keyboard interrupt
   142 0000004C C3                      	retn
   143                                  
   144 0000004D 00                      db 	0
   145                                  prg_msg:
   146 0000004E 4552444F47414E2054-     db	'ERDOGAN TAN - TRDOS 386 - VGA TELETYPE & SCROLL TEST'
   146 00000057 414E202D205452444F-
   146 00000060 5320333836202D2056-
   146 00000069 47412054454C455459-
   146 00000072 50452026205343524F-
   146 0000007B 4C4C2054455354     
   147 00000082 0D0A                    db	0Dh, 0Ah
   148 00000084 30392F30382F323031-     db	'09/08/2016'
   148 0000008D 36                 
   149 0000008E 0D0A                    db	0Dh, 0Ah
   150 00000090 00                      db 	0
   151 00000091 [9400]                  dw	_end
   152 00000093 00                      db	0 
   153                                  _end:
