1 ; **************************************************************************** 2 ; argon.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'argon.prg') 3 ; ---------------------------------------------------------------------------- 4 ; ARGON.PRG ! TEST program ! TRDOS 386 VGA Functionality test ! 5 ; 6 ; 14/08/2016 7 ; 8 ; [ Last Modification: 15/08/2016 ] 9 ; 10 ; Derived from disassembly of 'ARGON.COM' (ARGON.ASM, 1997) demo by Insomniac 11 ; 12 ; Assembler: NASM 2.11 13 ; 14 ; (Original -msdos- code has been modifed for TRDOS 386 system calls and 15 ; other protected mode (TRDOS 386) interrupts.) 16 ; **************************************************************************** 17 ; ARGON.ASM 18 ; FULL SOURCE-CODE TO THE 128-BYTE DEMO 19 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 20 ; Copyright (C) 1997 Matrix Software 21 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 22 ; code .Insomniac 23 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 24 25 ; 19/05/2016 26 ; 29/04/2016 27 ; TRDOS 386 system calls (temporary list!) 28 _ver equ 0 29 _exit equ 1 30 _fork equ 2 31 _read equ 3 32 _write equ 4 33 _open equ 5 34 _close equ 6 35 _wait equ 7 36 _creat equ 8 37 _link equ 9 38 _unlink equ 10 39 _exec equ 11 40 _chdir equ 12 41 _time equ 13 42 _mkdir equ 14 43 _chmod equ 15 44 _chown equ 16 45 _break equ 17 46 _stat equ 18 47 _seek equ 19 48 _tell equ 20 49 _mount equ 21 50 _umount equ 22 51 _setuid equ 23 52 _getuid equ 24 53 _stime equ 25 54 _quit equ 26 55 _intr equ 27 56 _fstat equ 28 57 _emt equ 29 58 _mdate equ 30 59 _video equ 31 60 _audio equ 32 61 _ilgins equ 33 62 _sleep equ 34 63 _msg equ 35 64 _geterr equ 36 65 _rsrvd1 equ 37 66 _pri equ 38 67 _rele equ 39 68 69 %macro sys 1-4 70 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 71 ; 03/09/2015 72 ; 13/04/2015 73 ; Retro UNIX 386 v1 system call. 74 %if %0 >= 2 75 mov ebx, %2 76 %if %0 >= 3 77 mov ecx, %3 78 %if %0 = 4 79 mov edx, %4 80 %endif 81 %endif 82 %endif 83 mov eax, %1 84 ;int 30h 85 int 40h ; TRDOS 386 (TRDOS v2.0) 86 %endmacro 87 88 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 89 ; sys systemcall (eax) , , 90 91 ; NOTE: Assembly source code of ARGON.COM (ARGON.ASM by Insomniac, 1997) 92 ; has been modified to NASM syntax for 386 protected mode & for TRDOS 386 93 ; by Erdogan Tan. (14/08/2016) 94 95 [BITS 32] ; 80386 Protected Mode (32 bit) intructions 96 97 [ORG 0] 98 99 start: 100 ; DIRECT VGA MEMORY ACCESS 101 ;xor ebx, ebx 102 00000000 B705 mov bh, 5 ; Direct access/map to VGA memory (0A0000h) 103 ;mov eax, _video ; 1Fh 104 00000002 B01F mov al, 1Fh ; sys _video ; TRDOS 386 Video functions 105 00000004 CD40 int 40h ; TRDOS 386 system call 106 107 ; eax = 0A0000h 108 00000006 21C0 and eax, eax 109 00000008 0F84B9000000 jz terminate ; error (eax = 0) 110 111 ; ah = 0 112 0000000E B013 mov al, 13h ; set video mode to 13h 113 ;int 10h ; - VIDEO - 114 00000010 CD31 int 31h ; TRDOS 386 - VIDEO Interrupt 115 116 ; CALCULATE SINE/COS - VALUES (Wally/Rage) 117 118 00000012 66B93F78 mov cx, 783Fh ; "don't ask me, I just use it.." 119 ;xor si, si 120 00000016 30FF xor bh, bh 121 00000018 66B8D9FF plc1: mov ax, 65497 122 0000001C 66F7E9 imul cx 123 0000001F 6601D6 add si, dx 124 00000022 6601F1 add cx, si 125 00000025 882B mov [ebx], ch 126 00000027 D03B sar byte [ebx], 1 127 00000029 664B dec bx 128 0000002B 6681FBFF3F cmp bx, 16383 129 00000030 75E6 jne short plc1 130 131 00000032 43 inc ebx ; BX points to the sine/cos-values 132 133 ; DRAW THE PLASMA-CURVES (Blue,Red) 134 135 00000033 BF00000A00 mov edi, 0A0000h ; "the beginning is a good place to start ;)" 136 00000038 89FE mov esi, edi 137 0000003A 6631C9 xor cx, cx 138 0000003D 66BA7C01 mov dx, 380 139 00000041 882F plc2: mov [edi], ch 140 00000043 88AF7C010000 mov [edi+380], ch 141 00000049 66BE7D01 mov si, 381 142 0000004D 6629FE sub si, di 143 00000050 882E mov [esi], ch 144 00000052 88AE7C010000 mov [esi+380], ch 145 00000058 6683C703 add di, 3 146 0000005C FEC5 inc ch 147 0000005E 80FD40 cmp ch, 64 ; "are we crossing eachother?" 148 00000061 75DE jne short plc2 149 150 00000063 BE00000A00 mov esi, 0A0000h ; "set a nice palette" 151 00000068 66BAC803 mov dx, 3C8h 152 ;out dx, al 153 0000006C B401 mov ah, 1 ; out (byte) 154 ; al = data byte 155 ; dx = port number 156 0000006E CD34 int 34h ; TRDOS 386 - IOCTL 157 158 00000070 6642 inc dx 159 00000072 66B90003 mov cx, 256*3 ; R,G,B - values 160 ;rep outsb 161 00000076 B401 mov ah, 1 ; out (byte) 162 pcl7: 163 00000078 AC lodsb 164 ; al = data byte 165 ; dx = port number 166 00000079 CD34 int 34h ; TRDOS 386 - IOCTL 167 0000007B 6649 dec cx 168 0000007D 75F9 jnz short pcl7 169 170 0000007F 6642 plc3: inc dx 171 00000081 B1C8 mov cl, 200 ; "yes Max-Y = 200.." 172 00000083 BF00000A00 mov edi, 0A0000h 173 174 00000088 88CB plc4: mov bl, cl 175 0000008A 00D3 add bl, dl 176 0000008C 8AB3[D0000000] mov dh, [ebx+_end] 177 00000092 30ED xor ch, ch 178 00000094 88F3 mov bl, dh 179 180 00000096 8A83[D0000000] plc5: mov al, [ebx+_end] 181 0000009C 28C8 sub al, cl 182 ;mov ah, al 183 0000009E 6698 cbw 184 000000A0 00F4 add ah, dh 185 000000A2 6629C8 sub ax, cx 186 000000A5 F6C101 test cl, 1 187 000000A8 7402 jz short plc6 188 189 000000AA 86E0 xchg ah, al 190 000000AC 66AB plc6: stosw ; "Use this since we have overlapping" 191 000000AE FEC3 inc bl 192 000000B0 FEC5 inc ch 193 000000B2 80FDA0 cmp ch, 160 ; "since we use STOSW, we only need 320/2" 194 000000B5 72DF jb short plc5 195 000000B7 FEC9 dec cl 196 000000B9 75CD jnz short plc4 197 198 000000BB B401 mov ah, 1 199 ;int 16h ; KEYBOARD - CHECK BUFFER, DO NOT CLEAR 200 ; Return: ZF clear if character in buffer 201 ; AH = scan code, AL = character 202 ; ZF set if no character in buffer 203 000000BD CD32 int 32h ; TRDOS 386 - KEYBOARD Interrupt 204 000000BF 74BE jz short plc3 205 206 000000C1 66B80300 mov ax, 3 207 ;int 10h ; - VIDEO - SET VIDEO MODE 208 ; AL = mode 209 000000C5 CD31 int 31h ; TRDOS 386 - VIDEO Interrupt 210 211 terminate: 212 sys _exit ; INT 40h 213 <1> 214 <1> 215 <1> 216 <1> 217 <1> %if %0 >= 2 218 <1> mov ebx, %2 219 <1> %if %0 >= 3 220 <1> mov ecx, %3 221 <1> %if %0 = 4 222 <1> mov edx, %4 223 <1> %endif 224 <1> %endif 225 <1> %endif 226 000000C7 B801000000 <1> mov eax, %1 227 <1> 228 000000CC CD40 <1> int 40h 229 here: 230 000000CE EBFE jmp short here 231 232 _end: