Add floppyio to unix port, test mfm decoding

This commit is contained in:
Jeff Epler 2024-03-25 10:21:06 -05:00
parent 7d2e46aa19
commit 1be36bd7cb
8 changed files with 109 additions and 7 deletions

View file

@ -40,6 +40,7 @@ SRC_BITMAP := \
shared-bindings/displayio/Bitmap.c \
shared-bindings/displayio/ColorConverter.c \
shared-bindings/displayio/Palette.c \
shared-bindings/floppyio/__init__.c \
shared-bindings/jpegio/__init__.c \
shared-bindings/jpegio/JpegDecoder.c \
shared-bindings/locale/__init__.c \
@ -69,6 +70,7 @@ SRC_BITMAP := \
shared-module/displayio/Bitmap.c \
shared-module/displayio/ColorConverter.c \
shared-module/displayio/Palette.c \
shared-module/floppyio/__init__.c \
shared-module/jpegio/__init__.c \
shared-module/jpegio/JpegDecoder.c \
shared-module/os/getenv.c \
@ -94,6 +96,7 @@ CFLAGS += \
-DCIRCUITPY_BITMAPTOOLS=1 \
-DCIRCUITPY_CODEOP=1 \
-DCIRCUITPY_DISPLAYIO_UNIX=1 \
-DCIRCUITPY_FLOPPYIO=1 \
-DCIRCUITPY_FUTURE=1 \
-DCIRCUITPY_GIFIO=1 \
-DCIRCUITPY_JPEGIO=1 \

View file

@ -25,8 +25,12 @@
*/
#include "shared-bindings/floppyio/__init__.h"
#if CIRCUITPY_DIGITALIO
#include "shared-bindings/digitalio/DigitalInOut.h"
#include "common-hal/floppyio/__init__.h"
#else
#define FLOPPYIO_SAMPLERATE (24000000)
#endif
#include <math.h>
#include <stdint.h>
@ -53,6 +57,7 @@
//| ...
//|
STATIC mp_obj_t floppyio_flux_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
#if CIRCUITPY_DIGITALIO
enum { ARG_buffer, ARG_data, ARG_index, ARG_index_wait };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_buffer, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
@ -74,6 +79,9 @@ STATIC mp_obj_t floppyio_flux_readinto(size_t n_args, const mp_obj_t *pos_args,
MICROPY_FLOAT_CONST(.220);
return MP_OBJ_NEW_SMALL_INT(common_hal_floppyio_flux_readinto(bufinfo.buf, bufinfo.len, data, index, index_wait_ms));
#else
mp_raise_NotImplementedError(NULL);
#endif
}
MP_DEFINE_CONST_FUN_OBJ_KW(floppyio_flux_readinto_obj, 0, floppyio_flux_readinto);

View file

@ -27,7 +27,10 @@
#pragma once
#include "py/obj.h"
#include "common-hal/digitalio/DigitalInOut.h"
#if CIRCUITPY_DIGITALIO
#include "common-hal/digitalio/DigitalInOut.h"
int common_hal_floppyio_flux_readinto(void *buf, size_t len, digitalio_digitalinout_obj_t *data, digitalio_digitalinout_obj_t *index, mp_int_t index_wait_ms);
#endif
int common_hal_floppyio_mfm_readinto(const mp_buffer_info_t *buf, const mp_buffer_info_t *flux_buf, uint8_t *validity, size_t t2_max, size_t t3_max);

View file

