]> git.sur5r.net Git - cc65/blob - libsrc/serial/ser-kernel.s
Minor style fix.
[cc65] / libsrc / serial / ser-kernel.s
1 ;
2 ; Ullrich von Bassewitz, 2003-04-15
3 ;
4 ; Common functions of the serial drivers
5 ;
6
7         .import         return0, ser_libref
8         .importzp       ptr1
9         .interruptor    ser_irq, 29     ; Export as high priority IRQ handler
10
11         .include        "ser-kernel.inc"
12         .include        "ser-error.inc"
13
14
15 ;----------------------------------------------------------------------------
16 ; Variables
17
18
19 .bss
20 _ser_drv:       .res    2               ; Pointer to driver
21
22 ; Jump table for the driver functions.
23 .data
24 ser_vectors:
25 ser_install:    jmp     return0
26 ser_uninstall:  jmp     return0
27 ser_open:       jmp     return0
28 ser_close:      jmp     return0
29 ser_get:        jmp     return0
30 ser_put:        jmp     return0
31 ser_status:     jmp     return0
32 ser_ioctl:      jmp     return0
33 ser_irq:        .byte   $60, $00, $00   ; RTS plus two dummy bytes
34
35 ; Driver header signature
36 .rodata
37 ser_sig:        .byte   $73, $65, $72, SER_API_VERSION  ; "ser", version
38
39
40 .code
41 ;----------------------------------------------------------------------------
42 ; unsigned char __fastcall__ ser_install (void* driver);
43 ; /* Install the driver once it is loaded */
44
45
46 _ser_install:
47         sta     _ser_drv
48         sta     ptr1
49         stx     _ser_drv+1
50         stx     ptr1+1
51
52 ; Check the driver signature
53
54         ldy     #.sizeof(ser_sig)-1
55 @L0:    lda     (ptr1),y
56         cmp     ser_sig,y
57         bne     inv_drv
58         dey
59         bpl     @L0
60
61 ; Set the library reference
62
63         ldy     #SER_HDR::LIBREF
64         lda     #<ser_libref
65         sta     (ptr1),y
66         iny
67         lda     #>ser_libref
68         sta     (ptr1),y
69
70 ; Copy the jump vectors
71
72         ldy     #SER_HDR::JUMPTAB
73         ldx     #0
74 @L1:    inx                             ; Skip the JMP opcode
75         jsr     copy                    ; Copy one byte
76         jsr     copy                    ; Copy one byte
77         cpy     #(SER_HDR::JUMPTAB + .sizeof(SER_HDR::JUMPTAB))
78         bne     @L1
79
80         jsr     ser_install             ; Call driver install routine
81
82         ldy     ser_irq+2               ; Check high byte of IRQ vector
83         beq     @L2                     ; Jump if vector invalid
84         ldy     #$4C                    ; Jump opcode
85         sty     ser_irq                 ; Activate IRQ routine
86 @L2:    rts
87
88 ; Driver signature invalid
89
90 inv_drv:
91         lda     #SER_ERR_INV_DRIVER
92         ldx     #0
93         rts
94
95 ; Copy one byte from the jump vectors
96
97 copy:   lda     (ptr1),y
98         sta     ser_vectors,x
99         iny
100         inx
101         rts
102
103 ;----------------------------------------------------------------------------
104 ; unsigned char ser_uninstall (void);
105 ; /* Uninstall the currently loaded driver and return an error code.
106 ; ** Note: This call does not free allocated memory.
107 ; */
108
109 _ser_uninstall:
110         jsr     ser_uninstall           ; Call driver routine
111
112         lda     #$60                    ; RTS opcode
113         sta     ser_irq                 ; Disable IRQ entry point
114
115 _ser_clear_ptr:                         ; External entry point
116         lda     #0
117         sta     _ser_drv
118         sta     _ser_drv+1              ; Clear the driver pointer
119
120         tax
121         rts                             ; Return zero