     1                                  ; ****************************************************************************
     2                                  ; dvmrw.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'dvmrw.prg')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; DVMRW.PRG ! TEST program !  TRDOS 386 Direct Video Memory Access test !
     5                                  ;
     6                                  ; 17/07/2016
     7                                  ;
     8                                  ; [ Last Modification: 14/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 VGA MEMOY ACCESS
    87                                  ;xor	ebx, ebx
    88 00000000 B705                    mov	bh, 5 ; Direct access/map to VGA memory (0A0000h)
    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 = 0A0000h
    94 00000006 21C0                    and	eax, eax
    95 00000008 745E                    jz	short terminate ; error (eax = 0)
    96                                  
    97 0000000A BE[86000000]            mov     esi, prg_msg
    98 0000000F E85D000000              call	print_msg
    99                                  
   100                                  ; SET VIDEO MODE TO 13H
   101 00000014 66B81300                mov	ax, 13h  ; set video mode 
   102                                  ;mov	al, 13h	 ; 320x200 linear, 256 colors, 0A0000h
   103 00000018 CD31                    int	31h	 ; TRDOS 386 Video Interrupt
   104                                  
   105 0000001A B007                    mov	al, 07h ; beep !
   106 0000001C B40E                    mov	ah, 0Eh ; tty write
   107 0000001E 66BB0000                mov	bx, 0
   108 00000022 CD31                    int	31h	; TRDOS 386 Video Interrupt
   109                                  
   110                                  
   111                                  ; Write rectangle pixels to VGA memory 
   112                                  ; (as it is mapped to user's memory space) 
   113                                  
   114 00000024 B4FF                    mov	ah, 0FFh
   115 00000026 B905000000              mov	ecx, 5
   116                                  L1:
   117 0000002B 51                      push	ecx
   118 0000002C B128                    mov	cl, 40
   119                                  L2:
   120 0000002E 51                      push	ecx
   121 0000002F B104                    mov	cl, 4 ; 4*(40+40) = 320
   122                                  L3:
   123 00000031 51                      push	ecx
   124 00000032 BF00000A00              mov	edi, 0A0000h
   125 00000037 B10A                    mov	cl, 10
   126 00000039 F7D0                    not	eax ; FFFFFFFFh
   127 0000003B F3AB                    rep	stosd
   128 0000003D B10A                    mov	cl, 10
   129 0000003F F7D0                    not	eax ; 00000000h
   130 00000041 F3AB                    rep	stosd
   131 00000043 59                      pop	ecx
   132 00000044 E2EB                    loop	L3
   133 00000046 59                      pop	ecx
   134 00000047 E2E5                    loop	L2
   135 00000049 F7D0                    not	eax ; FFFFFFFFh
   136 0000004B 59                      pop	ecx
   137 0000004C E2DD                    loop	L1
   138                                  L4:
   139 0000004E B400                    mov	ah, 0 	; read char from keyboard buffer
   140 00000050 CD32                    int	32h	; TRDOS 386 - KEYBOARD Interrupt
   141 00000052 3C1B                    cmp	al, 1Bh
   142 00000054 7410                    je	short L5
   143 00000056 3C0D                    cmp	al, 0Dh
   144 00000058 740C                    je	short L5
   145 0000005A 3C20                    cmp	al, 20h
   146 0000005C 7408                    je	short L5
   147 0000005E B007                    mov	al, 07h ; beep !
   148 00000060 B40E                    mov	ah, 0Eh ; tty write
   149 00000062 CD31                    int	31h	; TRDOS 386 Video Interrupt
   150 00000064 EBE8                    jmp	short L4 
   151                                  L5:
   152                                  ;mov	ax, 3	; set mode (to 80x25 color, text)	
   153 00000066 CD32                    int	32h	; TRDOS 386 - KEYBOARD Interrupt
   154                                  
   155                                  terminate:
   156                                  	sys 	_exit   ; INT 40h
   156                              <1> 
   156                              <1> 
   156                              <1> 
   156                              <1> 
   156                              <1>  %if %0 >= 2
   156                              <1>  mov ebx, %2
   156                              <1>  %if %0 >= 3
   156                              <1>  mov ecx, %3
   156                              <1>  %if %0 = 4
   156                              <1>  mov edx, %4
   156                              <1>  %endif
   156                              <1>  %endif
   156                              <1>  %endif
   156 00000068 B801000000          <1>  mov eax, %1
   156                              <1> 
   156 0000006D CD40                <1>  int 40h
   157                                  here:
   158 0000006F EBFE                    	jmp	short here
   159                                  
   160                                  print_msg:
   161 00000071 66BB0700                	mov	bx, 7
   162 00000075 B40E                            mov     ah, 0Eh
   163                                  pmsg_loop:
   164 00000077 AC                      	lodsb
   165 00000078 20C0                    	and	al, al
   166 0000007A 7404                    	jz	short pmsg_ok
   167 0000007C CD31                    	int	31h	; TRDOS 386 video interrupt
   168 0000007E EBF7                    	jmp	short pmsg_loop	
   169                                  pmsg_ok:
   170 00000080 B410                    	mov	ah, 10h ; Getchar
   171 00000082 CD32                    	int	32h	; TRDOS 386 keyboard interrupt
   172 00000084 C3                      	retn
   173                                  
   174 00000085 00                      db 	0
   175                                  prg_msg:
   176 00000086 4552444F47414E2054-     db	'ERDOGAN TAN - TRDOS 386 - DVMRW.PRG'
   176 0000008F 414E202D205452444F-
   176 00000098 5320333836202D2044-
   176 000000A1 564D52572E505247   
   177 000000A9 0D0A                    db 	0Dh, 0Ah,
   178 000000AB 31342F30372F323031-     db	'14/07/2016'
   178 000000B4 36                 
   179 000000B5 00                      db 	0
   180 000000B6 [B800]                  dw	_end
   181                                  _end:
