Exemplo n.º 1
0
 private void WriteMem(int value, int address, MemSize memSize)
 {
     if (memSize != MemSize.NONE)
     {
         m_mem[address] = value;
     }
 }
Exemplo n.º 2
0
        public virtual void MemSet(CommandQueue cq, byte value)
        {
            long   offset = 0;
            long   count  = MemSize.ToInt64();
            IntPtr p      = cq.EnqueueMapBuffer(this, true, MapFlags.WRITE, offset, count);
            byte * pBlock = (byte *)p.ToPointer();

            for (long i = 0; i < count; i++)
            {
                pBlock[i] = value;
            }
            cq.EnqueueUnmapMemObject(this, p);
            cq.Finish();
        }
Exemplo n.º 3
0
 public int MemValue(MemSize memSize, int address)
 {
     return(m_mem[address]);
 }
Exemplo n.º 4
0
        public void ClockPulse()
        {
            if (cahcedbp == -1)
            {
                cahcedbp = BasePointer;
            }

            insts += 1;

            /*fetch*/
            //the current instruction
            //TODO check FOR UNRECOGNIZED INSTRUCTONS
            OpCode inst = (OpCode)MemValue(MemSize.WORD, ProgramCounter);

            //the literal value used for push instruction
            int inlineLiteral = MemValue((MemSize)ArgSizeFromOpCode(inst), ProgramCounter + MemSizeToInt(InstructionSize));

            //the arguments passed to this opcode
            //BUG this can crash if ... there is nothing in the stack??? huh
            int stackArgB = MemValue(MemSize.WORD, StackPointer - MemSizeToInt(OperandSize));
            int stackArgA = MemValue(MemSize.WORD, StackPointer - 2 * MemSizeToInt(OperandSize));

            // the return address, stored one word below the cached base pointer (see implimentation of BEGINARGS and CALL)
            int returnAddress = MemValue(MemSize.WORD, BasePointer - MemSizeToInt(MemSize.WORD));

            // the old base pointer, stored two words below the cahced base pointer (see implimentation of BEGINARGS and CALL)
            int oldBp = MemValue(MemSize.WORD, BasePointer - 2 * MemSizeToInt(MemSize.WORD));

            /*decode*/
            //what is the new stack pointer
            int newSP = StackPointer;

            switch (inst)
            {
            //+2 word
            case OpCode.BEGINARGS:
                //pop none, push two word (old base pointer and room for return address)
                newSP = StackPointer + 2 * MemSizeToInt(MemSize.WORD);
                break;

            //+1 word
            case OpCode.PUSHW:
            case OpCode.PUSHBP:
            case OpCode.COPY:
                //pop none off stack, push word
                newSP = StackPointer + MemSizeToInt(MemSize.WORD);
                break;

            //+0 word
            //pop one word off stack, push word
            case OpCode.LW:
            case OpCode.NOT:
            case OpCode.NEG:
            // pop none, push none
            case OpCode.NOP:
                newSP = StackPointer;
                break;

            //-1 word
            //pop two word off stack, push word
            case OpCode.ADD:
            case OpCode.SUB:
            case OpCode.LESS:
            case OpCode.EQU:
            case OpCode.MUL:
            case OpCode.SLL:
            case OpCode.SRL:
            case OpCode.AND:
            case OpCode.OR:
            case OpCode.XOR:
            //pop word off stack, push none
            case OpCode.POPW:
            case OpCode.JMP:
            case OpCode.CALL:
                newSP = StackPointer - MemSizeToInt(MemSize.WORD);
                break;

            //-2 word
            case OpCode.SW:
            case OpCode.JIF:
                // pop two word, push none
                newSP = StackPointer - 2 * MemSizeToInt(MemSize.WORD);
                break;

            //BP-2 word
            case OpCode.RET:
                // set stack pointer to base pointer, pop two words
                newSP = BasePointer - 2 * MemSizeToInt(MemSize.WORD);
                break;

            //BP-1 word
            case OpCode.RETV:
                // set stack pointer to base pointer, pop two words, push word
                newSP = BasePointer - MemSizeToInt(MemSize.WORD);
                break;
            }

            //what is the new base pointer
            int newBp = BasePointer;

            switch (inst)
            {
            case OpCode.ADD:
            case OpCode.SUB:
            case OpCode.NEG:
            case OpCode.LESS:
            case OpCode.EQU:
            case OpCode.MUL:
            case OpCode.SLL:
            case OpCode.SRL:
            case OpCode.NOT:
            case OpCode.AND:
            case OpCode.OR:
            case OpCode.XOR:
            case OpCode.SW:
            case OpCode.JMP:
            case OpCode.JIF:
            case OpCode.PUSHBP:
            case OpCode.COPY:
            case OpCode.PUSHW:
            case OpCode.POPW:
            case OpCode.NOP:
                newBp = BasePointer;
                break;

            case OpCode.BEGINARGS:
                //cahce off the new bp start of function parameters/local variable space
                cahcedbp = StackPointer + 2 * MemSizeToInt(MemSize.WORD);
                newBp    = BasePointer;
                break;

            case OpCode.CALL:
                newBp = cahcedbp;
                break;

            case OpCode.RETV:
            case OpCode.RET:
                //point to old base pointer
                newBp = oldBp;
                break;
            }

            //what is the new program counter
            int newPC = ProgramCounter;

            switch (inst)
            {
            case OpCode.NOP:
            case OpCode.ADD:
            case OpCode.SUB:
            case OpCode.NEG:
            case OpCode.LESS:
            case OpCode.EQU:
            case OpCode.MUL:
            case OpCode.SLL:
            case OpCode.SRL:
            case OpCode.NOT:
            case OpCode.AND:
            case OpCode.OR:
            case OpCode.XOR:
            case OpCode.SW:
            case OpCode.LW:
            case OpCode.PUSHBP:
            case OpCode.COPY:
            case OpCode.POPW:
            case OpCode.BEGINARGS:
                newPC = ProgramCounter + MemSizeToInt(InstructionSize);
                break;

            case OpCode.PUSHW:
                //advance past word literal
                newPC = ProgramCounter + MemSizeToInt(InstructionSize) + MemSizeToInt(MemSize.WORD);
                break;

            case OpCode.JMP:
            case OpCode.CALL:
                newPC = stackArgB;
                break;

            case OpCode.JIF:
                if (stackArgA != 0)
                {
                    newPC = stackArgB;
                }
                else
                {
                    newPC = ProgramCounter + MemSizeToInt(InstructionSize);
                }
                break;

            case OpCode.RETV:
            case OpCode.RET:
                newPC = returnAddress;
                break;
            }

            //what is the source for the memory write
            AtlasWriteSource writeSource = AtlasWriteSource.DisableWrite;

            switch (inst)
            {
            case OpCode.JMP:
            case OpCode.JIF:
            case OpCode.RET:
            case OpCode.NOP:
                writeSource = AtlasWriteSource.DisableWrite;
                break;

            case OpCode.ADD:
            case OpCode.SUB:
            case OpCode.NEG:
            case OpCode.LESS:
            case OpCode.EQU:
            case OpCode.MUL:
            case OpCode.SLL:
            case OpCode.SRL:
            case OpCode.NOT:
            case OpCode.AND:
            case OpCode.OR:
            case OpCode.XOR:
                writeSource = AtlasWriteSource.Alu;
                break;

            case OpCode.LW:
                writeSource = AtlasWriteSource.LoadedMemory;
                break;

            case OpCode.SW:
            case OpCode.RETV:
            case OpCode.COPY:
                writeSource = AtlasWriteSource.ArgumentB;
                break;

            case OpCode.PUSHBP:
            case OpCode.BEGINARGS:
                writeSource = AtlasWriteSource.BasePointer;
                break;

            case OpCode.PUSHW:
                writeSource = AtlasWriteSource.Literal;
                break;

            case OpCode.CALL:
                writeSource = AtlasWriteSource.NextInstructionAddress;
                break;
            }

            //how much will be writen to memory
            MemSize bytesWritten = MemSize.NONE;

            switch (inst)
            {
            //0 word
            case OpCode.NOP:
            case OpCode.JMP:
            case OpCode.JIF:
            case OpCode.POPW:
            case OpCode.RET:
                bytesWritten = MemSize.NONE;
                break;

            //1 word
            case OpCode.ADD:
            case OpCode.SUB:
            case OpCode.NEG:
            case OpCode.LESS:
            case OpCode.EQU:
            case OpCode.MUL:
            case OpCode.SLL:
            case OpCode.SRL:
            case OpCode.NOT:
            case OpCode.AND:
            case OpCode.OR:
            case OpCode.XOR:
            case OpCode.LW:
            case OpCode.SW:
            case OpCode.PUSHBP:
            case OpCode.COPY:
            case OpCode.PUSHW:
            case OpCode.BEGINARGS:
            case OpCode.CALL:
            case OpCode.RETV:
                bytesWritten = MemSize.WORD;
                break;
            }

            //where in memory are we writing
            int writeAddress = 0; // 0 = invalid address/ NULL

            switch (inst)
            {
            //write disabled
            case OpCode.NOP:
            case OpCode.JMP:
            case OpCode.JIF:
            case OpCode.POPW:
            case OpCode.RET:
                writeAddress = 0;
                break;

            //replace top of stack
            case OpCode.LW:
            case OpCode.NEG:
            case OpCode.NOT:
                writeAddress = StackPointer - MemSizeToInt(MemSize.WORD);
                break;

            //write to memory address
            case OpCode.SW:
                writeAddress = stackArgA;
                break;

            //push
            case OpCode.PUSHBP:
            case OpCode.COPY:
            case OpCode.PUSHW:
            case OpCode.BEGINARGS:
                writeAddress = StackPointer;
                break;

            //pop two word, push
            case OpCode.ADD:
            case OpCode.SUB:
            case OpCode.LESS:
            case OpCode.EQU:
            case OpCode.MUL:
            case OpCode.SLL:
            case OpCode.SRL:
            case OpCode.AND:
            case OpCode.OR:
            case OpCode.XOR:
                writeAddress = StackPointer - 2 * MemSizeToInt(MemSize.WORD);
                break;

            //write in the space allocated by BEGINARGS
            case OpCode.CALL:
                writeAddress = cahcedbp - MemSizeToInt(MemSize.WORD);
                break;

            //push onto stack (after returning to the previos frame). oldSP = BasePointer - 2 * WORD, becasue in the last call frame we said BasePointer = StackPointer + 2 * WORD
            case OpCode.RETV:
                writeAddress = BasePointer - 2 * MemSizeToInt(MemSize.WORD);
                break;
            }

            /*Execute*/
            int aluResult  = ALUCalculation(inst, stackArgA, stackArgB);
            int loadResult = LoadMemory(inst, stackArgA, stackArgB);

            /*WriteBack*/
            int writeVal = 0;

            switch (writeSource)
            {
            case AtlasWriteSource.DisableWrite:
                writeVal = -1;
                break;

            case AtlasWriteSource.Alu:
                writeVal = aluResult;
                break;

            case AtlasWriteSource.LoadedMemory:
                writeVal = loadResult;
                break;

            case AtlasWriteSource.BasePointer:
                writeVal = BasePointer;
                break;

            case AtlasWriteSource.NextInstructionAddress:
                writeVal = ProgramCounter + 1;
                break;

            case AtlasWriteSource.Literal:
                writeVal = inlineLiteral;
                break;

            case AtlasWriteSource.ArgumentB:
                writeVal = stackArgB;
                break;
            }

            WriteMem(writeVal, writeAddress, bytesWritten);

            StackPointer   = newSP;
            BasePointer    = newBp;
            ProgramCounter = newPC;
        }
