1
0
mirror of https://github.com/cc65/cc65.git synced 2024-07-05 21:29:03 +00:00

Merge pull request #146 from smuehlst/c1p

Add target "osic1p" for Ohio Scientific Challenger 1P
This commit is contained in:
Oliver Schmidt 2015-02-18 20:17:03 +01:00
commit cbb6f82b99
31 changed files with 1085 additions and 0 deletions

View File

@ -27,6 +27,7 @@ including
- the Supervision console.
- the Oric Atmos.
- the Lynx console.
- the Ohio Scientific Challenger 1P
The libraries are fairly portable, so creating a version for other 6502s
shouldn't be too much work.

20
cfg/osic1p-asm.cfg Normal file
View File

@ -0,0 +1,20 @@
FEATURES {
STARTADDRESS: default = $0200;
}
SYMBOLS {
__STACKSIZE__: type = weak, value = $0400; # 1 kB stack
__HIMEM__: type = weak, value = $8000; # 32 kB RAM
}
MEMORY {
# for size of ZP see runtime/zeropage.s and c1p/extzp.s
ZP: file = "", define = yes, start = $0002, size = $001A + $0006;
RAM: file = %O, define = yes, start = %S, size = __HIMEM__ - __STACKSIZE__ - %S;
}
SEGMENTS {
INIT: load = RAM, type = ro, define = yes, optional = yes;
CODE: load = RAM, type = rw;
RODATA: load = RAM, type = rw;
DATA: load = RAM, type = rw;
BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp;
}

33
cfg/osic1p.cfg Normal file
View File

@ -0,0 +1,33 @@
FEATURES {
STARTADDRESS: default = $0200;
}
SYMBOLS {
__STACKSIZE__: type = weak, value = $0400; # 1 kB stack
__HIMEM__: type = weak, value = $8000; # 32 kB RAM
}
MEMORY {
# for size of ZP see runtime/zeropage.s and c1p/extzp.s
ZP: file = "", define = yes, start = $0002, size = $001A + $0004;
RAM: file = %O, define = yes, start = %S, size = __HIMEM__ - __STACKSIZE__ - %S;
}
SEGMENTS {
STARTUP: load = RAM, type = ro;
LOWCODE: load = RAM, type = ro, optional = yes;
INIT: load = RAM, type = ro, define = yes, optional = yes;
CODE: load = RAM, type = rw;
RODATA: load = RAM, type = rw;
DATA: load = RAM, type = rw;
BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp;
EXTZP: load = ZP, type = rw, define = yes;
}
FEATURES {
CONDES: type = constructor,
label = __CONSTRUCTOR_TABLE__,
count = __CONSTRUCTOR_COUNT__,
segment = INIT;
CONDES: type = destructor,
label = __DESTRUCTOR_TABLE__,
count = __DESTRUCTOR_COUNT__,
segment = RODATA;
}

View File

@ -134,6 +134,9 @@
<tag><htmlurl url="nes.html" name="nes.html"></tag>
Topics specific to the Nintendo Entertainment System.
<tag><htmlurl url="osi.html" name="osi.html"></tag>
Topics specific to the Ohio Scientific machines.
<tag><htmlurl url="pet.html" name="pet.html"></tag>
Topics specific to the Commodore PET machines.

View File

@ -513,6 +513,75 @@ directory notePad. Look at the eight file-positions on each page until you see
The output is shown in a GEOS dialog box; click <bf/OK/ when you have finished
reading it.
<sect1>Ohio Scientific Challenger 1P<p>
Available at <url url="http://www.pcjs.org/docs/c1pjs/" name="C1Pjs">:
Emulates the Ohio Scientific Challenger 1P computer in different configurations.
The 32 kb RAM machine that must be used with the default compiler settings is
<url url="http://www.pcjs.org/devices/c1p/machine/32kb/" name="here">.
In addition to cc65 the srec_cat program from the
<url url="http://srecord.sourceforge.net/" name="SRecord">
tool collection must be installed. Some Linux distributions also provide the
srecord package directly as an installable package.
The osic1p runtime library returns to the boot prompt when the
main() program exits. Therefore the C file in the tutorial must be slightly
modified in order to see the results on the screen. Otherwise the program
would print the text string and then jump to the boot prompt, making it
impossible to see the results of running the tutorial program.
In addition to that the osic1p target does not yet have support for stdio
functions. Only the functions from the conio library are available.
Therefore modify the hello.c source file as follows:
<tscreen><code>
#include <conio.h>
#include <stdlib.h>
extern const char text[]; /* In text.s */
int main (void)
{
clrscr ();
cprintf ("%s\r\nPress <RETURN>\r\n", text);
cgetc ();
return EXIT_SUCCESS;
}
</code></tscreen>
Compile the tutorial with
<tscreen><verb>
cl65 -O -t osic1p hello.c text.s
</verb></tscreen>
Convert the executable file into a text file that can be loaded via
the Ohio Scientific 65V PROM monitor at start address 0x200:
<tscreen><verb>
srec_cat hello -binary -offset 0x200 -o hello.c1p -Ohio_Scientific -execution-start-address=0x200
</verb></tscreen>
Open the URL <url url="http://www.pcjs.org/devices/c1p/machine/32kb/" name="http://www.pcjs.org/devices/c1p/machine/32kb/">
and wait until the emulator has been loaded. Click on the "BREAK"
button to display the boot prompt, then press the "M" key to enter the
65V PROM monitor. Click the "Choose File" button and select the file "hello.c1p"
that was created as the output of the above invocation of the "srec_cat"
command. Press the "Load" button. You should see the following text on the
screen:
<tscreen><verb>
Hello world!
Press <RETURN>
</verb></tscreen>
After hitting the RETURN key you should see the boot prompt again.
The program can also be uploaded over the serial port to a real Challenger 1P
computer with 32 kB RAM. See the <url url="osi.html" name="Ohio Scientifc-specific documentation"> for instructions how to
compile for other RAM sizes.
<sect1>Contributions wanted<p>

180
doc/osi.sgml Normal file
View File

@ -0,0 +1,180 @@
<!doctype linuxdoc system>
<article>
<title>Ohio Scientific-specific information for cc65
<author>
<url url="mailto:stephan.muehlstrasser@web.de" name="Stephan M&uuml;hlstrasser"><newline>
<date>2015-02-04
<abstract>
An overview over the Ohio Scientific 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 Ohio Scientific runtime system as it comes with the
cc65 C compiler. It describes the memory layout, Ohio Scientific-specific header files,
and any pitfalls specific to that platform.
Please note that Ohio Scientific-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>Targets<p>
Currently the target "osic1p" is implemented. This works for the Ohio Scientific
Challenger 1P machine.
<sect>Binary format<p>
The standard binary output format generated by the linker for the osic1p target
is a machine language program.<p>
For uploading into a real machine over the serial port or into an emulator a
program must be converted to a text file that is understood by the 65V PROM
monitor. For this purpose the srec_cat program from the
<url url="http://srecord.sourceforge.net/" name="SRecord">
tool collection can be used.
Care must be taken that the -offset and -execution-start-address options for the srec_cat
program correspond to the start address of the executable.
Example for converting an executable "hello" that was built for the default
start address &dollar;0200 to an uploadable file "hello.c1p":
<tscreen>
srec_cat hello -binary -offset 0x200 -o hello.c1p -Ohio_Scientific -execution-start-address=0x200
</tscreen>
<sect>Memory layout<p>
By default programs compiled for the osic1p target are configured for 32 kB RAM.
The RAM size can be configured via the symbol __HIMEM__.
Special locations:
<descrip>
<tag/Program start address/
The default start address is &dollar;0200. The start address is configurable
via the compiler option --start-addr.
<tag/Stack/
The C runtime stack is located at the top of RAM and growing downwards.
The size is configurable via the symbol __STACKSIZE__. The default
stack size is &dollar;0400.
<tag/Heap/
The C heap is located at the end of the program and grows towards the C
runtime stack.
<tag/Video RAM/
The 1 kB video RAM is located at &dollar;D000. On the monitor only a subset
of the available video RAM is visible. The address of the upper left corner
of the visible area is &dollar;D085 and corresponds to conio cursor
position (0, 0).
</descrip><p>
Example for building a program with start address &dollar;0300, stack size
&dollar;0200 and RAM size &dollar;2000:
<tscreen>
cl65 --start-addr 0x300 -Wl -D,__HIMEM__=$2000,-D,__STACKSIZE__=$0200 -t osic1p hello.c
</tscreen>
<sect>Linker configurations<p>
The ld65 linker comes with a default config file "osic1p.cfg" for the Ohio Scientific
Challenger 1P, which is implicitly used via <tt/-t osic1p/. The
osic1p package comes with additional secondary linker config files, which are
used via <tt/-t osic1p -C &lt;configfile&gt;/.
<sect1>default config file (<tt/osic1p.cfg/)<p>
The default configuration is tailored to C programs.
<sect1><tt/osic1p-asm.cfg/<p>
This configuration is made for assembler programmers who don't need a special
setup.
To use this config file, assemble with <tt/-t osic1p/ and link with
<tt/-C osic1p-asm.cfg/. The former will make sure that correct runtime library
is used, while the latter supplies the actual config. When using <tt/cl65/,
use both command line options.
Sample command line for <tt/cl65/:
<tscreen><verb>
cl65 -o program -t osic1p -C osic1p-asm.cfg source.s
</verb></tscreen>
<sect>Platform-specific header files<p>
Programs containing Ohio Scientific-specific code may use the <tt/osic1p.h/
header file.
<sect1>Ohio Scientific-specific functions<p>
There are currently no special Ohio Scientific functions.
<sect1>Hardware access<p>
There is no specific support for direct hardware access.
<sect>Loadable drivers<p>
There are no loadable drivers available.
<sect>Limitations<p>
<sect1>conio implementation<p>
The conio implementation is complete except for a kbhit() function.
<sect1>stdio implementation<p>
There is no support for stdio at the moment.
<sect>Other hints<p>
<sect1>Passing arguments to the program<p>
There is currently no support for passing arguments to a program.
<sect1>Program return code<p>
The program return code currently has no effect. When the main() function
finishes, the boot prompt is shown again.
<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>

View File

@ -77,6 +77,8 @@
# include <lynx.h>
#elif defined(__NES__)
# include <nes.h>
#elif defined(__OSIC1P__)
# include <osic1p.h>
#endif

47
include/osic1p.h Normal file
View File

@ -0,0 +1,47 @@
/*****************************************************************************/
/* */
/* osic1p.h */
/* */
/* Challenger 1P system specific definitions */
/* */
/* */
/* */
/* (C) 2015 Stephan Muehlstrasser */
/* */
/* */
/* 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 _OSIC1P_H
#define _OSIC1P_H
/* Check for errors */
#if !defined(__OSIC1P__)
# error "This module may only be used when compiling for the Challenger 1P!"
#endif
/* The following #defines will cause the matching functions calls in conio.h
** to be overlaid by macros with the same names, saving the function call
** overhead.
*/
#define _textcolor(color) COLOR_WHITE
#define _bgcolor(color) COLOR_BLACK
#define _bordercolor(color) COLOR_BLACK
#endif

View File

@ -24,6 +24,7 @@ TARGETS = apple2 \
$(GEOS) \
lynx \
nes \
osic1p \
sim6502 \
sim65c02 \
supervision

19
libsrc/osic1p/_scrsize.s Normal file
View File

@ -0,0 +1,19 @@
;
; based on PET implementation
;
; originally by:
; Ullrich von Bassewitz, 26.10.2000
;
; Screen size variables
;
.export screensize
.include "extzp.inc"
.include "osic1p.inc"
.proc screensize
ldx #(SCR_LINELEN + 1)
ldy #(SCR_HEIGHT + 1)
rts
.endproc

29
libsrc/osic1p/cclear.s Normal file
View File

@ -0,0 +1,29 @@
;
; Copied from CBM implementation
;
; originally by:
; Ullrich von Bassewitz, 08.08.1998
;
; void cclearxy (unsigned char x, unsigned char y, unsigned char length);
; void cclear (unsigned char length);
;
.export _cclearxy, _cclear
.import popa, _gotoxy, cputdirect
.importzp tmp1
_cclearxy:
pha ; Save the length
jsr popa ; Get y
jsr _gotoxy ; Call this one, will pop params
pla ; Restore the length and run into _cclear
_cclear:
cmp #0 ; Is the length zero?
beq L9 ; Jump if done
sta tmp1
L1: lda #$20 ; Blank - screen code
jsr cputdirect ; Direct output
dec tmp1
bne L1
L9: rts

31
libsrc/osic1p/cgetc.s Normal file
View File

@ -0,0 +1,31 @@
;
; char cgetc (void);
;
.export _cgetc
.import cursor
.include "osic1p.inc"
.include "extzp.inc"
.include "zeropage.inc"
; Input routine from 65V PROM MONITOR, show cursor if enabled
_cgetc:
lda cursor ; show cursor?
beq nocursor
ldy CURS_X
lda (SCREEN_PTR),y ; fetch current character
sta tmp1 ; save it
lda #$A1 ; full white square
sta (SCREEN_PTR),y ; store at cursor position
nocursor:
jsr INPUTC ; get input character in A
ldx cursor
beq done ; was cursor on?
tax ; save A in X
lda tmp1 ; fetch saved character
ldy CURS_X
sta (SCREEN_PTR),y ; store at cursor position
txa ; restore saved character from X
ldx #$00 ; high byte of int return value
done:
rts

29
libsrc/osic1p/chline.s Normal file
View File

@ -0,0 +1,29 @@
;
; based on CBM implementation
;
; originally by:
; 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
_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 #$94 ; Horizontal line, screen code
jsr cputdirect ; Direct output
dec tmp1
bne L1
L9: rts

31
libsrc/osic1p/clrscr.s Normal file
View File

@ -0,0 +1,31 @@
;
; void clrscr (void);
;
.export _clrscr
.import plot
.include "extzp.inc"
.include "osic1p.inc"
; Adapted from the Challenger Character Graphics
; Reference Manual, "2.3.3 MACHINE LANGUAGE SCREEN CLEAR"
; This is self-modifying code!
BANKS = VIDEORAMSIZE / $100
_clrscr:
lda #$20 ; ' '
ldy #BANKS
ldx #$00
staloc:
sta SCRNBASE,X
inx
bne staloc
inc staloc+2
dey
bne staloc
lda #>(SCRNBASE) ; Load high byte
sta staloc+2 ; Restore base address
lda #$00 ; Cursor in upper left corner
sta CURS_X
sta CURS_Y
jmp plot ; Set the cursor position

81
libsrc/osic1p/cputc.s Normal file
View File

@ -0,0 +1,81 @@
;
; cputc/cputcxy for Challenger 1P
; Based on PET/CBM implementation
;
; 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
.include "osic1p.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 #$0A ; CR?
bne L1
lda #0
sta CURS_X
beq plot ; Recalculate pointers
L1: cmp #$0D ; LF?
beq newline ; Recalculate pointers
cputdirect:
jsr putchar ; Write the character to the screen
; Advance cursor position
advance:
cpy #SCR_LINELEN ; xsize-1
bne L3
jsr newline ; new line
ldy #$FF ; + cr
L3: iny
sty CURS_X
rts
newline:
inc CURS_Y
lda CURS_Y
cmp #SCR_HEIGHT ; screen height
bne plot
lda #0 ; wrap around to line 0
sta CURS_Y
plot: ldy CURS_Y
lda ScrLo,y
sta SCREEN_PTR
lda ScrHi,y
sta SCREEN_PTR+1
rts
; Write one character to the screen without doing anything else, return X
; position in Y
putchar:
ldy CURS_X
sta (SCREEN_PTR),y ; Set char
rts
; Screen address tables - offset to real screen
.rodata
ScrLo: .byte $85, $A5, $C5, $E5, $05, $25, $45, $65
.byte $85, $A5, $C5, $E5, $05, $25, $45, $65
.byte $85, $A5, $C5, $E5, $05, $25, $45, $65
.byte $85
ScrHi: .byte $D0, $D0, $D0, $D0, $D1, $D1, $D1, $D1
.byte $D1, $D1, $D1, $D1, $D2, $D2, $D2, $D2
.byte $D2, $D2, $D2, $D2, $D3, $D3, $D3, $D3
.byte $D3

54
libsrc/osic1p/crt0.s Normal file
View File

@ -0,0 +1,54 @@
; ---------------------------------------------------------------------------
; crt0.s
; ---------------------------------------------------------------------------
;
; Startup code for Ohio Scientific Challenger 1P
.export _init, _exit
.import _main
.export __STARTUP__ : absolute = 1 ; Mark as startup
.import __RAM_START__, __RAM_SIZE__ ; Linker generated
.import zerobss, initlib, donelib
.include "zeropage.inc"
.include "extzp.inc"
.include "osic1p.inc"
; ---------------------------------------------------------------------------
; Place the startup code in a special segment
.segment "STARTUP"
; ---------------------------------------------------------------------------
; A little light 6502 housekeeping
_init: ldx #$FF ; Initialize stack pointer to $01FF
txs
cld ; Clear decimal mode
; ---------------------------------------------------------------------------
; Set cc65 argument stack pointer
lda #<(__RAM_START__ + __RAM_SIZE__)
sta sp
lda #>(__RAM_START__ + __RAM_SIZE__)
sta sp+1
; ---------------------------------------------------------------------------
; Initialize memory storage
jsr zerobss ; Clear BSS segment
jsr initlib ; Run constructors
; ---------------------------------------------------------------------------
; Call main()
jsr _main
; ---------------------------------------------------------------------------
; Back from main (this is also the _exit entry):
_exit: jsr donelib ; Run destructors
jmp RESET ; Display boot menu after program exit

289
libsrc/osic1p/ctype.s Normal file
View File

