diff options
| -rw-r--r-- | README.md | 22 | ||||
| -rw-r--r-- | hexedit/Makefile | 21 | ||||
| -rw-r--r-- | hexedit/hexedit.s | 122 | ||||
| -rw-r--r-- | hexedit/main.s | 13 | ||||
| -rw-r--r-- | hexedit/pico_ram_only.ld | 14 | 
5 files changed, 184 insertions, 8 deletions
| @@ -2,24 +2,30 @@  I'm starting over. -## Hexedit +## Octedit -This is a bare-minimum hex editor -which fits entirely within the 252-byte boot sector +This is a bare-minimum memory editor +which fits entirely within the 256-byte boot sector  of the Raspberry Pi Pico's on-board flash. -  Most of the space is dedicated  to setting up the clocks, GPIO, and UART. -Enter a series of octal halfwords +To use, enter a series of octal halfwords over UART  then press G to jump to the beginning of SRAM  and begin executing them as instructions. -  This is the first step in bootstrapping the whole system. -## Better editor +## Hexedit + +A more robust and user-friendly memory editor, +which uses hexadecimal instead of octal, +validates input characters, +and displays the address and contents +of the halfword currently being edited. -A more robust and user-friendly hex editor. +The machine code for this editor +can be keyed in using octedit +as a series of 16-bit octal halfwords.  ## Assembler diff --git a/hexedit/Makefile b/hexedit/Makefile new file mode 100644 index 0000000..4712bd1 --- /dev/null +++ b/hexedit/Makefile @@ -0,0 +1,21 @@ +all: build + +build: hexedit.uf2 + +hexedit.uf2: hexedit.elf +	../elf/elf2uf2 hexedit.elf hexedit.uf2 + +objects = hexedit.o main.o + +hexedit.elf: $(objects) +	arm-none-eabi-ld -T pico_ram_only.ld -o hexedit.elf $(objects) ../setup/setup.so + +$(objects): %.o: %.s +	arm-none-eabi-as -o $@ $< + +clean: +	rm hexedit.elf hexedit.uf2 *.o + +flash: hexedit.uf2 +	[ -h /dev/disk/by-label/RPI-RP2 ] || sleep 2s +	cat hexedit.uf2 > /dev/disk/by-label/RPI-RP2 diff --git a/hexedit/hexedit.s b/hexedit/hexedit.s new file mode 100644 index 0000000..fb42d91 --- /dev/null +++ b/hexedit/hexedit.s @@ -0,0 +1,122 @@ +.syntax unified +.cpu cortex-m0plus +.thumb + +.type SETUP, %function +.global SETUP + +.type UARTTX, %function +.type UARTRX, %function +.type SENDHEX, %function + +.align 4 + +SETUP:      LDR     R0, [PC, #16] // 000000 044004  UARTRX +            LDR     R1, [PC, #20] // 000002 044405  UARTTX +            LDR     R2, [PC, #20] // 000004 045005  SENDHEX +            MOV     R9, R0        // 000006 043201 +            MOV     R10, R1       // 000010 043212 +            MOV     R11, R2       // 000012 043223 +            LDR     R7, [PC, #4]  // 000014 047401  START ADDRESS +            ADDS    R6, R7, 1     // 000016 016176 +            B       MAINLOOP      // 000020 160010 +            .HWORD  0x0000        // 000022 000000 +            .WORD   UARTRX        // 000024 010243  0x200010A3 +                                  // 000026 040000 +            .WORD   UARTTX        // 000030 010225  0x20001095 +                                  // 000032 040000 +            .WORD   SENDHEX       // 000034 010264  0x200010B5 +                                  // 000036 040000 +            .WORD   0x20001000    // 000040 010000  START ADDRESS +                                  // 000042 020000 +MAINLOOP:   MOVS    R0, R7        // 000044 000070  PROMPT +            BLX     R11           // 000046 043730  SENDHEX +            MOVS    R0, 0x20      // 000050 020040  SPACE +            BLX     R10           // 000052 043720  UARTTX +            LDRH    R0, [R7]      // 000054 104070 +            BLX     R11           // 000056 043730  SENDHEX +            MOVS    R0, 0x0D      // 000060 020015  CARRIAGE RETURN +            BLX     R10           // 000062 043720  UARTTX +            MOVS    R0, R7        // 000064 000070 +            BLX     R11           // 000066 043730  SENDHEX +            MOVS    R0, 0x20      // 000070 020040  SPACE +            BLX     R10           // 000072 043720  UARTTX +10:         BLX     R9            // 000074 043710  COMMAND LOOP, UARTRX +            CMP     R0, 0x47      // 000076 024107  ASCII G +            BNE     20f           // 000100 150400 +            BX      R6            // 000102 043460 +20:         CMP     R0, 0x0D      // 000104 024015  CARRIAGE RETURN +            BNE     30f           // 000106 150401 +            ADDS    R7, 0x2       // 000110 033402 +            B       MAINLOOP      // 000112 163753 +30:         CMP     R0, 0x30      // 000114 024060  ASCII 0 +            BNE     MAINLOOP      // 000116 150751 +            BLX     R10           // 000120 043720  UARTTX +40:         BLX     R9            // 000122 043710  UARTRX +            CMP     R0, 0x78      // 000124 024170  ASCII x +            BNE     40b           // 000126 150774 +            BLX     R10           // 000130 043720  UARTTX +            MOVS    R4, 0         // 000132 022000 +            MOVS    R5, 4         // 000134 022404 +50:         BLX     R9            // 000136 043710  HEX LOOP, UARTRX +            CMP     R0, 0x30      // 000140 024060  ASCII 0 +            BLO     50b           // 000142 151774 +            CMP     R0, 0x39      // 000144 024071  ASCII 9 +            BLS     60f           // 000146 154406 +            CMP     R0, 0x41      // 000150 024101  ASCII A +            BLO     50b           // 000152 151770 +            CMP     R0, 0x46      // 000154 024106  ASCII F +            BHI     50b           // 000156 154366 +            BLX     R10           // 000160 043720  UARTTX +            SUBS    R0, 0x37      // 000162 034067  ASCII A MINUS 10 +            B       70f           // 000164 160001 +60:         BLX     R10           // 000166 043720  UARTTX +            SUBS    R0, 0x30      // 000170 034060  ASCII 0 +70:         LSLS    R4, 4         // 000172 000444 +            ADDS    R4, R0        // 000174 014044 +            SUBS    R5, 1         // 000176 036401 +            BNE     50b           // 000200 150755 +80:         BLX     R9            // 000202 043710  UARTRX +            CMP     R0, 0x0D      // 000204 024015  CARRIAGE RETURN +            BNE     80b           // 000206 150774 +            BLX     R10           // 000210 043720  UARTTX +            STRH    R4, [R7]      // 000212 100074 +            ADDS    R7, 0x2       // 000214 033402 +            MOVS    R0, 0x0A      // 000216 020012  NEW LINE +            BLX     R10           // 000220 043720  UARTTX +            B       MAINLOOP      // 000222 163707 +UARTTX:     LDR     R1, [PC, #24] // 000224 044406  UART0_BASE +            MOVS    R3, 0x20      // 000226 021440  TX FIFO FULL +1:          LDR     R2, [R1, 0x18]// 000230 067012  UARTFR_OFST +            TST     R2, R3        // 000232 041032 +            BNE     1b            // 000234 150774 +            STRB    R0, [R1]      // 000236 070010  UARTDR_OFST +            BX      LR            // 000240 043560 +UARTRX:     LDR     R1, [PC, #12] // 000242 044403 +            MOVS    R3, 0x10      // 000244 021420  RX FIFO EMPTY +1:          LDR     R2, [R1, 0x18]// 000246 067012  UARTFR_OFST +            TST     R2, R3        // 000250 041032 +            BNE     1b            // 000252 150774 +            LDRB    R0, [R1]      // 000254 074010  UARTDR_OFST +            BX      LR            // 000256 043560 +            .WORD   0x40034000    // 000260 040000 +                                  // 000262 040003 +SENDHEX:    PUSH    {LR}          // 000264 132400 +            LSLS    R4, R0, 0x10  // 000266 002004  16 BITS +            MOVS    R0, 0x30      // 000270 020060  ASCII 0 +            BLX     R10           // 000272 043720  UARTTX +            MOVS    R0, 0x78      // 000274 020170  ASCII x +            BLX     R10           // 000276 043720 +            MOVS    R5, 0x4       // 000300 022404 +0:          MOVS    R0, 0x1C      // 000302 020034 +            RORS    R4, R0        // 000304 040704 +            UXTB    R0, R4        // 000306 131340 +            CMP     R0, 0x9       // 000310 024011 +            BHI     1f            // 000312 154001 +            ADDS    R0, 0x30      // 000314 030060  ASCII 0 +            B       2f            // 000316 160000 +1:          ADDS    R0, 0x37      // 000320 030067  ASCII A MINUS 10 +2:          BLX     R10           // 000322 043720  UARTTX +            SUBS    R5, 1         // 000324 036401 +            BNE     0b            // 000326 150764 +            POP     {PC}          // 000330 136400 diff --git a/hexedit/main.s b/hexedit/main.s new file mode 100644 index 0000000..0b49339 --- /dev/null +++ b/hexedit/main.s @@ -0,0 +1,13 @@ +.syntax unified +.cpu cortex-m0plus +.thumb + +.type main, %function +.global main + +main: +  bl start_xosc +  bl setup_clocks +  bl setup_gpio +  bl setup_uart +  b SETUP diff --git a/hexedit/pico_ram_only.ld b/hexedit/pico_ram_only.ld new file mode 100644 index 0000000..1185af5 --- /dev/null +++ b/hexedit/pico_ram_only.ld @@ -0,0 +1,14 @@ +ENTRY(main) + +MEMORY { +  FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 2M +  SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 264K +} + +SECTIONS { +  .text : { +    main.o(.text); +    *(.text); +    . = ALIGN(4); +  } > SRAM +} | 
