; ***************************************
; ***                                 ***
; ***   6510-Developers-Packet V1.0   ***
; ***   Empfangsprogramm "Transfer"   ***
; ***                                 ***
; ***    programmiert von             ***
; ***          Christian Krenner      ***
; ***    (C)opyright 1992             ***
; ***    Markt & Technik Verlag AG    ***
; ***                                 ***
; ***************************************

; !!! Unbedingt "CONVERT:C64.con" als Konvertierungstabelle verwenden !!!
; Logische Laufwerke müssen definiert sein (Assignthem).
; Als Dateinamen bei der Assemblierung dann "SOURCE:Transfer.src" angeben.
; Assemblierung erfolgt in die Datei "OBJECT:Transfer.obj".
; Braucht die Dateien "INCLD:Kernel-ROM.inc" und
;                     "INCLD:CIA.inc"

; **********************
; *** Vorbereitungen ***
; **********************

                  .base 2049, "OBJECT:Transfer.obj"
                               ;Startadresse = Basicstart
                  .include "INCLD:Kernel-ROM.inc"
                  .include "INCLD:CIA.inc"

; *************************
; *** Labels und Makros ***
; *************************

STROUT            .equal $ab1e    ;Wäre auch in "INCLD:Basic-ROM.inc",
INLIN             .equal $a560    ;aber so geht's schneller.
LINPRT            .equal $bdcd
Use               .equal $fb      ;unbenutztes Zeropage-Register

                  .macro PrintText,1   ;Text ausgeben, Param 1: Textadresse
                  lda   #<?0
                  ldy   #>?0
                  jsr   STROUT
                  .endmacro

; ******************
; *** Basic-Kopf ***
; ******************

                  .word BK_lp1 
                  .word 1992
                  .byte 158
;                  .ascii " 2077 (c)1992 m&t ag"
                  .ascii " 2077 (c)1994 MMedia"

BK_lp1            .byte 0,0,0

; ************************
; *** Benutzereingaben ***
; ************************

Start             jsr   CINT           ;Bildschirmreset
                  lda   #0             ;Anzahl auf 0 setzen
                  sta   Anzahl
                  sta   Anzahl+1

                  PrintText Text1      ;Text ausgeben

II_lp2            jsr   INLIN          ;Filenamen von Tastatur

                  PrintText Text2      ;Text ausgeben

                  ldx   #0             ;Länge des Namen ermitteln
II_lp3            lda   $200,x
                  beq   II_lp4
                  sta   Name+2,x
                  inx
                  bne   II_lp3
II_lp4            sta   Name+2,x
                  inx
                  inx
                  stx   Use            ;Länge merken

                  lda   #'s            ;Scratch-Kommando
                  sta   Name
                  lda   #1             ;Fileparameter setzen
                  ldx   #8
                  ldy   #15
                  jsr   SETFLSV
                  lda   Use            ;Namen übergeben
                  ldx   #<Name
                  ldy   #>Name
                  jsr   SETNAMV
                  jsr   OPENV          ;File löschen
                  lda   #1
                  jsr   CLOSEV         ;File schließen

                  lda   #'0            ;nicht mehr scratchen
                  sta   Name
                  lda   #1             ;Fileparameter setzen
                  ldx   #8
                  ldy   #1
                  jsr   SETFLSV
                  lda   Use            ;Namen übergeben
                  ldx   #<Name
                  ldy   #>Name
                  jsr   SETNAMV
                  jsr   OPENV          ;File öffnen

                  PrintText Text3      ;Text ausgeben

                  ldx   #1             ;File 1 für Ausgabe setzen
                  jsr   CHKOUTV

; ***********************************
; *** Übertragung und Speicherung ***
; ***********************************

; *** auf erstes Byte warten ***

                  sei                  ;IRQ sperren
US_lp2            lda   #%00010000     ;Maske für Bit 4
                  bit   CIA2+ICR       ;Auf anliegendes Byte testen
                  bne   US_lp1         ;Byte da -> Byte speichern
                  lda   CIA2+PRB       ;Signal ausgeben
                  jmp   US_lp2         ;weiter warten

; *** Bytes bis Timeout übertragen ***

US_lp3            ldx   #$40           ;TimeOut-Zähler High
                  ldy   #0             ;TimeOut-Zähler Low
US_lp4            lda   #%00010000     ;Maske für Bit 4
                  bit   CIA2+ICR       ;auf anliegendes Byte testen
                  bne   US_lp1         ;Byte da -> speichern
                  dey                  ;kein Byte -> Zähler erniedrigen
                  bne   US_lp4         ;noch nicht 0 -> warten
                  dex                  ;Zähler (high) erniedrigen
                  bne   US_lp4         ;noch nicht 0 -> weiter warten
                  jmp   EN_lp1         ;sonst beenden

US_lp1            lda   CIA2+PRB       ;Byte vom Port holen
                  cli                  ;IRQ erlauben
                  jsr   CHROUTV        ;Zeichen speichern
                  jsr   STOPV          ;auf Stop prüfen
                  beq   EN_lp1         ;gedrückt -> beenden
                  lda   Anzahl         ;Anzahl erhöhen
                  clc
                  adc   #1
                  sta   Anzahl
                  lda   Anzahl+1
                  adc   #0
                  sta   Anzahl+1
                  sei                  ;IRQ wieder sperren
                  jmp   US_lp3         ;weiter empfangen

; ***************************
; *** Übertragung beenden ***
; ***************************

EN_lp1            cli                  ;IRQ zulassen
                  jsr   CLRCHNV        ;Clear Channels
                  lda   #1             ;File schließen
                  jsr   CLOSEV

                  ldx   Anzahl         ;letzten Text ausgeben
                  lda   Anzahl+1
                  jsr   LINPRT
                  PrintText Text4

                  lda   #0
                  sta   198
EN_lp2            lda   198
                  beq   EN_lp2
                  lda   #0
                  sta   198

                  jmp   Start          ;Neustart

; *************
; *** Texte ***
; *************

Text1             .byte  17,17,17
                  .ascii " 6510-developers-packet transfer"
                  .byte  13,13
                  .ascii "name : "
                  .byte  0
Text2             .byte  13,13
                  .ascii "eroeffne datei..."
                  .byte  13,0
Text3             .ascii "uebertragung laeuft..."
                  .byte  13,0
Text4             .ascii " bytes empfangen !"
                  .byte  13,13
                  .ascii "taste druecken !"
                  .byte  13,0
Anzahl            .word  0
Name              .ascii "0:"

