;;; ;;; Simple cassette data saver ;;; By: Daniel Tufvesson 2018 ;;; ;;; Monitor routines mon_return: equ $c000 mon_pdata: equ $c009 mon_baddr: equ $c01e mon_pcrlf: equ $c021 console_output: equ $7fe8 console_input: equ $7feB page_register: equ $0002 ;;; Address of cassette interface casport: equ $8060 ;;; Program begin here org $a100 jmp start count: fcb 0 bega: fdb 0 enda: fdb 0 txt_ba: fcc "BegAddr: " fcb $04 txt_ea: fcc "EndAddr: " fcb $04 txt_st: fcc "Start tape and press enter" fcb $04 txt_ok: fcc "OK" fcb $0d,$0a,$04 start: ldaa #$f0 staa page_register ;; Ask for address ldx #txt_ba jsr mon_pdata jsr mon_baddr stx bega jsr mon_pcrlf ;; Ask for address ldx #txt_ea jsr mon_pdata jsr mon_baddr stx enda jsr mon_pcrlf ;; Start tape ldx #txt_st jsr mon_pdata jsr console_input cmpa #$0d bne exit jsr mon_pcrlf ;; Begin saving jsr sync ldx bega loop: ldaa ,x jsr byte inx cpx enda bls loop jsr sync clr casport ldx #txt_ok jsr mon_pdata exit: jmp mon_return ;;; ;;; Send sync ;;; 2048 bits "1" ;;; 1 bit "0" ;;; sync: ldx #2048 syncl: ldab #0 stab casport jsr dly0 ldab #1 stab casport jsr dly1 dex bne syncl ;; Send end of sync bit ldab #0 stab casport jsr dly0 ldab #1 stab casport jsr dly0 rts ;;; ;;; Send one byte in A ;;; byte: ldab #8 stab count ;; Start bit - "0" ldab #0 stab casport jsr dly0 ldab #1 stab casport jsr dly0 ;; Data bit bloop: lsra bcs byte1 ;; Send zero ldab #0 stab casport jsr dly0 ldab #1 stab casport jsr dly0 bra byte2 ;; Send one byte1: ldab #0 stab casport jsr dly0 ldab #1 stab casport jsr dly1 ;; End of byte? byte2: dec count bne bloop rts ;;; ;;; Bit delays ;;; dly0: ldab #50 dly0l: decb bne dly0l rts dly1: ldab #100 dly1l: decb bne dly1l rts