************************************************************ * TAPEBITS * Read cassette data, record duration of each bit phase. * * The buffer contains 2-byte ints, each of which is the * number of loops during a bit phase (ie: how long it was * 0, or how long it was 1). Each loop is 28 clock cycles, * or about one 31960th of a second. So a '1' bit at 2400Hz * should be about 13.32 loops for the entire bit, or 6.66 * for each phase; and a '0' bit at 1200Hz should be about * 26.63 loops per bit, or 13.32 loops per phase. * So when recieving valid cassette data, the numbers for * each phase should be 6, 7, 13, or 14. ************************************************************ PIA1AD equ \$FF20 ; PIA 1, side A, Data register IRQ equ \$10 FIRQ equ \$40 ACTIVE equ \$05FF ; lower right character on screen buffer equ \$4000 ; where to store results endbuf equ \$8000 org \$3000 start equ * bra start2 fcb \$99,\$08,\$25,\$18,\$10 fcc "TAPEBITS V0.1" start2 equ * orcc #IRQ|FIRQ ; disable interrupts sty tmp_y ; save .y ldx #buffer clr over ; no overflows yet lda PIA1AD anda #1 ; look at cassette input bit new equ * sta prev ; 5 ; remember if it is 0 or 1 ldy #1 ; 4 ; initialize counter * Since each phase has an overhead of 32 cycles (new + diff), * we count one additional loop. Loops take 28 cycles each, * so this is pretty close. same equ * leay 1,y ; 5 cmpy #\$FFFF ; 5 ; counter overflow? beq overflow ; 3 lda PIA1AD ; 5 anda #1 ; 2 ; look at cassette input bit cmpa prev ; 5 ; compare with previous beq same ; 3 ; not changed yet; count more * -- * 28 diff equ * inc ACTIVE ; 7 ; show that we're waiting sty ,x++ ; 9 ; phase changed, save count cmpx #endbuf ; 4 ; buffer full? bne new ; 3 ; if not, count more * -- * 23 done equ * stx last ldy #tmp_y ; restore .y andcc #~(IRQ|FIRQ) ; re-enable interrupts rts overflow equ * lda over inca ; another overflow cmpa #30 ; too many? bhs done ; if so, exit sta over ; not too many yet lda prev ; still the same bit value bra diff ; continue counting org \$3100 last fdb 0 ; last address filled + 2 prev fcb 0 ; last known value of cassette bit over fcb 0 ; number of counter overflows tmp_y fdb 0 ; .y saved here on entry end start