home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d8xx
/
d887
/
segtextmaster.lha
/
SegTextMaster
/
Examples
/
example.asm
< prev
next >
Wrap
Assembly Source File
|
1993-07-16
|
3KB
|
157 lines
*
* example.asm
*
*
*** set editors tab to 8
incdir 'includes:'
include 'lvo.i' ; libbase-offsets
EORKEY EQU $98
FL_CODED EQU 0 ; bit 0
Main: lea doslibname,a1
moveq #0,d0
move.l $4.w,a6
jsr _LVOOpenLibrary(a6) ; doslib öffnen
tst.l d0
bne.s 0$
rts
0$: move.l d0,dosbase
move.l dosbase,a6
jsr _LVOOutPut(a6) ; Ausgabe herstellen
move.l d0,Handle
move.l STF,a0
bsr TextOffsetsToPtrs ; Textzeiger erstellen
move.l STF,a0
lea Passwort,a1
move.l #1,d0
bsr GetTextSeg ; TextSeg 1 -> d0
move.l d0,a0
moveq #0,d3
1$: addq.l #1,d3 ; strlen(TextSeg)
tst.b (a0)+
bne.s 1$
subq.l #1,d3 ; d3 = strlen
move.l d0,d2 ; d2 = TextSegment
move.l handle,d1 ; d1 = FileHandle
move.l dosbase,a6
jsr _LVOWrite(a6) ; TextSeg ausgeben
move.l dosbase,a1
move.l $4.w,a6
jsr _LVOCloseLibrary(a6) ; doslib schließen
moveq #0,d0
rts
********** SUBROUTINES *************
*
* GetTextSeg (d0,a0,a1) (Segment,Base,Password)
*
* Funktion: Segmentzeiger nach d0 holen
*
GetTextSeg:
cmp.l 4(a0),d0
bgt.s GTFail
move.l 8(a0),d1
btst.l #FL_CODED,d1 ; sein alles Seg. kodiert?
beq.s 0$ ; wenn nein, zu ...
movem.l d0/a0,-(sp)
bsr DecodeTextSeg ; dekodiere Segment
movem.l (sp)+,d0/a0
0$: lea 16(a0),a0
subq.l #1,d0
lsl.l #2,d0
add.l d0,a0
move.l (a0),d0 ; Segment-Ptr nach d0
rts
GTFail: moveq #0,d0
rts
*
* TextOffsetsToPtrs (a0) (Base)
*
* Funktion: Alle belegten Slots mit Zeigern belegen
*
TextOffsetsToPtrs:
move.l a0,d1
move.l 4(a0),d0
lea 16(a0),a0
1$: tst.l (a0)
beq.s 2$
add.l d1,(a0)+
2$: subq.l #1,d0
bne.s 1$
rts
*
* DecodeTextSeg (d0,a0,a1,d0) (Segment,Base,Password)
*
* d0 <- 0=Fehler
*
* verändert d0/d1/a0/a1
*
* Funktion: dekodieren eines Segments
*
DecodeTextSeg:
movem.l d2/d3,-(sp)
cmp.l 4(a0),d0
bgt.s 3$ ; fehler: Segment-Nummer zu groß
subq.l #1,d0
lea 16(a0),a0 ; *1. Offset nach a0
lsl.l #2,d0
add.l d0,a0
move.l (a0),a0
cmp.l #0,a0
bne.s 1$
moveq #0,d0 ; fehler: Offset existiert nicht
bra.s 3$
1$: moveq #0,d1 ; reset Password
2$: tst.b 1(a1,d1.w)
beq.s 1$
move.b (a1,d1.w),d2
addq.l #1,d1
move.b (a0),d3 ; nächstes Byte holen
subq.b #1,d3
eor.b #EORKEY,d3
add.b d2,d3
move.b d3,(a0)
tst.b (a0)+ ; letztes Byte?
bne.s 2$ ; nein, weiter
move.l #-1,d0
3$: movem.l (sp)+,d2/d3
rts
************ DATA **************
handle: DC.L 0
dosbase:
DC.L 0
doslibname:
DC.B 'dos.library',0
passwort:
DC.B 'Mr. Spock Lives On Vulcan',0
STF: DC.L daten
daten: incbin ':segtextmaster/examples/example-text.stf'