]> git.sur5r.net Git - cc65/commitdiff
Apple 2 mouse driver and other stuff from Oliver Schmidt
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 6 Apr 2006 19:51:37 +0000 (19:51 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 6 Apr 2006 19:51:37 +0000 (19:51 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3717 b7a2c559-68d2-44c3-8de9-860c34a00d81

17 files changed:
doc/apple2.sgml
doc/apple2enh.sgml
doc/library.sgml
libsrc/Makefile
libsrc/apple2/.cvsignore
libsrc/apple2/Makefile
libsrc/apple2/apple2-stdmou.s [new file with mode: 0644]
libsrc/apple2/cputc.s
libsrc/apple2/dosdetect.s
libsrc/apple2/mainargs.s
libsrc/apple2/mcbdefault.s [new file with mode: 0644]
libsrc/apple2enh/.cvsignore
libsrc/apple2enh/Makefile
libsrc/mouse/mouse-kernel.s
samples/Makefile
samples/README
samples/mousedemo.c

index dc48a89397ba64360e50e429b3f8753b7c63ab2b..e933d49fb36d60ffb2a316ce87872a244d091dcb 100644 (file)
@@ -130,9 +130,9 @@ you cannot do it, it just means that there's no help.
 
   <tag><tt/a2.lc.emd/</tag>
   Gives access to 12KB RAM (48 pages of 256 bytes each) on the
-  Apple2 language card. The driver was contributed by Stefan Haubenthal.
-  Note that this driver is incompatible with any DOS using the language
-  card memory!
+  Apple&nbsp;II Language Card. The driver was contributed by Stefan Haubenthal.
+  Note that this driver is incompatible with any DOS using the Language
+  Card memory!
 
 </descrip><p>
 
@@ -150,8 +150,20 @@ you cannot do it, it just means that there's no help.
 
 <sect1>Mouse drivers<p>
 
-Currently no drivers available (in fact, the API for loadable mouse drivers
-does not exist).
+<descrip>
+
+  <tag><tt/a2.stdmou.mou/</tag>
+  Driver for the AppleMouse&nbsp;II Card. Searches all Apple&nbsp;II slots
+  for an AppleMouse&nbsp;II Card compatible firmware. The default bounding
+  box is &lsqb;0..279,0..191&rsqb;. Programs using this driver will have
+  to be linked with <tt/--start-addr $4000/ to reserve the first hires page
+  if they are intended to run on an Apple&nbsp;&rsqb;&lsqb; (in contrast to
+  an Apple&nbsp;//e).
+  
+  Note that the Apple&nbsp;&rsqb;&lsqb; default mouse callbacks support text
+  mode only.
+
+</descrip><p>
 
 
 <sect1>RS232 device drivers<p>
@@ -159,11 +171,16 @@ does not exist).
 <descrip>
 
   <tag><tt/a2.ssc.ser/</tag>
-  Driver for the Apple2 Super Serial Card. Supports up to 19200 baud,
+  Driver for the Apple&nbsp;II Super Serial Card. Supports up to 19200 baud,
   hardware flow control (RTS/CTS) and interrupt driven receives. Note
   that because of the peculiarities of the 6551 chip transmits are not
   interrupt driven, and the transceiver blocks if the receiver asserts
   flow control because of a full buffer.
+  
+  The driver defaults to slot 2. Call ser_ioctl(0, <slot>) prior to ser_open
+  in order to select a different slot. ser_ioctl succeeds for all Apple&nbsp;II
+  slots, but ser_open fails with SER_ERR_NO_DEVICE if there's no SSC firmware
+  found in the selected slot.
 
 </descrip><p>
 
index 5b3301da7a1d7286076af662b7526b055299b38b..8d4bb4e96d60bc74cbd3a6cb1d553538087f6289 100644 (file)
@@ -132,9 +132,9 @@ you cannot do it, it just means that there's no help.
 
   <tag><tt/a2e.lc.emd/</tag>
   Gives access to 12KB RAM (48 pages of 256 bytes each) on the
-  Apple2 language card. The driver was contributed by Stefan Haubenthal.
-  Note that this driver is incompatible with any DOS using the language
-  card memory!
+  Apple&nbsp;II Language Card. The driver was contributed by Stefan Haubenthal.
+  Note that this driver is incompatible with any DOS using the Language
+  Card memory!
 
 </descrip><p>
 
@@ -152,8 +152,17 @@ you cannot do it, it just means that there's no help.
 
 <sect1>Mouse drivers<p>
 
-Currently no drivers available (in fact, the API for loadable mouse drivers
-does not exist).
+<descrip>
+
+  <tag><tt/a2e.stdmou.mou/</tag>
+  Driver for the AppleMouse&nbsp;II Card. Searches all Apple&nbsp;II slots
+  for an AppleMouse&nbsp;II Card compatible firmware. The default bounding
+  box is &lsqb;0..279,0..191&rsqb;.
+  
+  Note that the enhanced&nbsp;Apple&nbsp;//e default mouse callbacks support
+  text mode only.
+
+</descrip><p>
 
 
 <sect1>RS232 device drivers<p>
@@ -161,12 +170,17 @@ does not exist).
 <descrip>
 
   <tag><tt/a2e.ssc.ser/</tag>
-  Driver for the Apple2 Super Serial Card. Supports up to 19200 baud,
+  Driver for the Apple&nbsp;II Super Serial Card. Supports up to 19200 baud,
   hardware flow control (RTS/CTS) and interrupt driven receives. Note
   that because of the peculiarities of the 6551 chip transmits are not
   interrupt driven, and the transceiver blocks if the receiver asserts
   flow control because of a full buffer.
 
+  The driver defaults to slot 2. Call ser_ioctl(0, <slot>) prior to ser_open
+  in order to select a different slot. ser_ioctl succeeds for all Apple&nbsp;II
+  slots, but ser_open fails with SER_ERR_NO_DEVICE if there's no SSC firmware
+  found in the selected slot.
+
 </descrip><p>
 
 
index 1cae5159ba1be7631478ac7cb982dbe542f4e8de..2860b3a5def6b0ccfb553a5b50dad075707f7c00 100644 (file)
@@ -164,6 +164,7 @@ portable. conio implementations exist for the following targets:
 
   <itemize>
   <item>apple2
+  <item>apple2enh
   <item>atari
   <item>c16 (works also for the c116 with up to 32K memory)
   <item>c64
@@ -195,6 +196,8 @@ Some target machines support a mouse. Mouse support is currently available for
 the following targets:
 
   <itemize>
+  <item>apple2
+  <item>apple2enh
   <item>atari
   <item>c64
   <item>c128
index 5537591efc74747c5eb06e8409b7c8dabef74ed9..81bcb04cfb57ecd383113ae2f92e4d8fc27e5267 100644 (file)
@@ -42,13 +42,14 @@ all:
 # Apple ][
 
 apple2lib:
-       for i in apple2 common runtime conio dbg em joystick serial tgi zlib; do \
+       for i in apple2 common runtime conio dbg em joystick mouse serial tgi zlib; do \
                    $(MAKE) SYS=apple2 -C $$i || exit 1; \
            $(AR) a apple2.lib $$i/*.o;\
        done
        mv apple2/crt0.o apple2.o
        cp apple2/apple2-lc.emd a2.lc.emd
        cp apple2/apple2-stdjoy.joy a2.stdjoy.joy
+       cp apple2/apple2-stdmou.mou a2.stdmou.mou
        cp apple2/apple2-ssc.ser a2.ssc.ser
        cp apple2/apple2-40-40-16.tgi a2.lo.tgi
        cp apple2/apple2-280-192-6.tgi a2.hi.tgi
@@ -57,13 +58,14 @@ apple2lib:
 # Apple //e
 
 apple2enhlib:
-       for i in apple2enh common runtime conio dbg em joystick serial tgi zlib; do \
+       for i in apple2enh common runtime conio dbg em joystick mouse serial tgi zlib; do \
            $(MAKE) SYS=apple2enh -C $$i || exit 1; \
            $(AR) a apple2enh.lib $$i/*.o;\
        done
        mv apple2enh/crt0.o apple2enh.o
        cp apple2enh/apple2-lc.emd a2e.lc.emd
        cp apple2enh/apple2-stdjoy.joy a2e.stdjoy.joy
+       cp apple2enh/apple2-stdmou.mou a2e.stdmou.mou
        cp apple2enh/apple2-ssc.ser a2e.ssc.ser
        cp apple2enh/apple2-40-40-16.tgi a2e.lo.tgi
        cp apple2enh/apple2-280-192-6.tgi a2e.hi.tgi
index 254bf4a68a7a9ced66e5b9d98d2857ce6bb05d6d..3cb6ab2ff26c6c568723aa712d385063ee3fa222 100644 (file)
@@ -1,5 +1,6 @@
 *.emd
 *.joy
+*.mou
 *.ser
 *.tgi
 closedir.s
index b8b55119d0f97506f52e38a39553f3ec4a64af65..953bf510dfb015645ded34539be8391c43a75bc8 100644 (file)
@@ -32,6 +32,9 @@ CFLAGS        = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include
 %.joy: %.o ../runtime/zeropage.o
        @$(LD) -t module -o $@ $^
 
+%.mou: %.o ../runtime/zeropage.o
+       @$(LD) -t module -o $@ $^
+
 %.ser: %.o ../runtime/zeropage.o
        @$(LD) -t module -o $@ $^
 
@@ -76,6 +79,7 @@ S_OBJS=       _scrsize.o      \
         joy_stddrv.o    \
        kbhit.o         \
         mainargs.o      \
+       mcbdefault.o    \
        mli.o           \
        open.o          \
         oserrlist.o     \
@@ -109,6 +113,8 @@ EMDS = apple2-lc.emd
 
 JOYS = apple2-stdjoy.joy
 
+MOUS = apple2-stdmou.mou
+
 SERS = apple2-ssc.ser
 
 TGIS = apple2-40-40-16.tgi apple2-280-192-6.tgi
@@ -118,14 +124,13 @@ TGIS = apple2-40-40-16.tgi apple2-280-192-6.tgi
 
 .PHONY:        all clean zap
 
-all:   $(C_OBJS) $(S_OBJS) $(EMDS) $(JOYS) $(SERS) $(TGIS)
+all:   $(C_OBJS) $(S_OBJS) $(EMDS) $(JOYS) $(MOUS) $(SERS) $(TGIS)
 
 ../runtime/zeropage.o:
        $(MAKE) -C $(dir $@) $(notdir $@)
 
 clean:
-       @$(RM) $(C_OBJS:.o=.s) $(C_OBJS) $(S_OBJS) $(EMDS:.emd=.o) $(JOYS:.joy=.o) $(SERS:.ser=.o) $(TGIS:.tgi=.o)
-
-zap:   clean
-       @$(RM) $(EMDS) $(JOYS) $(SERS) $(TGIS)
+       @$(RM) $(C_OBJS:.o=.s) $(C_OBJS) $(S_OBJS) $(EMDS:.emd=.o) $(JOYS:.joy=.o) $(MOUS:.mou=.o) $(SERS:.ser=.o) $(TGIS:.tgi=.o)
 
+zap:           clean
+       @$(RM) $(EMDS) $(JOYS) $(MOUS) $(SERS) $(TGIS)
diff --git a/libsrc/apple2/apple2-stdmou.s b/libsrc/apple2/apple2-stdmou.s
new file mode 100644 (file)
index 0000000..f8a04c9
--- /dev/null
@@ -0,0 +1,411 @@
+;
+; Driver for the AppleMouse II Card.
+;
+; Oliver Schmidt, 03.09.2005
+;
+
+       .include        "zeropage.inc"
+       .include        "mouse-kernel.inc"
+
+; ------------------------------------------------------------------------
+
+SETMOUSE       = $12   ; Sets mouse mode
+SERVEMOUSE     = $13   ; Services mouse interrupt
+READMOUSE      = $14   ; Reads mouse position
+CLEARMOUSE     = $15   ; Clears mouse position to 0 (for delta mode)
+POSMOUSE       = $16   ; Sets mouse position to a user-defined pos
+CLAMPMOUSE     = $17   ; Sets mouse bounds in a window
+HOMEMOUSE      = $18   ; Sets mouse to upper-left corner of clamp win
+INITMOUSE      = $19   ; Resets mouse clamps to default values and
+                       ; sets mouse position to 0,0
+
+pos1_lo        := $0478
+pos1_hi        := $0578
+pos2_lo        := $04F8
+pos2_hi        := $05F8
+status         := $0778
+
+; ------------------------------------------------------------------------
+
+       .segment        "JUMPTABLE"
+
+       ; Driver signature
+       .byte   $6D, $6F, $75           ; "mou"
+       .byte   MOUSE_API_VERSION       ; Mouse driver API version number
+
+       ; Jump table.
+       .addr   INSTALL
+       .addr   UNINSTALL
+       .addr   HIDE
+       .addr   SHOW
+       .addr   BOX
+       .addr   MOVE
+       .addr   BUTTONS
+       .addr   POS
+       .addr   INFO
+       .addr   IOCTL
+       .addr   IRQ
+
+       ; Callback table, set by the kernel before INSTALL is called
+CHIDE: jmp     $0000                   ; Hide the cursor
+CSHOW: jmp     $0000                   ; Show the cursor
+CMOVEX: jmp    $0000                   ; Move the cursor to X coord
+CMOVEY: jmp    $0000                   ; Move the cursor to Y coord
+
+; ------------------------------------------------------------------------
+
+       .bss
+       
+slot:  .res    1
+visible:.res   1
+               
+; ------------------------------------------------------------------------
+
+       .rodata
+
+offsets:.byte  $05             ; Pascal 1.0 ID byte
+       .byte   $07             ; Pascal 1.0 ID byte
+       .byte   $0B             ; Pascal 1.1 generic signature byte
+       .byte   $0C             ; Device signature byte
+
+values: .byte  $38             ; Fixed
+       .byte   $18             ; Fixed
+       .byte   $01             ; Fixed
+       .byte   $20             ; X-Y pointing device type 0
+
+size   = * - values
+
+; ------------------------------------------------------------------------
+
+       .data
+       
+info:  .word   279 / 2         ; MOUSE_INFO::MOUSE_POS::XCOORD
+       .word   191 / 2         ; MOUSE_INFO::MOUSE_POS::YCOORD
+       .byte   %00000000       ; MOUSE_INFO::BUTTONS
+
+firmware:
+       ; Lookup and patch firmware address lobyte
+lookup: ldy    $FF00,x         ; Patched at runtime
+       sty     jump+1          ; Modify code below
+
+       ; Apple II Mouse TechNote #1, Interrupt Environment with the Mouse:
+       ; "Enter all mouse routines (...) with the X register set to $Cn
+       ;  and Y register set to $n0, where n = the slot number."
+xparam: ldx    #$FF            ; Patched at runtime
+yparam: ldy    #$FF            ; Patched at runtime
+
+jump:  jmp     $FFFF           ; Patched at runtime
+       
+; ------------------------------------------------------------------------
+
+       .code
+
+; INSTALL: Is called after the driver is loaded into memory. If possible,
+; check if the hardware is present. Must return an MOUSE_ERR_xx code in A/X.
+INSTALL:
+       lda     #<$C000
+       sta     ptr1
+       lda     #>$C000
+       sta     ptr1+1
+
+       ; Search for AppleMouse II firmware in slots 1 - 7
+next:  inc     ptr1+1
+       lda     ptr1+1
+       cmp     #>$C800
+       bcc     :+
+
+       ; Mouse firmware not found
+       lda     #<MOUSE_ERR_NO_DEVICE
+       ldx     #>MOUSE_ERR_NO_DEVICE
+       rts
+
+       ; Check Pascal 1.1 Firmware Protocol ID bytes
+:      ldx     #size - 1
+:      ldy     offsets,x
+       lda     values,x
+       cmp     (ptr1),y
+       bne     next
+       dex
+       bpl     :-
+       
+       ; Get and patch firmware address hibyte
+       lda     ptr1+1
+       sta     lookup+2
+       sta     xparam+1
+       sta     jump+2
+       
+       ; Convert to and save slot number
+       and     #$0F
+       sta     slot
+
+       ; Convert to and patch I/O register index
+       asl
+       asl
+       asl
+       asl
+       sta     yparam+1
+
+       ; Apple II Mouse TechNote #1, Interrupt Environment with the Mouse:
+       ; "Disable interrupts when calling any mouse routine."
+       sei
+
+       ; Reset mouse hardware
+       ldx     #INITMOUSE
+       jsr     firmware
+
+       ; Turn mouse on
+       lda     #%00000001
+       ldx     #SETMOUSE
+       jsr     firmware
+
+       ; Set initial mouse clamps      
+       lda     #<279
+       ldx     #>279
+       sta     pos2_lo
+       stx     pos2_hi
+       lda     #$00            ; Set x clamps
+       sta     pos1_lo
+       sta     pos1_hi
+       ldx     #CLAMPMOUSE
+       jsr     firmware
+       lda     #<191
+       ldx     #>191
+       sta     pos2_lo
+       stx     pos2_hi
+       lda     #$01            ; Set y clamps
+       ldx     #CLAMPMOUSE
+       jsr     firmware
+
+       ; Set initial mouse position
+       ldx     slot
+       lda     #<(279 / 2)
+       sta     pos1_lo,x
+       lda     #>(279 / 2)
+       sta     pos1_hi,x
+       lda     #<(191 / 2)
+       sta     pos2_lo,x
+       lda     #>(191 / 2)
+       sta     pos2_hi,x
+       ldx     #POSMOUSE
+       jsr     firmware
+
+       ; Turn VBL interrupt on
+       lda     #%00001001
+       ldx     #SETMOUSE
+common:        jsr     firmware
+
+       ; Enable interrupts and return success
+       cli
+       lda     #<MOUSE_ERR_OK
+       ldx     #>MOUSE_ERR_OK
+       rts
+
+; UNINSTALL: Is called before the driver is removed from memory.
+; No return code required (the driver is removed from memory on return).
+UNINSTALL:
+       ; Hide cursor
+       sei
+       jsr     CHIDE
+       
+       ; Turn mouse off
+       lda     #%00000000
+       ldx     #SETMOUSE
+       bne     common          ; Branch always
+
+; HIDE: Is called to hide the mouse cursor. The mouse kernel manages a
+; counter for calls to show/hide, and the driver entry point is only called
+; if the mouse is currently visible and should get hidden. For most drivers,
+; no special action is required        besides hiding the mouse cursor.
+; No return code required.
+HIDE:
+       dec     visible
+       sei
+       jsr     CHIDE
+       cli
+       rts
+
+; SHOW:        Is called to show the mouse cursor. The mouse kernel manages a
+; counter for calls to show/hide, and the driver entry point is        only called
+; if the mouse is currently hidden and should become visible. For most drivers,
+; no special action is required        besides enabling the mouse cursor.
+; No return code required.
+SHOW:
+       inc     visible
+       rts
+
+; BOX: Set the mouse bounding box. The parameters are passed as        they come from
+; the C        program, that is, maxy in A/X and the other parameters on the stack.
+; The C        wrapper will remove the parameters from the stack when the driver
+; routine returns.
+; No checks are done if the mouse is currently inside the box, this is the job
+; of the caller. It is not necessary to validate the parameters, trust the
+; caller and save some code here. No return code required.
+BOX:
+       ; Apple II Mouse TechNote #1, Interrupt Environment with the Mouse:
+       ; "Disable interrupts before placing position information in the screen holes."
+       sei
+
+       ; Set high clamp
+       sta     pos2_lo
+       txa
+
+       ldx     #$01            ; Set y clamps
+       ldy     #$00            ; Start at top of stack
+       jsr     :+
+       
+       ldx     #$00            ; Set x clamps
+       ldy     #$00            ; Start at top of stack
+
+       ; Set high clamp
+       lda     (sp),y
+       iny
+       sei
+       sta     pos2_lo
+       lda     (sp),y
+       iny
+:      sta     pos2_hi
+
+       ; Skip one parameter
+       iny
+       iny
+
+       ; Set low clamp
+       lda     (sp),y
+       iny
+       sta     pos1_lo
+       lda     (sp),y
+       sta     pos1_hi
+
+       txa
+       ldx     #CLAMPMOUSE
+       bne     common          ; Branch always
+
+; MOVE: Move the mouse to a new position. The position is passed as it comes
+; from the C program, that is: x on the stack and y in A/X. The C wrapper will
+; remove the parameter from the stack on return.
+; No checks are done if the new position is valid (within the bounding box or
+; the screen). No return code required.
+MOVE:
+       ldy     slot
+       sei
+
+       ; Set y
+       sta     pos2_lo,y
+       txa
+       sta     pos2_hi,y
+
+       tya
+       tax
+       ldy     #$00            ; Start at top of stack
+
+       ; Set x
+       lda     (sp),y
+       iny
+       sta     pos1_lo,x
+       lda     (sp),y
+       sta     pos1_hi,x
+
+       ; Update cursor
+       jsr     update
+       
+       ldx     #POSMOUSE
+       bne     common          ; Branch always
+
+; BUTTONS: Return the button mask in A/X.
+BUTTONS:
+       lda     info + MOUSE_INFO::BUTTONS
+       ldx     #$00
+       rts
+
+; POS: Return the mouse position in the MOUSE_POS struct pointed to by ptr1.
+; No return code required.
+POS:
+       ldx     #.sizeof(MOUSE_POS)-1
+       bne     copy            ; Branch always
+
+; INFO: Returns mouse position and current button mask in the MOUSE_INFO
+; struct pointed to by ptr1. No return code required.
+INFO:
+       ldx     #.sizeof(MOUSE_INFO)-1
+copy:  txa
+       tay
+       sei
+:      lda     info,x
+       sta     (ptr1),y
+       dex
+       dey
+       bpl     :-
+       cli
+       rts
+
+; IOCTL: Driver defined entry point. The wrapper will pass a pointer to ioctl
+; specific data in ptr1, and the ioctl code in A.
+; Must return an MOUSE_ERR_xx code in A/X.
+IOCTL:
+       lda     #<MOUSE_ERR_INV_IOCTL
+       ldx     #>MOUSE_ERR_INV_IOCTL
+       rts
+       
+; IRQ: Called from the builtin runtime IRQ handler as a subroutine. All
+; registers are already saved, no parameters are passed, but the carry flag
+; is clear on entry. The routine must return with carry set if the interrupt
+; was handled, otherwise with carry clear.
+IRQ:
+       ; Check for mouse interrupt
+       ldx     #SERVEMOUSE
+       jsr     firmware
+       bcc     :+
+       clc                     ; Interrupt not handled
+       rts
+
+:      ldx     #READMOUSE
+       jsr     firmware
+
+       ; Get status
+       ldy     slot
+       lda     status,y
+       tax                     ; Save status
+       
+       ; Extract button down values
+       asl                     ;  C = Button 0 is currently down
+       and     #%00100000      ; !Z = Button 1 is currently down
+
+       ; Set button mask
+       beq     :+
+       lda     #MOUSE_BTN_RIGHT
+:      bcc     :+
+       ora     #MOUSE_BTN_LEFT
+:      sta     info + MOUSE_INFO::BUTTONS
+       
+       ; Check for mouse movement
+       txa                     ; Restore status
+       and     #%00100000      ; X or Y changed since last READMOUSE
+       beq     :+
+
+       ; Remove the cursor at the old position
+update:        jsr     CHIDE
+       
+       ; Get and set the new X position
+       ldy     slot
+       lda     pos1_lo,y
+       ldx     pos1_hi,y
+       sta     info + MOUSE_POS::XCOORD
+       stx     info + MOUSE_POS::XCOORD+1
+       jsr     CMOVEX
+       
+       ; Get and set the new Y position
+       ldy     slot
+       lda     pos2_lo,y
+       ldx     pos2_hi,y
+       sta     info + MOUSE_POS::YCOORD
+       stx     info + MOUSE_POS::YCOORD+1
+       jsr     CMOVEY
+
+       ; Check for visibility
+:      lda     visible
+       beq     :+
+
+       ; Draw the cursor at the new position
+       jsr     CSHOW
+:      sec                     ; Interrupt handled
+       rts
index 1b9373e5fe17cf22c5416e2717d8cd35c36bdb48..f3adc2f5478a7fc31f46375fdf1ec9e03e878675 100644 (file)
@@ -6,7 +6,7 @@
 ;
 
         .ifdef  __APPLE2ENH__
-        .constructor    initconio
+        .constructor    initconio, 17
         .endif
         .export         _cputcxy, _cputc
         .export         cputdirect, newline, putchar
index 4fb6fcad642d4d9883fd9b96f4f0fc54544bbf51..0873bbcd8f638c0147ef671860960b6bcd72c046 100644 (file)
@@ -20,7 +20,7 @@
 ; ProDOS 8 2.0.3 - $23
 ;
 
-        .constructor    initdostype, 25
+        .constructor    initdostype, 19
         .export         __dos_type
 
         .include        "mli.inc"
index bf4511c00ea11f02cde19edb793cd5f7a7b44477..a4736da9d3adf592248f1f96ee3eddebe023b31c 100644 (file)
@@ -22,7 +22,7 @@
 ; TO-DO:
 ; Add a control-character quoting mechanism.
 
-        .constructor   initmainargs, 24
+        .constructor   initmainargs, 18
         .import                __argc, __argv, __dos_type
 
         .include       "zeropage.inc"
diff --git a/libsrc/apple2/mcbdefault.s b/libsrc/apple2/mcbdefault.s
new file mode 100644 (file)
index 0000000..f270f9d
--- /dev/null
@@ -0,0 +1,136 @@
+;
+; Default mouse        callbacks for the Apple II
+;
+; Oliver Schmidt, 22.09.2005
+;
+; All functions        in this module should be interrupt safe, because they may
+; be called from an interrupt handler
+;
+
+       .ifdef  __APPLE2ENH__
+       .constructor    initmcb
+       .endif
+       .export         _mouse_def_callbacks
+       
+       .include        "apple2.inc"
+
+; ------------------------------------------------------------------------
+
+       .bss
+       
+backup:        .res    1
+
+; ------------------------------------------------------------------------
+
+       .rodata
+
+       ; Callback structure
+_mouse_def_callbacks:
+       .addr   hide
+       .addr   show
+       .addr   movex
+       .addr   movey
+
+; ------------------------------------------------------------------------
+
+       .segment        "INIT"
+
+       .ifdef  __APPLE2ENH__
+initmcb:
+       lda     ALTCHARSET      ; Alternate charset switched in?
+       bpl     :+              ; No, normal charset
+       lda     #'B'            ; MouseText character
+       sta     cmpcur+1
+       sta     getcur+1
+:      rts
+       .endif
+
+; ------------------------------------------------------------------------
+
+       .data
+
+getcursor:
+        .ifdef  __APPLE2ENH__
+        bit     RD80VID         ; In 80 column mode?
+        bpl     column         ; No, skip bank switching
+switch:        bit     LOWSCR          ; Patched at runtime
+        .endif
+column:        ldx     #$00            ; Patched at runtime
+getscr:        lda     $0400,x         ; Patched at runtime
+cmpcur:        cmp     #'+' | $40      ; Possibly patched by initialization
+       rts
+
+setcursor:
+getcur:        lda     #'+' | $40      ; Possibly patched by initialization
+setscr:        sta     $0400,x         ; Patched at runtime
+       .ifdef  __APPLE2ENH__
+        bit    LOWSCR          ; Doesn't hurt in 40 column mode
+        .endif
+       rts
+
+; ------------------------------------------------------------------------
+
+       .code
+
+done:
+       .ifdef  __APPLE2ENH__
+        bit    LOWSCR          ; Doesn't hurt in 40 column mode
+        .endif
+       rts
+
+; Hide the mouse cursor.
+hide:
+       jsr     getcursor       ; Cursor visible at current position?
+       bne     done            ; No, we're done
+       lda     backup          ; Get character at cursor position
+       jmp     setscr          ; Draw character
+
+; Show the mouse cursor.
+show:
+       jsr     getcursor       ; Cursor visible at current position?
+       beq     done            ; Yes, we're done
+       sta     backup          ; Save character at cursor position
+       jmp     setcursor       ; Draw cursor
+
+; Move the mouse cursor x position to the value in A/X.
+movex:
+       dex                     ; Is position [256..279]?
+       bmi     :+              ; No, start with column 0
+       clc
+       adc     #$0100 .MOD 7   ; Bias position
+       ldx     #$0100 / 7 - 1  ; Bias column
+:      sec
+:      sbc     #7              ; 280 positions / 40 columns
+       inx
+       bcs     :-
+       stx     column+1
+        .ifdef  __APPLE2ENH__
+       adc     #7 / 2          ; Left or right half of 40-col column?
+       ldx     #<LOWSCR        ; Columns 1,3,5..79
+       bcs     :+
+       .assert LOWSCR + 1 = HISCR, error
+       inx                     ; Columns 0,2,4..78
+:      stx     switch+1
+        .endif
+       rts
+
+; Move the mouse cursor y position to the value in A/X.
+movey:
+       tax                     ; ABCDExxx
+       lsr                     ; 0ABCDExx
+       lsr                     ; 00ABCDEx
+       lsr                     ; 000ABCDE
+       sta     getscr+1
+       lsr                     ; 0000ABCD
+       and     #%00000011      ; 000000CD
+       ora     #>$0400         ; 000001CD
+       sta     getscr+2
+       sta     setscr+2
+       txa                     ; ABCDExxx
+       ror                     ; EABCDExx
+       and     #%11100000      ; EAB00000
+       ora     getscr+1        ; EABABCDE
+       and     #%11111000      ; EABAB000
+       sta     getscr+1
+       sta     setscr+1
+       rts
index 581e5ff62fe59d17a074f16cc087bcb0db5d2299..3eecd7b493d4c6b8fdcd33b623cbfae4982df8f1 100644 (file)
@@ -1,4 +1,5 @@
 *.emd
 *.joy
+*.mou
 *.ser
 *.tgi
index 37384459d551dc00bb2a46b31722f4317898f549..a2a15278c7d0b873a13f7f5d00b6babc981563e2 100644 (file)
@@ -32,6 +32,9 @@ CFLAGS        = -Osir -g -T -t $(SYS) --forget-inc-paths -I ../apple2 -I ../../include
 %.joy: %.o ../runtime/zeropage.o
        @$(LD) -t module -o $@ $^
 
+%.mou: %.o ../runtime/zeropage.o
+       @$(LD) -t module -o $@ $^
+
 %.ser: %.o ../runtime/zeropage.o
        @$(LD) -t module -o $@ $^
 
@@ -76,6 +79,7 @@ S_OBJS=       _scrsize.o      \
         joy_stddrv.o    \
        kbhit.o         \
         mainargs.o      \
+       mcbdefault.o    \
        mli.o           \
        open.o          \
         oserrlist.o     \
@@ -110,6 +114,8 @@ EMDS = apple2-lc.emd
 
 JOYS = apple2-stdjoy.joy
 
+MOUS = apple2-stdmou.mou
+
 SERS = apple2-ssc.ser
 
 TGIS = apple2-40-40-16.tgi apple2-280-192-6.tgi
@@ -119,15 +125,13 @@ TGIS = apple2-40-40-16.tgi apple2-280-192-6.tgi
 
 .PHONY:        all clean zap
 
-all:   $(C_OBJS) $(S_OBJS) $(EMDS) $(JOYS) $(SERS) $(TGIS)
+all:   $(C_OBJS) $(S_OBJS) $(EMDS) $(JOYS) $(MOUS) $(SERS) $(TGIS)
 
 ../runtime/zeropage.o:
        $(MAKE) -C $(dir $@) $(notdir $@)
 
 clean:
-       @$(RM) $(C_OBJS:.o=.s) $(C_OBJS) $(S_OBJS) $(EMDS:.emd=.o) $(JOYS:.joy=.o) $(SERS:.ser=.o) $(TGIS:.tgi=.o)
+       @$(RM) $(C_OBJS:.o=.s) $(C_OBJS) $(S_OBJS) $(EMDS:.emd=.o) $(JOYS:.joy=.o) $(MOUS:.mou=.o) $(SERS:.ser=.o) $(TGIS:.tgi=.o)
 
 zap:           clean
-       @$(RM) $(EMDS) $(JOYS) $(SERS) $(TGIS)
-
-
+       @$(RM) $(EMDS) $(JOYS) $(MOUS) $(SERS) $(TGIS)
index fc8d9490ebfabc2fc9fc892b92874c971d4cbaa9..d568984a89be4d3250428e1e10dc4052e2211151 100644 (file)
@@ -92,20 +92,25 @@ _mouse_install:
         ldy     tmp1
         bpl     @L2
 
+; Install the IRQ vector if the driver needs it
+
+        lda     mouse_irq+2             ; Check high byte of IRQ vector
+        beq     @L3                     ; Jump if vector invalid
+       lda     #$4C                    ; Jump opcode
+               sta     mouse_irq               ; Activate IRQ routine
+
 ; Call driver install routine and check for errors
 
-        jsr     mouse_install
+@L3:    jsr     mouse_install
         tay                             ; Test error code
-        bne     @L3                     ; Bail out if install had errors
+        beq     @L4                    ; Jump if no error
 
-; Install the IRQ vector if the driver needs it. A/X contains the error code
-; from mouse_install, so don't use it.
+; Uninstall IRQ vector if install routine had errors. A/X contains the error
+; code from mouse_install, so don't use it.
 
-        ldy     mouse_irq+2             ; Check high byte of IRQ vector
-        beq     @L3                     ; Jump if vector invalid
-       ldy     #$4C                    ; Jump opcode
-               sty     mouse_irq               ; Activate IRQ routine
-@L3:    rts
+       ldy     #$60                    ; RTS opcode
+       sty     mouse_irq               ; Disable IRQ entry point
+@L4:    rts
 
 ; Driver signature invalid. One word is still on the stack
 
index eaf28b7033d03e95f1bd3235c5dd61f05bfb4e07..2d03aaeeada20c6fa37526fb4d9ff9328d498797 100644 (file)
@@ -71,7 +71,7 @@ all:          $(EXELIST)
 ascii:                 $(CRT0) ascii.o $(CLIB)
        @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
 
-diodemo:               $(CRT0) diodemo.o $(CLIB)
+diodemo:        $(CRT0) diodemo.o $(CLIB)
        @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
 
 fire:                  $(CRT0) fire.o $(CLIB)
@@ -85,20 +85,26 @@ hello:              $(CRT0) hello.o $(CLIB)
 
 # The apple machines need the start address adjusted for the mandelbrot demo
 ifeq "$(SYS)" "apple2"
-mandelbrot:            $(CRT0) mandelbrot.o $(CLIB)
+mandelbrot:     $(CRT0) mandelbrot.o $(CLIB)
        @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^
 else
 ifeq "$(SYS)" "apple2enh"
-mandelbrot:            $(CRT0) mandelbrot.o $(CLIB)
+mandelbrot:     $(CRT0) mandelbrot.o $(CLIB)
        @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^
 else
-mandelbrot:            $(CRT0) mandelbrot.o $(CLIB)
+mandelbrot:     $(CRT0) mandelbrot.o $(CLIB)
        @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
 endif
 endif
 
+# The Apple ][ needs the start address adjusted for the mousedemo
+ifeq "$(SYS)" "apple2"
+mousedemo:             $(CRT0) mousedemo.o $(CLIB)
+       @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^
+else
 mousedemo:             $(CRT0) mousedemo.o $(CLIB)
        @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
+endif
 
 nachtm:                $(CRT0) nachtm.o $(CLIB)
        @$(LD) -t $(SYS) -m $(basename $@).map -Ln $(basename $@).lbl -o $@ $^
index 4200399668391ee725c6221ce0dd9956c056c9f3..dfe682c5b9fcac6cf82d5ea49b154c4244b3d319 100644 (file)
@@ -66,7 +66,7 @@ Platforms:    All systems with TGI support. You may have to change the
 Name:           mousedemo
 Description:   Shows how to use the mouse.
 Platforms:             All systems with mouse and conio support:
-               C64, C128
+               C64, C128, CBM510, Atari, Apple2
 
 -----------------------------------------------------------------------------
 Name:           nachtm
index 276bc29049789aeca2b13bffde3089eda41a05bb..e3170dab30cc207402487b8c4627954631403d93 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Demo program for mouse usage. Will work for the C64/C128/CBM510/Atari
+ * Demo program for mouse usage. Will work for the C64/C128/CBM510/Atari/Apple2
  *
  * Ullrich von Bassewitz, 13.09.2001
  *
@@ -12,6 +12,7 @@
 #include <string.h>
 #include <mouse.h>
 #include <conio.h>
+#include <ctype.h>
 #include <dbg.h>
 
 
@@ -61,6 +62,14 @@ static const unsigned char MouseSprite[64] = {
 
 #endif  /* __C64__ or __C128__ */
 
+#ifdef __APPLE2__
+#  define DRIVER  "a2.stdmou.mou"
+#endif
+
+#ifdef __APPLE2ENH__
+#  define DRIVER  "a2e.stdmou.mou"
+#endif
+
 
 
 static void CheckError (const char* S, unsigned char Error)
@@ -81,7 +90,7 @@ static void DoWarning (void)
             "    %s\n"
             "on disk! Press 'y' if you have it or\n"
             "any other key to exit.\n", DRIVER);
-    if (cgetc () != 'y') {
+    if (tolower (cgetc ()) != 'y') {
         exit (EXIT_SUCCESS);
     }
     printf ("Ok. Please wait patiently...\n");
@@ -113,9 +122,9 @@ int main (void)
     DoWarning ();
 
     /* Clear the screen, set white on black */
-    bordercolor (COLOR_BLACK);
-    bgcolor (COLOR_BLACK);
-    textcolor (COLOR_GRAY3);
+    (void) bordercolor (COLOR_BLACK);
+    (void) bgcolor (COLOR_BLACK);
+    (void) textcolor (COLOR_GRAY3);
     cursor (0);
     clrscr ();