1 | * ------------------------------------------------------------------------------
|
---|
2 | * acctrl.s -- VSDD access table control functions
|
---|
3 | * Version 6 -- 1987-04-13 -- D.N. Lynx Crowe
|
---|
4 | * (c) Copyright 1987 -- D.N. Lynx Crowe
|
---|
5 | * ------------------------------------------------------------------------------
|
---|
6 | *
|
---|
7 | * objclr(obj)
|
---|
8 | * unsigned int obj;
|
---|
9 | *
|
---|
10 | * Clear bits in access table for object 'obj'.
|
---|
11 | * Disables object 'obj'.
|
---|
12 | *
|
---|
13 | * objoff(obj, line, num)
|
---|
14 | * unsigned int obj, line, num;
|
---|
15 | *
|
---|
16 | * Disable object obj at line thru line+num.
|
---|
17 | *
|
---|
18 | * objon(obj, line, num)
|
---|
19 | * unsigned int obj, line, num;
|
---|
20 | *
|
---|
21 | * Enable object obj at line thru line+num.
|
---|
22 | *
|
---|
23 | *
|
---|
24 | * Assumes VSDD is looking at bank 0.
|
---|
25 | * Assumes a screen height of 350 lines.
|
---|
26 | * No error checks are done, so beware.
|
---|
27 | * ------------------------------------------------------------------------------
|
---|
28 | .text
|
---|
29 | *
|
---|
30 | .xdef _objclr,_objoff,_objon
|
---|
31 | *
|
---|
32 | .xref _v_actab
|
---|
33 | *
|
---|
34 | SCSIZE .equ 350 * Screen height
|
---|
35 | *
|
---|
36 | OBJ .equ 8 * Object number argument offset
|
---|
37 | LINE .equ 10 * Beginning line argument offset
|
---|
38 | NUM .equ 12 * Object height argument offset
|
---|
39 | * ------------------------------------------------------------------------------
|
---|
40 | .page
|
---|
41 | * ------------------------------------------------------------------------------
|
---|
42 | *
|
---|
43 | * objclr(obj)
|
---|
44 | * unsigned int obj;
|
---|
45 | *
|
---|
46 | * Disables object obj in access table by turning on
|
---|
47 | * its bit in all words of the access table.
|
---|
48 | * ------------------------------------------------------------------------------
|
---|
49 | _objclr: link a6,#0 * Link stack frames
|
---|
50 | move.w OBJ(a6),d1 * Get object bit number in d1
|
---|
51 | lea _v_actab,a0 * Get base of object table in a0
|
---|
52 | move.w #SCSIZE-1,d2 * Put line count in d2
|
---|
53 | *
|
---|
54 | objclr1: move.w (a0),d0 * Get access table word
|
---|
55 | bset.l d1,d0 * Set the bit
|
---|
56 | move.w d0,(a0)+ * Update word in access table
|
---|
57 | dbf d2,objclr1 * Loop until done
|
---|
58 | *
|
---|
59 | unlk a6 * Unlink stack frame
|
---|
60 | rts * Return to caller
|
---|
61 | *
|
---|
62 | .page
|
---|
63 | * ------------------------------------------------------------------------------
|
---|
64 | * objoff(obj, line, num)
|
---|
65 | * unsigned int obj, line, num;
|
---|
66 | *
|
---|
67 | * Turn on access table bits for object 'obj' at
|
---|
68 | * lines 'line' through 'line'+'num'. Disables the object.
|
---|
69 | * Assumes object bits were set at those locations.
|
---|
70 | * ------------------------------------------------------------------------------
|
---|
71 | _objoff: link a6,#0 * Link stack frames
|
---|
72 | move.w OBJ(a6),d1 * Get object bit number into d1
|
---|
73 | move.w LINE(a6),d2 * Get top line number
|
---|
74 | add.w d2,d2 * Convert to word offset
|
---|
75 | lea _v_actab,a0 * Get base address of access table
|
---|
76 | move.w 0(a0,d2),d0 * Get top line access word
|
---|
77 | bset.l d1,d0 * Set object bit
|
---|
78 | move.w d0,0(a0,d2) * Update word in access table
|
---|
79 | tst.w NUM(a6) * Number of lines = 0 ?
|
---|
80 | beq objoff1 * Done if so
|
---|
81 | *
|
---|
82 | move.w NUM(a6),d2 * Get object depth
|
---|
83 | add.w LINE(a6),d2 * Add to top line number
|
---|
84 | cmpi.w #SCSIZE,d2 * Bottom line >= screen height ?
|
---|
85 | bge objoff1 * Done if so
|
---|
86 | *
|
---|
87 | add.w d2,d2 * Convert to word offset
|
---|
88 | move.w 0(a0,d2),d0 * Get bottom line access word
|
---|
89 | bset.l d1,d0 * Set object bit
|
---|
90 | move.w d0,0(a0,d2) * Update word in access table
|
---|
91 | *
|
---|
92 | objoff1: unlk a6 * Unlink stack frame
|
---|
93 | rts * Return to caller
|
---|
94 | *
|
---|
95 | .page
|
---|
96 | * ------------------------------------------------------------------------------
|
---|
97 | * objon(obj, line, num)
|
---|
98 | * unsigned int obj, line, num;
|
---|
99 | *
|
---|
100 | * Turn off access table bits for object 'obj'
|
---|
101 | * at 'line' thru 'line'+'num'. Enables the object.
|
---|
102 | * ------------------------------------------------------------------------------
|
---|
103 | _objon: link a6,#0 * Link stack frames
|
---|
104 | move.w OBJ(a6),d1 * Get object bit number into d1
|
---|
105 | move.w LINE(a6),d2 * Get top line number
|
---|
106 | add.w d2,d2 * Convert to word offset
|
---|
107 | lea _v_actab,a0 * Get base address of access table
|
---|
108 | move.w 0(a0,d2),d0 * Get top line access word
|
---|
109 | bclr.l d1,d0 * Clear object bit
|
---|
110 | move.w d0,0(a0,d2) * Update word in access table
|
---|
111 | tst.w NUM(a6) * Number of lines = 0 ?
|
---|
112 | beq objon1 * Done if so
|
---|
113 | *
|
---|
114 | move.w NUM(a6),d2 * Get object depth
|
---|
115 | add.w LINE(a6),d2 * Add top line number
|
---|
116 | cmpi.w #SCSIZE,d2 * Bottom line >= screen height ?
|
---|
117 | bge objon1 * Done if so
|
---|
118 | *
|
---|
119 | add.w d2,d2 * Convert to word offset
|
---|
120 | move.w 0(a0,d2),d0 * Get bottom line access word
|
---|
121 | bclr.l d1,d0 * Clear object bit
|
---|
122 | move.w d0,0(a0,d2) * Update word in access table
|
---|
123 | *
|
---|
124 | objon1: unlk a6 * Unlink stack frame
|
---|
125 | rts * Return to caller
|
---|
126 | *
|
---|
127 | .end
|
---|