]> git.sur5r.net Git - cc65/blob - libsrc/c128/break.s
0ecdc85ec862dc364befca9b948b62c400f11239
[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         .import         BRKStub, BRKOld, BRKInd
12         .importzp       ptr1
13
14         .include        "c128.inc"
15
16
17 .bss
18 _brk_a:         .res    1
19 _brk_x:         .res    1
20 _brk_y:         .res    1
21 _brk_sr:        .res    1
22 _brk_pc:        .res    2
23
24 .data
25 uservec:        jmp     $FFFF           ; Patched at runtime
26
27 .code
28
29
30 ; Set the break vector
31 .proc   _set_brk
32
33         sta     uservec+1
34         stx     uservec+2       ; Set the user vector
35
36         lda     BRKOld+1
37         ora     BRKOld+2        ; Did we save the vector already?
38         bne     @L1             ; Jump if we installed the handler already
39
40         lda     BRKVec          ; Save the old vector
41         sta     BRKOld+1
42         lda     BRKVec+1
43         sta     BRKOld+2
44
45         lda     #<BRKStub       ; Set the break vector to our stub
46         ldx     #>BRKStub
47         sta     BRKVec
48         stx     BRKVec+1
49
50         lda     #<brk_handler   ; Set the indirect vector to our handler
51         ldx     #>brk_handler
52         sta     BRKInd+1
53         stx     BRKInd+2
54
55 @L1:    rts
56
57 .endproc
58
59
60 ; Reset the break vector
61 .proc   _reset_brk
62
63         lda     BRKOld+1
64         ldx     BRKOld+2
65         beq     @L9             ; Jump if vector not installed
66         sta     BRKVec
67         stx     BRKVec+1
68         lda     #$00
69         sta     BRKOld+1        ; Clear the saved vector
70         sta     BRKOld+2
71 @L9:    rts
72
73 .endproc
74
75
76
77 ; Break handler, called if a break occurs
78
79 .proc   brk_handler
80
81         pla
82         sta     _brk_y
83         pla
84         sta     _brk_x
85         pla
86         sta     _brk_a
87         pla
88         and     #$EF            ; Clear break bit
89         sta     _brk_sr
90         pla                     ; PC low
91         sec
92         sbc     #2              ; Point to start of brk
93         sta     _brk_pc
94         pla                     ; PC high
95         sbc     #0
96         sta     _brk_pc+1
97
98         jsr     uservec         ; Call the user's routine
99
100         lda     _brk_pc+1
101         pha
102         lda     _brk_pc
103         pha
104         lda     _brk_sr
105         pha
106         ldx     _brk_x
107         ldy     _brk_y
108         lda     _brk_a
109         rti                     ; Jump back...
110
111 .endproc
112
113