From 2854e3991ab66f6fb954aba96caf7875d049431e Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Sun, 4 May 2008 05:48:13 -0400 Subject: [PATCH 1/1] Yaaay, everything is posedge now --- GBZ80Core.v | 2 +- LCDC.v | 8 +-- System.v | 11 ++-- bootrom.asm | 172 ---------------------------------------------------- sim.cmd | 2 +- 5 files changed, 13 insertions(+), 182 deletions(-) diff --git a/GBZ80Core.v b/GBZ80Core.v index b06910a..9db958f 100644 --- a/GBZ80Core.v +++ b/GBZ80Core.v @@ -314,8 +314,8 @@ module GBZ80Core( opcode <= `INSN_VOP_INTR; else opcode <= {1'b0,busdata}; - rdata <= busdata; newcycle <= 0; + rdata <= busdata; cycle <= 0; end else begin if (rd) rdata <= busdata; diff --git a/LCDC.v b/LCDC.v index f951d3a..a198c45 100644 --- a/LCDC.v +++ b/LCDC.v @@ -27,7 +27,7 @@ module LCDC( /***** Internal clock that is stable and does not depend on CPU in single/double clock mode *****/ reg clk4 = 0; always @(posedge clk) - clk4 = ~clk4; + clk4 <= ~clk4; /***** LCD control registers *****/ reg [7:0] rLCDC = 8'h00; @@ -88,7 +88,7 @@ module LCDC( assign lcdcirq = (rSTAT[3] & mode00irq) | (rSTAT[4] & mode01irq) | (rSTAT[5] & mode10irq) | (rSTAT[6] & lycirq); assign vblankirq = (posx == 0 && posy == 153); - always @(negedge clk4) + always @(posedge clk4) begin if (posx == 455) begin posx <= 0; @@ -155,13 +155,12 @@ module LCDC( wire [11:0] tileaddr_in = vraminuse ? tileaddr : addr[12:1]; always @(posedge clk) + begin if ((vraminuse && ((posx == 2) || (vxpos[2:0] == 3'b111))) || decode_bgmap1) begin tileno <= bgmap1[bgmapaddr_in]; if (wr && decode_bgmap1 && ~vraminuse) bgmap1[bgmapaddr_in] <= data; end - - always @(posedge clk) if ((vraminuse && ((posx == 3) || (vxpos[2:0] == 3'b000))) || decode_tiledata) begin tilehigh <= tiledatahigh[tileaddr_in]; tilelow <= tiledatalow[tileaddr_in]; @@ -170,6 +169,7 @@ module LCDC( if (wr && ~addr[0] && decode_tiledata && ~vraminuse) tiledatalow[tileaddr_in] <= data; end + end /***** Bus interface *****/ assign data = rd ? diff --git a/System.v b/System.v index 8f54685..1872e51 100644 --- a/System.v +++ b/System.v @@ -6,12 +6,15 @@ module ROM( input clk, input wr, rd); + reg [7:0] odata; + // synthesis attribute ram_style of rom is block reg [7:0] rom [1023:0]; initial $readmemh("rom.hex", rom); wire decode = address[15:13] == 0; - wire [7:0] odata = rom[address[10:0]]; + always @(posedge clk) + odata <= rom[address[10:0]]; assign data = (rd && decode) ? odata : 8'bzzzzzzzz; endmodule @@ -21,11 +24,11 @@ module BootstrapROM( input clk, input wr, rd); - reg [7:0] rom [255:0]; - initial $readmemh("bootstrap.hex", rom); + reg [7:0] brom [255:0]; + initial $readmemh("bootstrap.hex", brom); wire decode = address[15:8] == 0; - wire [7:0] odata = rom[address[7:0]]; + wire [7:0] odata = brom[address[7:0]]; assign data = (rd && decode) ? odata : 8'bzzzzzzzz; endmodule diff --git a/bootrom.asm b/bootrom.asm index 4e780bf..26ba6e4 100644 --- a/bootrom.asm +++ b/bootrom.asm @@ -1,175 +1,3 @@ - SECTION "a",HOME[$00] - - LD SP,$fffe ; $0000 Setup Stack - - XOR A ; $0003 Zero the memory from $8000-$9FFF (VRAM) - LD HL,$9fff ; $0004 -Addr_0007: - LD [HLD],A ; $0007 - BIT 7,H ; $0008 - JR NZ, Addr_0007 ; $000a - - LD HL,$ff26 ; $000c Setup Audio - LD C,$11 ; $000f - LD A,$80 ; $0011 - LD [HLD],A ; $0013 - LD [C],A ; $0014 - INC C ; $0015 - LD A,$f3 ; $0016 - LD [C],A ; $0018 - LD [HLD],A ; $0019 - LD A,$77 ; $001a - LD [HLD],A ; $001c - - LD A,$fc ; $001d Setup BG palette - LD [$FF47],A ; $001f - - LD DE,$0104 ; $0021 Convert and load logo data from cart into Video RAM - LD HL,$8010 ; $0024 -Addr_0027: - LD A,[DE] ; $0027 - CALL a95 ; $0028 - CALL a96 ; $002b - INC DE ; $002e - LD A,E ; $002f - CP $34 ; $0030 - JR NZ, Addr_0027 ; $0032 - - LD DE,Addr_00D8 ; $0034 Load 8 additional bytes into Video RAM - LD B,$08 ; $0037 -Addr_0039: - LD A,[DE] ; $0039 - INC DE ; $003a - LD [HLI],A ; $003b - INC HL ; $003c - DEC B ; $003d - JR NZ, Addr_0039 ; $003e - - LD A,$19 ; $0040 Setup background tilemap - LD [$9910],A ; $0042 - LD HL,$992f ; $0045 -Addr_0048: - LD C,$0c ; $0048 -Addr_004A: - DEC A ; $004a - JR Z, Addr_0055 ; $004b - LD [HLD],A ; $004d - DEC C ; $004e - JR NZ, Addr_004A ; $004f - LD L,$0f ; $0051 - JR Addr_0048 ; $0053 - - ; === Scroll logo on screen, and play logo sound=== - -Addr_0055: - LD H,A ; $0055 Initialize scroll count, H=0 - LD A,$64 ; $0056 - LD D,A ; $0058 set loop count, D=$64 - LD [$FF42],A ; $0059 Set vertical scroll register - LD A,$91 ; $005b - LD [$FF40],A ; $005d Turn on LCD, showing Background - INC B ; $005f Set B=1 -Addr_0060: - LD E,$02 ; $0060 -Addr_0062: - LD C,$0c ; $0062 -Addr_0064: - LD A,[$FF44] ; $0064 wait for screen frame - CP $90 ; $0066 - JR NZ, Addr_0064 ; $0068 - DEC C ; $006a - JR NZ, Addr_0064 ; $006b - DEC E ; $006d - JR NZ, Addr_0062 ; $006e - - LD C,$13 ; $0070 - INC H ; $0072 increment scroll count - LD A,H ; $0073 - LD E,$83 ; $0074 - CP $62 ; $0076 $62 counts in, play sound #1 - JR Z, Addr_0080 ; $0078 - LD E,$c1 ; $007a - CP $64 ; $007c - JR NZ, Addr_0086 ; $007e $64 counts in, play sound #2 -Addr_0080: - LD A,E ; $0080 play sound - LD [C],A ; $0081 - INC C ; $0082 - LD A,$87 ; $0083 - LD [C],A ; $0085 -Addr_0086: - LD A,[$FF42] ; $0086 - SUB B ; $0088 - LD [$FF42],A ; $0089 scroll logo up if B=1 - DEC D ; $008b - JR NZ, Addr_0060 ; $008c - - DEC B ; $008e set B=0 first time - JR NZ, Addr_00E0 ; $008f ... next time, cause jump to "Nintendo Logo check" - - LD D,$20 ; $0091 use scrolling loop to pause - JR Addr_0060 ; $0093 - - ; ==== Graphic routine ==== - -a95: LD C,A ; $0095 "Double up" all the bits of the graphics data -a96: LD B,$04 ; $0096 and store in Video RAM -Addr_0098: - PUSH BC ; $0098 - RL C ; $0099 - RLA ; $009b - POP BC ; $009c - RL C ; $009d - RLA ; $009f - DEC B ; $00a0 - JR NZ, Addr_0098 ; $00a1 - LD [HLI],A ; $00a3 - INC HL ; $00a4 - LD [HLI],A ; $00a5 - INC HL ; $00a6 - RET ; $00a7 - -NintendoLogo: - ;Nintendo Logo - DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D - DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99 - DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E - -Addr_00D8: - ;More video data - DB $3C,$42,$B9,$A5,$B9,$A5,$42,$3C - - ; ===== Nintendo logo comparison routine ===== - -Addr_00E0: - LD HL,$0104 ; $00e0 ; point HL to Nintendo logo in cart - LD DE,NintendoLogo ; $00e3 ; point DE to Nintendo logo in DMG rom - -Addr_00E6: - LD A,[DE] ; $00e6 - INC DE ; $00e7 - CP [HL] ; $00e8 ;compare logo data in cart to DMG rom -.fuq JR NZ,.fuq ; $00e9 ;if not a match, lock up here - INC HL ; $00eb - LD A,L ; $00ec - CP $34 ; $00ed ;do this for $30 bytes - JR NZ, Addr_00E6 ; $00ef - - LD B,$19 ; $00f1 - LD A,B ; $00f3 -Addr_00F4: - ADD [HL] ; $00f4 - INC HL ; $00f5 - DEC B ; $00f6 - JR NZ, Addr_00F4 ; $00f7 - ADD [HL] ; $00f9 -.fuq: JR NZ,.fuq ; $00fa ; if $19 + bytes from $0134-$014D don't add to $00 - ; ... lock up - - LD A,$01 ; $00fc - LD [$FF50],A ; $00fe ;turn off DMG rom - - SECTION "b",HOME[$100] boot: jr .running ; $0100 nop ; $0102 diff --git a/sim.cmd b/sim.cmd index abd34ae..154489f 100644 --- a/sim.cmd +++ b/sim.cmd @@ -1,3 +1,3 @@ vcd dumpfile /proc/self/fd/[string range [open |./readout "w"] 4 1000] vcd dumpvars -m Dumpable -run 1000ms +run all -- 2.43.0