Compare commits

...

No commits in common. "main" and "gh-pages" have entirely different histories.

14 changed files with 2 additions and 471 deletions

View file

@ -1,44 +0,0 @@
name: Build CI
on:
push:
pull_request:
release:
types: [published]
check_suite:
types: [rerequested]
jobs:
test:
runs-on: ubuntu-18.04
steps:
- name: checkout
uses: actions/checkout@v2
with:
submodules: true
- name: install dependencies
run: |
sudo apt-get update
sudo apt-get --no-install-recommends -y install build-essential git cc65
- name: build
run: |
make -C c2t
docker run --rm -v $(pwd):/src -u $(id -u):$(id -g) emscripten/emsdk ./build.sh
- if: github.event_name == 'push' && github.ref == 'refs/heads/main'
name: publish
run: |
git branch -D gh-pages || true
python3 import.py | git fast-import --date-format=now
git config user.email "jeff@adafruit.com"
git config user.name "Jeff Epler (Adafruit) via github actions"
git remote set-url --push origin https://jepler:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
git push -f origin gh-pages
- uses: actions/upload-artifact@v2
with:
name: Web pages
path: output/

3
.gitmodules vendored
View file

@ -1,3 +0,0 @@
[submodule "c2t"]
path = c2t
url = https://github.com/jepler/c2t

View file

@ -1,135 +0,0 @@
<!--
SPDX-FileCopyrightText: 2014 Coraline Ada Ehmke
SPDX-FileCopyrightText: 2019 Kattni Rembor for Adafruit Industries
SPDX-License-Identifier: CC-BY-4.0
-->
# Adafruit Community Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and leaders pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level or type of
experience, education, socio-economic status, nationality, personal appearance,
race, religion, or sexual identity and orientation.
## Our Standards
We are committed to providing a friendly, safe and welcoming environment for
all.
Examples of behavior that contributes to creating a positive environment
include:
* Be kind and courteous to others
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Collaborating with other community members
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and sexual attention or advances
* The use of inappropriate images, including in a community member's avatar
* The use of inappropriate language, including in a community member's nickname
* Any spamming, flaming, baiting or other attention-stealing behavior
* Excessive or unwelcome helping; answering outside the scope of the question
asked
* Trolling, insulting/derogatory comments, and personal or political attacks
* Promoting or spreading disinformation, lies, or conspiracy theories against
a person, group, organisation, project, or community
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate
The goal of the standards and moderation guidelines outlined here is to build
and maintain a respectful community. We ask that you dont just aim to be
"technically unimpeachable", but rather try to be your best self.
We value many things beyond technical expertise, including collaboration and
supporting others within our community. Providing a positive experience for
other community members can have a much more significant impact than simply
providing the correct answer.
## Our Responsibilities
Project leaders are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project leaders have the right and responsibility to remove, edit, or
reject messages, comments, commits, code, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any community member for other behaviors that they deem
inappropriate, threatening, offensive, or harmful.
## Moderation
Instances of behaviors that violate the Adafruit Community Code of Conduct
may be reported by any member of the community. Community members are
encouraged to report these situations, including situations they witness
involving other community members.
You may report in the following ways:
In any situation, you may send an email to <support@adafruit.com>.
On the Adafruit Discord, you may send an open message from any channel
to all Community Moderators by tagging @community moderators. You may
also send an open message from any channel, or a direct message to
@kattni#1507, @tannewt#4653, @danh#1614, @cater#2442,
@sommersoft#0222, @Mr. Certainly#0472 or @Andon#8175.
Email and direct message reports will be kept confidential.
In situations on Discord where the issue is particularly egregious, possibly
illegal, requires immediate action, or violates the Discord terms of service,
you should also report the message directly to Discord.
These are the steps for upholding our communitys standards of conduct.
1. Any member of the community may report any situation that violates the
Adafruit Community Code of Conduct. All reports will be reviewed and
investigated.
2. If the behavior is an egregious violation, the community member who
committed the violation may be banned immediately, without warning.
3. Otherwise, moderators will first respond to such behavior with a warning.
4. Moderators follow a soft "three strikes" policy - the community member may
be given another chance, if they are receptive to the warning and change their
behavior.
5. If the community member is unreceptive or unreasonable when warned by a
moderator, or the warning goes unheeded, they may be banned for a first or
second offense. Repeated offenses will result in the community member being
banned.
## Scope
This Code of Conduct and the enforcement policies listed above apply to all
Adafruit Community venues. This includes but is not limited to any community
spaces (both public and private), the entire Adafruit Discord server, and
Adafruit GitHub repositories. Examples of Adafruit Community spaces include
but are not limited to meet-ups, audio chats on the Adafruit Discord, or
interaction at a conference.
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. As a community
member, you are representing our community, and are expected to behave
accordingly.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 1.4, available at
<https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>,
and the [Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html).
For other projects adopting the Adafruit Community Code of
Conduct, please contact the maintainers of those projects for enforcement.
If you wish to use this code of conduct for your own project, consider
explicitly mentioning your moderation policy or making a copy with your
own moderation policy so as to avoid confusion.

