From 238a4c7caf002f4d68db51271848dacf3e6f1fe5 Mon Sep 17 00:00:00 2001 From: Dale Schumacher Date: Sun, 6 Jul 2014 15:09:29 -0500 Subject: [PATCH] UPLOAD and BOOT from FORTH --- .gitignore | 1 + README.md | 8 +++--- jonesforth.s | 5 ++-- raspberry.c | 50 ---------------------------------- start.s | 77 ---------------------------------------------------- 5 files changed, 7 insertions(+), 134 deletions(-) diff --git a/.gitignore b/.gitignore index 6196687..0d3461f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.o *.list +*.sym *.hex *.elf *.img diff --git a/README.md b/README.md index 670e5a2..ea1d9cd 100644 --- a/README.md +++ b/README.md @@ -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 . 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 @@ -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/SD-card + $ cp kernel.img /media/SD-card 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 | |------|-------|-------------| diff --git a/jonesforth.s b/jonesforth.s index 5b6bd87..5a649c3 100644 --- a/jonesforth.s +++ b/jonesforth.s @@ -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 @@ -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 diff --git a/raspberry.c b/raspberry.c index cc7c607..4ae93a1 100644 --- a/raspberry.c +++ b/raspberry.c @@ -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(); @@ -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 */ @@ -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(); @@ -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(); diff --git a/start.s b/start.s index e3a1990..8564f1d 100644 --- a/start.s +++ b/start.s @@ -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 @@ -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...