; 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