[stella] Teleterm 2600

Subject: [stella] Teleterm 2600
From: "John K. Harvey" <jkharvey@xxxxxxxxxxx>
Date: Tue, 07 Aug 2001 18:07:09 -0500
Hi all,

Speaking of net-demos,

Well, here's a little rs232 demo I wrote up last summer.  It transfers at
300 bauds via joystick 2 pinouts.  I can't remember which pin it transfers
on, but I made a cable which connected 2 9-pin connectors via pins 1 to 3,
3 to 1, 4 to 2, and 2 to 4, but I made the demo rs232 compliant, so only 2
of those wires should really be useful.  To test on itself, take a 9-pin
connector and wire pin 1 to 3 and pin 2 to 4.

Anyway, I've got another project I'm working on, so I'm allowing people to
look at the code and bin file, to fire up some ideas.  Don't know if its
comments are any good, but who can say?  After all, I wrote this a year ago.

Enjoy!

-John
; update 11/6/2000
; sends/receives ASCII data!
        processor 6502
        include vcs.h

; SEND
; $80 - $85
; $86 - $8B
; $8C - $91
; $92 - $97
; $98 - $9D
; $9E - $A3
; $A4 - $A9

; RECEIVE
; $AA - $AF
; $B0 - B5
; $B6 - $BB
; $BC - $C1
; $C2 - $C7
; $C8 - $CD
; $CE - $D3

AlphaPtr = $D4
DirectionBit = $D5
T0 = $D6 ; d6,d7,d8,d9,dA,dB,dC
Temp = $DD ; one WORD
Temp2 = $DF ; one byte during ShiftLoop
Temp3 = $E0 ; one byte during Rub

IncomingByte = $E1
InBitCount = $E2
AreWeReceiving = $E3 ; will emulate 1 bit
InTripleCount = $E4
ThreeBits = $E5
InFirstEight = $E6
InNextSeven = $E7
OutGoingByte = $E8
OutBitCount = $E9
AreWeSending = $EA
SevenOrEight = $EB
T1 = $EC ; $EC,ED,EE,EF,F0,F1,F2
Flag = $F3
Flag2 = $F4
TempCount = $F5
TempChecker = $F6

	org $F000
Start
        SEI ; Disable interrupts, if there are any.
        CLD ; Clear BCD math bit.
        LDX #$FF
        TXS ; Set stack to beginning.
	LDA #0
B1      STA 0,X
	DEX
	BNE B1
