GBEのu16+i8、キャリーしてない場合はフラグを立てるっぽいな

前記事においてよくわからんなとかいってたやつ。単純にキャリーしないときにオンにするかんじやな。

.carry = (a ^ i ^ result) & 0x100 != 0を逆にして.carry = (a ^ i ^ result) & 0x100 == 0でよいかんじでした。

fn addU16ToSingedU8WithCarryHalf(a: u16, b: u8) u16OpResultWithCarryHalf {
    const n = @intCast(u16, bitClear(u8, b, 7));
    if (bitCheck(u8, b, 7)) {
        const i = 128 - n;
        const result = a -% i;
        return .{
            .result = result,
            .carry = (a ^ i ^ result) & 0x100 == 0,
            .half = (a ^ i ^ result) & 0x10 == 0,
            //.carry = (a & 0xff) -% (i & 0xff) < (a & 0xff),
            //.half = (a & 0xf) -% (i & 0xf) < (a & 0xf),
        };
    } else {
        const result = a +% n;
        return .{
            .result = result,
            .carry = (a ^ n ^ result) & 0x100 != 0,
            .half = (a ^ n ^ result) & 0x10 != 0,
        };
    
    }
}

GBEの16bit+8bitIntのときのフラグがよくわからん

ADD SP NLD HL SP+N命令においての引き算時のキャリーとハーフキャリーのフラグの建て方がよくわからんかってしばらく詰んでた。昔書いたコード適当にコピペしてパスしたけど、よくわからんままやな。普通の引き算とは違うフラグの建て方してるっぽいんだけど、なんでここだけこうなの。昔の僕はこのコードを自力で書くに至ったはずなんだが、なんも覚えてないという。

fn addU16ToSingedU8WithCarryHalf(a: u16, b: u8) u16OpResultWithCarryHalf {
    const n = @intCast(u16, bitClear(u8, b, 7));
    if (bitCheck(u8, b, 7)) {
        const i = 128 - n;
        const result = a -% i;
        return .{
            .result = result,
            //.carry = (a ^ i ^ result) & 0x100 != 0,
            //.half = (a ^ i ^ result) & 0x10 != 0,
            .carry = (a & 0xff) -% (i & 0xff) < (a & 0xff),
            .half = (a & 0xf) -% (i & 0xf) < (a & 0xf),
        };
    } else {
        const result = a +% n;
        return .{
            .result = result,
            .carry = (a ^ n ^ result) & 0x100 != 0,
            .half = (a ^ n ^ result) & 0x10 != 0,
        };
    
    }
}

fn ld16_hl_sp_n(self: *CPU) void {
    const n = self.fetch8();
    const a = addU16ToSingedU8WithCarryHalf(self.sp, n);
    self.setHL(a.result);
    self.setCarry(a.carry);
    self.setHalf(a.half);
    self.setNegative(false);
    self.setZero(false);
    self.tick();
}

fn add_sp_n(self: *CPU) void {
    const n = self.fetch8();
    const a = addU16ToSingedU8WithCarryHalf(self.sp, n);

    //std.debug.print("ADD SP:{x:0>4} N:{d:0>4} -> SP:{x:0>4} C:{d} H:{d}\n", .{self.sp, n, a.result, @boolToInt(a.carry), @boolToInt(a.half)});

    self.sp = a.result;
    self.setCarry(a.carry);
    self.setHalf(a.half);
    self.setNegative(false);
    self.setZero(false);
    self.tick();
    self.tick();
}

