From 8200b95bb170f7d3c50945d3c4a9be4dbac2c498 Mon Sep 17 00:00:00 2001 From: Polprzewodnikowy Date: Sun, 7 Jan 2024 18:26:05 +0000 Subject: [PATCH] deploy: 7f21902e210a068ac8c78998d63099e152e61708 --- features.html | 172 ++++++++++++++++++++++++++++++++++++++++++ index.html | 46 ++++++++++++ sc64.svg | 16 ++++ script.js | 11 +++ styles.css | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 446 insertions(+) create mode 100644 features.html create mode 100644 index.html create mode 100644 sc64.svg create mode 100644 script.js create mode 100644 styles.css diff --git a/features.html b/features.html new file mode 100644 index 00000000..3f623ff9 --- /dev/null +++ b/features.html @@ -0,0 +1,172 @@ + + + + + + SummerCart64 - Features + + + + + + + +
+
+

SummerCart64 features

+
+
+

Enough space for your ROMs

+

Flashcart embeds 64 MiB of fast SDRAM memory, with additional 14 MiB available from the + flash memory, totaling up to 78 MiB - more than biggest known retail ROMs.

+
+ +
+

Blazing fast I/O

+

Both microSD card slot and USB port operate at peak speed of ~23.8 MiB/s. Even largest + retail ROMs (64 MiB) can be loaded in just couple of seconds.

+
+ +
+

Never lose your progress

+

Every known save type found in the retail games is supported. Saves are automatically flushed to + the microSD card (or via USB with PC app attached) during gameplay - no reset button press is + necessary!

+
+ +
+

Complete 64DD emulation built-in

+

Forget about 64DD ROM conversions - SummerCart64 can play disk dumps directly!

+
+ +
+

Every region is welcome

+

SummerCart64 supports every N64 console regardless of its region. NTSC/PAL switching is done + automatically and last detected region is stored inside NVRAM.

+
+ +
+

Run games with ease

+

Browse, run and manage your game library right on the N64 console with the N64FlashcartMenu - a dedicated menu software for + the SummerCart64.

+
+ +
+

Dedicated terminal PC app

+

Powerful, and yet simple, sc64deployer + app greatly enhances developer user experience.

+
+ +
+

Outstanding developer features

+

SummerCart64 was born as a device for homebrew development first. As a consequence it + incorporates many features to ease development of your own games:

+
    +
  • Dedicated PC app for loading ROMs and console access.
  • +
  • Simple, command based, communication protocol - both on the USB and N64 side.
  • +
  • microSD card interface with simple, block based, protocol.
  • +
  • Fast USB interface with well documented protocol.
  • +
  • 8 kiB buffer for general use with microSD card or USB interface.
  • +
  • Native support for microSD card and USB interface in the libdragon.
  • +
  • UNFLoader support - both in the PC app + and USB library.
  • +
  • libcart support.
  • +
  • IS-Viewer 64 debug interface support in the hardware.
  • +
+
+ +
+

With freedom in mind

+

SummerCart64 project is completely open source - you can modify and build upon it freely as long + as GNU GPLv3 license terms are satisfied.

+
+
+ +
+ +

Hardware specification

+
+

Input / Output

+
    +
  • N64 cartridge edge connector
  • +
  • microSD card slot (~23.8 MiB/s peak, cards up to 2 TB are supported)
  • +
  • USB Type-C receptacle (~23.8 MiB/s peak)
  • +
  • Programmable push button on the back
  • +
  • Status LED
  • +
+ +

Memory

+
    +
  • 64 MiB SDRAM
  • +
  • 16 MiB QSPI Flash (last 2 MiB is reserved for internal use)
  • +
  • 8 kiB buffer in the FPGA
  • +
  • 64 byte battery-backed NVRAM in the RTC
  • +
+ +

CIC emulation

+
    +
  • Based on the UltraCIC_C with enhancements +
  • +
  • Automatic region switch
  • +
  • Fully programmable seed/checksum values
  • +
  • Supports booting directly from the 64DD IPL
  • +
+ +

Save support

+
    +
  • EEPROM 4 kbit
  • +
  • EEPROM 16 kbit
  • +
  • SRAM 256 kbit
  • +
  • SRAM 3x256 kbit
  • +
  • FlashRAM 1 Mbit
  • +
  • SRAM 1 Mbit
  • +
  • Automatic writeback after ~1 second to the microSD card or USB interface
  • +
+ +

Add-on hardware emulation

+
    +
  • 64DD (N64 Disk Drive) - disk access to/from microSD card or USB interface
  • +
  • IS-Viewer 64 (movable base address, fixed 64 kiB buffer size, debug printf + only)
  • +
+ +

Other

+
    +
  • Real time clock
  • +
  • CR2032 RTC backup battery
  • +
  • N64 bootloader capable of loading menu binary from the microSD card and displaying error + messages
  • +
  • Firmware updatable via USB interface
  • +
  • Seamless power switching between USB and N64
  • +
