Hallo Besucher, der Thread wurde 1,3k mal aufgerufen und enthält 0 Antworten

letzter Beitrag von enigma am

RS232 usw. - Ein paar Routinen

  • Hallo,


    ich hab auf
    http://mail.lipsia.de/~enigma/pieces.zip
    mal ein paar meiner Routinen gepackt.


    Hier ne kurze Beschreibung:
    horst.asm


    Einige Dinge für VDC Grafik bei einer Auflösung von 752x288 Pixeln, benötigt einen VDC mit 64Kb.


    Initgraph - initialisiert den VDC und schaltet den Grafikmodus ein
    Textmodus - schaltet den TExtmodus ein
    Cleargraph - löscht den Grafikschirm
    PSet - setzt
    PGet - holt
    PClr - löscht
    PInv - invertiert ein Pixel
    DrawStr - stellt einen String im Grafikmodus dar
    DrawLine - zeichnet eine Linie


    Die Routinen sind sehr flott, falls jemand noch Optimierungen findet (es gibt immer welche ;) ), die es noch schneller machen. Mail an enigma@mail.lipsia.de


    ide.asm


    Code zum ansteuern einer IDE Festplatte, die über einen in den I/O Bereich gemappten 8255 erreichbar ist. Die Routine erkennt automatisch ob die Festplatte LBA-fähig ist oder nicht und nimmt ggf. nötige Umrechnung in CHS vor. Der Anwender gibt immer LBA an.


    InitIde - initialisiert den 8255 und resettet die Festplatte
    I_Identif - liest den Identify Sector in den Buffer
    I_Readsec -
    I_Writesec - liest bzw. schreibt den Buffer von/an den Sector der angegebenen LBA Position


    rs232.asm


    Universelle Routine zum ansteuern eines in den I/O Bereich gemappten 16550 UARTs. Im speziellen sind diese Routinen für den TL16C550C von Texas Instruments, weil dieser UART ein Autoflow Control für RTS/CTS besitzt, das den Steuerrechner entlastet. Für einen Standard UART muss an den Stellen, wo der Ringbuffer im Rechner voll ist und der Empfängerfifo bis zum Trigger vollgelaufen ist CTS per Code gesteuert werden.
    Da die Reaktionszeit des C64/C128 endlich ist, begrenzt eine solche Steuerung die maximal fehlerfrei mögliche Baudrate.
    Mit dem Autoflow fähigen UART muss man seitens C64/C128 keine Zeitbedingungen einhalten.
    Der 16550 wird vollständig über IRQs angesteuert. Die Routine richtet zwei 128 Byte grosse Ringbuffer fuer Senden bzw Empfangen ein. Alle Routinen die darauf aufsetzen, benötigen nur die SENDBYTE bzw. GETBYTE Routine.


    INITUART - setzt Status und Bufferpointer zurück
    OPEN - Initialisiert den UART mit der in X gegebenen Baudrate und installiert die ISR
    (Je nach Uart bis 1 MBaud, leider begrenzt der Rechner auf der andren Seite es meist auf 115,2 KBaud)
    CLOSE - verbietet dem UART IRQs und restauriert die alte IRQ Routine


    SENDBYTE - Schreibt ein Byte in den Senderingbuffer und triggert den THRE IRQ
    GETBYTE - holt ein Byte aus dem Empfangsringbuffer
    bei gelöschtem Carry war der Sendebuffer voll bzw. der Empfangsbuffer leer



    XMODEM.ASM


    Routine basierend in grossen Teilen auf dem von Daryl Rictor auf http://www.6502.org veröffentlichten XModem Routinen.
    xmodem.asm besteht aus zwei Teilen, einem zum Senden von Code und einem zum Empfangen. Beim senden werden die zwei Adressbytes vorn hinzugefügt, beim empfangen werden die Daten an die durch die ersten zwei Byte vorgegebenen Adresse geschrieben. Also ideal zum crossassemblieren o.ä.
    Diese Routinen setzen auf rs232.asm auf und sind daher nicht extrem schnell (UART wird bei 115,2 KBaud nicht ausgelastet, beispielsweise ist das geschätzte cap beim senden ca. 2300 cps)


    XMODEMSEND - sendet die Bytes zwischen den angegebenen Adressen als XMODEM/CRC Stream.
    XMODEMRCV - empfängt einen XMODEM/CRC Stream und speichert ihn an der in den ersten zwei Bytes angegebenen Adresse (Achtung 128 Byte Blöcke, also 129 Byte effektive Sendedaten werden 256 Byte schreiben)



    und nun noch ein paar kleine Routinen die Disketten von einer 1571 bzw. 1581 lesen und direkt als XMODEM/CRC Stream senden, so daß man diesen direkt als *.d64, *.d71 bzw. *.d81 File speichern kann.


    Der jeweilige Einsprung heisst SENDDISK, vorher muss man rs232 geladen haben. Alle Routinen nutzen den Burst Modus der Floppys. Die Routinen sind insgesamt eher ein Quick Hack und haben folgende Einschränkungen:


    Readd64.asm und Readd71.asm kehren nach dem Senden nicht ins Basic zurück. Jeder mit ein wenig Ahnung von ASM kann noch ein bisschen Code hinten dranhaengen der die IRQs wieder aufräumt. Beide Routinen erreichen ca. 1280 cps bei 115,2 KBaud, was so schnell ist, wie die 1571 im Burst Modus die Sektoren in logischer Reihenfolge liest. Bei einem Fehler auf der Diskette beenden sich die Routinen.


    Readd81.asm steuert den UART direkt an und benötigt rs232 nur zur inialisierung desselben. Die Baudrate des UARTs muss so hoch sein, dass der UART die Bytes schneller abtransportiert als die 1581 sie liefert. (schaetzungsweise 37 KBaud sollten reichen)
    Die Routine erreicht etwa 3600-3700cps und sollte danach wieder ins Basic zurückkehren.



    MEMORY.ASM legt nur ein paar Variablen fest


    Alle Sources sind im DASM Format.


    Leider kann ich jetzt hier noch nicht viel schreiben über das I/O Interface, welches obige Features bietet (plus IEEE488 und durchgeschleiften Exp Port mit DMA Fähigkeit für REU etc.), weil zZ an einer neuen Revision gearbeitet wird. Das aktuelle hat ein paar Bugs die in seltenen Fällen mal hervorquellen.
    Die VDC Sachen sollten auch so laufen 8)


    Bis dann,
    Micha


    Edit: Sorry falsches Board, ich poste es im ASM, Admin ggf. löschen falls unerwünscht.