forked from jmatzen/leventhal-6809
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path6809_BFI.s
143 lines (135 loc) · 3.52 KB
/
6809_BFI.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
.macro SEC
ORCC #$01
.endm
;
; Title: Bit Field Insertion
; Name: BFI
;
; Purpose: Inserts a field of bits which is
; normalized to bit 0 into a 16-bit word.
;
; NOTE: IF THE REQUESTED FIELD IS TOO LONG,
; THEN ONLY THE BITS THROUGH BIT 15
; WILL BE INSERTED.
; FOR EXAMPLE, IF A 4 BIT FIELD IS
; REQUESTED STARTING AT BIT 15,
; THEN 0NLY THE FIRST BIT WILL BE INSERTED
; AT BIT 15.
;
; Entry: TOP OF STACK
; High byte of return address
; Low byte of return address
; Bit position at which inserted field will start (0..15)
; Number of bits in the field (1..16)
; High byte of value to insert
; Low byte of value to insert
; High byte of value
; Low byte of value
;
; Exit: Register D = Value with field inserted
;
; Registers Used: A,B,CC,U,X
;
; Time: 91 cycles overhead plus
; (30 * lowest bit position) cycles
; Size: Program 67 bytes
;
BFI:
; LDU ,S ; SAVE RETURN ADDRESS
;
; EXIT WITH DATA AS RESULT IF WIDTH OF FIELD IS ZERO
;
LDD 6,S ; GET DATA
TST 3,S ; CHECK FIELD WIDTH
BEQ EXITBF ; BRANCH (EXIT) IF FIELD WIDTH IS ZERO
; RESULT IN D IS ORIGINAL DATA
;
; USE FIELD WIDTH TO OBTAIN MASK FROM ARRAY
; MASK HAS A NUMBER OF RIGHT-JUSTIFIED 0 BITS GIVEN BY FIELD WIDTH
;
LDA 3,S ; GET FIELD WIDTH
DECA ; CONVERT FIELD WIDTH TO ARRAY INDEX
ANDA #$0F ; MAKE SURE INDEX IS U TO 15
ASLA ; MULTIPLY BY 2 SINCE MASKS ARE WORD-LENGTH
;
; will not assemble PCR
;
; LEAX MSKARY,PCR ; GET BASE ADDRESS 0F MASK ARRAY
LDX A,X ; GET MASK FROM ARRAY
;
; SHIFT MASK AND FIELD TO BE INSERTED LEFT TO
; ALIGN THEM WITH THE FIELD'S LOWEST BIT POSITION
;
LDA 2,S ; GET LOWEST BIT POSITION
ANDA #$0F ; BE SURE POSITION IS 0 TO 15
BEQ INSERT ; BRANCH IF POSITION IS 0 AND NO SHIFTING
; IS NECESSARY
STA ,S ; SAVE LOWEST POSITION IN STACK FOR USE
; AS COUNTER
TFR X,D ; MOVE MASK TO REGISTER D FOR SHIFTING
SHFTLP:
SEC ; FILL MASK WITH ONES
ROLB ; SHIFT LOW BYTE OF MASK LEFT, PUTTING A
; 1 IN BIT 0
ROLA ; SHIFT HIGH BYTE OF MASK LEFT
ASL 5,S ; SHIFT LOW BYTE OF INSERT VALUE LEFT
ROL 4,S ; SHIFT HIGH BYTE OF INSERT VALUE LEFT
DEC ,S
BNE SHFTLP ; CONTINUE UNTIL INSERT VALUE'S LEAST
; SIGNIFICANT BIT IS IN LOWEST BIT
; POSITION
;
; USE MASK TO CLEAR FIELD, THEN OR IN INSERT VALUE
;
INSERT:
ANDA 6,S ; AND HIGH BYTE OF VALUE WITH MASK
ANDB 7,S ; AND LOW BYTE OF VALUE WITH MASK
ORA 4,S ; OR IN HIGH BYTE OF INSERT VALUE
ORB 5,S ; OR IN LOW BYTE OF INSERT VALUE
;
; REMOVE PARAMETERS FROM STACK AND EXIT
;
EXITBF:
LEAS 8,S ; REMOVE PARAMETERS FROM STACK
JMP ,U ; EXIT TO RETURN ADDRESS
;
; MASK ARRAY USED TO CLEAR THE BIT FIELD INITIALLY
; HAS 0 BITS RIGHT-JUSTIFIED IN 1 TO 15 BIT POSITIONS
MSKARY:
FDB 1111111111111110B
FDB 1111111111111100B
FDB 1111111111111000B
FDB 1111111111110000B
FDB 1111111111100000B
FDB 1111111111000000B
FDB 1111111110000000B
FDB 1111111100000000B
FDB 1111111000000000B
FDB 1111110000000000B
FDB 1111100000000000B
FDB 1111000000000000B
FDB 1110000000000000B
FDB 1100000000000000B
FDB 1000000000000000B
;
; SAMPLE EXECUTION
;
SC4B:
LDA POS ; GET LOWEST BIT POSITION OF FIELD
LDB NBITS ; GET FIELD WIDTH IN BITS
LDX VALINS ; GET VALUE TO INSERT
LDY VAL ; GET VALUE
PSHS A,B,X,Y ; SAVE PARAMETERS IN STACK
JSR BFI ; INSERT BIT FIELD
; RESULT FOR VAL=1234H, VALINS=0EH,
; NBITS = 4, POS = 0CH IS
; REGISTER D = E234H
BRA SC4B
;
; DATA
;
VAL FDB $1234 ; DATA VALUE
VALINS FDB $000E ; VALUE TO INSERT
NBITS FDB 4 ; FIELD WIDTH IN BITS
POS FDB $0C ; LOWEST BIT POSITION IN FIELD
END