1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-18 07:29:36 +00:00

more cleanup, joystick works again

This commit is contained in:
mrdudz 2015-07-12 14:27:24 +02:00
parent 21999b081f
commit 891cb97b2f
27 changed files with 822 additions and 919 deletions

View File

@ -1,12 +1,17 @@
;
; PCE definitions. By Groepaz/Hitmem.
;
; Write VDC register
.macro VREG arg1,arg2
st0 #arg1
st1 #<(arg2)
st2 #>(arg2)
.endmacro
;; FIXME: optimize zeropage usage
_tickcount= $20
CURS_X = $30
CURS_Y = $31
SCREEN_PTR = $32 ;2
CRAM_PTR = $34 ;2
CHARCOLOR = $36
RVS = $37
BGCOLOR = $38
_tickcount = $39 ;2
screenrows = (224/8)
charsperline = (512/8)
@ -15,14 +20,6 @@ xsize = charsperline
CH_HLINE = 7
CH_VLINE = 7
CURS_X = $30
CURS_Y = $31
SCREEN_PTR = $32
CRAM_PTR = $34
CHARCOLOR = $36
RVS = $37
BGCOLOR=$38
; huc6270 - Video Display Controller (vdc)
VDC_MAWR = 0 ; Memory Address Write Register
@ -45,9 +42,9 @@ VDC_DESR =16 ; (DMA) Destination Register
VDC_LENR =17 ; (DMA) Length Register
VDC_SATB =18 ; Sprite Attribute Table
VDC_CTRL = $0000
VDC_DATA_LO = $0002
VDC_DATA_HI = $0003
VDC_CTRL = $0000
VDC_DATA_LO = $0002
VDC_DATA_HI = $0003
; huc6260 - Video Color Encoder (vce)
@ -61,18 +58,17 @@ VCE_ADDR_HI = $0403 ; MSB of byte offset into palette
VCE_DATA_LO = $0404 ; LSB of 16-bit palette data
VCE_DATA_HI = $0405 ; MSB of 16-bit palette data
TIMER_COUNT = $0c00
TIMER_CTRL = $0c01
TIMER_COUNT = $0c00
TIMER_CTRL = $0c01
JOY_CTRL = $1000
JOY_CTRL = $1000
IRQ_MASK = $1402
IRQ_STATUS = $1403
IRQ_MASK = $1402
IRQ_STATUS = $1403
CDR_MEM_DISABLE = $1803
CDR_MEM_ENABLE = $1807
;; lda abs
.macro ldaio arg1
.byte $ad
@ -88,3 +84,10 @@ CDR_MEM_ENABLE = $1807
.byte $9c
.word arg1
.endmacro
; Write VDC register
.macro VREG arg1,arg2
st0 #arg1
st1 #<(arg2)
st2 #>(arg2)
.endmacro

View File

@ -1,62 +1,32 @@
# linker config to produce simple NEC PC-Engine cartridge (.pce)
SYMBOLS {
__STACKSIZE__: type = weak, value = $0300; # 3 pages stack
}
MEMORY {
# FIXME: is this correct? the first 3? bytes cant be used?
ZP: start = $03, size = $1A, type = rw, define = yes;
ZP: start = $00, size = $1A, type = rw, define = yes;
# INES Cartridge Header
#HEADER: start = $0, size = $10, file = %O ,fill = yes;
# 2 16K ROM Banks
# - startup
# - code
# - rodata
# - data (load)
# 1 8k CHR Bank
ROM0: start = $e000, size = $1ff6, file = %O ,fill = yes, define = yes;
# Hardware Vectors at End of 2nd 8K ROM
ROMV: start = $fff6, size = $a, file = %O,fill = yes;
# ROM: start = $6000, size = $8000, file = %O, fill = yes,define=yes;
# standard 2k SRAM (-zeropage)
# $0100-$0200 cpu stack
# $0200-$0500 3 pages for ppu memory write buffer
# $0500-$0800 3 pages for cc65 parameter stack
#SRAM: start = $0500, size = $0300, define = yes;
# additional 8K SRAM Bank
# - data (run)
# - bss
# - heap
# RAM: start = $2200, size = $1000, define = yes;
# RAM2: start = $3200, size = $0e00, define = yes;
RAM: start = $2200, size = $1e00, define = yes;
# reset-bank and hardware vectors
ROM0: start = $e000, size = $1ff6, file = %O ,fill = yes, define = yes;
ROMV: start = $fff6, size = $a, file = %O,fill = yes;
# first RAM page (also contains stack and zeropage)
RAM: start = $2200, size = $1e00, define = yes;
}
SEGMENTS {
#HEADER: load = HEADER, type = wprot;
#aSTARTUP: load = ROM0, type = wprot, define = yes;
STARTUP: load = ROM0, type = ro, define = yes;
INIT: load = ROM0, type = ro, define = yes, optional = yes;
CODE: load = ROM0, type = ro, define = yes;
RODATA: load = ROM0, type = ro, define = yes;
DATA: load = ROM0, run= RAM, type = rw, define = yes;
# BSS: load = RAM2, type = bss, define = yes;
BSS: load = RAM, type = bss, define = yes;
VECTORS: load = ROMV, type = rw, define = yes;
#CHARS: load = ROM2, type = rw;
ZEROPAGE: load = ZP, type = zp, define = yes;
STARTUP: load = ROM0, type = ro, define = yes;
INIT: load = ROM0, type = ro, define = yes, optional = yes;
CODE: load = ROM0, type = ro, define = yes;
RODATA: load = ROM0, type = ro, define = yes;
DATA: load = ROM0, run= RAM, type = rw, define = yes;
BSS: load = RAM, type = bss, define = yes;
VECTORS: load = ROMV, type = rw, define = yes;
ZEROPAGE: load = ZP, type = zp, define = yes;
}
FEATURES {
CONDES: segment = STARTUP,
type=constructor,

View File

@ -1,74 +1,99 @@
#define CH_CROSS 0x10
#define CH_RTEE 0x17
#define CH_LTEE 0x0f
#define CH_ULCORNER 0x10
#define CH_URCORNER 0x10
#define CH_LLCORNER 0x10
#define CH_LRCORNER 0x10
/*****************************************************************************/
/* */
/* pce.h */
/* */
/* PC-Engine system specific definitions */
/* */
/* */
/* */
/* (C) 2015 Groepaz/Hitmen */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
/* warranty. In no event will the authors be held liable for any damages */
/* arising from the use of this software. */
/* */
/* Permission is granted to anyone to use this software for any purpose, */
/* including commercial applications, and to alter it and redistribute it */
/* freely, subject to the following restrictions: */
/* */
/* 1. The origin of this software must not be misrepresented; you must not */
/* claim that you wrote the original software. If you use this software */
/* in a product, an acknowledgment in the product documentation would be */
/* appreciated but is not required. */
/* 2. Altered source versions must be plainly marked as such, and must not */
/* be misrepresented as being the original software. */
/* 3. This notice may not be removed or altered from any source */
/* distribution. */
/* */
/*****************************************************************************/
#define TV_NTSC 0
#define TV_PAL 1
#define get_tv() 0
#define CLOCKS_PER_SEC 50 // ???
#define CLK_TCK 50 // ?!?
#ifndef _PCE_H
#define _PCE_H
//#ifndef CH_ENTER
#define CH_ENTER '\n'
//#endif
#define CH_STOP 0x08
#define CH_F1 0x14
#define CH_F3 0x15
#define CH_F5 0x16
#define CH_F7 0x17
#define CH_CURS_UP 0x01
#define CH_CURS_DOWN 0x02
#ifndef CH_CURS_LEFT
#define CH_CURS_LEFT 0x03
/* Check for errors */
#if !defined(__PCE__)
# error This module may only be used when compiling for the PCE!
#endif
#ifndef CH_CURS_RIGHT
#define CH_CURS_RIGHT 0x04
/* FIXME: the respective characters are not present in the VGA charset (yet) */
#define CH_CROSS 0x10
#define CH_RTEE 0x17
#define CH_LTEE 0x0f
#define CH_ULCORNER 0x10
#define CH_URCORNER 0x10
#define CH_LLCORNER 0x10
#define CH_LRCORNER 0x10
/* Color defines (CBM compatible, for conio) */
#define COLOR_BLACK 0x00
#define COLOR_WHITE 0x01
#define COLOR_RED 0x02
#define COLOR_CYAN 0x03
#define COLOR_VIOLET 0x04
#define COLOR_GREEN 0x05
#define COLOR_BLUE 0x06
#define COLOR_YELLOW 0x07
#define COLOR_ORANGE 0x08
#define COLOR_BROWN 0x09
#define COLOR_LIGHTRED 0x0A
#define COLOR_GRAY1 0x0B
#define COLOR_GRAY2 0x0C
#define COLOR_LIGHTGREEN 0x0D
#define COLOR_LIGHTBLUE 0x0E
#define COLOR_GRAY3 0x0F
#define CLOCKS_PER_SEC 50 // ???
#define CLK_TCK 50 // ?!?
#define TV_NTSC 0
#define TV_PAL 1
#define TV_OTHER 2
/* No support for dynamically loadable drivers */
#define DYN_DRV 0
/* The addresses of the static drivers */
extern void pce_stdjoy_joy[]; /* Referred to by joy_static_stddrv[] */
#define JOY_FIRE_B 5
#define JOY_START 6
#define JOY_SELECT 7
/* FIXME: not implemented */
void waitvblank (void);
/* Wait for the vertical blanking */
/* FIXME: not implemented */
unsigned char get_tv (void);
/* Return the video mode the machine is using. */
/* End of pce.h */
#endif
#define CH_ESC 8
#define CH_DEL 20
/* Color defines */
#define COLOR_BLACK 0x00
#define COLOR_WHITE 0x01
#define COLOR_RED 0x02
#define COLOR_CYAN 0x03
#define COLOR_VIOLET 0x04
#define COLOR_GREEN 0x05
#define COLOR_BLUE 0x06
#define COLOR_YELLOW 0x07
#define COLOR_ORANGE 0x08
#define COLOR_BROWN 0x09
#define COLOR_LIGHTRED 0x0A
#define COLOR_GRAY1 0x0B
#define COLOR_GRAY2 0x0C
#define COLOR_LIGHTGREEN 0x0D
#define COLOR_LIGHTBLUE 0x0E
#define COLOR_GRAY3 0x0F
#define JOY_FIRE_B 5
#define JOY_START 6
#define JOY_SELECT 7
/*
void __fastcall__ waitvblank(void);
unsigned char __fastcall__ cpeekcharxy(unsigned char x,unsigned char y);
unsigned char __fastcall__ cpeekchar(void);
unsigned char __fastcall__ cpeekcolxy(unsigned char x,unsigned char y);
unsigned char __fastcall__ cpeekcol(void);
*/

View File

@ -1,19 +1,17 @@
;
; Ullrich von Bassewitz, 06.08.1998
;
; CC65 runtime: call function via pointer in ax
;
.export callax
.export callax
.code
callax:
sta vec
stx vec+1
jmp (vec) ; jump there
sta vec
stx vec+1
jmp (vec) ; jump there
.bss
vec:
.res 2
.res 2

View File

@ -1,17 +1,15 @@
;
; Ullrich von Bassewitz, 21.09.1998
;
; clock_t clock (void);
;
.include "pcengine.inc"
.include "pce.inc"
.export _clock
.export _clock
.importzp sreg
.proc _clock
ldy #0 ; Byte 3 is always zero
.proc _clock
ldy #0 ; Byte 3 is always zero
sty sreg+1
sty sreg
@ -20,4 +18,3 @@
rts
.endproc

View File

@ -1,5 +1,5 @@
.include "pcengine.inc"
.include "pce.inc"
.export _clrscr
_clrscr:

View File

@ -1,59 +1,57 @@
;
; Ullrich von Bassewitz, 06.08.1998
;
; unsigned char __fastcall__ textcolor (unsigned char color);
; unsigned char __fastcall__ bgcolor (unsigned char color);
; unsigned char __fastcall__ bordercolor (unsigned char color);
;
.export _textcolor, _bgcolor, _bordercolor
.export _textcolor, _bgcolor, _bordercolor
.include "pcengine.inc"
.include "pce.inc"
_textcolor:
ldx CHARCOLOR ; get old value
sta CHARCOLOR ; set new value
txa
rts
ldx CHARCOLOR ; get old value
sta CHARCOLOR ; set new value
txa
rts
_bgcolor:
ldx BGCOLOR ; get old value
sta BGCOLOR ; set new value
asl a
tay
ldx BGCOLOR ; get old value
sta BGCOLOR ; set new value
asl a
tay
stz VCE_ADDR_LO
stz VCE_ADDR_HI
lda colors,y
sta VCE_DATA_LO
lda colors+1,y
sta VCE_DATA_HI
stz VCE_ADDR_LO
stz VCE_ADDR_HI
lda colors,y
sta VCE_DATA_LO
lda colors+1,y
sta VCE_DATA_HI
txa
rts
txa
rts
_bordercolor:
lda #0
txa
rts
lda #0
txa
rts
.export colors
.export colors
colors: ; G R B
.word ((0<<6)+(0<<3)+(0)) ; 0 black
.word ((7<<6)+(7<<3)+(7)) ; 1 white
.word ((0<<6)+(7<<3)+(0)) ; 2 red
.word ((7<<6)+(0<<3)+(7)) ; 3 cyan
.word ((0<<6)+(5<<3)+(7)) ; 4 violett
.word ((7<<6)+(0<<3)+(0)) ; 5 green
.word ((0<<6)+(0<<3)+(7)) ; 6 blue
.word ((7<<6)+(7<<3)+(0)) ; 7 yellow
.word ((5<<6)+(7<<3)+(0)) ; 8 orange
.word ((3<<6)+(4<<3)+(3)) ; 9 brown
.word ((4<<6)+(7<<3)+(4)) ; a light red
.word ((3<<6)+(3<<3)+(3)) ; b dark grey
.word ((4<<6)+(4<<3)+(4)) ; c middle grey
.word ((7<<6)+(4<<3)+(4)) ; d light green
.word ((4<<6)+(4<<3)+(7)) ; e light blue
.word ((6<<6)+(6<<3)+(6)) ; f light gray
colors: ; G R B
.word ((0<<6)+(0<<3)+(0)) ; 0 black
.word ((7<<6)+(7<<3)+(7)) ; 1 white
.word ((0<<6)+(7<<3)+(0)) ; 2 red
.word ((7<<6)+(0<<3)+(7)) ; 3 cyan
.word ((0<<6)+(5<<3)+(7)) ; 4 violett
.word ((7<<6)+(0<<3)+(0)) ; 5 green
.word ((0<<6)+(0<<3)+(7)) ; 6 blue
.word ((7<<6)+(7<<3)+(0)) ; 7 yellow
.word ((5<<6)+(7<<3)+(0)) ; 8 orange
.word ((3<<6)+(4<<3)+(3)) ; 9 brown
.word ((4<<6)+(7<<3)+(4)) ; a light red
.word ((3<<6)+(3<<3)+(3)) ; b dark grey
.word ((4<<6)+(4<<3)+(4)) ; c middle grey
.word ((7<<6)+(4<<3)+(4)) ; d light green
.word ((4<<6)+(4<<3)+(7)) ; e light blue
.word ((6<<6)+(6<<3)+(6)) ; f light gray

View File

@ -94,9 +94,3 @@ getbyt:
;;getbyt_:
lda $FFFF,y
rts
;; callax doesnt work? why?!
;_callax:
; sta @l+1
; stx @l+2
;@l: jmp $dead

View File

@ -1,122 +1,105 @@
.include "pcengine.inc"
.import vce_init
.import psg_init
.import vdc_init
.include "pce.inc"
.export initconio
.export _conio_init
.import vce_init
.import psg_init
.import vdc_init
.constructor initconio, 24
.export initconio
.export _conio_init
.macpack longbranch
.constructor initconio, 24
.macpack longbranch
initconio:
;; jsr vdc_init
jsr vce_init
jsr psg_init
jsr conio_init
jsr set_palette
;; jsr vdc_init
jsr vce_init
jsr psg_init
jsr conio_init
jsr set_palette
st0 #VDC_RCR
st1 #<$0088
st2 #>$0088
rts
st0 #VDC_RCR
st1 #<$0088
st2 #>$0088
rts
.import colors
.import colors
set_palette:
stz VCE_ADDR_LO
stz VCE_ADDR_HI
; Make palette (use VGA palette?)
; stz VCE_ADDR_LO
; stz VCE_ADDR_HI
; clx
; cly
vce_loop: ;; stx VCE_DATA_LO
;; sty VCE_DATA_HI
; inx
; cpx #$00
; bne vce_loop
; iny
; cpy #$02
; bne vce_loop
stz VCE_ADDR_LO
stz VCE_ADDR_HI
ldx #0
ldx #0
@lp:
.repeat 16
lda colors,x
sta VCE_DATA_LO
lda colors+1,x
sta VCE_DATA_HI
.endrepeat
.repeat 16
lda colors,x
sta VCE_DATA_LO
lda colors+1,x
sta VCE_DATA_HI
.endrepeat
inx
inx
cpx #16*2;*5
jne @lp
inx
inx
cpx #16*2
jne @lp
stz VCE_ADDR_LO
stz VCE_ADDR_HI
stz VCE_DATA_LO
stz VCE_DATA_HI
stz VCE_ADDR_LO
stz VCE_ADDR_HI
stz VCE_DATA_LO
stz VCE_DATA_HI
; so it will get linked in
; so it will get linked in
_conio_init:
rts
rts
;----------------------------------------------------------------------------
;
;----------------------------------------------------------------------------
.importzp ptr1
.importzp ptr1
conio_init:
; Load font
st0 #VDC_MAWR
st1 #<$2000
st2 #>$2000
; Load font
st0 #VDC_MAWR
st1 #<$2000
st2 #>$2000
; ptr to font data
lda #<font
sta ptr1
lda #>font
sta ptr1+1
; ptr to font data
lda #<font
sta ptr1
lda #>font
sta ptr1+1
st0 #VDC_VWR ; VWR
ldy #$80 ; 128 chars
charloop: ldx #$08 ; 8 bytes/char
lineloop:
lda (ptr1)
staio VDC_DATA_LO ; bitplane 0
stzio VDC_DATA_HI ; bitplane 1
st0 #VDC_VWR ; VWR
ldy #$80 ; 128 chars
charloop: ldx #$08 ; 8 bytes/char
lineloop:
;;lda [$00] ; read font byte
lda (ptr1)
staio VDC_DATA_LO ; bitplane 0
stzio VDC_DATA_HI ; bitplane 1
clc ; increment font pointer
lda ptr1
adc #$01
sta ptr1
lda ptr1+1
adc #$00
sta ptr1+1
dex
bne lineloop ; next bitplane 0 byte
ldx #$08 ; fill bitplane 2/3 with 0
fillloop: st1 #$00
st2 #$00
dex
bne fillloop ; next byte
dey
bne charloop ; next character
clc ; increment font pointer
lda ptr1
adc #$01
sta ptr1
lda ptr1+1
adc #$00
sta ptr1+1
dex
bne lineloop ; next bitplane 0 byte
ldx #$08 ; fill bitplane 2/3 with 0
fillloop: st1 #$00
st2 #$00
dex
bne fillloop ; next byte
dey
bne charloop ; next character
ldx #0
stx BGCOLOR
inx
stx CHARCOLOR
ldx #0
stx BGCOLOR
inx
stx CHARCOLOR
rts
rts
.rodata
font: .include "vga.inc"
.rodata
font:
.include "vga.inc"

View File

@ -1,81 +1,59 @@
;
; Ullrich von Bassewitz, 06.08.1998
;
; void cputcxy (unsigned char x, unsigned char y, char c);
; void cputc (char c);
;
.export _cputcxy, _cputc, cputdirect, putchar
.export newline, plot
.import popa, _gotoxy
.import PLOT
.importzp tmp3,tmp4
.include "pcengine.inc"
.export _cputcxy, _cputc, cputdirect, putchar
.export newline, plot
.import popa, _gotoxy
.import PLOT
.importzp tmp3,tmp4
.include "pce.inc"
_cputcxy:
pha ; Save C
jsr popa ; Get Y
jsr _gotoxy ; Set cursor, drop x
pla ; Restore C
pha ; Save C
jsr popa ; Get Y
jsr _gotoxy ; Set cursor, drop x
pla ; Restore C
; Plot a character - also used as internal function
_cputc: cmp #$0d ; CR?
bne L1
lda #0
sta CURS_X
beq plot ; Recalculate pointers
_cputc: cmp #$0d ; CR?
bne L1
lda #0
sta CURS_X
beq plot ; Recalculate pointers
L1: cmp #$0a ; LF?
beq newline ; Recalculate pointers
L1: cmp #$0a ; LF?
beq newline ; Recalculate pointers
; Printable char of some sort
cputdirect:
jsr putchar ; Write the character to the screen
jsr putchar ; Write the character to the screen
; Advance cursor position
advance:
ldy CURS_X
iny
cpy #xsize
bne L3
jsr newline ; new line
ldy #0 ; + cr
L3: sty CURS_X
jmp plot
;rts
ldy CURS_X
iny
cpy #xsize
bne L3
jsr newline ; new line
ldy #0 ; + cr
L3: sty CURS_X
jmp plot
newline:
; lda #xsize
; clc
; adc SCREEN_PTR
; sta SCREEN_PTR
; bcc L4
; inc SCREEN_PTR+1
;; clc
;L4:; lda #xsize
; adc CRAM_PTR
; sta CRAM_PTR
; bcc L5
; inc CRAM_PTR+1
;L5:
inc CURS_Y
; jmp plot
; rts
inc CURS_Y
; Set cursor position, calculate RAM pointers
plot: ldy CURS_X
ldx CURS_Y
clc
jmp PLOT ; Set the new cursor
plot: ldy CURS_X
ldx CURS_Y
clc
jmp PLOT ; Set the new cursor
@ -84,34 +62,32 @@ plot: ldy CURS_X
putchar:
ora RVS ; Set revers bit
ora RVS ; Set revers bit
tax
tax
st0 #VDC_MAWR ; Memory Adress Write
st0 #VDC_MAWR ; Memory Adress Write
lda SCREEN_PTR
staio VDC_DATA_LO
lda SCREEN_PTR
staio VDC_DATA_LO
lda SCREEN_PTR+1
staio VDC_DATA_HI
lda SCREEN_PTR+1
staio VDC_DATA_HI
st0 #VDC_VWR ; VWR
st0 #VDC_VWR ; VWR
txa
staio VDC_DATA_LO ; character
txa
staio VDC_DATA_LO ; character
;;st2 #$32 ; attrib ?!
lda CHARCOLOR
;;lda #2
asl a
asl a
asl a
asl a
lda CHARCOLOR
and #$f0
ora #$02
staio VDC_DATA_HI
asl a
asl a
asl a
asl a
rts
and #$f0
ora #$02
staio VDC_DATA_HI
rts

View File

@ -24,7 +24,7 @@
.import __DATA_LOAD__,__DATA_RUN__, __DATA_SIZE__ ; Linker generated
.import __BSS_SIZE__
.include "pcengine.inc"
.include "pce.inc"
.importzp sp
.importzp ptr1,ptr2
@ -84,10 +84,9 @@ start:
sta IRQ_MASK ; Interrupts off
stz IRQ_STATUS ; Acknowledge timer
;; i dont know why the heck this one doesnt
;; work when called from a constructor :/
.import vdc_init
jsr vdc_init
;; FIXME; i dont know why the heck this one doesnt work when called from a constructor :/
.import vdc_init
jsr vdc_init
;; jsr joy_init
@ -167,6 +166,7 @@ start:
jsr initlib
;; FIXME: this should be called from a constructor instead
.import initconio
jsr initconio

161
libsrc/pce/ctype.s Normal file
View File

@ -0,0 +1,161 @@
;
; Stefan Haubenthal with minor changes from Ullrich von Bassewitz, 2003-05-02
;
; Character specification table.
;
.include "ctype.inc"
; The tables are readonly, put them into the rodata segment
.rodata
; The following 256 byte wide table specifies attributes for the isxxx type
; of functions. Doing it by a table means some overhead in space, but it
; has major advantages:
;
; * It is fast. If it were'nt for the slow parameter passing of cc65, one
; could even define macros for the isxxx functions (this is usually
; done on other platforms).
;
; * It is highly portable. The only unportable part is the table itself,
; all real code goes into the common library.
;
; * We save some code in the isxxx functions.
__ctype:
.repeat 2
.byte CT_CTRL ; 0/00 ___ctrl_@___
.byte CT_CTRL ; 1/01 ___ctrl_A___
.byte CT_CTRL ; 2/02 ___ctrl_B___
.byte CT_CTRL ; 3/03 ___ctrl_C___
.byte CT_CTRL ; 4/04 ___ctrl_D___
.byte CT_CTRL ; 5/05 ___ctrl_E___
.byte CT_CTRL ; 6/06 ___ctrl_F___
.byte CT_CTRL ; 7/07 ___ctrl_G___
.byte CT_CTRL ; 8/08 ___ctrl_H___
.byte CT_CTRL | CT_OTHER_WS | CT_SPACE_TAB
; 9/09 ___ctrl_I___
.byte CT_CTRL | CT_OTHER_WS ; 10/0a ___ctrl_J___
.byte CT_CTRL | CT_OTHER_WS ; 11/0b ___ctrl_K___
.byte CT_CTRL | CT_OTHER_WS ; 12/0c ___ctrl_L___
.byte CT_CTRL | CT_OTHER_WS ; 13/0d ___ctrl_M___
.byte CT_CTRL ; 14/0e ___ctrl_N___
.byte CT_CTRL ; 15/0f ___ctrl_O___
.byte CT_CTRL ; 16/10 ___ctrl_P___
.byte CT_CTRL ; 17/11 ___ctrl_Q___
.byte CT_CTRL ; 18/12 ___ctrl_R___
.byte CT_CTRL ; 19/13 ___ctrl_S___
.byte CT_CTRL ; 20/14 ___ctrl_T___
.byte CT_CTRL ; 21/15 ___ctrl_U___
.byte CT_CTRL ; 22/16 ___ctrl_V___
.byte CT_CTRL ; 23/17 ___ctrl_W___
.byte CT_CTRL ; 24/18 ___ctrl_X___
.byte CT_CTRL ; 25/19 ___ctrl_Y___
.byte CT_CTRL ; 26/1a ___ctrl_Z___
.byte CT_CTRL ; 27/1b ___ctrl_[___
.byte CT_CTRL ; 28/1c ___ctrl_\___
.byte CT_CTRL ; 29/1d ___ctrl_]___
.byte CT_CTRL ; 30/1e ___ctrl_^___
.byte CT_CTRL ; 31/1f ___ctrl_____
.byte CT_SPACE | CT_SPACE_TAB ; 32/20 ___SPACE___
.byte CT_NONE ; 33/21 _____!_____
.byte CT_NONE ; 34/22 _____"_____
.byte CT_NONE ; 35/23 _____#_____
.byte CT_NONE ; 36/24 _____$_____
.byte CT_NONE ; 37/25 _____%_____
.byte CT_NONE ; 38/26 _____&_____
.byte CT_NONE ; 39/27 _____'_____
.byte CT_NONE ; 40/28 _____(_____
.byte CT_NONE ; 41/29 _____)_____
.byte CT_NONE ; 42/2a _____*_____
.byte CT_NONE ; 43/2b _____+_____
.byte CT_NONE ; 44/2c _____,_____
.byte CT_NONE ; 45/2d _____-_____
.byte CT_NONE ; 46/2e _____._____
.byte CT_NONE ; 47/2f _____/_____
.byte CT_DIGIT | CT_XDIGIT ; 48/30 _____0_____
.byte CT_DIGIT | CT_XDIGIT ; 49/31 _____1_____
.byte CT_DIGIT | CT_XDIGIT ; 50/32 _____2_____
.byte CT_DIGIT | CT_XDIGIT ; 51/33 _____3_____
.byte CT_DIGIT | CT_XDIGIT ; 52/34 _____4_____
.byte CT_DIGIT | CT_XDIGIT ; 53/35 _____5_____
.byte CT_DIGIT | CT_XDIGIT ; 54/36 _____6_____
.byte CT_DIGIT | CT_XDIGIT ; 55/37 _____7_____
.byte CT_DIGIT | CT_XDIGIT ; 56/38 _____8_____
.byte CT_DIGIT | CT_XDIGIT ; 57/39 _____9_____
.byte CT_NONE ; 58/3a _____:_____
.byte CT_NONE ; 59/3b _____;_____
.byte CT_NONE ; 60/3c _____<_____
.byte CT_NONE ; 61/3d _____=_____
.byte CT_NONE ; 62/3e _____>_____
.byte CT_NONE ; 63/3f _____?_____
.byte CT_NONE ; 64/40 _____@_____
.byte CT_UPPER | CT_XDIGIT ; 65/41 _____A_____
.byte CT_UPPER | CT_XDIGIT ; 66/42 _____B_____
.byte CT_UPPER | CT_XDIGIT ; 67/43 _____C_____
.byte CT_UPPER | CT_XDIGIT ; 68/44 _____D_____
.byte CT_UPPER | CT_XDIGIT ; 69/45 _____E_____
.byte CT_UPPER | CT_XDIGIT ; 70/46 _____F_____
.byte CT_UPPER ; 71/47 _____G_____
.byte CT_UPPER ; 72/48 _____H_____
.byte CT_UPPER ; 73/49 _____I_____
.byte CT_UPPER ; 74/4a _____J_____
.byte CT_UPPER ; 75/4b _____K_____
.byte CT_UPPER ; 76/4c _____L_____
.byte CT_UPPER ; 77/4d _____M_____
.byte CT_UPPER ; 78/4e _____N_____
.byte CT_UPPER ; 79/4f _____O_____
.byte CT_UPPER ; 80/50 _____P_____
.byte CT_UPPER ; 81/51 _____Q_____
.byte CT_UPPER ; 82/52 _____R_____
.byte CT_UPPER ; 83/53 _____S_____
.byte CT_UPPER ; 84/54 _____T_____
.byte CT_UPPER ; 85/55 _____U_____
.byte CT_UPPER ; 86/56 _____V_____
.byte CT_UPPER ; 87/57 _____W_____
.byte CT_UPPER ; 88/58 _____X_____
.byte CT_UPPER ; 89/59 _____Y_____
.byte CT_UPPER ; 90/5a _____Z_____
.byte CT_NONE ; 91/5b _____[_____
.byte CT_NONE ; 92/5c _____\_____
.byte CT_NONE ; 93/5d _____]_____
.byte CT_NONE ; 94/5e _____^_____
.byte CT_NONE ; 95/5f _UNDERLINE_
.byte CT_NONE ; 96/60 ___grave___
.byte CT_LOWER | CT_XDIGIT ; 97/61 _____a_____
.byte CT_LOWER | CT_XDIGIT ; 98/62 _____b_____
.byte CT_LOWER | CT_XDIGIT ; 99/63 _____c_____
.byte CT_LOWER | CT_XDIGIT ; 100/64 _____d_____
.byte CT_LOWER | CT_XDIGIT ; 101/65 _____e_____
.byte CT_LOWER | CT_XDIGIT ; 102/66 _____f_____
.byte CT_LOWER ; 103/67 _____g_____
.byte CT_LOWER ; 104/68 _____h_____
.byte CT_LOWER ; 105/69 _____i_____
.byte CT_LOWER ; 106/6a _____j_____
.byte CT_LOWER ; 107/6b _____k_____
.byte CT_LOWER ; 108/6c _____l_____
.byte CT_LOWER ; 109/6d _____m_____
.byte CT_LOWER ; 110/6e _____n_____
.byte CT_LOWER ; 111/6f _____o_____
.byte CT_LOWER ; 112/70 _____p_____
.byte CT_LOWER ; 113/71 _____q_____
.byte CT_LOWER ; 114/72 _____r_____
.byte CT_LOWER ; 115/73 _____s_____
.byte CT_LOWER ; 116/74 _____t_____
.byte CT_LOWER ; 117/75 _____u_____
.byte CT_LOWER ; 118/76 _____v_____
.byte CT_LOWER ; 119/77 _____w_____
.byte CT_LOWER ; 120/78 _____x_____
.byte CT_LOWER ; 121/79 _____y_____
.byte CT_LOWER ; 122/7a _____z_____
.byte CT_NONE ; 123/7b _____{_____
.byte CT_NONE ; 124/7c _____|_____
.byte CT_NONE ; 125/7d _____}_____
.byte CT_NONE ; 126/7e _____~_____
.byte CT_OTHER_WS ; 127/7f ____DEL____
.endrepeat

View File

@ -1,19 +1,16 @@
;
; Ullrich von Bassewitz, 06.08.1998
;
; void gotoxy (unsigned char x, unsigned char y);
;
.export _gotoxy
.import popa, plot
.export _gotoxy
.import popa, plot
.include "pcengine.inc"
.include "pce.inc"
_gotoxy:
sta CURS_Y ; Set Y
jsr popa ; Get X
sta CURS_X ; Set X
jmp plot ; Set the cursor position
sta CURS_Y ; Set Y
jsr popa ; Get X
sta CURS_X ; Set X
jmp plot ; Set the cursor position

162
libsrc/pce/joy/pce-stdjoy.s Normal file
View File

@ -0,0 +1,162 @@
;
; Standard joystick driver for the PCEngine
;
.include "joy-kernel.inc"
.include "joy-error.inc"
.macpack module
; ------------------------------------------------------------------------
; Header. Includes jump table
module_header _pce_stdjoy_joy
; Driver signature
.byte $6A, $6F, $79 ; "joy"
.byte JOY_API_VERSION ; Driver API version number
; Library reference
.addr $0000
; Button state masks (8 values)
;extern const unsigned char joy_masks[8];
.export _joy_masks
_joy_masks:
.byte $10 ; JOY_UP
.byte $40 ; JOY_DOWN
.byte $80 ; JOY_LEFT
.byte $20 ; JOY_RIGHT
.byte $02 ; JOY_FIRE A ; FIXME: is this correct?
.byte $01 ; JOY_FIRE B ; FIXME: is this correct?
.byte $04 ; JOY_START ; FIXME: is this correct?
.byte $08 ; JOY_SELECT ; FIXME: is this correct?
; Jump table.
.addr INSTALL
.addr UNINSTALL
.addr COUNT
.addr READJOY
.addr 0 ; IRQ entry unused
; ------------------------------------------------------------------------
; Constants
JOY_COUNT = 4 ; Number of joysticks we support
.code
; ------------------------------------------------------------------------
; INSTALL routine. Is called after the driver is loaded into memory. If
; possible, check if the hardware is present and determine the amount of
; memory available.
; Must return an JOY_ERR_xx code in a/x.
;
INSTALL:
lda #<JOY_ERR_OK
ldx #>JOY_ERR_OK
; rts ; Run into DEINSTALL instead
; ------------------------------------------------------------------------
; DEINSTALL routine. Is called before the driver is removed from memory.
; Can do cleanup or whatever. Must not return anything.
;
UNINSTALL:
rts
; ------------------------------------------------------------------------
; COUNT: Return the total number of available joysticks in a/x.
;
;unsigned char __fastcall__ joy_count (void);
COUNT:
lda #<JOY_COUNT
ldx #>JOY_COUNT
rts
; ------------------------------------------------------------------------
; READ: Read a particular joystick passed in A.
;
;unsigned char __fastcall__ joy_read (unsigned char joystick);
READJOY:
pha
jsr read_joy
pla
tax ; Joystick number into X
; return value from buffer
joy1:
lda padbuffer,x
ldx #0
rts
read_joy:
; reset multitap counter
lda #$01
sta $1000
pha
pla
nop
nop
lda #$03
sta $1000
pha
pla
nop
nop
cly
nextpad:
lda #$01
sta $1000 ; sel = 1
pha
pla
nop
nop
lda $1000
asl a
asl a
asl a
asl a
sta padbuffer, y ; store new value
stz $1000
pha
pla
nop
nop
lda $1000
and #$0F
ora padbuffer, y ; second half of new value
eor #$FF
sta padbuffer, y ; store new value
iny
cpy #$05
bcc nextpad
rts
.bss
padbuffer:
.res 4

View File

@ -0,0 +1,14 @@
;
; Address of the static standard joystick driver
;
; Oliver Schmidt, 2012-11-01
;
; const void joy_static_stddrv[];
;
.export _joy_static_stddrv
.import _pce_stdjoy_joy
.rodata
_joy_static_stddrv := _pce_stdjoy_joy

13
libsrc/pce/joy_stddrv.s Normal file
View File

@ -0,0 +1,13 @@
;
; Name of the standard joystick driver
;
; Oliver Schmidt, 2012-11-01
;
; const char joy_stddrv[];
;
.export _joy_stddrv
.rodata
_joy_stddrv: .asciiz "pce-stdjoy.joy"

View File

@ -1,275 +0,0 @@
;
; File generated by cc65 v 2.9.5
;
.fopt compiler,"cc65 v 2.9.5"
.autoimport on
.case on
.debuginfo off
.importzp sp, sreg, regsave, regbank, tmp1, ptr1, ptr2
.macpack longbranch
.import _joy_masks
.import _joy_read
.import _clock
.export _kbhit
.export _cgetc
.segment "DATA"
__lastkey:
.byte $00
__chardelay:
.dword $00000000
_rptkey:
.byte $00
; ---------------------------------------------------------------
; void _getkey (void)
; ---------------------------------------------------------------
.segment "CODE"
.proc __getkey
.segment "CODE"
jsr decsp2
ldx #$00
lda __lastkey
cmp #$00
jsr booleq
jeq L003F
lda #$00
jsr _joy_read
ldy #$01
sta (sp),y
ldx #$00
lda #$00
ldy #$00
sta (sp),y
ldy #$01
ldx #$00
lda (sp),y
jsr pushax
ldx #$00
lda _joy_masks+4
jsr tosandax
stx tmp1
ora tmp1
jeq L0010
ldx #$00
lda #$0A
ldy #$00
sta (sp),y
jmp L003A
L0010: ldy #$01
ldx #$00
lda (sp),y
jsr pushax
ldx #$00
lda _joy_masks
jsr tosandax
stx tmp1
ora tmp1
jeq L0016
ldx #$00
lda #$01
ldy #$00
sta (sp),y
jmp L003A
L0016: ldy #$01
ldx #$00
lda (sp),y
jsr pushax
ldx #$00
lda _joy_masks+2
jsr tosandax
stx tmp1
ora tmp1
jeq L001C
ldx #$00
lda #$03
ldy #$00
sta (sp),y
jmp L003A
L001C: ldy #$01
ldx #$00
lda (sp),y
jsr pushax
ldx #$00
lda _joy_masks+3
jsr tosandax
stx tmp1
ora tmp1
jeq L0022
ldx #$00
lda #$04
ldy #$00
sta (sp),y
jmp L003A
L0022: ldy #$01
ldx #$00
lda (sp),y
jsr pushax
ldx #$00
lda _joy_masks+1
jsr tosandax
stx tmp1
ora tmp1
jeq L0028
ldx #$00
lda #$02
ldy #$00
sta (sp),y
jmp L003A
L0028: ldy #$01
ldx #$00
lda (sp),y
jsr pushax
ldx #$00
lda _joy_masks+7
jsr tosandax
stx tmp1
ora tmp1
jeq L002E
ldx #$00
lda #$14
ldy #$00
sta (sp),y
jmp L003A
L002E: ldy #$01
ldx #$00
lda (sp),y
jsr pushax
ldx #$00
lda _joy_masks+5
jsr tosandax
stx tmp1
ora tmp1
jeq L0034
ldx #$00
lda #$15
ldy #$00
sta (sp),y
jmp L003A
L0034: ldy #$01
ldx #$00
lda (sp),y
jsr pushax
ldx #$00
lda _joy_masks+6
jsr tosandax
stx tmp1
ora tmp1
jeq L003A
ldx #$00
lda #$16
ldy #$00
sta (sp),y
L003A: ldy #$00
ldx #$00
lda (sp),y
cmp #$00
jsr boolne
jeq L003F
ldy #$00
ldx #$00
lda (sp),y
jsr pushax
ldx #$00
lda _rptkey
jsr toseqax
jeq L0043
lda __chardelay+3
sta sreg+1
lda __chardelay+2
sta sreg
ldx __chardelay+1
lda __chardelay
jsr pusheax
jsr _clock
jsr tosugteax
jeq L0043
jmp L003F
L0043: ldy #$00
ldx #$00
lda (sp),y
sta _rptkey
jsr _clock
ldy #$06
jsr inceaxy
sta __chardelay
stx __chardelay+1
ldy sreg
sty __chardelay+2
ldy sreg+1
sty __chardelay+3
ldy #$00
ldx #$00
lda (sp),y
sta __lastkey
L003F: jsr incsp2
rts
.endproc
; ---------------------------------------------------------------
; unsigned char __fastcall__ kbhit (void)
; ---------------------------------------------------------------
.segment "CODE"
.proc _kbhit
.segment "CODE"
jsr __getkey
ldx #$00
lda __lastkey
cmp #$00
jsr booleq
jeq L004E
ldx #$00
lda #$00
jmp L0052
jmp L0052
L004E: ldx #$00
lda #$01
jmp L0052
L0052: rts
.endproc
; ---------------------------------------------------------------
; unsigned char __fastcall__ cgetc (void)
; ---------------------------------------------------------------
.segment "CODE"
.proc _cgetc
.segment "CODE"
jsr decsp1
L0056: ldx #$00
lda __lastkey
cmp #$00
jsr booleq
jeq L0057
jsr __getkey
jmp L0056
L0057: ldx #$00
lda __lastkey
ldy #$00
sta (sp),y
ldx #$00
lda #$00
sta __lastkey
ldy #$00
ldx #$00
lda (sp),y
jmp L0055
L0055: jsr incsp1
rts
.endproc

View File

@ -1,41 +1,32 @@
.export PLOT
.export PLOT
.include "pcengine.inc"
.include "pce.inc"
PLOT:
bcs @getpos
bcs @getpos
tya
clc
adc _plotlo,x
sta SCREEN_PTR
lda _plothi,x
adc #0
sta SCREEN_PTR+1
;clc
;adc _colplot,x
;sta CRAM_PTR
;lda #$23
;sta CRAM_PTR+1
tya
clc
adc _plotlo,x
sta SCREEN_PTR
lda _plothi,x
adc #0
sta SCREEN_PTR+1
@getpos:
ldx CURS_Y
ldy CURS_X
rts
ldx CURS_Y
ldy CURS_X
rts
_plotlo:
.repeat screenrows,line
.byte <($0000+(line*$80))
.endrepeat
.repeat screenrows,line
.byte <($0000+(line*$80))
.endrepeat
_plothi:
.repeat screenrows,line
.byte >($0000+(line*$80))
.endrepeat
.repeat screenrows,line
.byte >($0000+(line*$80))
.endrepeat

8
libsrc/pce/libref.s Normal file
View File

@ -0,0 +1,8 @@
;
; Oliver Schmidt, 2013-05-31
;
.export joy_libref
.import _exit
joy_libref := _exit

View File

@ -1,191 +0,0 @@
;
; Standard joystick driver for the PCEngine
;
; Ullrich von Bassewitz, 2002-12-20
;
;;.include "zeropage.inc"
;;.include "joy-kernel.inc"
;;.include "joy-error.inc"
JOY_ERR_OK=0;
.include "pcengine.inc"
.macpack generic
; ------------------------------------------------------------------------
; Header. Includes jump table
.segment "CODE"
; Driver signature
;; .byte $6A, $6F, $79 ; "joy"
;; .byte $00 ; Driver API version number
; Button state masks (8 values)
;extern const unsigned char joy_masks[8];
.export _joy_masks
_joy_masks:
.byte $10 ; JOY_UP
.byte $40 ; JOY_DOWN
.byte $80 ; JOY_LEFT
.byte $20 ; JOY_RIGHT
.byte $04 ; ? JOY_FIRE
.byte $02 ; ? Future expansion
.byte $01 ; ? Future expansion
.byte $08 ; ? Future expansion
; Jump table.
;; .word INSTALL
;; .word DEINSTALL
;; .word COUNT
;; .word READ
; ------------------------------------------------------------------------
; Constants
JOY_COUNT = 4 ; Number of joysticks we support
; ------------------------------------------------------------------------
; Data.
.code
;extern const char joy_stddrv[];
.export _joy_stddrv
_joy_stddrv:
.byte 0
.export _joy_load_driver
.export _joy_unload
;unsigned char __fastcall__ joy_unload (void);
;unsigned char __fastcall__ joy_load_driver (const char* driver);
_joy_load_driver:
_joy_unload:
; ------------------------------------------------------------------------
; INSTALL routine. Is called after the driver is loaded into memory. If
; possible, check if the hardware is present and determine the amount of
; memory available.
; Must return an JOY_ERR_xx code in a/x.
;
INSTALL:
lda #<JOY_ERR_OK
ldx #>JOY_ERR_OK
; rts ; Run into DEINSTALL instead
; ------------------------------------------------------------------------
; DEINSTALL routine. Is called before the driver is removed from memory.
; Can do cleanup or whatever. Must not return anything.
;
DEINSTALL:
rts
; ------------------------------------------------------------------------
; COUNT: Return the total number of available joysticks in a/x.
;
;unsigned char __fastcall__ joy_count (void);
.export _joy_count
_joy_count:
COUNT:
lda #<JOY_COUNT
ldx #>JOY_COUNT
rts
; ------------------------------------------------------------------------
; READ: Read a particular joystick passed in A.
;
;unsigned char __fastcall__ joy_read (unsigned char joystick);
.export _joy_read
_joy_read:
READ:
pha
jsr read_joy
pla
tax ; Joystick number into X
; return value from buffer
joy1:
lda padbuffer,x
ldx #0
rts
.code
read_joy:
; reset multitap counter
lda #$01
sta $1000
pha
pla
nop
nop
lda #$03
sta $1000
pha
pla
nop
nop
cly
nextpad:
lda #$01
sta $1000 ; sel = 1
pha
pla
nop
nop
lda $1000
asl a
asl a
asl a
asl a
sta padbuffer, y ; store new value
stz $1000
pha
pla
nop
nop
lda $1000
and #$0F
ora padbuffer, y ; second half of new value
eor #$FF
sta padbuffer, y ; store new value
iny
cpy #$05
bcc nextpad
rts
.bss
padbuffer:
.res 4

View File

@ -1,29 +1,29 @@
.include "pcengine.inc"
.export psg_init
.include "pce.inc"
.export psg_init
psg_init:
clx
stx $0800 ; Select channel
clx
stx $0800 ; Select channel
psg_clear_loop:
stz $0801 ; Clear global balance
stz $0802 ; Clear frequency LSB
stz $0803 ; Clear frequency MSB
stz $0804 ; Clear volume
stz $0805 ; Clear balance
stz $0807 ; Clear noise control
stz $0808 ; Clear LFO frequency
stz $0809 ; Clear LFO control
stz $0801 ; Clear global balance
stz $0802 ; Clear frequency LSB
stz $0803 ; Clear frequency MSB
stz $0804 ; Clear volume
stz $0805 ; Clear balance
stz $0807 ; Clear noise control
stz $0808 ; Clear LFO frequency
stz $0809 ; Clear LFO control
cly
cly
psg_clear_waveform: stz $0806 ; Clear waveform byte
iny
cpy #$20
bne psg_clear_waveform
iny
cpy #$20
bne psg_clear_waveform
inx
cpx #$06
bne psg_clear_loop
rts
inx
cpx #$06
bne psg_clear_loop
rts

31
libsrc/pce/readme.txt Normal file
View File

@ -0,0 +1,31 @@
joystick support should get verified on real hw, the masks for buttons may be
wrong.
clock() does not work for unknown reasons
get_tv() is a dummy function and always returns 0
revers() is a dummy function, actual reverse output is not supported yet
waitvblank() is missing
some graphical petscii chars should get added to the charset
conio-init should get initialized from a constructor rather than always get
called from crt0
--------------------------------------------------------------------------------
a good emulator to use for PC-Engine is "mednafen" (mednafen.sourceforge.net)
run the compiled binary like this:
> mednafen -force_module pce <yourprogram.pce>
joypad keys are mapped like this:
w/s/a/d up/down/left/right
numpad 2 (?) button
numpad 3 (?) button
enter (start) button

View File

@ -1,5 +1,5 @@
.export _revers
.export _revers
_revers:
lda #0
rts
lda #0
rts

View File

@ -1,5 +1,5 @@
.include "pcengine.inc"
.include "pce.inc"
.export vce_init

View File

@ -1,5 +1,5 @@
.include "pcengine.inc"
.include "pce.inc"
HIRES = 1

View File

@ -1,10 +0,0 @@
#include <conio.h>
void main(void)
{
clrscr();
// cprintf("hello world");
cputs("hello world");
for(;;);
}

58
testcode/lib/pce/conio.c Normal file
View File

@ -0,0 +1,58 @@
#include <conio.h>
#include <time.h>
#include <joystick.h>
static int datavar = 10;
void main(void)
{
int stackvar = 42;
int i, j;
joy_install(&joy_static_stddrv);
clrscr();
cputs("hello world");
cputsxy(0, 2, "colors:" );
for (i = 0; i < 16; ++i) {
textcolor(i);
cputc('X');
}
textcolor(1);
gotoxy(0,4);
cprintf("datavar: %02x\n\r", datavar);
cprintf("stackvar: %02x\n\r", stackvar);
j = joy_count();
gotoxy(0,10);
cprintf("Found %d Joysticks.", j);
for(;;)
{
gotoxy(13,4);
cprintf("%02x", datavar);
gotoxy(13,5);
cprintf("%02x", stackvar);
++datavar; ++stackvar;
gotoxy(0,8);
cprintf("clock: %08x", clock());
for (i = 0; i < 4; ++i)
{
gotoxy(0, 12 + i);
j = joy_read (i);
cprintf ("pad %d: %02x %-6s%-6s%-6s%-6s%-6s%-6s",
i, j,
(j & joy_masks[JOY_UP])? " up " : " ---- ",
(j & joy_masks[JOY_DOWN])? " down " : " ---- ",
(j & joy_masks[JOY_LEFT])? " left " : " ---- ",
(j & joy_masks[JOY_RIGHT])? "right " : " ---- ",
(j & joy_masks[JOY_FIRE])? " fire " : " ---- ",
(j & joy_masks[JOY_FIRE2])? "fire2 " : " ---- ");
}
}
for(;;);
}