     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                                  ; 14/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 VGA MEMORY 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 7465                    jz	short terminate ; error (eax = 0)
    96                                  
    97                                  ;call	read_font_bitmap
    98                                  
    99 0000000A BE[15010000]            mov     esi, prg_msg
   100 0000000F E864000000              call	print_msg
   101                                  
   102                                  ; SET VIDEO MODE TO 13H
   103 00000014 66B81300                mov	ax, 13h  ; set video mode 
   104                                  ;mov	al, 13h	 ; 320x200 linear, 256 colors, 0A0000h
   105 00000018 CD31                    int	31h	 ; TRDOS 386 Video Interrupt
   106                                  
   107 0000001A B007                    mov	al, 07h ; beep !
   108 0000001C B40E                    mov	ah, 0Eh ; tty write
   109 0000001E 66BB0000                mov	bx, 0
   110 00000022 CD31                    int	31h	; TRDOS 386 Video Interrupt
   111                                  
   112                                  ; Write rectangle pixels to VGA memory 
   113                                  ; (as it is mapped to user's memory space) 
   114                                  
   115 00000024 BF00000A00              mov	edi, 0A0000h
   116                                  ;mov	ah, 0FFh
   117                                  ;xor	eax, eax
   118 00000029 B8F0F0F0F0              mov	eax, 0F0F0F0F0h
   119 0000002E B905000000              mov	ecx, 5
   120                                  L1:
   121 00000033 51                      push	ecx
   122 00000034 B128                    mov	cl, 40
   123                                  L2:
   124 00000036 51                      push	ecx
   125 00000037 B104                    mov	cl, 4 ; 4*(40+40) = 320
   126                                  L3:
   127 00000039 51                      push	ecx
   128 0000003A B10A                    mov	cl, 10
   129 0000003C F7D0                    not	eax ; FFFFFFFFh
   130 0000003E F3AB                    rep	stosd
   131 00000040 B10A                    mov	cl, 10
   132 00000042 F7D0                    not	eax ; 00000000h
   133 00000044 F3AB                    rep	stosd
   134 00000046 59                      pop	ecx
   135 00000047 E2F0                    loop	L3
   136 00000049 59                      pop	ecx
   137 0000004A E2EA                    loop	L2
   138 0000004C F7D0                    not	eax ; FFFFFFFFh
   139 0000004E 59                      pop	ecx
   140 0000004F E2E2                    loop	L1
   141                                  L4:
   142                                  
   143 00000051 B400                    mov	ah, 0	; read char from keyboard buffer
   144 00000053 CD32                    int	32h	; TRDOS 386 - KEYBOARD Interrupt
   145 00000055 3C1B                    cmp	al, 1Bh
   146 00000057 7410                    je	short L5
   147 00000059 3C0D                    cmp	al, 0Dh
   148 0000005B 740C                    je	short L5
   149 0000005D 3C20                    cmp	al, 20h
   150 0000005F 7408                    je	short L5
   151 00000061 B007                    mov	al, 07h ; beep !
   152 00000063 B40E                    mov	ah, 0Eh ; tty write
   153 00000065 CD31                    int	31h	; TRDOS 386 Video Interrupt
   154 00000067 EBE8                    jmp	short L4 
   155                                  
   156                                  L5:
   157                                  ;call	save_font_bitmap
   158                                  
   159 00000069 66B80300                mov	ax, 3	; set mode (to 80x25 color, text)
   160                                  ;mov	bx, 0	
   161 0000006D CD31                    int	31h	; TRDOS 386 Video Interrupt
   162                                  
   163                                  terminate:
   164                                  	sys 	_exit   ; INT 40h
   164                              <1> 
   164                              <1> 
   164                              <1> 
   164                              <1> 
   164                              <1>  %if %0 >= 2
   164                              <1>  mov ebx, %2
   164                              <1>  %if %0 >= 3
   164                              <1>  mov ecx, %3
   164                              <1>  %if %0 = 4
   164                              <1>  mov edx, %4
   164                              <1>  %endif
   164                              <1>  %endif
   164                              <1>  %endif
   164 0000006F B801000000          <1>  mov eax, %1
   164                              <1> 
   164 00000074 CD40                <1>  int 40h
   165                                  here:
   166 00000076 EBFE                    	jmp	short here
   167                                  
   168                                  print_msg:
   169 00000078 66BB0700                	mov	bx, 7
   170 0000007C B40E                            mov     ah, 0Eh
   171                                  pmsg_loop:
   172 0000007E AC                      	lodsb
   173 0000007F 20C0                    	and	al, al
   174 00000081 7404                    	jz	short pmsg_ok
   175 00000083 CD31                    	int	31h	; TRDOS 386 video interrupt
   176 00000085 EBF7                    	jmp	short pmsg_loop	
   177                                  pmsg_ok:
   178 00000087 B410                    	mov	ah, 10h ; Getchar
   179 00000089 CD32                    	int	32h	; TRDOS 386 keyboard interrupt
   180 0000008B C3                      	retn
   181                                  
   182                                  read_font_bitmap:
   183                                  	;in: edi=4k buffer
   184                                  	;out: buffer filled with font
   185                                  	;clear even/odd mode
   186 0000008C BE00000A00              	mov	esi, 0A0000h
   187 00000091 BF[48010000]            	mov	edi, _end
   188 00000096 EB0A                    	jmp	short load_save_bitmap
   189                                  save_font_bitmap:
   190                                  	;in: esi=4k buffer
   191                                  	;out: fonts will be loadeds
   192 00000098 BE[48010000]                    mov     esi, _end
   193 0000009D BF00000A00              	mov	edi, 0A0000h
   194                                  load_save_bitmap:
   195                                  	;in: edi=4k buffer
   196                                  	;out: buffer filled with font
   197                                  	;clear even/odd mode
   198 000000A2 66BACE03                	mov	dx, 03ceh
   199 000000A6 66B80500                	mov	ax, 5
   200 000000AA E856000000              	call	_outw
   201                                  	;map VGA memory to 0A0000h
   202 000000AF 66B80604                	mov	ax, 0406h
   203 000000B3 E84D000000              	call	_outw
   204                                  	;set bitplane 2
   205 000000B8 66BAC403                	mov	dx, 03c4h
   206 000000BC 66B80204                	mov	ax, 0402h
   207 000000C0 E840000000              	call	_outw
   208                                  	;clear even/odd mode (the other way, don't ask why)
   209 000000C5 66B80406                	mov	ax, 0604h
   210 000000C9 E837000000              	call	_outw
   211                                  	;copy charmap
   212 000000CE B900010000                      mov     ecx, 256
   213                                  	;copy 16 bytes to bitmap
   214                                  _@@:
   215 000000D3 A5                      	movsd
   216 000000D4 A5                      	movsd
   217 000000D5 A5                      	movsd
   218 000000D6 A5                      	movsd
   219                                  	;skip another 16 bytes
   220 000000D7 83C610                  	add	esi, 16
   221 000000DA E2F7                            loop    _@@
   222                                  	;restore VGA state to normal operation
   223 000000DC 66B80203                	mov	ax, 0302h
   224 000000E0 E820000000              	call	_outw
   225 000000E5 66B80402                	mov	ax, 0204h
   226 000000E9 E817000000              	call	_outw
   227 000000EE 66BACE03                	mov	dx, 03ceh
   228 000000F2 66B80510                	mov	ax, 1005h
   229 000000F6 E80A000000              	call	_outw
   230 000000FB 66B8060E                	mov	ax, 0E06h
   231 000000FF E801000000              	call	_outw
   232 00000104 C3                      	retn
   233                                  
   234                                  ;_inb:
   235                                  ;	mov	ah, 0
   236                                  ;	int	34h
   237                                  ;	retn
   238                                  ;_outb:
   239                                  ;	mov	ah, 1
   240                                  ;	int	34h
   241                                  ;	retn	
   242                                  ;_inw:
   243                                  ;	push	ax
   244                                  ;	mov	ah, 2
   245                                  ;	int	34h
   246                                  ;	pop	ax
   247                                  ;	mov	al, ah
   248                                  ;	mov	ah, 2
   249                                  ;	int	34h
   250                                  ;	retn
   251                                  _outw:
   252 00000105 6650                    	push	ax
   253 00000107 B403                    	mov	ah, 3
   254 00000109 CD34                    	int	34h
   255 0000010B 6658                    	pop	ax
   256 0000010D 88E0                    	mov	al, ah
   257 0000010F B403                    	mov	ah, 3
   258 00000111 CD34                    	int	34h
   259 00000113 C3                      	retn	
   260                                  
   261 00000114 00                      db 	0
   262                                  prg_msg:
   263 00000115 4552444F47414E2054-     db	'ERDOGAN TAN - TRDOS 386 - DVMRW.PRG'
   263 0000011E 414E202D205452444F-
   263 00000127 5320333836202D2044-
   263 00000130 564D52572E505247   
   264 00000138 0D0A                    db 	0Dh, 0Ah,
   265 0000013A 32392F30372F323031-     db	'29/07/2016'
   265 00000143 36                 
   266 00000144 00                      db 	0
   267 00000145 90                      align 2
   268 00000146 [4801]                  dw	_end
   269                                  _end:
