opt l- ;nicht linken * ZScrollASCII V1.00 * 1991-09-03 by Mark Zeindlinger * Sprache: DEVPAC-Assembler _ExecBase equ 4 ;Basisadresse EXEC-Lib _LVOOpenLibrary equ -552 ;Offsets EXEC-Library _LVOCloseLibrary equ -414 _LVOGetMsg equ -372 _LVOReplyMsg equ -378 _LVOAllocMem equ -198 _LVOFreeMem equ -210 _LVOOpenWindow equ -204 ;Offsets INTUITION-Library _LVOCloseWindow equ -72 _LVOMove equ -240 ;Offsets GRAPHICS-Library _LVOText equ -60 _LVOScrollRaster equ -396 _LVOSetAPen equ -342 _LVOOpen equ -30 ;Offsets DOS-Library _LVOClose equ -36 _LVORead equ -42 _LVOLock equ -84 _LVOUnLock equ -90 _LVOExamine equ -102 _LVODelay equ -198 _LVOOutput equ -60 _LVOWrite equ -48 Begin movem.l d0-d7/a0-a6,-(sp) ;Alle Regs retten (sauber, sauber!!) move.l a0,Parameter ;Adresse d. CLI Params retten subq #1,d0 ;Parameterlaenge minus 1 add.l d0,a0 ;Parameterende --> a0 move.b #" ",(a0) ;Steuerzeichen durch Space ersetzen move.l Parameter,a0 ;Parameteradresse --> a0 Loop cmp.b #" ",(a0)+ ;Leerzeichen => Filename Ende ? bne.s Loop ;Nein? => weitersuchen move.b #0,-(a0) ;Ja! => mit Null stopfen addq.l #1,a0 ;Eine Stelle weiter cmp.b #"-",(a0)+ ;Ist Zeichen ein "-"? bne.s FixSpeed ;Nein? => Default-Geschwindigkeit SetSpeed sub.b #48,(a0) ;ASCII Zahl in Geschw. umrechnen cmp.b #-1,(a0) ;Kleiner als -1? blt.s FixSpeed ;Ja! => Default-Geschw. setzen cmp.b #9,(a0) ;Groesser als 9? bgt.s FixSpeed ;Ja! => Default-Geschw. setzen move.b (a0),Speed ;Geschw. setzen (0-9) bra.s OpenLibs FixSpeed move.b #1,Speed ;Default-Geschwindigkeit = 1 OpenLibs move.l _ExecBase,a6 ;Exec-Basis -> a6 lea intname(pc),a1 ;Adresse d. Lib-Namen -> a1 moveq #0,d0 ;Version is uns wurst... jsr _LVOOpenLibrary(a6) ;Library oeffnen tst.l d0 ;Was hamma in d0? beq close ;Keine Lib => Ende move.l d0,_IntuitionBase ;Library-Basis sichern lea gfxname(pc),a1 ;wie oben, nur Graphics-Lib moveq #0,d0 jsr _LVOOpenLibrary(a6) tst.l d0 beq intclose move.l d0,_GfxBase lea dosname(pc),a1 ;und weil`s so schoen war... moveq #0,d0 ;(Dos-Lib) jsr _LVOOpenLibrary(a6) tst.l d0 beq gfxclose move.l d0,_DosBase move.l #260,d0 ;260 Bytes reservieren moveq #2,d1 ;Chip-Ram jsr _LVOAllocMem(a6) ;Speicher allokieren tst.l d0 ;Hat alles geklappt? beq dosclose ;Nein? => Ende move.l d0,FileInfoBlock ;Startadresse d. Speichers retten move.l _DosBase,a6 ;Dos-Basis -> a6 move.l Parameter,d1 ;Zu ladendes File -> d1 moveq #-2,d2 ;Lesezugriff jsr _LVOLock(a6) ;Lock auf Datei holen tst.l d0 ;Gefunden? beq errlock ;Nein? => Fehlermeldung move.l d0,TextLock ;Ja! => Sichern move.l d0,d1 ;Lock auf Datei -> d1 move.l FileInfoBlock,d2 ;Speicherbereich f. fib -> d2 jsr _LVOExamine(a6) ;FileInfoBlock holen tst.l d0 ;Gefunden? beq fibclose ;Nein? => Ende move.l TextLock,d1 ;Lock auf Datei -> d1 jsr _LVOUnLock(a6) ;Datei entLOCKen... move.l FileInfoBlock,a0 ;Adresse d. fib -> a0 move.l 124(a0),TextLength ;Dateilaenge ermitteln addq #4,TextLength ;plus 4 - als Reserve move.l _ExecBase,a6 ;Dat kenne ma aber jetz... move.l TextLength,d0 ;Dateilaenge -> d0 move.l #$10000,d1 ;Geloeschten Speicherbereich jsr _LVOAllocMem(a6) ;Speicher f. Text anfordern tst.l d0 ;Bekommen? beq errmem ;Nein? => Fehlermeldung move.l d0,TextMem ;Ja! => Adresse sichern move.l _DosBase,a6 ;... move.l Parameter,d1 ;Dateiname -> d1 move.l #1005,d2 ;Bestehendes File oeffnen jsr _LVOOpen(a6) ;Textdatei oeffnen tst.l d0 ;Geklappt? beq errfile ;Nein? => Fehlermeldung move.l d0,TextHandle ;Datei-Identifikation sichern move.l d0,d1 ;Datei-Identifikation -> d1 move.l TextMem,d2 ;Reservierter Speicher -> d2 move.l TextLength,d3 ;Zu lesende Bytes (Textlaenge) -> d3 jsr _LVORead(a6) ;Endlich!! Text einlesen tst.l d0 ;Alles OK? bmi errread ;Nein? => Fehlermeldung bsr CloseText ;Ja! => Textdatei schliessen move.l _IntuitionBase,a6 ;... lea Display(pc),a0 ;Adresse d. Fensterdaten -> a0 jsr _LVOOpenWindow(a6) ;Scrollfenster oeffnen tst.l d0 ;Fenster offen? beq memclose ;Nein? => Ende move.l d0,WindowPtr ;Ja! => Zeiger auf Fenster sichern move.l WindowPtr,a0 ;Zeiger auf Fenster -> a0 move.l 50(a0),_RastPort ;Adresse d. RastPort ermitteln move.l 86(a0),a5 ;UserPort ermitteln und -> a5 move.l TextMem,TextPointer ;Textbeginn -> TextPointer move.l _GfxBase,a6 ;... move.l _RastPort,a1 ;RastPort -> a1 moveq #1,d0 ;Farbregister Nr.1 verwenden jsr _LVOSetAPen(a6) ;Farbe setzen Heart ;das Herzstückl move.l _ExecBase,a6 ;... move.l a5,a0 ;UserPort -> a0 jsr _LVOGetMsg(a6) ;Checken, ob jemand Message schickt tst.l d0 ;Is Post da? bne Message ;Ja! => Message auswerten move.l _GfxBase,a6 ;... move.l _RastPort,a1 ;RastPort -> a1 move.l #619,d0 ;X-Position v. Grafikcursor move.l #18,d1 ;Y-Position v. Gc (relativ zum Window) jsr _LVOMove(a6) ;Grafikcursor setzen move.l TextPointer,a0 ;Zeiger auf aktuelle Textposition -> a0 tst.l (a0) ;Ist noch Text da? beq SetPointer ;Nein? => Zeiger auf Textbeginn move.w (a0),d2 ;2 Zeichen -> d2 bsr Check ;Zeichen ueberpruefen move.l TextPointer,a0 ;Zeiger auf aktuelle Textpos -> a0 moveq #2,d0 ;Textlaenge = 2 Zeichen jsr _LVOText(a6) ;2 Zeichen ausgeben addq.l #2,TextPointer ;Zeiger um 2 erhoehen Scroll move.l #15,d6 ;Schleife: 15 x 1 Pixel scrollen DoIt move.l _GfxBase,a6 move.l _RastPort,a1 ;RastPort -> a1 moveq #1,d0 ;1 Pixel nach links moveq #0,d1 ;0 Pixel nach oben/unten moveq #6,d2 ;linke obere Ecke moveq #12,d3 ;des Scrollbereichs move.l #637,d4 ;rechte untere Ecke move.l #19,d5 ;des Scrollbereichs jsr _LVOScrollRaster(a6) ;Es rollt und rollt und rollt... move.l _DosBase,a6 moveq #0,d1 ;d1 loeschen move.b Speed,d1 ;Geschwindigkeit/Pause -> d1 jsr _LVODelay(a6) ;Bitte Warten! - Verzoegerung dbf d6,DoIt ;wenn nicht -1 => weiterscrollen bra Heart ;weiter Zeichen schreiben Check ror.w #8,d2 ;Zeichen in d2 vertauschen bsr Splunch ;Ueberpruefen addq #1,a0 ;Ein Zeichen im Text weiter rol.w #8,d2 ;Wieder vertauschen bsr Splunch ;Zweites Zeichen vertauschen rts ;All right -> back again! Splunch ;Dedicated to RAY! cmp.b #31,d2 ;ASCII-Code < 32? bls.s SetSpace ;Ja! => Durch Space ersetzen cmp.b #159,d2 ;ASCII-Code > 159? bhi.s Jump ;Ja! => Ruecksprung cmp.b #127,d2 ;ASCII-Code > 127? bhi.s SetSpace ;Ja! => Durch Space ersetzen Jump rts SetSpace move.b #32,(a0) ;mit ASCII fuer Space ersetzen bra.s Jump SetPointer move.l TextMem,TextPointer ;Textanfang -> Textpointer bra Heart Message move.l d0,a1 ;Anfangsadr. Message -> a1 jsr _LVOReplyMsg(a6) ;Msg zurueckschicken wndclose ;Window schliessen move.l _IntuitionBase,a6 move.l WindowPtr,a0 jsr _LVOCloseWindow(a6) bra.s memclose txtclose ;Textdatei (bei Fehler) schliessen bsr CloseText memclose ;Textspeicher freigeben move.l _ExecBase,a6 move.l TextMem,a1 move.l TextLength,d0 jsr _LVOFreeMem(a6) fibclose ;FileInfoBlock-Speicher freigeben move.l _ExecBase,a6 move.l FileInfoBlock,a1 move.l #240,d0 jsr _LVOFreeMem(a6) dosclose ;DOS-Lib schliessen move.l _ExecBase,a6 move.l _DosBase,a1 jsr _LVOCloseLibrary(a6) gfxclose ;Grafics-Lib schliessen move.l _GfxBase,a1 jsr _LVOCloseLibrary(a6) intclose ;Intuition-Lib schliessen move.l _IntuitionBase,a1 jsr _LVOCloseLibrary(a6) close movem.l (sp)+,d0-d7/a0-a6 ;Alle Regs. zurückschreiben moveq #0,d0 ;evtl. Fehlercode loeschen rts ;Finito. Schluss. Aus. Basta. * -------------------------------------------------------------- errlock ;Keinen Lock bekommen move.l #locktxt,d2 ;Adr. Fehlertext -> d2 moveq #32,d3 ;Textlaenge -> d3 bsr GetHandle ;Ausgabe-Handle holen bra.s fibclose ;alles Geoeffnete schliessen locktxt dc.b "--- Datei nicht gefunden!!! ---",10 even errmem ;Kein Speicher fuer Text move.l #memtxt,d2 moveq #29,d3 bsr GetHandle bra fibclose memtxt dc.b "--- Zu wenig Speicher!!! ---",10 even errfile move.l #filetxt,d2 moveq #46,d3 bsr GetHandle bra memclose filetxt dc.b "--- Datei konnte nicht geöffnet werden!!! ---",10 even errread move.l #readtxt,d2 moveq #19,d3 bsr GetHandle bra txtclose readtxt dc.b "--- Lesefehler ---",10 even * -------------------------------------------------------------- CloseText move.l _DosBase,a6 move.l TextHandle,d1 jsr _LVOClose(a6) rts * -------------------------------------------------------------- GetHandle move.l _DosBase,a6 jsr _LVOOutput(a6) ;Ausgabe-Handle ermitteln move.l d0,d1 Print jsr _LVOWrite(a6) ;Text ins CLI schicken rts * -------------------------------------------------------------- intname dc.b "intuition.library",0 gfxname dc.b "graphics.library",0 dosname dc.b "dos.library",0 _IntuitionBase dc.l 0 _DosBase dc.l 0 _GfxBase dc.l 0 _RastPort dc.l 0 TextPointer dc.l 0 FileInfoBlock dc.l 0 TextLock dc.l 0 TextMem dc.l 0 TextHandle dc.l 0 TextLength dc.l 0 Parameter dc.l 0 WindowPtr dc.l 0 Speed dc.b 0 even SignalBit dc.b 0 even DisplayTitle dc.b "ZScrollASCII V1.00",0 even Display dc.w 0,234 dc.w 640,22 dc.b -1,-1 dc.l 512 dc.l 4110 dc.l 0,0 dc.l DisplayTitle dc.l 0,0 dc.w 640,22 dc.w 640,22 dc.w $0001 even * -------------- End of Z --------------------------------------