]> git.sur5r.net Git - cc65/blob - libsrc/c128/break.s
6f4cfe42059eed8c697da9a520e6c1fbaf049f52
[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 oldvec:         .res    2               ; Old vector
24
25
26 .data
27 uservec:        jmp     $FFFF           ; Patched at runtime
28
29 .code
30
31 ; Where will we put the break stub?
32 stub_addr       = $0E00                 ; BASIC sprite area
33
34
35
36 ; Set the break vector
37 .proc   _set_brk
38
39         sta     uservec+1
40         stx     uservec+2       ; Set the user vector
41
42         lda     oldvec
43         ora     oldvec+1        ; Did we save the vector already?
44         bne     L2              ; Jump if we installed the handler already
45
46         lda     BRKVec
47         sta     oldvec
48         lda     BRKVec+1
49         sta     oldvec+1        ; Save the old vector
50
51         ldy     #stub_size-1    ; Copy our stub into the low mem area
52 L1:     lda     brk_stub,y
53         sta     stub_addr,y
54         dey
55         bpl     L1
56
57 L2:     lda     #<stub_addr     ; Set the break vector to our stub
58         sta     BRKVec
59         lda     #>stub_addr
60         sta     BRKVec+1
61         rts
62
63 .endproc
64
65
66 ; Reset the break vector
67 .proc   _reset_brk
68
69         lda     oldvec
70         bne     @L1
71         ldx     oldvec
72         beq     @L9             ; Jump if vector not installed
73 @L1:    sta     BRKVec
74         stx     BRKVec+1
75 @L9:    rts
76
77 .endproc
78
79
80
81 ; Break handler, called if a break occurs
82
83 .proc   brk_handler
84
85         pla
86         sta     _brk_y
87         pla
88         sta     _brk_x
89         pla
90         sta     _brk_a
91         pla
92         and     #$EF            ; Clear break bit
93         sta     _brk_sr
94         pla                     ; PC low
95         sec
96         sbc     #2              ; Point to start of brk
97         sta     _brk_pc
98         pla                     ; PC high
99         sbc     #0
100         sta     _brk_pc+1
101
102         jsr     uservec         ; Call the user's routine
103
104         lda     _brk_pc+1
105         pha
106         lda     _brk_pc
107         pha
108         lda     _brk_sr
109         pha
110         ldx     _brk_x
111         ldy     _brk_y
112         lda     _brk_a
113         rti                     ; Jump back...
114
115 .endproc
116
117
118 brk_stub:
119         .org    stub_addr
120         pla                     ; Get original MMU value
121         sta     MMU_CR          ; Re-enable our config
122         jmp     brk_handler     ; Jump to the user handler
123         .reloc
124
125 stub_size       = * - brk_stub