]> git.sur5r.net Git - cc65/blob - libsrc/c128/break.s
f2f872be87d00430c54b892e88abd209e45d099e
[cc65] / libsrc / c128 / break.s
1 ;
2 ; Ullrich von Bassewitz, 27.09.1998
3 ;
4 ; void set_brk (unsigned Addr);
5 ; void reset_brk (void);
6 ;
7
8         .export         _set_brk, _reset_brk
9         .destructor     _reset_brk
10         .export         _brk_a, _brk_x, _brk_y, _brk_sr, _brk_pc
11         .importzp       ptr1
12
13         .include        "c128.inc"
14
15
16 .bss
17 _brk_a:         .res    1
18 _brk_x:         .res    1
19 _brk_y:         .res    1
20 _brk_sr:        .res    1
21 _brk_pc:        .res    2
22
23 .data
24 uservec:        jmp     $FFFF           ; Patched at runtime
25
26 .code
27
28
29 ; Set the break vector
30 .proc   _set_brk
31
32         sta     uservec+1
33         stx     uservec+2       ; Set the user vector
34
35         lda     brk_old+1
36         ora     brk_old+2       ; Did we save the vector already?
37         bne     @L1             ; Jump if we installed the handler already
38
39         lda     BRKVec          ; Save the old vector
40         sta     brk_old+1
41         lda     BRKVec+1
42         sta     brk_old+2
43
44         lda     #<brk_stub      ; Set the break vector to our stub
45         ldx     #>brk_stub
46         sta     BRKVec
47         stx     BRKVec+1
48
49         lda     #<brk_handler   ; Set the indirect vector to our handler
50         ldx     #>brk_handler
51         sta     brk_ind+1
52         stx     brk_ind+2
53
54 @L1:    rts
55
56 .endproc
57
58
59 ; Reset the break vector
60 .proc   _reset_brk
61
62         lda     brk_old+1
63         ldx     brk_old+2
64         beq     @L9             ; Jump if vector not installed
65         sta     BRKVec
66         stx     BRKVec+1
67         lda     #$00
68         sta     brk_old+1       ; Clear the saved vector
69         sta     brk_old+2
70 @L9:    rts
71
72 .endproc
73
74
75
76 ; Break handler, called if a break occurs
77
78 .proc   brk_handler
79
80         pla
81         sta     _brk_y
82         pla
83         sta     _brk_x
84         pla
85         sta     _brk_a
86         pla
87         and     #$EF            ; Clear break bit
88         sta     _brk_sr
89         pla                     ; PC low
90         sec
91         sbc     #2              ; Point to start of brk
92         sta     _brk_pc
93         pla                     ; PC high
94         sbc     #0
95         sta     _brk_pc+1
96
97         jsr     uservec         ; Call the user's routine
98
99         lda     _brk_pc+1
100         pha
101         lda     _brk_pc
102         pha
103         lda     _brk_sr
104         pha
105         ldx     _brk_x
106         ldy     _brk_y
107         lda     _brk_a
108         rti                     ; Jump back...
109
110 .endproc
111
112
113 ; Break stub, must go into low (non banked) memory
114
115 .segment        "LOWCODE"
116
117 .proc   brk_stub
118         pla                             ; Get original MMU_CR value
119         sta     MMU_CR                  ; And set it
120         jmp     brk_ind                 ; Jump indirect to break
121 .endproc
122
123 ; ------------------------------------------------------------------------
124 ; Data
125
126 .data
127
128 ; Old break vector preceeded by a jump opcode
129 brk_old:
130         jmp     $0000
131
132 ; Indirect vectors preceeded by a jump opcode
133 brk_ind:
134         jmp     $0000
135