1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-28 19:29:53 +00:00

Moved additional zeropage variables into an extra module.

Added interrupt vector to joystick driver.
New code from Karri.
Rewrote joystick initialization to make it somewhat shorter.


git-svn-id: svn://svn.cc65.org/cc65/trunk@3281 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2004-11-06 13:51:02 +00:00
parent dc781be7f9
commit 84be744418
6 changed files with 607 additions and 110 deletions

View File

@ -27,19 +27,19 @@ CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include
%.o: %.s
@$(AS) -g -o $@ $(AFLAGS) $<
%.emd: %.o ../runtime/zeropage.o
%.emd: %.o ../runtime/zeropage.o extzp.o
@$(LD) -t module -o $@ $^
%.joy: %.o ../runtime/zeropage.o
%.joy: %.o ../runtime/zeropage.o extzp.o
@$(LD) -t module -o $@ $^
%.mou: %.o ../runtime/zeropage.o
%.mou: %.o ../runtime/zeropage.o extzp.o
@$(LD) -t module -o $@ $^
%.ser: %.o ../runtime/zeropage.o
%.ser: %.o ../runtime/zeropage.o extzp.o
@$(LD) -t module -o $@ $^
%.tgi: %.o ../runtime/zeropage.o
%.tgi: %.o ../runtime/zeropage.o extzp.o
@$(LD) -t module -o $@ $^
#--------------------------------------------------------------------------
@ -48,6 +48,7 @@ CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include
OBJS = crt0.o \
ctype.o \
eeprom.o \
extzp.o \
framerate.o \
getenv.o \
mainargs.o \

View File

@ -19,7 +19,6 @@
.include "lynx.inc"
.export _exit
.exportzp __iodat,__iodir,__viddma,__sprsys
.import initlib, donelib
.import zerobss
@ -29,6 +28,7 @@
.import __RAM_START__, __RAM_SIZE__
.include "zeropage.inc"
.include "extzp.inc"
; ------------------------------------------------------------------------
@ -54,17 +54,6 @@ MikeyInitReg: .byte $00,$01,$08,$09,$20,$28,$30,$38,$44,$50,$8a,$8b,$8c,$92,$9
MikeyInitData: .byte $9e,$18,$68,$1f,$00,$00,$00,$00,$00,$ff,$1a,$1b,$04,$0d,$29
; ------------------------------------------------------------------------
; mikey and suzy shadow registers
.segment "EXTZP" : zeropage
__iodat: .res 1
__iodir: .res 1
__viddma: .res 1
__sprsys: .res 1
; ------------------------------------------------------------------------
; Actual code

16
libsrc/lynx/extzp.inc Normal file
View File

@ -0,0 +1,16 @@
;
; extzp.inc for the Lynx
;
; Ullrich von Bassewitz, 2004-11-06
;
; Assembler include file that imports the runtime zero page locations used
; by the Lynx runtime, ready for usage in asm code.
;
.global __iodat: zp
.global __iodir: zp
.global __viddma: zp
.global __sprsys: zp

19
libsrc/lynx/extzp.s Normal file
View File

@ -0,0 +1,19 @@
;
; Ullrich von Bassewitz, 2004-11-06
;
; zeropage locations for exclusive use by the library
;
.include "extzp.inc"
.segment "EXTZP" : zeropage
; ------------------------------------------------------------------------
; mikey and suzy shadow registers
__iodat: .res 1
__iodir: .res 1
__viddma: .res 1
__sprsys: .res 1

View File

