conio and most other stuff working now

This commit is contained in:
mrdudz 2015-11-29 01:14:59 +01:00
parent 88e7b5776a
commit 9fbf8a4299
35 changed files with 2205 additions and 737 deletions

View file

@ -1,43 +1,70 @@
; gamate symbols ;-------------------------------------------------------------------------------
; gamate.inc
;
; Gamate system specific definitions
;
; (w) 2015 Groepaz/Hitmen (groepaz@gmx.net)
; based on technical reference by PeT (mess@utanet.at)
;-------------------------------------------------------------------------------
;.p02 ; look at gamate.h for comments, they are not duplicated here
LCD_WIDTH = 160 AUDIO_BASE = $4000
LCD_HEIGHT = 152
lcd_base = $5000 JOY_DATA = $4400
lcd_mode = $5001
lcd_mode_y_increment = $40
lcd_x_pos = $5002
lcd_x_pos_plane2_flag =$80
lcd_y_pos = $5003
lcd_x = $5004
lcd_y = $5005
lcd_read = $5006
lcd_data = $5007
audio_base =$4000 JOY_DATA_UP = $01
JOY_DATA_DOWN = $02
JOY_DATA_LEFT = $04
JOY_DATA_RIGHT = $08
JOY_DATA_FIRE_A = $10
JOY_DATA_FIRE_B = $20
JOY_DATA_START = $40
JOY_DATA_SELECT = $80
controls = $4400 LCD_WIDTH = 160
; active low LCD_HEIGHT = 152
up=1
down=2
left=4
right=8
button_a=$10
button_b=$20
start=$40
select=$80
cart_main = $6020 LCD_BASE = $5000
;cart_nmi = $6023 LCD_MODE = $5001
cart_irq = $6026 ; 135 hz LCD_XPOS = $5002
cart_font = $6029 LCD_YPOS = $5003
LCD_X = $5004
LCD_Y = $5005
LCD_READ = $5006
LCD_DATA = $5007
nmi_enable = $c LCD_MODE_INC_X = $00
nmi_4800 = $a LCD_MODE_INC_Y = $40
LCD_XPOS_PLANE1 = $00
LCD_XPOS_PLANE2 = $80
_f009 = $f009 ; wait 1/60s ; constants for the conio implementation
_f00c = $f00c ; install font charsperline = (LCD_WIDTH / 8)
_f012 = $f012 ; write screen screenrows = (LCD_HEIGHT / 8)
CH_HLINE = 1
CH_VLINE = 2
COLOR_WHITE = 0
COLOR_GREY2 = 1
COLOR_GREY1 = 2
COLOR_BLACK = 3
;-------------------------------------------------------------------------------
; bios zp usage:
;
; 06/07 address of character set bitplane 1
; 08/09 address of character set bitplane 2
; 0a nmi $4800 echo
; 0b irq counter
; 0c nmi call cart nmi
; 0e/0f/10/11 big endian irq counter
; 15/16/17 ?/xpos/ypos
;
; e8 nmi reset to $ff
;
ZP_NMI_4800 = $0a
ZP_NMI_ENABLE = $0c

View file

@ -1,41 +1,39 @@
# c version of 32kbyte config file # linker config to produce simple Gamate cartridge (.bin)
# .data located in rom
# ld65 config file
# ld65 --config gamate.cfg -o <prog>.bin <prog>.o
SYMBOLS { SYMBOLS {
__STARTUP__: type = import; __STARTUP__: type = import;
__STACKSIZE__: type = weak, value = $0300; # 3 pages stack __STACKSIZE__: type = weak, value = $0080; # 1 page stack
} }
MEMORY { MEMORY {
ZP: start = $0000, size = $100; # 0000-03ff is RAM
CPUSTACK: start = $0100, size =$100; # FIXME: what zp range can we actually use?
RAM: start = $0200, size = $200, define = yes; ZP: start = $0080, size = $80;
# ROM: start = $6000, size = $8000, fill = yes, fillval = $ff, file = %O, define = yes; CPUSTACK: start = $0100, size =$100;
# STARTUP: file = %O, define = yes, start = $6000, size = $29, fill = yes; RAM: start = $0200, size = $180, define = yes;
# ROM: start = $6000 + __STARTUP_SIZE__, size = $8000 - __STARTUP_SIZE__, fill = yes, fillval = $ff, file = %O, define = yes;
# WARNING: fill value must be $00 else it will no more work # 6000-e000 can be (Cartridge) ROM
ROM: start = $6000, size = $8000, fill = yes, fillval = $00, file = %O, define = yes; # WARNING: fill value must be $00 else it will no more work
#ROM: start = $6000, size = $1000, fill = yes, fillval = $00, file = %O, define = yes;
#ROMFILL: start = $7000, size = $7000, fill = yes, fillval = $00, file = %O, define = yes;
# for images that have code >$6fff we must calculate the checksum!
ROM: start = $6000, size = $8000, fill = yes, fillval = $00, file = %O, define = yes;
} }
SEGMENTS { SEGMENTS {
ZEROPAGE: load = ZP, type = zp, define = yes; ZEROPAGE: load = ZP, type = zp, define = yes;
STARTUP: load = ROM, type = ro, define=yes; EXTZP: load = ZP, type = zp, define = yes, optional = yes;
CODE: load = ROM, type = ro, define=yes; APPZP: load = ZP, type = zp, define = yes, optional = yes;
RODATA: load = ROM, type = ro, define=yes; STARTUP: load = ROM, type = ro, define=yes;
DATA: load = ROM, run=RAM, type = rw, define = yes; INIT: load = ROM, type = ro, define = yes, optional = yes;
BSS: load = RAM, type = bss, define = yes; CODE: load = ROM, type = ro, define=yes;
RODATA: load = ROM, type = ro, define=yes;
DATA: load = ROM, run=RAM, type = rw, define = yes;
BSS: load = RAM, type = bss, define = yes;
} }
FEATURES { FEATURES {
CONDES: segment = RODATA, CONDES: segment = RODATA, type = constructor, label = __CONSTRUCTOR_TABLE__, count = __CONSTRUCTOR_COUNT__;
type = constructor, CONDES: segment = RODATA, type = destructor, label = __DESTRUCTOR_TABLE__, count = __DESTRUCTOR_COUNT__;
label = __CONSTRUCTOR_TABLE__, CONDES: segment = RODATA, type = interruptor, label = __INTERRUPTOR_TABLE__, count = __INTERRUPTOR_COUNT__, import = __CALLIRQ__;
count = __CONSTRUCTOR_COUNT__;
CONDES: segment = RODATA,
type = destructor,
label = __DESTRUCTOR_TABLE__,
count = __DESTRUCTOR_COUNT__;
} }

View file

