-; gamate symbols
-
-;.p02
-
-LCD_WIDTH = 160
-LCD_HEIGHT = 152
-
-lcd_base = $5000
-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
-
-controls = $4400
-; active low
-up=1
-down=2
-left=4
-right=8
-button_a=$10
-button_b=$20
-start=$40
-select=$80
-
-cart_main = $6020
-;cart_nmi = $6023
-cart_irq = $6026 ; 135 hz
-cart_font = $6029
-
-nmi_enable = $c
-nmi_4800 = $a
-
-_f009 = $f009 ; wait 1/60s
-_f00c = $f00c ; install font
-_f012 = $f012 ; write screen
+;-------------------------------------------------------------------------------
+; gamate.inc
+;
+; Gamate system specific definitions
+;
+; (w) 2015 Groepaz/Hitmen (groepaz@gmx.net)
+; based on technical reference by PeT (mess@utanet.at)
+;-------------------------------------------------------------------------------
+
+; look at gamate.h for comments, they are not duplicated here
+
+AUDIO_BASE = $4000
+
+JOY_DATA = $4400
+
+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
+
+LCD_WIDTH = 160
+LCD_HEIGHT = 152
+
+LCD_BASE = $5000
+LCD_MODE = $5001
+LCD_XPOS = $5002
+LCD_YPOS = $5003
+LCD_X = $5004
+LCD_Y = $5005
+LCD_READ = $5006
+LCD_DATA = $5007
+
+LCD_MODE_INC_X = $00
+LCD_MODE_INC_Y = $40
+LCD_XPOS_PLANE1 = $00
+LCD_XPOS_PLANE2 = $80
+
+; constants for the conio implementation
+charsperline = (LCD_WIDTH / 8)
+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
-# c version of 32kbyte config file
-# .data located in rom
-
-# ld65 config file
-# ld65 --config gamate.cfg -o <prog>.bin <prog>.o
+# linker config to produce simple Gamate cartridge (.bin)
SYMBOLS {
- __STARTUP__: type = import;
- __STACKSIZE__: type = weak, value = $0300; # 3 pages stack
+ __STARTUP__: type = import;
+ __STACKSIZE__: type = weak, value = $0080; # 1 page stack
}
MEMORY {
- ZP: start = $0000, size = $100;
- CPUSTACK: start = $0100, size =$100;
- RAM: start = $0200, size = $200, define = yes;
-# ROM: start = $6000, size = $8000, fill = yes, fillval = $ff, file = %O, define = yes;
-# STARTUP: file = %O, define = yes, start = $6000, size = $29, fill = 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
- ROM: start = $6000, size = $8000, fill = yes, fillval = $00, file = %O, define = yes;
+ # 0000-03ff is RAM
+ # FIXME: what zp range can we actually use?
+ ZP: start = $0080, size = $80;
+ CPUSTACK: start = $0100, size =$100;
+ RAM: start = $0200, size = $180, define = yes;
+
+ # 6000-e000 can be (Cartridge) ROM
+ # 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 {
- ZEROPAGE: load = ZP, type = zp, define = yes;
- STARTUP: load = ROM, type = ro, 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;
+ ZEROPAGE: load = ZP, type = zp, define = yes;
+ EXTZP: load = ZP, type = zp, define = yes, optional = yes;
+ APPZP: load = ZP, type = zp, define = yes, optional = yes;
+ STARTUP: load = ROM, type = ro, define=yes;
+ INIT: load = ROM, type = ro, define = yes, optional = 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 {
- CONDES: segment = RODATA,
- type = constructor,
- label = __CONSTRUCTOR_TABLE__,
- count = __CONSTRUCTOR_COUNT__;
- CONDES: segment = RODATA,
- type = destructor,
- label = __DESTRUCTOR_TABLE__,
- count = __DESTRUCTOR_COUNT__;
+ CONDES: segment = RODATA, type = constructor, label = __CONSTRUCTOR_TABLE__, count = __CONSTRUCTOR_COUNT__;
+ CONDES: segment = RODATA, type = destructor, label = __DESTRUCTOR_TABLE__, count = __DESTRUCTOR_COUNT__;
+ CONDES: segment = RODATA, type = interruptor, label = __INTERRUPTOR_TABLE__, count = __INTERRUPTOR_COUNT__, import = __CALLIRQ__;
}
/* */
/* */
/* */
-/* (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 */
/* warranty. In no event will the authors be held liable for any damages */
# error This module may only be used when compiling for the Gamate!
#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 */
#endif
--- /dev/null
+;
+; Screen size variables
+;
+ .include "gamate.inc"
+
+ .export screensize
+screensize:
+ ldx xsize
+ ldy ysize
+ rts
+
+.rodata
+ .export xsize, ysize
+
+xsize: .byte charsperline
+ysize: .byte screenrows
--- /dev/null
+;
+; 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
+
+
+
+
--- /dev/null
+;
+; 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
--- /dev/null
+
+ .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
--- /dev/null
+;
+; 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
--- /dev/null
+ .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"
--- /dev/null
+;
+; 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
.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"
-checksum:
- .word 0
- .byte 1, 0, 1
- .byte "COPYRIGHT BIT CORPORATION", 0, $ff
+ .word 0 ; +00 checksum from 7000-7fff (simple 8bit adds)
+ .byte 1, 0, 1 ; +02 flags
+ .byte "COPYRIGHT BIT CORPORATION", 0, $ff ; +05 copyright
+ ; system vectors
+ jmp reset ; +20 reset entry
+ jmp nmi ; +23 nmi entry
+ 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
- jmp nmi
- jmp irq
+ .export initmainargs
+initmainargs:
+ rts
+
+;-------------------------------------------------------------------------------
+nmi:
+ rts
--- /dev/null
+;
+; 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
+
+
--- /dev/null
+;
+; 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
+
+
+
--- /dev/null
+;
+; 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
+
--- /dev/null
+;
+; 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
--- /dev/null
+;
+; 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
+
--- /dev/null
+;
+; 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
--- /dev/null
+
+;
+; 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
+
--- /dev/null
+;
+; 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
--- /dev/null
+;
+; 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"
--- /dev/null
+
+ .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
--- /dev/null
+;
+; Oliver Schmidt, 2013-05-31
+;
+
+ .export joy_libref
+ .import _exit
+
+joy_libref := _exit
--- /dev/null
+
+ .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
--- /dev/null
+ .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
--- /dev/null
+
+; 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
--- /dev/null
+;
+; 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
--- /dev/null
+;
+; 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
+
+
--- /dev/null
+;
+; 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
+
+
{ "sim6502", CPU_6502, BINFMT_BINARY, CTNone },
{ "sim65c02", CPU_65C02, BINFMT_BINARY, CTNone },
{ "pce", CPU_HUC6280, BINFMT_BINARY, CTNone },
- { "gamate", CPU_65C02, BINFMT_BINARY, CTNone },
+ { "gamate", CPU_6502, BINFMT_BINARY, CTNone },
};
/* Target system */
#include <string.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] = {
{ CH_ULCORNER, CH_HLINE, CH_TTEE, CH_HLINE, CH_URCORNER },
{ CH_VLINE, ' ', CH_VLINE, ' ', CH_VLINE },
clrscr();
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:" );
tcol = textcolor(0); /* remember original textcolor */
bgcol = bgcolor(0); /* remember original background color */
bgcolor(bgcol);bordercolor(bcol);
for (i = 0; i < 3; ++i) {
gotoxy(i,3 + i);
- for (j = 0; j < 16; ++j) {
+ for (j = 0; j < NUMCOLS; ++j) {
textcolor(j);
cputc('X');
}
}
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);
cvlinexy(0,6,3);
}
}
- gotoxy(0,ysize - 2 - ((256 + xsize) / xsize));
+ gotoxy(0,ysize - 2 - ((NUMCHARS + xsize) / xsize));
revers(1);
for (i = 0; i < xsize; ++i) {
cputc('0' + i % 10);
}
revers(0);
- for (i = 0; i < 256; ++i) {
+ for (i = 0; i < NUMCHARS; ++i) {
if ((i != '\n') && (i != '\r')) {
cputc(i);
} else {
for(;;) {
gotoxy(8, 2);
- j = n & 1;
+ j = n >> 4 & 1;
revers(j);
cputc(j ? 'R' : ' ');
revers(j ^ 1);
- cputs(" revers");
+ cputs(" rvs");
revers(0);
+#if !defined(__NES__) && !defined(__PCE__) && !defined(__GAMATE__)
gotoxy(8 + inpos,1);
i = cgetc();
if ((i >= '0') && (i<='9')) {
cputc(i);
inpos = (inpos + 1) & 7;
}
+#endif
+#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__)
+ waitvblank();
+#endif
++n;
}
-all: audiotest.bin lcdtest.bin
+all: audiotest.bin lcdtest.bin ctest.bin
audiotest.bin: audiotest.s
-# ../../../bin/ca65 -t gamate -o audiotest.o audiotest.s
-# ../../../bin/ld65 -t gamate -o audiotest.bin audiotest.o
- ../../../bin/cl65 -t gamate -o audiotest.bin audiotest.s
-
+ ../../../bin/cl65 -l audiotest.lst -t gamate -o audiotest.bin audiotest.s
lcdtest.bin: lcdtest.s
-# ../../../bin/ca65 -t gamate -o lcdtest.o lcdtest.s
-# ../../../bin/ld65 -t gamate -o lcdtest.bin lcdtest.o
- ../../../bin/cl65 -l bla.lst -t gamate -o lcdtest.bin lcdtest.s
+ ../../../bin/cl65 -l lcdtest.lst -t gamate -o lcdtest.bin lcdtest.s
+ctest.bin: ctest.c
+ ../../../bin/cl65 -l ctest.lst -t gamate -o ctest.bin ctest.c
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
- 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:
- rm -f lcdtest.o audiotest.o
- rm -f lcdtest.bin audiotest.bin
+ rm -f lcdtest.o audiotest.o ctest.o
+ rm -f lcdtest.bin audiotest.bin ctest.bin
- .export reset, irq, nmi ; FIXME
+; .export reset, irq, nmi ; FIXME
+ .export _main
-.include "gamate.inc"
- .zeropage
+ .include "gamate.inc"
+
+.zeropage
addr: .word 0
psa: .word 0
controlslast: .byte 0
controlsedge: .byte 0
- .data
+.data
temp_x: .byte 0
temp_y: .byte 0
temp_a: .byte 0
xpos: .byte 0
ypos: .byte 0
- .code
+.code
chars:
.incbin "cga2.chr"
-
+
hex2asc: .byte "0123456789abcdef"
+;-------------------------------------------------------------------------------
+ .export IRQStub
+
.proc nmi
- inc nmi_count
- rts
+ inc nmi_count
+ rts
.endproc
-.proc irq
- inc irq_count
- rts
+.proc IRQStub
+ inc irq_count
+ rts
.endproc
-.proc reset
- lda #>audio_base
- sta writeaddr+1
- sta readaddr+1
- lda #<audio_base
- sta writeaddr
- sta readaddr
-
- lda #$10
- sta editbuffer1+6
- lda #$e
- sta editbuffer2+5
- lda #$ff
- sta editbuffer2+3
- lda #$ff
- sta editbuffer2+4
- lda #$0f
- sta editbuffer2
- lda #$0f
- sta editbuffer2+1
- lda #$0e
- sta editbuffer2+2
- lda #$38
- sta editbuffer1+7
-
- lda #0
- sta lcd_x_pos
- sta lcd_y_pos
- sta irq_count
- sta cursor
- lda #1
- sta nmi_count
- cli
- lda #lcd_mode_y_increment
- sta lcd_mode
-
- jsr printy
-
- lda #1
- sta nmi_enable
+;-------------------------------------------------------------------------------
+
+.proc _main
+ lda #>AUDIO_BASE
+ sta writeaddr+1
+ sta readaddr+1
+ lda #<AUDIO_BASE
+ sta writeaddr
+ sta readaddr
+
+ lda #$10
+ sta editbuffer1+6
+ lda #$e
+ sta editbuffer2+5
+ lda #$ff
+ sta editbuffer2+3
+ lda #$ff
+ sta editbuffer2+4
+ lda #$0f
+ sta editbuffer2
+ lda #$0f
+ sta editbuffer2+1
+ lda #$0e
+ sta editbuffer2+2
+ lda #$38
+ sta editbuffer1+7
+
+ 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
+
+ jsr printy
+
+ lda #1
+ sta ZP_NMI_ENABLE
loop:
- lda irq_count
+ lda irq_count
loop1:
- cmp irq_count
- beq loop1
- lda irq_count
- and #7
- bne loop1
-
- lda #lcd_mode_y_increment
- sta lcd_mode
-
- ldx #3
- ldy #32
- lda irq_count
- jsr printhex
-
-
- lda cursor
- ldy #0
- cmp #20
- bcc firstline
- sec
- sbc #20
- ldy #24
+ cmp irq_count
+ beq loop1
+ lda irq_count
+ and #7
+ bne loop1
+
+ lda #LCD_MODE_INC_Y
+ sta LCD_MODE
+
+ ldx #3
+ ldy #32
+ lda irq_count
+ jsr printhex
+
+
+ lda cursor
+ ldy #0
+ cmp #20
+ bcc firstline
+ sec
+ sbc #20
+ ldy #24
firstline:
- sta lcd_x
- sty lcd_y
- lda #' '
- jsr printsign
+ sta LCD_X
+ sty LCD_Y
+ lda #' '
+ jsr printsign
norclearcursor:
-
- jsr inputs
-
- lda irq_count
- and #8
- bne nocursor
- lda cursor
- ldy #0
- cmp #20
- bcc firstline2
- sec
- sbc #20
- ldy #24
+
+ jsr inputs
+
+ lda irq_count
+ and #8
+ bne nocursor
+ lda cursor
+ ldy #0
+ cmp #20
+ bcc firstline2
+ sec
+ sbc #20
+ ldy #24
firstline2:
- sta lcd_x
- sty lcd_y
- lda #'x'
- jsr printsign
+ sta LCD_X
+ sty LCD_Y
+ lda #'x'
+ jsr printsign
nocursor:
- lda #lcd_mode_y_increment
- sta lcd_mode
- jsr printy
- jmp loop
+ lda #LCD_MODE_INC_Y
+ sta LCD_MODE
+ jsr printy
+ jmp loop
.endproc
.proc printy
- ldy #0
+ ldy #0
loop1:
- tya
- pha
- asl
- tax
- lda readaddr,y
- ldy #8
- jsr printhex
- pla
- tay
- iny
- cpy #10
- bne loop1
+ tya
+ pha
+ asl
+ tax
+ lda readaddr,y
+ ldy #8
+ jsr printhex
+ pla
+ tay
+ iny
+ cpy #10
+ bne loop1
loop2:
- tya
- pha
- tya
- sec
- sbc #10
- asl
- tax
- lda readaddr,y
- ldy #16
- jsr printhex
- pla
- tay
- iny
- cpy #20
- bne loop2
-
- ldx #0
- ldy #32
- lda nmi_count
- jsr printhex
-
- rts
+ tya
+ pha
+ tya
+ sec
+ sbc #10
+ asl
+ tax
+ lda readaddr,y
+ ldy #16
+ jsr printhex
+ pla
+ tay
+ iny
+ cpy #20
+ bne loop2
+
+ ldx #0
+ ldy #32
+ lda nmi_count
+ jsr printhex
+
+ rts
.endproc
+;-------------------------------------------------------------------------------
+
.proc inputs
- lda controlslast
- eor controls
- and controlslast
- eor #$ff
- sta controlsedge
- and #up
- bne notup
-
- lda cursor
- lsr
- tay
- bcs uplow
- lda readaddr,y
- clc
- adc #$10
- sta readaddr,y
- jmp notup
+ lda controlslast
+ eor JOY_DATA
+ and controlslast
+ eor #$ff
+ sta controlsedge
+ and #JOY_DATA_UP
+ bne notup
+
+ lda cursor
+ lsr
+ tay
+ bcs uplow
+ lda readaddr,y
+ clc
+ adc #$10
+ sta readaddr,y
+ jmp notup
uplow:lda readaddr,y
- clc
- adc #1
- sta readaddr,y
+ clc
+ adc #1
+ sta readaddr,y
notup:lda controlsedge
- and #down
- bne notdown
- lda cursor
- lsr
- tay
- bcs downlow
- lda readaddr,y
- sec
- sbc #$10
- sta readaddr,y
- jmp notdown
+ and #JOY_DATA_DOWN
+ bne notdown
+ lda cursor
+ lsr
+ tay
+ bcs downlow
+ lda readaddr,y
+ sec
+ sbc #$10
+ sta readaddr,y
+ jmp notdown
downlow:
- lda readaddr,y
- sec
- sbc #1
- sta readaddr,y
+ lda readaddr,y
+ sec
+ sbc #1
+ sta readaddr,y
notdown:lda controlsedge
- and #left
- bne notleft
- lda cursor
- beq notleft
- dec cursor
+ and #JOY_DATA_LEFT
+ bne notleft
+ lda cursor
+ beq notleft
+ dec cursor
notleft:lda controlsedge
- and #right
- bne notright
- lda cursor
- cmp #40
- beq notright
- inc cursor
+ and #JOY_DATA_RIGHT
+ bne notright
+ lda cursor
+ cmp #40
+ beq notright
+ inc cursor
notright:lda controlsedge
- and #start
- bne notstart
- lda #0
- sta audio_base
- sta audio_base+1
- sta audio_base+2
- sta audio_base+3
- sta audio_base+4
- sta audio_base+5
- sta audio_base+6
- sta audio_base+8
- sta audio_base+9
- sta audio_base+10
- sta audio_base+11
- sta audio_base+12
- sta audio_base+13
- sta audio_base+7
+ and #JOY_DATA_START
+ bne notstart
+ lda #0
+ sta AUDIO_BASE
+ sta AUDIO_BASE+1
+ sta AUDIO_BASE+2
+ sta AUDIO_BASE+3
+ sta AUDIO_BASE+4
+ sta AUDIO_BASE+5
+ sta AUDIO_BASE+6
+ sta AUDIO_BASE+8
+ sta AUDIO_BASE+9
+ sta AUDIO_BASE+10
+ sta AUDIO_BASE+11
+ sta AUDIO_BASE+12
+ sta AUDIO_BASE+13
+ sta AUDIO_BASE+7
notstart:lda controlsedge
- and #select
- bne notselect
- lda editbuffer1
- sta audio_base
- lda editbuffer1+1
- sta audio_base+1
- lda editbuffer1+2
- sta audio_base+2
- lda editbuffer1+3
- sta audio_base+3
- lda editbuffer1+4
- sta audio_base+4
- lda editbuffer1+5
- sta audio_base+5
- lda editbuffer1+6
- sta audio_base+6
- lda editbuffer2
- sta audio_base+8
- lda editbuffer2+1
- sta audio_base+9
- lda editbuffer2+2
- sta audio_base+10
- lda editbuffer2+3
- sta audio_base+11
- lda editbuffer2+4
- sta audio_base+12
- lda editbuffer2+5
- sta audio_base+13
- lda editbuffer1+7
- sta audio_base+7
+ and #JOY_DATA_SELECT
+ bne notselect
+ lda editbuffer1
+ sta AUDIO_BASE
+ lda editbuffer1+1
+ sta AUDIO_BASE+1
+ lda editbuffer1+2
+ sta AUDIO_BASE+2
+ lda editbuffer1+3
+ sta AUDIO_BASE+3
+ lda editbuffer1+4
+ sta AUDIO_BASE+4
+ lda editbuffer1+5
+ sta AUDIO_BASE+5
+ lda editbuffer1+6
+ sta AUDIO_BASE+6
+ lda editbuffer2
+ sta AUDIO_BASE+8
+ lda editbuffer2+1
+ sta AUDIO_BASE+9
+ lda editbuffer2+2
+ sta AUDIO_BASE+10
+ lda editbuffer2+3
+ sta AUDIO_BASE+11
+ lda editbuffer2+4
+ sta AUDIO_BASE+12
+ lda editbuffer2+5
+ sta AUDIO_BASE+13
+ lda editbuffer1+7
+ sta AUDIO_BASE+7
notselect:lda controlsedge
- and #button_a
- bne notbuttona
- ldy #0
- ldy #0
+ and #JOY_DATA_FIRE_A
+ bne notbuttona
+ ldy #0
+ ldy #0
writea:lda editbuffer1,y
- sta (writeaddr),y
- iny
- cpy #8
- bne writea
+ sta (writeaddr),y
+ iny
+ cpy #8
+ bne writea
writeb:lda editbuffer2-8,y
- sta (writeaddr),y
- iny
- cpy #16
- bne writeb
+ sta (writeaddr),y
+ iny
+ cpy #16
+ bne writeb
notbuttona:lda controlsedge
- and #button_b
- bne notbuttonb
- ldy #0
+ and #JOY_DATA_FIRE_B
+ bne notbuttonb
+ ldy #0
reada:lda (readaddr),y
- sta editbuffer1,y
- iny
- cpy #8
- bne reada
+ sta editbuffer1,y
+ iny
+ cpy #8
+ bne reada
readb:lda (readaddr),y
- sta editbuffer2-8,y
- iny
- cpy #16
- bne readb
+ sta editbuffer2-8,y
+ iny
+ cpy #16
+ bne readb
notbuttonb:
- lda controls
- sta controlslast
- rts
+ lda JOY_DATA
+ sta controlslast
+ rts
.endproc
+;-------------------------------------------------------------------------------
+
.proc printstring
- sta psa
- stx psa+1
- ldx #0
- stx psx
- sty psy
+ sta psa
+ stx psa+1
+ ldx #0
+ stx psx
+ sty psy
printstring2:
- ldy #0
- lda (psa),y
- beq printstring1
- ldx psx
- stx lcd_x
- ldy psy
- sty lcd_y
- jsr printsign
- inc psx
- lda psa
- clc
- adc #1
- sta psa
- lda psa+1
- adc #0
- sta psa+1
- jmp printstring2
+ ldy #0
+ lda (psa),y
+ beq printstring1
+ ldx psx
+ stx LCD_X
+ ldy psy
+ sty LCD_Y
+ jsr printsign
+ inc psx
+ lda psa
+ clc
+ adc #1
+ sta psa
+ lda psa+1
+ adc #0
+ sta psa+1
+ jmp printstring2
printstring1:
- rts
+ rts
.endproc
.proc printstringy
- sta psa
- stx psa+1
+ sta psa
+ stx psa+1
printstring2:
- ldy #0
- lda (psa),y
- beq printstring1
- jsr printsign
- lda psa
- clc
- adc #1
- sta psa
- lda psa+1
- adc #0
- sta psa+1
- jmp printstring2
+ ldy #0
+ lda (psa),y
+ beq printstring1
+ jsr printsign
+ lda psa
+ clc
+ adc #1
+ sta psa
+ lda psa+1
+ adc #0
+ sta psa+1
+ jmp printstring2
printstring1:
- rts
+ rts
.endproc
.proc printhex
- pha
- lsr
- lsr
- lsr
- lsr
- and #$0f
- stx temp_x
- tax
- lda hex2asc,x
- ldx temp_x
- stx lcd_x
- sty lcd_y
- jsr printsign
- pla
- and #$0f
- inx
- stx temp_x
- tax
- lda hex2asc,x
- ldx temp_x
- stx lcd_x
- sty lcd_y
- jmp printsign
+ pha
+ lsr
+ lsr
+ lsr
+ lsr
+ and #$0f
+ stx temp_x
+ tax
+ lda hex2asc,x
+ ldx temp_x
+ stx LCD_X
+ sty LCD_Y
+ jsr printsign
+ pla
+ and #$0f
+ inx
+ stx temp_x
+ tax
+ lda hex2asc,x
+ ldx temp_x
+ stx LCD_X
+ sty LCD_Y
+ jmp printsign
.endproc
.proc printsign
- sty temp_y
- stx temp_x
- sta temp_a
- lda temp_a
- sta addr
- lda #0
- sta addr+1
- asl addr
- rol addr+1
- asl addr
- rol addr+1
- asl addr
- rol addr+1
- lda addr
- clc
- adc #<chars
- sta addr
- lda addr+1
- adc #>chars
- sta addr+1
- ldx #8
- ldy #0
+ sty temp_y
+ stx temp_x
+ sta temp_a
+ lda temp_a
+ sta addr
+ lda #0
+ sta addr+1
+ asl addr
+ rol addr+1
+ asl addr
+ rol addr+1
+ asl addr
+ rol addr+1
+ lda addr
+ clc
+ adc #<chars
+ sta addr
+ lda addr+1
+ adc #>chars
+ sta addr+1
+ ldx #8
+ ldy #0
printsign1:
- lda (addr),y
- sta lcd_data
- iny
- dex
- bne printsign1
- ldx temp_x
- ldy temp_y
- rts
+ lda (addr),y
+ sta LCD_DATA
+ iny
+ dex
+ bne printsign1
+ ldx temp_x
+ ldy temp_y
+ rts
.endproc
--- /dev/null
+
+#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;
+}
- .export reset, irq, nmi ; FIXME
-
-
+ .export _main
.include "gamate.inc"
- .zeropage
+.zeropage
addr: .word 0
psa: .word 0
- .data
+.data
temp_x: .byte 0
temp_y: .byte 0
temp_a: .byte 0
xpos: .byte 0
ypos: .byte 0
- .code
+.code
chars:
-.incbin "cga2.chr"
-
-hex2asc: .byte "0123456789abcdef"
-format: .byte "IrqNmiCountXposYpos", 0
-xdesc: .byte "0123456789abcdefghijklmnopqrstuv", 0
-ydesc: .byte "0123456789ABCDEFGHIJKLMNOPQRSTUV", 0
-
-.proc nmi
- inc nmi_count
- rts
+ .incbin "cga2.chr"
+
+hex2asc: .byte "0123456789abcdef"
+format: .byte "IrqNmiCountXposYpos", 0
+xdesc: .byte "0123456789abcdefghijklmnopqrstuv", 0
+ydesc: .byte "0123456789ABCDEFGHIJKLMNOPQRSTUV", 0
+
+;-------------------------------------------------------------------------------
+
+.proc nmi
+
+ inc nmi_count
+ rts
.endproc
+ .export IRQStub
+
+.proc IRQStub
-.proc irq
- inc irq_count
- lda count
- sta counted
- lda count+1
- sta counted+1
- lda #0
- sta count
- sta count+1
- rts
+ inc irq_count
+ lda count
+ sta counted
+ lda count+1
+ sta counted+1
+ lda #0
+ sta count
+ sta count+1
+ rts
.endproc
-.proc reset
- lda #0
- sta lcd_x_pos
- sta lcd_y_pos
- cli
- lda #lcd_mode_y_increment
- sta lcd_mode
-
- lda #0
- sta lcd_x
- lda #<xdesc
- ldx #>xdesc
- ldy #0
- jsr printstring
-
- lda #lcd_x_pos_plane2_flag
- sta lcd_x
- lda #<xdesc
- ldx #>xdesc
- ldy #128
- jsr printstring
-
- lda #0
- sta lcd_x
- lda #<ydesc
- ldx #>ydesc
- ldy #0
- sty lcd_y
- jsr printstringy
-
-; lda #$90;(lcd_x_pos_plane2_flag|(128/8))
- lda #(lcd_x_pos_plane2_flag|(128/8))
- sta lcd_x
- lda #<ydesc
- ldx #>ydesc
- ldy #0
- sty lcd_y
- jsr printstringy
-
- lda #<format
- ldx #>format
- ldy #8
- jsr printstring
-
- lda #0
- sta lcd_mode
- lda #24/8
- sta lcd_x
- lda #24
- sta lcd_y
- lda #'X'
- jsr printsign
- 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
- sta lcd_mode
- lda #lcd_x_pos_plane2_flag|(48/8)
- sta lcd_x
- 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
- sta lcd_mode
- lda #16/8
- sta lcd_x
- lda #72
- sta lcd_y
- lda #'V'
- jsr printsign
- lda #lcd_mode_y_increment|2
- sta lcd_mode
- lda #24/8
- sta lcd_x
- lda #72
- sta lcd_y
- lda #'V'
- jsr printsign
- lda #lcd_mode_y_increment|4
- sta lcd_mode
- lda #32/8
- sta lcd_x
- lda #72
- sta lcd_y
- lda #'V'
- jsr printsign
- lda #lcd_mode_y_increment|8
- sta lcd_mode
- lda #40/8
- sta lcd_x
- lda #72
- sta lcd_y
- lda #'V'
- jsr printsign
-
-
- lda #1
- sta nmi_enable
+;-------------------------------------------------------------------------------
+
+.proc _main
+
+ lda #0
+ sta LCD_XPOS
+ sta LCD_YPOS
+ cli
+ lda #LCD_MODE_INC_Y
+ sta LCD_MODE
+
+ lda #0
+ sta LCD_X
+ lda #<xdesc
+ ldx #>xdesc
+ ldy #0
+ jsr printstring
+
+ lda #LCD_XPOS_PLANE2
+ sta LCD_X
+ lda #<xdesc
+ ldx #>xdesc
+ ldy #128
+ jsr printstring
+
+ lda #0
+ sta LCD_X
+ lda #<ydesc
+ ldx #>ydesc
+ ldy #0
+ sty LCD_Y
+ jsr printstringy
+
+; lda #$90;(LCD_XPOS_PLANE2|(128/8))
+ lda #(LCD_XPOS_PLANE2|(128/8))
+ sta LCD_X
+ lda #<ydesc
+ ldx #>ydesc
+ ldy #0
+ sty LCD_Y
+ jsr printstringy
+
+ lda #<format
+ ldx #>format
+ ldy #8
+ jsr printstring
+
+ lda #0
+ sta LCD_MODE
+ lda #24/8
+ sta LCD_X
+ lda #24
+ sta LCD_Y
+ lda #'X'
+ jsr printsign
+ 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
+ sta LCD_MODE
+ lda #LCD_XPOS_PLANE2|(48/8)
+ sta LCD_X
+ lda #48
+ sta LCD_Y
+ 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
+ sta ZP_NMI_ENABLE
loop: lda count
- clc
- adc #1
- sta count
- lda count+1
- adc #1
- sta count+1
- lda irq_count
- cmp irq_count
- beq loop
+ clc
+ adc #1
+ sta count
+ lda count+1
+ adc #1
+ sta count+1
+ lda irq_count
+ cmp irq_count
+ beq loop
- jsr inputs
- lda #lcd_mode_y_increment
- sta lcd_mode
- jsr printy
+ jsr inputs
+ lda #LCD_MODE_INC_Y
+ sta LCD_MODE
+ jsr printy
- jmp loop
+ jmp loop
.endproc
+
+;-------------------------------------------------------------------------------
+
.proc printy
- ldx #0
- ldy #16
- lda irq_count
- jsr printhex
-
- ldx #3
- ldy #16
- lda nmi_count
- jsr printhex
-
- ldx #6
- ldy #16
- lda counted+1
- jsr printhex
- ldx #8
- ldy #16
- lda counted
- jsr printhex
-
- ldx #11
- ldy #16
- lda xpos
- jsr printhex
- ldx #14
- ldy #16
- lda ypos
- jsr printhex
- rts
+ ldx #0
+ ldy #16
+ lda irq_count
+ jsr printhex
+
+ ldx #3
+ ldy #16
+ lda nmi_count
+ jsr printhex
+
+ ldx #6
+ ldy #16
+ lda counted+1
+ jsr printhex
+ ldx #8
+ ldy #16
+ lda counted
+ jsr printhex
+
+ ldx #11
+ ldy #16
+ lda xpos
+ jsr printhex
+ ldx #14
+ ldy #16
+ lda ypos
+ jsr printhex
+ rts
.endproc
.proc inputs
- lda controls
- and #up
- bne notup
- dec ypos
- lda ypos
- sta lcd_y_pos
-notup:lda controls
- and #down
- bne notdown
- inc ypos
- lda ypos
- sta lcd_y_pos
-notdown:lda controls
- and #left
- bne notleft
- dec xpos
- lda xpos
- sta lcd_x_pos
-notleft:lda controls
- and #right
- bne notright
- inc xpos
- lda xpos
- sta lcd_x_pos
-notright:lda controls
- and #start
- bne notstart
-notstart:lda controls
- and #select
- bne notselect
-notselect:lda controls
- and #button_a
- bne notbuttona
-notbuttona:lda controls
- and #button_b
- bne notbuttonb
+ lda JOY_DATA
+ and #JOY_DATA_UP
+ bne notup
+ dec ypos
+ lda ypos
+ sta LCD_YPOS
+notup:lda JOY_DATA
+ and #JOY_DATA_DOWN
+ bne notdown
+ inc ypos
+ lda ypos
+ sta LCD_YPOS
+notdown:lda JOY_DATA
+ and #JOY_DATA_LEFT
+ bne notleft
+ dec xpos
+ lda xpos
+ sta LCD_XPOS
+notleft:lda JOY_DATA
+ and #JOY_DATA_RIGHT
+ bne notright
+ inc xpos
+ lda xpos
+ sta LCD_XPOS
+notright:lda JOY_DATA
+ and #JOY_DATA_START
+ bne notstart
+notstart:lda JOY_DATA
+ and #JOY_DATA_SELECT
+ bne notselect
+notselect:lda JOY_DATA
+ and #JOY_DATA_FIRE_A
+ bne notbuttona
+notbuttona:lda JOY_DATA
+ and #JOY_DATA_FIRE_B
+ bne notbuttonb
notbuttonb:rts
.endproc
+;-------------------------------------------------------------------------------
+
.proc printstring
- sta psa
- stx psa+1
- ldx #0
- stx psx
- sty psy
+ sta psa
+ stx psa+1
+ ldx #0
+ stx psx
+ sty psy
printstring2:
- ldy #0
- lda (psa),y
- beq printstring1
- ldx psx
- stx lcd_x
- ldy psy
- sty lcd_y
- jsr printsign
- inc psx
- lda psa
- clc
- adc #1
- sta psa
- lda psa+1
- adc #0
- sta psa+1
- jmp printstring2
+ ldy #0
+ lda (psa),y
+ beq printstring1
+ ldx psx
+ stx LCD_X
+ ldy psy
+ sty LCD_Y
+ jsr printsign
+ inc psx
+ lda psa
+ clc
+ adc #1
+ sta psa
+ lda psa+1
+ adc #0
+ sta psa+1
+ jmp printstring2
printstring1:
- rts
+ rts
.endproc
.proc printstringy
- sta psa
- stx psa+1
+ sta psa
+ stx psa+1
printstring2:
- ldy #0
- lda (psa),y
- beq printstring1
- jsr printsign
- lda psa
- clc
- adc #1
- sta psa
- lda psa+1
- adc #0
- sta psa+1
- jmp printstring2
+ ldy #0
+ lda (psa),y
+ beq printstring1
+ jsr printsign
+ lda psa
+ clc
+ adc #1
+ sta psa
+ lda psa+1
+ adc #0
+ sta psa+1
+ jmp printstring2
printstring1:
- rts
+ rts
.endproc
.proc printhex
- pha
- lsr
- lsr
- lsr
- lsr
- and #$0f
- stx temp_x
- tax
- lda hex2asc,x
- ldx temp_x
- stx lcd_x
- sty lcd_y
- jsr printsign
- pla
- and #$0f
- inx
- stx temp_x
- tax
- lda hex2asc,x
- ldx temp_x
- stx lcd_x
- sty lcd_y
- jmp printsign
+ pha
+ lsr
+ lsr
+ lsr
+ lsr
+ and #$0f
+ stx temp_x
+ tax
+ lda hex2asc,x
+ ldx temp_x
+ stx LCD_X
+ sty LCD_Y
+ jsr printsign
+ pla
+ and #$0f
+ inx
+ stx temp_x
+ tax
+ lda hex2asc,x
+ ldx temp_x
+ stx LCD_X
+ sty LCD_Y
+ jmp printsign
.endproc
.proc printsign
- sty temp_y
- stx temp_x
- sta temp_a
- lda temp_a
- sta addr
- lda #0
- sta addr+1
- asl addr
- rol addr+1
- asl addr
- rol addr+1
- asl addr
- rol addr+1
- lda addr
- clc
- adc #<chars
- sta addr
- lda addr+1
- adc #>chars
- sta addr+1
- ldx #8
- ldy #0
+ sty temp_y
+ stx temp_x
+ sta temp_a
+
+ lda temp_a
+ sta addr
+
+ lda #0
+ sta addr+1
+ asl addr
+ rol addr+1
+ asl addr
+ rol addr+1
+ asl addr
+ rol addr+1
+
+ lda addr
+ clc
+ adc #<chars
+ sta addr
+ lda addr+1
+ adc #>chars
+ sta addr+1
+
+ ldx #8
+ ldy #0
printsign1:
- lda (addr),y
- sta lcd_data
- iny
- dex
- bne printsign1
- ldx temp_x
- ldy temp_y
- rts
+ lda (addr),y
+ sta LCD_DATA
+ iny
+ dex
+ bne printsign1
+
+ ldx temp_x
+ ldy temp_y
+ rts
.endproc
--- /dev/null
+
+#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);
+}