; Stand: vermutlich 28 JAN 2010 00:30 (Wiedergefunden am 18. Februar 2020)
org $101
InitMyTimerCmp:
lda #(mytimercmp-$100)
sta $53 ; Variablenmonitor in die ISR des Timer Compare einbinden
bset #5,$12
rts
InitMyTimerOfl:
lda #(mytimerofl-$100)
sta $52
rts ; und zum Userprogramm zurueckkehren.
Exit:
lda #1 ; Auch die ISR des OS ausfuehren.
rts
mytimercmp:
mytimerofl:
; brclr #6,$10,Exit ; Auf Transmit complete flag testen
; Uebergabe des gewuenschten Wertes mittels RANDOMIZE 0 bis 255
; Hintergrundinfo: RANDOMIZE 255 = $9f:$a0 = 0:255
; RANDOMIZE > 255 = $9f:$a0 = timer (oder 1808)
; RANDOMIZE 0 = $9f:$a0 = timer (oder 1808)
lda #$ff
cmp $a0 ; Ausgabe mittels RANDOMIZE 255 ganz abschalten -
beq Exit ; Der Variablenmonitor bleibt jedoch weiterhin aktiv.
inc $9f ; Den Intervallzaehler in $9f hochzaehlen bis Vorgabe aus $a0 erreicht.
lda $9f ;
cmp $a0 ; Intervallvorgabe, wird mittels RANDOMIZE >=1..<=255 gesetzt.
beq Send_Frame
bra Exit
Send_Frame:
;Wennn a0 ungerade ist dann 4x Frame 1 senden und raus, sonst Frames 1,2,3 und 4 senden und danach raus.
;lda $a0
;and #%00000001
;cmp #%00000000
;sei
;bra Send_F1F2F3F4
;bsr F1
;bsr F1
;bsr F1
;bsr F1
;bra Exit
;-----------------
;Beginn Superframe (Jeder Superframe ist in 4 Subframes unterteilt)
;-----------------
;
; -----------
; 1. Subframe Enthaelt: A/D 1 bis 8, Port A Bit 5 bis 1, BASIC PC.
; -----------
F1:
jsr Send_AD_01234567 ; Bytes 1 bis 8 (A/D 8 bis 1)
lda $00 ; Port A lesen
and #%00111100 ; SK-Hi, SK-LO, ASJ-Jumper, DCF LED, ACTIVE LED und RUN LED isolieren
tax
jsr $0c77 ; Framebyte 9 aus x nach RS232
BASIC_PC:
sei
ldx $66 ; High-Byte des User-Programmcounters
lda $67 ; Low-Byte des User-Programmcounters
;cmp $67
;bne BASIC_PC
;cpx $66
;bne BASIC_PC
cli
jsr $0c77 ; Framebyte 10 aus x nach RS232
tax
jsr $0c77 ; Framebyte 11 aus x nach RS232
lda #%10000000 ; Bit 7: Pruefbit = 1
ora $80 ; HOUR
tax
jsr $0c77 ; Framebyte 12 aus x nach RS232 (RTC Stunden)
lda #%10000000 ; Bit 7: Zeitformat/Pruefbit = 1
ora $81 ; MINUTE
tax
jsr $0c77 ; Framebyte 13 aus x nach RS232 (RTC Minuten)
ldx $89 ; SECOND
jsr $0c77 ; Framebyte 14 aus x nach RS232 (RTC Sekunden)
; -----------
; 2. Subframe Enthaelt: Userbyte 8 bis 1, BASIC-Port P1 bis P4, BASIC-Byte 1 bis 5, FREQ1 & 2 Flags.
; -----------
lda #$a1 ; Startadresse fuer Send_8_Bytes
jsr Send_8_Bytes
lda $01 ; Port B lesen
and #%00111111 ; untere 6 bit uebernehmen
ora #%01000000 ; SK 2 hinzufuegen
tax
jsr $0c77 ; Framebyte 9 aus x nach RS232
jsr $115c ; FREQ 1 lesen x = Hi-Byte, a = Lo-Byte
jsr $0c77 ; Framebyte 10, High-Byte von FREQ1 zur RS232
tax
jsr $0c77 ; Framebyte 11, Lo-Byte von FREQ1 zur RS232
lda #%10000000 ; Bit 7: Pruefbit = 1
ora #2
tax
jsr $0c77 ; Byte 12 aus x nach RS232 ("2")
lda #%10000000
ora #2
tax
jsr $0c77 ; Byte 13 aus x nach RS232 ("2")
ldx#$02
jsr $0c77 ; Byte 14 aus x nach RS232 ("2")
; -----------
; 3. Subframe Enthaelt: Userbyte 16 bis 9
; -----------
lda #$a9 ; Startadresse fuer Send_8_Bytes
bsr Send_8_Bytes
lda $02 ; Port C lesen
and #%00111111 ; untere 6 bit uebernehmen
ora #%10000000 ; SK 2 hinzufuegen
tax
jsr $0c77 ; Framebyte 9 aus x nach RS232
jsr $1163 ; FREQ 2 lesen x = Hi-Byte, a = Lo-Byte
jsr $0c77 ; Framebyte 10, High-Byte von FREQ2 zur RS232
tax
jsr $0c77 ; Framebyte 11, Lo-Byte von FREQ2 zur RS232
lda #%10000000 ; Bit 7: Pruefbit = 1
tax
jsr $0c77 ; Byte 12 aus x nach RS232 ("2")
lda #%00000000
tax
jsr $0c77 ; Byte 13 aus x nach RS232 ("2")
jsr $0c77 ; Byte 14 aus x nach RS232 ("2")
; -----------
; 4. Subframe Enthaelt: Userbyte 24 bis 17, BASIC-Port P1 bis P4, BASIC-Byte 1 bis 5, FREQ1 & 2 Flags.
; -----------
lda #$b1 ; Startadresse fuer Send_8_Bytes
bsr Send_8_Bytes
lda $02 ; Port C lesen
and #%00111111 ; untere 6 bit uebernehmen
ora #%11000000 ; SK 2 hinzufuegen
tax
jsr $0c77 ; Framebyte 9 aus x nach RS232
;jsr $1155 ; timer lesen x = Hi-Byte, a = Lo-Byte
;jsr $0c77 ; Framebyte 10, High-Byte von timer zur RS232
;tax
;jsr $0c77 ; Framebyte 11, Lo-Byte von timer zur RS232
ldx $0a ; Datenregister DA1 (Momentanwert PWM-Kanal 1 auslesen)
jsr $0c77
ldx $0b ; Datenregister DA2 (Momentanwert PWM-Kanal 2 auslesen)
jsr $0c77
lda #%10000000 ; Bit 7: Pruefbit = 1
tax
jsr $0c77 ; Byte 12 aus x nach RS232 ("2")
lda #%00000000
tax
jsr $0c77 ; Byte 13 aus x nach RS232 ("2")
ldx#$02
jsr $0c77 ; Byte 14 aus x nach RS232 ("2")
clrx ; Intervallzaehler zuruecksetzen.
stx $9f
bra Exit
; 8 aufeinander folgende Bytes aus dem RAM
; zur RS232 senden. Adresse des ersten Bytes wird im Akku erwartet.
; Startadresse im Akku, Endadresse im X-Register
Send_8_Bytes:
sei
tax ; Startadresse des 1. zu sendenen Bytes wurde im Akku uebergeben
add #$08 ; Adresse des letzten zu sendenden Bytes wird berechnet
sta $9f ; im HI-Byte des PRNG zwischenspeichern
NextByte:
lda $00,x ; Inhalt der Speicherzelle aus x in den Akku laden
Wait_TX:
brclr #6,$10,Wait_TX ; auf Transmit Complete-Flag warten
sta $11 ; Akku ins SCI data register schreiben (RS232)
incx ; naechstes Byte
cpx $9f ; 8 Bytes gesendet? A/D Kanaele >=0...<=7 senden
bne NextByte ; wenn nicht, weitermachen
cli
rts
Send_AD_01234567: ; Kurze Version ohne Hilfsvariable
clrx ; x als Schleifenzaehler verwenden
NextAD:
bsr $0a87 ; Rueckgabe: Akku = Messwert AD(x) , x = 0 <--!
tax
bsr $0c77 ; Byte aus x zur RS232 senden
lda $09 ; Vorigen Wert von x aus dem A/D-Steuerregister restaurieren
and #%00001111
tax
incx
cpx #$08 ; A/D Kanaele >=0...<=7 senden
bne NextAD
rts
; Send_Bytes:
; sei
; ;ldx #$a1 ; Adresse des 1. zu sendenden Bytes steht in X
; ;lda #$a9 ; Adresse des letzten zu sendenden Bytes festlegen (+1)
;
; sta $9f ; im HI-Byte des PRNG zwischenspeichern
;
;
;
; NextByte:
; lda $00,x ; Inhalt der Speicherzelle aus x in den Akku laden
;
; Wait_TX:
; brclr #6,$10,Wait_TX ; auf Transmit Complete-Flag warten
; sta $11 ; Akku ins SCI data register schreiben (RS232)
; incx ; naechstes Byte
; cpx $9f ; 8 Bytes gesendet? A/D Kanaele >=0...<=7 senden
; bne NextByte ; wenn nicht, weitermachen
; cli
; rts
; 11e1 : 3f54 clr $54 ; clear memory at address $54
;11e3 2007 bra $11ec ; branch always to $11ec
;11e5 : 4f clra ; clear accumulator
;11e6 be54 ldx $54 ; load index reg. with value at addr. $54
;11e8 e7a1 sta $a1,x ; store accumulator at address $a1 + x-reg.
;11ea 3c54 inc $54 ; increment at address $54
;11ec : b654 lda $54 ; load accu with value at address $54
;11ee a118 cmp #24 ; compare accumulator with value #$18
;11f0 25f3 blo $11e5 ; branch if accu is lower (C is set)
;11f2 81 rts ; return from subroutine
;p1: ; p1 & p2: Kurze Pause
; lda#$ff
;p1_loop
; deca
; jsr p2
; bne p1_loop
; rts
;p2:
; ldx#$ff
;p2_loop:
; decx
; bne p2_loop
; rts
; Inhalt von Byte 24 nach
; RS232 schreiben
; Betriebssystemroutine aufrufen
; 0c77 : 0d10fd brclr #6,$10,$0c77 ; auf Transmit complete flag warten
; 0c7a bf11 stx $11 ; x ins SCI data register schreiben
; 0c7c 81 rts ; return from subroutine
; ---------------------------------------------------------------------------
; fuer BASIC Token 16 b - internes BASIC-Kommando
; Daten vom AD-Port lesen
;
; input : x = Nummer des AD-Ports (0..7)
; output: a = Wert, x = 0
; used : a,x,$9
;
; called from $1765
; ---------------------------------------------------------------------------
;Send_AD_1to8:
;
; ldx #7
; jsr $0a87
; tax
; jsr $0c77
; ---------------------------------------------------------------------------
; Zahl als ASCII-String dezimal kodiert auf RS232 ausgeben
; die Zahl -32768 wird nicht richtig ausgegeben, was an einem
; Bug in der Divisionsroutine des Betriebssystems liegt
;
; wert=2035 ' entsprechende Logik in BASIC
; merker=0 ' programmiert
; for i=0 to 4
; w=peekw($1dd7+2*i) ' Word aus Tabelle holen
; if wert>=w then
; print chr$(48+wert\w);
; merker=1
; elseif merker=1 then
; print "0";
; end if
; wert=wert MOD w
; next i
;
; input : $d0:$d1 = Zahl (Word)
; output: -
; used : a,x,$11,$54-$59,$d0-$d1,$d9-$da,$dd-$df
;
; called from $0b6f,$18dc,$1b38,$1b54
; ---------------------------------------------------------------------------
;0ce8 : 3fda clr $da ; Merker zur Unterdrueckung von fuehrenden
;
; ldx #$a1
; stx $9f
; jsr Send_Userbytes
;
; lda $02 ; Port C lesen
; and #%00111111 ; untere 6 bit uebernehmen
; ora #%10000000 ; SK 3
; tax
; jsr $0c77 ; Byte 9 aus x nach RS232
;
; jsr $1163 ; FREQ 2 lesen x = Hi-Byte, a = Lo-Byte
; jsr $0c77 ; Framebyte 10, High-Byte von FREQ2 zur RS232
; tax
; jsr $0c77 ; Framebyte 11, Lo-Byte von FREQ2 zur RS232
; lda #%10000000 ; Bit 7: Pruefbit = 1
; ora $6b ; DOW
; tax
; jsr $0c77 ; Framebyte 12 aus x nach RS232 (RTC DOW)
; clrx ;ldx #%00000000 ; (lda #%00000000) ; Bit 7: Pruefbit = 0
; ora #3
; tax
; jsr $0c77 ; Framebyte 13 aus x nach RS232 ("3")
; jsr $0c77 ; Framebyte 14 aus x nach RS232 ("3")
;;Send_AD_01234567: ; Lange Version ohne Hilfsvariable
; ldx #0
;
;NextAD:
;; A/D Port lesen, ohne das x-Register zu loeschen:
; lda $09 ; load accu with value at address $09
; and #$f0 ; AND accu with value #$f0
; sta $09 ; store accumulator at address $09
; txa ; transfer index register to accumulator
; and #$0f ; AND accu with value #$0f
; ora $09 ; OR accu with value at address $09
; sta $09 ; store accumulator at address $09
;AdWaitReady:
; brclr #7,$09,AdWaitReady ; branch to $0a94 if bit #7 at $09 is clear
; lda $08 ; load accu with value at address $08
;
;Accu_to_RS232:
; brclr #6,$10,Accu_to_RS232 ; auf Transmit complete flag warten
; sta $11 ; accu ins SCI data register schreiben
;
; incx
; cpx #$08
; bne NextAD
; rts