From f6c7387b482f9e4573a8e0f4b47afb2c395ad540 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Sun, 9 Jan 2011 17:08:55 +0100 Subject: [PATCH] bootromfun: sollte nach einem 'H' zweimal 'O' ausgeben und danach blockieren bis naechstes zeichen empfangen wird. nach diesem zeichen sollte die led2 ausgehen (d.h. er wechselt nun in den RAM modus). passiert aber ned :( (es wird nur ein 'O' nach dem 'H' augegeben und blockiert nicht) --- 2_isa/src/bootrom.s | 18 +++-- cpu/src/rom_b.vhd | 180 ++++++++++++++++++++++---------------------- 2 files changed, 102 insertions(+), 96 deletions(-) diff --git a/2_isa/src/bootrom.s b/2_isa/src/bootrom.s index dc484d7..2a46cfd 100644 --- a/2_isa/src/bootrom.s +++ b/2_isa/src/bootrom.s @@ -9,6 +9,10 @@ .define UART_TRANS_EMPTY, 0x1 .define UART_RECV_NEW, 0x2 + .define PBASE, 0x2030 + .define PADDR, 0x4 + .define PDATA, 0x8 + ;----- start: br+ main @@ -18,6 +22,8 @@ start: main: ldi r10, UART_BASE@lo ldih r10, UART_BASE@hi + ldi r11, PBASE@lo + ldih r11, PBASE@hi poll: ldw r3, UART_STATUS(r10) andx r3, UART_RECV_NEW @@ -61,7 +67,6 @@ recv_byte: ;----- recv_word: - xor r0, r0, r0 xor r1, r1, r1 call recv_byte or r1, r0, r1 @@ -79,13 +84,12 @@ recv_word: or r1, r0, r1 addi r0, r1, 0 - ret ;----- bootrom: - br tehend call recv_byte + br tehend xor r1, r1, r1 cmpi r0, 0x57 ; 'W' @@ -110,14 +114,14 @@ bootrom: bt_H: ldi r1, 0x4f ; 'O' call send_byte - ; br bootrom ; FIXME - br tehend + call send_byte + br bootrom bt_W: call recv_word ; receive addr - mov r6, r0 + stw r0, PADDR(r11) call recv_word ; receive instr - stx r0, 0(r6) + stw r0, PDATA(r11) ldi r1, 0x44 ; 'D' call send_byte br bootrom diff --git a/cpu/src/rom_b.vhd b/cpu/src/rom_b.vhd index 194b95c..36b3445 100644 --- a/cpu/src/rom_b.vhd +++ b/cpu/src/rom_b.vhd @@ -128,95 +128,97 @@ begin when "0000010" => data_out <= x"eb000008"; -- ret when "0000011" => data_out <= x"ed510000"; -- ldi r10, UART_BASE@lo when "0000100" => data_out <= x"ed500002"; -- ldih r10, UART_BASE@hi - when "0000101" => data_out <= x"e71d0000"; -- ldw r3, UART_STATUS(r10) - when "0000110" => data_out <= x"e2980010"; -- andx r3, UART_RECV_NEW - when "0000111" => data_out <= x"1b7fff03"; -- brzs+ poll - when "0001000" => data_out <= x"eb000985"; -- call recv_byte - when "0001001" => data_out <= x"e4088800"; -- xor r1, r1, r1 - when "0001010" => data_out <= x"ec800240"; -- cmpi r0, 0x48 - when "0001011" => data_out <= x"1b001901"; -- breq- bt_H - when "0001100" => data_out <= x"eb7ffc81"; -- br poll - when "0001101" => data_out <= x"e71d0000"; -- ldw r3, UART_STATUS(r10) - when "0001110" => data_out <= x"e2980008"; -- andx r3, UART_TRANS_EMPTY - when "0001111" => data_out <= x"0b7fff03"; -- brnz+ send_byte - when "0010000" => data_out <= x"e98d0008"; -- stb r1, UART_TRANS(r10) - when "0010001" => data_out <= x"eb000008"; -- ret - when "0010010" => data_out <= x"e5008008"; -- lrs r0, r1, 0 - when "0010011" => data_out <= x"eb7ffd05"; -- call send_byte - when "0010100" => data_out <= x"e500a008"; -- lrs r0, r1, 8 - when "0010101" => data_out <= x"eb7ffc05"; -- call send_byte - when "0010110" => data_out <= x"e500c008"; -- lrs r0, r1, 16 - when "0010111" => data_out <= x"eb7ffb05"; -- call send_byte - when "0011000" => data_out <= x"e500e008"; -- lrs r0, r1, 24 - when "0011001" => data_out <= x"eb7ffa05"; -- call send_byte - when "0011010" => data_out <= x"eb000008"; -- ret - when "0011011" => data_out <= x"e71d0000"; -- ldw r3, UART_STATUS(r10) - when "0011100" => data_out <= x"e2980010"; -- andx r3, UART_RECV_NEW - when "0011101" => data_out <= x"1b7fff03"; -- brzs+ recv_byte - when "0011110" => data_out <= x"e4000000"; -- xor r0, r0, r0 - when "0011111" => data_out <= x"e905000c"; -- ldb r0, UART_RECV(r10) - when "0100000" => data_out <= x"eb000008"; -- ret - when "0100001" => data_out <= x"e4000000"; -- xor r0, r0, r0 - when "0100010" => data_out <= x"e4088800"; -- xor r1, r1, r1 - when "0100011" => data_out <= x"eb7ffc05"; -- call recv_byte - when "0100100" => data_out <= x"e3080800"; -- or r1, r0, r1 - when "0100101" => data_out <= x"eb7ffb05"; -- call recv_byte - when "0100110" => data_out <= x"e508a000"; -- lls r1, r1, 8 - when "0100111" => data_out <= x"e3080800"; -- or r1, r0, r1 - when "0101000" => data_out <= x"eb7ff985"; -- call recv_byte - when "0101001" => data_out <= x"e508a000"; -- lls r1, r1, 8 - when "0101010" => data_out <= x"e3080800"; -- or r1, r0, r1 - when "0101011" => data_out <= x"eb7ff805"; -- call recv_byte - when "0101100" => data_out <= x"e508a000"; -- lls r1, r1, 8 - when "0101101" => data_out <= x"e3080800"; -- or r1, r0, r1 - when "0101110" => data_out <= x"e1008000"; -- addi r0, r1, 0 - when "0101111" => data_out <= x"eb000008"; -- ret - when "0110000" => data_out <= x"eb001701"; -- br tehend - when "0110001" => data_out <= x"eb7ff505"; -- call recv_byte - when "0110010" => data_out <= x"e4088800"; -- xor r1, r1, r1 - when "0110011" => data_out <= x"ec8002b8"; -- cmpi r0, 0x57 - when "0110100" => data_out <= x"1b000601"; -- breq- bt_W - when "0110101" => data_out <= x"ec800290"; -- cmpi r0, 0x52 - when "0110110" => data_out <= x"1b000881"; -- breq- bt_R - when "0110111" => data_out <= x"ec800288"; -- cmpi r0, 0x51 - when "0111000" => data_out <= x"1b000b01"; -- breq- bt_Q - when "0111001" => data_out <= x"ec8002a0"; -- cmpi r0, 0x54 - when "0111010" => data_out <= x"1b000d81"; -- breq- bt_T - when "0111011" => data_out <= x"ec800250"; -- cmpi r0, 0x4a - when "0111100" => data_out <= x"1b001001"; -- breq- bt_J - when "0111101" => data_out <= x"ed080278"; -- ldi r1, 0x4f - when "0111110" => data_out <= x"eb7fe785"; -- call send_byte - when "0111111" => data_out <= x"eb000f81"; -- br tehend - when "1000000" => data_out <= x"eb7ff085"; -- call recv_word - when "1000001" => data_out <= x"e1300000"; -- mov r6, r0 - when "1000010" => data_out <= x"eb7fef85"; -- call recv_word - when "1000011" => data_out <= x"ea830000"; -- stx r0, 0(r6) - when "1000100" => data_out <= x"ed080220"; -- ldi r1, 0x44 - when "1000101" => data_out <= x"eb7fe405"; -- call send_byte - when "1000110" => data_out <= x"eb7ff501"; -- br bootrom - when "1000111" => data_out <= x"eb7fed05"; -- call recv_word - when "1001000" => data_out <= x"e1100000"; -- mov r2, r0 - when "1001001" => data_out <= x"ed080230"; -- ldi r1, 0x46 - when "1001010" => data_out <= x"eb7fe185"; -- call send_byte - when "1001011" => data_out <= x"ea090000"; -- ldx r1, 0(r2) - when "1001100" => data_out <= x"eb7fe305"; -- call send_word - when "1001101" => data_out <= x"eb7ff181"; -- br bootrom - when "1001110" => data_out <= x"eb7fe985"; -- call recv_word - when "1001111" => data_out <= x"e1300000"; -- mov r6, r0 - when "1010000" => data_out <= x"eb7fe885"; -- call recv_word - when "1010001" => data_out <= x"e7830000"; -- stw r0, 0(r6) - when "1010010" => data_out <= x"ed080208"; -- ldi r1, 0x41 - when "1010011" => data_out <= x"eb7fdd05"; -- call send_byte - when "1010100" => data_out <= x"eb7fee01"; -- br bootrom - when "1010101" => data_out <= x"eb7fe605"; -- call recv_word - when "1010110" => data_out <= x"e1100000"; -- mov r2, r0 - when "1010111" => data_out <= x"ed080238"; -- ldi r1, 0x47 - when "1011000" => data_out <= x"eb7fda85"; -- call send_byte - when "1011001" => data_out <= x"e7090000"; -- ldw r1, 0(r2) - when "1011010" => data_out <= x"eb7fdc05"; -- call send_word - when "1011011" => data_out <= x"eb7fea81"; -- br bootrom - when "1011100" => data_out <= x"eb7fe285"; -- call recv_word - when "1011101" => data_out <= x"eb800000"; -- brr r0 + when "0000101" => data_out <= x"ed590180"; -- ldi r11, PBASE@lo + when "0000110" => data_out <= x"ed580002"; -- ldih r11, PBASE@hi + when "0000111" => data_out <= x"e71d0000"; -- ldw r3, UART_STATUS(r10) + when "0001000" => data_out <= x"e2980010"; -- andx r3, UART_RECV_NEW + when "0001001" => data_out <= x"1b7fff03"; -- brzs+ poll + when "0001010" => data_out <= x"eb000985"; -- call recv_byte + when "0001011" => data_out <= x"e4088800"; -- xor r1, r1, r1 + when "0001100" => data_out <= x"ec800240"; -- cmpi r0, 0x48 + when "0001101" => data_out <= x"1b001881"; -- breq- bt_H + when "0001110" => data_out <= x"eb7ffc81"; -- br poll + when "0001111" => data_out <= x"e71d0000"; -- ldw r3, UART_STATUS(r10) + when "0010000" => data_out <= x"e2980008"; -- andx r3, UART_TRANS_EMPTY + when "0010001" => data_out <= x"0b7fff03"; -- brnz+ send_byte + when "0010010" => data_out <= x"e98d0008"; -- stb r1, UART_TRANS(r10) + when "0010011" => data_out <= x"eb000008"; -- ret + when "0010100" => data_out <= x"e5008008"; -- lrs r0, r1, 0 + when "0010101" => data_out <= x"eb7ffd05"; -- call send_byte + when "0010110" => data_out <= x"e500a008"; -- lrs r0, r1, 8 + when "0010111" => data_out <= x"eb7ffc05"; -- call send_byte + when "0011000" => data_out <= x"e500c008"; -- lrs r0, r1, 16 + when "0011001" => data_out <= x"eb7ffb05"; -- call send_byte + when "0011010" => data_out <= x"e500e008"; -- lrs r0, r1, 24 + when "0011011" => data_out <= x"eb7ffa05"; -- call send_byte + when "0011100" => data_out <= x"eb000008"; -- ret + when "0011101" => data_out <= x"e71d0000"; -- ldw r3, UART_STATUS(r10) + when "0011110" => data_out <= x"e2980010"; -- andx r3, UART_RECV_NEW + when "0011111" => data_out <= x"1b7fff03"; -- brzs+ recv_byte + when "0100000" => data_out <= x"e4000000"; -- xor r0, r0, r0 + when "0100001" => data_out <= x"e905000c"; -- ldb r0, UART_RECV(r10) + when "0100010" => data_out <= x"eb000008"; -- ret + when "0100011" => data_out <= x"e4088800"; -- xor r1, r1, r1 + when "0100100" => data_out <= x"eb7ffc85"; -- call recv_byte + when "0100101" => data_out <= x"e3080800"; -- or r1, r0, r1 + when "0100110" => data_out <= x"eb7ffb85"; -- call recv_byte + when "0100111" => data_out <= x"e508a000"; -- lls r1, r1, 8 + when "0101000" => data_out <= x"e3080800"; -- or r1, r0, r1 + when "0101001" => data_out <= x"eb7ffa05"; -- call recv_byte + when "0101010" => data_out <= x"e508a000"; -- lls r1, r1, 8 + when "0101011" => data_out <= x"e3080800"; -- or r1, r0, r1 + when "0101100" => data_out <= x"eb7ff885"; -- call recv_byte + when "0101101" => data_out <= x"e508a000"; -- lls r1, r1, 8 + when "0101110" => data_out <= x"e3080800"; -- or r1, r0, r1 + when "0101111" => data_out <= x"e1008000"; -- addi r0, r1, 0 + when "0110000" => data_out <= x"eb000008"; -- ret + when "0110001" => data_out <= x"eb7ff605"; -- call recv_byte + when "0110010" => data_out <= x"eb001701"; -- br tehend + when "0110011" => data_out <= x"e4088800"; -- xor r1, r1, r1 + when "0110100" => data_out <= x"ec8002b8"; -- cmpi r0, 0x57 + when "0110101" => data_out <= x"1b000681"; -- breq- bt_W + when "0110110" => data_out <= x"ec800290"; -- cmpi r0, 0x52 + when "0110111" => data_out <= x"1b000901"; -- breq- bt_R + when "0111000" => data_out <= x"ec800288"; -- cmpi r0, 0x51 + when "0111001" => data_out <= x"1b000b81"; -- breq- bt_Q + when "0111010" => data_out <= x"ec8002a0"; -- cmpi r0, 0x54 + when "0111011" => data_out <= x"1b000e01"; -- breq- bt_T + when "0111100" => data_out <= x"ec800250"; -- cmpi r0, 0x4a + when "0111101" => data_out <= x"1b001081"; -- breq- bt_J + when "0111110" => data_out <= x"ed080278"; -- ldi r1, 0x4f + when "0111111" => data_out <= x"eb7fe805"; -- call send_byte + when "1000000" => data_out <= x"eb7fe785"; -- call send_byte + when "1000001" => data_out <= x"eb7ff801"; -- br bootrom + when "1000010" => data_out <= x"eb7ff085"; -- call recv_word + when "1000011" => data_out <= x"e7858004"; -- stw r0, PADDR(r11) + when "1000100" => data_out <= x"eb7fef85"; -- call recv_word + when "1000101" => data_out <= x"e7858008"; -- stw r0, PDATA(r11) + when "1000110" => data_out <= x"ed080220"; -- ldi r1, 0x44 + when "1000111" => data_out <= x"eb7fe405"; -- call send_byte + when "1001000" => data_out <= x"eb7ff481"; -- br bootrom + when "1001001" => data_out <= x"eb7fed05"; -- call recv_word + when "1001010" => data_out <= x"e1100000"; -- mov r2, r0 + when "1001011" => data_out <= x"ed080230"; -- ldi r1, 0x46 + when "1001100" => data_out <= x"eb7fe185"; -- call send_byte + when "1001101" => data_out <= x"ea090000"; -- ldx r1, 0(r2) + when "1001110" => data_out <= x"eb7fe305"; -- call send_word + when "1001111" => data_out <= x"eb7ff101"; -- br bootrom + when "1010000" => data_out <= x"eb7fe985"; -- call recv_word + when "1010001" => data_out <= x"e1300000"; -- mov r6, r0 + when "1010010" => data_out <= x"eb7fe885"; -- call recv_word + when "1010011" => data_out <= x"e7830000"; -- stw r0, 0(r6) + when "1010100" => data_out <= x"ed080208"; -- ldi r1, 0x41 + when "1010101" => data_out <= x"eb7fdd05"; -- call send_byte + when "1010110" => data_out <= x"eb7fed81"; -- br bootrom + when "1010111" => data_out <= x"eb7fe605"; -- call recv_word + when "1011000" => data_out <= x"e1100000"; -- mov r2, r0 + when "1011001" => data_out <= x"ed080238"; -- ldi r1, 0x47 + when "1011010" => data_out <= x"eb7fda85"; -- call send_byte + when "1011011" => data_out <= x"e7090000"; -- ldw r1, 0(r2) + when "1011100" => data_out <= x"eb7fdc05"; -- call send_word + when "1011101" => data_out <= x"eb7fea01"; -- br bootrom + when "1011110" => data_out <= x"eb7fe285"; -- call recv_word + when "1011111" => data_out <= x"eb800000"; -- brr r0 -- just nop until rom end! when others => data_out <= x"fd000000"; end case; -- 2.25.1