@ -6,8 +6,8 @@
/* */ /* */
/* */ /* */
/* */ /* */
/* (C) 2015 Groepaz/Hitmen */ /* (w) 2015 Groepaz/Hitmen (groepaz@gmx.net) */
/* */ /* based on technical reference by PeT (mess@utanet.at) */
/* */ /* */
/* This software is provided 'as-is', without any expressed or implied */ /* This software is provided 'as-is', without any expressed or implied */
/* warranty. In no event will the authors be held liable for any damages */ /* warranty. In no event will the authors be held liable for any damages */
@ -36,7 +36,143 @@
# error This module may only be used when compiling for the Gamate! # error This module may only be used when compiling for the Gamate!
#endif #endif
#define AUDIO_BASE 0x4000
/*
base clock cpu clock/32 ?
0/1: 1. channel(right): 12 bit frequency: right frequency 0 nothing, 1 high; 3 23khz; 4 17,3; 10 6,9; 15 4.6; $60 720hz; $eff 18,0; $fff 16,9 hz)
(delay clock/32)
2/3: 2. channel(left): 12 bit frequency
4/5: 3. channel(both): 12 bit frequency
6: 0..5 noise frequency 0 fast 1f slow (about 500us) 15.6ns--> clock/32 counts
7 control (hinibble right)
bit 0: right channel high (full cycle, else square pulse/tone)
bit 1: left channel high
bit 2: both channel high
bit 3: set right tone (else noise)
bit 4: set left channel normal
bit 5: set both normal
bits 30: 11 high, 10 square, 01 noise, 00 noise only when square high
noise means switches channel to ad converter based noise algorithmen
(white noise shift register 17bit wide, repeats after about 130000 cycles)
probably out=!bit16, bit0=bit16 xor bit13; runs through, so start value anything than 0
8: 1st volume: 0..3 square volume; bit 4 envelope (higher priority)
9: 2nd volume
10: 3rd volume
11/12: envelope delay time 0 fast, 0xffff slow/nearly no effect (2 22us, 4 56us)
frequency $800, envelope $10 2 times in pulse high time (4*16*16)
13: envelope control
0-3 one time falling
4-7 one time rising
8 falling
9 one time falling
a starts with down falling, rising; same falling time, but double/longer cycle
b one time falling, on
c rising
d one time rising, on
e rising, falling (double cycle before restart)
f one time rising
bit 0: once only
bit 1: full tone
bit 2: start rising (else falling)
bit 3:
*/
#define JOY_DATA 0x4400
#define JOY_DATA_UP 0x01
#define JOY_DATA_DOWN 0x02
#define JOY_DATA_LEFT 0x04
#define JOY_DATA_RIGHT 0x08
#define JOY_DATA_FIRE_A 0x10
#define JOY_DATA_FIRE_B 0x20
#define JOY_DATA_START 0x40
#define JOY_DATA_SELECT 0x80
/* LCD
resolution 160x152 in 4 greys/greens
2 256x256 sized bitplanes (2x 8kbyte ram)
*/
#define LCD_BASE 0x5000
#define LCD_MODE 0x5001
/*
bit 3..0 (from zeropage 15)
bit 0 set no normal screen display, seldom scrolling effects on screen;
bytes written to somewhat actual display refresh position!?
bytes read "random"
bit 1,2,3 no effect
bit 4 swaps plane intensity
bit 5 ? display effect
bit 6 on y auto increment (else auto x increment), reading
bit 7 ? lcd flickering
*/
#define LCD_MODE_INC_Y 0x40
#define LCD_XPOS 0x5002 /* smooth scrolling X */
#define LCD_YPOS 0x5003 /* smooth scrolling Y */
/*
smooth scrolling until $c8 with 200 limit
after 200 display if ((value & 0xf) < 8) display of (value & 0xf) - 8
chaos lines from value + current line from plane 2 only then lines starting
with zero (problematic 200 limit/overrun implementation!?)
*/
#define LCD_X 0x5004 /* x-addr */
/*
bit 5,6 no effect
bit 7 0 1st/1 2nd bitplane
*/
#define LCD_XPOS_PLANE1 0x00
#define LCD_XPOS_PLANE2 0x80
#define LCD_Y 0x5005 /* y-addr */
#define LCD_READ 0x5006 /* read from RAM (no auto inc?) */
#define LCD_DATA 0x5007 /* write to RAM */
/* constants for the conio implementation */
#define COLOR_BLACK 0x03
#define COLOR_WHITE 0x00
#define CH_HLINE 1
#define CH_VLINE 2
#define CH_CROSS 3
#define CH_ULCORNER 4
#define CH_URCORNER 5
#define CH_LLCORNER 6
#define CH_LRCORNER 7
#define CH_TTEE 8
#define CH_BTEE 9
#define CH_RTEE 11
#define CH_LTEE 12
#define CH_ENTER 13
#define CH_PI 18
#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 gamate_stdjoy_joy[]; /* Referred to by joy_static_stddrv[] */
#define JOY_FIRE_B 5
#define JOY_START 6
#define JOY_SELECT 7
void waitvblank (void);
/* Wait for the vertical blanking */
/* NOTE: all Gamate are "NTSC" */
#define get_tv() TV_NTSC
/* Return the video mode the machine is using. */
/* End of gamate.h */ /* End of gamate.h */
#endif #endif

16
libsrc/gamate/_scrsize.s Normal file
View file

@ -0,0 +1,16 @@
;
; Screen size variables
;
.include "gamate.inc"
.export screensize
screensize:
ldx xsize
ldy ysize
rts
.rodata
.export xsize, ysize
xsize: .byte charsperline
ysize: .byte screenrows

32
libsrc/gamate/chline.s Normal file
View file

@ -0,0 +1,32 @@
;
; Ullrich von Bassewitz, 08.08.1998
;
; void chlinexy (unsigned char x, unsigned char y, unsigned char length);
; void chline (unsigned char length);
;
.export _chlinexy, _chline
.import popa, _gotoxy, cputdirect
.importzp tmp1
.include "gamate.inc"
_chlinexy:
pha ; Save the length
jsr popa ; Get y
jsr _gotoxy ; Call this one, will pop params
pla ; Restore the length
_chline:
cmp #0 ; Is the length zero?
beq L9 ; Jump if done
sta tmp1
L1: lda #CH_HLINE ; Horizontal line, screen code
jsr cputdirect ; Direct output
dec tmp1
bne L1
L9: rts

33
libsrc/gamate/clock.s Normal file
View file

@ -0,0 +1,33 @@
;
; clock_t clock (void);
;
.include "gamate.inc"
.include "extzp.inc"
.export _clock
.forceimport ticktock
.importzp sreg
.constructor initclock
.proc _clock
lda tickcount+3
sta sreg+1
lda tickcount+2
sta sreg
ldx tickcount+1
lda tickcount
rts
.endproc
.segment "INIT"
initclock:
lda #0
ldx #3
@lp: sta tickcount,x
dex
bpl @lp
rts

35
libsrc/gamate/clrscr.s Normal file
View file

@ -0,0 +1,35 @@
.include "gamate.inc"
.include "extzp.inc"
.import plot
.export _clrscr
_clrscr:
ldy #$0
rowloop:
sty LCD_X
lda #0
sta LCD_Y
ldx #$0
colloop:
sta LCD_DATA
inx
bne colloop
iny
bne rowloop
; Go to the home position.
sta CURS_X
sta CURS_Y
jmp plot
;-------------------------------------------------------------------------------
; force the init constructor to be imported
.import initconio
conio_init = initconio

34
libsrc/gamate/color.s Normal file
View file

@ -0,0 +1,34 @@
;
; 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
.include "gamate.inc"
.include "extzp.inc"
_textcolor:
ldx CHARCOLOR ; get old value
sta CHARCOLOR ; set new value
txa
rts
_bgcolor:
ldx BGCOLOR ; get old value
sta BGCOLOR ; set new value
txa
rts
_bordercolor:
lda #0
tax
rts
;-------------------------------------------------------------------------------
; force the init constructor to be imported
.import initconio
conio_init = initconio

31
libsrc/gamate/conio.s Normal file
View file

@ -0,0 +1,31 @@
.include "gamate.inc"
.include "extzp.inc"
.import colors
.importzp ptr1, tmp1
.constructor initconio
.macpack longbranch
.segment "INIT"
initconio:
; FIXME
lda #0
sta LCD_XPOS
sta LCD_YPOS
lda #LCD_MODE_INC_Y
sta LCD_MODE
lda #COLOR_BLACK
sta CHARCOLOR
lda #COLOR_WHITE
sta BGCOLOR
rts
.segment "RODATA"
.export fontdata
fontdata:
.include "vga.inc"

153
libsrc/gamate/cputc.s Normal file
View file

@ -0,0 +1,153 @@
;
; 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
.import xsize
.import fontdata
.import _plotlo
.importzp tmp3,tmp4
.importzp ptr3
.include "gamate.inc"
.include "extzp.inc"
_cputcxy:
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
L1: cmp #$0a ; LF?
beq newline ; Recalculate pointers
; Printable char of some sort
cputdirect:
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
newline:
inc CURS_Y
; Set cursor position, calculate RAM pointers
plot: ldy CURS_X
ldx CURS_Y
clc
jmp PLOT ; Set the new cursor
; Write one character to the screen without doing anything else, return X
; position in Y
putchar:
; FIXME
; ora RVS ; Set revers bit
; sty temp_y
; stx temp_x
; sta temp_a
; lda temp_a
sta ptr3
txa
pha
lda #0
sta ptr3+1
; * 8
asl ptr3
rol ptr3+1
asl ptr3
rol ptr3+1
asl ptr3
rol ptr3+1
lda ptr3
clc
adc #<(fontdata-$f8)
sta ptr3
lda ptr3+1
adc #>(fontdata-$f8)
sta ptr3+1
lda CHARCOLOR
and #1
beq @skip_plane1
lda #LCD_XPOS_PLANE1
clc
adc CURS_X
sta LCD_X
ldy #$f8
@copylp1:
lda (ptr3),y
eor RVS
sta LCD_DATA
iny
bne @copylp1
@skip_plane1:
lda CHARCOLOR
and #2
beq @skip_plane2
lda #LCD_XPOS_PLANE2
clc
adc CURS_X
sta LCD_X
ldx CURS_Y
lda _plotlo,x
sta LCD_Y
ldy #$f8
@copylp2:
lda (ptr3),y
eor RVS
sta LCD_DATA
iny
bne @copylp2
@skip_plane2:
pla
tax
ldy CURS_X
rts
;-------------------------------------------------------------------------------
; force the init constructor to be imported
.import initconio
conio_init = initconio

View file