@ -29,8 +29,10 @@
#include "shared-bindings/time/__init__.h"
#include "shared-bindings/floppyio/__init__.h"
#if CIRCUITPY_DIGITALIO
#include "common-hal/floppyio/__init__.h"
#include "shared-bindings/digitalio/DigitalInOut.h"
#endif
#ifndef T2_5
#define T2_5 (FLOPPYIO_SAMPLERATE * 5 / 2 / 1000000)
@ -41,6 +43,7 @@
#include "lib/adafruit_floppy/src/mfm_impl.h"
#if CIRCUITPY_DIGITALIO
MP_WEAK
__attribute__((optimize("O3")))
int common_hal_floppyio_flux_readinto(void *buf, size_t len, digitalio_digitalinout_obj_t *data, digitalio_digitalinout_obj_t *index, mp_int_t index_wait_ms) {
@ -65,6 +68,7 @@ int common_hal_floppyio_flux_readinto(void *buf, size_t len, digitalio_digitalin
// wait for index pulse low
while (READ_INDEX()) { /* NOTHING */
if (supervisor_ticks_ms32() > index_deadline_ms) {
common_hal_mcu_enable_interrupts();
return 0;
}
}
@ -100,6 +104,7 @@ int common_hal_floppyio_flux_readinto(void *buf, size_t len, digitalio_digitalin
return pulses_ptr - pulses;
}
#endif
int common_hal_floppyio_mfm_readinto(const mp_buffer_info_t *buf, const mp_buffer_info_t *flux_buf, uint8_t *validity, size_t t2_max, size_t t3_max) {
mfm_io_t io = {

View file

@ -27,6 +27,8 @@
#ifndef MICROPY_INCLUDED_LIB_TIMEUTILS_TIMEUTILS_H
#define MICROPY_INCLUDED_LIB_TIMEUTILS_TIMEUTILS_H
#include "mpconfigport.h" // CIRCUITPY-CHANGE for MICROPY_EPOCH_IS_1970
// The number of seconds between 1970/1/1 and 2000/1/1 is calculated using:
// time.mktime((2000,1,1,0,0,0,0,0,0)) - time.mktime((1970,1,1,0,0,0,0,0,0))
#define TIMEUTILS_SECONDS_1970_TO_2000 (946684800ULL)

View file

@ -0,0 +1,79 @@
import floppyio
mfm_content = (
b'HHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHH'
b'H00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH0'
b'0HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00H'
b'HHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHH'
b'H00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH0'
b'0HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00H'
b'HHH00HHHH00HHHH00HHHH00HHHH00HHHH00H00000000000000000000000000'
b'00000000000000000000000000000000000000000000000000000000000000'
b'0000000H0H`H`0H`H`0H`H`00000H0HHH00HHHH00HHHH00HHHH00HHHH00HHH'
b'H00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH0'
b'0HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00H'
b'HHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHH'
b'H00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH0'
b'0HHHH00HHHH00HHHH00H000000000000000000000000000000000000000000'
b'00000000000000000000000000000000000000000000000000000H`H`H0`H`'
b'H0`H`H0000000H0000000000000000000000HH0000H`0HH`HH0`000`HH00HH'
b'HH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH'
b'00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00'
b'H0000000000000000000000000000000000000000000000000000000000000'
b'0000000000000000000000000000000000H`H`H0`H`H0`H`H00000`0`0H00H'
b'`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0'
b'HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HH'
b'H0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0H'
b'H0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0'
b'H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H0'
b'0H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H'
b'`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0'
b'HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH'
b'0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0'
b'H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0'
b'H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H0'
b'0H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H'
b'`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0'
b'HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HH'
b'H0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0H'
b'H0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0'
b'H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H0'
b'0H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H'
b'`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0'
b'HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH'
b'0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0'
b'H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0'
b'H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H0'
b'0H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H'
b'`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0'
b'HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HH'
b'H0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0H'
b'H0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0'
b'H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H0'
b'0H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H'
b'`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0'
b'HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH'
b'0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0'
b'H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0'
b'H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H0'
b'0H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H'
b'`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0'
b'HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HH'
b'H0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0H'
b'H0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0'
b'H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H0'
b'0H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H'
b'`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0'
b'HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH'
b'0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0'
b'H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0'
b'H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H0'
b'0H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H'
b'`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0'
b'HH0HH0H00H`0HHH0H0H00H`0HH0``HHHH0`0000hhhhhhhhhhhhhhhhhhhhhhh'
)
b = bytearray(512)
r = floppyio.mfm_readinto(b, mfm_content, 60, 84)
print(r)
print(b)

View file

@ -0,0 +1,2 @@
1
bytearray(b'adafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadaf')

View file

@ -55,12 +55,12 @@ _thread aesio array audiocore
audiomixer binascii bitmapfilter bitmaptools
cexample cmath codeop collections
cppexample displayio errno example_package
gc hashlib heapq io
jpegio json locale math
os platform qrio rainbowio
random re select struct
synthio sys time traceback
uctypes ulab zlib
floppyio gc hashlib heapq
io jpegio json locale
math os platform qrio
rainbowio random re select
struct synthio sys time
traceback uctypes ulab zlib
me
rainbowio random