home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / ST_USER / 1990 / USERMR90.MSA / LISTINGS_SCROLLER.S < prev    next >
Text File  |  1990-01-07  |  5KB  |  201 lines

  1. *    Parallax scrolling demo
  2. *    Last altered 27/10/89
  3.  
  4.     OPT T+,O+,W-        Type checking, optimising
  5. in    EQU 0            input file handle
  6. screen    EQU 4            screen start address
  7. scr1    EQU 8
  8. scr2    EQU 12
  9. send1    EQU 16
  10. send2    EQU 20
  11. count1    EQU 24
  12. count2    EQU 28
  13. back    EQU 32            other screen
  14. flag    EQU 36
  15.  
  16. prints    MACRO            Print a string
  17.     PEA \1(PC)
  18.     MOVE #9,-(A7)        c_conws
  19.     TRAP #1
  20.     ADDQ.L #6,A7
  21.     ENDM
  22.  
  23. f_open    MACRO            Open a file
  24.       MOVE #\1,-(A7)        read/write flag
  25.     PEA \2(PC)        filename
  26.     MOVE #61,-(A7)        f_open
  27.     TRAP #1
  28.     ADDQ.L #8,A7
  29.     ENDM            D0=handle
  30.  
  31. f_close    MACRO            Close a file
  32.       MOVE \1(A6),-(A7)    handle
  33.     MOVE #62,-(A7)        f_close
  34.     TRAP #1
  35.     ADDQ.L #4,A7
  36.     ENDM
  37.  
  38. f_read    MACRO            Read from file into buffer
  39.     MOVE.L \1,-(A7)        input buffer
  40.     MOVE.L #\2,-(A7)    bytes to read
  41.     MOVE \3(A6),-(A7)    handle
  42.     MOVE #63,-(A7)        f_read
  43.     TRAP #1
  44.     ADDA.L #12,A7
  45.     ENDM            D0=bytes read
  46.  
  47. *********************************************************************
  48. *    Start of program
  49. *********************************************************************
  50.  
  51. *----->    Initialise
  52.     MOVE #-1,-(A7)        cursor off
  53.     MOVE #0,-(A7)
  54.     MOVE #21,-(A7)        cursconf
  55.     TRAP #14
  56.     ADDQ.L #6,A7
  57.     LEA var(PC),A6        A6 -> variables
  58.     MOVE #2,-(A7)        _physbase...get screen address
  59.     TRAP #14
  60.     ADDQ.L #2,A7
  61.     MOVE.L D0,screen(A6)    screen start address
  62.  
  63. *----->    Get buffer adress
  64.     MOVE.L 4(A7),A0        get base page in A0
  65.     MOVE.L $C(A0),D0    get text segment size
  66.     ADD.L $14(A0),D0    add data segment
  67.     ADD.L  $1C(A0),D0    add uninitialised bit
  68.     ADD.L #$100,D0        add base page length
  69.     ADDA.L D0,A0        A0 -> buffer
  70.     MOVE.L A0,scr1(A6)    address of scr1
  71.     ADDA.L #33000,A0    screen2 starts here
  72.     MOVE.L A0,scr2(A6)    address of scr2
  73.     ADDA.L #33000,A0    address of dual screen
  74.     MOVE.L A0,back(A6)    store address of dual screen
  75.     ANDI.L #$FFFFFF00,back(A6)
  76.  
  77. *----->    Load pictures
  78.     f_open 0,pic1        load PICTURE1.PIC
  79.     MOVE D0,in(A6)        store file handle
  80.     f_read scr1(A6),33000,in
  81.     f_close in
  82.     f_open 0,pic2        load PICTURE2.PIC
  83.     MOVE D0,in(A6)        store file handle
  84.     f_read scr2(A6),33000,in
  85.     f_close in
  86.  
  87. *----->    Skip Degas headers, set screen ends
  88.     ADDI.L #34,scr1(A6)    skip header
  89.     ADDI.L #34,scr2(A6)    skip header
  90.     MOVE.L scr1(A6),A0
  91.     ADDA.L #32000,A0
  92.     MOVE.L A0,send1(A6)    end of screen1
  93.     MOVE.L scr2(A6),A0
  94.     ADDA.L #32000,A0
  95.     MOVE.L A0,send2(A6)    end of screen1
  96.  
  97. *----->    Display screen
  98.     CLR.L count1(A6)    set counter
  99.     CLR.L count2(A6)    set counter
  100. scroll    BSR setscr        A0=screen
  101.     MOVEA.L scr1(A6),A1    A1=screen1
  102.     MOVE.L count1(A6),D0    get counter
  103.     CMPI #200,D0
  104.     BNE s2
  105.     CLR.L D0
  106.     MOVE.L D0,count1(A6)    set counter
  107. s2    MOVE.L #160,D1        one scanline
  108.     MULU D1,D0
  109.     ADDA.L D0,A1        new start address
  110.     ADDQ.L #1,count1(A6)
  111.     MOVEA.L scr2(A6),A2    A2=screen2
  112.     MOVE.L count2(A6),D0    get counter
  113.     BPL s1
  114.     MOVE.L #199,D0
  115.     MOVE.L D0,count2(A6)    set counter
  116. s1    MULU D1,D0
  117.     ADDA.L D0,A2        new start address
  118.     SUBQ.L #1,count2(A6)
  119.     BSR draw
  120.  
  121. *----->    Wait for keypress
  122.     MOVE #11,-(A7)        c_conis...key pressed?
  123.     TRAP #1
  124.     ADDQ.L #2,A7
  125.     TST D0
  126.     BEQ scroll
  127.     MOVE #8,-(A7)        c_necin...read keypress
  128.     TRAP #1
  129.     ADDQ.L #2,A7
  130.  
  131. *----->    Return to desktop
  132.     CLR flag(A6)        restore original screen address
  133.     BSR setscr
  134.     MOVE #-1,-(A7)        cursor on
  135.     MOVE #1,-(A7)
  136.     MOVE #21,-(A7)        cursconf
  137.     TRAP #14
  138.     ADDQ.L #6,A7
  139.     CLR -(A7)        p_term0...back to desktop
  140.     TRAP #1
  141.  
  142.  
  143. setscr    EORI #1,flag(A6)
  144.     BEQ set1
  145.     MOVE #-1,-(A7)
  146.     MOVE.L screen(A6),-(A7)
  147.     MOVE.L #-1,-(A7)
  148.     MOVE #5,-(A7)
  149.     TRAP #14
  150.     ADDA.L #12,A7
  151.     MOVEA.L back(A6),A0
  152.     RTS
  153. set1    MOVE #-1,-(A7)
  154.     MOVE.L back(A6),-(A7)
  155.     MOVE.L #-1,-(A7)
  156.     MOVE #5,-(A7)
  157.     TRAP #14
  158.     ADDA.L #12,A7
  159.     MOVEA.L screen(A6),A0
  160.     RTS
  161.  
  162. *********************************************************************
  163. *    screen = screen1+screen2
  164. *    A0=realscreen, A1=screen1, A2=screen2
  165. *********************************************************************
  166. draw    MOVE #199,D7
  167. dloop
  168.     REPT 20
  169.     MOVE (A1),D0        make mask from screen1
  170.     OR 2(A1),D0        OR 4 words
  171.     OR 4(A1),D0        OR 4 words
  172.     OR 6(A1),D0        OR 4 words
  173.     NOT D0
  174.     MOVE D0,D1        store mask in D1...
  175.     SWAP D1
  176.     MOVE D0,D1        ...in lower and upper words
  177.     MOVE.L D1,D0        get mask
  178.     AND.L (A2)+,D0        AND longword0 from screen2
  179.     OR.L (A1)+,D0        OR longword0 from screen1
  180.     MOVE.L D0,(A0)+        store longword0 in screen
  181.     AND.L (A2)+,D1        AND longword1 from screen2
  182.     OR.L (A1)+,D1        OR longword1 from screen1
  183.     MOVE.L D1,(A0)+        store longword0 in screen
  184.     ENDR
  185.     CMP.L send2(A6),A2
  186.     BLT d1
  187.     SUBA.L #32000,A2
  188. d1    CMP.L send1(A6),A1
  189.     BLT d2
  190.     SUBA.L #32000,A1
  191. d2    DBRA D7,dloop
  192.  
  193.     RTS
  194.  
  195. *********************************************************************
  196.  
  197. var    DS.L 15            space for 15 variables
  198.  
  199. pic1    DC.B 'A:\AUTO\PICTURE2.PI1',0
  200. pic2    DC.B 'A:\AUTO\PICTURE1.PI1',0
  201.