From: Joshua Wise Date: Fri, 4 Apr 2008 03:46:50 +0000 (-0400) Subject: JR and JRCC X-Git-Url: http://git.joshuawise.com/fpgaboy.git/commitdiff_plain/722e486a9ea69af1fdad7d0d31490bb2845881ec?ds=inline;hp=6b4e28281b4fa98272bead1eedeea577e8778169 JR and JRCC --- diff --git a/FPGABoy.ise b/FPGABoy.ise index d8f72a2..cf8e697 100644 Binary files a/FPGABoy.ise and b/FPGABoy.ise differ diff --git a/GBZ80Core.v b/GBZ80Core.v index 0697295..77c3649 100644 --- a/GBZ80Core.v +++ b/GBZ80Core.v @@ -42,6 +42,8 @@ `define INSN_JPCC_imm 8'b110xx010 `define INSN_ALU_A 8'b00xxx111 `define INSN_JP_HL 8'b11101001 +`define INSN_JR_imm 8'b00011000 +`define INSN_JRCC_imm 8'b001xx000 `define INSN_cc_NZ 2'b00 `define INSN_cc_Z 2'b01 @@ -485,6 +487,30 @@ module GBZ80Core( `INSN_JP_HL: begin `EXEC_NEWCYCLE; end + `INSN_JR_imm,`INSN_JRCC_imm: begin + case (cycle) + 0: begin + `EXEC_INC_PC; + `EXEC_NEXTADDR_PCINC; + rd <= 1; + end + 1: begin + `EXEC_INC_PC; + if (opcode[5]) begin // i.e., JP cc,nn + /* We need to check the condition code to bail out. */ + case (opcode[4:3]) + `INSN_cc_NZ: if (registers[`REG_F][7]) begin `EXEC_NEWCYCLE; end + `INSN_cc_Z: if (~registers[`REG_F][7]) begin `EXEC_NEWCYCLE; end + `INSN_cc_NC: if (registers[`REG_F][4]) begin `EXEC_NEWCYCLE; end + `INSN_cc_C: if (~registers[`REG_F][4]) begin `EXEC_NEWCYCLE; end + endcase + end + end + 2: begin + `EXEC_NEWCYCLE; + end + endcase + end default: $stop; endcase @@ -792,6 +818,15 @@ module GBZ80Core( {registers[`REG_PCH],registers[`REG_PCL]} <= {registers[`REG_H],registers[`REG_L]}; end + `INSN_JR_imm,`INSN_JRCC_imm: begin + case (cycle) + 0: begin /* type F */ end + 1: tmp <= rdata; + 2: {registers[`REG_PCH],registers[`REG_PCL]} <= + {registers[`REG_PCH],registers[`REG_PCL]} + + {tmp[7]?8'hFF:8'h00,tmp}; + endcase + end default: $stop; endcase diff --git a/rom.asm b/rom.asm index 02f095b..c2b7598 100644 --- a/rom.asm +++ b/rom.asm @@ -150,6 +150,24 @@ insntest: ld hl, .xorhlfail jp nz, .fail + ; Test JP (HL) + ld hl, .jphl + jp [hl] + ld hl, .jphlfail + jp .fail + rst $00 +.jphl: + + ; Test JR + ld a, $FF + ld b, $00 + cp b + jr nz,.jr + ld hl, .jrfail + jp .fail + rst $00 +.jr: + ; Test CP. ld hl, .cpfail ld a, $10 @@ -183,6 +201,10 @@ insntest: db $FF .xorhlfail: db "XOR [HL] test failed.",$0D,$0A,0 +.jphlfail: + db "JP [HL] test failed.",$0D,$0A,0 +.jrfail: + db "JR test failed.",$0D,$0A,0 .cpfail: db "CP test failed.",$0D,$0A,0 .cplfail: