- the Atari 8 bit machines.
- the Atari 5200 console.
- GEOS for the C64, C128 and Apple //e.
+- the Bit Corporation Gamate console.
- the NEC PC-Engine (aka TurboGrafx-16).
- the Nintendo Entertainment System (NES) console.
- the Supervision console.
--- /dev/null
+; 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
+
--- /dev/null
+# c version of 32kbyte config file
+# .data located in rom
+
+# ld65 config file
+# ld65 --config gamate.cfg -o <prog>.bin <prog>.o
+
+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;
+ ROM: start = $6000, size = $8000, fill = yes, fillval = $00, file = %O, define = yes;
+}
+
+SEGMENTS {
+ 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;
+}
+
+FEATURES {
+ CONDES: segment = RODATA,
+ type = constructor,
+ label = __CONSTRUCTOR_TABLE__,
+ count = __CONSTRUCTOR_COUNT__;
+ CONDES: segment = RODATA,
+ type = destructor,
+ label = __DESTRUCTOR_TABLE__,
+ count = __DESTRUCTOR_COUNT__;
+}
--- /dev/null
+<!doctype linuxdoc system>
+
+<article>
+
+<title>Gamate System specific information for cc65
+<author>
+<url url="mailto:groepaz@gmx.net" name="Groepaz/Hitmen">
+<date>2015-11-14
+
+<abstract>
+An overview over the Gamate runtime system as it is implemented for the
+cc65 C compiler.
+</abstract>
+
+<!-- Table of contents -->
+<toc>
+
+<!-- Begin the document -->
+
+<sect>Overview<p>
+
+This file contains an overview of the Gamate runtime system as it comes
+with the cc65 C compiler. It describes the memory layout, Gamate specific header
+files, available drivers, and any pitfalls specific to that platform.
+
+Please note that Gamate specific functions are just mentioned here, they are
+described in detail in the separate <url url="funcref.html" name="function
+reference">. Even functions marked as "platform dependent" may be available on
+more than one platform. Please see the function reference for more
+information.
+
+
+<sect>Binary format<p>
+
+The standard binary output format generated by the linker for the Gamate target
+is a cartridge image with header. It is of course possible to change this
+behaviour by using a modified startup file and linker config.
+
+<sect>Platform specific header files<p>
+
+Programs containing Gamate specific code may use the <tt/gamate.h/ header file.
+
+
+<sect1>Hardware access<p>
+
+The following pseudo variables declared in the <tt/gamate.inc/ include file do
+allow access to hardware located in the address space.
+
+<descrip>
+
+</descrip><p>
+
+
+
+<sect>Loadable drivers<p>
+
+All drivers must be statically linked because no file I/O is available.
+The names in the parentheses denote the symbols to be used for static linking of the drivers.
+
+
+<sect1>Graphics drivers<p>
+
+No TGI graphics drivers are currently available for the Gamate.
+
+
+<sect1>Extended memory drivers<p>
+
+No extended memory drivers are currently available for the Gamate.
+
+
+<sect1>Joystick drivers<p>
+
+<descrip>
+
+ <tag><tt/gamate-stdjoy.joy (gamate_stdjoy)/</tag>
+ A joystick driver for the standard two buttons joypad is available.
+
+</descrip><p>
+
+
+<sect1>Mouse drivers<p>
+
+No mouse drivers are currently available for the Gamate.
+
+
+<sect1>RS232 device drivers<p>
+
+No serial drivers are currently available for the Gamate.
+
+
+
+<sect>Limitations<p>
+
+<itemize>
+<item>interruptor support in crt0 (and cfg) is missing
+</itemize>
+
+<sect1>Disk I/O<p>
+
+The existing library for the Gamate doesn't implement C file
+I/O. There are no hacks for the <tt/read()/ and <tt/write()/ routines.
+
+To be more concrete, this limitation means that you cannot use any of the
+following functions (and a few others):
+
+<itemize>
+<item>printf
+<item>fclose
+<item>fopen
+<item>fread
+<item>fprintf
+<item>fputc
+<item>fscanf
+<item>fwrite
+<item>...
+</itemize>
+
+<sect>Other hints<p>
+
+<itemize>
+<item>a good emulator to use for Gamate is "MESS/MAME" (<url url="http://www.mess.org/">)
+</itemize>
+
+some resources on the Gamate:
+
+<itemize>
+<item><url url="http://en.wikipedia.org/wiki/Gamate">
+</itemize>
+
+<sect>License<p>
+
+This software is provided 'as-is', without any expressed or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+<enum>
+<item> The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+<item> Altered source versions must be plainly marked as such, and must not
+ be misrepresented as being the original software.
+<item> This notice may not be removed or altered from any source
+ distribution.
+</enum>
+
+</article>
+
+
+
<tag><htmlurl url="pce.html" name="pce.html"></tag>
Topics specific to NEC PC-Engine (TurboGrafx) Console.
+ <tag><htmlurl url="gamate.html" name="gamate.html"></tag>
+ Topics specific to Bit Corporation Gamate Console.
+
<tag><htmlurl url="pet.html" name="pet.html"></tag>
Topics specific to the Commodore PET machines.
# include <atmos.h>
#elif defined(__CBM__)
# include <cbm.h>
+#elif defined(__GAMATE__)
+# include <gamate.h>
#elif defined(__GEOS__)
# include <geos.h>
#elif defined(__LUNIX__)
--- /dev/null
+/*****************************************************************************/
+/* */
+/* gamate.h */
+/* */
+/* Gamate system specific definitions */
+/* */
+/* */
+/* */
+/* (C) 2015 Groepaz/Hitmen */
+/* */
+/* */
+/* This software is provided 'as-is', without any expressed or implied */
+/* warranty. In no event will the authors be held liable for any damages */
+/* arising from the use of this software. */
+/* */
+/* Permission is granted to anyone to use this software for any purpose, */
+/* including commercial applications, and to alter it and redistribute it */
+/* freely, subject to the following restrictions: */
+/* */
+/* 1. The origin of this software must not be misrepresented; you must not */
+/* claim that you wrote the original software. If you use this software */
+/* in a product, an acknowledgment in the product documentation would be */
+/* appreciated but is not required. */
+/* 2. Altered source versions must be plainly marked as such, and must not */
+/* be misrepresented as being the original software. */
+/* 3. This notice may not be removed or altered from any source */
+/* distribution. */
+/* */
+/*****************************************************************************/
+
+#ifndef _GAMATE_H
+#define _GAMATE_H
+
+/* Check for errors */
+#if !defined(__GAMATE__)
+# error This module may only be used when compiling for the Gamate!
+#endif
+
+
+
+/* End of gamate.h */
+#endif
+
#elif defined(__PCE__)
# define CLK_TCK 60 /* POSIX */
# define CLOCKS_PER_SEC 60 /* ANSI */
+#elif defined(__GAMATE__)
+# define CLK_TCK 60 /* POSIX */ /* FIXME */
+# define CLOCKS_PER_SEC 60 /* ANSI */ /* FIXME */
#elif defined(__GEOS__)
# define CLK_TCK 1 /* POSIX */
# define CLOCKS_PER_SEC 1 /* ANSI */
atmos \
$(CBMS) \
$(GEOS) \
+ gamate \
lynx \
nes \
osic1p \
NewSymbol ("__APPLE2ENH__", 1);
break;
+ case TGT_GAMATE:
+ NewSymbol ("__GAMATE__", 1);
+ break;
+
case TGT_GEOS_CBM:
/* Do not handle as a CBM system */
NewSymbol ("__GEOS__", 1);
DefineNumericMacro ("__APPLE2ENH__", 1);
break;
+ case TGT_GAMATE:
+ DefineNumericMacro ("__GAMATE__", 1);
+ break;
+
case TGT_GEOS_CBM:
/* Do not handle as a CBM system */
DefineNumericMacro ("__GEOS__", 1);
{ "c64", TGT_C64 },
{ "cbm510", TGT_CBM510 },
{ "cbm610", TGT_CBM610 },
+ { "gamate", TGT_GAMATE },
{ "geos", TGT_GEOS_CBM },
{ "geos-apple", TGT_GEOS_APPLE },
{ "geos-cbm", TGT_GEOS_CBM },
{ "sim6502", CPU_6502, BINFMT_BINARY, CTNone },
{ "sim65c02", CPU_65C02, BINFMT_BINARY, CTNone },
{ "pce", CPU_HUC6280, BINFMT_BINARY, CTNone },
+ { "gamate", CPU_6502, BINFMT_BINARY, CTNone },
};
/* Target system */
TGT_SIM6502,
TGT_SIM65C02,
TGT_PCENGINE,
+ TGT_GAMATE,
TGT_COUNT /* Number of target systems */
} target_t;
--- /dev/null
+.include "gamate.inc"
+ .zeropage
+addr: .word 0
+psa: .word 0
+
+.word 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0 ; get out of sensitiv area
+
+readaddr: .word 0
+editbuffer1: .byte 0,0,0,0, 0,0,0,0 ;0,1,2,3,4,5,6,7
+writeaddr: .word 0
+editbuffer2: .byte 0,0,0,0, 0,0,0,0 ;8,9,$a,$b,$c,$d,$e,$f
+cursor: .byte 0
+controlslast: .byte 0
+controlsedge: .byte 0
+
+ .data
+temp_x: .byte 0
+temp_y: .byte 0
+temp_a: .byte 0
+irq_count: .byte 0
+nmi_count: .byte 0
+psx: .byte 0
+psy: .byte 0
+xpos: .byte 0
+ypos: .byte 0
+
+ .code
+checksum: .word 0
+ .byte 1,0,1
+ .byte "COPYRIGHT BIT CORPORATION", 0, $ff
+ jmp reset
+ jmp nmi
+ jmp irq
+
+chars:
+.incbin "cga2.chr"
+
+hex2asc: .byte "0123456789abcdef"
+
+.proc nmi
+ inc nmi_count
+ rts
+.endproc
+
+.proc irq
+ 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
+
+loop:
+ 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
+firstline:
+ 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
+firstline2:
+ sta lcd_x
+ sty lcd_y
+ lda #'x'
+ jsr printsign
+nocursor:
+
+ lda #lcd_mode_y_increment
+ sta lcd_mode
+ jsr printy
+ jmp loop
+.endproc
+
+.proc printy
+
+ ldy #0
+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
+.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
+uplow:lda 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
+downlow:
+ lda readaddr,y
+ sec
+ sbc #1
+ sta readaddr,y
+notdown:lda controlsedge
+ and #left
+ bne notleft
+ lda cursor
+ beq notleft
+ dec cursor
+notleft:lda controlsedge
+ and #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
+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
+notselect:lda controlsedge
+ and #button_a
+ bne notbuttona
+ ldy #0
+ ldy #0
+writea:lda editbuffer1,y
+ sta (writeaddr),y
+ iny
+ cpy #8
+ bne writea
+writeb:lda editbuffer2-8,y
+ sta (writeaddr),y
+ iny
+ cpy #16
+ bne writeb
+notbuttona:lda controlsedge
+ and #button_b
+ bne notbuttonb
+ ldy #0
+reada:lda (readaddr),y
+ sta editbuffer1,y
+ iny
+ cpy #8
+ bne reada
+readb:lda (readaddr),y
+ sta editbuffer2-8,y
+ iny
+ cpy #16
+ bne readb
+notbuttonb:
+ lda controls
+ sta controlslast
+ rts
+.endproc
+
+.proc printstring
+ 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
+printstring1:
+ rts
+.endproc
+
+.proc printstringy
+ 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
+printstring1:
+ 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
+.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
+printsign1:
+ lda (addr),y
+ sta lcd_data
+ iny
+ dex
+ bne printsign1
+ ldx temp_x
+ ldy temp_y
+ rts
+.endproc
+
--- /dev/null
+.include "gamate.inc"
+ .zeropage
+addr: .word 0
+psa: .word 0
+
+ .data
+temp_x: .byte 0
+temp_y: .byte 0
+temp_a: .byte 0
+irq_count: .byte 0
+nmi_count: .byte 0
+psx: .byte 0
+psy: .byte 0
+count: .word 0
+counted: .word 0
+xpos: .byte 0
+ypos: .byte 0
+
+ .code
+checksum: .word 0
+ .byte 1,0,1
+ .byte "COPYRIGHT BIT CORPORATION", 0, $ff
+ jmp reset
+ jmp nmi
+ jmp irq
+
+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
+.endproc
+
+.proc irq
+ 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
+
+loop: lda count
+ 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
+
+
+
+ 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
+.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
+notbuttonb:rts
+.endproc
+
+.proc printstring
+ 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
+printstring1:
+ rts
+.endproc
+
+.proc printstringy
+ 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
+printstring1:
+ 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
+.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
+printsign1:
+ lda (addr),y
+ sta lcd_data
+ iny
+ dex
+ bne printsign1
+ ldx temp_x
+ ldy temp_y
+ rts
+.endproc
+