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

  1.     opt    l-            ;nicht linken                
  2.     
  3. * ZScrollASCII V1.00
  4. * 1991-09-03 by Markus Zeindlinger
  5. * Sprache: DEVPAC-Assembler
  6.  
  7. _ExecBase        equ    4    ;Basisadresse EXEC-Lib
  8.  
  9. _LVOOpenLibrary        equ    -552    ;Offsets EXEC-Library
  10. _LVOCloseLibrary    equ    -414
  11. _LVOGetMsg        equ    -372
  12. _LVOReplyMsg        equ    -378
  13. _LVOAllocMem        equ    -198
  14. _LVOFreeMem        equ    -210
  15.  
  16. _LVOOpenWindow        equ    -204    ;Offsets INTUITION-Library
  17. _LVOCloseWindow        equ    -72
  18.  
  19. _LVOMove        equ    -240    ;Offsets GRAPHICS-Library
  20. _LVOText        equ    -60
  21. _LVOScrollRaster    equ    -396
  22. _LVOSetAPen        equ    -342
  23.  
  24. _LVOOpen        equ    -30    ;Offsets DOS-Library
  25. _LVOClose        equ    -36
  26. _LVORead        equ    -42
  27. _LVOLock        equ    -84
  28. _LVOUnLock        equ    -90
  29. _LVOExamine        equ    -102
  30. _LVODelay        equ    -198
  31. _LVOOutput        equ    -60
  32. _LVOWrite        equ    -48
  33.  
  34. Begin    movem.l    d0-d7/a0-a6,-(sp)    ;Alle Regs retten (sauber, sauber!!)
  35.     move.l    a0,Parameter        ;Adresse d. CLI Params retten
  36.     subq    #1,d0            ;Parameterlaenge minus 1
  37.     add.l    d0,a0            ;Parameterende --> a0
  38.     move.b    #" ",(a0)        ;Steuerzeichen durch Space ersetzen
  39.     
  40.     move.l    Parameter,a0        ;Parameteradresse --> a0
  41. Loop    cmp.b    #" ",(a0)+        ;Leerzeichen => Filename Ende ?
  42.     bne.s    Loop            ;Nein? => weitersuchen
  43.     move.b    #0,-(a0)        ;Ja! => mit Null stopfen
  44.     addq.l    #1,a0            ;Eine Stelle weiter
  45.     cmp.b    #"-",(a0)+        ;Ist Zeichen ein "-"?
  46.     bne.s    FixSpeed        ;Nein? => Default-Geschwindigkeit
  47. SetSpeed
  48.     sub.b    #48,(a0)        ;ASCII Zahl in Geschw. umrechnen 
  49.     cmp.b    #-1,(a0)        ;Kleiner als -1?
  50.     blt.s    FixSpeed        ;Ja! => Default-Geschw. setzen
  51.     cmp.b    #9,(a0)            ;Groesser als 9?
  52.     bgt.s    FixSpeed        ;Ja! => Default-Geschw. setzen
  53.     move.b    (a0),Speed        ;Geschw. setzen (0-9)
  54.     bra.s    OpenLibs
  55. FixSpeed
  56.     move.b    #1,Speed        ;Default-Geschwindigkeit = 1
  57.     
  58. OpenLibs    
  59.     move.l    _ExecBase,a6        ;Exec-Basis -> a6
  60.     lea    intname(pc),a1        ;Adresse d. Lib-Namen -> a1
  61.     moveq    #0,d0            ;Version is uns wurst...
  62.     jsr    _LVOOpenLibrary(a6)    ;Library oeffnen
  63.     tst.l    d0            ;Was hamma in d0?
  64.     beq    close            ;Keine Lib => Ende
  65.     move.l    d0,_IntuitionBase    ;Library-Basis sichern
  66.     
  67.     lea    gfxname(pc),a1        ;wie oben, nur Graphics-Lib
  68.     moveq    #0,d0
  69.     jsr    _LVOOpenLibrary(a6)
  70.     tst.l    d0
  71.     beq    intclose
  72.     move.l    d0,_GfxBase
  73.     
  74.     lea    dosname(pc),a1        ;und weil`s so schoen war...
  75.     moveq    #0,d0            ;(Dos-Lib)
  76.     jsr    _LVOOpenLibrary(a6)
  77.     tst.l    d0
  78.     beq    gfxclose
  79.     move.l    d0,_DosBase
  80.     
  81.     move.l    #260,d0            ;260 Bytes reservieren
  82.     moveq    #2,d1            ;Chip-Ram
  83.     jsr    _LVOAllocMem(a6)    ;Speicher allokieren
  84.     tst.l    d0            ;Hat alles geklappt?
  85.     beq    dosclose        ;Nein? => Ende
  86.     move.l    d0,FileInfoBlock    ;Startadresse d. Speichers retten
  87.     
  88.     move.l    _DosBase,a6        ;Dos-Basis -> a6
  89.     move.l    Parameter,d1        ;Zu ladendes File -> d1
  90.     moveq    #-2,d2            ;Lesezugriff
  91.     jsr    _LVOLock(a6)        ;Lock auf Datei holen
  92.     tst.l    d0            ;Gefunden?
  93.     beq    errlock            ;Nein? => Fehlermeldung
  94.     move.l    d0,TextLock        ;Ja! => Sichern
  95.     
  96.     move.l    d0,d1            ;Lock auf Datei -> d1
  97.     move.l    FileInfoBlock,d2    ;Speicherbereich f. fib -> d2
  98.     jsr    _LVOExamine(a6)        ;FileInfoBlock holen
  99.     tst.l    d0            ;Gefunden?
  100.     beq    fibclose        ;Nein? => Ende
  101.     
  102.     move.l    TextLock,d1        ;Lock auf Datei -> d1
  103.     jsr    _LVOUnLock(a6)        ;Datei entLOCKen...
  104.     
  105.     move.l    FileInfoBlock,a0    ;Adresse d. fib -> a0
  106.     move.l    124(a0),TextLength    ;Dateilaenge ermitteln
  107.     addq    #4,TextLength        ;plus 4 - als Reserve
  108.     
  109.     move.l    _ExecBase,a6        ;Dat kenne ma aber jetz...
  110.     move.l    TextLength,d0        ;Dateilaenge -> d0
  111.     move.l    #$10000,d1        ;Geloeschten Speicherbereich
  112.     jsr    _LVOAllocMem(a6)    ;Speicher f. Text anfordern
  113.     tst.l    d0            ;Bekommen?
  114.     beq    errmem            ;Nein? => Fehlermeldung
  115.     move.l    d0,TextMem        ;Ja! => Adresse sichern
  116.     
  117.     move.l    _DosBase,a6        ;...
  118.     move.l    Parameter,d1        ;Dateiname -> d1
  119.     move.l    #1005,d2        ;Bestehendes File oeffnen
  120.     jsr    _LVOOpen(a6)        ;Textdatei oeffnen
  121.     tst.l    d0            ;Geklappt?
  122.     beq    errfile            ;Nein? => Fehlermeldung
  123.     move.l    d0,TextHandle        ;Datei-Identifikation sichern
  124.     
  125.     move.l    d0,d1            ;Datei-Identifikation -> d1
  126.     move.l    TextMem,d2        ;Reservierter Speicher -> d2
  127.     move.l    TextLength,d3        ;Zu lesende Bytes (Textlaenge) -> d3
  128.     jsr    _LVORead(a6)        ;Endlich!! Text einlesen
  129.     tst.l    d0            ;Alles OK?
  130.     bmi    errread            ;Nein? => Fehlermeldung
  131.     
  132.     bsr    CloseText        ;Ja! => Textdatei schliessen
  133.     
  134.     move.l    _IntuitionBase,a6    ;...
  135.     lea    Display(pc),a0        ;Adresse d. Fensterdaten -> a0
  136.     jsr    _LVOOpenWindow(a6)    ;Scrollfenster oeffnen
  137.     tst.l    d0            ;Fenster offen?
  138.     beq    memclose        ;Nein? => Ende
  139.     move.l    d0,WindowPtr        ;Ja! => Zeiger auf Fenster sichern
  140.     
  141.     move.l    WindowPtr,a0        ;Zeiger auf Fenster -> a0
  142.     move.l    50(a0),_RastPort    ;Adresse d. RastPort ermitteln
  143.     move.l    86(a0),a5        ;UserPort ermitteln und -> a5
  144.  
  145.     move.l    TextMem,TextPointer    ;Textbeginn -> TextPointer
  146.     
  147.     move.l    _GfxBase,a6        ;...
  148.     move.l    _RastPort,a1        ;RastPort -> a1
  149.     moveq    #1,d0            ;Farbregister Nr.1 verwenden
  150.     jsr    _LVOSetAPen(a6)        ;Farbe setzen
  151.  
  152. Heart                    ;das Herzstückl
  153.     move.l    _ExecBase,a6        ;...
  154.     move.l    a5,a0            ;UserPort -> a0
  155.     jsr    _LVOGetMsg(a6)        ;Checken, ob jemand Message schickt
  156.     tst.l    d0            ;Is Post da?
  157.     bne    Message            ;Ja! => Message auswerten
  158.  
  159.     move.l    _GfxBase,a6        ;...
  160.     move.l    _RastPort,a1        ;RastPort -> a1
  161.     move.l    #619,d0            ;X-Position v. Grafikcursor
  162.     move.l    #18,d1            ;Y-Position v. Gc (relativ zum Window)
  163.     jsr    _LVOMove(a6)        ;Grafikcursor setzen
  164.     
  165.     move.l    TextPointer,a0        ;Zeiger auf aktuelle Textposition -> a0
  166.     tst.l    (a0)            ;Ist noch Text da?
  167.     beq    SetPointer        ;Nein? => Zeiger auf Textbeginn
  168.     move.w    (a0),d2            ;2 Zeichen -> d2
  169.     bsr    Check            ;Zeichen ueberpruefen
  170.     
  171.     move.l    TextPointer,a0        ;Zeiger auf aktuelle Textpos -> a0
  172.     moveq    #2,d0            ;Textlaenge = 2 Zeichen
  173.     jsr    _LVOText(a6)        ;2 Zeichen ausgeben
  174.     addq.l    #2,TextPointer        ;Zeiger um 2 erhoehen
  175.     
  176. Scroll
  177.     move.l    #15,d6            ;Schleife: 15 x 1 Pixel scrollen
  178.     
  179. DoIt    move.l    _GfxBase,a6
  180.     move.l    _RastPort,a1        ;RastPort -> a1
  181.     moveq    #1,d0            ;1 Pixel nach links
  182.     moveq    #0,d1            ;0 Pixel nach oben/unten
  183.     moveq    #6,d2            ;linke obere Ecke
  184.     moveq    #12,d3            ;des Scrollbereichs
  185.     move.l    #637,d4            ;rechte untere Ecke
  186.     move.l    #19,d5            ;des Scrollbereichs
  187.     jsr    _LVOScrollRaster(a6)    ;Es rollt und rollt und rollt...
  188.     
  189.     move.l    _DosBase,a6
  190.     moveq    #0,d1            ;d1 loeschen
  191.     move.b    Speed,d1        ;Geschwindigkeit/Pause -> d1
  192.     jsr    _LVODelay(a6)        ;Bitte Warten! - Verzoegerung
  193.     
  194.     dbf    d6,DoIt            ;wenn nicht -1 => weiterscrollen
  195.     bra    Heart            ;weiter Zeichen schreiben
  196.  
  197. Check
  198.     ror.w    #8,d2            ;Zeichen in d2 vertauschen
  199.     bsr    Splunch            ;Ueberpruefen    
  200.     addq    #1,a0            ;Ein Zeichen im Text weiter
  201.     rol.w    #8,d2            ;Wieder vertauschen
  202.     bsr    Splunch            ;Zweites Zeichen vertauschen
  203.     rts                ;All right -> back again!
  204. Splunch                    ;Dedicated to RAY!
  205.     cmp.b    #31,d2            ;ASCII-Code < 32?
  206.     bls.s    SetSpace        ;Ja! => Durch Space ersetzen
  207.     cmp.b    #159,d2            ;ASCII-Code > 159?
  208.     bhi.s    Jump            ;Ja! => Ruecksprung
  209.     cmp.b    #127,d2            ;ASCII-Code > 127?
  210.     bhi.s    SetSpace        ;Ja! => Durch Space ersetzen
  211. Jump    rts                
  212.  
  213. SetSpace
  214.     move.b    #32,(a0)        ;mit ASCII fuer Space ersetzen
  215.     bra.s    Jump
  216.         
  217. SetPointer
  218.     move.l    TextMem,TextPointer    ;Textanfang -> Textpointer
  219.     bra    Heart
  220.  
  221. Message
  222.     move.l    d0,a1            ;Anfangsadr. Message -> a1
  223.     jsr    _LVOReplyMsg(a6)    ;Msg zurueckschicken
  224.     
  225. wndclose                ;Window schliessen
  226.     move.l    _IntuitionBase,a6
  227.     move.l    WindowPtr,a0
  228.     jsr    _LVOCloseWindow(a6)
  229.     bra.s    memclose
  230. txtclose                ;Textdatei (bei Fehler) schliessen
  231.     bsr    CloseText
  232. memclose                ;Textspeicher freigeben
  233.     move.l    _ExecBase,a6
  234.     move.l    TextMem,a1
  235.     move.l    TextLength,d0
  236.     jsr    _LVOFreeMem(a6)
  237. fibclose                ;FileInfoBlock-Speicher freigeben
  238.     move.l    _ExecBase,a6
  239.     move.l    FileInfoBlock,a1
  240.     move.l    #240,d0
  241.     jsr    _LVOFreeMem(a6)    
  242. dosclose                ;DOS-Lib schliessen
  243.     move.l    _ExecBase,a6
  244.     move.l    _DosBase,a1
  245.     jsr    _LVOCloseLibrary(a6)
  246. gfxclose                ;Grafics-Lib schliessen
  247.     move.l    _GfxBase,a1
  248.     jsr    _LVOCloseLibrary(a6)
  249. intclose                ;Intuition-Lib schliessen
  250.     move.l    _IntuitionBase,a1
  251.     jsr    _LVOCloseLibrary(a6)
  252. close
  253.     movem.l    (sp)+,d0-d7/a0-a6    ;Alle Regs. zurückschreiben
  254.     moveq    #0,d0            ;evtl. Fehlercode loeschen
  255.     rts                ;Finito. Schluss. Aus. Basta.    
  256.  
  257. * --------------------------------------------------------------
  258.  
  259. errlock                    ;Keinen Lock bekommen
  260.     move.l    #locktxt,d2        ;Adr. Fehlertext -> d2        
  261.     moveq    #23,d3            ;Textlaenge -> d3
  262.     bsr    GetHandle        ;Ausgabe-Handle holen
  263.     bra.s    fibclose        ;alles Geoeffnete schliessen
  264.  
  265. locktxt        dc.b    "--- File not found ---",10
  266.         even
  267. errmem                    ;Kein Speicher fuer Text
  268.     move.l    #memtxt,d2
  269.     moveq    #26,d3
  270.     bsr    GetHandle
  271.     bra    fibclose
  272.     
  273. memtxt        dc.b    "--- Not enough memory ---",10    
  274.         even
  275. errfile                    
  276.     move.l    #filetxt,d2
  277.     moveq    #32,d3
  278.     bsr    GetHandle
  279.     bra    memclose
  280.     
  281. filetxt        dc.b    "--- Opening textfile failed ---",10    
  282.         even
  283. errread
  284.     move.l    #readtxt,d2
  285.     moveq    #19,d3
  286.     bsr    GetHandle
  287.     bra    txtclose
  288.     
  289. readtxt        dc.b    "--- Read error ---",10    
  290.         even
  291.  
  292. * --------------------------------------------------------------
  293.  
  294. CloseText
  295.     move.l    _DosBase,a6
  296.     move.l    TextHandle,d1
  297.     jsr    _LVOClose(a6)
  298.     rts
  299.     
  300. * --------------------------------------------------------------
  301.  
  302. GetHandle
  303.     move.l    _DosBase,a6        
  304.     jsr    _LVOOutput(a6)        ;Ausgabe-Handle ermitteln
  305.     move.l    d0,d1
  306. Print    jsr    _LVOWrite(a6)        ;Text ins CLI schicken
  307.     rts
  308.             
  309. * --------------------------------------------------------------
  310.  
  311. intname        dc.b    "intuition.library",0
  312. gfxname        dc.b    "graphics.library",0
  313. dosname        dc.b    "dos.library",0
  314.  
  315. _IntuitionBase        dc.l    0
  316. _DosBase        dc.l    0
  317. _GfxBase        dc.l    0
  318.  
  319. _RastPort        dc.l    0
  320. TextPointer        dc.l    0
  321. FileInfoBlock        dc.l    0
  322. TextLock        dc.l    0
  323. TextMem            dc.l    0
  324. TextHandle        dc.l    0
  325. TextLength        dc.l    0
  326. Parameter        dc.l    0
  327. WindowPtr        dc.l    0    
  328. Speed            dc.b    0
  329.             even
  330. SignalBit        dc.b    0
  331.             even
  332.         
  333. DisplayTitle    dc.b    "ZScrollASCII V1.00E",0
  334.         even
  335.  
  336. Display        dc.w    0,234
  337.         dc.w    640,22
  338.         dc.b    -1,-1
  339.         dc.l    512
  340.         dc.l    4110
  341.         dc.l    0,0
  342.         dc.l    DisplayTitle
  343.         dc.l    0,0
  344.         dc.w    640,22
  345.         dc.w    640,22
  346.         dc.w    $0001
  347.         even
  348.  
  349. * -------------- End of Z --------------------------------------
  350.  
  351.