@ -1,7 +1,15 @@
;
; Graphics driver for the 160x102x16 mode on the Lynx.
;
; Based on Stephen L. Judds GRLIB code
; All the drawing functions are simply done by sprites as the sprite
; engine is the only way to do fast graphics on a Lynx.
;
; So the code is not really based on any algorithms done by somebody.
; I have looked at other routines in the cc65 libs to see what kind of
; entry points we need. And I have looked at the old cc65 libs by
; Bastian Schick to see how things worked in the past.
;
; This code is written by Karri Kaksonen, 2004 for the cc65 compiler.
;
.include "zeropage.inc"
@ -11,6 +19,7 @@
.include "tgi-error.inc"
.include "lynx.inc"
.include "extzp.inc"
.macpack generic
@ -28,7 +37,7 @@
.word 160 ; X resolution
.word 102 ; Y resolution
.byte 16 ; Number of drawing colors
.byte 1 ; Number of screens available
.byte 2 ; Number of screens available
.byte 8 ; System font X size
.byte 8 ; System font Y size
.res 4, $00 ; Reserved for future extensions
@ -70,17 +79,11 @@ X1 := ptr1
Y1 := ptr2
X2 := ptr3
Y2 := ptr4
RADIUS := tmp1
ROW := tmp2 ; Bitmap row...
COL := tmp3 ; ...and column, both set by PLOT
TEMP := tmp4
TEMP2 := sreg
POINT := regsave
INRANGE := regsave+2 ; PLOT variable, $00 = coordinates in range
CHUNK := X2 ; Used in the line routine
OLDCHUNK := X2+1 ; Dito
STRPTR := ptr3
FONTOFF := ptr4
STROFF := tmp3
STRLEN := tmp4
; Absolute variables used in the code
@ -91,34 +94,17 @@ ERROR: .res 1 ; Error code
DRAWINDEX: .res 1 ; Pen to use for drawing
VIEWPAGEL: .res 1
VIEWPAGEH: .res 1
; INIT/DONE
OLDD018: .res 1 ; Old register value
; Line routine stuff
DX: .res 2
DY: .res 2
; Circle routine stuff, overlaid by BAR variables
X1SAVE:
CURX: .res 1
CURY: .res 1
Y1SAVE:
BROW: .res 1 ; Bottom row
TROW: .res 1 ; Top row
X2SAVE:
LCOL: .res 1 ; Left column
RCOL: .res 1 ; Right column
Y2SAVE:
CHUNK1: .res 1
OLDCH1: .res 1
CHUNK2: .res 1
OLDCH2: .res 1
DRAWPAGEL: .res 1
DRAWPAGEH: .res 1
; Text output stuff
TEXTMAGX: .res 1
TEXTMAGY: .res 1
TEXTDIR: .res 1
BGINDEX: .res 1 ; Pen to use for text background
text_bitmap: .res 8*(1+20+1)+1
; 8 rows with (one offset-byte plus 20 character bytes plus one fill-byte) plus one 0-offset-byte
; Constants and tables
@ -159,13 +145,6 @@ DEFPALETTE: .byte >$000
PALETTESIZE = * - DEFPALETTE
BITTAB: .byte $80,$40,$20,$10,$08,$04,$02,$01
BITCHUNK: .byte $FF,$7F,$3F,$1F,$0F,$07,$03,$01
VBASE = $E000 ; Video memory base address
CBASE = $D000 ; Color memory base address
.code
; ------------------------------------------------------------------------
@ -177,6 +156,10 @@ CBASE = $D000 ; Color memory base address
;
INSTALL:
lda #1
sta TEXTMAGX
sta TEXTMAGY
stz BGINDEX
rts
@ -207,7 +190,6 @@ UNINSTALL:
INIT:
; Done, reset the error code
lda #TGI_ERR_OK
sta ERROR
rts
@ -237,9 +219,72 @@ GETERROR:
;
; Must set an error code: YES
;
; The TGI lacks a way to draw sprites. As that functionality is vital to
; Lynx games we borrow this CONTROL function to implement the still
; missing tgi_draw_sprite funtion. To use this in your C-program
; do a #define tgi_draw_sprite(spr) tgi_ioctl(0, spr)
;
; To do a flip-screen call tgi_ioctl(1, 0)
;
; To set the background index for text outputs call tgi_ioctl(2, bgindex)
CONTROL:
lda #TGI_ERR_INV_FUNC
cmp #2
bne @L0
lda ptr1
sta BGINDEX
lda #TGI_ERR_OK
sta ERROR
rts
@L0:
cmp #1
bne @L2
lda __sprsys
eor #8
sta __sprsys
sta SPRSYS
lda __viddma
eor #2
sta __viddma
sta DISPCTL
ldy VIEWPAGEL
ldx VIEWPAGEH
and #2
beq @L1
clc
tya
adc #<8159
tay
txa
adc #>8159
tax
@L1:
sty DISPADRL
stx DISPADRH
lda #TGI_ERR_OK
sta ERROR
rts
@L2:
lda ptr1 ; Get the sprite address
ldx ptr1+1
draw_sprite: ; Draw it in render buffer
sta SCBNEXTL
stx SCBNEXTH
lda DRAWPAGEL
ldx DRAWPAGEH
sta VIDBASL
stx VIDBASH
lda #1
sta SPRGO
stz SDONEACK
@L3: stz CPUSLEEP
lda SPRSYS
lsr
bcs @L3
stz SDONEACK
lda #TGI_ERR_OK
sta ERROR
rts
@ -266,18 +311,7 @@ cls_sprite:
.code
CLEAR: lda #<cls_sprite
ldx #>cls_sprite
draw_sprite:
sta $fc10
stx $fc11
lda #1
sta $fc91
stz $fd90
@L3: stz CPUSLEEP
lda $fc92
lsr
bcs @L3
stz $fd90
rts
bra draw_sprite
; ------------------------------------------------------------------------
; SETVIEWPAGE: Set the visible page. Called with the new page in A (0..n).
@ -285,18 +319,36 @@ draw_sprite:
;
; Must set an error code: NO (will only be called if page ok)
;
; It is a good idea to call this function during the vertical blanking
; period. If you call it in the middle of the screen update then half of
; the drawn frame will be from the old buffer and the other half is
; from the new buffer. This is usually noticed by the user.
SETVIEWPAGE:
beq @L1
lda #<$fe00-8160-8160
ldx #>$fe00-8160-8160
beq @L1 ; page == maxpages-1
ldy #<$de20 ; page 0
ldx #>$de20
bra @L2
@L1: lda #<$fe00-8160
ldx #>$fe00-8160
@L2: sta DISPADRL ; $FD94
sta VIEWPAGEL
stx DISPADRH ; $FD95
sta VIEWPAGEH
@L1:
ldy #<$be40 ; page 1
ldx #>$be40
@L2:
sty VIEWPAGEL ; Save viewpage for getpixel
stx VIEWPAGEH
lda __viddma ; Process flipped displays
and #2
beq @L3
clc
tya
adc #<8159
tay
txa
adc #>8159
tax
@L3:
sty DISPADRL ; $FD94
stx DISPADRH ; $FD95
rts
; ------------------------------------------------------------------------
@ -307,14 +359,16 @@ SETVIEWPAGE:
;
SETDRAWPAGE:
beq @L1
lda #<$fe00-8160-8160
ldx #>$fe00-8160-8160
beq @L1 ; page == maxpages-1
lda #<$de20 ; page 0
ldx #>$de20
bra @L2
@L1: lda #<$fe00-8160
ldx #>$fe00-8160
@L2: sta VIDBASL ; $FD94
stx VIDBASH ; $FD95
@L1:
lda #<$be40 ; page 1
ldx #>$be40
@L2:
sta DRAWPAGEL
stx DRAWPAGEH
rts
; ------------------------------------------------------------------------
@ -383,7 +437,7 @@ GETDEFPALETTE:
;
; Must set an error code: NO
;
.data
pixel_sprite:
.byte %00000001 ; A pixel sprite
@ -392,10 +446,10 @@ pixel_sprite:
.addr 0,pixel_bitmap
pix_x: .word 0
pix_y: .word 0
.word $0100
.word $0100
.word $100
.word $100
pix_c: .byte $00
.code
SETPIXEL:
lda X1
@ -451,19 +505,124 @@ GETPIXEL:
; LINE: Draw a line from X1/Y1 to X2/Y2, where X1/Y1 = ptr1/ptr2 and
; X2/Y2 = ptr3/ptr4 using the current drawing color.
;
; To deal with off-screen coordinates, the current row
; and column (40x25) is kept track of. These are set
; negative when the point is off the screen, and made
; positive when the point is within the visible screen.
;
; X1,X2 etc. are set up above (x2=LINNUM in particular)
; Format is LINE x2,y2,x1,y1
;
; Must set an error code: NO
;
.data
line_sprite:
.byte 0 ; Will be replaced by the code
.byte %00110000
.byte %00100000
.word 0,pixel_bitmap
line_x:
.word 0
line_y:
.word 0
line_sx:
.word $100
line_sy:
.word $100
.word 0
line_tilt:
.word 0
line_c:
.byte $e
LINE:
rts
lda DRAWINDEX
sta line_c
stz line_sx
stz line_sy
sec
lda X2
sbc X1
lda X2+1
sbc X1+1
bpl @L1
lda X1
ldx X2
sta X2
stx X1
lda X1+1
ldx X2+1
sta X2+1
stx X1+1
lda Y1
ldx Y2
sta Y2
stx Y1
lda Y1+1
ldx Y2+1
sta Y2+1
stx Y1+1
@L1:
lda #%00000000 ; Not flipped
sta line_sprite
sec
lda Y2
sbc Y1
sta Y2
lda Y2+1
sbc Y1+1
sta Y2+1
bpl @L2
sec
lda #0
sbc Y2
sta Y2
lda #0
sbc Y2+1
sta Y2+1
lda #%00010000 ; Vertical flip
sta line_sprite
@L2:
lda X1
sta line_x
lda X1+1
sta line_x+1
lda Y1
sta line_y
lda Y1+1
sta line_y+1
lda Y2
ina
sta line_sy+1
sta MATHP ; hardware divide
stz MATHN
stz MATHH
stz MATHG
sec
lda X2
sbc X1
ina
sta MATHF
stz MATHE
@L3:
lda SPRSYS
bmi @L3 ; wait for math done (bit 7 of sprsys)
lda MATHC
sta line_tilt
lda MATHB
sta line_tilt+1
bne @L4
lda #1
sta line_sx+1
bra @L6
@L4:
bit line_tilt
bpl @L5
ina
@L5:
sta line_sx+1
@L6:
lda #<line_sprite
ldx #>line_sprite
jmp draw_sprite
; ------------------------------------------------------------------------
; BAR: Draw a filled rectangle with the corners X1/Y1, X2/Y2, where
@ -501,10 +660,12 @@ BAR: lda X1
lda X2
sec
sbc X1
ina
sta bar_sx+1
lda Y2
sec
sbc Y1
ina
sta bar_sy+1
lda DRAWINDEX
sta bar_c
@ -518,9 +679,58 @@ BAR: lda X1
;
; Must set an error code: NO
;
; There is no sensible way of drawing a circle on a Lynx. As I would
; have to use line elements to do the circle I rather do it in C than
; create it here in the driver.
; To do a circle please add this to your C program
;int sintbl[9] = {
; 0, // 0 degrees
; 3196, // 11.25 degrees
; 6270, // 22.5 degrees
; 9102, // 33.75 degrees
; 11585, // 45 degrees
; 13623, // 56.25 degrees
; 15137, // 67.5 degrees
; 16069, // 78.75 degrees
; 16384 // 90 degrees
;};
;int sin(char d)
;{
; char neg;
; d = d & 31;
; neg = d > 16;
; d = d & 15;
; if (d > 8)
; d = 16 - d;
; if (neg)
; return -sintbl[d];
; else
; return sintbl[d];
;}
;void tgi_Circle(int x0, int y0, unsigned char r)
;{
; char i;
; int x1, y1, x2, y2;
;
; x1 = ((long)sin(0) * r + 8192) / 16384 + x0;
; y1 = ((long)sin(8) * r + 8192) / 16384 + y0;
; for (i = 1; i <= 32; i++) {
; x2 = ((long)sin(i) * r + 8192) / 16384 + x0;
; y2 = ((long)sin(i+8) * r + 8192) / 16384 + y0;
; tgi_line(x1, y1, x2, y2);
; x1 = x2;
; y1 = y2;
; }
;}
;#define tgi_circle tgi_Circle
CIRCLE:
rts
rts
; ------------------------------------------------------------------------
; TEXTSTYLE: Set the style used when calling OUTTEXT. Text scaling in X and Y
@ -535,7 +745,6 @@ TEXTSTYLE:
sta TEXTDIR
rts
; ------------------------------------------------------------------------
; OUTTEXT: Output text at X/Y = ptr1/ptr2 using the current color and the
; current text style. The text to output is given as a zero terminated
@ -545,5 +754,237 @@ TEXTSTYLE:
;
OUTTEXT:
rts
lda TEXTMAGX ; Scale sprite
sta text_sx+1
lda TEXTMAGY
sta text_sy+1
stz text_sprite ; Set normal sprite
lda BGINDEX
bne @L1
lda #4
sta text_sprite ; Set opaque sprite
@L1:
lda DRAWINDEX ; Set color
asl
asl
asl
asl
ora BGINDEX
sta text_c
lda X1 ; Set start position
sta text_x
lda X1+1
sta text_x+1
lda Y1
sta text_y
lda Y1+1
sta text_y+1
ldy #-1 ; Calculate string length
@L2:
iny
lda (STRPTR),y
bne @L2
cpy #20
bmi @L3
ldy #20
@L3:
sty STRLEN
bne @L4
rts ; Zero length string
@L4:
iny ; Prepare text_bitmap
iny
sty STROFF
ldy #8-1 ; 8 pixel lines per character
ldx #0
clc
@L5:
lda STROFF
sta text_bitmap,x
txa
adc STROFF
tax
lda #$ff
sta text_bitmap-1,x
dey
bpl @L5
stz text_bitmap,x
stz tmp2
iny
@L6:
lda (STRPTR),y
sty tmp1
sec ; (ch-' ') * 8
sbc #32
stz FONTOFF
stz FONTOFF+1
asl
asl
rol FONTOFF+1
asl
rol FONTOFF+1
clc ; Choose font
adc #<font
sta FONTOFF
lda FONTOFF+1
adc #>font
sta FONTOFF+1
; and now copy the 8 bytes of that char
ldx tmp2
inx
stx tmp2
; draw char from top to bottom, reading char-data from offset 8-1 to offset 0
ldy #8-1
@L7:
lda (FONTOFF),y ; *chptr
sta text_bitmap,x ;textbuf[y*(1+len+1)+1+x]
txa
adc STROFF
tax
dey
bpl @L7
; goto next char
ldy tmp1
iny
dec STRLEN
bne @L6
lda #<text_sprite
ldx #>text_sprite
jmp draw_sprite
.data
text_sprite:
.byte $00,$90,$20
.addr 0, text_bitmap
text_x:
.word 0
text_y:
.word 0
text_sx:
.word $100
text_sy:
.word $100
text_c:
.byte 0
.rodata
; The Font
; 96 characters from ASCII 32 to 127
; 8 pixels wide, 8 pixels high
; bit value 0 = foreground, bit value 1 = background / transparent
font:
; VERSAIL
.byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ;32
.byte $FF, $E7, $FF, $FF, $E7, $E7, $E7, $E7 ;33
.byte $FF, $FF, $FF, $FF, $FF, $99, $99, $99 ;34
.byte $FF, $99, $99, $00, $99, $00, $99, $99 ;35
.byte $FF, $E7, $83, $F9, $C3, $9F, $C1, $E7 ;36
.byte $FF, $B9, $99, $CF, $E7, $F3, $99, $9D ;37
.byte $FF, $C0, $99, $98, $C7, $C3, $99, $C3 ;38
.byte $FF, $FF, $FF, $FF, $FF, $E7, $F3, $F9 ;39
.byte $FF, $F3, $E7, $CF, $CF, $CF, $E7, $F3 ;40
.byte $FF, $CF, $E7, $F3, $F3, $F3, $E7, $CF ;41
.byte $FF, $FF, $99, $C3, $00, $C3, $99, $FF ;42
.byte $FF, $FF, $E7, $E7, $81, $E7, $E7, $FF ;43
.byte $CF, $E7, $E7, $FF, $FF, $FF, $FF, $FF ;44
.byte $FF, $FF, $FF, $FF, $81, $FF, $FF, $FF ;45
.byte $FF, $E7, $E7, $FF, $FF, $FF, $FF, $FF ;46
.byte $FF, $9F, $CF, $E7, $F3, $F9, $FC, $FF ;47
.byte $FF, $C3, $99, $99, $89, $91, $99, $C3 ;48
.byte $FF, $81, $E7, $E7, $E7, $C7, $E7, $E7 ;49
.byte $FF, $81, $9F, $CF, $F3, $F9, $99, $C3 ;50
.byte $FF, $C3, $99, $F9, $E3, $F9, $99, $C3 ;51
.byte $FF, $F9, $F9, $80, $99, $E1, $F1, $F9 ;52
.byte $FF, $C3, $99, $F9, $F9, $83, $9F, $81 ;53
.byte $FF, $C3, $99, $99, $83, $9F, $99, $C3 ;54
.byte $FF, $E7, $E7, $E7, $E7, $F3, $99, $81 ;55
.byte $FF, $C3, $99, $99, $C3, $99, $99, $C3 ;56
.byte $FF, $C3, $99, $F9, $C1, $99, $99, $C3 ;57
.byte $FF, $FF, $E7, $FF, $FF, $E7, $FF, $FF ;58
.byte $CF, $E7, $E7, $FF, $FF, $E7, $FF, $FF ;59
.byte $FF, $F1, $E7, $CF, $9F, $CF, $E7, $F1 ;60
.byte $FF, $FF, $FF, $81, $FF, $81, $FF, $FF ;61
.byte $FF, $8F, $E7, $F3, $F9, $F3, $E7, $8F ;62
.byte $FF, $E7, $FF, $E7, $F3, $F9, $99, $C3 ;63
.byte $FF, $C3, $9D, $9F, $91, $91, $99, $C3 ;0
.byte $FF, $99, $99, $99, $81, $99, $C3, $E7 ;1
.byte $FF, $83, $99, $99, $83, $99, $99, $83 ;2
.byte $FF, $C3, $99, $9F, $9F, $9F, $99, $C3 ;3
.byte $FF, $87, $93, $99, $99, $99, $93, $87 ;4
.byte $FF, $81, $9F, $9F, $87, $9F, $9F, $81 ;5
.byte $FF, $9F, $9F, $9F, $87, $9F, $9F, $81 ;6
.byte $FF, $C3, $99, $99, $91, $9F, $99, $C3 ;7
.byte $FF, $99, $99, $99, $81, $99, $99, $99 ;8
.byte $FF, $C3, $E7, $E7, $E7, $E7, $E7, $C3 ;9
.byte $FF, $C7, $93, $F3, $F3, $F3, $F3, $E1 ;10
.byte $FF, $99, $93, $87, $8F, $87, $93, $99 ;11
.byte $FF, $81, $9F, $9F, $9F, $9F, $9F, $9F ;12
.byte $FF, $9C, $9C, $9C, $94, $80, $88, $9C ;13
.byte $FF, $99, $99, $91, $81, $81, $89, $99 ;14
.byte $FF, $C3, $99, $99, $99, $99, $99, $C3 ;15
.byte $FF, $9F, $9F, $9F, $83, $99, $99, $83 ;16
.byte $FF, $F1, $C3, $99, $99, $99, $99, $C3 ;17
.byte $FF, $99, $93, $87, $83, $99, $99, $83 ;18
.byte $FF, $C3, $99, $F9, $C3, $9F, $99, $C3 ;19
.byte $FF, $E7, $E7, $E7, $E7, $E7, $E7, $81 ;20
.byte $FF, $C3, $99, $99, $99, $99, $99, $99 ;21
.byte $FF, $E7, $C3, $99, $99, $99, $99, $99 ;22
.byte $FF, $9C, $88, $80, $94, $9C, $9C, $9C ;23
.byte $FF, $99, $99, $C3, $E7, $C3, $99, $99 ;24
.byte $FF, $E7, $E7, $E7, $C3, $99, $99, $99 ;25
.byte $FF, $81, $9F, $CF, $E7, $F3, $F9, $81 ;26
.byte $FF, $C3, $CF, $CF, $CF, $CF, $CF, $C3 ;27
.byte $FF, $03, $9D, $CF, $83, $CF, $ED, $F3 ;28
.byte $FF, $C3, $F3, $F3, $F3, $F3, $F3, $C3 ;29
.byte $E7, $E7, $E7, $E7, $81, $C3, $E7, $FF ;30
.byte $FF, $EF, $CF, $80, $80, $CF, $EF, $FF ;31
; gemena
.byte $FF, $C3, $9D, $9F, $91, $91, $99, $C3 ;224
.byte $FF, $C1, $99, $C1, $F9, $C3, $FF, $FF ;225
.byte $FF, $83, $99, $99, $83, $9F, $9F, $FF ;226
.byte $FF, $C3, $9F, $9F, $9F, $C3, $FF, $FF ;227
.byte $FF, $C1, $99, $99, $C1, $F9, $F9, $FF ;228
.byte $FF, $C3, $9F, $81, $99, $C3, $FF, $FF ;229
.byte $FF, $E7, $E7, $E7, $C1, $E7, $F1, $FF ;230
.byte $83, $F9, $C1, $99, $99, $C1, $FF, $FF ;231
.byte $FF, $99, $99, $99, $83, $9F, $9F, $FF ;232
.byte $FF, $C3, $E7, $E7, $C7, $FF, $E7, $FF ;233
.byte $C3, $F9, $F9, $F9, $F9, $FF, $F9, $FF ;234
.byte $FF, $99, $93, $87, $93, $9F, $9F, $FF ;235
.byte $FF, $C3, $E7, $E7, $E7, $E7, $C7, $FF ;236
.byte $FF, $9C, $94, $80, $80, $99, $FF, $FF ;237
.byte $FF, $99, $99, $99, $99, $83, $FF, $FF ;238
.byte $FF, $C3, $99, $99, $99, $C3, $FF, $FF ;239
.byte $9F, $9F, $83, $99, $99, $83, $FF, $FF ;240
.byte $F9, $F9, $C1, $99, $99, $C1, $FF, $FF ;241
.byte $FF, $9F, $9F, $9F, $99, $83, $FF, $FF ;242
.byte $FF, $83, $F9, $C3, $9F, $C1, $FF, $FF ;243
.byte $FF, $F1, $E7, $E7, $E7, $81, $E7, $FF ;244
.byte $FF, $C1, $99, $99, $99, $99, $FF, $FF ;245
.byte $FF, $E7, $C3, $99, $99, $99, $FF, $FF ;246
.byte $FF, $C9, $C1, $80, $94, $9C, $FF, $FF ;247
.byte $FF, $99, $C3, $E7, $C3, $99, $FF, $FF ;248
.byte $87, $F3, $C1, $99, $99, $99, $FF, $FF ;249
.byte $FF, $81, $CF, $E7, $F3, $81, $FF, $FF ;250
.byte $FF, $C3, $CF, $CF, $CF, $CF, $CF, $C3 ;251
.byte $FF, $03, $9D, $CF, $83, $CF, $ED, $F3 ;252
.byte $FF, $C3, $F3, $F3, $F3, $F3, $F3, $C3 ;253
.byte $E7, $E7, $E7, $E7, $81, $C3, $E7, $FF ;254
.byte $FF, $EF, $CF, $80, $80, $CF, $EF, $FF ;255

