From: mrdudz Date: Sun, 29 Nov 2015 00:14:59 +0000 (+0100) Subject: conio and most other stuff working now X-Git-Tag: V2.16~178^2~14 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=9fbf8a4299865c3bef3adb0794680c06dfb7a6b7;p=cc65 conio and most other stuff working now --- diff --git a/asminc/gamate.inc b/asminc/gamate.inc index fda288e5f..167c9b1e1 100644 --- a/asminc/gamate.inc +++ b/asminc/gamate.inc @@ -1,43 +1,70 @@ -; 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 diff --git a/cfg/gamate.cfg b/cfg/gamate.cfg index c6f2eed7d..577dfeb1d 100644 --- a/cfg/gamate.cfg +++ b/cfg/gamate.cfg @@ -1,41 +1,39 @@ -# c version of 32kbyte config file -# .data located in rom - -# ld65 config file -# ld65 --config gamate.cfg -o .bin .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__; } diff --git a/include/gamate.h b/include/gamate.h index 3c141f0e9..f89f5204e 100644 --- a/include/gamate.h +++ b/include/gamate.h @@ -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 */ /* 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! #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 diff --git a/libsrc/gamate/_scrsize.s b/libsrc/gamate/_scrsize.s new file mode 100644 index 000000000..f26f22d2b --- /dev/null +++ b/libsrc/gamate/_scrsize.s @@ -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 diff --git a/libsrc/gamate/chline.s b/libsrc/gamate/chline.s new file mode 100644 index 000000000..2d96c9d2f --- /dev/null +++ b/libsrc/gamate/chline.s @@ -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 + + + + diff --git a/libsrc/gamate/clock.s b/libsrc/gamate/clock.s new file mode 100644 index 000000000..223c07967 --- /dev/null +++ b/libsrc/gamate/clock.s @@ -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 diff --git a/libsrc/gamate/clrscr.s b/libsrc/gamate/clrscr.s new file mode 100644 index 000000000..c96fc4eda --- /dev/null +++ b/libsrc/gamate/clrscr.s @@ -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 diff --git a/libsrc/gamate/color.s b/libsrc/gamate/color.s new file mode 100644 index 000000000..07bc25af9 --- /dev/null +++ b/libsrc/gamate/color.s @@ -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 diff --git a/libsrc/gamate/conio.s b/libsrc/gamate/conio.s new file mode 100644 index 000000000..4840b372c --- /dev/null +++ b/libsrc/gamate/conio.s @@ -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" diff --git a/libsrc/gamate/cputc.s b/libsrc/gamate/cputc.s new file mode 100644 index 000000000..0ebd659b2 --- /dev/null +++ b/libsrc/gamate/cputc.s @@ -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 diff --git a/libsrc/gamate/crt0.s b/libsrc/gamate/crt0.s index 66ff8054c..b54d8ade1 100644 --- a/libsrc/gamate/crt0.s +++ b/libsrc/gamate/crt0.s @@ -1,16 +1,78 @@ .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 diff --git a/libsrc/gamate/ctype.s b/libsrc/gamate/ctype.s new file mode 100644 index 000000000..fa9a65c8b --- /dev/null +++ b/libsrc/gamate/ctype.s @@ -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 + + diff --git a/libsrc/gamate/cvline.s b/libsrc/gamate/cvline.s new file mode 100644 index 000000000..b22890815 --- /dev/null +++ b/libsrc/gamate/cvline.s @@ -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 + + + diff --git a/libsrc/gamate/extzp.inc b/libsrc/gamate/extzp.inc new file mode 100644 index 000000000..3e24d6e45 --- /dev/null +++ b/libsrc/gamate/extzp.inc @@ -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 + diff --git a/libsrc/gamate/extzp.s b/libsrc/gamate/extzp.s new file mode 100644 index 000000000..d3189dcdd --- /dev/null +++ b/libsrc/gamate/extzp.s @@ -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 diff --git a/libsrc/gamate/gotoxy.s b/libsrc/gamate/gotoxy.s new file mode 100644 index 000000000..407da1f2f --- /dev/null +++ b/libsrc/gamate/gotoxy.s @@ -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 + diff --git a/libsrc/gamate/irq.s b/libsrc/gamate/irq.s new file mode 100644 index 000000000..4adbcb405 --- /dev/null +++ b/libsrc/gamate/irq.s @@ -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 diff --git a/libsrc/gamate/joy/gamate-stdjoy.s b/libsrc/gamate/joy/gamate-stdjoy.s new file mode 100644 index 000000000..8b18bae7a --- /dev/null +++ b/libsrc/gamate/joy/gamate-stdjoy.s @@ -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 + +; 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 + rts + +; ------------------------------------------------------------------------ +; READ: Read a particular joystick passed in A. +; +;unsigned char __fastcall__ joy_read (unsigned char joystick); + +READJOY: + lda JOY_DATA + ldx #0 + rts + diff --git a/libsrc/gamate/joy_stat_stddrv.s b/libsrc/gamate/joy_stat_stddrv.s new file mode 100644 index 000000000..75016450a --- /dev/null +++ b/libsrc/gamate/joy_stat_stddrv.s @@ -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 diff --git a/libsrc/gamate/joy_stddrv.s b/libsrc/gamate/joy_stddrv.s new file mode 100644 index 000000000..b830d8d86 --- /dev/null +++ b/libsrc/gamate/joy_stddrv.s @@ -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" diff --git a/libsrc/gamate/kplot.s b/libsrc/gamate/kplot.s new file mode 100644 index 000000000..9091109b6 --- /dev/null +++ b/libsrc/gamate/kplot.s @@ -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 diff --git a/libsrc/gamate/libref.s b/libsrc/gamate/libref.s new file mode 100644 index 000000000..e4afa7eb1 --- /dev/null +++ b/libsrc/gamate/libref.s @@ -0,0 +1,8 @@ +; +; Oliver Schmidt, 2013-05-31 +; + + .export joy_libref + .import _exit + +joy_libref := _exit diff --git a/libsrc/gamate/revers.s b/libsrc/gamate/revers.s new file mode 100644 index 000000000..3b237e45b --- /dev/null +++ b/libsrc/gamate/revers.s @@ -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 diff --git a/libsrc/gamate/ticktock.s b/libsrc/gamate/ticktock.s new file mode 100644 index 000000000..81f64dcf2 --- /dev/null +++ b/libsrc/gamate/ticktock.s @@ -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 diff --git a/libsrc/gamate/vga.inc b/libsrc/gamate/vga.inc new file mode 100644 index 000000000..f605258bb --- /dev/null +++ b/libsrc/gamate/vga.inc @@ -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 diff --git a/libsrc/gamate/waitvblank.s b/libsrc/gamate/waitvblank.s new file mode 100644 index 000000000..66686c08a --- /dev/null +++ b/libsrc/gamate/waitvblank.s @@ -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 diff --git a/libsrc/gamate/wherex.s b/libsrc/gamate/wherex.s new file mode 100644 index 000000000..94d9ae741 --- /dev/null +++ b/libsrc/gamate/wherex.s @@ -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 + + diff --git a/libsrc/gamate/wherey.s b/libsrc/gamate/wherey.s new file mode 100644 index 000000000..70e2f54fe --- /dev/null +++ b/libsrc/gamate/wherey.s @@ -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 + + diff --git a/src/common/target.c b/src/common/target.c index ebd05cbf1..e89010123 100644 --- a/src/common/target.c +++ b/src/common/target.c @@ -205,7 +205,7 @@ static const TargetProperties PropertyTable[TGT_COUNT] = { { "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 */ diff --git a/testcode/lib/conio.c b/testcode/lib/conio.c index 3a8048632..2ae6b46b3 100644 --- a/testcode/lib/conio.c +++ b/testcode/lib/conio.c @@ -14,6 +14,14 @@ #include #include +#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 }, @@ -29,8 +37,10 @@ void main(void) 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 */ @@ -38,14 +48,14 @@ void main(void) 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); @@ -63,13 +73,13 @@ void main(void) } } - 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 { @@ -89,13 +99,14 @@ void main(void) 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')) { @@ -120,6 +131,10 @@ void main(void) cputc(i); inpos = (inpos + 1) & 7; } +#endif +#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__) + waitvblank(); +#endif ++n; } diff --git a/testcode/lib/gamate/Makefile b/testcode/lib/gamate/Makefile index 943f6c195..3fe95b693 100644 --- a/testcode/lib/gamate/Makefile +++ b/testcode/lib/gamate/Makefile @@ -1,21 +1,20 @@ -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 diff --git a/testcode/lib/gamate/audiotest.s b/testcode/lib/gamate/audiotest.s index a5b2143ce..0375592f3 100644 --- a/testcode/lib/gamate/audiotest.s +++ b/testcode/lib/gamate/audiotest.s @@ -1,8 +1,10 @@ - .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 @@ -16,7 +18,7 @@ cursor: .byte 0 controlslast: .byte 0 controlsedge: .byte 0 - .data +.data temp_x: .byte 0 temp_y: .byte 0 temp_a: .byte 0 @@ -27,405 +29,414 @@ psy: .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+1 + sta readaddr+1 + lda #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+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 diff --git a/testcode/lib/gamate/ctest.c b/testcode/lib/gamate/ctest.c new file mode 100644 index 000000000..a953e0e63 --- /dev/null +++ b/testcode/lib/gamate/ctest.c @@ -0,0 +1,52 @@ + +#include +#include +#include + +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; +} diff --git a/testcode/lib/gamate/lcdtest.s b/testcode/lib/gamate/lcdtest.s index b4798c677..617f89959 100644 --- a/testcode/lib/gamate/lcdtest.s +++ b/testcode/lib/gamate/lcdtest.s @@ -1,14 +1,12 @@ - .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 @@ -21,363 +19,381 @@ counted: .word 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 - ldy #0 - jsr printstring - - lda #lcd_x_pos_plane2_flag - sta lcd_x - lda #xdesc - ldy #128 - jsr printstring - - lda #0 - sta lcd_x - lda #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 - ldy #0 - sty lcd_y - jsr printstringy - - lda #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 + ldy #0 + jsr printstring + + lda #LCD_XPOS_PLANE2 + sta LCD_X + lda #xdesc + ldy #128 + jsr printstring + + lda #0 + sta LCD_X + lda #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 + ldy #0 + sty LCD_Y + jsr printstringy + + lda #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+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+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 diff --git a/util/gamate/gamate-fixcart.c b/util/gamate/gamate-fixcart.c new file mode 100644 index 000000000..a99483844 --- /dev/null +++ b/util/gamate/gamate-fixcart.c @@ -0,0 +1,25 @@ + +#include +#include + +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); +}