Apple 2 mouse driver and other stuff from Oliver Schmidt
git-svn-id: svn://svn.cc65.org/cc65/trunk@3717 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
@@ -130,9 +130,9 @@ you cannot do it, it just means that there's no help.
|
|||||||
|
|
||||||
<tag><tt/a2.lc.emd/</tag>
|
<tag><tt/a2.lc.emd/</tag>
|
||||||
Gives access to 12KB RAM (48 pages of 256 bytes each) on the
|
Gives access to 12KB RAM (48 pages of 256 bytes each) on the
|
||||||
Apple2 language card. The driver was contributed by Stefan Haubenthal.
|
Apple II Language Card. The driver was contributed by Stefan Haubenthal.
|
||||||
Note that this driver is incompatible with any DOS using the language
|
Note that this driver is incompatible with any DOS using the Language
|
||||||
card memory!
|
Card memory!
|
||||||
|
|
||||||
</descrip><p>
|
</descrip><p>
|
||||||
|
|
||||||
@@ -150,8 +150,20 @@ you cannot do it, it just means that there's no help.
|
|||||||
|
|
||||||
<sect1>Mouse drivers<p>
|
<sect1>Mouse drivers<p>
|
||||||
|
|
||||||
Currently no drivers available (in fact, the API for loadable mouse drivers
|
<descrip>
|
||||||
does not exist).
|
|
||||||
|
<tag><tt/a2.stdmou.mou/</tag>
|
||||||
|
Driver for the AppleMouse II Card. Searches all Apple II slots
|
||||||
|
for an AppleMouse II Card compatible firmware. The default bounding
|
||||||
|
box is [0..279,0..191]. 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 ][ (in contrast to
|
||||||
|
an Apple //e).
|
||||||
|
|
||||||
|
Note that the Apple ][ default mouse callbacks support text
|
||||||
|
mode only.
|
||||||
|
|
||||||
|
</descrip><p>
|
||||||
|
|
||||||
|
|
||||||
<sect1>RS232 device drivers<p>
|
<sect1>RS232 device drivers<p>
|
||||||
@@ -159,12 +171,17 @@ does not exist).
|
|||||||
<descrip>
|
<descrip>
|
||||||
|
|
||||||
<tag><tt/a2.ssc.ser/</tag>
|
<tag><tt/a2.ssc.ser/</tag>
|
||||||
Driver for the Apple2 Super Serial Card. Supports up to 19200 baud,
|
Driver for the Apple II Super Serial Card. Supports up to 19200 baud,
|
||||||
hardware flow control (RTS/CTS) and interrupt driven receives. Note
|
hardware flow control (RTS/CTS) and interrupt driven receives. Note
|
||||||
that because of the peculiarities of the 6551 chip transmits are not
|
that because of the peculiarities of the 6551 chip transmits are not
|
||||||
interrupt driven, and the transceiver blocks if the receiver asserts
|
interrupt driven, and the transceiver blocks if the receiver asserts
|
||||||
flow control because of a full buffer.
|
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 II
|
||||||
|
slots, but ser_open fails with SER_ERR_NO_DEVICE if there's no SSC firmware
|
||||||
|
found in the selected slot.
|
||||||
|
|
||||||
</descrip><p>
|
</descrip><p>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -132,9 +132,9 @@ you cannot do it, it just means that there's no help.
|
|||||||
|
|
||||||
<tag><tt/a2e.lc.emd/</tag>
|
<tag><tt/a2e.lc.emd/</tag>
|
||||||
Gives access to 12KB RAM (48 pages of 256 bytes each) on the
|
Gives access to 12KB RAM (48 pages of 256 bytes each) on the
|
||||||
Apple2 language card. The driver was contributed by Stefan Haubenthal.
|
Apple II Language Card. The driver was contributed by Stefan Haubenthal.
|
||||||
Note that this driver is incompatible with any DOS using the language
|
Note that this driver is incompatible with any DOS using the Language
|
||||||
card memory!
|
Card memory!
|
||||||
|
|
||||||
</descrip><p>
|
</descrip><p>
|
||||||
|
|
||||||
@@ -152,8 +152,17 @@ you cannot do it, it just means that there's no help.
|
|||||||
|
|
||||||
<sect1>Mouse drivers<p>
|
<sect1>Mouse drivers<p>
|
||||||
|
|
||||||
Currently no drivers available (in fact, the API for loadable mouse drivers
|
<descrip>
|
||||||
does not exist).
|
|
||||||
|
<tag><tt/a2e.stdmou.mou/</tag>
|
||||||
|
Driver for the AppleMouse II Card. Searches all Apple II slots
|
||||||
|
for an AppleMouse II Card compatible firmware. The default bounding
|
||||||
|
box is [0..279,0..191].
|
||||||
|
|
||||||
|
Note that the enhanced Apple //e default mouse callbacks support
|
||||||
|
text mode only.
|
||||||
|
|
||||||
|
</descrip><p>
|
||||||
|
|
||||||
|
|
||||||
<sect1>RS232 device drivers<p>
|
<sect1>RS232 device drivers<p>
|
||||||
@@ -161,12 +170,17 @@ does not exist).
|
|||||||
<descrip>
|
<descrip>
|
||||||
|
|
||||||
<tag><tt/a2e.ssc.ser/</tag>
|
<tag><tt/a2e.ssc.ser/</tag>
|
||||||
Driver for the Apple2 Super Serial Card. Supports up to 19200 baud,
|
Driver for the Apple II Super Serial Card. Supports up to 19200 baud,
|
||||||
hardware flow control (RTS/CTS) and interrupt driven receives. Note
|
hardware flow control (RTS/CTS) and interrupt driven receives. Note
|
||||||
that because of the peculiarities of the 6551 chip transmits are not
|
that because of the peculiarities of the 6551 chip transmits are not
|
||||||
interrupt driven, and the transceiver blocks if the receiver asserts
|
interrupt driven, and the transceiver blocks if the receiver asserts
|
||||||
flow control because of a full buffer.
|
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 II
|
||||||
|
slots, but ser_open fails with SER_ERR_NO_DEVICE if there's no SSC firmware
|
||||||
|
found in the selected slot.
|
||||||
|
|
||||||
</descrip><p>
|
</descrip><p>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ portable. conio implementations exist for the following targets:
|
|||||||
|
|
||||||
<itemize>
|
<itemize>
|
||||||
<item>apple2
|
<item>apple2
|
||||||
|
<item>apple2enh
|
||||||
<item>atari
|
<item>atari
|
||||||
<item>c16 (works also for the c116 with up to 32K memory)
|
<item>c16 (works also for the c116 with up to 32K memory)
|
||||||
<item>c64
|
<item>c64
|
||||||
@@ -195,6 +196,8 @@ Some target machines support a mouse. Mouse support is currently available for
|
|||||||
the following targets:
|
the following targets:
|
||||||
|
|
||||||
<itemize>
|
<itemize>
|
||||||
|
<item>apple2
|
||||||
|
<item>apple2enh
|
||||||
<item>atari
|
<item>atari
|
||||||
<item>c64
|
<item>c64
|
||||||
<item>c128
|
<item>c128
|
||||||
|
|||||||
@@ -42,13 +42,14 @@ all:
|
|||||||
# Apple ][
|
# Apple ][
|
||||||
|
|
||||||
apple2lib:
|
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; \
|
$(MAKE) SYS=apple2 -C $$i || exit 1; \
|
||||||
$(AR) a apple2.lib $$i/*.o;\
|
$(AR) a apple2.lib $$i/*.o;\
|
||||||
done
|
done
|
||||||
mv apple2/crt0.o apple2.o
|
mv apple2/crt0.o apple2.o
|
||||||
cp apple2/apple2-lc.emd a2.lc.emd
|
cp apple2/apple2-lc.emd a2.lc.emd
|
||||||
cp apple2/apple2-stdjoy.joy a2.stdjoy.joy
|
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-ssc.ser a2.ssc.ser
|
||||||
cp apple2/apple2-40-40-16.tgi a2.lo.tgi
|
cp apple2/apple2-40-40-16.tgi a2.lo.tgi
|
||||||
cp apple2/apple2-280-192-6.tgi a2.hi.tgi
|
cp apple2/apple2-280-192-6.tgi a2.hi.tgi
|
||||||
@@ -57,13 +58,14 @@ apple2lib:
|
|||||||
# Apple //e
|
# Apple //e
|
||||||
|
|
||||||
apple2enhlib:
|
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; \
|
$(MAKE) SYS=apple2enh -C $$i || exit 1; \
|
||||||
$(AR) a apple2enh.lib $$i/*.o;\
|
$(AR) a apple2enh.lib $$i/*.o;\
|
||||||
done
|
done
|
||||||
mv apple2enh/crt0.o apple2enh.o
|
mv apple2enh/crt0.o apple2enh.o
|
||||||
cp apple2enh/apple2-lc.emd a2e.lc.emd
|
cp apple2enh/apple2-lc.emd a2e.lc.emd
|
||||||
cp apple2enh/apple2-stdjoy.joy a2e.stdjoy.joy
|
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-ssc.ser a2e.ssc.ser
|
||||||
cp apple2enh/apple2-40-40-16.tgi a2e.lo.tgi
|
cp apple2enh/apple2-40-40-16.tgi a2e.lo.tgi
|
||||||
cp apple2enh/apple2-280-192-6.tgi a2e.hi.tgi
|
cp apple2enh/apple2-280-192-6.tgi a2e.hi.tgi
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
*.emd
|
*.emd
|
||||||
*.joy
|
*.joy
|
||||||
|
*.mou
|
||||||
*.ser
|
*.ser
|
||||||
*.tgi
|
*.tgi
|
||||||
closedir.s
|
closedir.s
|
||||||
|
|||||||
@@ -32,6 +32,9 @@ CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include
|
|||||||
%.joy: %.o ../runtime/zeropage.o
|
%.joy: %.o ../runtime/zeropage.o
|
||||||
@$(LD) -t module -o $@ $^
|
@$(LD) -t module -o $@ $^
|
||||||
|
|
||||||
|
%.mou: %.o ../runtime/zeropage.o
|
||||||
|
@$(LD) -t module -o $@ $^
|
||||||
|
|
||||||
%.ser: %.o ../runtime/zeropage.o
|
%.ser: %.o ../runtime/zeropage.o
|
||||||
@$(LD) -t module -o $@ $^
|
@$(LD) -t module -o $@ $^
|
||||||
|
|
||||||
@@ -76,6 +79,7 @@ S_OBJS= _scrsize.o \
|
|||||||
joy_stddrv.o \
|
joy_stddrv.o \
|
||||||
kbhit.o \
|
kbhit.o \
|
||||||
mainargs.o \
|
mainargs.o \
|
||||||
|
mcbdefault.o \
|
||||||
mli.o \
|
mli.o \
|
||||||
open.o \
|
open.o \
|
||||||
oserrlist.o \
|
oserrlist.o \
|
||||||
@@ -109,6 +113,8 @@ EMDS = apple2-lc.emd
|
|||||||
|
|
||||||
JOYS = apple2-stdjoy.joy
|
JOYS = apple2-stdjoy.joy
|
||||||
|
|
||||||
|
MOUS = apple2-stdmou.mou
|
||||||
|
|
||||||
SERS = apple2-ssc.ser
|
SERS = apple2-ssc.ser
|
||||||
|
|
||||||
TGIS = apple2-40-40-16.tgi apple2-280-192-6.tgi
|
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
|
.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:
|
../runtime/zeropage.o:
|
||||||
$(MAKE) -C $(dir $@) $(notdir $@)
|
$(MAKE) -C $(dir $@) $(notdir $@)
|
||||||
|
|
||||||
clean:
|
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
|
zap: clean
|
||||||
@$(RM) $(EMDS) $(JOYS) $(SERS) $(TGIS)
|
@$(RM) $(EMDS) $(JOYS) $(MOUS) $(SERS) $(TGIS)
|
||||||
|
|
||||||
|
|||||||
411
libsrc/apple2/apple2-stdmou.s
Normal file
411
libsrc/apple2/apple2-stdmou.s
Normal file
@@ -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
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
.ifdef __APPLE2ENH__
|
.ifdef __APPLE2ENH__
|
||||||
.constructor initconio
|
.constructor initconio, 17
|
||||||
.endif
|
.endif
|
||||||
.export _cputcxy, _cputc
|
.export _cputcxy, _cputc
|
||||||
.export cputdirect, newline, putchar
|
.export cputdirect, newline, putchar
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
; ProDOS 8 2.0.3 - $23
|
; ProDOS 8 2.0.3 - $23
|
||||||
;
|
;
|
||||||
|
|
||||||
.constructor initdostype, 25
|
.constructor initdostype, 19
|
||||||
.export __dos_type
|
.export __dos_type
|
||||||
|
|
||||||
.include "mli.inc"
|
.include "mli.inc"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
; TO-DO:
|
; TO-DO:
|
||||||
; Add a control-character quoting mechanism.
|
; Add a control-character quoting mechanism.
|
||||||
|
|
||||||
.constructor initmainargs, 24
|
.constructor initmainargs, 18
|
||||||
.import __argc, __argv, __dos_type
|
.import __argc, __argv, __dos_type
|
||||||
|
|
||||||
.include "zeropage.inc"
|
.include "zeropage.inc"
|
||||||
|
|||||||
136
libsrc/apple2/mcbdefault.s
Normal file
136
libsrc/apple2/mcbdefault.s
Normal file
@@ -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
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
*.emd
|
*.emd
|
||||||
*.joy
|
*.joy
|
||||||
|
*.mou
|
||||||
*.ser
|
*.ser
|
||||||
*.tgi
|
*.tgi
|
||||||
|
|||||||
@@ -32,6 +32,9 @@ CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I ../apple2 -I ../../include
|
|||||||
%.joy: %.o ../runtime/zeropage.o
|
%.joy: %.o ../runtime/zeropage.o
|
||||||
@$(LD) -t module -o $@ $^
|
@$(LD) -t module -o $@ $^
|
||||||
|
|
||||||
|
%.mou: %.o ../runtime/zeropage.o
|
||||||
|
@$(LD) -t module -o $@ $^
|
||||||
|
|
||||||
%.ser: %.o ../runtime/zeropage.o
|
%.ser: %.o ../runtime/zeropage.o
|
||||||
@$(LD) -t module -o $@ $^
|
@$(LD) -t module -o $@ $^
|
||||||
|
|
||||||
@@ -76,6 +79,7 @@ S_OBJS= _scrsize.o \
|
|||||||
joy_stddrv.o \
|
joy_stddrv.o \
|
||||||
kbhit.o \
|
kbhit.o \
|
||||||
mainargs.o \
|
mainargs.o \
|
||||||
|
mcbdefault.o \
|
||||||
mli.o \
|
mli.o \
|
||||||
open.o \
|
open.o \
|
||||||
oserrlist.o \
|
oserrlist.o \
|
||||||
@@ -110,6 +114,8 @@ EMDS = apple2-lc.emd
|
|||||||
|
|
||||||
JOYS = apple2-stdjoy.joy
|
JOYS = apple2-stdjoy.joy
|
||||||
|
|
||||||
|
MOUS = apple2-stdmou.mou
|
||||||
|
|
||||||
SERS = apple2-ssc.ser
|
SERS = apple2-ssc.ser
|
||||||
|
|
||||||
TGIS = apple2-40-40-16.tgi apple2-280-192-6.tgi
|
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
|
.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:
|
../runtime/zeropage.o:
|
||||||
$(MAKE) -C $(dir $@) $(notdir $@)
|
$(MAKE) -C $(dir $@) $(notdir $@)
|
||||||
|
|
||||||
clean:
|
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
|
zap: clean
|
||||||
@$(RM) $(EMDS) $(JOYS) $(SERS) $(TGIS)
|
@$(RM) $(EMDS) $(JOYS) $(MOUS) $(SERS) $(TGIS)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -92,20 +92,25 @@ _mouse_install:
|
|||||||
ldy tmp1
|
ldy tmp1
|
||||||
bpl @L2
|
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
|
; Call driver install routine and check for errors
|
||||||
|
|
||||||
jsr mouse_install
|
@L3: jsr mouse_install
|
||||||
tay ; Test error code
|
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
|
; Uninstall IRQ vector if install routine had errors. A/X contains the error
|
||||||
; from mouse_install, so don't use it.
|
; code from mouse_install, so don't use it.
|
||||||
|
|
||||||
ldy mouse_irq+2 ; Check high byte of IRQ vector
|
ldy #$60 ; RTS opcode
|
||||||
beq @L3 ; Jump if vector invalid
|
sty mouse_irq ; Disable IRQ entry point
|
||||||
ldy #$4C ; Jump opcode
|
@L4: rts
|
||||||
sty mouse_irq ; Activate IRQ routine
|
|
||||||
@L3: rts
|
|
||||||
|
|
||||||
; Driver signature invalid. One word is still on the stack
|
; Driver signature invalid. One word is still on the stack
|
||||||
|
|
||||||
|
|||||||
@@ -97,8 +97,14 @@ mandelbrot: $(CRT0) mandelbrot.o $(CLIB)
|
|||||||
endif
|
endif
|
||||||
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)
|
mousedemo: $(CRT0) mousedemo.o $(CLIB)
|
||||||
@$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
|
@$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
|
||||||
|
endif
|
||||||
|
|
||||||
nachtm: $(CRT0) nachtm.o $(CLIB)
|
nachtm: $(CRT0) nachtm.o $(CLIB)
|
||||||
@$(LD) -t $(SYS) -m $(basename $@).map -Ln $(basename $@).lbl -o $@ $^
|
@$(LD) -t $(SYS) -m $(basename $@).map -Ln $(basename $@).lbl -o $@ $^
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ Platforms: All systems with TGI support. You may have to change the
|
|||||||
Name: mousedemo
|
Name: mousedemo
|
||||||
Description: Shows how to use the mouse.
|
Description: Shows how to use the mouse.
|
||||||
Platforms: All systems with mouse and conio support:
|
Platforms: All systems with mouse and conio support:
|
||||||
C64, C128
|
C64, C128, CBM510, Atari, Apple2
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
Name: nachtm
|
Name: nachtm
|
||||||
|
|||||||
@@ -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
|
* Ullrich von Bassewitz, 13.09.2001
|
||||||
*
|
*
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <mouse.h>
|
#include <mouse.h>
|
||||||
#include <conio.h>
|
#include <conio.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <dbg.h>
|
#include <dbg.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -61,6 +62,14 @@ static const unsigned char MouseSprite[64] = {
|
|||||||
|
|
||||||
#endif /* __C64__ or __C128__ */
|
#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)
|
static void CheckError (const char* S, unsigned char Error)
|
||||||
@@ -81,7 +90,7 @@ static void DoWarning (void)
|
|||||||
" %s\n"
|
" %s\n"
|
||||||
"on disk! Press 'y' if you have it or\n"
|
"on disk! Press 'y' if you have it or\n"
|
||||||
"any other key to exit.\n", DRIVER);
|
"any other key to exit.\n", DRIVER);
|
||||||
if (cgetc () != 'y') {
|
if (tolower (cgetc ()) != 'y') {
|
||||||
exit (EXIT_SUCCESS);
|
exit (EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
printf ("Ok. Please wait patiently...\n");
|
printf ("Ok. Please wait patiently...\n");
|
||||||
@@ -113,9 +122,9 @@ int main (void)
|
|||||||
DoWarning ();
|
DoWarning ();
|
||||||
|
|
||||||
/* Clear the screen, set white on black */
|
/* Clear the screen, set white on black */
|
||||||
bordercolor (COLOR_BLACK);
|
(void) bordercolor (COLOR_BLACK);
|
||||||
bgcolor (COLOR_BLACK);
|
(void) bgcolor (COLOR_BLACK);
|
||||||
textcolor (COLOR_GRAY3);
|
(void) textcolor (COLOR_GRAY3);
|
||||||
cursor (0);
|
cursor (0);
|
||||||
clrscr ();
|
clrscr ();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user