Exemplo n.º 1
0
        /// <summary>
        // CJRファイルにフッタブロックを追加する
        /// </summary>
        public void CloseCjrData()
        {
            byte[] barray;

            // フッタブロック
            cjrData.Add(2);
            cjrData.Add(0x2a);
            cjrData.Add(0xff);
            cjrData.Add(0xff);
            int endAddress = startAddress + 1;

            if (endAddress == 0x10000)
            {
                endAddress = 0;
            }
            barray = BitConverter.GetBytes(Convert.ToUInt16(endAddress));
            Array.Reverse(barray);
            BArraySupport.AddBytesToList(cjrData, barray);

            isClosed = true;
        }
Exemplo n.º 2
0
        /// <summary>
        /// BINをCJRに変換
        /// Appendすることで離れたアドレスへのロードをまとめられる
        /// Append時はJR用ファイル名はダミー(不使用)
        /// </summary>
        /// <param name="binData">bin ファイル</param>
        /// <param name="jrFileName">JR-200用のファイル名</param>
        /// <param name="startAddress">マシン語の場合のスタートアドレス。BASIC時はダミー</param>
        /// <param name="basic">BASICならtrue</param>
        /// <param name="append">appendするときはtrue</param>
        /// <returns>成功したらtrue</returns>
        public bool AddBinData(byte[] binData, string jrFileName, int sAddress, bool basic, bool append = false)
        {
            int checkSum = 0, pointer = 0, blockHead = 0;

            byte[] binArray;

            if (binData == null || (append && isClosed))
            {
                return(false);
            }

            startAddress = sAddress;
            if (basic)
            {
                startAddress = 0x801;
            }

            if (append && cjrData == null)
            {
                append = false;
            }

            if (!append)
            {
                blockCount = 0;
                cjrData    = new List <byte>(32768);
                isClosed   = false;

                // ヘッダブロック
                cjrData.Add(2);
                cjrData.Add(0x2a);
                cjrData.Add((byte)blockCount);
                cjrData.Add(0x1a);
                cjrData.Add(0xff);
                cjrData.Add(0xff);
                Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
                byte[]   bytes   = sjisEnc.GetBytes(jrFileName);
                BArraySupport.AddBytesToList(cjrData, bytes); // ファイル名
                for (int i = 0; i < 16 - bytes.Length; i++)
                {
                    cjrData.Add(0);
                }
                cjrData.Add((byte)(basic ? 0 : 1)); // マシン語 or BASIC
                cjrData.Add(0);                     // ボーレート

                cjrData.Add(0xff);
                cjrData.Add(0xff);
                cjrData.Add(0xff);
                cjrData.Add(0xff);
                cjrData.Add(0xff);
                cjrData.Add(0xff);
                cjrData.Add(0xff);
                cjrData.Add(0xff);

                for (int i = 0; i < cjrData.Count; i++)
                {
                    checkSum += (int)cjrData[i];
                }
                cjrData.Add((byte)checkSum);

                blockCount++;
            }

            // データブロック
            while (true)
            {
                blockHead = cjrData.Count;
                cjrData.Add(2);
                cjrData.Add(0x2a);
                cjrData.Add((byte)blockCount);
                cjrData.Add(0); // ダミー(ブロックサイズ)
                int sizePoint = cjrData.Count - 1;

                binArray = BitConverter.GetBytes(Convert.ToUInt16(startAddress));
                Array.Reverse(binArray);
                BArraySupport.AddBytesToList(cjrData, binArray);

                int j;
                for (j = 0; j < 256; j++)
                {
                    cjrData.Add(binData[pointer]);
                    ++pointer;
                    if (pointer == binData.Length)
                    {
                        break;
                    }
                }

                cjrData[sizePoint] = (byte)((j == 256) ? 0 : j + 1);

                // チェックサム計算
                checkSum = 0;
                for (int i = blockHead; i < cjrData.Count; i++)
                {
                    checkSum += (int)cjrData[i];
                }
                cjrData.Add((byte)checkSum);

                ++blockCount;
                startAddress += j;

                if (pointer == binData.Length)
                {
                    break;
                }
            }

            return(true);
        }