]> git.sur5r.net Git - cc65/blobdiff - libsrc/em/em-kernel.s
Added setjmp/longjmp
[cc65] / libsrc / em / em-kernel.s
index 473cbb55c83198baa17278bd28923eab2fde9004..1c9591e28d9b2c9b97c60c98a37a5a825504048c 100644 (file)
@@ -4,8 +4,7 @@
 ; Common functions of the extended memory API.
 ;
 
-        .export         _em_install, _em_deinstall
-
+        .export         em_clear_ptr
         .import         return0
         .importzp       ptr1
 
@@ -24,7 +23,7 @@ _em_drv:        .res    2                     ; Pointer to driver
 .data
 emd_vectors:
 emd_install:           jmp     return0
-emd_deinstall:         jmp     return0
+emd_uninstall:         jmp     return0
 emd_pagecount:  jmp     return0
 emd_map:        jmp     return0
 emd_use:        jmp     return0
@@ -34,8 +33,7 @@ emd_copyto:     jmp     return0
 
 ; Driver header signature
 .rodata
-emd_sig:        .byte   $65, $6d, $64, $00      ; "emd", version
-emd_sig_len     = * - emd_sig
+emd_sig:        .byte   $65, $6d, $64, EMD_API_VERSION ; "emd", version
 
 
 ;----------------------------------------------------------------------------
@@ -51,7 +49,7 @@ _em_install:
 
 ; Check the driver signature
 
-        ldy     #emd_sig_len-1
+        ldy     #.sizeof(emd_sig)-1
 @L0:    lda     (ptr1),y
         cmp     emd_sig,y
         bne     inv_drv
@@ -60,12 +58,12 @@ _em_install:
 
 ; Copy the jump vectors
 
-        ldy     #EMD_HDR_JUMPTAB
+        ldy     #EMD_HDR::JUMPTAB
         ldx     #0
 @L1:    inx                             ; Skip the JMP opcode
         jsr     copy                    ; Copy one byte
         jsr     copy                    ; Copy one byte
-        cpx     #(EMD_HDR_JUMPCOUNT*3)
+        cpy     #(EMD_HDR::JUMPTAB + .sizeof(EMD_HDR::JUMPTAB))
         bne     @L1
 
         jmp     emd_install             ; Call driver install routine
@@ -80,29 +78,25 @@ inv_drv:
 ; Copy one byte from the jump vectors
 
 copy:   lda     (ptr1),y
+        sta     emd_vectors,x
         iny
-set:    sta     emd_vectors,x
         inx
         rts
 
 ;----------------------------------------------------------------------------
-; void __fastcall__ em_deinstall (void);
-; /* Deinstall the driver before unloading it */
-
-_em_deinstall:
-        jsr     emd_deinstall           ; Call driver routine
-
-; Point all jump vectors to return0
+; unsigned char __fastcall__ em_uninstall (void);
+; /* Uninstall the currently loaded driver and return an error code.
+;  * Note: This call does not free allocated memory.
+;  */
 
-        ldx     #0
-@L1:    inx                             ; Skip JMP opcode
-        lda     #<return0
-        jsr     set
-        lda     #>return0
-        jsr     set
-        cpx     #(EMD_HDR_JUMPCOUNT*3)
-        bne     @L1
+_em_uninstall:
+        jsr     emd_uninstall           ; Call driver routine
 
-        rts
+em_clear_ptr:                           ; External entry point
+        lda     #0
+        sta     _em_drv
+        sta     _em_drv+1               ; Clear the driver pointer
 
+        tax
+        rts                             ; Return zero