@ -1,16 +1,78 @@
.export __STARTUP__ : absolute = 1 ; Mark as startup .export __STARTUP__ : absolute = 1 ; Mark as startup
.import reset, irq, nmi ; FIXME .import initlib, donelib, callmain
.import push0, _main, zerobss, copydata
.import IRQStub
; Linker generated symbols
.import __RAM_START__, __RAM_SIZE__
.import __ROM_START__, __ROM_SIZE__
.import __STARTUP_LOAD__,__STARTUP_RUN__, __STARTUP_SIZE__
.import __CODE_LOAD__,__CODE_RUN__, __CODE_SIZE__
.import __RODATA_LOAD__,__RODATA_RUN__, __RODATA_SIZE__
.include "zeropage.inc"
.include "gamate.inc"
.segment "STARTUP" .segment "STARTUP"
checksum: .word 0 ; +00 checksum from 7000-7fff (simple 8bit adds)
.word 0 .byte 1, 0, 1 ; +02 flags
.byte 1, 0, 1 .byte "COPYRIGHT BIT CORPORATION", 0, $ff ; +05 copyright
.byte "COPYRIGHT BIT CORPORATION", 0, $ff ; system vectors
jmp reset jmp reset ; +20 reset entry
jmp nmi jmp nmi ; +23 nmi entry
jmp irq jmp IRQStub ; +26 irq entry (135 hz)
;-------------------------------------------------------------------------------
reset:
; setup the CPU and System-IRQ
; Initialize CPU
sei
cld
; Setup stack and memory mapping
ldx #$FF ; Stack top ($01FF)
txs
; Clear the BSS data
jsr zerobss
; Copy the .data segment to RAM
jsr copydata
; setup the stack
lda #<(__RAM_START__+__RAM_SIZE__)
sta sp
lda #>(__RAM_START__+__RAM_SIZE__)
sta sp + 1
; Call module constructors
jsr initlib
cli ; allow IRQ only after constructors have run
; Pass an empty command line
jsr push0 ; argc
jsr push0 ; argv
ldy #4 ; Argument size
jsr _main ; call the users code
; Call module destructors. This is also the _exit entry.
_exit:
jsr donelib ; Run module destructors
; reset (start over)
jmp reset
.export initmainargs
initmainargs:
rts
;-------------------------------------------------------------------------------
nmi:
rts

161
libsrc/gamate/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

32
libsrc/gamate/cvline.s Normal file
View file

@ -0,0 +1,32 @@
;
; Ullrich von Bassewitz, 08.08.1998
;
; void cvlinexy (unsigned char x, unsigned char y, unsigned char length);
; void cvline (unsigned char length);
;
.export _cvlinexy, _cvline
.import popa, _gotoxy, putchar, newline
.importzp tmp1
.include "gamate.inc"
_cvlinexy:
pha ; Save the length
jsr popa ; Get y
jsr _gotoxy ; Call this one, will pop params
pla ; Restore the length and run into _cvline
_cvline:
cmp #0 ; Is the length zero?
beq L9 ; Jump if done
sta tmp1
L1: lda #CH_VLINE ; Vertical bar
jsr putchar ; Write, no cursor advance
jsr newline ; Advance cursor to next line
dec tmp1
bne L1
L9: rts

16
libsrc/gamate/extzp.inc Normal file
View file

@ -0,0 +1,16 @@
;
; extzp.inc for the Gamate
;
; Groepaz/Hitmen, 2015-11-19
;
; Assembler include file that imports the runtime zero page locations used
; by the Gamate runtime, ready for usage in asm code.
;
.global CURS_X: zp
.global CURS_Y: zp
.global CHARCOLOR: zp
.global RVS: zp
.global BGCOLOR: zp
.global tickcount: zp

16
libsrc/gamate/extzp.s Normal file
View file

@ -0,0 +1,16 @@
;
; Groepaz/Hitmen, 2015-11-19
;
; zeropage locations for exclusive use by the library
;
.include "extzp.inc"
.segment "EXTZP" : zeropage
CURS_X: .res 1
CURS_Y: .res 1
CHARCOLOR: .res 1
RVS: .res 1
BGCOLOR: .res 1
tickcount: .res 4

22
libsrc/gamate/gotoxy.s Normal file
View file

@ -0,0 +1,22 @@
;
; void gotoxy (unsigned char x, unsigned char y);
;
.export _gotoxy
.import popa, plot
.include "gamate.inc"
.include "extzp.inc"
_gotoxy:
sta CURS_Y ; Set Y
jsr popa ; Get X
sta CURS_X ; Set X
jmp plot ; Set the cursor position
;-------------------------------------------------------------------------------
; force the init constructor to be imported
.import initconio
conio_init = initconio

51
libsrc/gamate/irq.s Normal file
View file

@ -0,0 +1,51 @@
;
; IRQ handling (Gamate version)
;
.export initirq, doneirq, IRQStub
.import __INTERRUPTOR_COUNT__, callirq_y
.include "gamate.inc"
.include "extzp.inc"
; ------------------------------------------------------------------------
.segment "INIT"
; a constructor
;
initirq:
rts
; ------------------------------------------------------------------------
.code
; a destructor
;
doneirq:
rts
; ------------------------------------------------------------------------
; 256*32 interrupts in about 1minute 60s = 136hz
; -> guess 16384 clock cycles = 135,28hz (might be audio signal 1/512?)
IRQStub:
pha
tya
pha
ldy #<(__INTERRUPTOR_COUNT__ * 2)
beq @L1
txa
pha
jsr callirq_y
pla
tax
@L1: pla
tay
pla
rts

View file

@ -0,0 +1,95 @@
;
; Standard joystick driver for the Gamate
;
.include "joy-kernel.inc"
.include "joy-error.inc"
.include "gamate.inc"
.macpack module
; ------------------------------------------------------------------------
; Header. Includes jump table
module_header _gamate_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)
.byte $01 ; JOY_UP
.byte $02 ; JOY_DOWN
.byte $04 ; JOY_LEFT
.byte $08 ; JOY_RIGHT
.byte $10 ; JOY_FIRE_A
.byte $20 ; JOY_FIRE_B
.byte $80 ; JOY_SELECT
.byte $40 ; JOY_START
; Jump table.
.addr INSTALL
.addr UNINSTALL
.addr COUNT
.addr READJOY
.addr 0 ; IRQ entry unused
; ------------------------------------------------------------------------
; Constants
JOY_COUNT = 1 ; 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 UNINSTALL 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:
lda JOY_DATA
ldx #0
rts

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 _gamate_stdjoy_joy
.rodata
_joy_static_stddrv := _gamate_stdjoy_joy

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 "gamate-stdjoy.joy"

32
libsrc/gamate/kplot.s Normal file
View file

@ -0,0 +1,32 @@
.export PLOT
.include "gamate.inc"
.include "extzp.inc"
PLOT:
bcs @getpos
sty LCD_X
;clc ; already cleared
lda _plotlo,x
sta LCD_Y
@getpos:
ldx CURS_Y
ldy CURS_X
rts
.export _plotlo
.rodata
_plotlo:
.repeat screenrows,line
.byte <($0000+(line*$8))
.endrepeat
;-------------------------------------------------------------------------------
; force the init constructor to be imported
.import initconio
conio_init = initconio

8
libsrc/gamate/libref.s Normal file
View file

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

28
libsrc/gamate/revers.s Normal file
View file

@ -0,0 +1,28 @@
.include "gamate.inc"
.include "extzp.inc"
.export _revers
.proc _revers
ldx #$00 ; Assume revers off
tay ; Test onoff
beq L1 ; Jump if off
ldx #$ff ; Load on value
ldy #$00 ; Assume old value is zero
L1: lda RVS ; Load old value
stx RVS ; Set new value
beq L2 ; Jump if old value zero
iny ; Make old value = 1
L2: ldx #$00 ; Load high byte of result
tya ; Load low byte, set CC
rts
.endproc
;-------------------------------------------------------------------------------
; force the init constructor to be imported
.import initconio
conio_init = initconio

17
libsrc/gamate/ticktock.s Normal file
View file

@ -0,0 +1,17 @@
.interruptor ticktock, 24
.include "gamate.inc"
.include "extzp.inc"
ticktock:
; Increment the system tick counter.
inc tickcount
bne @s1
inc tickcount+1
bne @s1
inc tickcount+2
bne @s1
inc tickcount+3
@s1:
rts

228
libsrc/gamate/vga.inc Normal file
View file