Startup
        LDA #144
	STA COLUBK
        LDA #%01000000
        STA DirectionBit
        LDA #%00001100
        STA SWACNT ; set our inputs and outputs (we only actually
                   ; use D2 as an output.
        STA SWCHA  ; send a 1, as required for RS232
        STA AreWeReceiving
        LDA #%00000111
        STA ThreeBits
        LDA #1
        STA InTripleCount
        LDA #$FF
        STA InFirstEight ; must be $FF so that we don't accidentally
        STA InNextSeven  ; think that we've got an immediate lead-in zero.
	JMP VerticalSync


OverScan ; [30 scanlines]
        ; !!!!!!!!! INSERT CODE HERE !!!!!!!!!!!
        STA WSYNC  ; [1]
        ;************* RECEIVE 7-7 *************
        LDA SWCHA
        ROR
        ROL InNextSeven
        ;************* RECEIVE *************
        STA WSYNC  ; [2]

        ; $$$ 16 scanlines emulated with a timer
        LDA #19 ; formerly 18: if > 1201 cycles, you're screwed.
        STA TIM64T
        JSR Receive
OverLoop1
        LDA INTIM
        BNE OverLoop1
        STA WSYNC  ; [18]

        JSR Send   ; *** Fifth SEND *** need 3 receives
        STA WSYNC  ; [19]
        ;************* RECEIVE 8-1 *************
        LDA SWCHA
        ROR
        ROL InFirstEight
        ;************* RECEIVE *************
        STA WSYNC  ; [20]
        LDA #12    ; 10 scanlines worth
        STA TIM64T
        ; !!!!!!!!! INSERT CODE HERE !!!!!!!!!!!
OverLoop2
        LDA INTIM
        BNE OverLoop2
        STA WSYNC  ; [30]




VerticalSync  ; [3]
        LDA #2
        STA VSYNC ; Begin vertical sync.
        STA WSYNC ; [1]
        STA WSYNC ; [2]
        LDA #0
        STA WSYNC ; [3]
        STA VSYNC ; (0)




GameCalc ;  [37]
        LDA #4     ; 3 scanlines worth
        STA TIM64T
        ; !!!!!!!!! INSERT CODE HERE !!!!!!!!!!!
CalcLoop1
        LDA INTIM
        BNE CalcLoop1
        STA WSYNC  ; [3]
        ;************* RECEIVE 8-2 *************
        LDA SWCHA
        ROR
        ROL InFirstEight
        ;************* RECEIVE *************
        STA WSYNC ; [4]
        LDA #19   ; 16 scanlines worth
        STA TIM64T
        LDA #$A4 ; 2
        STA Temp ; 3	
	JSR GameCalc2
        ; !!!!!!!!! INSERT CODE HERE !!!!!!!!!!!
CalcLoop2
        LDA INTIM
        BNE CalcLoop2
        STA WSYNC  ; [20]
        ; !!!!!!!!! INSERT CODE HERE !!!!!!!!!!!
        STA WSYNC  ; [21]
        ;************* RECEIVE 8-3 *************
        LDA SWCHA
        ROR
        ROL InFirstEight
        ;************* RECEIVE *************
        STA WSYNC  ; [22]
        LDA #18    ; 15 scanlines worth
        STA TIM64T
        ; !!!!!!!!! INSERT CODE HERE !!!!!!!!!!!
        LDA #$CE
        STA Temp
        LDA Flag2
        BEQ NotRubbing
        JSR Rub
        JMP CalcLoop3
NotRubbing
        LDA Flag
        CMP #1
        BNE TryAgain
        JSR GameCalc3
        JMP CalcLoop3
TryAgain
        LDA Flag
        CMP #2
        BNE CalcLoop3
        JSR ReceiveSetup
CalcLoop3
        LDA INTIM
        BNE CalcLoop3
        STA WSYNC  ; [37]





DrawScreen
	LDA #0
        STA VBLANK ; (0)
	LDA #50
	STA COLUPF
	JSR Send   ; *** FIRST SEND *** need 3 receives
	STA WSYNC  ; [1]
        LDA #1
        STA CTRLPF
        LDA #200 ;formerly 80
        STA COLUP0
        STA COLUP1
        LDA #35
        STA NUSIZ0
        LDA #51
        STA NUSIZ1
        LSR
        STA VDELP0
        STA VDELP1
        LDA #%11100000 ; or %00010000
        STA HMP0
        STA RESP0
        STA RESP1
        DEY
        LDA #%11110000 ; or %00100000
        STA HMP1
        ;************* RECEIVE 8-4 *************
        LDA SWCHA
        ROR
        ROL InFirstEight
        ;************* RECEIVE *************
        STA WSYNC  ; [2]
        STA HMOVE
        LDA #$FD
        STA PF2
        LDY #8
ScanLoop1A
        STA WSYNC  ; [10]
        DEY
        BNE ScanLoop1A
        LDA #0
        STA VDELP0
        STA VDELP1
        STA NUSIZ0
        STA NUSIZ1
        LDY #7
ScanLoop2A
        STA WSYNC  ; [18]
        LDA #0
        STA COLUPF
        LDA SendWord,Y
        STA GRP0
        LDA SendWord2,Y
        STA GRP1
        DEY
        BPL ScanLoop2A
        LDA #50
        STA COLUPF
        ;************* RECEIVE 8-5 *************
        LDA SWCHA
        ROR
        ROL InFirstEight
        ;************* RECEIVE *************
	STA WSYNC  ; [19]
	LDA #0
	STA GRP0
	STA GRP1
        LDY #9
ScanLoop3A
        STA WSYNC  ; [28]
        DEY
        BNE ScanLoop3A

        LDA #35
        STA NUSIZ0
        LDA #51
        STA NUSIZ1
        LSR
        STA VDELP0
        STA VDELP1

        LDA #0
        STA COLUPF

        ; fixable
        STA WSYNC  ; [29]
        LDA $80
        STA GRP0
        LDA $81
        STA GRP1
        LDA $82
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $85
        LDX $84
        LDA $83
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0

        STA WSYNC  ; [30]
        LDA $86
        STA GRP0
        LDA $87
        STA GRP1
        LDA $88
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $8B
        LDX $8A
        LDA $89
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [31]
        LDA $8C
        STA GRP0
        LDA $8D
        STA GRP1
        LDA $8E
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $91
        LDX $90
        LDA $8F
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [32]
        LDA $92
        STA GRP0
        LDA $93
        STA GRP1
        LDA $94
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $97
        LDX $96
        LDA $95
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [33]
        LDA $98
        STA GRP0
        LDA $99
        STA GRP1
        LDA $9A
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $9D
        LDX $9C
        LDA $9B
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [34]
        LDA $9E
        STA GRP0
        LDA $9F
        STA GRP1
        LDA $A0
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $A3
        LDX $A2
        LDA $A1
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [35]
        LDA $A4
        STA GRP0
        LDA $A5
        STA GRP1
        LDA $A6
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $A9
        LDX $A8
        LDA $A7
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [36]
        LDA #0
        STA GRP0
        STA GRP1
        STA GRP0
        STA GRP1

        ;************* RECEIVE 8-6 *************
        LDA SWCHA
        ROR
        ROL InFirstEight
        ;************* RECEIVE *************
	STA WSYNC  ; [37]
        LDA #50
        STA COLUPF
 ; waste 15 cycles + 1 for send
        LDY #15
ScanLoop4A
        STA WSYNC  ; [52]
        DEY
        BNE ScanLoop4A
        JSR Send   ; *** Second SEND *** need 3 receives
        STA WSYNC  ; [53]
        ;************* RECEIVE 8-7 *************
        LDA SWCHA
        ROR
        ROL InFirstEight
        ;************* RECEIVE *************
        STA WSYNC  ; [54]

        LDA #0
        STA VDELP0
        STA VDELP1
        STA NUSIZ0
        STA NUSIZ1
	STA WSYNC ; [55]
	STA WSYNC ; [56]
        LDY #7
ScanLoop5A
        STA WSYNC  ; [64]
        LDA #0
        STA COLUPF
        LDA RecWord,Y
        STA GRP0
        LDA RecWord2,Y
        STA GRP1
        DEY
        BPL ScanLoop5A
        LDA #50
        STA COLUPF

        LDY #7
ScanLoop6A
        STA WSYNC  ; [71]
        DEY
        BNE ScanLoop6A
	STY GRP0
	STY GRP1
        LDA #35
        STA NUSIZ0
        LDA #51
        STA NUSIZ1
        LSR
        STA VDELP0
        STA VDELP1
        ;************* RECEIVE 8-8 *************
        LDA SWCHA
        ROR
        ROL InFirstEight
        ;************* RECEIVE *************
        STA WSYNC  ; [72]
   ; waste 8 cycles
        LDY #7
ScanLoop5
        STA WSYNC  ; [79]
        DEY
        BNE ScanLoop5
	LDA #0
	STA COLUPF
        STA WSYNC  ; [80]
        LDA $AA
        STA GRP0
        LDA $AB
        STA GRP1
        LDA $AC
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $AF
        LDX $AE
        LDA $AD
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0

        STA WSYNC  ; [81]
        LDA $B0
        STA GRP0
        LDA $B1
        STA GRP1
        LDA $B2
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $B5
        LDX $B4
        LDA $B3
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [82]
        LDA $B6
        STA GRP0
        LDA $B7
        STA GRP1
        LDA $B8
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $BB
        LDX $BA
        LDA $B9
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [83]
        LDA $BC
        STA GRP0
        LDA $BD
        STA GRP1
        LDA $BE
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $C1
        LDX $C0
        LDA $BF
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [84]
        LDA $C2
        STA GRP0
        LDA $C3
        STA GRP1
        LDA $C4
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $C7
        LDX $C6
        LDA $C5
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [85]
        LDA $C8
        STA GRP0
        LDA $C9
        STA GRP1
        LDA $CA
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $CD
        LDX $CC
        LDA $CB
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [86]
        LDA $CE
        STA GRP0
        LDA $CF
        STA GRP1
        LDA $D0
        STA GRP0
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        LDY $D3
        LDX $D2
        LDA $D1
        STA GRP1
        STX GRP0
        STY GRP1
        STX GRP0
        STA WSYNC  ; [87]

        LDA #0
        STA GRP0
        STA GRP1
        STA GRP0
        STA GRP1
	STA WSYNC  ; [88]
        LDA #50
        STA COLUPF
        ;************* RECEIVE 7-1 *************
        LDA SWCHA
        ROR
        ROL InNextSeven
        ;************* RECEIVE *************
        STA WSYNC  ; [89]
   ; waste 16 cycles + 1 for send
        LDY #16
ScanLoop6
        STA WSYNC  ; [105]
        DEY
        BNE ScanLoop6
        JSR Send   ; *** Third SEND *** need 3 receives
        STA WSYNC  ; [106]
        ;************* RECEIVE 7-2 *************
        LDA SWCHA
        ROR
        ROL InNextSeven
        ;************* RECEIVE *************
        STA WSYNC  ; [107]
   ; waste 16 cycles
        LDY #16
ScanLoop7 
        STA WSYNC  ; [123]
        DEY
        BNE ScanLoop7
	;************* RECEIVE 7-3 *************
        LDA SWCHA
        ROR
        ROL InNextSeven
        ;************* RECEIVE *************
        STA WSYNC  ; [124]
        STY NUSIZ0
        STY NUSIZ1
        STY VDELP0
        STY VDELP1
        STY COLUPF

ScanLoop8
        STA WSYNC  ; [132]
        LDA Arrow,Y
        STA GRP0
        INY
        CPY #8
        BNE ScanLoop8
        STA WSYNC  ; [133]
        LDA #0
        STA GRP0
        LDY #7
        LDX AlphaPtr
DrawChar
        STA WSYNC  ; [141]
        LDA Alphabet,X
        STA GRP0
        INX
        DEY
        BPL DrawChar
        ;************* RECEIVE 7-4 *************
        LDA SWCHA
        ROR
        ROL InNextSeven
        ;************* RECEIVE *************
        STA WSYNC  ; [142]
   ; waste 15 cycles + 1 for send
        INY
        STY GRP0
        LDY #7
ScanLoop9A
        STA WSYNC  ; [150]
        LDA Arrow,Y
        STA GRP0
        DEY
        BPL ScanLoop9A
        LDY #7
ScanLoop9
        STA WSYNC  ; [157]
        DEY
        BNE ScanLoop9
        JSR Send   ; *** Fourth SEND *** need 3 receives
        STA WSYNC  ; [158]
        ;************* RECEIVE 7-5 *************
        LDA SWCHA
        ROR
        ROL InNextSeven
        ;************* RECEIVE *************
        STA WSYNC  ; [159]
   ; waste 17 cycles
        LDY #17
ScanLoop10 
        STA WSYNC  ; [176]
        DEY
        BNE ScanLoop10
        ;************* RECEIVE 7-6 *************
        LDA SWCHA
        ROR
        ROL InNextSeven
        ;************* RECEIVE *************
        STA WSYNC ; [177]
   ; waste 14 cycles
        LDY #14
ScanLoop11
        STA WSYNC  ; [191]
        DEY
        BNE ScanLoop11
        LDA #2
        STA VBLANK ; (2)
        STA WSYNC  ; [192]
        JMP OverScan







GameCalc2
        LDA DirectionBit
        ROL
        ROL
        BPL NotPrintingData
        ROL
        BPL ShiftHop
        JMP Rub
ShiftHop
        JMP ShiftLoop
NotPrintingData
        LDA AlphaPtr
        AND #7
        BNE MoveAlpha
        LDA SWCHA
        ROL
        ROL
        BPL Left
        ROL
        BPL Right
        JMP Button

MoveAlpha
        LDA DirectionBit
        BPL Up
        DEC AlphaPtr
        RTS
Up      INC AlphaPtr
        RTS


Left
        LDA #%01111111
        AND DirectionBit
        STA DirectionBit
        INC AlphaPtr
        RTS
Right
        LDA #%10000000
        ORA DirectionBit
        STA DirectionBit
        DEC AlphaPtr
        RTS

Button
        LDA DirectionBit
        ROL
        BPL StatePressed
        LDA INPT4
        BPL JustPressed
        RTS
StatePressed
        LDA INPT4
        BPL StillPressed
        LDA #%01000000
        ORA DirectionBit
        STA DirectionBit
StillPressed
        RTS
JustPressed
        LDA #%10111111
        AND DirectionBit
        STA DirectionBit
        LDA #%00100000
        ORA DirectionBit
        STA DirectionBit

        ; Send
        LDA AlphaPtr     ; 2
        CLC
        LSR
        LSR
        LSR
        TAY
        LDA ASCIITable,Y
        STA OutGoingByte ; 3
        LDA #1           ; 2
        STA AreWeSending ; 3
        LDA #10          ; 2
        STA OutBitCount  ; 3

NewStuff
        LDA AlphaPtr
        ; AND #%11111000 ; not necessary, as button was pressed
        CMP #%00001000
        BEQ Rubbing
        CMP #0
        BNE NotSpace
        LDX #6
        LDA #0
Loop2   STA T0,X
        DEX
        BPL Loop2
        LDA #3
        STA Temp2
        RTS
NotSpace
        LDY #6
Loop    TYA
        CLC
        ADC AlphaPtr
        TAX
        LDA Alphabet,X
        STA T0,Y
        DEY
        BPL Loop
        LDA AlphaPtr
        CLC
        LSR
        LSR
        LSR
        TAY
        LDA Shifts,Y
        STA Temp2 ; # of shifts
        RTS ; we're set up, so let's return
Rubbing
        LDA #%00110000
        ORA DirectionBit
        STA DirectionBit
        RTS ; we're set up, so let's return.




ShiftLoop
        ; Note: Temp is determined at the start of gamecalc
        ; it tells which field of charaters to move
        LDX #6 ;rows ; 2 [8]
RowLoop  ROL T0,X ; 6
         LDY #5 ;columns ; 2
ColLoop   LDA (Temp),Y ;14 cycle inner loop (not accounting for +1)
          ROL          ; total = 15*5 + 14 = 89
          STA (Temp),Y
          DEY
          BPL ColLoop
         LDA Temp ;3 ; 100
         SEC      ; 2
         SBC #6   ; 2
         STA Temp ; 3
         DEX      ; 2
         BPL RowLoop ; 2 => 112*6 + 111 = [783]

        DEC Temp2
        BPL OutHere
        LDA #%11011111
        AND DirectionBit
        STA DirectionBit
        ; Play a sound!
OutHere RTS





Rub
        ; Note: Temp is determined at the start of gamecalc
        ; it tells which field of charaters to move
        LDX #6
        STX TempCount
         LDY #0
         STY TempChecker ; where we will rotate the bits.  If empty, we're done
         CLC
RowLoop2  LDA (Temp),Y
          ROR
          STA (Temp),Y
          INY
          DEX
          BNE RowLoop2
          ROR TempChecker ; rotate the carry bits into a temp reg.
         LDA Temp
         SEC
         SBC #6
         STA Temp
         LDX #6
         LDY #0
         CLC
         DEC TempCount
         BPL RowLoop2
        LDA TempChecker
        BNE OutofHere
        LDA Temp
        CMP #122
        BNE BottomScroll
        LDA #%11001111
        AND DirectionBit
        STA DirectionBit
        RTS
BottomScroll
        LDA #0
        STA Flag2
        STA Flag
OutofHere
        RTS




ReceiveSetup
        LDA #1
        STA Flag
        LDA IncomingByte
        ; AND #%11111000 ; not necessary, as button was pressed
        CMP #8 ; ASCII backspace
        BEQ Rubbing2
        CMP #32
        BNE NotSpace2
        LDX #6
        LDA #0
Loop22  STA T1,X
        DEX
        BPL Loop22
        LDA #3
        STA Temp3
        RTS
NotSpace2
        CMP #63
        BNE NotQuestion
        LDA #5
        STA IncomingByte
        BNE FinalSetup
NotQuestion
        CMP #45
        BNE NotHyphen
        LDA #4
        STA IncomingByte
        BNE FinalSetup
NotHyphen
        CMP #46
        BNE NotPeriod
        LDA #3
        STA IncomingByte
        BNE FinalSetup
NotPeriod
        CMP #33
        BNE NotExclaim
        LDA #2
        STA IncomingByte
        BNE FinalSetup
NotExclaim

        LDA IncomingByte
        SEC
        SBC #59
FinalSetup
        CLC
        ASL
        ASL
        ASL
        STA IncomingByte
        LDY #6
Loop1   TYA
        CLC
        ADC IncomingByte
        TAX
        LDA Alphabet,X
        STA T1,Y
        DEY
        BPL Loop1
        LDA IncomingByte
        CLC
        LSR
        LSR
        LSR
        TAY
        LDA Shifts,Y
        STA Temp3 ; # of shifts
        RTS ; we're set up, so let's return
Rubbing2
        LDA #1
        STA Flag2
        RTS ; we're set up, so let's return.





GameCalc3
        ; Note: Temp is determined at the start of gamecalc
        ; it tells which field of charaters to move
        LDX #6 ;rows ; 2 [8]
RowLoop3 ROL T1,X ; 6
         LDY #5 ;columns ; 2
ColLoop3  LDA (Temp),Y ;14 cycle inner loop (not accounting for +1)
          ROL          ; total = 15*5 + 14 = 89
          STA (Temp),Y
          DEY
          BPL ColLoop3
         LDA Temp ;3 ; 100
         SEC      ; 2
         SBC #6   ; 2
         STA Temp ; 3
         DEX      ; 2
         BPL RowLoop3 ; 2 => 112*6 + 111 = [783]

        DEC Temp3
        BPL OutHere3
        LDA #0
        STA Flag
        ; Play a sound!
OutHere3
        RTS


	ORG $FC00


        ; ******** SEND ***********
        ; = including JSR and RTS's
        ; 17 cycles OR
        ; 38 cycles
        ; 40 cycles
        ; 46
        ; 47

        ; 6 for JSR
Send    LDA AreWeSending   ; 3
        BNE YesSending     ; 2 ; 11
        RTS                ; 6
YesSending                 ; +1
        DEC OutBitCount    ; 5
        LDA OutBitCount    ; 3 must be here forthe cmp later!
        BEQ LastOutBit     ; 2 ; 22
        CMP #9             ; 2
        BNE NotFirstOutBit ; 2 ; 26
FirstBittoSend
        LDA #0             ; 2
        STA SWCHA          ; 4 ;%xxxxx0xx ; Send a 0.
        RTS                ; 6 [38]
LastOutBit                 ; +1
        LDA #%00000100     ; 2  ; store a 1 to SWCHA
        STA SWCHA          ; 4
        LDA #0             ; 2  ; we're no longer sending
        STA AreWeSending   ; 3
        RTS                ; 6 [40]
NotFirstOutBit             ; +1
        ROR OutGoingByte   ; 5  ; bit is now in carry flag
        BCS SetCarry       ; 2 ; 34
        LDA #0             ; 2
        STA SWCHA          ; 4
        RTS                ; 6 [46]
SetCarry                   ; +1
        LDA #%00000100     ; 2
        STA SWCHA          ; 4
        RTS                ; 6 [47]





NextSeven
        LDX #8
RestofSeven
        DEX
        BNE HereForSeven
        RTS

Receive
        ROL InNextSeven  ; to make the ROL easier later
        LDY #9
Again
        TYA
        BEQ RestofSeven
        DEY
        BEQ NextSeven
        ROL InFirstEight
        JMP ThruRec
HereForSeven
        ROL InNextSeven
ThruRec
        LDA ThreeBits
        ROL
        AND #%00000111
        STA ThreeBits
        DEC InTripleCount
        BEQ ProbCheck
        JMP Again

ProbCheck ; we have 3 new bits
        LDA AreWeReceiving
        BNE NotReceivingYet
        LDA #3 ; always reset this
        STA InTripleCount
        DEC InBitCount           ;on 9th bit
        BNE BitToByte
        LDA #1
        STA AreWeReceiving
        STA InTripleCount
        LDA IncomingByte
        ;STA COLUBK
        LDA #2
        STA Flag
        JMP Again
BitToByte
        ; ****************************

        ; check probability of 1'sor 0's in ThreeBit and store on byte
        ; <function>
        ; code assumes 1 or 0 placed in D0 of Acc.
        LDA ThreeBits
        CMP #3
        BMI Zero
        CMP #4
        BEQ Zero
        LDA #1
        BNE PastZero
Zero
        LDA #0
PastZero
        ; ****************************
        CLC
        ROR ; sets carry flag if a 1 in D0
        ROR IncomingByte 
        JMP Again

NotReceivingYet
        LDA #1
        STA InTripleCount

        ; ****************************
        ; this routine will see there is a 2/3 probability of 0.
        LDA ThreeBits
        AND #%00000100
        BNE Close ; If we don't have a lead-in zero, don't receive yet
        LDA ThreeBits
        CMP #3
        BMI StartingToReceive
        CMP #4
        BEQ StartingToReceive
Close   JMP Again
        ; ****************************
StartingToReceive
        LDA #9           ; set these only when we have 2/3 probability of
        STA InBitCount   ; the starter 0.
        LDA #0
        STA AreWeReceiving
        LDA #3
        STA InTripleCount
        JMP Again

        org $FE00

Alphabet
; null1 spc
        .byte %01110111
        .byte %01000101
        .byte %01000101
        .byte %01110111
        .byte %00010100
        .byte %00010100
        .byte %01110100
        .byte 0

; null2 rub
        .byte %01110100
        .byte %01010100
        .byte %01110100
        .byte %01100111
        .byte %01110101
        .byte %01010101
        .byte %01010111
        .byte 0
; !
        .byte %01000000
        .byte %01000000
        .byte %01000000
        .byte %01000000
        .byte %00000000
        .byte %01000000
        .byte %01000000
        .byte 0
; .
        .byte %00000000
        .byte %00000000
        .byte %00000000
        .byte %00000000
        .byte %00000000
        .byte %01000000
        .byte %01000000
        .byte 0

; -
        .byte %00000000
        .byte %00000000
        .byte %00000000
        .byte %01110000
        .byte %00000000
        .byte %00000000
        .byte %00000000
        .byte 0

; ?
        .byte %01111110
        .byte %01000010
        .byte %00000010
        .byte %00011110
        .byte %00011000
        .byte %00000000
        .byte %00011000
        .byte 0

; A
        .byte %01110000
        .byte %01010000
        .byte %01010000
        .byte %01110000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte 0

; B
        .byte %01110000
        .byte %01001000
        .byte %01001000
        .byte %01110000
        .byte %01001000
        .byte %01001000
        .byte %01110000
        .byte 0

; C
        .byte %01110000
        .byte %01010000
        .byte %01000000
        .byte %01000000
        .byte %01000000
        .byte %01010000
        .byte %01110000
        .byte 0

; D
        .byte %01110000
        .byte %01011000
        .byte %01001000
        .byte %01001000
        .byte %01001000
        .byte %01011000
        .byte %01110000
        .byte 0
; E
        .byte %01110000
        .byte %01000000
        .byte %01000000
        .byte %01110000
        .byte %01000000
        .byte %01000000
        .byte %01110000
        .byte 0

; F
        .byte %01110000
        .byte %01000000
        .byte %01000000
        .byte %01110000
        .byte %01000000
        .byte %01000000
        .byte %01000000
        .byte 0
; G
        .byte %01111000
        .byte %01000000
        .byte %01000000
        .byte %01011000
        .byte %01001000
        .byte %01001000
        .byte %01111000
        .byte 0

; H
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %01110000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte 0

; I
        .byte %01110000
        .byte %00100000
        .byte %00100000
        .byte %00100000
        .byte %00100000
        .byte %00100000
        .byte %01110000
        .byte 0

; J
        .byte %00010000
        .byte %00010000
        .byte %00010000
        .byte %00010000
        .byte %01010000
        .byte %01010000
        .byte %01110000
        .byte 0

; K
        .byte %01001000
        .byte %01001000
        .byte %01010000
        .byte %01100000
        .byte %01010000
        .byte %01001000
        .byte %01001000
        .byte 0

; L
        .byte %01000000
        .byte %01000000
        .byte %01000000
        .byte %01000000
        .byte %01000000
        .byte %01000000
        .byte %01110000
        .byte 0

; M
        .byte %01100011
        .byte %01110111
        .byte %01011101
        .byte %01001001
        .byte %01000001
        .byte %01000001
        .byte %01000001
        .byte 0

; N
        .byte %01000010
        .byte %01100010
        .byte %01110010
        .byte %01011010
        .byte %01001110
        .byte %01000110
        .byte %01000010
        .byte 0

; O
        .byte %01110000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %01110000
        .byte 0

; P
        .byte %01110000
        .byte %01010000
        .byte %01010000
        .byte %01110000
        .byte %01000000
        .byte %01000000
        .byte %01000000
        .byte 0

; Q
        .byte %01111000
        .byte %01001000
        .byte %01001000
        .byte %01001000
        .byte %01011000
        .byte %01001000
        .byte %01111100
        .byte 0

; R
        .byte %01110000
        .byte %01010000
        .byte %01010000
        .byte %01110000
        .byte %01100000
        .byte %01010000
        .byte %01010000
        .byte 0

; S
        .byte %01110000
        .byte %01000000
        .byte %01000000
        .byte %01110000
        .byte %00010000
        .byte %00010000
        .byte %01110000
        .byte 0

; T
        .byte %01110000
        .byte %00100000
        .byte %00100000
        .byte %00100000
        .byte %00100000
        .byte %00100000
        .byte %00100000
        .byte 0

; U
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %01110000
        .byte 0

; V
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %00100000
        .byte %00100000
        .byte 0

; W
        .byte %01000001
        .byte %01000001
        .byte %01000001
        .byte %01001001
        .byte %01011101
        .byte %01110111
        .byte %00100010
        .byte 0

; X
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte %00100000
        .byte %01010000
        .byte %01010000
        .byte %01010000
        .byte 0

; Y
        .byte %01010000
        .byte %01010000
        .byte %01110000
        .byte %00100000
        .byte %00100000
        .byte %00100000
        .byte %00100000
        .byte 0

; Z
        .byte %01111100
        .byte %00000100
        .byte %00001000
        .byte %00010000
        .byte %00100000
        .byte %01000000
        .byte %01111100
        .byte 0

        org $FF00
Shifts
        .byte 3 ; space
        .byte $FF ; rub
        .byte 1 ; !
        .byte 1 ; .
        .byte 3 ; -
        .byte 6 ; ?
        .byte 3 ; A
        .byte 4 ; B
        .byte 3 ; C
        .byte 4 ; D
        .byte 3 ; E
        .byte 3 ; F
        .byte 4 ; G
        .byte 3 ; H
        .byte 3 ; I
        .byte 3 ; J
        .byte 4 ; K
        .byte 3 ; L
        .byte 7 ; M
        .byte 6 ; N
        .byte 3 ; O
        .byte 3 ; P
        .byte 5 ; Q
        .byte 3 ; R
        .byte 3 ; S
        .byte 3 ; T
        .byte 3 ; U
        .byte 3 ; V
        .byte 7 ; W
        .byte 3 ; X
        .byte 3 ; Y
        .byte 5 ; Z

Arrow              
        .byte %00000000
        .byte %00011000
        .byte %00111100
        .byte %01111110
        .byte %11111111
        .byte %00011000
        .byte %00011000
        .byte %00011000

SendWord
        .byte %00000000
        .byte %11101110
        .byte %00101000
        .byte %00101000
        .byte %11101100
        .byte %10001000
        .byte %10001000
        .byte %11101110
SendWord2
        .byte %00000000
        .byte %10010010
        .byte %10110010
        .byte %10110010
        .byte %11110010
        .byte %11010010
        .byte %11010010
        .byte %10010111
RecWord
        .byte %00000000
        .byte %10101110
        .byte %10101000
        .byte %11001000
        .byte %11101100
        .byte %10101000
        .byte %10101000
        .byte %11101110
RecWord2
        .byte %00000000
        .byte %11100111
        .byte %10000101
        .byte %10000101
        .byte %10000111
        .byte %10000001
        .byte %10001001
        .byte %11101001

; ASCII codes
; A = 65, .... Z = 90
; ? = 63
; Bksp = 
; . =  46
; ! = 33
; - = 45
; SP = 

ASCIITable
        .byte 32 ; space
        .byte 8  ; rub
        .byte 33 ; !
        .byte 46 ; .
        .byte 45 ; -
        .byte 63 ; ?
        .byte 65 ; A
        .byte 66 ; B
        .byte 67 ; C
        .byte 68 ; D
        .byte 69 ; E
        .byte 70 ; F
        .byte 71 ; G
        .byte 72 ; H
        .byte 73 ; I
        .byte 74 ; J
        .byte 75 ; K
        .byte 76 ; L
        .byte 77 ; M
        .byte 78 ; N
        .byte 79 ; O
        .byte 80 ; P
        .byte 81 ; Q
        .byte 82 ; R
        .byte 83 ; S
        .byte 84 ; T
        .byte 85 ; U
        .byte 86 ; V
        .byte 87 ; W
        .byte 88 ; X
        .byte 89 ; Y
        .byte 90 ; Z

        org $FFFC
	.word Start
	.word Start

Attachment: 0000.bin
Description: Binary data

Current Thread