     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) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    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:
