home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
070.lha
/
ud.asm
< prev
next >
Wrap
Assembly Source File
|
1986-11-20
|
7KB
|
177 lines
******************************************************************************
* *
* UD.asm - UpsideDown - A fun (and educational too!) Schwabie *
* *
* Programmed by Darrin Massena, Mantis Development. *
* No Rights Reserved - Hey everybody, it's FREE! *
* *
* To make UD using the Aztec 'C' assembler: *
* 1) as UD.asm *
* 2) ln -o UD UD.o -lc32 *
* *
* To make UD using the MetaCompost assembler: *
* 1) Rewrite first few lines to get a suitable index into the data hunk. *
* 2) Fix other odd incompatibilities. *
* 3) Wait forever for assembling. *
* 4) Wait forever for linking. *
* 5) Wonder why it doesn't run correctly. *
* 6) Give up and go buy Aztec 'C'. *
* 7) Use the Aztec instructions above. *
* *
* WARNING! Playing around with the copper-list like this is very much dis- *
* couraged for SERIOUS programs, but hey, why :-| when you can :-) ? *
* *
* Revision history : *
* ------------------ *
* 06/20/87 (DWM) Just having some innocent fun. *
* 06/21/87 (DWM) Aggg! It's out of control! RUN, RUN! *
* *
******************************************************************************
include "exec/types.i"
include "graphics/gfx.i"
include "graphics/gfxbase.i"
include "graphics/view.i"
include "graphics/copper.i"
DSEG
SysBase equ 4
* ===========================================================================
CSEG
* Define these as public and they'll be pulled in from C32.lib.
public _LVOOpenLibrary,_LVOCloseLibrary
public _LVOOutput,_LVOWrite
call MACRO ;macro to call system routines
jsr _LVO\1(a6)
ENDM
* ===========================================================================
public UD
UD
* Does anyone know a 'cleaner' way to set the initial A4 data pointer?
* movea.l #dummyVar+32766,a4 ;special stuff to get my relative A4
dc.w %0010100001111100 ; <-- doing it the hard way
dc.l dummyVar+32766
* If any initializations fail, we'll just abort (cleanly, of course.)
lea.l szDOS,a1
moveq #0,d0
move.l SysBase,a6
call OpenLibrary ;open dos.library
move.l d0,_DOSBase
beq Quit ;failed!
move.l d0,a6
call Output ;get output filehandle
move.l d0,d1 ;d1 = out fh
lea.l szCredit,a0
move.l a0,d2 ;d2 = szCredit
moveq #-1,d3
99$ addq.l #1,d3 ;loop, counting sz len
tst.b (a0)+
bne 99$
call Write ;take the blame
lea.l szGfx,a1
moveq #0,d0
move.l SysBase,a6
call OpenLibrary ;open graphics.library
move.l d0,_GfxBase
beq Quit ;failed? How?
* Will the REAL copper-list please stand up?
move.l d0,a0 ;a0 = _GfxBase
move.l gb_ActiView(a0),a0 ;a0 = _GfxBase->ActiView
move.l v_ViewPort(a0),a1 ;save ptr to first ViewPort
move.l v_LOFCprList(a0),a0 ;a0 = _GfxBase->ActiView->LOFCprList
move.l crl_start(a0),a0 ;a0 = ptr to actual copper list in use
* We now have _GfxBase->ActiView->LOFCprList->start (whew!)
* Get a pointer to the first BitMap in the view
move.l vp_RasInfo(a1),a1
move.l ri_BitMap(a1),a1 ;a1 = first BitMap
move.w bm_BytesPerRow(a1),d1 ;d1 = # of bytes across screen's bm
move.w bm_Rows(a1),d2 ;d2 = # of rows in screen's BitMap
* Scan through the copper-list until we find the first BPLMOD initialization.
1$ move.l (a0)+,d0
swap d0
cmp.w #$0108,d0 ;move to BPLMOD1?
bne 1$ ; no, loop until we found it
* Change modulos to step BACK a couple of scanlines instead of forward.
move.w d1,d0 ;# of bytes for one line across screen
add.w d0,d0 ; * 2 (have to skip back 2 lines -
neg.w d0 ; think about it)
move.w d0,-2(a0) ;set BPLMOD1 back up 2 lines
move.w d0,2(a0) ;set BPLMOD2 back up 2 lines
subq.w #1,d2 ;bottom line = BytesPerRow * (Rows - 1)
mulu d1,d2 ;d2 = bottom line
* Since we're going backwards, we have to start at the bottom of each bit-
* plane instead of at the top.
move.w 6(a0),d0 ;first plane hi addr
swap d0
move.w 10(a0),d0 ;first plane lo addr
add.l d2,d0 ;drop to bottom line
move.w d0,10(a0) ;put back hi
swap d0
move.w d0,6(a0) ;put back lo
move.w 14(a0),d0 ;second plane hi addr
swap d0
move.w 18(a0),d0 ;second plane lo addr
add.l d2,d0 ;drop to bottom line
move.w d0,18(a0) ;put back hi
swap d0
move.w d0,14(a0) ;put back lo
* It's time to quit, close up shop and say good-night.
Quit
move.l SysBase,a6
move.l _DOSBase,d0 ;close the dos.library if open
beq 1$
move.l d0,a1
call CloseLibrary
1$
move.l _GfxBase,d0 ;close the graphics.library if open
beq 2$ ; oops, not open
move.l d0,a1
call CloseLibrary
2$
rts ;bye!
* ===========================================================================
DSEG
* These vars are derived using the Mantis naming conventions. A brief
* summary follows:
*
* p - indicates a pointer
* n - 'new' structure
* win,scr,fh - abbreviations for window, screen and filehandle structures
* co - color 0x0RGB data type
* sz - null terminated string type
* rg - range of values (array)
* b,w,l - byte, word, long data types
*
* Quiz: What does prgpfhOpen stand for?
* .selif nepO fo sretnioP eldnaHeliF fo eGnaR a ot retnioP a :rewsnA
dummyVar ;dummy, used to create my A4
szGfx dc.b "graphics.library",0
szDOS dc.b "dos.library",0
szCredit dc.b "UD - UpsideDown",$a1
dc.b " - by Darrin Massena, Mantis Development",$0a
dc.b "Press Left-Amiga-N or drag any screen to return to normal.",$0a,0
even
_GfxBase dc.l 0
_DOSBase dc.l 0
* ===========================================================================
END