From d7aadf48f9e66376cf6d86b18eb375994ab89344 Mon Sep 17 00:00:00 2001 From: Mateusz Faderewski Date: Sun, 7 Jan 2024 19:21:11 +0100 Subject: [PATCH] [SC64][WEB] Added initial website --- .github/workflows/build.yml | 12 +++ web/features.html | 172 ++++++++++++++++++++++++++++++ web/index.html | 46 +++++++++ web/sc64.svg | 16 +++ web/script.js | 11 ++ web/styles.css | 201 ++++++++++++++++++++++++++++++++++++ 6 files changed, 458 insertions(+) create mode 100644 web/features.html create mode 100644 web/index.html create mode 100644 web/sc64.svg create mode 100644 web/script.js create mode 100644 web/styles.css diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a1e01ab..9f806d5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -128,3 +128,15 @@ jobs: with: files: | sw/deployer/package/${{ matrix.package-name }}-${{ steps.version.outputs.replaced }}.${{ matrix.package-extension }} + + publish-website: + runs-on: ubuntu-latest + + steps: + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + if: github.ref == 'refs/heads/main' + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./web + cname: summercart64.dev diff --git a/web/features.html b/web/features.html new file mode 100644 index 0000000..3f623ff --- /dev/null +++ b/web/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/web/index.html b/web/index.html new file mode 100644 index 0000000..0876dd6 --- /dev/null +++ b/web/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/web/sc64.svg b/web/sc64.svg new file mode 100644 index 0000000..4001e89 --- /dev/null +++ b/web/sc64.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/script.js b/web/script.js new file mode 100644 index 0000000..c23702a --- /dev/null +++ b/web/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/web/styles.css b/web/styles.css new file mode 100644 index 0000000..5406461 --- /dev/null +++ b/web/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