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 >
Assembly Source File  |  1993-07-16  |  3KB  |  157 lines

  1. *
  2. *    example.asm
  3. *
  4. *
  5.  
  6. *** set editors tab to 8
  7.  
  8.  
  9.     incdir    'includes:'
  10.     include    'lvo.i'            ; libbase-offsets
  11.  
  12.  
  13. EORKEY   EQU $98
  14. FL_CODED EQU 0 ; bit 0
  15.  
  16.  
  17.  
  18. Main:    lea    doslibname,a1
  19.     moveq    #0,d0
  20.     move.l    $4.w,a6
  21.     jsr    _LVOOpenLibrary(a6)    ; doslib öffnen
  22.     tst.l    d0
  23.     bne.s    0$
  24.     rts
  25. 0$:    move.l    d0,dosbase
  26.     move.l    dosbase,a6
  27.     jsr    _LVOOutPut(a6)        ; Ausgabe herstellen
  28.     move.l    d0,Handle
  29.  
  30.     move.l    STF,a0
  31.     bsr    TextOffsetsToPtrs    ; Textzeiger erstellen
  32.  
  33.     move.l    STF,a0
  34.     lea    Passwort,a1
  35.     move.l    #1,d0
  36.     bsr    GetTextSeg        ; TextSeg 1 -> d0
  37.  
  38.     move.l    d0,a0
  39.     moveq    #0,d3
  40. 1$:    addq.l    #1,d3            ; strlen(TextSeg)
  41.     tst.b    (a0)+
  42.     bne.s    1$
  43.     subq.l    #1,d3            ; d3 = strlen
  44.     move.l    d0,d2            ; d2 = TextSegment
  45.     move.l    handle,d1        ; d1 = FileHandle
  46.     move.l    dosbase,a6
  47.     jsr    _LVOWrite(a6)        ; TextSeg ausgeben
  48.     move.l    dosbase,a1
  49.     move.l    $4.w,a6
  50.     jsr    _LVOCloseLibrary(a6)    ; doslib schließen
  51.     moveq    #0,d0
  52.     rts
  53.  
  54.  
  55.  
  56. ********** SUBROUTINES *************
  57.  
  58.  
  59.  
  60. *
  61. *    GetTextSeg (d0,a0,a1) (Segment,Base,Password)
  62. *
  63. *    Funktion: Segmentzeiger nach d0 holen
  64. *
  65. GetTextSeg:
  66.     cmp.l    4(a0),d0
  67.     bgt.s    GTFail
  68.     move.l    8(a0),d1
  69.     btst.l    #FL_CODED,d1    ; sein alles Seg. kodiert?
  70.     beq.s    0$        ; wenn nein, zu ...
  71.     movem.l    d0/a0,-(sp)
  72.     bsr    DecodeTextSeg    ; dekodiere Segment
  73.     movem.l    (sp)+,d0/a0
  74. 0$:    lea    16(a0),a0
  75.     subq.l    #1,d0
  76.     lsl.l    #2,d0
  77.     add.l    d0,a0
  78.     move.l    (a0),d0        ; Segment-Ptr nach d0
  79.     rts
  80. GTFail:    moveq    #0,d0
  81.     rts
  82.  
  83. *
  84. *    TextOffsetsToPtrs (a0) (Base)
  85. *
  86. *    Funktion: Alle belegten Slots mit Zeigern belegen
  87. *
  88. TextOffsetsToPtrs:
  89.     move.l    a0,d1
  90.     move.l    4(a0),d0
  91.     lea    16(a0),a0
  92. 1$:    tst.l    (a0)
  93.     beq.s    2$
  94.     add.l    d1,(a0)+
  95. 2$:    subq.l    #1,d0
  96.     bne.s    1$
  97.     rts
  98.  
  99.  
  100. *
  101. *    DecodeTextSeg (d0,a0,a1,d0) (Segment,Base,Password)
  102. *
  103. *    d0 <- 0=Fehler
  104. *
  105. *    verändert d0/d1/a0/a1
  106. *
  107. *    Funktion: dekodieren eines Segments
  108. *
  109. DecodeTextSeg:
  110.     movem.l    d2/d3,-(sp)
  111.     cmp.l    4(a0),d0
  112.     bgt.s    3$        ; fehler: Segment-Nummer zu groß
  113.     subq.l    #1,d0
  114.     lea    16(a0),a0    ; *1. Offset nach a0
  115.     lsl.l    #2,d0
  116.     add.l    d0,a0
  117.     move.l    (a0),a0
  118.     cmp.l    #0,a0
  119.     bne.s    1$
  120.     moveq    #0,d0        ; fehler: Offset existiert nicht
  121.     bra.s    3$
  122. 1$:    moveq    #0,d1        ; reset Password
  123. 2$:    tst.b    1(a1,d1.w)
  124.     beq.s    1$
  125.     move.b    (a1,d1.w),d2
  126.     addq.l    #1,d1
  127.     move.b    (a0),d3        ; nächstes Byte holen
  128.     subq.b    #1,d3
  129.     eor.b    #EORKEY,d3
  130.     add.b    d2,d3
  131.     move.b    d3,(a0)
  132.     tst.b    (a0)+        ; letztes Byte?
  133.     bne.s    2$        ; nein, weiter
  134.     move.l    #-1,d0
  135. 3$:    movem.l    (sp)+,d2/d3
  136.     rts
  137.  
  138.  
  139. ************ DATA **************
  140.  
  141.  
  142. handle:    DC.L    0
  143.  
  144. dosbase:
  145.     DC.L    0
  146.  
  147. doslibname:
  148.     DC.B    'dos.library',0
  149.  
  150. passwort:
  151.     DC.B    'Mr. Spock Lives On Vulcan',0
  152.  
  153. STF:    DC.L    daten
  154.  
  155. daten:    incbin    ':segtextmaster/examples/example-text.stf'
  156.  
  157.