@ -0,0 +1,228 @@
; VGA charset for the PC-Engine conio implementation
.byte $00, $00, $00, $00, $00, $00, $00, $00
; 1
.byte %00000000
.byte %00000000
.byte %00000000
.byte %11111111
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
; 2
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
; 3
.byte %00010000
.byte %00010000
.byte %00010000
.byte %11111111
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
; 4
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00011111
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
; 5
.byte %00000000
.byte %00000000
.byte %00000000
.byte %11110000
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
; 6
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00011111
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
; 7
.byte %00010000
.byte %00010000
.byte %00010000
.byte %11110000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
; 8
.byte %00000000
.byte %00000000
.byte %00000000
.byte %11111111
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
; 9
.byte %00010000
.byte %00010000
.byte %00010000
.byte %11111111
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
; 10 (LF)
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
.byte %00000000
; 11
.byte %00010000
.byte %00010000
.byte %00010000
.byte %11110000
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
; 12
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00011111
.byte %00010000
.byte %00010000
.byte %00010000
.byte %00010000
.byte $3F, $33, $3F, $30, $30, $70, $F0, $E0
.byte $7F, $63, $7F, $63, $63, $67, $E6, $C0
.byte $99, $5A, $3C, $E7, $E7, $3C, $5A, $99
.byte $80, $E0, $F8, $FE, $F8, $E0, $80, $00
.byte $02, $0E, $3E, $FE, $3E, $0E, $02, $00
.byte $18, $3C, $7E, $18, $18, $7E, $3C, $18
.byte $66, $66, $66, $66, $66, $00, $66, $00
.byte $7F, $DB, $DB, $7B, $1B, $1B, $1B, $00
.byte $3E, $63, $38, $6C, $6C, $38, $CC, $78
.byte $00, $00, $00, $00, $7E, $7E, $7E, $00
.byte $18, $3C, $7E, $18, $7E, $3C, $18, $FF
.byte $18, $3C, $7E, $18, $18, $18, $18, $00
.byte $18, $18, $18, $18, $7E, $3C, $18, $00
.byte $00, $18, $0C, $FE, $0C, $18, $00, $00
.byte $00, $30, $60, $FE, $60, $30, $00, $00
.byte $00, $00, $C0, $C0, $C0, $FE, $00, $00
.byte $00, $24, $66, $FF, $66, $24, $00, $00
.byte $00, $18, $3C, $7E, $FF, $FF, $00, $00
.byte $00, $FF, $FF, $7E, $3C, $18, $00, $00
.byte $00, $00, $00, $00, $00, $00, $00, $00
.byte $30, $78, $78, $78, $30, $00, $30, $00
.byte $6C, $6C, $6C, $00, $00, $00, $00, $00
.byte $6C, $6C, $FE, $6C, $FE, $6C, $6C, $00
.byte $30, $7C, $C0, $78, $0C, $F8, $30, $00
.byte $00, $C6, $CC, $18, $30, $66, $C6, $00
.byte $38, $6C, $38, $76, $DC, $CC, $76, $00
.byte $60, $60, $C0, $00, $00, $00, $00, $00
.byte $18, $30, $60, $60, $60, $30, $18, $00
.byte $60, $30, $18, $18, $18, $30, $60, $00
.byte $00, $66, $3C, $FF, $3C, $66, $00, $00
.byte $00, $30, $30, $FC, $30, $30, $00, $00
.byte $00, $00, $00, $00, $00, $30, $30, $60
.byte $00, $00, $00, $FC, $00, $00, $00, $00
.byte $00, $00, $00, $00, $00, $30, $30, $00
.byte $06, $0C, $18, $30, $60, $C0, $80, $00
.byte $7C, $C6, $CE, $DE, $F6, $E6, $7C, $00
.byte $30, $70, $30, $30, $30, $30, $FC, $00
.byte $78, $CC, $0C, $38, $60, $CC, $FC, $00
.byte $78, $CC, $0C, $38, $0C, $CC, $78, $00
.byte $1C, $3C, $6C, $CC, $FE, $0C, $1E, $00
.byte $FC, $C0, $F8, $0C, $0C, $CC, $78, $00
.byte $38, $60, $C0, $F8, $CC, $CC, $78, $00
.byte $FC, $CC, $0C, $18, $30, $30, $30, $00
.byte $78, $CC, $CC, $78, $CC, $CC, $78, $00
.byte $78, $CC, $CC, $7C, $0C, $18, $70, $00
.byte $00, $30, $30, $00, $00, $30, $30, $00
.byte $00, $30, $30, $00, $00, $30, $30, $60
.byte $18, $30, $60, $C0, $60, $30, $18, $00
.byte $00, $00, $FC, $00, $00, $FC, $00, $00
.byte $60, $30, $18, $0C, $18, $30, $60, $00
.byte $78, $CC, $0C, $18, $30, $00, $30, $00
.byte $7C, $C6, $DE, $DE, $DE, $C0, $78, $00
.byte $30, $78, $CC, $CC, $FC, $CC, $CC, $00
.byte $FC, $66, $66, $7C, $66, $66, $FC, $00
.byte $3C, $66, $C0, $C0, $C0, $66, $3C, $00
.byte $F8, $6C, $66, $66, $66, $6C, $F8, $00
.byte $7E, $60, $60, $78, $60, $60, $7E, $00
.byte $7E, $60, $60, $78, $60, $60, $60, $00
.byte $3C, $66, $C0, $C0, $CE, $66, $3E, $00
.byte $CC, $CC, $CC, $FC, $CC, $CC, $CC, $00
.byte $78, $30, $30, $30, $30, $30, $78, $00
.byte $1E, $0C, $0C, $0C, $CC, $CC, $78, $00
.byte $E6, $66, $6C, $78, $6C, $66, $E6, $00
.byte $60, $60, $60, $60, $60, $60, $7E, $00
.byte $C6, $EE, $FE, $FE, $D6, $C6, $C6, $00
.byte $C6, $E6, $F6, $DE, $CE, $C6, $C6, $00
.byte $38, $6C, $C6, $C6, $C6, $6C, $38, $00
.byte $FC, $66, $66, $7C, $60, $60, $F0, $00
.byte $78, $CC, $CC, $CC, $DC, $78, $1C, $00
.byte $FC, $66, $66, $7C, $6C, $66, $E6, $00
.byte $78, $CC, $E0, $70, $1C, $CC, $78, $00
.byte $FC, $30, $30, $30, $30, $30, $30, $00
.byte $CC, $CC, $CC, $CC, $CC, $CC, $FC, $00
.byte $CC, $CC, $CC, $CC, $CC, $78, $30, $00
.byte $C6, $C6, $C6, $D6, $FE, $EE, $C6, $00
.byte $C6, $C6, $6C, $38, $38, $6C, $C6, $00
.byte $CC, $CC, $CC, $78, $30, $30, $78, $00
.byte $FE, $06, $0C, $18, $30, $60, $FE, $00
.byte $78, $60, $60, $60, $60, $60, $78, $00
.byte $C0, $60, $30, $18, $0C, $06, $02, $00
.byte $78, $18, $18, $18, $18, $18, $78, $00
.byte $10, $38, $6C, $C6, $00, $00, $00, $00
.byte $00, $00, $00, $00, $00, $00, $00, $FF
.byte $30, $30, $18, $00, $00, $00, $00, $00
.byte $00, $00, $78, $0C, $7C, $CC, $76, $00
.byte $E0, $60, $60, $7C, $66, $66, $DC, $00
.byte $00, $00, $78, $CC, $C0, $CC, $78, $00
.byte $1C, $0C, $0C, $7C, $CC, $CC, $76, $00
.byte $00, $00, $78, $CC, $FC, $C0, $78, $00
.byte $38, $6C, $60, $F0, $60, $60, $F0, $00
.byte $00, $00, $76, $CC, $CC, $7C, $0C, $F8
.byte $E0, $60, $6C, $76, $66, $66, $E6, $00
.byte $30, $00, $70, $30, $30, $30, $78, $00
.byte $0C, $00, $0C, $0C, $0C, $CC, $CC, $78
.byte $E0, $60, $66, $6C, $78, $6C, $E6, $00
.byte $70, $30, $30, $30, $30, $30, $78, $00
.byte $00, $00, $CC, $FE, $FE, $D6, $C6, $00
.byte $00, $00, $F8, $CC, $CC, $CC, $CC, $00
.byte $00, $00, $78, $CC, $CC, $CC, $78, $00
.byte $00, $00, $DC, $66, $66, $7C, $60, $F0
.byte $00, $00, $76, $CC, $CC, $7C, $0C, $1E
.byte $00, $00, $DC, $76, $66, $60, $F0, $00
.byte $00, $00, $7C, $C0, $78, $0C, $F8, $00
.byte $10, $30, $7C, $30, $30, $34, $18, $00
.byte $00, $00, $CC, $CC, $CC, $CC, $76, $00
.byte $00, $00, $CC, $CC, $CC, $78, $30, $00
.byte $00, $00, $C6, $D6, $FE, $FE, $6C, $00
.byte $00, $00, $C6, $6C, $38, $6C, $C6, $00
.byte $00, $00, $CC, $CC, $CC, $7C, $0C, $F8
.byte $00, $00, $FC, $98, $30, $64, $FC, $00
.byte $1C, $30, $30, $E0, $30, $30, $1C, $00
.byte $18, $18, $18, $00, $18, $18, $18, $00
.byte $E0, $30, $30, $1C, $30, $30, $E0, $00
.byte $76, $DC, $00, $00, $00, $00, $00, $00
.byte $00, $10, $38, $6C, $C6, $C6, $FE, $00

View file

@ -0,0 +1,20 @@
;
; void waitvblank (void);
;
.include "gamate.inc"
.include "extzp.inc"
.forceimport ticktock
.export _waitvblank
; FIXME: is this actually correct?
.proc _waitvblank
lda tickcount
@lp: cmp tickcount
beq @lp
rts
.endproc

20
libsrc/gamate/wherex.s Normal file
View file

@ -0,0 +1,20 @@
;
; Ullrich von Bassewitz, 2003-05-02
;
; unsigned char wherex (void);
;
.export _wherex
.include "gamate.inc"
.include "extzp.inc"
.proc _wherex
lda CURS_X
ldx #$00
rts
.endproc

20
libsrc/gamate/wherey.s Normal file
View file

@ -0,0 +1,20 @@
;
; Ullrich von Bassewitz, 2003-05-02
;
; unsigned char wherey (void);
;
.export _wherey
.include "gamate.inc"
.include "extzp.inc"
.proc _wherey
lda CURS_Y
ldx #$00
rts
.endproc

View file

@ -205,7 +205,7 @@ static const TargetProperties PropertyTable[TGT_COUNT] = {
{ "sim6502", CPU_6502, BINFMT_BINARY, CTNone }, { "sim6502", CPU_6502, BINFMT_BINARY, CTNone },
{ "sim65c02", CPU_65C02, BINFMT_BINARY, CTNone }, { "sim65c02", CPU_65C02, BINFMT_BINARY, CTNone },
{ "pce", CPU_HUC6280, BINFMT_BINARY, CTNone }, { "pce", CPU_HUC6280, BINFMT_BINARY, CTNone },
{ "gamate", CPU_65C02, BINFMT_BINARY, CTNone }, { "gamate", CPU_6502, BINFMT_BINARY, CTNone },
}; };
/* Target system */ /* Target system */

View file

@ -14,6 +14,14 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#if defined(__GAMATE__)
#define NUMCHARS 128
#define NUMCOLS 4
#else
#define NUMCHARS 256
#define NUMCOLS 16
#endif
static char grid[5][5] = { static char grid[5][5] = {
{ CH_ULCORNER, CH_HLINE, CH_TTEE, CH_HLINE, CH_URCORNER }, { CH_ULCORNER, CH_HLINE, CH_TTEE, CH_HLINE, CH_URCORNER },
{ CH_VLINE, ' ', CH_VLINE, ' ', CH_VLINE }, { CH_VLINE, ' ', CH_VLINE, ' ', CH_VLINE },
@ -29,8 +37,10 @@ void main(void)
clrscr(); clrscr();
screensize(&xsize, &ysize); screensize(&xsize, &ysize);
cputs("cc65 conio test\n\rInput: [ ]"); cputs("cc65 conio test\n\r");
#if !defined(__NES__) && !defined(__PCE__) && !defined(__GAMATE__)
cputs("Input: [ ]");
#endif
cputsxy(0, 2, "Colors:" ); cputsxy(0, 2, "Colors:" );
tcol = textcolor(0); /* remember original textcolor */ tcol = textcolor(0); /* remember original textcolor */
bgcol = bgcolor(0); /* remember original background color */ bgcol = bgcolor(0); /* remember original background color */
@ -38,14 +48,14 @@ void main(void)
bgcolor(bgcol);bordercolor(bcol); bgcolor(bgcol);bordercolor(bcol);
for (i = 0; i < 3; ++i) { for (i = 0; i < 3; ++i) {
gotoxy(i,3 + i); gotoxy(i,3 + i);
for (j = 0; j < 16; ++j) { for (j = 0; j < NUMCOLS; ++j) {
textcolor(j); textcolor(j);
cputc('X'); cputc('X');
} }
} }
textcolor(tcol); textcolor(tcol);
cprintf("\n\n\r Screensize is: %dx%d", xsize, ysize ); cprintf("\n\n\r Screensize: %dx%d", xsize, ysize );
chlinexy(0,6,xsize); chlinexy(0,6,xsize);
cvlinexy(0,6,3); cvlinexy(0,6,3);
@ -63,13 +73,13 @@ void main(void)
} }
} }
gotoxy(0,ysize - 2 - ((256 + xsize) / xsize)); gotoxy(0,ysize - 2 - ((NUMCHARS + xsize) / xsize));
revers(1); revers(1);
for (i = 0; i < xsize; ++i) { for (i = 0; i < xsize; ++i) {
cputc('0' + i % 10); cputc('0' + i % 10);
} }
revers(0); revers(0);
for (i = 0; i < 256; ++i) { for (i = 0; i < NUMCHARS; ++i) {
if ((i != '\n') && (i != '\r')) { if ((i != '\n') && (i != '\r')) {
cputc(i); cputc(i);
} else { } else {
@ -89,13 +99,14 @@ void main(void)
for(;;) { for(;;) {
gotoxy(8, 2); gotoxy(8, 2);
j = n & 1; j = n >> 4 & 1;
revers(j); revers(j);
cputc(j ? 'R' : ' '); cputc(j ? 'R' : ' ');
revers(j ^ 1); revers(j ^ 1);
cputs(" revers"); cputs(" rvs");
revers(0); revers(0);
#if !defined(__NES__) && !defined(__PCE__) && !defined(__GAMATE__)
gotoxy(8 + inpos,1); gotoxy(8 + inpos,1);
i = cgetc(); i = cgetc();
if ((i >= '0') && (i<='9')) { if ((i >= '0') && (i<='9')) {
@ -120,6 +131,10 @@ void main(void)
cputc(i); cputc(i);
inpos = (inpos + 1) & 7; inpos = (inpos + 1) & 7;
} }
#endif
#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__)
waitvblank();
#endif
++n; ++n;
} }

View file

@ -1,21 +1,20 @@
all: audiotest.bin lcdtest.bin all: audiotest.bin lcdtest.bin ctest.bin
audiotest.bin: audiotest.s audiotest.bin: audiotest.s
# ../../../bin/ca65 -t gamate -o audiotest.o audiotest.s ../../../bin/cl65 -l audiotest.lst -t gamate -o audiotest.bin audiotest.s
# ../../../bin/ld65 -t gamate -o audiotest.bin audiotest.o
../../../bin/cl65 -t gamate -o audiotest.bin audiotest.s
lcdtest.bin: lcdtest.s lcdtest.bin: lcdtest.s
# ../../../bin/ca65 -t gamate -o lcdtest.o lcdtest.s ../../../bin/cl65 -l lcdtest.lst -t gamate -o lcdtest.bin lcdtest.s
# ../../../bin/ld65 -t gamate -o lcdtest.bin lcdtest.o ctest.bin: ctest.c
../../../bin/cl65 -l bla.lst -t gamate -o lcdtest.bin lcdtest.s ../../../bin/cl65 -l ctest.lst -t gamate -o ctest.bin ctest.c
test1: lcdtest.bin test1: lcdtest.bin
cd /home/groepaz/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart /home/groepaz/Desktop/cc65/github/cc65/testcode/lib/gamate/lcdtest.bin cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/lcdtest.bin
test2: audiotest.bin test2: audiotest.bin
cd /home/groepaz/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart /home/groepaz/Desktop/cc65/github/cc65/testcode/lib/gamate/audiotest.bin cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/audiotest.bin
testc: ctest.bin
cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/ctest.bin
clean: clean:
rm -f lcdtest.o audiotest.o rm -f lcdtest.o audiotest.o ctest.o
rm -f lcdtest.bin audiotest.bin rm -f lcdtest.bin audiotest.bin ctest.bin

View file

@ -1,8 +1,10 @@
.export reset, irq, nmi ; FIXME ; .export reset, irq, nmi ; FIXME
.export _main
.include "gamate.inc" .include "gamate.inc"
.zeropage
.zeropage
addr: .word 0 addr: .word 0
psa: .word 0 psa: .word 0
@ -16,7 +18,7 @@ cursor: .byte 0
controlslast: .byte 0 controlslast: .byte 0
controlsedge: .byte 0 controlsedge: .byte 0
.data .data
temp_x: .byte 0 temp_x: .byte 0
temp_y: .byte 0 temp_y: .byte 0
temp_a: .byte 0 temp_a: .byte 0
@ -27,405 +29,414 @@ psy: .byte 0
xpos: .byte 0 xpos: .byte 0
ypos: .byte 0 ypos: .byte 0
.code .code
chars: chars:
.incbin "cga2.chr" .incbin "cga2.chr"
hex2asc: .byte "0123456789abcdef" hex2asc: .byte "0123456789abcdef"
;-------------------------------------------------------------------------------
.export IRQStub
.proc nmi .proc nmi
inc nmi_count inc nmi_count
rts rts
.endproc .endproc
.proc irq .proc IRQStub
inc irq_count inc irq_count
rts rts
.endproc .endproc
.proc reset ;-------------------------------------------------------------------------------
lda #>audio_base
sta writeaddr+1
sta readaddr+1
lda #<audio_base
sta writeaddr
sta readaddr
lda #$10 .proc _main
sta editbuffer1+6 lda #>AUDIO_BASE
lda #$e sta writeaddr+1
sta editbuffer2+5 sta readaddr+1
lda #$ff lda #<AUDIO_BASE
sta editbuffer2+3 sta writeaddr
lda #$ff sta readaddr
sta editbuffer2+4
lda #$0f
sta editbuffer2
lda #$0f
sta editbuffer2+1
lda #$0e
sta editbuffer2+2
lda #$38
sta editbuffer1+7
lda #0 lda #$10
sta lcd_x_pos sta editbuffer1+6
sta lcd_y_pos lda #$e
sta irq_count sta editbuffer2+5
sta cursor lda #$ff
lda #1 sta editbuffer2+3
sta nmi_count lda #$ff
cli sta editbuffer2+4
lda #lcd_mode_y_increment lda #$0f
sta lcd_mode sta editbuffer2
lda #$0f
sta editbuffer2+1
lda #$0e
sta editbuffer2+2
lda #$38
sta editbuffer1+7
jsr printy lda #0
sta LCD_XPOS
sta LCD_YPOS
sta irq_count
sta cursor
lda #1
sta nmi_count
cli
lda #LCD_MODE_INC_Y
sta LCD_MODE
lda #1 jsr printy
sta nmi_enable
lda #1
sta ZP_NMI_ENABLE
loop: loop:
lda irq_count lda irq_count
loop1: loop1:
cmp irq_count cmp irq_count
beq loop1 beq loop1
lda irq_count lda irq_count
and #7 and #7
bne loop1 bne loop1
lda #lcd_mode_y_increment lda #LCD_MODE_INC_Y
sta lcd_mode sta LCD_MODE
ldx #3 ldx #3
ldy #32 ldy #32
lda irq_count lda irq_count
jsr printhex jsr printhex
lda cursor lda cursor
ldy #0 ldy #0
cmp #20 cmp #20
bcc firstline bcc firstline
sec sec
sbc #20 sbc #20
ldy #24 ldy #24
firstline: firstline:
sta lcd_x sta LCD_X
sty lcd_y sty LCD_Y
lda #' ' lda #' '
jsr printsign jsr printsign
norclearcursor: norclearcursor:
jsr inputs
lda irq_count jsr inputs
and #8
bne nocursor lda irq_count
lda cursor and #8
ldy #0 bne nocursor
cmp #20 lda cursor
bcc firstline2 ldy #0
sec cmp #20
sbc #20 bcc firstline2
ldy #24 sec
sbc #20
ldy #24
firstline2: firstline2:
sta lcd_x sta LCD_X
sty lcd_y sty LCD_Y
lda #'x' lda #'x'
jsr printsign jsr printsign
nocursor: nocursor:
lda #lcd_mode_y_increment lda #LCD_MODE_INC_Y
sta lcd_mode sta LCD_MODE
jsr printy jsr printy
jmp loop jmp loop
.endproc .endproc
.proc printy .proc printy
ldy #0 ldy #0
loop1: loop1:
tya tya
pha pha
asl asl
tax tax
lda readaddr,y lda readaddr,y
ldy #8 ldy #8
jsr printhex jsr printhex
pla pla
tay tay
iny iny
cpy #10 cpy #10
bne loop1 bne loop1
loop2: loop2:
tya tya
pha pha
tya tya
sec sec
sbc #10 sbc #10
asl asl
tax tax
lda readaddr,y lda readaddr,y
ldy #16 ldy #16
jsr printhex jsr printhex
pla pla
tay tay
iny iny
cpy #20 cpy #20
bne loop2 bne loop2
ldx #0 ldx #0
ldy #32 ldy #32
lda nmi_count lda nmi_count
jsr printhex jsr printhex
rts rts
.endproc .endproc
;-------------------------------------------------------------------------------
.proc inputs .proc inputs
lda controlslast lda controlslast
eor controls eor JOY_DATA
and controlslast and controlslast
eor #$ff eor #$ff
sta controlsedge sta controlsedge
and #up and #JOY_DATA_UP
bne notup bne notup
lda cursor lda cursor
lsr lsr
tay tay
bcs uplow bcs uplow
lda readaddr,y lda readaddr,y
clc clc
adc #$10 adc #$10
sta readaddr,y sta readaddr,y
jmp notup jmp notup
uplow:lda readaddr,y uplow:lda readaddr,y
clc clc
adc #1 adc #1
sta readaddr,y sta readaddr,y
notup:lda controlsedge notup:lda controlsedge
and #down and #JOY_DATA_DOWN
bne notdown bne notdown
lda cursor lda cursor
lsr lsr
tay tay
bcs downlow bcs downlow
lda readaddr,y lda readaddr,y
sec sec
sbc #$10 sbc #$10
sta readaddr,y sta readaddr,y
jmp notdown jmp notdown
downlow: downlow:
lda readaddr,y lda readaddr,y
sec sec
sbc #1 sbc #1
sta readaddr,y sta readaddr,y
notdown:lda controlsedge notdown:lda controlsedge
and #left and #JOY_DATA_LEFT
bne notleft bne notleft
lda cursor lda cursor
beq notleft beq notleft
dec cursor dec cursor
notleft:lda controlsedge notleft:lda controlsedge
and #right and #JOY_DATA_RIGHT
bne notright bne notright
lda cursor lda cursor
cmp #40 cmp #40
beq notright beq notright
inc cursor inc cursor
notright:lda controlsedge notright:lda controlsedge
and #start and #JOY_DATA_START
bne notstart bne notstart
lda #0 lda #0
sta audio_base sta AUDIO_BASE
sta audio_base+1 sta AUDIO_BASE+1
sta audio_base+2 sta AUDIO_BASE+2
sta audio_base+3 sta AUDIO_BASE+3
sta audio_base+4 sta AUDIO_BASE+4
sta audio_base+5 sta AUDIO_BASE+5
sta audio_base+6 sta AUDIO_BASE+6
sta audio_base+8 sta AUDIO_BASE+8
sta audio_base+9 sta AUDIO_BASE+9
sta audio_base+10 sta AUDIO_BASE+10
sta audio_base+11 sta AUDIO_BASE+11
sta audio_base+12 sta AUDIO_BASE+12
sta audio_base+13 sta AUDIO_BASE+13
sta audio_base+7 sta AUDIO_BASE+7
notstart:lda controlsedge notstart:lda controlsedge
and #select and #JOY_DATA_SELECT
bne notselect bne notselect
lda editbuffer1 lda editbuffer1
sta audio_base sta AUDIO_BASE
lda editbuffer1+1 lda editbuffer1+1
sta audio_base+1 sta AUDIO_BASE+1
lda editbuffer1+2 lda editbuffer1+2
sta audio_base+2 sta AUDIO_BASE+2
lda editbuffer1+3 lda editbuffer1+3
sta audio_base+3 sta AUDIO_BASE+3
lda editbuffer1+4 lda editbuffer1+4
sta audio_base+4 sta AUDIO_BASE+4
lda editbuffer1+5 lda editbuffer1+5
sta audio_base+5 sta AUDIO_BASE+5
lda editbuffer1+6 lda editbuffer1+6
sta audio_base+6 sta AUDIO_BASE+6
lda editbuffer2 lda editbuffer2
sta audio_base+8 sta AUDIO_BASE+8
lda editbuffer2+1 lda editbuffer2+1
sta audio_base+9 sta AUDIO_BASE+9
lda editbuffer2+2 lda editbuffer2+2
sta audio_base+10 sta AUDIO_BASE+10
lda editbuffer2+3 lda editbuffer2+3
sta audio_base+11 sta AUDIO_BASE+11
lda editbuffer2+4 lda editbuffer2+4
sta audio_base+12 sta AUDIO_BASE+12
lda editbuffer2+5 lda editbuffer2+5
sta audio_base+13 sta AUDIO_BASE+13
lda editbuffer1+7 lda editbuffer1+7
sta audio_base+7 sta AUDIO_BASE+7
notselect:lda controlsedge notselect:lda controlsedge
and #button_a and #JOY_DATA_FIRE_A
bne notbuttona bne notbuttona
ldy #0 ldy #0
ldy #0 ldy #0
writea:lda editbuffer1,y writea:lda editbuffer1,y
sta (writeaddr),y sta (writeaddr),y
iny iny
cpy #8 cpy #8
bne writea bne writea
writeb:lda editbuffer2-8,y writeb:lda editbuffer2-8,y
sta (writeaddr),y sta (writeaddr),y
iny iny
cpy #16 cpy #16
bne writeb bne writeb
notbuttona:lda controlsedge notbuttona:lda controlsedge
and #button_b and #JOY_DATA_FIRE_B
bne notbuttonb bne notbuttonb
ldy #0 ldy #0
reada:lda (readaddr),y reada:lda (readaddr),y
sta editbuffer1,y sta editbuffer1,y
iny iny
cpy #8 cpy #8
bne reada bne reada
readb:lda (readaddr),y readb:lda (readaddr),y
sta editbuffer2-8,y sta editbuffer2-8,y
iny iny
cpy #16 cpy #16
bne readb bne readb
notbuttonb: notbuttonb:
lda controls lda JOY_DATA
sta controlslast sta controlslast
rts rts
.endproc .endproc
;-------------------------------------------------------------------------------
.proc printstring .proc printstring
sta psa sta psa
stx psa+1 stx psa+1
ldx #0 ldx #0
stx psx stx psx
sty psy sty psy
printstring2: printstring2:
ldy #0 ldy #0
lda (psa),y lda (psa),y
beq printstring1 beq printstring1
ldx psx ldx psx
stx lcd_x stx LCD_X
ldy psy ldy psy
sty lcd_y sty LCD_Y
jsr printsign jsr printsign
inc psx inc psx
lda psa lda psa
clc clc
adc #1 adc #1
sta psa sta psa
lda psa+1 lda psa+1
adc #0 adc #0
sta psa+1 sta psa+1
jmp printstring2 jmp printstring2
printstring1: printstring1:
rts rts
.endproc .endproc
.proc printstringy .proc printstringy
sta psa sta psa
stx psa+1 stx psa+1
printstring2: printstring2:
ldy #0 ldy #0
lda (psa),y lda (psa),y
beq printstring1 beq printstring1
jsr printsign jsr printsign
lda psa lda psa
clc clc
adc #1 adc #1
sta psa sta psa
lda psa+1 lda psa+1
adc #0 adc #0
sta psa+1 sta psa+1
jmp printstring2 jmp printstring2
printstring1: printstring1:
rts rts
.endproc .endproc
.proc printhex .proc printhex
pha pha
lsr lsr
lsr lsr
lsr lsr
lsr lsr
and #$0f and #$0f
stx temp_x stx temp_x
tax tax
lda hex2asc,x lda hex2asc,x
ldx temp_x ldx temp_x
stx lcd_x stx LCD_X
sty lcd_y sty LCD_Y
jsr printsign jsr printsign
pla pla
and #$0f and #$0f
inx inx
stx temp_x stx temp_x
tax tax
lda hex2asc,x lda hex2asc,x
ldx temp_x ldx temp_x
stx lcd_x stx LCD_X
sty lcd_y sty LCD_Y
jmp printsign jmp printsign
.endproc .endproc
.proc printsign .proc printsign
sty temp_y sty temp_y
stx temp_x stx temp_x
sta temp_a sta temp_a
lda temp_a lda temp_a
sta addr sta addr
lda #0 lda #0
sta addr+1 sta addr+1
asl addr asl addr
rol addr+1 rol addr+1
asl addr asl addr
rol addr+1 rol addr+1
asl addr asl addr
rol addr+1 rol addr+1
lda addr lda addr
clc clc
adc #<chars adc #<chars
sta addr sta addr
lda addr+1 lda addr+1
adc #>chars adc #>chars
sta addr+1 sta addr+1
ldx #8 ldx #8
ldy #0 ldy #0
printsign1: printsign1:
lda (addr),y lda (addr),y
sta lcd_data sta LCD_DATA
iny iny
dex dex
bne printsign1 bne printsign1
ldx temp_x ldx temp_x
ldy temp_y ldy temp_y
rts rts
.endproc .endproc

View file

@ -0,0 +1,52 @@
#include <gamate.h>
#include <time.h>
#include <conio.h>
unsigned char y = 0;
unsigned char x;
unsigned short n;
int main(int argc, char *argv[])
{
clrscr();
gotoxy(0,0);cputs("abcdABCD");
textcolor(0);gotoxy(0,5);cputs("abcdABCD 0");
textcolor(1);gotoxy(0,6);cputs("abcdABCD 1");
textcolor(2);gotoxy(0,7);cputs("abcdABCD 2");
textcolor(3);gotoxy(0,8);cputs("abcdABCD 3");
while(1) {
textcolor(COLOR_BLACK);
n = clock();
gotoxy(0,2);cprintf("%04x %02x %02x", n, x, y);
switch((*((unsigned char*)JOY_DATA))) {
case 0xff ^ JOY_DATA_UP:
++y;
break;
case 0xff ^ JOY_DATA_DOWN:
--y;
break;
case 0xff ^ JOY_DATA_LEFT:
++x;
break;
case 0xff ^ JOY_DATA_RIGHT:
--x;
break;
case 0xff ^ JOY_DATA_FIRE_A:
break;
}
(*((unsigned char*)LCD_XPOS)) = x;
(*((unsigned char*)LCD_YPOS)) = y;
waitvblank();
}
return 0;
}

View file

@ -1,14 +1,12 @@
.export reset, irq, nmi ; FIXME .export _main
.include "gamate.inc" .include "gamate.inc"
.zeropage .zeropage
addr: .word 0 addr: .word 0
psa: .word 0 psa: .word 0
.data .data
temp_x: .byte 0 temp_x: .byte 0
temp_y: .byte 0 temp_y: .byte 0
temp_a: .byte 0 temp_a: .byte 0
@ -21,363 +19,381 @@ counted: .word 0
xpos: .byte 0 xpos: .byte 0
ypos: .byte 0 ypos: .byte 0
.code .code
chars: chars:
.incbin "cga2.chr" .incbin "cga2.chr"
hex2asc: .byte "0123456789abcdef"
format: .byte "IrqNmiCountXposYpos", 0
xdesc: .byte "0123456789abcdefghijklmnopqrstuv", 0
ydesc: .byte "0123456789ABCDEFGHIJKLMNOPQRSTUV", 0
.proc nmi hex2asc: .byte "0123456789abcdef"
inc nmi_count format: .byte "IrqNmiCountXposYpos", 0
rts xdesc: .byte "0123456789abcdefghijklmnopqrstuv", 0
ydesc: .byte "0123456789ABCDEFGHIJKLMNOPQRSTUV", 0
;-------------------------------------------------------------------------------
.proc nmi
inc nmi_count
rts
.endproc .endproc
.export IRQStub
.proc irq .proc IRQStub
inc irq_count
lda count inc irq_count
sta counted lda count
lda count+1 sta counted
sta counted+1 lda count+1
lda #0 sta counted+1
sta count lda #0
sta count+1 sta count
rts sta count+1
rts
.endproc .endproc
.proc reset ;-------------------------------------------------------------------------------
lda #0
sta lcd_x_pos
sta lcd_y_pos
cli
lda #lcd_mode_y_increment
sta lcd_mode
lda #0 .proc _main
sta lcd_x
lda #<xdesc
ldx #>xdesc
ldy #0
jsr printstring
lda #lcd_x_pos_plane2_flag lda #0
sta lcd_x sta LCD_XPOS
lda #<xdesc sta LCD_YPOS
ldx #>xdesc cli
ldy #128 lda #LCD_MODE_INC_Y
jsr printstring sta LCD_MODE
lda #0 lda #0
sta lcd_x sta LCD_X
lda #<ydesc lda #<xdesc
ldx #>ydesc ldx #>xdesc
ldy #0 ldy #0
sty lcd_y jsr printstring
jsr printstringy
; lda #$90;(lcd_x_pos_plane2_flag|(128/8)) lda #LCD_XPOS_PLANE2
lda #(lcd_x_pos_plane2_flag|(128/8)) sta LCD_X
sta lcd_x lda #<xdesc
lda #<ydesc ldx #>xdesc
ldx #>ydesc ldy #128
ldy #0 jsr printstring
sty lcd_y
jsr printstringy
lda #<format lda #0
ldx #>format sta LCD_X
ldy #8 lda #<ydesc
jsr printstring ldx #>ydesc
ldy #0
sty LCD_Y
jsr printstringy
lda #0 ; lda #$90;(LCD_XPOS_PLANE2|(128/8))
sta lcd_mode lda #(LCD_XPOS_PLANE2|(128/8))
lda #24/8 sta LCD_X
sta lcd_x lda #<ydesc
lda #24 ldx #>ydesc
sta lcd_y ldy #0
lda #'X' sty LCD_Y
jsr printsign jsr printstringy
lda #$80
sta lcd_mode
lda #32/8
sta lcd_x
lda #32
sta lcd_y
lda #'Y'
jsr printsign
lda #$c0
sta lcd_mode
lda #40/8
sta lcd_x
lda #40
sta lcd_y
lda #'Z'
jsr printsign
lda #0 lda #<format
sta lcd_mode ldx #>format
lda #lcd_x_pos_plane2_flag|(48/8) ldy #8
sta lcd_x jsr printstring
lda #48
sta lcd_y
lda #'x'
jsr printsign
lda #$80
sta lcd_mode
lda #(lcd_x_pos_plane2_flag|(56/8))
sta lcd_x
lda #56
sta lcd_y
lda #'y'
jsr printsign
lda #$c0
sta lcd_mode
lda #(lcd_x_pos_plane2_flag|(64/8))
sta lcd_x
lda #64
sta lcd_y
lda #'z'
jsr printsign
lda #lcd_mode_y_increment|1 lda #0
sta lcd_mode sta LCD_MODE
lda #16/8 lda #24/8
sta lcd_x sta LCD_X
lda #72 lda #24
sta lcd_y sta LCD_Y
lda #'V' lda #'X'
jsr printsign jsr printsign
lda #lcd_mode_y_increment|2 lda #$80
sta lcd_mode sta LCD_MODE
lda #24/8 lda #32/8
sta lcd_x sta LCD_X
lda #72 lda #32
sta lcd_y sta LCD_Y
lda #'V' lda #'Y'
jsr printsign jsr printsign
lda #lcd_mode_y_increment|4 lda #$c0
sta lcd_mode sta LCD_MODE
lda #32/8 lda #40/8
sta lcd_x sta LCD_X
lda #72 lda #40
sta lcd_y sta LCD_Y
lda #'V' lda #'Z'
jsr printsign jsr printsign
lda #lcd_mode_y_increment|8
sta lcd_mode lda #0
lda #40/8 sta LCD_MODE
sta lcd_x lda #LCD_XPOS_PLANE2|(48/8)
lda #72 sta LCD_X
sta lcd_y lda #48
lda #'V' sta LCD_Y
jsr printsign lda #'x'
jsr printsign
lda #$80
sta LCD_MODE
lda #(LCD_XPOS_PLANE2|(56/8))
sta LCD_X
lda #56
sta LCD_Y
lda #'y'
jsr printsign
lda #$c0
sta LCD_MODE
lda #(LCD_XPOS_PLANE2|(64/8))
sta LCD_X
lda #64
sta LCD_Y
lda #'z'
jsr printsign
lda #LCD_MODE_INC_Y|1
sta LCD_MODE
lda #16/8
sta LCD_X
lda #72
sta LCD_Y
lda #'V'
jsr printsign
lda #LCD_MODE_INC_Y|2
sta LCD_MODE
lda #24/8
sta LCD_X
lda #72
sta LCD_Y
lda #'V'
jsr printsign
lda #LCD_MODE_INC_Y|4
sta LCD_MODE
lda #32/8
sta LCD_X
lda #72
sta LCD_Y
lda #'V'
jsr printsign
lda #LCD_MODE_INC_Y|8
sta LCD_MODE
lda #40/8
sta LCD_X
lda #72
sta LCD_Y
lda #'V'
jsr printsign
lda #1 lda #1
sta nmi_enable sta ZP_NMI_ENABLE
loop: lda count loop: lda count
clc clc
adc #1 adc #1
sta count sta count
lda count+1 lda count+1
adc #1 adc #1
sta count+1 sta count+1
lda irq_count lda irq_count
cmp irq_count cmp irq_count
beq loop beq loop
jsr inputs jsr inputs
lda #lcd_mode_y_increment lda #LCD_MODE_INC_Y
sta lcd_mode sta LCD_MODE
jsr printy jsr printy
jmp loop jmp loop
.endproc .endproc
;-------------------------------------------------------------------------------
.proc printy .proc printy
ldx #0 ldx #0
ldy #16 ldy #16
lda irq_count lda irq_count
jsr printhex jsr printhex
ldx #3 ldx #3
ldy #16 ldy #16
lda nmi_count lda nmi_count
jsr printhex jsr printhex
ldx #6 ldx #6
ldy #16 ldy #16
lda counted+1 lda counted+1
jsr printhex jsr printhex
ldx #8 ldx #8
ldy #16 ldy #16
lda counted lda counted
jsr printhex jsr printhex
ldx #11 ldx #11
ldy #16 ldy #16
lda xpos lda xpos
jsr printhex jsr printhex
ldx #14 ldx #14
ldy #16 ldy #16
lda ypos lda ypos
jsr printhex jsr printhex
rts rts
.endproc .endproc
.proc inputs .proc inputs
lda controls lda JOY_DATA
and #up and #JOY_DATA_UP
bne notup bne notup
dec ypos dec ypos
lda ypos lda ypos
sta lcd_y_pos sta LCD_YPOS
notup:lda controls notup:lda JOY_DATA
and #down and #JOY_DATA_DOWN
bne notdown bne notdown
inc ypos inc ypos
lda ypos lda ypos
sta lcd_y_pos sta LCD_YPOS
notdown:lda controls notdown:lda JOY_DATA
and #left and #JOY_DATA_LEFT
bne notleft bne notleft
dec xpos dec xpos
lda xpos lda xpos
sta lcd_x_pos sta LCD_XPOS
notleft:lda controls notleft:lda JOY_DATA
and #right and #JOY_DATA_RIGHT
bne notright bne notright
inc xpos inc xpos
lda xpos lda xpos
sta lcd_x_pos sta LCD_XPOS
notright:lda controls notright:lda JOY_DATA
and #start and #JOY_DATA_START
bne notstart bne notstart
notstart:lda controls notstart:lda JOY_DATA
and #select and #JOY_DATA_SELECT
bne notselect bne notselect
notselect:lda controls notselect:lda JOY_DATA
and #button_a and #JOY_DATA_FIRE_A
bne notbuttona bne notbuttona
notbuttona:lda controls notbuttona:lda JOY_DATA
and #button_b and #JOY_DATA_FIRE_B
bne notbuttonb bne notbuttonb
notbuttonb:rts notbuttonb:rts
.endproc .endproc
;-------------------------------------------------------------------------------
.proc printstring .proc printstring
sta psa sta psa
stx psa+1 stx psa+1
ldx #0 ldx #0
stx psx stx psx
sty psy sty psy
printstring2: printstring2:
ldy #0 ldy #0
lda (psa),y lda (psa),y
beq printstring1 beq printstring1
ldx psx ldx psx
stx lcd_x stx LCD_X
ldy psy ldy psy
sty lcd_y sty LCD_Y
jsr printsign jsr printsign
inc psx inc psx
lda psa lda psa
clc clc
adc #1 adc #1
sta psa sta psa
lda psa+1 lda psa+1
adc #0 adc #0
sta psa+1 sta psa+1
jmp printstring2 jmp printstring2
printstring1: printstring1:
rts rts
.endproc .endproc
.proc printstringy .proc printstringy
sta psa sta psa
stx psa+1 stx psa+1
printstring2: printstring2:
ldy #0 ldy #0
lda (psa),y lda (psa),y
beq printstring1 beq printstring1
jsr printsign jsr printsign
lda psa lda psa
clc clc
adc #1 adc #1
sta psa sta psa
lda psa+1 lda psa+1
adc #0 adc #0
sta psa+1 sta psa+1
jmp printstring2 jmp printstring2
printstring1: printstring1:
rts rts
.endproc .endproc
.proc printhex .proc printhex
pha pha
lsr lsr
lsr lsr
lsr lsr
lsr lsr
and #$0f and #$0f
stx temp_x stx temp_x
tax tax
lda hex2asc,x lda hex2asc,x
ldx temp_x ldx temp_x
stx lcd_x stx LCD_X
sty lcd_y sty LCD_Y
jsr printsign jsr printsign
pla pla
and #$0f and #$0f
inx inx
stx temp_x stx temp_x
tax tax
lda hex2asc,x lda hex2asc,x
ldx temp_x ldx temp_x
stx lcd_x stx LCD_X
sty lcd_y sty LCD_Y
jmp printsign jmp printsign
.endproc .endproc
.proc printsign .proc printsign
sty temp_y sty temp_y
stx temp_x stx temp_x
sta temp_a sta temp_a
lda temp_a
sta addr lda temp_a
lda #0 sta addr
sta addr+1
asl addr lda #0
rol addr+1 sta addr+1
asl addr asl addr
rol addr+1 rol addr+1
asl addr asl addr
rol addr+1 rol addr+1
lda addr asl addr
clc rol addr+1
adc #<chars
sta addr lda addr
lda addr+1 clc
adc #>chars adc #<chars
sta addr+1 sta addr
ldx #8 lda addr+1
ldy #0 adc #>chars
sta addr+1
ldx #8
ldy #0
printsign1: printsign1:
lda (addr),y lda (addr),y
sta lcd_data sta LCD_DATA
iny iny
dex dex
bne printsign1 bne printsign1
ldx temp_x
ldy temp_y ldx temp_x
rts ldy temp_y
rts
.endproc .endproc

View file

@ -0,0 +1,25 @@
#include <stdlib.h>
#include <stdio.h>
unsigned char buffer[512 * 1024];
unsigned len;
FILE *in, *out;
int n, i;
int main(int argc, char *argv[]) {
if (argc < 3) {
exit(-1);
}
in = fopen(argv[1], "rb");
out = fopen(argv[2], "wb");
len = fread(buffer, 1, 512 * 1024, in);
n = 0; for (i = 0x1000; i < 0x2000; i++) {
n += buffer[i];
}
buffer[0] = n & 0xff;
buffer[1] = (n >> 8) & 0xff;
fwrite(buffer, 1, len, out);
fclose(in);
fclose(out);
}