Compare commits
2 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5c6bceeda2 | |||
| 8dc1abfe61 |
6 changed files with 202 additions and 66 deletions
|
|
@ -495,13 +495,18 @@ uint32 _HardwareIn(const uint32 Port) {
|
|||
/* Console abstraction functions */
|
||||
/*===============================================================================*/
|
||||
|
||||
#include "arduino_hooks.h"
|
||||
|
||||
int _kbhit(void) {
|
||||
if (_kbhit_hook && _kbhit_hook()) { return true; }
|
||||
return(Serial.available());
|
||||
}
|
||||
|
||||
uint8 _getch(void) {
|
||||
while (!Serial.available());
|
||||
return(Serial.read());
|
||||
while(true) {
|
||||
if(_kbhit_hook && _kbhit_hook()) { return _getch_hook(); }
|
||||
if(Serial.available()) { return Serial.read(); }
|
||||
}
|
||||
}
|
||||
|
||||
uint8 _getche(void) {
|
||||
|
|
@ -512,6 +517,7 @@ uint8 _getche(void) {
|
|||
|
||||
void _putch(uint8 ch) {
|
||||
Serial.write(ch);
|
||||
if(_putch_hook) _putch_hook(ch);
|
||||
}
|
||||
|
||||
void _clrscr(void) {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
extern bool (*_kbhit_hook)(void);
|
||||
extern uint8_t (*_getch_hook)(void);
|
||||
extern void (*_putch_hook)(uint8_t ch);
|
||||
|
|
|
|||
10
console.h
10
console.h
|
|
@ -47,4 +47,14 @@ void _puthex16(uint16 w) // puts a HHHH hex string
|
|||
_puthex8(w & 0x00ff);
|
||||
}
|
||||
|
||||
void _putdec(uint16_t w) {
|
||||
char buf[] = " 0";
|
||||
size_t i=sizeof(buf)-1;
|
||||
while(w) {
|
||||
assert(i > 0);
|
||||
buf[--i] = '0' + (w % 10);
|
||||
w /= 10;
|
||||
}
|
||||
_puts(buf);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
106
hardware/pico/feather_dvi.h
Normal file
106
hardware/pico/feather_dvi.h
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
#include <SdFat.h> // SDFat - Adafruit Fork
|
||||
#include <Adafruit_TinyUSB.h>
|
||||
#include <PicoDVI.h>
|
||||
#include "../../console.h"
|
||||
#include "../../arduino_hooks.h"
|
||||
|
||||
#undef USE_DISPLAY
|
||||
#define USE_DISPLAY (1)
|
||||
|
||||
#if USE_DISPLAY
|
||||
DVItext1 display(DVI_RES_800x240p60, adafruit_feather_dvi_cfg);
|
||||
#endif
|
||||
#define SPI_CLOCK (20'000'000)
|
||||
#define SD_CS_PIN (10)
|
||||
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK)
|
||||
DedicatedSpiCard blockdevice;
|
||||
FatFileSystem SD; // Filesystem object from SdFat
|
||||
Adafruit_USBD_MSC usb_msc; // USB mass storage object
|
||||
|
||||
// =========================================================================================
|
||||
// Define Board-Data
|
||||
// GP25 green onboard LED
|
||||
// =========================================================================================
|
||||
#define LED (13)
|
||||
#define LEDinv (false)
|
||||
#define board_pico
|
||||
#define board_analog_io
|
||||
#define board_digital_io
|
||||
|
||||
// FUNCTIONS REQUIRED FOR USB MASS STORAGE ---------------------------------
|
||||
|
||||
static bool msc_changed = true; // Is set true on filesystem changes
|
||||
|
||||
// Callback on READ10 command.
|
||||
int32_t msc_read_cb(uint32_t lba, void *buffer, uint32_t bufsize) {
|
||||
return blockdevice.readBlocks(lba, (uint8_t *)buffer, bufsize / 512) ? bufsize : -1;
|
||||
}
|
||||
|
||||
// Callback on WRITE10 command.
|
||||
int32_t msc_write_cb(uint32_t lba, uint8_t *buffer, uint32_t bufsize) {
|
||||
digitalWrite(LED_BUILTIN, HIGH);
|
||||
return blockdevice.writeBlocks(lba, buffer, bufsize / 512) ? bufsize : -1;
|
||||
}
|
||||
|
||||
// Callback on WRITE10 completion.
|
||||
void msc_flush_cb(void) {
|
||||
blockdevice.syncBlocks(); // Sync with blockdevice
|
||||
SD.cacheClear(); // Clear filesystem cache to force refresh
|
||||
digitalWrite(LED_BUILTIN, LOW);
|
||||
msc_changed = true;
|
||||
}
|
||||
|
||||
void _puthex32(uint32_t x) {
|
||||
_puthex16(x >> 16);
|
||||
_puthex16(x & 0xffff);
|
||||
}
|
||||
|
||||
#if USE_DISPLAY
|
||||
uint16_t underCursor = ' ';
|
||||
|
||||
void putch_display(uint8_t ch) {
|
||||
auto x = display.getCursorX();
|
||||
auto y = display.getCursorY();
|
||||
display.drawPixel(x, y, underCursor);
|
||||
if(ch == 8) {
|
||||
if(x > 0) {
|
||||
display.setCursor(--x, y);
|
||||
display.drawPixel(x, y, ' ');
|
||||
}
|
||||
} else {
|
||||
display.write(ch);
|
||||
}
|
||||
x = display.getCursorX();
|
||||
y = display.getCursorY();
|
||||
underCursor = display.getPixel(x, y);
|
||||
display.drawPixel(x, y, 0xDB);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool port_init_early() {
|
||||
#if USE_DISPLAY
|
||||
// vreg_set_voltage(VREG_VOLTAGE_1_30);
|
||||
if (!display.begin()) { return false; }
|
||||
_putch_hook = putch_display;
|
||||
#endif
|
||||
// USB mass storage / filesystem setup (do BEFORE Serial init)
|
||||
if (!blockdevice.begin(SD_CONFIG)) { _puts("!blockdevice.begin()"); return false; }
|
||||
// Set disk vendor id, product id and revision
|
||||
usb_msc.setID("Adafruit", "Internal Flash", "1.0");
|
||||
// Set disk size, block size is 512 regardless of blockdevice page size
|
||||
usb_msc.setCapacity(blockdevice.sectorCount(), 512);
|
||||
usb_msc.setReadWriteCallback(msc_read_cb, msc_write_cb, msc_flush_cb);
|
||||
usb_msc.setUnitReady(true); // MSC is ready for read/write
|
||||
if (!usb_msc.begin()) {
|
||||
_puts("!usb_msc.begin()"); return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool port_flash_begin() {
|
||||
if (!SD.begin(&blockdevice, true, 1)) { // Start filesystem on the blockdevice
|
||||
_puts("!SD.begin()"); return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1,13 +1,17 @@
|
|||
// =========================================================================================
|
||||
// Define SdFat as alias for SD
|
||||
// =========================================================================================
|
||||
#include <SdFat.h> // One SD library to rule them all - Greinman SdFat from Library Manager
|
||||
#include <SdFat.h> // SDFat - Adafruit Fork
|
||||
#include <Adafruit_SPIFlash.h>
|
||||
#include <Adafruit_TinyUSB.h>
|
||||
#include <PicoDVI.h>
|
||||
#include "../../console.h"
|
||||
#include "../../arduino_hooks.h"
|
||||
|
||||
Adafruit_FlashTransport_RP2040 flashTransport;
|
||||
Adafruit_SPIFlash flash(&flashTransport);
|
||||
#undef USE_DISPLAY
|
||||
#define USE_DISPLAY (1)
|
||||
|
||||
#if USE_DISPLAY
|
||||
DVItext1 display(DVI_RES_800x240p30, adafruit_feather_dvi_cfg);
|
||||
#endif
|
||||
DedicatedSpiCard spisd;
|
||||
FatFileSystem SD; // Filesystem object from SdFat
|
||||
Adafruit_USBD_MSC usb_msc; // USB mass storage object
|
||||
|
||||
|
|
@ -15,7 +19,7 @@ Adafruit_USBD_MSC usb_msc; // USB mass storage object
|
|||
// Define Board-Data
|
||||
// GP25 green onboard LED
|
||||
// =========================================================================================
|
||||
#define LED 25 // GPIO25
|
||||
#define LED 13 // GPIO13
|
||||
#define LEDinv 0
|
||||
#define board_pico
|
||||
#define board_analog_io
|
||||
|
|
@ -50,42 +54,59 @@ void _puthex32(uint32_t x) {
|
|||
_puthex16(x & 0xffff);
|
||||
}
|
||||
|
||||
#if USE_DISPLAY
|
||||
uint16_t underCursor = ' ';
|
||||
|
||||
void putch_display(uint8_t ch) {
|
||||
auto x = display.getCursorX();
|
||||
auto y = display.getCursorY();
|
||||
display.drawPixel(x, y, underCursor);
|
||||
if(ch == 8) {
|
||||
if(x > 0) {
|
||||
display.setCursor(--x, y);
|
||||
display.drawPixel(x, y, ' ');
|
||||
}
|
||||
} else {
|
||||
display.write(ch);
|
||||
}
|
||||
x = display.getCursorX();
|
||||
y = display.getCursorY();
|
||||
underCursor = display.getPixel(x, y);
|
||||
display.drawPixel(x, y, 0xDB);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool port_init_early() {
|
||||
_puts("port_init_early()");
|
||||
_puts("X");
|
||||
#if USE_DISPLAY
|
||||
// vreg_set_voltage(VREG_VOLTAGE_1_30);
|
||||
if (!display.begin()) { return false; }
|
||||
_putch_hook = putch_display;
|
||||
#endif
|
||||
// USB mass storage / filesystem setup (do BEFORE Serial init)
|
||||
if (!flash.begin()) { _puts("!flash_begin()"); return false; }
|
||||
_puts("Y");
|
||||
// Set disk vendor id, product id and revision
|
||||
usb_msc.setID("Adafruit", "Internal Flash", "1.0");
|
||||
_puts("Z");
|
||||
// Set disk size, block size is 512 regardless of spi flash page size
|
||||
_puthex32(flash.pageSize());
|
||||
_putcon(' ');
|
||||
_putcon('x');
|
||||
_puthex32(flash.numPages());
|
||||
|
||||
usb_msc.setCapacity(flash.pageSize() * flash.numPages() / 512, 512);
|
||||
_puts("A");
|
||||
usb_msc.setReadWriteCallback(msc_read_cb, msc_write_cb, msc_flush_cb);
|
||||
_puts("B");
|
||||
usb_msc.setUnitReady(true); // MSC is ready for read/write
|
||||
_puts("C");
|
||||
if (!usb_msc.begin()) {
|
||||
_puts("!usb_msc.begin()"); return false;
|
||||
} else {
|
||||
_puts("usb_msc.begin() OK");
|
||||
}
|
||||
_puts("D");
|
||||
return true;
|
||||
}
|
||||
|
||||
bool port_flash_begin() {
|
||||
_puts("port_flash_begin()");
|
||||
if (!SD.begin(&flash)) { // Start filesystem on the flash
|
||||
if (!spisd.begin(&spiconfig)) {
|
||||
_puts("!spisd.begin()"); return false;
|
||||
}
|
||||
if (!SD.begin(&spisd)) { // Start filesystem on the flash
|
||||
_puts("!SD.begin()"); return false;
|
||||
}
|
||||
_puts("E");
|
||||
_puts("port_flash_begin success");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,16 +1,3 @@
|
|||
/*
|
||||
SD card connection
|
||||
|
||||
This example shows how to read and write data to and from an SD card file
|
||||
The circuit:
|
||||
SD card attached to SPI bus as follows:
|
||||
// Arduino-pico core
|
||||
** MISO - Pin 21 - GPIO 16
|
||||
** MOSI - Pin 25 - GPIO 19
|
||||
** CS - Pin 22 - GPIO 17
|
||||
** SCK - Pin 24 - GPIO 18
|
||||
*/
|
||||
|
||||
// only AVR and ARM CPU
|
||||
// #include <MemoryFree.h>
|
||||
|
||||
|
|
@ -27,14 +14,22 @@
|
|||
#include <Adafruit_SPIFlash.h>
|
||||
#include <Adafruit_TinyUSB.h>
|
||||
|
||||
#define TEXT_BOLD "\033[1m"
|
||||
#define TEXT_NORMAL "\033[0m"
|
||||
|
||||
// =========================================================================================
|
||||
// Board definitions go into the "hardware" folder, if you use a board different than the
|
||||
// Arduino DUE, choose/change a file from there and reference that file here
|
||||
// =========================================================================================
|
||||
|
||||
// Raspberry Pi Pico - normal (LED = GPIO25)
|
||||
#include "hardware/pico/pico_internalflash.h"
|
||||
#include "hardware/pico/feather_dvi.h"
|
||||
|
||||
#ifndef BOARD_TEXT
|
||||
#define BOARD_TEXT USB_MANUFACTURER " " USB_PRODUCT
|
||||
#endif
|
||||
|
||||
#include "abstraction_arduino.h"
|
||||
// Raspberry Pi Pico W(iFi) (LED = GPIO32)
|
||||
// #include "hardware/pico/pico_w_sd_spi.h"
|
||||
|
||||
|
|
@ -44,7 +39,6 @@
|
|||
#define sDELAY 100
|
||||
#define DELAY 1200
|
||||
|
||||
#include "abstraction_arduino.h"
|
||||
|
||||
// =========================================================================================
|
||||
// Serial port speed
|
||||
|
|
@ -79,7 +73,7 @@ int lst_open = FALSE;
|
|||
|
||||
void setup(void) {
|
||||
pinMode(LED, OUTPUT);
|
||||
digitalWrite(LED, LOW);
|
||||
digitalWrite(LED, LOW^LEDinv);
|
||||
|
||||
|
||||
// =========================================================================================
|
||||
|
|
@ -102,8 +96,9 @@ void setup(void) {
|
|||
// Serial2.setTX(20); // Pin 26
|
||||
// =========================================================================================
|
||||
|
||||
port_init_early();
|
||||
if (!port_init_early()) { return; }
|
||||
|
||||
#if defined(WAIT_SERIAL)
|
||||
// _clrscr();
|
||||
// _puts("Opening serial-port...\r\n");
|
||||
Serial.begin(SERIALSPD);
|
||||
|
|
@ -113,7 +108,7 @@ void setup(void) {
|
|||
digitalWrite(LED, LOW^LEDinv);
|
||||
delay(DELAY);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DEBUGLOG
|
||||
_sys_deletefile((uint8 *)LogName);
|
||||
|
|
@ -127,49 +122,44 @@ void setup(void) {
|
|||
_clrscr();
|
||||
|
||||
// if (bootup_press == 1)
|
||||
// { _puts("Recognized \e[1m#\e[0m key as pressed! :)\r\n\r\n");
|
||||
// { _puts("Recognized " TEXT_BOLD "#" TEXT_NORMAL " key as pressed! :)\r\n\r\n");
|
||||
// }
|
||||
|
||||
_puts("CP/M Emulator \e[1mv" VERSION "\e[0m by \e[1mMarcelo Dantas\e[0m\r\n");
|
||||
_puts("CP/M Emulator " TEXT_BOLD "v" VERSION "" TEXT_NORMAL " by " TEXT_BOLD "Marcelo Dantas\e[0m\r\n");
|
||||
_puts("----------------------------------------------\r\n");
|
||||
_puts(" running on Raspberry Pi [\e[1m Pico \e[0m]\r\n");
|
||||
_puts(" running on [" TEXT_BOLD BOARD_TEXT TEXT_NORMAL "]\r\n");
|
||||
_puts("----------------------------------------------\r\n");
|
||||
_puts("\e[0m]\r\n");
|
||||
|
||||
_puts("BIOS at [\e[1m0x");
|
||||
_puts("BIOS at [" TEXT_BOLD "0x");
|
||||
_puthex16(BIOSjmppage);
|
||||
// _puts(" - ");
|
||||
_puts("\e[0m]\r\n");
|
||||
_puts("" TEXT_NORMAL "]\r\n");
|
||||
|
||||
_puts("BDOS at [\e[1m0x");
|
||||
_puts("BDOS at [" TEXT_BOLD "0x");
|
||||
_puthex16(BDOSjmppage);
|
||||
_puts("\e[0m]\r\n");
|
||||
_puts("" TEXT_NORMAL "]\r\n");
|
||||
|
||||
_puts("CCP " CCPname " at [\e[1m0x");
|
||||
_puts("CCP " CCPname " at [" TEXT_BOLD "0x");
|
||||
_puthex16(CCPaddr);
|
||||
_puts("\e[0m]\r\n");
|
||||
_puts("" TEXT_NORMAL "]\r\n");
|
||||
|
||||
#if BANKS > 1
|
||||
_puts("Banked Memory [\e[1m");
|
||||
_puts("Banked Memory [" TEXT_BOLD "");
|
||||
_puthex8(BANKS);
|
||||
_puts("\e[0m]banks\r\n");
|
||||
#else
|
||||
_puts("Banked Memory [\e[1m");
|
||||
_puthex8(BANKS);
|
||||
_puts("\e[0m]bank\r\n");
|
||||
_puts("" TEXT_NORMAL "]banks\r\n");
|
||||
#endif
|
||||
|
||||
// Serial.printf("Free Memory [\e[1m%d bytes\e[0m]\r\n", freeMemory());
|
||||
// Serial.printf("Free Memory [" TEXT_BOLD "%d bytes" TEXT_NORMAL "]\r\n", freeMemory());
|
||||
|
||||
_puts("CPU-Clock [\e[1m250Mhz\e[0m]\r\n");
|
||||
_puts("CPU-Clock [" TEXT_BOLD);
|
||||
_putdec((clock_get_hz( clk_sys ) + 500'000) / 1'000'000);
|
||||
_puts(TEXT_NORMAL "] MHz\r\n");
|
||||
|
||||
|
||||
_puts("Init Storage [ \e[1m");
|
||||
_puts("Init Storage [ " TEXT_BOLD "");
|
||||
if (port_flash_begin()) {
|
||||
_puts("OK \e[0m]\r\n");
|
||||
_puts("OK " TEXT_NORMAL "]\r\n");
|
||||
_puts("----------------------------------------------");
|
||||
|
||||
|
||||
if (VersionCCP >= 0x10 || SD.exists(CCPname)) {
|
||||
while (true) {
|
||||
_puts(CCPHEAD);
|
||||
|
|
@ -202,7 +192,7 @@ void setup(void) {
|
|||
_puts("Unable to load CP/M CCP.\r\nCPU halted.\r\n");
|
||||
}
|
||||
} else {
|
||||
_puts("ERR \e[0m]\r\nUnable to initialize SD card.\r\nCPU halted.\r\n");
|
||||
_puts("ERR " TEXT_NORMAL "]\r\nUnable to initialize SD card.\r\nCPU halted.\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue