-
Notifications
You must be signed in to change notification settings - Fork 85
/
Copy pathcrossover
163 lines (163 loc) · 3.21 KB
/
crossover
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
.PAG 'CROSSOVER ROUTINES'
*=0
E6509 *=*+1
I6509 *=*+1
.SKI 2
IROM =$F ;INDIRECT=ROM OR EXECUTION=ROM
;
;VIRTUAL REGISTERS
;
XPC
PCH *=*+1 ;PROGRAM COUNTER (REVERSE ORDER FOR BREAK)
PCL *=*+1
;
FLGS *=*+1 ;PROCESSOR STATUS
;
ACC *=*+1 ;ACCUMULATOR
;
XR *=*+1 ;.X REGISTER
;
YR *=*+1 ;.Y REGISTER
;
SP *=*+1 ;STACK POINTER
;
XE6509 *=*+1 ;OLD EXECUTION SEGMENT
;
XI6509 *=*+1 ;OLD INDIRECTION SEGMENT
;
RE6509 *=*+1 ;RETURN EXECUTION SEGMENT
;
PDTA *=*+2 ;POINTER TO XOVER COMMUNICATION AREA (^PCH)
.PAG
.SKI 2
*=$0200
;IRQ HANDLER
; NOTE: BREAKS TO THE MONITOR REQUIRE ALTERING THE STACK
; CONTENTS TO "GO" TO A NEW ADDRESS.
;
IRQ JSR RSAVE ;SAVE MACHINE STATE
LDY #$0F ;XFER SEGNO
JSR RSEND ;SEND MACHINE STATE
PLA ;GET ACTUAL FLAG BYTE
TAX
LDA I6509
STA E6509 ;GONE !!!
;
; PUSH FLAGS AND SET RETURN DOWN HERE AS IF IRQ
; HAPPENED IN THIS SEGMENT.
; ENTER: .X=PRE-IRQ FLAGS
LDA #>RTIRQ
PHA ;RETURN
LDA #<RTIRQ
PHA
TXA
PHA ;PRE-IRQ FLAGS
JSR RLOAD ;RESTORE .A,.X,.Y,POST-IRQ FLAGS
JMP ($FFFE) ;GO TO THE IRQ ROUTINE....
;
RTIRQ=*-1
PHP ;RETURN HERE FOR END OF IRQ
PLA
STA FLGS
BRKDN SEI ;MONITOR "GO" TO HERE TO CONTINUE
LDY RE6509 ;SEND REGISTERS BACK
JSR RSEND
LDA RE6509
STA E6509 ;GONE!!
;
LDA XI6509 ;RESTORE MACHINE STATE
STA I6509
RLOAD LDA FLGS
PHA
LDA ACC ;.A
LDX XR ;.X
LDY YR ;.Y
PLP ;MAY RESTORE INTERRUPTS
RTS
.SKI 3
; RSAVE - SAVE MACHINE STATE IN PAGE0 OF CURRENT SEGMENT.
; PRELIMINARY TO SWITCHING EXECUTION BANKS.
RSAVE PHP
SEI ;DISABLE INTERRUPTS
STA ACC ;.A
STX XR ;.X
STY YR ;.Y
PLA
STA FLGS ;FLAGS
TSX
STX SP ;.SP
LDA I6509
STA XI6509 ;I6509
LDA E6509
STA XE6509 ;E6509
RTS
.SKI 3
; RSEND - SEND MACHINE STATE INFORMATION TO THE XFER BANK.
; ENTER: .A = PC (LO)
; .X = PC (HI)
; .Y = SEGMENT
; NOTE, MUST BE PRECEDED BY A PREVIOUS RSAVE CALL.
;
RSEND STY I6509
LDY #0
STA XPC ;PC (LO)
STX XPC+1 ;PC (HI)
STY PDTA+1
LDA #<XPC
STA PDTA ;INITIALIZE POINTER TO DATA AREA
RSD50 LDA XPC,Y
STA (PDTA)Y
INY
CPY #XE6509-XPC+1
BNE RSD50
RTS
.SKI 3
; XOVER - SUBROUTINE CALL CROSS OVER TO A NEW BANK.
; ENTER: REGISTERS CONTAIN ADDRESS OF ROUTINE TO CALL.
; .A=PC (LO), .X=PC (HI), .Y=SEG#
;
XOVER JSR RSEND ;SEND SAVED MACHINE STATE
LDA I6509 ;EXECUTION SEGMENT
STA E6509 ;GONE!
;
;LDX #$FF ;IN NEW BANK, RESET STACK
;TXS
LDA XE6509 ;SAVE RETURN EXECUTION BANK
STA RE6509
JSR RLOAD ;LOAD UP ORIGINAL .A,.X,.Y
JSR XCALL ;DO IT...
JSR RSAVE ;SAVE REGS FOR RETURN
LDY RE6509
JSR RSEND ;SEND MACHINE STATE TO RETURN BANK
; DEBUG OUTPUT
WROB=$EECD
;LDA SP
;JSR WROB
TSX
TXA
JSR WROB
LDA RE6509
STA I6509
JSR WROB
LDA #1
STA PDTA+1
LDA #0
STA PDTA
LDY SP
DEY
LDA (PDTA)Y
JSR WROB
INY
LDA (PDTA)Y
JSR WROB
INY
LDA (PDTA)Y
JSR WROB
;LDX SP ;RESTORE STACK
;TXS
LDA RE6509
STA E6509 ;GONE !
RTS
.SKI 3
XCALL JMP (XPC)
.END