+
+
+
+ + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..0876dd61 --- /dev/null +++ b/index.html @@ -0,0 +1,46 @@ + + + + + + SummerCart64 - Home + + + + + + + +
+
+

SummerCart64 - a fully open source Nintendo 64 flashcart

+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/sc64.svg b/sc64.svg new file mode 100644 index 00000000..4001e89e --- /dev/null +++ b/sc64.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/script.js b/script.js new file mode 100644 index 00000000..c23702a3 --- /dev/null +++ b/script.js @@ -0,0 +1,11 @@ +const showMenu = (event) => { + event.currentTarget + .classList + .toggle('active'); + event.currentTarget + .parentNode + .parentNode + .getElementsByTagName('menu')[0] + .classList + .toggle('mobile-hidden'); +} diff --git a/styles.css b/styles.css new file mode 100644 index 00000000..54064610 --- /dev/null +++ b/styles.css @@ -0,0 +1,201 @@ +:root { + --text-color: rgb(240, 240, 240); + --link-text-color: rgb(160, 160, 160); + + --menu-height: 64px; + --menu-item-height: 48px; + --menu-item-spacing: 20px; + --menu-bg-color: rgb(32, 32, 32); + --menu-mobile-bg-color: rgb(20, 20, 20); + --menu-shadow: 0px 0px 12px rgb(0, 0, 0); + --menu-font-size: 16px; + + --content-max-width: 840px; + --content-margin: 32px; + --content-bg-color: rgb(40, 40, 40); + + --main-separator-height: 2px; + --main-separator-margin: 32px; + + --footer-padding: 16px 32px 16px 32px; + --footer-font-size: 14px; +} + +html, +body { + height: 100%; +} + +html { + scroll-padding-top: calc(var(--menu-height) + var(--content-margin)); +} + +body { + display: flex; + flex-direction: column; + margin: 0; + color: var(--text-color); + background-color: var(--content-bg-color); + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; +} + +a { + text-decoration: none; +} + +a:link, +a:visited { + color: var(--link-text-color); +} + +a:active, +a:hover { + color: var(--text-color); +} + +.sc64-logo { + max-width: 320px; +} + +.menu-container { + position: fixed; + top: 0; + display: flex; + justify-content: center; + width: 100%; + background-color: var(--menu-bg-color); + box-shadow: var(--menu-shadow); +} + +.menu-bar { + display: flex; + flex-flow: row; + align-items: center; + margin: 0 var(--content-margin) 0 var(--content-margin); + width: 100%; + max-width: var(--content-max-width); + font-size: var(--menu-font-size); +} + +.menu-bar>.menu-buttons { + display: flex; + align-items: center; + height: var(--menu-height); +} + +.menu-bar>.menu-buttons>img { + margin-right: var(--content-margin); + height: var(--menu-item-height); +} + +.menu-bar>.menu-buttons>button { + display: none; +} + +.menu-bar menu { + display: flex; + margin: 0; + padding: 0; +} + +.menu-bar menu>li { + list-style: none; + padding: 0 var(--menu-item-spacing) 0 var(--menu-item-spacing); +} + +.menu-bar menu>li.active a { + color: var(--text-color); + font-weight: 600; +} + +@media only screen and (max-width: 768px) { + .menu-bar { + flex-flow: row wrap; + margin: 0; + } + + .menu-bar>.menu-buttons { + width: 100%; + margin: 0 var(--content-margin) 0 var(--content-margin); + } + + .menu-bar>.menu-buttons>a { + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; + width: var(--menu-item-height); + height: var(--menu-item-height); + margin-left: auto; + cursor: pointer; + } + + .menu-bar>.menu-buttons>a>.menu-button-line { + width: 28px; + height: 3px; + background-color: var(--link-text-color); + margin: 3px 0; + border-radius: 2px; + } + + .menu-bar>.menu-buttons>a.active>.menu-button-line { + background-color: var(--text-color); + } + + .menu-bar>menu { + flex-flow: column; + width: 100%; + padding: calc(var(--content-margin) / 2) 0; + background-color: var(--menu-mobile-bg-color); + } + + .menu-bar>menu>li { + padding: calc(var(--menu-item-spacing) / 2) 0; + padding-left: var(--content-margin); + } + + .menu-bar>menu>li.active { + background-color: var(--menu-bg-color); + } + + .menu-bar>menu.mobile-hidden { + display: none; + } +} + +.main-container { + display: flex; + justify-content: center; + margin-top: var(--menu-height); + scroll-padding-top: var(--menu-height); + width: 100%; +} + +main { + display: flex; + flex-flow: column; + margin: var(--content-margin); + width: 100%; + max-width: var(--content-max-width); + font-size: var(--menu-font-size); +} + +main>h1 { + margin-top: 0; +} + +main .separator { + height: var(--main-separator-height); + background-color: var(--text-color); + margin: var(--main-separator-margin) 0; +} + +footer { + display: flex; + flex-flow: column; + align-self: center; + align-items: center; + margin-top: auto; + padding: var(--footer-padding); + font-size: var(--footer-font-size); +} \ No newline at end of file