]> git.sur5r.net Git - cc65/blob - libsrc/c128/break.s
This commit was generated by cvs2svn to compensate for changes in r2,
[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         .export         _brk_a, _brk_x, _brk_y, _brk_sr, _brk_pc
10         .import         _atexit
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         lda     #<_reset_brk
58         ldx     #>_reset_brk
59         jsr     _atexit         ; Install an exit handler
60
61 L2:     lda     #<stub_addr     ; Set the break vector to our stub
62         sta     BRKVec
63         lda     #>stub_addr
64         sta     BRKVec+1
65         rts
66
67 .endproc
68
69
70 ; Reset the break vector
71 .proc   _reset_brk
72
73         lda     oldvec
74         sta     BRKVec
75         lda     oldvec+1
76         sta     BRKVec+1
77         rts
78
79 .endproc
80
81
82
83 ; Break handler, called if a break occurs
84
85 .proc   brk_handler
86
87         pla
88         sta     _brk_y
89         pla
90         sta     _brk_x
91         pla
92         sta     _brk_a
93         pla
94         and     #$EF            ; Clear break bit
95         sta     _brk_sr
96         pla                     ; PC low
97         sec
98         sbc     #2              ; Point to start of brk
99         sta     _brk_pc
100         pla                     ; PC high
101         sbc     #0
102         sta     _brk_pc+1
103
104         jsr     uservec         ; Call the user's routine
105
106         lda     _brk_pc+1
107         pha
108         lda     _brk_pc
109         pha
110         lda     _brk_sr
111         pha
112         ldx     _brk_x
113         ldy     _brk_y
114         lda     _brk_a
115         rti                     ; Jump back...
116
117 .endproc
118
119
120 brk_stub:
121         .org    stub_addr
122         pla                     ; Get original MMU value
123         sta     MMU_CR          ; Re-enable our config
124         jmp     brk_handler     ; Jump to the user handler
125         .reloc
126
127 stub_size       = * - brk_stub