diff --git a/system/test_io/verilog/nanosoc_adp_manager.v b/system/test_io/verilog/nanosoc_adp_manager.v
index cf6c0d850b0f50781599a489030b5b37761179e1..7b3bc7712e57063c2d7b4f9e773ff65f80186654 100755
--- a/system/test_io/verilog/nanosoc_adp_manager.v
+++ b/system/test_io/verilog/nanosoc_adp_manager.v
@@ -12,7 +12,7 @@
 
 //`define ADPBASIC 1
 
-`define ADPFSMDESIGN 1
+//`define ADPFSMDESIGN 1
 
 module nanosoc_adp_manager // AHB initiator interface
    #(parameter PROMPT_CHAR          = "]"
@@ -77,6 +77,8 @@ localparam CMD_M   = 4'b1001;  // set read Mask
 localparam CMD_P   = 4'b1010;  // Poll hardware  (count)
 localparam CMD_U   = 4'b1011;  // (Binary) Upload (wordocunt) from addr++
 localparam CMD_V   = 4'b1100;  // match Value
+localparam CMD_B   = 4'b1101;  // Read byte, addr++
+localparam CMD_H   = 4'b1110;  // Read Halfword, addr++
 `endif
 
 
@@ -111,6 +113,10 @@ case (char8[7:0])
 "u": FNvalid_cmd = CMD_U;
 "V": FNvalid_cmd = CMD_V;
 "v": FNvalid_cmd = CMD_V;
+"B": FNvalid_cmd = CMD_B;
+"b": FNvalid_cmd = CMD_B;
+"H": FNvalid_cmd = CMD_H;
+"h": FNvalid_cmd = CMD_H;
 `endif
 default:
       FNvalid_cmd = 0;
@@ -571,11 +577,22 @@ always @(posedge HCLK or negedge HRESETn)
              begin adp_state <= ADP_SYSCTL; end
            end
          else if (FNvalid_cmd(adp_cmd) == CMD_R)
-           begin adp_size <= FNparam2size(adp_param[34:33]); ADP_BUSREADINC_next; adp_state <= ADP_READ;
+           begin adp_size <= 2'b10; ADP_BUSREADINC_next; adp_state <= ADP_READ;
 `ifndef ADPBASIC
              adp_count_dec <= 1'b1; // optional loop param
 `endif
-           end // no param required
+           end // param is optional count-down loop
+`ifndef ADPBASIC
+         else if (FNvalid_cmd(adp_cmd) == CMD_H)
+           begin adp_size <= 2'b01; ADP_BUSREADINC_next; adp_state <= ADP_READ;
+             adp_count_dec <= 1'b1; // optional loop param
+           end // param is optional count-down loop
+         else if (FNvalid_cmd(adp_cmd) == CMD_B)
+           begin adp_size <= 2'b00; ADP_BUSREADINC_next; adp_state <= ADP_READ;
+             adp_count_dec <= 1'b1; // optional loop param
+           end // param is optional count-down loop
+`endif
+
          else if (FNvalid_cmd(adp_cmd) == CMD_S)
            begin adp_state <= ADP_SYSCHK; end
          else if (FNvalid_cmd(adp_cmd) == CMD_W)
@@ -611,7 +628,7 @@ always @(posedge HCLK or negedge HRESETn)
                                                : (byteaddr[1:0] == 2'b10) ? {HRDATA32_i[15: 0],HRDATA32_i[31:16]} 
                                                : (byteaddr[1:0] == 2'b11) ? {HRDATA32_i[23: 0],HRDATA32_i[31:24]}
                                                : HRDATA32_i;
-                                 adp_bus_err <= HRESP_i; ADP_txchar_next("R"); adp_state <= ADP_ECHOBUS;
+                                 adp_bus_err <= HRESP_i; ADP_txchar_next(adp_cmd & 8'h5f); adp_state <= ADP_ECHOBUS;
                            end
          else begin
              ADP_BUSREADINC_next;
@@ -732,7 +749,9 @@ always @(posedge HCLK or negedge HRESETn)
          if (com_tx_done) begin
            if (banner) begin banner <= 0; adp_state <= STD_IOCHK; end
 `ifndef ADPBASIC
-           else if ((FNvalid_cmd(adp_cmd) == CMD_R) & |adp_count) //// non-zero count
+           else if ( ((FNvalid_cmd(adp_cmd) == CMD_R) |
+                      (FNvalid_cmd(adp_cmd) == CMD_H) |
+                      (FNvalid_cmd(adp_cmd) == CMD_B)) & |adp_count) //// non-zero count
              begin ADP_BUSREADINC_next; adp_count_dec <= 1'b1; adp_state <= ADP_READ; end //
 `endif
            else begin ADP_txchar_next(PROMPT_CHAR); adp_state <= ADP_PROMPT; end
diff --git a/system/testcodes/adp_demo/adp.cmd b/system/testcodes/adp_demo/adp.cmd
index 89934e9acde45e350ffdfebc5917cc2e8f229333..06ecc105ed9983e9a3ca622dcaae3a84f4e631f7 100644
--- a/system/testcodes/adp_demo/adp.cmd
+++ b/system/testcodes/adp_demo/adp.cmd
@@ -33,11 +33,11 @@ w 0xb7b6b5b4
 a
 a 0x80000000
 a
-r 0x8
+b 0x8
 a
 a 0x80000000
 a
-r 0x004
+h 0x004
 a
 a 0x80000000
 a