View file

@ -1,22 +0,0 @@
<!--
SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
SPDX-License-Identifier: MIT
-->
# Contributing
Please note that this project is released with a
[Contributor Code of Conduct](CODE_OF_CONDUCT.md).
By participating in this project you agree to abide by its terms. Participation
covers any forum used to converse about CircuitPython including unofficial and official spaces. Failure to do
so will result in corrective actions such as time out or ban from the project.
## Licensing
By contributing to this repository you are certifying that you have all necessary
permissions to license the code under the Open Group License. You still retain the
copyright but are granting many permissions under the Open Group License.
For the full license text, see the COPYING file.
If you have an employment contract with your employer please make sure that they
don't automatically own your work product. Make sure to get any necessary approvals
before contributing. Another term for this contribution off-hours is moonlighting.

View file

@ -1,6 +0,0 @@
# web-c2t
Convert Apple diskette images to audio files directly in your browser
This is inspired by the [Ascii Express Apple Disk Server](https://asciiexpress.net/diskserver/) and uses its same core code, [c2t](https://github.com/datajerk/c2t).
This project is built with emscripten; for details, see the github actions files that implement the CI and deployment workflow.

View file

@ -1,5 +0,0 @@
#!/bin/sh
[ -d output ] || mkdir output
make -C c2t c2t.h
emcc -O -Wall -Werror -Wno-unused -s TOTAL_MEMORY=$((2<<28)) -s SAFE_HEAP=1 -s STACK_OVERFLOW_CHECK=1 -s ASSERTIONS=2 -s FORCE_FILESYSTEM=1 -s EXPORTED_RUNTIME_METHODS="['ccall']" -DPACKAGE_STRING=\"bdftopcf\" -Ic2t wrap_c2t.c -o output/index.html --shell-file shell.html

1
c2t

@ -1 +0,0 @@
Subproject commit b459cc1b2a537f72f83890e7ff384218438d628c

View file

@ -1,30 +0,0 @@
#!/usr/bin/python3
import argparse
import glob
import os
import subprocess
import sys
parser = argparse.ArgumentParser()
parser.add_argument("branch", default="gh-pages", nargs="?")
args = parser.parse_args()
version = subprocess.getoutput("git describe --always")
fd = os.fdopen(sys.stdout.fileno(), 'wb')
fd.write(b"commit refs/heads/" + args.branch.encode('utf-8') + b"\n")
fd.write(b"committer Doc Man <noreply@example.com> now" + b"\n")
fd.write(b"data <<EOF" + b"\n")
fd.write(b"Docs built at " + version.encode('utf-8') + b"\n")
fd.write(b"EOF" + b"\n")
files = glob.glob("output/*")
for fn in files:
with open(fn, 'rb') as f: contents = f.read()
fd.write(b"M 644 inline " + os.path.basename(fn).encode('utf-8') + b"\n")
fd.write(b"data " + str(len(contents)).encode("utf-8") + b"\n")
fd.write(contents)
fd.write(b"done\n")

1
index.html Normal file

File diff suppressed because one or more lines are too long

1
index.js Normal file

File diff suppressed because one or more lines are too long

BIN
index.wasm Normal file

Binary file not shown.

View file

@ -1,12 +0,0 @@
#!/usr/bin/env python3
import http.server
import socketserver
PORT = 4242
Handler = http.server.SimpleHTTPRequestHandler
Handler.extensions_map[".wasm"] = "application/wasm"
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()

View file

@ -1,197 +0,0 @@
<!doctype html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>c2t wavefile generator</title>
<style>
form label, form button {
background-color: #7F9CCB;
padding: 5px 10px;
border-radius: 5px;
border: 1px ridge black;
font-size: 0.8rem;
height: auto;
}
.emscripten { display: block; }
textarea.emscripten { font-family: monospace; width: 80%; }
div.emscripten_border { border: 1px solid black; }
/* the canvas *must not* have any border or padding, or mouse coords will be wrong */
canvas.emscripten { border: 0px none; background-color: black; }
.spinner {
height: 50px;
width: 50px;
margin: 0px auto;
-webkit-animation: rotation .8s linear infinite;
-moz-animation: rotation .8s linear infinite;
-o-animation: rotation .8s linear infinite;
animation: rotation 0.8s linear infinite;
border-left: 10px solid rgb(0,150,240);
border-right: 10px solid rgb(0,150,240);
border-bottom: 10px solid rgb(0,150,240);
border-top: 10px solid rgb(100,0,200);
border-radius: 100%;
background-color: rgb(200,100,250);
}
@-webkit-keyframes rotation {
from {-webkit-transform: rotate(0deg);}
to {-webkit-transform: rotate(360deg);}
}
@-moz-keyframes rotation {
from {-moz-transform: rotate(0deg);}
to {-moz-transform: rotate(360deg);}
}
@-o-keyframes rotation {
from {-o-transform: rotate(0deg);}
to {-o-transform: rotate(360deg);}
}
@keyframes rotation {
from {transform: rotate(0deg);}
to {transform: rotate(360deg);}
}
</style>
</head>
<body>
<p>Convert an apple2 5.25 floppy file to wave format for uploading via the tape interface.</p>
<figure style="overflow:visible;" id="spinner"><div class="spinner"></div><center style="margin-top:0.5em"><strong>emscripten</strong></center></figure>
<div class="emscripten" id="status">Downloading...</div>
<div class="emscripten">
<progress value="0" max="100" id="progress" hidden=1></progress>
</div>
<form method="POST" enctype="multipart/form-data">
<label for="diskfile">Browse</label><input type="file" id="diskfile" name="diskfile" accept=".po,.do,.dsk" style="opacity:0"/>
<br>
<!-- <input type="submit" value="Convert" onSubmit="return convert_me()"/> -->
</form>
<br/>
<p>Use the resulting audio as described at <a href="https://asciiexpress.net/diskserver/">the asciiexpress diskserver</a>:</p>
<ol>
<li>Remove any floppies.
<li>Power on your ][+ or //e.
<li>Press CONTROL-RESET.
<li>Connect your phone/computer headphone jack to the cassette input jack (it's next to the joystick port).
<li>Set your phone/computer to MAX volume.
<li>Insert a blank diskette (S6D1).
<li><strike>Select a disk from the list to the left.</strike>
<li>At the "]" prompt type "LOAD" and press RETURN.
<li>Press the play button. <strike>If problems with HIFI, use 8KFI.</strike>
</ol>
<p>Note: 8KFI is not available here yet.</p>
<p>Due to boooogs the audio may be erroneously reported as very long (affects Firefox 97 on Linux). It is typically under 3 minutes.</p>
<div id="player"></div>
<textarea class="emscripten" id="output" rows="8"></textarea>
<script type='text/javascript'>
function downloadData(name, data) {
var as_str = Array.from(data).map((c)=>String.fromCharCode(c)).join("")
var datauri = "data:audio/x-wav;base64," + btoa(as_str)
var audio = document.createElement("audio");
audio.controls = true;
audio.src=datauri
container = document.getElementById("player")
container.innerHTML = ''
container.appendChild(audio)
}
document.querySelector('#diskfile').addEventListener('change', (event) => {
var file = document.getElementById("diskfile");
if (file.files.length) {
var reader = new FileReader();
reader.onload = function(e) {
var ifn = file.value.replace(/.*[/\\]/, "");
var ofn = "output.wav";
FS.writeFile(ifn, new Uint8Array(e.target.result))
var result = Module.ccall("wave_convert", "number", ["string"], [ifn]) // _wave_convert(ifn_c);
if(result != 0) {
downloadData(ofn, FS.readFile("/output.wav"));
}
}
reader.readAsArrayBuffer(file.files[0]);
}
return false;
});
var statusElement = document.getElementById('status');
var progressElement = document.getElementById('progress');
var spinnerElement = document.getElementById('spinner');
var outputElement = document.getElementById('output');
var Module = {
preRun: [],
postRun: [],
print: (function() {
var element = document.getElementById('output');
if (element) element.value = ''; // clear browser cache
return function(text) {
if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' ');
// These replacements are necessary if you render to raw HTML
//text = text.replace(/&/g, "&amp;");
//text = text.replace(/</g, "&lt;");
//text = text.replace(/>/g, "&gt;");
//text = text.replace('\n', '<br>', 'g');
console.log(text);
if (element) {
element.style = ""
element.value += text + "\n";
element.scrollTop = element.scrollHeight; // focus on bottom
}
};
})(),
printErr: function(text) {
if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' ');
if (0) { // XXX disabled for safety typeof dump == 'function') {
dump(text + '\n'); // fast, straight to the real console
} else {
outputElement.style = ""
outputElement.value += text + "\n";
outputElement.scrollTop = outputElement.scrollHeight; // focus on bottom
console.error(text);
}
},
setStatus: function(text) {
if (!Module.setStatus.last) Module.setStatus.last = { time: Date.now(), text: '' };
if (text === Module.setStatus.last.text) return;
var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/);
var now = Date.now();
if (m && now - Module.setStatus.last.time < 30) return; // if this is a progress update, skip it if too soon
Module.setStatus.last.time = now;
Module.setStatus.last.text = text;
if (m) {
text = m[1];
progressElement.value = parseInt(m[2])*100;
progressElement.max = parseInt(m[4])*100;
progressElement.hidden = false;
spinnerElement.hidden = false;
} else {
progressElement.value = null;
progressElement.max = null;
progressElement.hidden = true;
if (!text) spinnerElement.hidden = true;
}
statusElement.innerHTML = text;
},
totalDependencies: 0,
monitorRunDependencies: function(left) {
this.totalDependencies = Math.max(this.totalDependencies, left);
Module.setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
}
};
Module.setStatus('Downloading...');
window.onerror = function() {
Module.setStatus('Exception thrown, see JavaScript console');
spinnerElement.style.display = 'none';
Module.setStatus = function(text) {
if (text) Module.printErr('[post-exception status] ' + text);
};
};
</script>
{{{ SCRIPT }}}
</body>
</html>

View file

@ -1,16 +0,0 @@
#define main c2t_main
#include "c2t/c2t-96h.c"
#undef main
#include <emscripten.h>
int main(int argc, char *argv[]) {}
EMSCRIPTEN_KEEPALIVE
int wave_convert(char *input_name) {
static char program_name[] = "c2t-96h",
dashb[] = "-b",
output_name[]="/output.wav";
char *args[] = { program_name, dashb, input_name, output_name, 0 };
return c2t_main(4, args) == 0;
}