@ -0,0 +1,289 @@
;
; Character specification table.
;
; Ullrich von Bassewitz, 02.06.1998
; 2003-05-02, Greg King
;
; Copied from cbm/ctype.s
; 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 weren't for the slow parameter-passing of cc65,
; one even could define C-language macroes for the isxxx functions
; (as it usually is 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.
; This table is taken from Craig S. Bruce's technical docs. for the ACE OS.
.include "ctype.inc"
; The table is read-only, put it into the RODATA segment.
.rodata
__ctype:
.byte CT_CTRL ; 0/00 ___rvs_@___
.byte CT_CTRL ; 1/01 ___rvs_a___
.byte CT_CTRL ; 2/02 ___rvs_b___
.byte CT_CTRL ; 3/03 ___rvs_c___
.byte CT_CTRL ; 4/04 ___rvs_d___
.byte CT_CTRL ; 5/05 ___rvs_e___
.byte CT_CTRL ; 6/06 ___rvs_f___
.byte CT_CTRL ; 7/07 _BEL/rvs_g_
.byte CT_CTRL ; 8/08 ___rvs_h___
.byte CT_CTRL | CT_OTHER_WS | CT_SPACE_TAB ; 9/09 _TAB/rvs_i_
.byte CT_CTRL | CT_OTHER_WS ; 10/0a _BOL/rvs_j_
.byte CT_CTRL ; 11/0b ___rvs_k___
.byte CT_CTRL ; 12/0c ___rvs_l___
.byte CT_CTRL | CT_OTHER_WS ; 13/0d _CR_/rvs_m_
.byte CT_CTRL ; 14/0e ___rvs_n___
.byte CT_CTRL ; 15/0f ___rvs_o___
.byte CT_CTRL ; 16/10 ___rvs_p___
.byte CT_CTRL | CT_OTHER_WS ; 17/11 _VT_/rvs_q_
.byte CT_CTRL ; 18/12 ___rvs_r___
.byte CT_CTRL | CT_OTHER_WS ; 19/13 HOME/rvs_s_
.byte CT_CTRL | CT_OTHER_WS ; 20/14 _BS_/rvs_t_
.byte CT_CTRL ; 21/15 ___rvs_u___
.byte CT_CTRL ; 22/16 ___rvs_v___
.byte CT_CTRL ; 23/17 ___rvs_w___
.byte CT_CTRL ; 24/18 ___rvs_x___
.byte CT_CTRL ; 25/19 ___rvs_y___
.byte CT_CTRL ; 26/1a ___rvs_z___
.byte CT_CTRL ; 27/1b ___rvs_[___
.byte CT_CTRL ; 28/1c ___rvs_\___
.byte CT_CTRL | CT_OTHER_WS ; 29/1d cursr-right
.byte CT_CTRL ; 30/1e ___rvs_^___
.byte CT_CTRL ; 31/1f _rvs_under_
.byte CT_SPACE | CT_SPACE_TAB ; 32/20 ___SPACE___
.byte $00 ; 33/21 _____!_____
.byte $00 ; 34/22 _____"_____
.byte $00 ; 35/23 _____#_____
.byte $00 ; 36/24 _____$_____
.byte $00 ; 37/25 _____%_____
.byte $00 ; 38/26 _____&_____
.byte $00 ; 39/27 _____'_____
.byte $00 ; 40/28 _____(_____
.byte $00 ; 41/29 _____)_____
.byte $00 ; 42/2a _____*_____
.byte $00 ; 43/2b _____+_____
.byte $00 ; 44/2c _____,_____
.byte $00 ; 45/2d _____-_____
.byte $00 ; 46/2e _____._____
.byte $00 ; 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 $00 ; 58/3a _____:_____
.byte $00 ; 59/3b _____;_____
.byte $00 ; 60/3c _____<_____
.byte $00 ; 61/3d _____=_____
.byte $00 ; 62/3e _____>_____
.byte $00 ; 63/3f _____?_____
.byte $00 ; 64/40 _____@_____
.byte CT_LOWER | CT_XDIGIT ; 65/41 _____a_____
.byte CT_LOWER | CT_XDIGIT ; 66/42 _____b_____
.byte CT_LOWER | CT_XDIGIT ; 67/43 _____c_____
.byte CT_LOWER | CT_XDIGIT ; 68/44 _____d_____
.byte CT_LOWER | CT_XDIGIT ; 69/45 _____e_____
.byte CT_LOWER | CT_XDIGIT ; 70/46 _____f_____
.byte CT_LOWER ; 71/47 _____g_____
.byte CT_LOWER ; 72/48 _____h_____
.byte CT_LOWER ; 73/49 _____i_____
.byte CT_LOWER ; 74/4a _____j_____
.byte CT_LOWER ; 75/4b _____k_____
.byte CT_LOWER ; 76/4c _____l_____
.byte CT_LOWER ; 77/4d _____m_____
.byte CT_LOWER ; 78/4e _____n_____
.byte CT_LOWER ; 79/4f _____o_____
.byte CT_LOWER ; 80/50 _____p_____
.byte CT_LOWER ; 81/51 _____q_____
.byte CT_LOWER ; 82/52 _____r_____
.byte CT_LOWER ; 83/53 _____s_____
.byte CT_LOWER ; 84/54 _____t_____
.byte CT_LOWER ; 85/55 _____u_____
.byte CT_LOWER ; 86/56 _____v_____
.byte CT_LOWER ; 87/57 _____w_____
.byte CT_LOWER ; 88/58 _____x_____
.byte CT_LOWER ; 89/59 _____y_____
.byte CT_LOWER ; 90/5a _____z_____
.byte $00 ; 91/5b _____[_____
.byte $00 ; 92/5c _____\_____
.byte $00 ; 93/5d _____]_____
.byte $00 ; 94/5e _____^_____
.byte $00 ; 95/5f _UNDERLINE_
.byte $00 ; 96/60 _A`_grave__
.byte $00 ; 97/61 _A'_acute__
.byte $00 ; 98/62 _A^_circum_
.byte $00 ; 99/63 _A~_tilde__
.byte $00 ; 100/64 _A"_dieres_
.byte $00 ; 101/65 _A__ring___
.byte $00 ; 102/66 _AE________
.byte $00 ; 103/67 _C,cedilla_
.byte $00 ; 104/68 _E`_grave__
.byte $00 ; 105/69 _E'_acute__
.byte $00 ; 106/6a _E^_circum_
.byte $00 ; 107/6b _E"_dieres_
.byte $00 ; 108/6c _I`_grave__
.byte $00 ; 109/6d _I'_acute__
.byte $00 ; 110/6e _I^_circum_
.byte $00 ; 111/6f _I"_dieres_
.byte $00 ; 112/70 _D-_Eth_lr_
.byte $00 ; 113/71 _N~_tilde__
.byte $00 ; 114/72 _O`_grave__
.byte $00 ; 115/73 _O'_acute__
.byte $00 ; 116/74 _O^_circum_
.byte $00 ; 117/75 _O~_tilde__
.byte $00 ; 118/76 _O"_dieres_
.byte $00 ; 119/77 __multiply_
.byte $00 ; 120/78 _O/_slash__
.byte $00 ; 121/79 _U`_grave__
.byte $00 ; 122/7a _U'_acute__
.byte $00 ; 123/7b _U^_circum_
.byte $00 ; 124/7c _U"_dieres_
.byte $00 ; 125/7d _Y'_acute__
.byte $00 ; 126/7e _cap_thorn_
.byte $00 ; 127/7f _Es-sed_B__
.byte CT_CTRL ; 128/80 __bullet___
.byte CT_CTRL ; 129/81 __v_line___
.byte CT_CTRL ; 130/82 __h_line___
.byte CT_CTRL ; 131/83 ___cross___
.byte CT_CTRL ; 132/84 _tl_corner_
.byte CT_CTRL ; 133/85 _tr_corner_
.byte CT_CTRL ; 134/86 _bl_corner_
.byte CT_CTRL ; 135/87 _br_corner_
.byte CT_CTRL ; 136/88 ___l_tee___
.byte CT_CTRL ; 137/89 ___r_tee___
.byte CT_CTRL ; 138/8a ___t_tee___
.byte CT_CTRL ; 139/8b ___b_tee___
.byte CT_CTRL ; 140/8c ___heart___
.byte CT_CTRL | CT_OTHER_WS ; 141/8d _CR/diamond
.byte CT_CTRL ; 142/8e ___club____
.byte CT_CTRL ; 143/8f ___spade___
.byte CT_CTRL ; 144/90 _s_circle__
.byte CT_CTRL | CT_OTHER_WS ; 145/91 _cursor-up_
.byte CT_CTRL ; 146/92 ___pound___
.byte CT_CTRL | CT_OTHER_WS ; 147/93 _CLS/check_
.byte CT_CTRL | CT_OTHER_WS ; 148/94 __INSert___
.byte CT_CTRL ; 149/95 ____+/-____
.byte CT_CTRL ; 150/96 __divide___
.byte CT_CTRL ; 151/97 __degree___
.byte CT_CTRL ; 152/98 _c_checker_
.byte CT_CTRL ; 153/99 _f_checker_
.byte CT_CTRL ; 154/9a _solid_sq__
.byte CT_CTRL ; 155/9b __cr_char__
.byte CT_CTRL ; 156/9c _up_arrow__
.byte CT_CTRL | CT_OTHER_WS ; 157/9d cursor-left
.byte CT_CTRL ; 158/9e _left_arro_
.byte CT_CTRL ; 159/9f _right_arr_
.byte CT_SPACE | CT_SPACE_TAB ; 160/a0 _req space_
.byte $00 ; 161/a1 _!_invertd_
.byte $00 ; 162/a2 ___cent____
.byte $00 ; 163/a3 ___pound___
.byte $00 ; 164/a4 __currency_
.byte $00 ; 165/a5 ____yen____
.byte $00 ; 166/a6 _|_broken__
.byte $00 ; 167/a7 __section__
.byte $00 ; 168/a8 __umulaut__
.byte $00 ; 169/a9 _copyright_
.byte $00 ; 170/aa __fem_ord__
.byte $00 ; 171/ab _l_ang_quo_
.byte $00 ; 172/ac ____not____
.byte $00 ; 173/ad _syl_hyphn_
.byte $00 ; 174/ae _registerd_
.byte $00 ; 175/af _overline__
.byte $00 ; 176/b0 __degrees__
.byte $00 ; 177/b1 ____+/-____
.byte $00 ; 178/b2 _2_supersc_
.byte $00 ; 179/b3 _3_supersc_
.byte $00 ; 180/b4 ___acute___
.byte $00 ; 181/b5 ____mu_____
.byte $00 ; 182/b6 _paragraph_
.byte $00 ; 183/b7 __mid_dot__
.byte $00 ; 184/b8 __cedilla__
.byte $00 ; 185/b9 _1_supersc_
.byte $00 ; 186/ba __mas_ord__
.byte $00 ; 187/bb _r_ang_quo_
.byte $00 ; 188/bc ____1/4____
.byte $00 ; 189/bd ____1/2____
.byte $00 ; 190/be ____3/4____
.byte $00 ; 191/bf _?_invertd_
.byte $00 ; 192/c0 _____`_____
.byte CT_UPPER | CT_XDIGIT ; 193/c1 _____A_____
.byte CT_UPPER | CT_XDIGIT ; 194/c2 _____B_____
.byte CT_UPPER | CT_XDIGIT ; 195/c3 _____C_____
.byte CT_UPPER | CT_XDIGIT ; 196/c4 _____D_____
.byte CT_UPPER | CT_XDIGIT ; 197/c5 _____E_____
.byte CT_UPPER | CT_XDIGIT ; 198/c6 _____F_____
.byte CT_UPPER ; 199/c7 _____G_____
.byte CT_UPPER ; 200/c8 _____H_____
.byte CT_UPPER ; 201/c9 _____I_____
.byte CT_UPPER ; 202/ca _____J_____
.byte CT_UPPER ; 203/cb _____K_____
.byte CT_UPPER ; 204/cc _____L_____
.byte CT_UPPER ; 205/cd _____M_____
.byte CT_UPPER ; 206/ce _____N_____
.byte CT_UPPER ; 207/cf _____O_____
.byte CT_UPPER ; 208/d0 _____P_____
.byte CT_UPPER ; 209/d1 _____Q_____
.byte CT_UPPER ; 210/d2 _____R_____
.byte CT_UPPER ; 211/d3 _____S_____
.byte CT_UPPER ; 212/d4 _____T_____
.byte CT_UPPER ; 213/d5 _____U_____
.byte CT_UPPER ; 214/d6 _____V_____
.byte CT_UPPER ; 215/d7 _____W_____
.byte CT_UPPER ; 216/d8 _____X_____
.byte CT_UPPER ; 217/d9 _____Y_____
.byte CT_UPPER ; 218/da _____Z_____
.byte $00 ; 219/db _____{_____
.byte $00 ; 220/dc _____|_____
.byte $00 ; 221/dd _____}_____
.byte $00 ; 222/de _____~_____
.byte $00 ; 223/df ___HOUSE___
.byte $00 ; 224/e0 _a`_grave__
.byte $00 ; 225/e1 _a'_acute__
.byte $00 ; 226/e2 _a^_circum_
.byte $00 ; 227/e3 _a~_tilde__
.byte $00 ; 228/e4 _a"_dieres_
.byte $00 ; 229/e5 _a__ring___
.byte $00 ; 230/e6 _ae________
.byte $00 ; 231/e7 _c,cedilla_
.byte $00 ; 232/e8 _e`_grave__
.byte $00 ; 233/e9 _e'_acute__
.byte $00 ; 234/ea _e^_circum_
.byte $00 ; 235/eb _e"_dieres_
.byte $00 ; 236/ec _i`_grave__
.byte $00 ; 237/ed _i'_acute__
.byte $00 ; 238/ee _i^_circum_
.byte $00 ; 239/ef _i"_dieres_
.byte $00 ; 240/f0 _o^x_Eth_s_
.byte $00 ; 241/f1 _n~_tilda__
.byte $00 ; 242/f2 _o`_grave__
.byte $00 ; 243/f3 _o'_acute__
.byte $00 ; 244/f4 _o^_circum_
.byte $00 ; 245/f5 _o~_tilde__
.byte $00 ; 246/f6 _o"_dieres_
.byte $00 ; 247/f7 __divide___
.byte $00 ; 248/f8 _o/_slash__
.byte $00 ; 249/f9 _u`_grave__
.byte $00 ; 250/fa _u'_acute__
.byte $00 ; 251/fb _u^_circum_
.byte $00 ; 252/fc _u"_dieres_
.byte $00 ; 253/fd _y'_acute__
.byte $00 ; 254/fe _sm_thorn__
.byte $00 ; 255/ff _y"_dieres_

29
libsrc/osic1p/cvline.s Normal file
View File

@ -0,0 +1,29 @@
;
; based on CBM version
; originally by:
; 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
_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 #$95 ; Vertical bar
jsr putchar ; Write, no cursor advance
jsr newline ; Advance cursor to next line
dec tmp1
bne L1
L9: rts

7
libsrc/osic1p/extzp.inc Normal file
View File

@ -0,0 +1,7 @@
;
; Additional zero page locations for the Challenger 1P.
;
; ------------------------------------------------------------------------
.globalzp CURS_X, CURS_Y, SCREEN_PTR

19
libsrc/osic1p/extzp.s Normal file
View File

@ -0,0 +1,19 @@
;
; Additional zero page locations for the Challenger 1P.
; NOTE: The zeropage locations contained in this file get initialized
; in the startup code, so if you change anything here, be sure to check
; not only the linker config, but also the startup file.
;
; ------------------------------------------------------------------------
.include "extzp.inc"
.segment "EXTZP" : zeropage
CURS_X: .res 1
CURS_Y: .res 1
SCREEN_PTR: .res 2
; size 4
; Adjust size of this segment in osic1p.cfg if the size changes

13
libsrc/osic1p/gotox.s Normal file
View File

@ -0,0 +1,13 @@
;
; copied from CBM implementation
; originally by:
; Ullrich von Bassewitz, 07.08.1998
;
; void gotox (unsigned char x);
;
.export _gotox
.import plot
.include "extzp.inc"
_gotox: sta CURS_X ; Set new position
jmp plot ; And activate it

17
libsrc/osic1p/gotoxy.s Normal file
View File

@ -0,0 +1,17 @@
;
; copied from CBM implementation
;
; originally by:
; Ullrich von Bassewitz, 06.08.1998
;
; void gotoxy (unsigned char x, unsigned char y);
;
.export _gotoxy
.import popa, plot
.include "extzp.inc"
_gotoxy:
sta CURS_Y ; Set Y
jsr popa ; Get X
sta CURS_X ; Set X
jmp plot ; Set the cursor position

13
libsrc/osic1p/gotoy.s Normal file
View File

@ -0,0 +1,13 @@
;
; copied from CBM implementation
; originally by:
; Ullrich von Bassewitz, 0.08.1998
;
; void gotoy (unsigned char y);
;
.export _gotoy
.import plot
.include "extzp.inc"
_gotoy: sta CURS_Y ; Set the new position
jmp plot ; And activate it

20
libsrc/osic1p/oserror.s Normal file
View File

@ -0,0 +1,20 @@
;
; dummy implementation for Challenger 1P based on atmos implementation
;
; original by
; Stefan Haubenthal, 2011-04-18
;
; int __fastcall__ _osmaperrno (unsigned char oserror);
; /* Map a system specific error into a system independent code */
;
.include "errno.inc"
.export __osmaperrno
.proc __osmaperrno
lda #<EUNKNOWN
ldx #>EUNKNOWN
rts
.endproc

9
libsrc/osic1p/osic1p.inc Normal file
View File

@ -0,0 +1,9 @@
; Addresses
SCRNBASE := $D000 ; Base of video RAM
INPUTC := $FD00 ; Input character from keyboard
RESET := $FF00 ; Reset address, show boot prompt
; Other definitions
VIDEORAMSIZE = $0400 ; Size of C1P video RAM (1 kB)
SCR_LINELEN = $18 ; screen width - 1
SCR_HEIGHT = $18 ; screen height - 1

14
libsrc/osic1p/wherex.s Normal file
View File

@ -0,0 +1,14 @@
;
; Ullrich von Bassewitz, 06.08.1998
; Copied from cbm/wherex.s
; unsigned char wherex (void);
;
.export _wherex
.include "extzp.inc"
.proc _wherex
lda CURS_X
ldx #$00
rts
.endproc

14
libsrc/osic1p/wherey.s Normal file
View File

@ -0,0 +1,14 @@
;
; Ullrich von Bassewitz, 06.08.1998
; Copied from cbm/wherey.s
;
; unsigned char wherey (void);
;
.export _wherey
.include "extzp.inc"
.proc _wherey
lda CURS_Y
ldx #$00
rts
.endproc

View File

@ -303,6 +303,10 @@ static void SetSys (const char* Sys)
NewSymbol ("__SIM65C02__", 1);
break;
case TGT_OSIC1P:
NewSymbol ("__OSIC1P__", 1);
break;
default:
AbEnd ("Invalid target name: `%s'", Sys);

View File

@ -258,6 +258,10 @@ static void SetSys (const char* Sys)
DefineNumericMacro ("__SIM65C02__", 1);
break;
case TGT_OSIC1P:
DefineNumericMacro ("__OSIC1P__", 1);
break;
default:
AbEnd ("Unknown target system type %d", Target);
}

View File

@ -142,6 +142,7 @@ static const TargetEntry TargetMap[] = {
{ "module", TGT_MODULE },
{ "nes", TGT_NES },
{ "none", TGT_NONE },
{ "osic1p", TGT_OSIC1P },
{ "pet", TGT_PET },
{ "plus4", TGT_PLUS4 },
{ "sim6502", TGT_SIM6502 },
@ -167,6 +168,7 @@ static const TargetProperties PropertyTable[TGT_COUNT] = {
{ "plus4", CPU_6502, BINFMT_BINARY, CTPET },
{ "cbm510", CPU_6502, BINFMT_BINARY, CTPET },
{ "cbm610", CPU_6502, BINFMT_BINARY, CTPET },
{ "osic1p", CPU_6502, BINFMT_BINARY, CTNone },
{ "pet", CPU_6502, BINFMT_BINARY, CTPET },
{ "bbc", CPU_6502, BINFMT_BINARY, CTNone },
{ "apple2", CPU_6502, BINFMT_BINARY, CTNone },

View File

@ -64,6 +64,7 @@ typedef enum {
TGT_PLUS4,
TGT_CBM510,
TGT_CBM610,
TGT_OSIC1P,
TGT_PET,
TGT_BBC,
TGT_APPLE2,