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) , , 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: