]> git.sur5r.net Git - cc65/blob - libsrc/serial/ser-kernel.s
Two fixes from Stefan Haubenthal
[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
8         .importzp       ptr1
9         .condes         ser_irq, 2              ; Export as 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 ;----------------------------------------------------------------------------
41 ; unsigned char __fastcall__ ser_install (void* driver);
42 ; /* Install the driver once it is loaded */
43
44
45 _ser_install:
46         sta     _ser_drv
47         sta     ptr1
48         stx     _ser_drv+1
49         stx     ptr1+1
50
51 ; Check the driver signature
52
53         ldy     #.sizeof(ser_sig)-1
54 @L0:    lda     (ptr1),y
55         cmp     ser_sig,y
56         bne     inv_drv
57         dey
58         bpl     @L0
59
60 ; Copy the jump vectors
61
62         ldy     #SER_HDR::JUMPTAB
63         ldx     #0
64 @L1:    inx                             ; Skip the JMP opcode
65         jsr     copy                    ; Copy one byte
66         jsr     copy                    ; Copy one byte
67         cpy     #(SER_HDR::JUMPTAB + .sizeof(SER_HDR::JUMPTAB))
68         bne     @L1
69
70         jsr     ser_install             ; Call driver install routine
71
72         ldy     ser_irq+2               ; Check high byte of IRQ vector
73         beq     @L2                     ; Jump if vector invalid
74         ldy     #$4C                    ; Jump opcode
75         sty     ser_irq                 ; Activate IRQ routine
76 @L2:    rts
77
78 ; Driver signature invalid
79
80 inv_drv:
81         lda     #SER_ERR_INV_DRIVER
82         ldx     #0
83         rts
84
85 ; Copy one byte from the jump vectors
86
87 copy:   lda     (ptr1),y
88         sta     ser_vectors,x
89         iny
90         inx
91         rts
92
93 ;----------------------------------------------------------------------------
94 ; unsigned char __fastcall__ ser_uninstall (void);
95 ; /* Uninstall the currently loaded driver and return an error code.
96 ;  * Note: This call does not free allocated memory.
97 ;  */
98
99 _ser_uninstall:
100         jsr     ser_uninstall           ; Call driver routine
101
102         lda     #$60                    ; RTS opcode
103         sta     ser_irq                 ; Disable IRQ entry point
104
105         lda     #0
106         sta     _ser_drv
107         sta     _ser_drv+1              ; Clear the driver pointer
108
109         tax
110         rts                             ; Return zero
111