View File

@ -12,6 +12,7 @@
.include "joy-kernel.inc"
.include "joy-error.inc"
.include "lynx.inc"
.include "extzp.inc"
.macpack generic
@ -28,6 +29,7 @@
; Button state masks (8 values)
joy_mask:
.byte $80 ; JOY_UP
.byte $40 ; JOY_DOWN
.byte $20 ; JOY_LEFT
@ -39,10 +41,11 @@
; Jump table.
.word INSTALL
.word UNINSTALL
.word COUNT
.word READ
.addr INSTALL
.addr UNINSTALL
.addr COUNT
.addr READ
.addr 0 ; IRQ entry unused
; ------------------------------------------------------------------------
; Constants
@ -62,9 +65,37 @@ JOY_COUNT = 1 ; Number of joysticks we support
; memory available.
; Must return an JOY_ERR_xx code in a/x.
;
; Here we also flip the joypad in case the display is flipped.
; This install routine should be called after you send the flip code
; to the display hardware.
INSTALL:
lda #<JOY_ERR_OK
lda __viddma ; Process flipped displays
and #2
beq @L2
; Set joypad for flipped display
lda #$10
ldx #$00
@L1: sta joy_mask,x
inx
asl a
bcc @L1
bra @L4
; Set joypad for normal display
@L2: lda #$10
ldx #$03
@L3: sta joy_mask,x
dex
asl a
bcc @L3
; Done
@L4: lda #<JOY_ERR_OK
ldx #>JOY_ERR_OK
; rts ; Run into UNINSTALL instead