Exemplo n.º 5
0
 public static int MemSizeToInt(MemSize size)
 {
     return((int)size);
 }
Exemplo n.º 6
0
        public void MemSizeTest()
        {
            Assert.AreEqual(1024, MemSize.cNumBytesInKibibyte);
            Assert.AreEqual(Math.Pow(2, 20), MemSize.cNumBytesInMebibyte);
            Assert.AreEqual(Math.Pow(2, 30), MemSize.cNumBytesInGibibyte);
            Assert.AreEqual(Math.Pow(2, 40), MemSize.cNumBytesInTebibyte);

            Assert.AreEqual(1_000, MemSize.cNumBytesInKilobyte);
            Assert.AreEqual(1_000_000, MemSize.cNumBytesInMegabyte);
            Assert.AreEqual(1_000_000_000, MemSize.cNumBytesInGigabyte);
            Assert.AreEqual(1_000_000_000_000, MemSize.cNumBytesInTerabyte);

            var sz = new MemSize(0);

            Assert.AreEqual(0, sz.TotalBytes);
            Assert.AreEqual(0, sz.TotalKibibytes);
            Assert.AreEqual(0, sz.TotalMebibytes);
            Assert.AreEqual(0, sz.TotalGibibytes);
            Assert.AreEqual(0, sz.TotalTebibytes);
            Assert.AreEqual(0, sz.TotalKilobytes);
            Assert.AreEqual(0, sz.TotalMegabytes);
            Assert.AreEqual(0, sz.TotalGigabytes);
            Assert.AreEqual(0, sz.TotalTerabytes);
            Assert.AreEqual("0 bytes", sz.ToString("bytes"));
            Assert.AreEqual("0 bytes", sz.ToString("SI"));
            Assert.AreEqual("0.0 KB", sz.ToString("KB"));
            Assert.AreEqual("0.0 MB", sz.ToString("MB"));
            Assert.AreEqual("0.0 GB", sz.ToString("GB"));
            Assert.AreEqual("0.0 TB", sz.ToString("TB"));
            Assert.AreEqual("0 bytes", sz.ToString("IEC"));
            Assert.AreEqual("0.0 KiB", sz.ToString("KiB"));
            Assert.AreEqual("0.0 MiB", sz.ToString("MiB"));
            Assert.AreEqual("0.0 GiB", sz.ToString("GiB"));
            Assert.AreEqual("0.0 TiB", sz.ToString("TiB"));

            sz = new MemSize(1000);
            Assert.AreEqual(1000, sz.TotalBytes);
            Assert.AreEqual(1000.0 / 1024, sz.TotalKibibytes);
            Assert.AreEqual(1000.0 / Math.Pow(2, 20), sz.TotalMebibytes);
            Assert.AreEqual(1000.0 / Math.Pow(2, 30), sz.TotalGibibytes);
            Assert.AreEqual(1000.0 / Math.Pow(2, 40), sz.TotalTebibytes);
            Assert.AreEqual(1, sz.TotalKilobytes);
            Assert.AreEqual(.001, sz.TotalMegabytes);
            Assert.AreEqual(.000001, sz.TotalGigabytes);
            Assert.AreEqual(.000000001, sz.TotalTerabytes);
            Assert.AreEqual("1,000 bytes", sz.ToString("bytes"));
            Assert.AreEqual("1.0 KB", sz.ToString("SI"));
            Assert.AreEqual("1.0 KB", sz.ToString("KB"));
            Assert.AreEqual("0.0 MB", sz.ToString("MB"));
            Assert.AreEqual("0.0 GB", sz.ToString("GB"));
            Assert.AreEqual("0.0 TB", sz.ToString("TB"));
            Assert.AreEqual("1.0 KiB", sz.ToString("IEC"));
            Assert.AreEqual("1.0 KiB", sz.ToString("KiB"));
            Assert.AreEqual("0.0 MiB", sz.ToString("MiB"));
            Assert.AreEqual("0.0 GiB", sz.ToString("GiB"));
            Assert.AreEqual("0.0 TiB", sz.ToString("TiB"));

            sz = new MemSize(MemSize.cNumBytesInTebibyte);
            Assert.AreEqual(1.0, sz.TotalTebibytes);
            Assert.AreEqual($"{MemSize.cNumBytesInTebibyte:N0} bytes", sz.ToString("bytes"));
            Assert.AreEqual("1.0 TiB", sz.ToString());
            Assert.AreEqual("1.0 TiB", sz.ToString("IEC"));
            Assert.AreEqual($"{(MemSize.cNumBytesInTebibyte / MemSize.cNumBytesInKibibyte):N1} KiB", sz.ToString("KiB"));
            Assert.AreEqual($"{(MemSize.cNumBytesInTebibyte / MemSize.cNumBytesInMebibyte):N1} MiB", sz.ToString("MiB"));
            Assert.AreEqual($"{(MemSize.cNumBytesInTebibyte / MemSize.cNumBytesInGibibyte):N1} GiB", sz.ToString("GiB"));
            Assert.AreEqual("1.0 TiB", sz.ToString("TiB"));
            Assert.AreEqual("1.0 TB", sz.ToString("IEC*"));
            Assert.AreEqual($"{(MemSize.cNumBytesInTebibyte / MemSize.cNumBytesInKibibyte):N1} KB", sz.ToString("KiB*"));
            Assert.AreEqual($"{(MemSize.cNumBytesInTebibyte / MemSize.cNumBytesInMebibyte):N1} MB", sz.ToString("MiB*"));
            Assert.AreEqual($"{(MemSize.cNumBytesInTebibyte / MemSize.cNumBytesInGibibyte):N1} GB", sz.ToString("GiB*"));
            Assert.AreEqual("1.0 TB", sz.ToString("TiB*"));

            sz = new MemSize(123456789);
            Assert.AreEqual("Size is 123,456,789 bytes!", $"Size is {sz:bytes}!");
            Assert.AreEqual("Size is 123,456.8 KB!", $"Size is {sz:KB}!");
            Assert.AreEqual("Size is 123,456.789 KB!", $"Size is {sz:KB3}!");

            sz = MemSize.Parse("1MiB");
            Assert.AreEqual(MemSize.cNumBytesInMebibyte, sz.TotalBytes);
            Assert.AreEqual("1.0 MiB", sz.ToString("MiB"));

            sz = MemSize.Parse("1024MiB");
            Assert.AreEqual(MemSize.cNumBytesInGibibyte, sz.TotalBytes);
            Assert.AreEqual("1,024.0 MiB", sz.ToString("MiB"));

            sz = MemSize.Parse("1024");
            Assert.AreEqual(MemSize.cNumBytesInKibibyte, sz.TotalBytes);

            sz = MemSize.Parse("1MB");
            Assert.AreEqual(MemSize.cNumBytesInMegabyte, sz.TotalBytes);

            sz = MemSize.Parse("1MB", true);
            Assert.AreEqual(MemSize.cNumBytesInMebibyte, sz.TotalBytes);

            Assert.IsTrue(MemSize.TryParse("1MB", out sz));
            Assert.IsFalse(MemSize.TryParse("ASDF", out sz));
            Assert.IsFalse(MemSize.TryParse("NOT", out sz));
            Assert.IsFalse(MemSize.TryParse("1NOT", out sz));

            sz = ConvertEx.To <MemSize>("1MB");
            Assert.AreEqual(MemSize.cNumBytesInMegabyte, sz.TotalBytes);
        }
Exemplo n.º 7
0
        public async override Task <UploadResult> InvokeAsync(Stream data, string suggestedFileName, string mimeType, IProgress <TransferProgress> progress, CancellationToken cancellationToken)
        {
            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }

            Debug.Assert(UploaderInfo != null);
            Debug.Assert(UploaderInfo.Uploader != null);
            Debug.Assert(!string.IsNullOrWhiteSpace(suggestedFileName));
            Debug.Assert(!string.IsNullOrWhiteSpace(mimeType));

            // If the stream has a specific length, check if it exceeds the set maximum file size
            var mfs = UploaderInfo.Uploader.MaxFileSize;

            if (mfs.HasValue && mfs.Value > 0 && data.CanSeek)
            {
                var size = data.Length;
                if (size > mfs.Value)
                {
                    var memSize = new MemSize(mfs.Value);
                    throw new UploadException($"File is {memSize} in size, which is larger than the specified limit of {nameof(UploaderInfo.Uploader.MaxFileSize)}.");
                }
            }

            var uplInfo = UploaderInfo.Uploader;

            using var progressHandler = new ProgressMessageHandler(new HttpClientHandler());
            using var cl = new HttpClient(progressHandler);

            progressHandler.HttpSendProgress += (s, e) => progress.Report(TransferProgress.FromHttpProgressEventArgs(e));

            // Add the user-agent first, so the user can override it
            cl.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", SuggestedUserAgent);

            if (uplInfo.Headers != null)
            {
                foreach (var(header, value) in uplInfo.Headers)
                {
                    cl.DefaultRequestHeaders.TryAddWithoutValidation(header, value);
                }
            }

            var responseParser = uplInfo.ResponseParser;

            using var content = new MultipartFormDataContent();

            var postParams = uplInfo.PostParams;

            if (postParams is not null)
            {
                foreach (var(name, value) in postParams)
                {
                    content.Add(new StringContent(value), name);
                }
            }

            var fname = uplInfo.GetEffectiveFileName(suggestedFileName);

            Debug.Assert(!string.IsNullOrWhiteSpace(uplInfo.FileFormName));
            Debug.Assert(!string.IsNullOrWhiteSpace(fname));

            content.Add(new StreamContent(data), uplInfo.FileFormName, fname);

            Debug.Assert(!string.IsNullOrWhiteSpace(uplInfo.RequestUrl));

            var res = await cl.PostAsync(uplInfo.RequestUrl, content, cancellationToken).ConfigureAwait(false);

            if (!res.IsSuccessStatusCode)
            {
                throw new UploadException($"The servers of {UploaderInfo.Meta.Name} responded with the error {res.StatusCode}: \"{res.ReasonPhrase}\".");
            }

            var resStr = await res.Content.ReadAsStringAsync().ConfigureAwait(false);

            var urlTemplateSpec = responseParser.UrlTemplateSpec;

            // As the URL template is optional, we just take the entire response if it is not there
            if (urlTemplateSpec == null)
            {
                return(new UploadResult(this, resStr, DateTime.Now));
            }

            try
            {
                var imageUrl = urlTemplateSpec.Evaluate(resStr);
                Debug.Assert(!string.IsNullOrWhiteSpace(imageUrl));

                return(new UploadResult(this, imageUrl, DateTime.Now));
            }
            catch (UnableToFillTemplateException e)
            {
                throw new UploadException(e.Message, e);
            }
        }