the bit boffer

Upload: random73

Post on 01-Jun-2018

216 views

Category:

Documents


0 download

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