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