home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d5xx
/
d544
/
zscroll.lha
/
ZScroll
/
ZScrollV1.00.asm
< prev
next >
Wrap
Assembly Source File
|
1991-09-18
|
9KB
|
351 lines
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 --------------------------------------