the bit boffer
TRANSCRIPT
-
8/9/2019 The Bit Boffer
1/7
My Build of Bit Boffer Audio Cassette Interface
By D.R. Sentz
January, 2015
In 1976-77 I constructed an audio cassette interface for my
homebrew computer. I used the Bit Boffer design by Don
Lancaster, as published in the March 1976 issue of BYTE magazine,
plus the read/write time delay circuits and remote ON/OFF
control circuit described in that same issue of BYTE, in the
article The COMPLEAT Tape Cassette Interfaceby Jack Hemenway.
My Tx clock circuit is slightly different from the Hemenway
article, per the Bit Boffer requirement for 19200 Hz. Bit
Boffer provides the divide-down to 4800 Hz for the ACIA.
My tape recorder did not have an Aux input, so I added a
20kohm gain control to reduce the Bit Boffers output voltage to
just a few millivolts, for the dynamic microphone input.
1976-77 COMPLEAT Tape Cassette Interface with Bit Boffer
-
8/9/2019 The Bit Boffer
2/7
I redrew Figure 1 of the Hemenway article to reflect the
architecture of my build;
Compare to Figure 1 of Jack Hemenway Article, March 1976 BYTE
My build did not work at first. During the troubleshoot I
discovered the following errors in Figure 5 and Figure 6 of the
Bit Boffer article;
The output pin of IC6 was labeled 5, should have been 6.
IC4c and IC4d wiring was incorrect. My markup shows thecorrection that made the circuit work.
IC3 in Figure 5 of the article is supposed to be a 4001
chip, as shown in Figure 8, not a 4011.
See photograph below of my markups.
-
8/9/2019 The Bit Boffer
3/7
From Page 35 of March 1976 Issue of Byte Magazine
I never did write to BYTE magazine to report the artwork errors.
BYTE reported the IC4 wiring correction in the August 1976 issue,
on page 76, but not the other typos.
I wrote I/O software drivers derived from the examples in the
Hemenway article. I bought a Panasonic RQ-212DAS cassette unitjust for this application.
I saved several programs and utilities to audio tape using this
interface. My file directory is on the next page. The largest
program I saved was the paper tape version of the Resident
Assembler MP-E, from Southwest Technical Products Corporation,
which occupies memory range $0088 to $15B6. I used an ASR33 at
my workplace to load the MP-E paper tape to memory, and then I
wrote the memory range to audio tape using my Bit Boffer.
-
8/9/2019 The Bit Boffer
4/7
My Files on Audio Cassette Tape, Thanks to Bit Boffer
January 14, 2015- My Bit Boffer still works. However, I was
always puzzled why I had to specify at least one more byte, to
be written to tape, than the memory range that I intended to
save. Otherwise the read function could not correctly read the
last byte of that range. I recently figured it out and corrected
my tape reader and writer utilities.
The Hemenway article has an error in the example software. The
error always prevents the last byte of the specified memory
range from being written out to the tape. In the test program
named WRITE in Listing 8, the command to turn off the tape
recorder motor is transmitted immediately after the last memory
byte to be written is latched from the ACIA data register to the
ACIA output shift register (i.e., after the Transmit-Data-
-
8/9/2019 The Bit Boffer
5/7
Register-Empty signal transitions from Full toEmpty). At
300 baud rate it takes another 36.7 milliseconds for the serial
transmission to be completed, but the motor was turned off at
the beginning of that serial transmission. Since my tape write
programs were based on the Hemenway article, they had the same
error.
My solution is to send the last byte to the ACIA a 2ndtime, and
then wait for the Data Register Empty signal to transition from
Full to Emptyagain, before turning off the motor. The
signal goes Empty when the first serial transmission of the
last byte completes. Then the motor can be turned off. The
second serial transmission of the last byte will not get
recorded, because the motor was turned off just after that byte
was latched to the serial output register.
My tape writing utilities now work the way I always thought they
should. The program listing for my minimum version is shown
below. It resides in available memory in the MIKBUG RAM so it
can write out to tape the entire 8K user memory space, $0000
to $1FFF, of my computer.
In the Hemenway article he described an interface test procedure
using Listing 8 that would not reveal the software error,
because he did not say to erase or otherwise alter the entire
target memory space after the writing operation and before the
reading operation.
PUNCHER2 exits with a register dump. The X register displays thelast memory location that was written to the tape. The value
should match the contents of locations $A004-$A005.
Here is my minimum tape reader utility. It resides in the
MIKBUG RAM, so I can load from tape up to the 8K memory space of
my computer without overwriting the tape reader utility.
Program LOADER exits with a register dump only if there was a
read error. Otherwise it exits to MIKBUG without a register dump.
I included the MIKBUG-format object code printouts below so you
can copy/paste the object code to your console terminal aftertyping the MIKBUG "L" command.
-
8/9/2019 The Bit Boffer
6/7
00010 NAM PUNCHER2
00020 OPT O,S,NOG OBJECT TAPE AND SYMBOLS
00030 *
00040 * CASSETTE PUNCHER PROGRAM BY DONALD R. SENTZ
00050 * 1977 ORIGINAL, UPDATED JANUARY 2015
00060 * THIS PROGRAM IS USED TO WRITE MEMORY
00070 * TO THE AUDIO CASSETTE UNIT WHICH
00080 * IS INTERFACED TO THE ACIA CHIP ON THE
00090 * MEK6800 BOARD. ENTER START ADDRESS IN
00100 * A002-03, AND END ADDRESS IN A004-05.
00110 * THIS PROGRAM WAS PREPARED USING THE
00120 * RESIDENT EDITOR/ASSEMBLER MP-E.
00130 8010 ACIACT EQU $8010 ACIA CONTROL REGISTER
00140 8011 ACIADT EQU $8011 ACIA DATA REGISTER
00150 A002 ORG $A002
00160 A002 0002 BEGAD RMB 2 START ADDRESS
00170 A004 0002 ENDAD RMB 2 END ADDRESS
00190 A048 ORG $A048
00200 A048 A04A FDB $A04A
00210 A04A FE A002 LDX BEGAD
00220 A04D 8D 2B BSR RESET GO INITIALIZE ACIA
00230 A04F C6 1D LDA B #$1D START MOTOR, DEFINE FORMAT
00240 A051 F7 8010 STA B ACIACT 8 BITS, ODD PARITY, 1 STOP
00250 A054 F6 8010 LOOP1 LDA B ACIACT
00260 A057 C5 08 BIT B #8
00270 A059 26 F9 BNE LOOP1
00280 A05B A6 00 LOOP2 LDA A 0,X GET BYTE FROM MEMORY
00290 A05D B7 8011 STA A ACIADT PUT IT TO I'FACE
00300 A060 8D 10 BSR WAIT
00310 A062 BC A004 CPX ENDAD ARE WE DONE?
00320 A065 27 03 BEQ ENDCH WAIT UNTIL ALL BITS ON TAPE
00330 A067 08 INX POINT TO NEXT MEM LOC.
00340 A068 20 F1 BRA LOOP2 AND KEEP PUTTING
00350 A06A B7 8011 ENDCH STA A ACIADT THIS WRITE IS NECESSARY SO
00360 A06D 8D 03 BSR WAIT THAT THE PRECEDING WRITE
00370 A06F 8D 09 BSR RESET OP. COMPLETES(JAN/2015)
00380 A071 3F SWI00390 A072 F6 8010 WAIT LDA B ACIACT
00400 A075 C5 02 BIT B #2 XMT DATA REG. EMPTY?
00410 A077 27 F9 BEQ WAIT IF NOT, WAIT
00420 A079 39 RTS
00430 A07A C6 5F RESET LDA B #$5F
00440 A07C F7 8010 STA B ACIACT
00450 A07F 39 RTS
00440 END
S00B000050554E4348455232AD
S11EA048A04AFEA0028D2BC61DF78010F68010C50826F9A600B780118D10BC94
S11EA063A00427030820F1B780118D038D093FF68010C50227F939C65FF78008
S105A07E103993
S9
-
8/9/2019 The Bit Boffer
7/7
00001 NAM LOADER
00002 OPT O,S,NOG OBJECT TAPE AND SYMBOLS
00003 *
00004 * CASSETTE LOADER PROGRAM BY DONALD R. SENTZ
00005 * ORIGINAL 1976, REVISED JAN., 2015
00006 * THIS PROGRAM IS USED TO LOAD MEMORY FROM THE
00007 * AUDIO CASSETTE UNIT INTERFACED THROUGH THE
00008 * ACIA ON THE MEK6800 EVALUATION BOARD.
00009 * ENTER START AND END ADDRESSES IN A002-A005
00010 * BEFORE STARTING THIS PROGRAM AND READY TAPE.
00011 * THIS UPDATED LOADER WAS PREPARED USING
00012 * MACWRITE AND THE RESIDENT ASSEMBLER MP-E.
00013 *
00014 8010 ACIACT EQU $8010 ACIA CONTROL REGISTER
00015 8011 ACIADT EQU $8011 ACIA DATA REGISTER
00016 E0E3 CNTRL EQU $E0E3 MIKBUG RETURN POINT
00017 A002 ORG $A002
00018 A002 0002 BEGAD RMB 2 START ADDRESS
00019 A004 0002 ENDAD RMB 2 END ADDRESS
00021 A014 ORG $A014
00022 A014 C6 5F RESET LDA B #$5F PUT RESET CONTROL WORD
00023 A016 F7 8010 STA B ACIACT TO ACIA CONTROL REGISTER
00024 A019 39 RTS
00025 A048 ORG $A048
00026 A048 A04A FDB $A04A
00027 A04A FE A002 LDX BEGAD
00028 A04D 8D C5 BSR RESET GO INITIALIZE ACIA
00029 A04F C6 1D LDA B #$1D START MOTOR, DEFINE FORMAT
00030 A051 F7 8010 STA B ACIACT 8 BITS, ODD PARITY, 1 STOP
00031 A054 F6 8010 LOOP1 LDA B ACIACT
00032 A057 C5 04 BIT B #4 DATA CARRIER DETECT?
00033 A059 26 F9 BNE LOOP1 IF NOT, KEEP CHECKING
00034 A05B F6 8010 LOOP2 LDA B ACIACT
00035 A05E C5 01 BIT B #1 RCV DATA REG. FULL?
00036 A060 27 F9 BEQ LOOP2 IF NOT, KEEP CHECKING.
00037 A062 C5 70 BIT B #$70 ANY ERROR FLAGS SET?
00038 A064 27 03 BEQ CONT IF NOT, GO READ DATA.00039 A066 8D AC BSR RESET STOP MOTOR
00040 A068 3F SWI EXIT IF ANY READ ERROR
00041 A069 B6 8011 CONT LDA A ACIADT READ DATA BYTE
00042 A06C A7 00 STA A 0,X PUT IT TO LOC(X)
00043 A06E BC A004 CPX ENDAD WAS IT THE LAST BYTE?
00044 A071 26 05 BNE CONT2 IF NOT, CONTINUE
00045 A073 8D 9F BSR RESET ELSE STOP MOTOR
00046 A075 7E E0E3 JMP CNTRL AND NORMAL EXIT
00047 A078 08 CONT2 INX POINT TO NEXT LOC
00048 A079 20 E0 BRA LOOP2 AND CONTINUE READING TAPE
00049 END
TOTAL ERRORS 00000
S00B00004C4F414445522020FDS109A014C65FF78010395D
S11EA048A04AFEA0028DC5C61DF78010F68010C50426F9F68010C50127F9C514
S11BA0637027038DAC3FB68011A700BCA00426058D9F7EE0E30820E0E1
S9
THE END