amos-professional/extensions/Intuition-41.95/Intuition/src2/graphics.s

185 lines
3.2 KiB
ArmAsm
Raw Normal View History

2020-04-26 00:58:13 +00:00
;Graphics-related stuff
include "offsets.i"
include "defs.i"
include "errordefs.i"
include "macros.i"
include "macros2.i"
ifd CREATOR
incdir "/AMOS1.3"
else
incdir "/AMOS"
endc
; include "equ.s" ;PhxAss is buggy...
EcNumber equ 188
Bnk_BitData equ 0
Bnk_BitChip equ 1
Bnk_BitBob equ 2
Bnk_BitIcon equ 3
section text,code
xref DataBase
xref NoMem
xref NoScr
xdef GetCurRP
xdef ClearGadget
xdef ReadPixel
xdef WritePixel
xdef AllocTmpRas
xdef FreeTmpRas
GetCurRP: ;Get current RastPort address
pstart2
dmove.l CurIwindow,d0
beq .nowin
move.l d0,a0
move.l wd_RPort(a0),d0
ret2
.nowin dmove.l CurIscreen,d0
beq NoScr
move.l d0,a0
move.l sc_UserData(a0),a0
move.l se_BaseWin(a0),a0
move.l wd_RPort(a0),d0
ret2
ClearGadget: ;Erase gadget A0 from window A1.
pstart2
movem.l d2-d4,-(a7)
move.w gg_LeftEdge(a0),d0
move.w gg_TopEdge(a0),d1
move.w d0,d2
move.w d1,d3
add.w gg_Width(a0),d2
add.w gg_Height(a0),d3
subq.w #1,d2
subq.w #1,d3
move.w #~GADGETTYPE,d4
and.w gg_GadgetType(a0),d4
cmp.w #STRGADGET,d4
bne .clear
subq.w #4,d0
subq.w #2,d1
addq.w #8,d2
addq.w #4,d3
.clear move.l wd_RPort(a1),a1
gfxcall EraseRect
movem.l (a7)+,d2-d4
ret2
ReadPixel: ;Replacement for graphics.library ReadPixel()
movem.l d2-d3/a2,-(a7)
move.l rp_BitMap(a1),a0
mulu bm_BytesPerRow(a0),d1
swap d0
clr.w d0
swap d0
move.w d0,d2
lsr.w #3,d0
add.l d1,d0
and.w #7,d2
eor.w #7,d2
moveq #0,d1
moveq #0,d3
addq.l #bm_Planes,a0
.bplp move.l (a0)+,a2
btst d2,0(a2,d0.l)
beq .nextbp
bset d1,d3
.nextbp addq.b #1,d1
cmp.b bm_Depth(a1),d1
bcs .bplp
move.l d3,d0
movem.l (a7)+,d2-d3/a2
rts
WritePixel:
ifd FAST_WRITEPIXEL
;Replacement for graphics.library WritePixel()
movem.l d2-d5,-(a7)
move.l rp_BitMap(a1),a0
mulu bm_BytesPerRow(a0),d1
swap d0
clr.w d0
swap d0
move.w d0,d2
lsr.w #3,d0
add.l d1,d0
and.w #7,d2
eor.w #7,d2
moveq #7,d1
addq.l #bm_Planes,a0
move.b rp_FgPen(a1),d3
move.b rp_Mask(a1),d4
.bplp move.l (a0)+,a1
move.l a1,d5
beq .nextbp
lsr.b #1,d4
beq .nextbp
lsr.b #1,d3
bcc .clrbit
bset d2,0(a0,d0.l)
bra .nextbp
.clrbit bclr d2,0(a0,d0.l)
.nextbp dbra d1,.bplp
move.l d3,d0
movem.l (a7)+,d2-d5
rts
else
;Stub - just use standard WritePixel() (assumes A4 contains DataBase, just
; like a gfxcall)
pstart2
dmove.l GfxBase,a6
jsr _LVOWritePixel(a6)
ret2
endc
AllocTmpRas: ;Allocate a TmpRas structure given RastPort in A0
pstart2
movem.l d3/a2-a3,-(a7)
move.l a0,a2
moveq #tr_sizeof,d0
moveq #MEMF_PUBLIC,d1
syscall AllocMem
move.l d0,a3
move.l a3,d0
beq NoMem
move.l rp_BitMap(a2),a1
move.w bm_BytesPerRow(a1),d0
mulu bm_Rows(a1),d0
move.l d0,d3
moveq #MEMF_PUBLIC|MEMF_CHIP,d1
call AllocMem
tst.l d0
bne .gotras
move.l a3,a1
moveq #tr_sizeof,d0
call FreeMem
bra NoMem
.gotras move.l d0,a1
move.l d3,d0
move.l a3,a0
gfxcall InitTmpRas
move.l a3,rp_TmpRas(a2)
movem.l (a7)+,d3/a2-a3
ret2
FreeTmpRas: ;Free TmpRas structure from RastPort in A0
move.l a2,-(a7)
move.l rp_TmpRas(a0),a2
move.l a2,d0
beq .exit ;No TmpRas
clr.l rp_TmpRas(a0)
move.l tr_RasPtr(a2),a1
move.l tr_Size(a2),d0
syscall FreeMem
move.l a2,a1
moveq #tr_sizeof,d0
syscall FreeMem
.exit move.l (a7)+,a2
rts