こういう結果になるらしいぞ。うーん。

ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0001 -> SP:0001 C:0 H:0
ADD SP:0001 N:0001 -> SP:0002 C:0 H:0
ADD SP:000f N:0001 -> SP:0010 C:0 H:1
ADD SP:0010 N:0001 -> SP:0011 C:0 H:0
ADD SP:001f N:0001 -> SP:0020 C:0 H:1
ADD SP:007f N:0001 -> SP:0080 C:0 H:1
ADD SP:0080 N:0001 -> SP:0081 C:0 H:0
ADD SP:00ff N:0001 -> SP:0100 C:1 H:1
ADD SP:0100 N:0001 -> SP:0101 C:0 H:0
ADD SP:0f00 N:0001 -> SP:0f01 C:0 H:0
ADD SP:1f00 N:0001 -> SP:1f01 C:0 H:0
ADD SP:1000 N:0001 -> SP:1001 C:0 H:0
ADD SP:7fff N:0001 -> SP:8000 C:1 H:1
ADD SP:8000 N:0001 -> SP:8001 C:0 H:0
ADD SP:ffff N:0001 -> SP:0000 C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1
ADD SP:0000 N:0255 -> SP:ffff C:0 H:0
ADD SP:0001 N:0255 -> SP:0000 C:1 H:1
ADD SP:000f N:0255 -> SP:000e C:1 H:1
ADD SP:0010 N:0255 -> SP:000f C:1 H:0
ADD SP:001f N:0255 -> SP:001e C:1 H:1
ADD SP:007f N:0255 -> SP:007e C:1 H:1
ADD SP:0080 N:0255 -> SP:007f C:1 H:0
ADD SP:00ff N:0255 -> SP:00fe C:1 H:1
ADD SP:0100 N:0255 -> SP:00ff C:0 H:0
ADD SP:0f00 N:0255 -> SP:0eff C:0 H:0
ADD SP:1f00 N:0255 -> SP:1eff C:0 H:0
ADD SP:1000 N:0255 -> SP:0fff C:0 H:0
ADD SP:7fff N:0255 -> SP:7ffe C:1 H:1
ADD SP:8000 N:0255 -> SP:7fff C:0 H:0
ADD SP:ffff N:0255 -> SP:fffe C:1 H:1

zigでゲームボーイエミュレータ書いてる

github/kmtoki/gbe-zig

エミュレータ開発用テストROMのgb_test_roms/cpu_instrsがパスしたのでcpuはざっくり書けたっぽい。過去にTypescriptとHaskellとRustで書いてて、TSはなんとか動いたけど、haskellとrustはcpuのテストをパスできなかったので三度目の正直ぎみ。

一番最初はrustで書き始めて、cpuの一命令ごとに関数呼び出しとかあかんやろとか適当なことを思って、命令を関数ではなくマクロで書いてしまったのでコンパイルがくっそ遅くなったのとエラーメッセージが読みにくくなったのでテストROMさえ回すことなく投げた。その次に、トライアンドエラーにおけるコンパイルのストレスをなくそうというのとブラウザで動かそうというモチベーションでTypescript/denoで書き始めた。低レイヤーの知識ゼロでなんにもわからない状態から始めたのと、既存エミュレータのコードは読まずに(daaで挫折してカンニングした)、英語読めないくせに英語ドキュメントしか見ないで実装するという謎の縛りプレイをやっていたので、数ヶ月かかりつつもなんとかブラウザで「ゼルダの伝説夢見る島」が動くようになった。その次に、haskellでとりあえずcpuざっくり書いたんだけど、コンパイル時間が10秒くらいかかるくせに、TS/deno版とくらべて4倍くらい遅いというかなしい結果になってしまって心折れた。lens/mtl/StateMonadでごりごりやっていったのがよくなかったのか、IOVectorが遅いのか、よくわからんけどちゃんと最適化すればどこまで早くなるのかは興味があるがコンパイルおそすぎて諦めてる。どこに最適化の余地があるのかもわからん。というかv8早すぎるだろ。

RustとかTSで書いたのが2年前で、Haskellで挫折したのが今年の夏で、なんかZig流行りだしたしこっちで試してみるかってなっていまここ。10日くらいでなんとなくcpu部分まで書けたんだけど、cpu_instrsテストをパスするまで一ヶ月かかってしまった。ここからこまかなタイミング合わせとか、ppuとか、apuとかやってるとまたどっかで詰んで終わらない感じになりそう。今回は詰んだら既存エミュのコードをカンニングしていくしかない。というかちょっと前に、tanakh先生が怒涛のエミュ実装祭りをやっていて、そのコードを見てしまったのでだいぶ影響されたコードになってしまった。良いことだろうけど。

