Skip to content

Commit

Permalink
UPLOAD and BOOT from FORTH
Browse files Browse the repository at this point in the history
  • Loading branch information
dalnefre committed Jul 6, 2014
1 parent 6f978a9 commit 238a4c7
Show file tree
Hide file tree
Showing 5 changed files with 7 additions and 134 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
*.o
*.list
*.sym
*.hex
*.elf
*.img
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ The interpreter uses the RPi miniUART as a console (115200 baud, 8 data bits, no
If you have _pijFORTHos_ on an SD card in the RPi,
you can connect it to another machine (even another RPi) using a USB-to-Serial cable <http://www.adafruit.com/products/954>.
When the RPi is powered on (I provide power through the cable),
a terminal program on the host machine provides access to the FORTH console.
a terminal program on the host machine allows access to the FORTH console.

## Build and run instructions

Expand All @@ -35,14 +35,14 @@ If you are building on the RPi, just type:

Then, copy the firmware and kernel to a blank SD card:

$ cp firmware/* /media/_SD-card_
$ cp kernel.img /media/_SD-card_
$ cp firmware/* /media/<var>SD-card</var>
$ cp kernel.img /media/<var>SD-card</var>

Put the prepared SD card into the RPi, connect the USB-to-Serial cable, and power-up to the console.

## Built-in FORTH Words

The table below shows the words pre-defined in _pijFORTHos_ :
The following words are pre-defined in _pijFORTHos_

| Word | Stack | Description |
|------|-------|-------------|
Expand Down
5 changes: 2 additions & 3 deletions jonesforth.s
Original file line number Diff line number Diff line change
Expand Up @@ -1191,11 +1191,11 @@ defcode "CHAR",4,,CHAR
NEXT

@ UPLOAD ( -- addr len ) XMODEM file upload to memory
defcode "UPLOAD",4,,UPLOAD
defcode "UPLOAD",6,,UPLOAD
ldr r0, =0x10000 @ Upload buffer address
ldr r1, =0x7F00 @ Upload limit (32k - 256) bytes
PUSHDSP r0 @ Push buffer address on the stack
bl hexdump @ r0 = rcv_xmodem(r0, r1);
bl rcv_xmodem @ r0 = rcv_xmodem(r0, r1);
PUSHDSP r0 @ Push upload byte count on the stack
NEXT

Expand All @@ -1207,7 +1207,6 @@ defcode "DUMP",4,,DUMP
NEXT

@ BOOT ( addr len -- ) Boot from memory image (see UPLOAD)
@ : BOOT DROP EXECUTE ; \ Equivalent FORTH definition
defcode "BOOT",4,,BOOT
POPDSP r0
POPDSP r1
Expand Down
50 changes: 0 additions & 50 deletions raspberry.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,7 @@ extern void PUT_32(u32 addr, u32 data);
extern u32 GET_32(u32 addr);
extern void NO_OP();
extern void BRANCH_TO(u32 addr);
extern void asm_stack(u32* buf);
extern void asm_copy32(u32* dst, u32* src, int len);
extern u32 asm_himem(u32 id);
extern u32 asm_safe(u32 id);
extern void BOOT(int len);
extern u32 XBOOT(u32 dst, u32 src, u32 len);

/* Declare FORTH entry-point */
extern void jonesforth();
Expand Down Expand Up @@ -469,28 +464,6 @@ int wait_for_kb()
#define UPLOAD_ADDR (0x10000)
#define UPLOAD_LIMIT (0x7F00)

static const u8 src[256] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
};

static char dst[256] =
"Don't Tread on Bees!\r\nTHE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.\n\0";

/*
* Entry point for C code
*/
Expand All @@ -510,7 +483,6 @@ void k_start(u32 sp)
uart1_puts("pijFORTHos 0.1.3 ");
uart1_puts("sp=0x");
uart1_hex32(sp);
// uart1_hex32(asm_safe(0xDEADBEEF));
uart1_eol();
uart1_puts("^D=exit-monitor ^Z=toggle-hexadecimal ^L=xmodem-upload");
uart1_eol();
Expand Down Expand Up @@ -562,28 +534,6 @@ void k_start(u32 sp)
if ((c == 0x17) && (len > 0)) { // ^W copy upload and boot
uart1_eol();
BRANCH_TO(UPLOAD_ADDR); // should not return...
// BOOT(len);
// hexdump((u8*)src, sizeof(src));
hexdump((u8*)dst, sizeof(dst)+3);
putchar(wait_for_kb());
asm_stack((u32*)dst);
hexdump((u8*)dst, sizeof(dst)+2);
putchar(wait_for_kb());
asm_copy32((u32*)(dst + 128), (u32*)src, 128);
hexdump((u8*)dst, sizeof(dst)+1);
putchar(wait_for_kb());
/*
uart1_hex32(asm_safe(0xDEADBEEF));
// uart1_hex32(asm_himem(0xDEADBEEF));
putchar(wait_for_kb());
hexdump((u8*)(UPLOAD_ADDR - 128), 256);
// XBOOT(KERNEL_ADDR, UPLOAD_ADDR, len);
XBOOT((u32)dst, (u32)src, (u32)sizeof(dst));
uart1_eol();
hexdump((u8*)src, sizeof(src));
uart1_eol();
hexdump((u8*)dst, sizeof(dst));
*/
}
}
uart1_eol();
Expand Down
77 changes: 0 additions & 77 deletions start.s
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,6 @@ GET_PC: @ u32 GET_PC();
BRANCH_TO: @ void BRANCH_TO(u32 addr);
bx r0

