{"id":5037,"date":"2024-04-08T19:38:38","date_gmt":"2024-04-08T19:38:38","guid":{"rendered":"https:\/\/a-thousand-projects-staging-2.onyx-sites.io\/?post_type=project&#038;p=5037"},"modified":"2026-04-29T10:12:19","modified_gmt":"2026-04-29T10:12:19","slug":"mz80k-retro-cassette","status":"publish","type":"project","link":"https:\/\/athousandprojects.com\/staging\/project\/mz80k-retro-cassette\/","title":{"rendered":"MZ80K Retro Cassette Project"},"content":{"rendered":"<div class=\"et_pb_section_0 et_pb_section et_section_regular et_block_section\">\n<div class=\"et_pb_row_0 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_0 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_row_1 et_pb_row et_pb_row_nested et_flex_row\">\n<div class=\"et_pb_column_1 et_pb_column et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_3_5 et_flex_column_3_5_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_image_0 et_pb_image et_pb_module et_flex_module\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2026\/04\/retro-casette-feature-image-1.png\" title=\"retro-casette-feature-image\" width=\"300\" height=\"200\" srcset=\"https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2026\/04\/retro-casette-feature-image-1.png 300w\" sizes=\"(max-width: 300px) 100vw, 300px\" class=\"wp-image-10005\" \/><\/span><\/div>\n<\/div>\n\n<div class=\"et_pb_column_2 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_2_5 et_flex_column_2_5_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_text_0 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><p><span style=\"text-decoration: underline;\">Project Updates<\/span><\/p>\n<ul>\n<li>11 April 2024 - Added tape data format section<\/li>\n<li>10 April 2024 - Added initial page<\/li>\n<\/ul>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_text_1 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><\/div>\n\n<div class=\"et_pb_text_2 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><p>This is an ongoing project for the Sharpe MZ80K computer.<br \/>I like Retro and prefer not to use fast loaders\/ SD\/Compact flash, rather keeping with the original processes.<br \/>To that end, I have been coding up a project to decode and encode MZ80K programs to and from tape using a Commodore 64 cassette tape deck.<\/p>\n<p>There is an available program to encode the MZF files onto tape using the Commodore 64 tape deck via the PC parallel port.<br \/>But.... I wanted the fun of coding this myself, decoding the file structures and building up a device to interface into the tape deck.<br \/>Of course, in future, it would be nice to add encoding\/deciding for ZXC spectrum, C64 and others, but I though I would start with the MZ80K.<\/p>\n<p>Luckly for me, there is a site that has a lot of info on the <a href=\"https:\/\/original.sharpmz.org\/mz-700\/tapeproc.htm\" target=\"_blank\" rel=\"noopener\">MZ80K tape format<\/a>\u00a0-Credit for much of the tech details goes to that site.<\/p>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_2 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_3 et_pb_column et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_6_24 et_flex_column_6_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_image_1 et_pb_image et_pb_module et_flex_module\"><span class=\"et_pb_image_wrap\"><img decoding=\"async\" src=\"https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2025\/11\/c64-TapeInterfacePCB.png\" title=\"c64-TapeInterfacePCB\" class=\"wp-image-9265\" \/><\/span><\/div>\n<\/div>\n\n<div class=\"et_pb_column_4 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_18_24 et_flex_column_18_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_text_3 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><p>Im using a NUCLEO-F411RE dev board with STM32 processor and STM32CubeIDE.<\/p>\n<p>I had some PCB's made up for the Commodore 64 Tape plug so that it was easy to connect it up. This is single sided, and the plug is double sided, however, its just a mirror so only one side needed.<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_4 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><p>&nbsp;<\/p>\n<table border=\"1\" style=\"height: 377px; width: 75.5308%; border-collapse: collapse;\" cellpadding=\"5\">\n<tbody>\n<tr style=\"height: 24px;\">\n<td style=\"width: 16.6667%; text-align: left; height: 24px;\"><strong>Pin<\/strong><\/td>\n<td style=\"width: 33.3333%; height: 24px;\"><strong>Name<\/strong><\/td>\n<td style=\"width: 33.3333%; height: 24px;\"><strong>Description<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 16.6667%; height: 24px;\">1-A<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">GND<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">Ground connection<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 16.6667%; height: 24px;\">2-B<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">+5V<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">5V dc<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 16.6667%; height: 24px;\">3-C<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">Motor<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">6V dc to power the motor. This can be used to enable or disable the motor, otherwise it will run continuously.<\/td>\n<\/tr>\n<tr style=\"height: 27px;\">\n<td style=\"width: 16.6667%; height: 27px;\">4-D<\/td>\n<td style=\"width: 33.3333%; height: 27px;\">Read<\/td>\n<td style=\"width: 33.3333%; height: 27px;\">Data Read - 5V digital<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 16.6667%; height: 24px;\">5-E<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">Write<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">Data Write 5V digital pulse<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 16.6667%; height: 24px;\">6-F<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">Sense<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">Logical Low to indicate if any of the cassette button have been pressed<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_3 et_pb_row et_block_row\">\n<div class=\"et_pb_column_5 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\n<div class=\"et_pb_text_5 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>The Cassette port is connected to the NUCLEO-F411 as follows. The selected IO pins are 5V tolerant, though in the final design, I might add a high speed level shifter.<\/p>\n<table border=\"1\" style=\"height: 216px; width: 100%; border-collapse: collapse;\" cellpadding=\"5\">\n<tbody>\n<tr style=\"height: 24px;\">\n<td style=\"width: 18.289%; height: 24px;\">Nucleo Pin<\/td>\n<td style=\"width: 18.289%;\">STM32 Pin<\/td>\n<td style=\"width: 13.4219%; height: 24px;\">C64 Port Pin<\/td>\n<td style=\"width: 33.3333%; height: 24px;\"><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 18.289%; height: 24px;\"><\/td>\n<td style=\"width: 18.289%;\"><\/td>\n<td style=\"width: 13.4219%; height: 24px;\">1-A<\/td>\n<td style=\"width: 33.3333%; height: 24px;\"><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 18.289%; height: 24px;\"><\/td>\n<td style=\"width: 18.289%;\"><\/td>\n<td style=\"width: 13.4219%; height: 24px;\">2-B<\/td>\n<td style=\"width: 33.3333%; height: 24px;\"><\/td>\n<\/tr>\n<tr style=\"height: 72px;\">\n<td style=\"width: 18.289%; height: 72px;\"><\/td>\n<td style=\"width: 18.289%;\"><\/td>\n<td style=\"width: 13.4219%; height: 72px;\">3-C<\/td>\n<td style=\"width: 33.3333%; height: 72px;\">Connected to separate 6V Power<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 18.289%; height: 24px;\">D10<\/td>\n<td style=\"width: 18.289%;\">PB-6<\/td>\n<td style=\"width: 13.4219%; height: 24px;\">4-D<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">Read input to STM32<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 18.289%; height: 24px;\">CN7 - 21<\/td>\n<td style=\"width: 18.289%;\">PB-7<\/td>\n<td style=\"width: 13.4219%; height: 24px;\">5-E<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">Write output from STM32<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 18.289%; height: 24px;\"><\/td>\n<td style=\"width: 18.289%;\"><\/td>\n<td style=\"width: 13.4219%; height: 24px;\">6-F<\/td>\n<td style=\"width: 33.3333%; height: 24px;\">Not connected Yet<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_4 et_pb_row et_flex_row\">\n<div class=\"et_pb_column_6 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_text_6 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><h1>Pulse Read Timer Setup<\/h1>\n<p>\u00a0I initially thought I would use the combined PWM input of the timer and use the duty cycle to calculate the pulse width and hence the pule time. However the PWN will wait until the next pulse rise to trigger so that it gets the full pulse length. This does not work for reading just the pulse length. The PWM is really meant for a continuous wave form. I could probably have used timeout more, but in the end I opted for \"Input Capture direct mode\" using Timer 4.<\/p>\n<p>The system clock is running at 84Mhz so the timer set up is as follow<\/p>\n<p><strong>Prescaler <\/strong>- 84 to bring the timer to 1Mhz<br \/><strong>Counter Period<\/strong> 1000 - to allow for timeout detection<br \/><strong>Input capture Polarity Selection<\/strong> - Rising Edge<br \/><strong>Prescaler division ratio<\/strong> - None<\/p>\n<p>\u00a0NVIC TIM4 global interrupt - Enabled<\/p>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_5 et_pb_row et_grid_row\">\n<div class=\"et_pb_column_7 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough\">\n<div class=\"et_pb_heading_0 et_pb_heading et_pb_module et_flex_module\"><div class=\"et_pb_heading_container\"><h1 class=\"et_pb_module_header\">Pulse Measurement<\/h1><\/div><\/div>\n\n<div class=\"et_pb_text_7 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module\"><div class=\"et_pb_text_inner\"><p>Using my Saleae Logic Analyzer confirms the pulse lengths which matches much of the documentation I have found online. Of course in the real world, the pulse durations are not perfect and especially with a tape deck. My C64 desk at time of writing this code is old and probably needs to have the belts replaces and a clean up which is on my todo list.<\/p>\n<p>I have set a Long Pulse duration in config for 380us - anything equal or longer is a Long pulse and anything less tahn 380 is decoded as a short pulse. I probably should be a bit more specific about that in the pulse measurement, but it seems to work.<\/p>\n<p>The interrupt is configured to initially trigger on the rising edge and once triggered, reset to trigger on the falling edge. This allows me to measure the pulse length and not worry about the timing on the next incoming pulse.<\/p>\n<\/div><\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_row_6 et_pb_row et_block_row\">\n<div class=\"et_pb_column_8 et_pb_column et_pb_column_4_4 et-last-child et_block_column et_pb_css_mix_blend_mode_passthrough\">\n<div class=\"et_pb_heading_1 et_pb_heading et_pb_module et_block_module\"><div class=\"et_pb_heading_container\"><h1 class=\"et_pb_module_header\">Data Format (Tape)<\/h1><\/div><\/div>\n\n<div class=\"et_pb_text_8 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>The data is stored on the tape in pulses with a long pulse being a logical 1 and a short pulse as a logical 0. The tape also has a number of synchronising pulses and markers to surround the data blocks.<br \/>The tape starts with a synchronising block of pulses and then a sequence of markers, headers and data.\u00a0<\/p>\n<p>\u00a0The documentation I found online says that this block is 22000 shorty pulses, but when I analysed the actual pulses from a few MZ80K tapes, the number of pulses was vastly different and in one tape (NumberTron), the initial pulse markers were fragmented. There were 6 short pulses, followed by a long pulse of 9ms! then another block of 198 short pulses and finally a block of 13202 short pulses.<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_9 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h3>Header File format<\/h3>\n<\/div><\/div>\n\n<div class=\"et_pb_image_2 et_pb_image et_pb_module et_block_module\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/04\/Header-Structure.png\" width=\"1472\" height=\"239\" srcset=\"https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/04\/Header-Structure.png 1472w, https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/04\/Header-Structure-1280x208.png 1280w, https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/04\/Header-Structure-980x159.png 980w, https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/04\/Header-Structure-480x78.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1472px, 100vw\" class=\"wp-image-9722\" title=\"Header Structure\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_10 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h3>Data file format<\/h3>\n<\/div><\/div>\n\n<div class=\"et_pb_image_3 et_pb_image et_pb_module et_block_module\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/05\/File-Structure-2.png\" width=\"1472\" height=\"61\" srcset=\"https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/05\/File-Structure-2.png 1472w, https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/05\/File-Structure-2-1280x53.png 1280w, https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/05\/File-Structure-2-980x41.png 980w, https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/05\/File-Structure-2-480x20.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1472px, 100vw\" class=\"wp-image-9724\" title=\"Mz80Z File structure\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_11 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h3>Sync Block (Long GAP)<\/h3>\n<p>The documentation I found online says that this block is 22000 shorty pulses, but when I analysed the actual pulses from a few MZ80K tapes, the number of pulses was vastly different and in one tape (NumberTron), the initial pulse markers were fragmented. There were 6 short pulses, followed by a long pulse of 9ms! then another block of 198 short pulses and finally a block of 13202 short pulses.<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_image_4 et_pb_image et_pb_module et_flex_module\"><span class=\"et_pb_image_wrap\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/04\/Sync-Pulses-diagram.png\" title=\"Sync-Pulses-diagram\" width=\"1068\" height=\"232\" srcset=\"https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/04\/Sync-Pulses-diagram.png 1068w, https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/04\/Sync-Pulses-diagram-980x213.png 980w, https:\/\/athousandprojects.com\/staging\/wp-content\/uploads\/2024\/04\/Sync-Pulses-diagram-480x104.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1068px, 100vw\" class=\"wp-image-9721\" \/><\/span><\/div>\n\n<div class=\"et_pb_text_12 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><p>Astrododge, had a clean 7 pulses followed by a 13ms gap and finally the main sync block of only 4424 short pulses.<br \/>Princes and Monsters had a clean single block of 4365 pulses.<\/p>\n<p>\u00a0This posed a bit of a problem as from these three tapes it is evident that the initial sync pulses are anything but uniform. In the end I count 1000 pulses regardless of gaps and ignore the rest of the pulses until the next section (Tape markers). As long as there are 1000 or more short pulses, I can safely assume this is the sync block.\u00a0<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_13 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h3>Tape Marks<\/h3>\n<p>The next section is the <strong>Long Tape Mark<\/strong> which marks the start of the header. For the header this is 40 Long Pulses and then 40 Short Pulses. This is, in my reckoning, where the stable data starts. I'm not sure why the initial sync block is so long.<\/p>\n<p>The change in pulse lengths in the section (ie the single Long\u00a0 Pulse after the 40 Short pulse Tape marker is useful to define the end and start of another block. This enables the decoding code to ensure that the pulse counts are what is expected.<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_14 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h3>Tape header<\/h3>\n<p>The header describes the the fie name, size, load and execute addresses. Its 128 bytes long. There is also a 'comment' section of 104 bytes which is just using up the balance of the 128-byte block. I've not seen much data in here, though there do seem to be a few bytes of non-text data at the end. I'm not sure if this is noise or used in some way.<br \/>The program Type is a number that defines the type of data being loaded.<\/p>\n<p>The tape header is duplicated after 256 short pulse marker. This, I assume is a redundancy. Tapes have issues!<\/p>\n<table border=\"1\" style=\"border-collapse: collapse; width: 100.199%; height: 310px;\" height=\"211\">\n<tbody>\n<tr style=\"height: 10px;\">\n<td style=\"width: 20%; height: 10px;\"><span style=\"color: #e09900;\"><strong>Length<\/strong><\/span><\/td>\n<td style=\"width: 20%; height: 10px;\"><span style=\"color: #e09900;\"><strong>Description<\/strong><\/span><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 20%; height: 24px;\">1<\/td>\n<td style=\"width: 20%; height: 24px;\">\n<p>File Type<\/p>\n<p>01 : Machine code file<br \/>02 : MZ-80 BASIC file<br \/>03: MZ-80 data file<br \/>04: MZ7-00 data file<br \/>05: MZ-700 BASIC Program<\/p>\n<\/td>\n<\/tr>\n<tr style=\"height: 72px;\">\n<td style=\"width: 20%; height: 72px;\">17<\/td>\n<td style=\"width: 20%; height: 72px;\">File Name terminated with 0x0d<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 20%; height: 24px;\">2<\/td>\n<td style=\"width: 20%; height: 24px;\">Size of file<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 20%; height: 24px;\">2<\/td>\n<td style=\"width: 20%; height: 24px;\">Load address<\/td>\n<\/tr>\n<tr style=\"height: 48px;\">\n<td style=\"width: 20%; height: 48px;\">2<\/td>\n<td style=\"width: 20%; height: 48px;\">Execution address<\/td>\n<\/tr>\n<tr style=\"height: 48px;\">\n<td style=\"width: 20%; height: 48px;\">104<\/td>\n<td style=\"width: 20%; height: 48px;\">Free text - Comments<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_15 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h3>Header Checksum<\/h3>\n<p>The checksum for both the header and file section is a simple bit counter, counting up the number of set bits in each byte. Its not the best checksum and is open to false results. The checksum is a 2 byte unsigned value and will roll over if the value is over 0xFFFF.<\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_text_16 et_pb_text et_pb_bg_layout_light et_pb_module et_block_module\"><div class=\"et_pb_text_inner\"><h3>Data<\/h3>\n<p>The data block is essentially the same sequence as the header, just that the data section is whatever length is specified in the header. It is also repeated along with a checksum.\u00a0<br \/>The main difference is that the initially sync block is 11000 short pulses and the Tape markers are 20 pulses long each instead of 40.\u00a0<\/p>\n<\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_1 et_pb_section et_section_regular et_block_section\"><\/div>","protected":false},"excerpt":{"rendered":"<p>Decoding Sharp MZ80K tapes the hard way \u2014 a Commodore 64 cassette deck, an STM32, and a hand-built PCB, with no SD cards or fast loaders allowed. An ongoing reverse-engineering log of the real MZ80K tape format, including all the bits the documentation got wrong.<\/p>\n","protected":false},"author":3,"featured_media":10005,"comment_status":"open","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"project_category":[51],"project_tag":[66,67,65],"single-post-status":[],"class_list":["post-5037","project","type-project","status-publish","has-post-thumbnail","hentry","project_category-electronics","project_tag-audio","project_tag-cassette","project_tag-retro-computer"],"acf":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/project\/5037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/project"}],"about":[{"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/types\/project"}],"author":[{"embeddable":true,"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/comments?post=5037"}],"version-history":[{"count":4,"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/project\/5037\/revisions"}],"predecessor-version":[{"id":10376,"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/project\/5037\/revisions\/10376"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/media\/10005"}],"wp:attachment":[{"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/media?parent=5037"}],"wp:term":[{"taxonomy":"project_category","embeddable":true,"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/project_category?post=5037"},{"taxonomy":"project_tag","embeddable":true,"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/project_tag?post=5037"},{"taxonomy":"single-post-status","embeddable":true,"href":"https:\/\/athousandprojects.com\/staging\/wp-json\/wp\/v2\/single-post-status?post=5037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}