From abae5818eeec14c040361b5181ff1a31cad79868 Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Sun, 30 Mar 2008 23:34:09 -0400 Subject: [PATCH 1/1] Add RET/IRET. Fix a bug in RST where the PC pushed to the stack was incorrect. --- FPGABoy.ise | Bin 212305 -> 212301 bytes GBZ80Core.v | 48 +++++++++++++++++++++++++++++++++++++++++++++--- rom.hex | 24 ++++++------------------ 3 files changed, 51 insertions(+), 21 deletions(-) diff --git a/FPGABoy.ise b/FPGABoy.ise index 82604438fba61afd2e1d93f0f6cd10bdbc272ce1..491bbb39ff44986db2211e280d815011353a3f19 100644 GIT binary patch delta 25299 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 E5A{2}xc~qF delta 25244 zcmajH1$b0P)IL6Eu99R!f-NCHWC;m`7$I12_uvGF0>!OR9DhYJi8iWDeNTHGmC zv;<0l7I$}dO8K9A@19NA@ArNGeV**jJ@cOT$efuwSK!!tzZ38M*8Z8>N3C$b&&a<}7@hODAfGWYPdN9zXROKN zgagK*JT6C5Ii8HYIcB`c<4XI76(Z6#|H-+CZtPP{)koOW=Tjj>PqW*jaw|#1aLq>^ zOzo@VxxYTl#>8Jye6f0jsxIWUh81Nc2YWuuXHn(HbZKw54Np;xkJi_KAp)IQgglhfV^JNUVcv{aX*M3 zq5RdathOMQJ-^Gh$+Ii1)Q;5tdz?`_e|S;-xmua%cAZeq6W#M?@Q@sg-Y(xHwaZP7 zh52*Ux^hj5BWrE{mDW0jnV-}ZN*1zy<_|uN;;PY4T3})do1i`?*%dP2|609A22Mt>Fpood zjF3=Q!q4g)cSgatqw)h$pGsp+LhfnGs!)4+AERGrtpBS^azk1U_&j4xs55D_EKy!Z z$EtmZ=xih9G3D~&A6iawJwqP8Xleu(h>J*9!-;2GG4?CX3wfKIpKPU1H+mPS z4wsEB1>zvWxKki9=SVA|%s-2|p19K$!xd4QE02t}5p7|Du{*-$7|HU}&}^JxJc)1u z7+OJBLK&qbO`Hwu;3pdB&@_t8=*jGH^8`m|tn9K_D+ zBaN1kCCaX3?T9huu)L6LpY>PXk;e~C@eTTL+iLAK$_tV|8etrdbV7FHPGsq#>N|Bg znMx0qM^Hd-euW;ChFtU2uW3vUFr!hFtL8e8sJF;b_BYKK$3ymp+F6s7LzD*gP%iB@ z4^nhF_z{C|E-jpVyWCh=OTPVkRxV8V8&}zKPmR1$mJ;Uu zDAte?)VsV~)GY_-&nwcJT56=c-t;iPnWHoL*$E0MIKQ%m0$%;I(XUXlV>H`Ci}~n2 z#+pL8vOT&cPb6z6=CK<%FlP#-I5ul{$>+D5jl{yPn!mE!MBJ?l=>-(B}cZlFcuaLul4Y~a*#x8yU3#mI(sO;Lld^~QFe%um}L%2r9`yf zr{pKy1@jGObgci2kMa%@&8THGijH%1mWR2=jXhawOpVS}>)ai6Atn4sWhIj8_h}CH zgzWe|SB4PL3YlFdx&JlhM|Hj9KjTTX6Q&wkk>sSF(oFKV_dex2np^Tk%|!{k+>jk7 z9-rMz*2fqFi-gqm=UFLP2`+Upq0^@-m&ozwebglK=C`A~Bn?1`1#FY2Tw1gHIA}MD zlz{q1a7;Kq^3Et9;|!WFy`gE7Hd-A)Q|nY4qj!w6d2?wXx!wId0J#^C2KhYgbMOuA zu=1RglPGo9|CQfS>h6E5$~1Ianz5_s$d#B7@G(Bcm^)WztgCE1kD*#gdd<>_-N#Q! zCe3v&FMt*Gs9FsQrAp(K#+W?ZDq`l_%ZD z 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 R+VZ$5Z+=@%E^7|={|DJ diff --git a/GBZ80Core.v b/GBZ80Core.v index 75f9722..c0c2b26 100644 --- a/GBZ80Core.v +++ b/GBZ80Core.v @@ -35,6 +35,7 @@ `define INSN_ALU8 8'b10xxxxxx // 10 xxx yyy `define INSN_NOP 8'b00000000 `define INSN_RST 8'b11xxx111 +`define INSN_RET 8'b110x1001 // 1 = RETI, 0 = RET `define INSN_reg_A 3'b111 `define INSN_reg_B 3'b000 @@ -84,6 +85,8 @@ module GBZ80Core( reg [7:0] buswdata; assign busdata = buswr ? buswdata : 8'bzzzzzzzz; + reg ie = 0; + initial begin registers[ 0] <= 0; registers[ 1] <= 0; @@ -341,17 +344,19 @@ module GBZ80Core( end `INSN_RST: begin case (cycle) - 0: begin + 0: begin + `EXEC_INC_PC; // This goes FIRST + end + 1: begin wr <= 1; address <= {registers[`REG_SPH],registers[`REG_SPL]}-1; wdata <= registers[`REG_PCH]; end - 1: begin + 2: begin wr <= 1; address <= {registers[`REG_SPH],registers[`REG_SPL]}-2; wdata <= registers[`REG_PCL]; end - 2: begin /* wee */ end 3: begin `EXEC_NEWCYCLE; {registers[`REG_PCH],registers[`REG_PCL]} <= @@ -359,6 +364,23 @@ module GBZ80Core( end endcase end + `INSN_RET: begin + case (cycle) + 0: begin + rd <= 1; + address <= {registers[`REG_SPH],registers[`REG_SPL]}; + end + 1: begin + rd <= 1; + address <= {registers[`REG_SPH],registers[`REG_SPL]} + 1; + end + 2: begin /* twiddle thumbs */ end + 3: begin + `EXEC_NEWCYCLE; + // do NOT increment PC! + end + endcase + end default: $stop; endcase @@ -596,6 +618,26 @@ module GBZ80Core( end endcase end + `INSN_RET: begin + case (cycle) + 0: cycle <= 1; + 1: begin + cycle <= 2; + registers[`REG_PCL] <= rdata; + end + 2: begin + cycle <= 3; + registers[`REG_PCH] <= rdata; + end + 3: begin + cycle <= 0; + {registers[`REG_SPH],registers[`REG_SPL]} <= + {registers[`REG_SPH],registers[`REG_SPL]} + 2; + if (opcode[4]) /* RETI */ + ie <= 1; + end + endcase + end endcase state <= `STATE_FETCH; end diff --git a/rom.hex b/rom.hex index b54409e..0cef4b0 100644 --- a/rom.hex +++ b/rom.hex @@ -4,25 +4,13 @@ 01 // LD SP, HL F9 -// POP BC -C1 -// LD A, 10h -3E -10 -// ADD C -81 -// LD H, A -67 -// LD L, 34h -2E -34 -// XOR B -A8 -// LD (HL), A -77 +// RET +C9 + +@80 // RST 00h C7 @100 -02 -44 \ No newline at end of file +80 +00 \ No newline at end of file -- 2.43.0