コード例 #1
0
        private void readHandleFile(FileHandle hndl, ReadHandleRequest request)
        {
            this.kernelStorage.channelDevice.storage = 1;
            byte[] readBytes = new byte[request.amount];

            Resource response;
            uint     amountRead = 0;

            try
            {
                for (uint i = 0; i < request.amount; i++)
                {
                    amountRead++;
                    readBytes[i] = hndl.read();
                }
                response = new ReadHandleResponse(this.id, readBytes, 0, checked ((uint)request.amount), request.createdByProcess);
                //program.memAccesser.writeFromAddr(program.registers.DS + program.registers.A, readBytes);
            }
            catch (Exception e)
            {
                if (!e.Message.Contains("Reading file out of bounds"))
                {
                    throw e;
                }

                response = new ReadHandleResponse(this.id, readBytes, 1, checked ((uint)request.amount), request.createdByProcess);
                //program.memAccesser.writeFromAddr(program.registers.DS + program.registers.A, readBytes);
            }


            this.kernelStorage.channelDevice.storage = 0;
            kernelStorage.resources.add(response);
            request.release();
        }
コード例 #2
0
        private void readHandleBattery(Battery battery, ReadHandleRequest request)
        {
            Resource response = new ReadHandleResponse(this.id, battery.getStatus(), 0, checked ((uint)request.amount), request.createdByProcess);

            kernelStorage.resources.add(response);
            request.release();
        }
コード例 #3
0
        private void readHandleConsole(ConsoleDevice hndl, ReadHandleRequest request)
        {
            this.kernelStorage.channelDevice.console = 1;
            byte[] readBytes = hndl.readLine();

            Resource response;

            if (readBytes.Length > request.amount)
            {
                //program.memAccesser.writeFromAddr(program.registers.DS + program.registers.A, readBytes, program.registers.CX);
                //program.registers.A = 1;
                response = new ReadHandleResponse(this.id, readBytes, 1, checked ((uint)request.amount), request.createdByProcess);
            }
            else
            {
                uint len = checked ((uint)readBytes.Length);
                response = new ReadHandleResponse(this.id, readBytes, 0, checked ((uint)request.amount), request.createdByProcess);
                //program.memAccesser.writeFromAddr(program.registers.DS + program.registers.A, readBytes, len);
                //program.registers.CX = len;
                //program.registers.A = 0;
            }

            this.kernelStorage.channelDevice.console = 0;
            //program.registers.A = 0;
            //program.registers.SI = SiInt.None;
            kernelStorage.resources.add(response);
            request.release();
        }
コード例 #4
0
        private void readHandle(ReadHandleRequest request)
        {
            int    bytesToReadAmount = request.amount;
            Handle hndl = this.kernelStorage.handles[request.handle];

            if (hndl is FileHandle)
            {
                readHandleFile(hndl as FileHandle, request);
            }
            else if (hndl is ConsoleDevice)
            {
                readHandleConsole(hndl as ConsoleDevice, request);
            }
            else if (hndl is Battery)
            {
                readHandleBattery(hndl as Battery, request);
            }
        }