zigで良かったところは、コンパイル早い、実行早い、黒魔術のないシンプルで素直な言語機能。便利だったのが、型が自明であれば、enumとかstructの名前を省略できる。`read(Register::IF)`と書かなければいけなさそうなところをread(.IF)と書けるのでありがたかった。おかげでinstructionの呼び出しが短く書けた。イマイチだったところはキャストがめんどい。@intCast(u16,0xff)と関数呼び出し的な文法で長ったらしい。演算子もデフォルトではオーバーフローするとランタイムエラーで落ちるので、GBEのケースでは255 + 1 // :u8255 +% 1と書く必要が多くあり、めんどい。あとはメモリ管理。人類には手動でメモリ管理するのは早すぎるとかなんとかは置いといて、ファイル一つ読むだけでも長くなる。

    pub fn readFile(allocator: std.mem.Allocator, path: []const u8) !ROM {
      const file = try std.fs.cwd().openFile(path, .{ .mode = .read_only });
      defer file.close();
      const stat = try file.stat();
      const buffer = try file.reader().readAllAlloc(allocator,stat.size);
      return parse(buffer);
    }


    pub fn main() !void {
      var gpa = std.heap.GeneralPurposeAllocator(.{}){};
      var path: []const u8 = "rom/gb_test_roms/cpu_instrs/cpu_instrs.gb";
      const rom = try ROM.readFile(gpa.allocator(), path);
    }

いちいちアロケーター引きずり回して開放も実装して(上記ではやってない)というのは、GCがないので当然ではあるし、その分軽くて早いという恩恵を受けるためにzig選んでいるわけだが、まぁめんどいよね。仕方がないというかなんというか。そのへんrustは上手だなと思うけど、使いこなすにはプログラム全体の構造をちゃんと把握して、所有権やライフタイムをきっちり理解した設計に最初からしないと破綻しがちというのは、クソザコナメクジの私にはつらい。場当たり的に書きながら考えるやり方なので、まぁしょうがないよね。

最近どうよ

  • 今日はつらかったです
  • ずっと辛い。そろそろ仕事辞めたい。そろそろもクソもずっと言ってるよな。五年前くらいから言ってる。限界が来たんだよ。五年間限界突破更新中という呪い
  • うっかりギター買ってしまった。落札できないと思って適当に出来心で寝る前にぽっちとしたら落札できていたという夜更け
    • 今は、YF-O18Bが手元にあるわけだが、RF-65が数日中に来るらしいぞ
    • YF-O18Bを売れば実質無料でRF-65をお迎えできそう
    • 問題はレッドサンバースト的な色なんだよな。ナチュラルカラーなら透けピックガードも妥協できるが...
  • 画像生成AIがやばいことになってる
    • 素人がそれっぽい絵をなんとなく生成して自分の文脈の素材に使えるというツール感が一般化しそう
    • いらすと屋淘汰されそう
    • しかし、生成の呪文や元絵など学習することはじゃっかんあるし、がちゃ要素もある
    • ツールとしてなじんでいくのだろうな
    • AIの学習素材に自分の絵を使うなという主張あり。なるほど
    • 人の学習素材に使った絵をAIが学習素材として使っていた場合、AIがただの上位互換になりうる
    • 人の営みもパクリみたいなもんすよね。
    • あ、はい。
  • くそツイしてる
    • ブログに書けばいいのにもったいないな
  • 新しいブログ作りたい
    • deno/freshを使いたいだけなのでは説
    • AWS/amplifyを使いたいだけなのでは説
    • スマホからも投稿したいな。今でもGithubにpushするだけだからできないことはないが、はてなと連動してないんだよな
    • GithubActionsとかでできそう。しらんけど
  • zigでゲームボーイエミュレーター書いてる
    • 一週間ほどでテストROMがとりあえずうごいたが、たぶんTimerで死んでる。なぜIMEをオンにせずにInterruptを待っているのか。スタックしてる。
    • ビルド早すぎて草。HaskellとはRustとはなんだったのか。
    • HaskellGBEもCPUまで書いたんだけど、ビルドに10秒くらいかかるくせに、昔書いたdeno/TS版より4倍くらい遅くて心折れた。なんでなん。
    • TSで書く前にRustで最初始めたんだけど、マクロごりごりやったのででコンパイルくっそ遅くなって、なげたんだよな。
    • zig、素直で簡単でめっちゃ楽。
  • 書きたくないこともあるよな
    • ある妄想に3月おわりくらいから取り憑かれている。人生が豊かになっている音がする。どうやったってクソだ
  • エアコンから水めっちゃ飛ぶ
    • 上に通気孔がある32インチ4kモニターにダイレクトアタックなんだが、とても良くない気がする
    • コップの中にも飛んでそうな気がするんですが、お腹ゆるいのはそのせいでしょうか
  • ヒロアカまとめ買いして読んだ
    • めっちゃよかった
  • 東京グールReまた読んでる
    • 有馬さん

