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