Ohio Scientific Challenger 1P
+Available at :
+
+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
+.
+
+In addition to cc65 the srec_cat program from the
+
+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:
+
+
+#include
+#include
+
+extern const char text[]; /* In text.s */
+
+int main (void)
+{
+ clrscr ();
+ cprintf ("%s\r\nPress \r\n", text);
+ cgetc ();
+ return EXIT_SUCCESS;
+}
+
+
+Compile the tutorial with
+
+
+cl65 -O -t osic1p hello.c text.s
+
+
+Convert the executable file into a text file that can be loaded via
+the Ohio Scientific 65V PROM monitor at start address 0x200:
+
+
+srec_cat hello -binary -offset 0x200 -o hello.c1p -Ohio_Scientific -execution-start-address=0x200
+
+
+Open the URL
+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:
+
+
+Hello world!
+Press
+
+
+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 for instructions how to
+compile for other RAM sizes.
Contributions wanted
diff --git a/doc/osi.sgml b/doc/osi.sgml
new file mode 100644
index 000000000..ce2ee4836
--- /dev/null
+++ b/doc/osi.sgml
@@ -0,0 +1,180 @@
+
+
+
+
+Ohio Scientific-specific information for cc65
+
+
+2015-02-04
+
+
+An overview over the Ohio Scientific runtime system as it is implemented for the cc65 C
+compiler.
+
+
+
+
+
+
+
+Overview
+
+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 . Even functions marked as "platform dependent" may be available on
+more than one platform. Please see the function reference for more
+information.
+
+Targets
+
+Currently the target "osic1p" is implemented. This works for the Ohio Scientific
+Challenger 1P machine.
+
+Binary format
+
+The standard binary output format generated by the linker for the osic1p target
+is a machine language program.
+
+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
+
+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 $0200 to an uploadable file "hello.c1p":
+
+
+srec_cat hello -binary -offset 0x200 -o hello.c1p -Ohio_Scientific -execution-start-address=0x200
+
+
+Memory layout
+
+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:
+
+
+
+
+Example for building a program with start address $0300, stack size
+$0200 and RAM size $2000:
+
+
+cl65 --start-addr 0x300 -Wl -D,__HIMEM__=$2000,-D,__STACKSIZE__=$0200 -t osic1p hello.c
+
+
+Linker configurations
+
+The ld65 linker comes with a default config file "osic1p.cfg" for the Ohio Scientific
+Challenger 1P, which is implicitly used via default config file (
+
+The default configuration is tailored to C programs.
+
+
+
+This configuration is made for assembler programmers who don't need a special
+setup.
+
+To use this config file, assemble with
+cl65 -o program -t osic1p -C osic1p-asm.cfg source.s
+
+
+Platform-specific header files
+
+Programs containing Ohio Scientific-specific code may use the Ohio Scientific-specific functions
+
+There are currently no special Ohio Scientific functions.
+
+Hardware access
+
+There is no specific support for direct hardware access.
+
+Loadable drivers
+
+There are no loadable drivers available.
+
+Limitations
+
+conio implementation
+
+The conio implementation is complete except for a kbhit() function.
+
+stdio implementation
+
+There is no support for stdio at the moment.
+
+Other hints
+
+Passing arguments to the program
+
+There is currently no support for passing arguments to a program.
+
+Program return code
+
+The program return code currently has no effect. When the main() function
+finishes, the boot prompt is shown again.
+
+License
+
+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:
+
+
+- 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.
+
- Altered source versions must be plainly marked as such, and must not
+ be misrepresented as being the original software.
+
- This notice may not be removed or altered from any source
+ distribution.
+
+
+
diff --git a/include/conio.h b/include/conio.h
index 54667a3ca..10806785c 100644
--- a/include/conio.h
+++ b/include/conio.h
@@ -77,6 +77,8 @@
# include
#elif defined(__NES__)
# include
+#elif defined(__OSIC1P__)
+# include
#endif
diff --git a/include/osic1p.h b/include/osic1p.h
new file mode 100644
index 000000000..57fe0cd24
--- /dev/null
+++ b/include/osic1p.h
@@ -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
diff --git a/libsrc/Makefile b/libsrc/Makefile
index 6a801695a..42aaf078b 100644
--- a/libsrc/Makefile
+++ b/libsrc/Makefile
@@ -24,6 +24,7 @@ TARGETS = apple2 \
$(GEOS) \
lynx \
nes \
+ osic1p \
sim6502 \
sim65c02 \
supervision
diff --git a/libsrc/osic1p/_scrsize.s b/libsrc/osic1p/_scrsize.s
new file mode 100644
index 000000000..337fe1ee7
--- /dev/null
+++ b/libsrc/osic1p/_scrsize.s
@@ -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
diff --git a/libsrc/osic1p/cclear.s b/libsrc/osic1p/cclear.s
new file mode 100644
index 000000000..4e18c70a3
--- /dev/null
+++ b/libsrc/osic1p/cclear.s
@@ -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
diff --git a/libsrc/osic1p/cgetc.s b/libsrc/osic1p/cgetc.s
new file mode 100644
index 000000000..3c9dd4381
--- /dev/null
+++ b/libsrc/osic1p/cgetc.s
@@ -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
diff --git a/libsrc/osic1p/chline.s b/libsrc/osic1p/chline.s
new file mode 100644
index 000000000..be40d40af
--- /dev/null
+++ b/libsrc/osic1p/chline.s
@@ -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
diff --git a/libsrc/osic1p/clrscr.s b/libsrc/osic1p/clrscr.s
new file mode 100644
index 000000000..ee32bf969
--- /dev/null
+++ b/libsrc/osic1p/clrscr.s
@@ -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
diff --git a/libsrc/osic1p/cputc.s b/libsrc/osic1p/cputc.s
new file mode 100644
index 000000000..f6f285301
--- /dev/null
+++ b/libsrc/osic1p/cputc.s
@@ -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
diff --git a/libsrc/osic1p/crt0.s b/libsrc/osic1p/crt0.s
new file mode 100644
index 000000000..657ee2743
--- /dev/null
+++ b/libsrc/osic1p/crt0.s
@@ -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
diff --git a/libsrc/osic1p/ctype.s b/libsrc/osic1p/ctype.s
new file mode 100644
index 000000000..fa901c189
--- /dev/null
+++ b/libsrc/osic1p/ctype.s
@@ -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_
diff --git a/libsrc/osic1p/cvline.s b/libsrc/osic1p/cvline.s
new file mode 100644
index 000000000..84e5a45bf
--- /dev/null
+++ b/libsrc/osic1p/cvline.s
@@ -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
diff --git a/libsrc/osic1p/extzp.inc b/libsrc/osic1p/extzp.inc
new file mode 100644
index 000000000..06498d1a6
--- /dev/null
+++ b/libsrc/osic1p/extzp.inc
@@ -0,0 +1,7 @@
+;
+; Additional zero page locations for the Challenger 1P.
+;
+
+; ------------------------------------------------------------------------
+
+ .globalzp CURS_X, CURS_Y, SCREEN_PTR
diff --git a/libsrc/osic1p/extzp.s b/libsrc/osic1p/extzp.s
new file mode 100644
index 000000000..7dc8e3a53
--- /dev/null
+++ b/libsrc/osic1p/extzp.s
@@ -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
diff --git a/libsrc/osic1p/gotox.s b/libsrc/osic1p/gotox.s
new file mode 100644
index 000000000..0dea72b9a
--- /dev/null
+++ b/libsrc/osic1p/gotox.s
@@ -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
diff --git a/libsrc/osic1p/gotoxy.s b/libsrc/osic1p/gotoxy.s
new file mode 100644
index 000000000..f76537349
--- /dev/null
+++ b/libsrc/osic1p/gotoxy.s
@@ -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
diff --git a/libsrc/osic1p/gotoy.s b/libsrc/osic1p/gotoy.s
new file mode 100644
index 000000000..693863d94
--- /dev/null
+++ b/libsrc/osic1p/gotoy.s
@@ -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
diff --git a/libsrc/osic1p/oserror.s b/libsrc/osic1p/oserror.s
new file mode 100644
index 000000000..073691a06
--- /dev/null
+++ b/libsrc/osic1p/oserror.s
@@ -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
+ rts
+
+.endproc
diff --git a/libsrc/osic1p/osic1p.inc b/libsrc/osic1p/osic1p.inc
new file mode 100644
index 000000000..9a0c346b6
--- /dev/null
+++ b/libsrc/osic1p/osic1p.inc
@@ -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
diff --git a/libsrc/osic1p/wherex.s b/libsrc/osic1p/wherex.s
new file mode 100644
index 000000000..1155a8abd
--- /dev/null
+++ b/libsrc/osic1p/wherex.s
@@ -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
diff --git a/libsrc/osic1p/wherey.s b/libsrc/osic1p/wherey.s
new file mode 100644
index 000000000..632cf4a15
--- /dev/null
+++ b/libsrc/osic1p/wherey.s
@@ -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
diff --git a/src/ca65/main.c b/src/ca65/main.c
index 3f31a2b88..508f49603 100644
--- a/src/ca65/main.c
+++ b/src/ca65/main.c
@@ -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);
diff --git a/src/cc65/main.c b/src/cc65/main.c
index 34688e97e..ece22041a 100644
--- a/src/cc65/main.c
+++ b/src/cc65/main.c
@@ -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);
}
diff --git a/src/common/target.c b/src/common/target.c
index ffb342e25..6139c4a39 100644
--- a/src/common/target.c
+++ b/src/common/target.c
@@ -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 },
diff --git a/src/common/target.h b/src/common/target.h
index 72dffe382..0b50e5060 100644
--- a/src/common/target.h
+++ b/src/common/target.h
@@ -64,6 +64,7 @@ typedef enum {
TGT_PLUS4,
TGT_CBM510,
TGT_CBM610,
+ TGT_OSIC1P,
TGT_PET,
TGT_BBC,
TGT_APPLE2,