時間切れだ。

Zigでマンデルブロ集合

zigが流行ってると聞いて。人類に手動メモリ管理はまだ早いんだよな。もっと脳が進化してくれないと難しい。足りない脳でやってくしかないのだ現代人たる我(々?)は。

SDLのビルドでつまづいたりした。自分でbuild.zigいじるのいやだったので、パッケージマネージャーであるところのgyroを使ってみたけどうまく動かなかった。直接git cloneして/libsにでも突っ込んどけばなんとかなるっぽい。SDL2-develもルートに置いとけば勝手に見てくれるっぽい。SDL.zigがビルド用のSdkを用意してくれてるのでそれ任せ。

const std = @import("std");
const SDL = @import("sdl2");
const math = std.math;
const complex = math.complex;

pub fn main() !void {
    try SDL.init(.{
        .video = true,
        .events = true,
        .audio = true,
    });
    defer SDL.quit();

    const height = 800;
    const width = 800;

    var window = try SDL.createWindow(
        "SDL.zig",
        .{ .centered = {} },
        .{ .centered = {} },
        width,
        height,
        .{ .vis = .shown },
    );
    defer window.destroy();

    var renderer = try SDL.createRenderer(window, null, .{ .accelerated = true });
    defer renderer.destroy();

    var texture = try SDL.createTexture(renderer, .rgba8888, .streaming, width, height);
    defer texture.destroy();

    var buf = std.mem.zeroes([width * height * 4]u8);
    var y: f32 = -2;
    var x: f32 = -2;
    var i: usize = 0;
    while (i < width * height * 4) : (i += 4) {
        const m = mandelbrot(x, y, 255);
        const c = @intCast(u8, m);
        const b = @floatToInt(u8, @fabs(@floor(x * @intToFloat(f32, m))) / 255);
        buf[i + 0] = c;
        buf[i + 1] = b;
        buf[i + 2] = c;
        buf[i + 3] = c;

        x += 0.005;
        if ((i / 4) % width == 0) {
            x = -2;
            y += 0.005;
        }
    }

    try texture.update(&buf, 4 * width, null);

    mainLoop: while (true) {
        while (SDL.pollEvent()) |ev| {
            switch (ev) {
                .quit => {
                    break :mainLoop;
                },
                .key_down => |key| {
                    switch (key.scancode) {
                        .q => break :mainLoop,
                        else => {},
                    }
                },
                else => {},
            }
        }

        try renderer.setColorRGB(0, 0, 0);
        try renderer.clear();
        try renderer.copy(texture, null, null);
        renderer.present();
    }
}

fn mandelbrot(x: f32, y: f32, limit: u32) u32 {
    const c = math.Complex(f32).init(x, y);
    var z = math.Complex(f32).init(0.0, 0.0);
    var n: u32 = 0;
    while (n < limit) : (n += 1) {
        z = z.mul(z).add(c);

        if (complex.abs(z) > 2) {
            return n;
        }
    }
    return 0;
}