.globl asm_stack
asm_stack: @ void asm_stack(u32* buf);
stmia r0,{r0-r12,lr} @ save everything in buffer
bx lr

.globl asm_copy32
asm_copy32: @ void asm_copy32(u32* dst, u32* src, int len);
push {r0-r12,lr} @ save everything on the stack
Expand All @@ -94,75 +89,3 @@ asm_copy32: @ void asm_copy32(u32* dst, u32* src, int len);
bgt 1b @ more to copy?
pop {r0-r12,pc} @ restore everything and return

.globl asm_himem
asm_himem: @ u32 asm_himem(u32);
push {r0-r12,lr} @ save everything on the stack
@ mov r11, sp @ remember where we put everything
ldr lr, =0x10000 @ absolute address of "safe" memory
add r12, pc, #8 @ start address of code to copy
ldmia r12, {r0-r10} @ read 11 words of code
stmdb lr!, {r0-r10} @ copy code to safe memory
bx lr @ jump to code in safe memory
@ The code we copy to execute from safe memory is as follows:
@ ldmia r11, {r0-r2} @ restore dst, src & len
pop {r0-r12,pc} @ restore everything and return
.byte 0xB0, 0x07, 0x10, 0xAD
.skip 32 @ padding...

.globl asm_safe
asm_safe: @ u32 asm_safe(u32);
push {r0-r12,lr} @ save everything on the stack
@ mov r11, sp @ remember where we put everything
mov lr, sp @ compute jump address in link register
add r12, pc, #8 @ start address of code to copy
ldmia r12, {r0-r10} @ read 11 words of code
stmdb lr!, {r0-r10} @ copy code onto the stack
bx lr @ jump to code on the stack!
@ The code we copy to execute from the stack is as follows:
@ ldmia r11, {r0-r2} @ restore dst, src & len
pop {r0-r12,pc} @ restore everything and return
.byte 0xB0, 0x07, 0x10, 0xAD
.skip 32 @ padding...

.globl BOOT
BOOT: @ void BOOT(u32 len); // copy and boot new kernel
ldr r1, =0x10000 @ absolute address of upload buffer
mov r11, r1 @ high-memory code address
ldr r2, =0x8000 @ absolute address of kernel memory
mov lr, r2 @ kernel entry-point
add r12, pc, #8 @ start address of code to copy
ldmia r12, {r3-r10} @ read 8 words of code
stmdb r11!, {r3-r10} @ write 8 words of code
bx r11 @ jump to code in high memory
@ This position-independent code executes from high memory
1: ldmia r1!, {r3-r10} @ read 8 words of data
stmia r2!, {r3-r10} @ write 8 words of data
subs r0, #32 @ decrement len
bgt 1b @ more to copy?
bx lr @ if not, jump to new kernel
.byte 0xB0, 0x07, 0x10, 0xAD
.skip 32 @ padding...

.globl XBOOT
XBOOT: @ void XBOOT(u32 dst, u32 src, u32 len);
push {r0-r12,lr} @ save everything on the stack
mov r11, sp @ remember where we put everything
@ mov lr, r0 @ keep boot address in link register
add r12, pc, #8 @ start address of code to copy
ldmia r12, {r0-r10} @ read 11 words of code
stmdb sp!, {r0-r10} @ copy code onto the stack
bx sp @ jump to code on the stack!
@ The code we copy to execute from the stack is as follows:
ldmia r11, {r0-r2} @ restore dst, src & len
1: ldmia r1!, {r3-r10} @ read 8 words
stmia r0!, {r3-r10} @ write 8 words
subs r2, #32 @ decrement len
bgt 1b @ more to copy?
@ bx lr @ if not, jump to new kernel
; mov r0, r11 @ dump saved stack frame
; ldr r11, =dump256 @ get absolute address of dump routine
; mov lr, pc @ manually calculate link-return address
; bx r11 @ call dump routine at absolute address
pop {r0-r12,pc} @ restore everything and return
.byte 0xB0, 0x07, 0x10, 0xAD
.skip 32 @ padding...

0 comments on commit 238a4c7

Please sign in to comment.