Alright, it’s not much to look at, but it’s a start.
This code generates ten seconds of 770Hz square wave, which is the tape header. It is both less compact and less elegant than the code that Woz wrote for the Apple 1 and Apple II, but for that I blame my inexperience (and the fact that Woz was a kind of 6502 savant who had no need for such niceties as assemblers). I hope that it is at least fairly easy to read and understand.
Next up is writing a sync bit, followed by shifting in data from memory and writing it to tape one bit at a time.
.alias IOA $8001 ; 6522 ORA register .alias DDRA $8003 ; 6522 DDRA register .alias TAPEST $40 ; Current tape state scratch area .org $0300 INIT: LDA #$FF ; Make all Port-A IO lines outputs STA DDRA LDA #$00 ; Initialize tape state scratch space STA TAPEST ; ; Write 10 seconds of 770 Hz square wave to tape. ; HEADR: LDX #$3C ; 60 times thru inner loop HEADR0: LDY #$FF ; (60 * 255 = 15,300 half cycles) HEADR1: LDA #$7A ; (122 * 5 uS) + overhead = 650 uS width JSR DELAY JSR WRTAPE DEY BNE HEADR1 ; Inner Loop DEX BNE HEADR0 ; Outer Loop ;; ----- END ------- ;; TODO: Write sync bit, then shift in data and write bit-by-bit. BRK ;; ----- END ------- ; ; Delay for 'A' cycles ('A' * 5 clocks). Modifies the Accumulator. ; DELAY: SBC #$01 BNE DELAY RTS ; ; Toggle the current tape output state. Modifies the Accumulator. ; WRTAPE: LDA TAPEST ; Load current tape state EOR #$01 ; Toggle it STA TAPEST ; Store back into tape state, STA IOA ; and out to tape. RTS