From 252e4afb9c75b8f4068bfe647ae5a96c5df8f2e3 Mon Sep 17 00:00:00 2001 From: jede Date: Wed, 14 Dec 2016 21:22:10 +0100 Subject: [PATCH] Adding files for telemon30 --- libsrc/Makefile | 4 +- libsrc/common/fread.s | 12 +- libsrc/telemon30/_open.s | 44 +++ libsrc/telemon30/_read.s | 31 ++ libsrc/telemon30/_scrsize.s | 19 ++ libsrc/telemon30/ch376.s | 200 +++++++++++ libsrc/telemon30/crt0.s | 101 ++++++ libsrc/telemon30/ctype.s | 299 +++++++++++++++++ libsrc/telemon30/graphics.s | 51 +++ libsrc/telemon30/keyboard.s | 13 + libsrc/telemon30/mainargs.s | 137 ++++++++ libsrc/telemon30/mym.s | 626 +++++++++++++++++++++++++++++++++++ libsrc/telemon30/orixhdr.s | 36 ++ libsrc/telemon30/oserrlist.s | 75 +++++ libsrc/telemon30/oserror.s | 17 + libsrc/telemon30/print.s | 21 ++ libsrc/telemon30/sound.s | 45 +++ libsrc/telemon30/sysuname.s | 46 +++ libsrc/telemon30/write.s | 61 ++++ src/ar65.vcxproj | 6 +- src/ca65.vcxproj | 6 +- src/ca65/main.c | 17 +- src/cc65.vcxproj | 6 +- src/cc65/main.c | 10 +- src/chrcvt65.vcxproj | 6 +- src/cl65.vcxproj | 6 +- src/co65.vcxproj | 6 +- src/common.vcxproj | 6 +- src/common/target.c | 8 +- src/common/target.h | 3 +- src/da65.vcxproj | 6 +- src/grc65.vcxproj | 6 +- src/ld65.vcxproj | 6 +- src/od65.vcxproj | 6 +- src/sim65.vcxproj | 6 +- src/sp65.vcxproj | 6 +- 36 files changed, 1899 insertions(+), 55 deletions(-) create mode 100644 libsrc/telemon30/_open.s create mode 100644 libsrc/telemon30/_read.s create mode 100644 libsrc/telemon30/_scrsize.s create mode 100644 libsrc/telemon30/ch376.s create mode 100644 libsrc/telemon30/crt0.s create mode 100644 libsrc/telemon30/ctype.s create mode 100644 libsrc/telemon30/graphics.s create mode 100644 libsrc/telemon30/keyboard.s create mode 100644 libsrc/telemon30/mainargs.s create mode 100644 libsrc/telemon30/mym.s create mode 100644 libsrc/telemon30/orixhdr.s create mode 100644 libsrc/telemon30/oserrlist.s create mode 100644 libsrc/telemon30/oserror.s create mode 100644 libsrc/telemon30/print.s create mode 100644 libsrc/telemon30/sound.s create mode 100644 libsrc/telemon30/sysuname.s create mode 100644 libsrc/telemon30/write.s diff --git a/libsrc/Makefile b/libsrc/Makefile index 99f120f3a..0342a8ca4 100644 --- a/libsrc/Makefile +++ b/libsrc/Makefile @@ -30,7 +30,9 @@ TARGETS = apple2 \ pce \ sim6502 \ sim65c02 \ - supervision + supervision\ + telemon24\ + telemon30 DRVTYPES = emd \ joy \ diff --git a/libsrc/common/fread.s b/libsrc/common/fread.s index 91d692985..b87cc5cb4 100644 --- a/libsrc/common/fread.s +++ b/libsrc/common/fread.s @@ -173,13 +173,16 @@ ; Read was ok, account for the pushed back character (if any). -@L8: add pb +@L8: + add pb bcc @L9 inx ; Check for end of file. -@L9: cmp #0 ; Zero bytes read? +@L9: + + cmp #0 ; Zero bytes read? bne @L10 cpx #0 bne @L10 @@ -192,7 +195,10 @@ ; Return the number of items successfully read. Since we've checked for ; bytes == 0 above, size cannot be zero here, so the division is safe. -@L10: jsr pushax ; Push number of bytes read +@L10: + + + jsr pushax ; Push number of bytes read ldy #5 jsr ldaxysp ; Get size jsr tosudivax ; bytes / size -> a/x diff --git a/libsrc/telemon30/_open.s b/libsrc/telemon30/_open.s new file mode 100644 index 000000000..f308632d9 --- /dev/null +++ b/libsrc/telemon30/_open.s @@ -0,0 +1,44 @@ + .export _open + .import addysp,popax + .importzp sp,tmp2,tmp3,tmp1 + ; int open (const char* name, int flags, ...); /* May take a mode argument */ + .include "telemon30.inc" + +.proc _open +; Throw away any additional parameters passed through the ellipsis + + dey ; Parm count < 4 shouldn't be needed to be... + dey ; ...checked (it generates a c compiler warning) + dey + dey + beq parmok ; Branch if parameter count ok + jsr addysp ; Fix stack, throw away unused parameters + +; Parameters ok. Pop the flags and save them into tmp3 + +parmok: jsr popax ; Get flags + +; Get the filename from stack and parse it. Bail out if is not ok + + jsr popax ; Get name + + + BRK_TELEMON XOPEN + + ; jsr fnparse ; Parse it + ;tax + ;bne oserror ; Bail out if problem with name + +; Get a free file handle and remember it in tmp2 + + ; jsr freefd + ;lda #EMFILE ; Load error code + ;bcs seterrno ; Jump in case of errors + ;stx tmp2 +; + + + rts +.endproc + + \ No newline at end of file diff --git a/libsrc/telemon30/_read.s b/libsrc/telemon30/_read.s new file mode 100644 index 000000000..8f7a20a58 --- /dev/null +++ b/libsrc/telemon30/_read.s @@ -0,0 +1,31 @@ +; +; Ullrich von Bassewitz, 2003-04-13 +; + +; + + .export _read + .import popax + .importzp ptr1, ptr2, ptr3, tmp1, tmp2 + + .include "telemon30.inc" +; int read (int fd, void* buf, unsigned count); + +.proc _read + ;jsr popax ; fp pointer don't care + sta tmp1 ; count + stx tmp2 ; count + jsr popax ; get buf + ;lda #$00 + ;ldx #$a0 + sta PTR_READ_DEST + stx PTR_READ_DEST+1 + lda tmp1 ; + ldy tmp2 ; + BRK_TELEMON XFREAD + + rts + +.endproc + + diff --git a/libsrc/telemon30/_scrsize.s b/libsrc/telemon30/_scrsize.s new file mode 100644 index 000000000..a929f97b1 --- /dev/null +++ b/libsrc/telemon30/_scrsize.s @@ -0,0 +1,19 @@ +; +; 2003-04-13, Ullrich von Bassewitz +; 2013-07-16, Greg King +; +; Screen size variables +; + + .export screensize + .include "telemon30.inc" + +.proc screensize + + ldx #SCREEN_XSIZE + ldy #SCREEN_YSIZE + rts + +.endproc + + diff --git a/libsrc/telemon30/ch376.s b/libsrc/telemon30/ch376.s new file mode 100644 index 000000000..1b75c2b18 --- /dev/null +++ b/libsrc/telemon30/ch376.s @@ -0,0 +1,200 @@ + .export _ch376_set_file_name + .export _ch376_file_open + .export _ch376_ic_get_version + .export _ch376_reset + .export _ch376_check_exist + .export _ch376_disk_mount + + .import popax + .importzp sp,tmp2,tmp3,tmp1 + .include "telemon30.inc" + +; CODE FOR CH376_SET_USB_MODE ************************************************* + +CH376_SET_USB_MODE_CODE_USB_HOST_SOF_PACKAGE_AUTOMATICALLY := $06 + +CH376_USB_INT_DISK_READ := $1d +CH376_USB_INT_SUCCESS := $14 +CH376_ERR_MISS_FILE := $42 + +CH376_DATA :=$340 +CH376_COMMAND :=$341 + +CH376_GET_IC_VER := $01 +CH376_SET_BAUDRATE := $02 +CH376_GET_ENTER_SLEEP := $03 +CH376_RESET_ALL := $05 +CH376_CHECK_EXIST := $06 +CH376_GET_FILE_SIZE := $0C +CH376_SET_USB_MODE := $15 +CH376_GET_STATUS := $22 +CH376_RD_USB_DATA0 := $27 +CH376_SET_FILE_NAME := $2f +CH376_DISK_CONNECT := $30 ; check the disk connection status +CH376_DISK_MOUNT := $31 +CH376_FILE_OPEN := $32 +CH376_FILE_ENUM_GO := $33 +CH376_FILE_CLOSE := $36 +CH376_BYTE_READ := $3A +CH376_BYTE_RD_GO := $3b +CH376_BYTE_WRITE := $3C +CH376_DISK_CAPACITY := $3E +CH376_DISK_RD_GO := $55 + + + +; void ch376_set_file_name(char *filename) +.proc _ch376_set_file_name + sta tmp1 + stx tmp1+1 + lda #CH376_SET_FILE_NAME ;$2f + sta CH376_COMMAND + ldy #0 +loop: + lda (tmp1),y ; replace by bufnom + beq end ; we reached 0 value + sta CH376_DATA + iny + cpy #13 ; because we don't manage longfilename shortname =11 + bne loop +end: + sta CH376_DATA + rts +.endproc + +; void _ch376_file_open(); + +.proc _ch376_file_open + lda #CH376_FILE_OPEN ; $32 + sta CH376_COMMAND + jsr _ch376_wait_response + rts +.endproc + + ;CMD_GET_FILE_SIZE + +.proc _ch376_get_file_size + lda #CH376_GET_FILE_SIZE + sta CH376_COMMAND + lda #$68 + sta CH376_DATA + ; store file leng + lda CH376_DATA + sta tmp1 + lda CH376_DATA + sta tmp1+1 + lda CH376_DATA + sta tmp2 + lda CH376_DATA + sta tmp2+1 + rts +.endproc + +; void ch376_reset(); + +.proc _ch376_reset + lda #CH376_RESET_ALL ; 5 + sta CH376_COMMAND + ; waiting + ldy #0 + ldx #0 +loop: + nop + inx + bne loop + iny + bne loop + rts +.endproc + +; char ch376_check_exist(char value); + +.proc _ch376_check_exist + sta tmp1 + lda #CH376_CHECK_EXIST ; + sta CH376_COMMAND + lda tmp1 + sta CH376_DATA + lda CH376_DATA + rts +.endproc + +; char ch376_ic_get_version(void) +.proc _ch376_ic_get_version + lda #CH376_GET_IC_VER + sta CH376_COMMAND + lda CH376_DATA + rts +.endproc + +; void ch376_set_usb_mode(char mode) + +.proc _ch376_set_usb_mode +; CH376_SET_USB_MODE_CODE_USB_HOST_SOF_PACKAGE_AUTOMATICALLY + sta tmp1 + lda #CH376_SET_USB_MODE ; $15 + sta CH376_COMMAND + lda tmp1 + sta CH376_DATA + rts +.endproc + + +; void ch376_set_bytes_write(int value); +.proc _ch376_set_bytes_write + sta tmp1 + stx tmp1+1 + ldx #CH376_BYTE_WRITE + stx CH376_COMMAND + lda tmp1 + sta CH376_DATA + lda tmp1+1 + sta CH376_DATA + jsr _ch376_wait_response + rts +.endproc + +.proc _ch376_set_bytes_read + ldx #CH376_BYTE_READ + stx CH376_COMMAND + sta CH376_DATA + sty CH376_DATA + jsr _ch376_wait_response + rts +.endproc + +; char ch376_disk_mount(); +.proc _ch376_disk_mount + lda #CH376_DISK_MOUNT ; $31 + sta CH376_COMMAND + jsr _ch376_wait_response + ; if we read data value, we have then length of the volume name + rts +.endproc + + +; char ch376_wait_response(); +.proc _ch376_wait_response +; 1 return 1 if usb controller does not respond +; else A contains answer of the controller + ldy #$ff +loop3: + ldx #$ff ; merci de laisser une valeur importante car parfois en mode non debug, le controleur ne répond pas tout de suite +loop: + lda CH376_COMMAND + and #%10000000 + cmp #128 + bne no_error + dex + bne loop + dey + bne loop3 + ; error is here + rts +no_error: + lda #CH376_GET_STATUS + sta CH376_COMMAND + lda CH376_DATA + rts +.endproc + diff --git a/libsrc/telemon30/crt0.s b/libsrc/telemon30/crt0.s new file mode 100644 index 000000000..72bad5f24 --- /dev/null +++ b/libsrc/telemon30/crt0.s @@ -0,0 +1,101 @@ +; +; Startup code for cc65 (Oric version) +; +; By Debrune Jérôme and Ullrich von Bassewitz +; 2016-03-18, Greg King +; + + .export _exit + .export __STARTUP__ : absolute = 1 ; Mark as startup + + .import initlib, donelib + .import callmain, zerobss + .import __MAIN_START__, __MAIN_SIZE__ + + .include "zeropage.inc" + .include "telemon30.inc" + +; ------------------------------------------------------------------------ +; Place the startup code in a special segment. + +.segment "STARTUP" + + tsx + stx spsave ; Save system stk ptr + +; Save space by putting some of the start-up code in a segment +; that will be re-used. + + jsr init + +; Clear the BSS variables (after the constructors have been run). + + jsr zerobss + +; Push the command-line arguments; and, call main(). + + jsr callmain + +; Call the module destructors. This is also the exit() entry. + +_exit: jsr donelib + +; Restore the system stuff. + + ldx spsave + txs +; lda stsave + ; sta STATUS + +; Copy back the zero-page stuff. + + ldx #zpspace - 1 +L2: lda zpsave,x + sta sp,x + dex + bpl L2 + +; Back to BASIC. + + rts + +; ------------------------------------------------------------------------ +; Put this code in a place that will be re-used by BSS, the heap, +; and the C stack. + +.segment "ONCE" + +; Save the zero-page area that we're about to use. + +init: ldx #zpspace - 1 +L1: lda sp,x + sta zpsave,x + dex + bpl L1 + +; Currently, color isn't supported on the text screen. +; Unprotect screen columns 0 and 1 (where each line's color codes would sit). + + ; lda STATUS + ; sta stsave + ; and #%11011111 + ; sta STATUS + +; Set up the C stack. + + lda #<(__MAIN_START__ + __MAIN_SIZE__) + ldx #>(__MAIN_START__ + __MAIN_SIZE__) + sta sp + stx sp+1 ; Set argument stack ptr + +; Call the module constructors. + + jmp initlib + +; ------------------------------------------------------------------------ + +.segment "INIT" + +spsave: .res 1 +stsave: .res 1 +zpsave: .res zpspace diff --git a/libsrc/telemon30/ctype.s b/libsrc/telemon30/ctype.s new file mode 100644 index 000000000..79edafbb2 --- /dev/null +++ b/libsrc/telemon30/ctype.s @@ -0,0 +1,299 @@ +; +; Ullrich von Bassewitz, 2003-04-13 +; +; Character specification table. +; + +; 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. +; +; +; Bit assignments: +; +; 0 - Lower case char +; 1 - Upper case char +; 2 - Numeric digit +; 3 - Hex digit (both, lower and upper) +; 4 - Control character +; 5 - The space character itself +; 6 - Other whitespace (that is: '\f', '\n', '\r', '\t' and '\v') +; 7 - Space or tab character + + .export __ctype + +__ctype: + .byte $10 ; 0/00 ___ctrl_@___ + .byte $10 ; 1/01 ___ctrl_A___ + .byte $10 ; 2/02 ___ctrl_B___ + .byte $10 ; 3/03 ___ctrl_C___ + .byte $10 ; 4/04 ___ctrl_D___ + .byte $10 ; 5/05 ___ctrl_E___ + .byte $10 ; 6/06 ___ctrl_F___ + .byte $10 ; 7/07 ___ctrl_G___ + .byte $10 ; 8/08 ___ctrl_H___ + .byte $D0 ; 9/09 ___ctrl_I___ + .byte $50 ; 10/0a ___ctrl_J___ + .byte $50 ; 11/0b ___ctrl_K___ + .byte $50 ; 12/0c ___ctrl_L___ + .byte $50 ; 13/0d ___ctrl_M___ + .byte $10 ; 14/0e ___ctrl_N___ + .byte $10 ; 15/0f ___ctrl_O___ + .byte $10 ; 16/10 ___ctrl_P___ + .byte $10 ; 17/11 ___ctrl_Q___ + .byte $10 ; 18/12 ___ctrl_R___ + .byte $10 ; 19/13 ___ctrl_S___ + .byte $10 ; 20/14 ___ctrl_T___ + .byte $10 ; 21/15 ___ctrl_U___ + .byte $10 ; 22/16 ___ctrl_V___ + .byte $10 ; 23/17 ___ctrl_W___ + .byte $10 ; 24/18 ___ctrl_X___ + .byte $10 ; 25/19 ___ctrl_Y___ + .byte $10 ; 26/1a ___ctrl_Z___ + .byte $10 ; 27/1b ___ctrl_[___ + .byte $10 ; 28/1c ___ctrl_\___ + .byte $10 ; 29/1d ___ctrl_]___ + .byte $10 ; 30/1e ___ctrl_^___ + .byte $10 ; 31/1f ___ctrl_____ + .byte $A0 ; 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 $0C ; 48/30 _____0_____ + .byte $0C ; 49/31 _____1_____ + .byte $0C ; 50/32 _____2_____ + .byte $0C ; 51/33 _____3_____ + .byte $0C ; 52/34 _____4_____ + .byte $0C ; 53/35 _____5_____ + .byte $0C ; 54/36 _____6_____ + .byte $0C ; 55/37 _____7_____ + .byte $0C ; 56/38 _____8_____ + .byte $0C ; 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 $0A ; 65/41 _____A_____ + .byte $0A ; 66/42 _____B_____ + .byte $0A ; 67/43 _____C_____ + .byte $0A ; 68/44 _____D_____ + .byte $0A ; 69/45 _____E_____ + .byte $0A ; 70/46 _____F_____ + .byte $02 ; 71/47 _____G_____ + .byte $02 ; 72/48 _____H_____ + .byte $02 ; 73/49 _____I_____ + .byte $02 ; 74/4a _____J_____ + .byte $02 ; 75/4b _____K_____ + .byte $02 ; 76/4c _____L_____ + .byte $02 ; 77/4d _____M_____ + .byte $02 ; 78/4e _____N_____ + .byte $02 ; 79/4f _____O_____ + .byte $02 ; 80/50 _____P_____ + .byte $02 ; 81/51 _____Q_____ + .byte $02 ; 82/52 _____R_____ + .byte $02 ; 83/53 _____S_____ + .byte $02 ; 84/54 _____T_____ + .byte $02 ; 85/55 _____U_____ + .byte $02 ; 86/56 _____V_____ + .byte $02 ; 87/57 _____W_____ + .byte $02 ; 88/58 _____X_____ + .byte $02 ; 89/59 _____Y_____ + .byte $02 ; 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 ___grave___ + .byte $09 ; 97/61 _____a_____ + .byte $09 ; 98/62 _____b_____ + .byte $09 ; 99/63 _____c_____ + .byte $09 ; 100/64 _____d_____ + .byte $09 ; 101/65 _____e_____ + .byte $09 ; 102/66 _____f_____ + .byte $01 ; 103/67 _____g_____ + .byte $01 ; 104/68 _____h_____ + .byte $01 ; 105/69 _____i_____ + .byte $01 ; 106/6a _____j_____ + .byte $01 ; 107/6b _____k_____ + .byte $01 ; 108/6c _____l_____ + .byte $01 ; 109/6d _____m_____ + .byte $01 ; 110/6e _____n_____ + .byte $01 ; 111/6f _____o_____ + .byte $01 ; 112/70 _____p_____ + .byte $01 ; 113/71 _____q_____ + .byte $01 ; 114/72 _____r_____ + .byte $01 ; 115/73 _____s_____ + .byte $01 ; 116/74 _____t_____ + .byte $01 ; 117/75 _____u_____ + .byte $01 ; 118/76 _____v_____ + .byte $01 ; 119/77 _____w_____ + .byte $01 ; 120/78 _____x_____ + .byte $01 ; 121/79 _____y_____ + .byte $01 ; 122/7a _____z_____ + .byte $00 ; 123/7b _____{_____ + .byte $00 ; 124/7c _____|_____ + .byte $00 ; 125/7d _____}_____ + .byte $00 ; 126/7e _____~_____ + .byte $40 ; 127/7f ____DEL____ + + .byte $00 ; 128/80 ___________ + .byte $00 ; 129/81 ___________ + .byte $00 ; 130/82 ___________ + .byte $00 ; 131/83 ___________ + .byte $00 ; 132/84 ___________ + .byte $00 ; 133/85 ___________ + .byte $00 ; 134/86 ___________ + .byte $00 ; 135/87 ___________ + .byte $00 ; 136/88 ___________ + .byte $00 ; 137/89 ___________ + .byte $00 ; 138/8a ___________ + .byte $00 ; 139/8b ___________ + .byte $00 ; 140/8c ___________ + .byte $00 ; 141/8d ___________ + .byte $00 ; 142/8e ___________ + .byte $00 ; 143/8f ___________ + .byte $00 ; 144/90 ___________ + .byte $00 ; 145/91 ___________ + .byte $00 ; 146/92 ___________ + .byte $10 ; 147/93 ___________ + .byte $00 ; 148/94 ___________ + .byte $00 ; 149/95 ___________ + .byte $00 ; 150/96 ___________ + .byte $00 ; 151/97 ___________ + .byte $00 ; 152/98 ___________ + .byte $00 ; 153/99 ___________ + .byte $00 ; 154/9a ___________ + .byte $00 ; 155/9b ___________ + .byte $00 ; 156/9c ___________ + .byte $00 ; 157/9d ___________ + .byte $00 ; 158/9e ___________ + .byte $00 ; 159/9f ___________ + + .byte $00 ; 160/a0 ___________ + .byte $00 ; 161/a1 ___________ + .byte $00 ; 162/a2 ___________ + .byte $00 ; 163/a3 ___________ + .byte $00 ; 164/a4 ___________ + .byte $00 ; 165/a5 ___________ + .byte $00 ; 166/a6 ___________ + .byte $00 ; 167/a7 ___________ + .byte $00 ; 168/a8 ___________ + .byte $00 ; 169/a9 ___________ + .byte $00 ; 170/aa ___________ + .byte $00 ; 171/ab ___________ + .byte $00 ; 172/ac ___________ + .byte $00 ; 173/ad ___________ + .byte $00 ; 174/ae ___________ + .byte $00 ; 175/af ___________ + .byte $00 ; 176/b0 ___________ + .byte $00 ; 177/b1 ___________ + .byte $00 ; 178/b2 ___________ + .byte $00 ; 179/b3 ___________ + .byte $00 ; 180/b4 ___________ + .byte $00 ; 181/b5 ___________ + .byte $00 ; 182/b6 ___________ + .byte $00 ; 183/b7 ___________ + .byte $00 ; 184/b8 ___________ + .byte $00 ; 185/b9 ___________ + .byte $00 ; 186/ba ___________ + .byte $00 ; 187/bb ___________ + .byte $00 ; 188/bc ___________ + .byte $00 ; 189/bd ___________ + .byte $00 ; 190/be ___________ + .byte $00 ; 191/bf ___________ + + .byte $02 ; 192/c0 ___________ + .byte $02 ; 193/c1 ___________ + .byte $02 ; 194/c2 ___________ + .byte $02 ; 195/c3 ___________ + .byte $02 ; 196/c4 ___________ + .byte $02 ; 197/c5 ___________ + .byte $02 ; 198/c6 ___________ + .byte $02 ; 199/c7 ___________ + .byte $02 ; 200/c8 ___________ + .byte $02 ; 201/c9 ___________ + .byte $02 ; 202/ca ___________ + .byte $02 ; 203/cb ___________ + .byte $02 ; 204/cc ___________ + .byte $02 ; 205/cd ___________ + .byte $02 ; 206/ce ___________ + .byte $02 ; 207/cf ___________ + .byte $02 ; 208/d0 ___________ + .byte $02 ; 209/d1 ___________ + .byte $02 ; 210/d2 ___________ + .byte $02 ; 211/d3 ___________ + .byte $02 ; 212/d4 ___________ + .byte $02 ; 213/d5 ___________ + .byte $02 ; 214/d6 ___________ + .byte $02 ; 215/d7 ___________ + .byte $02 ; 216/d8 ___________ + .byte $02 ; 217/d9 ___________ + .byte $02 ; 218/da ___________ + .byte $02 ; 219/db ___________ + .byte $02 ; 220/dc ___________ + .byte $02 ; 221/dd ___________ + .byte $02 ; 222/de ___________ + .byte $00 ; 223/df ___________ + .byte $01 ; 224/e0 ___________ + .byte $01 ; 225/e1 ___________ + .byte $01 ; 226/e2 ___________ + .byte $01 ; 227/e3 ___________ + .byte $01 ; 228/e4 ___________ + .byte $01 ; 229/e5 ___________ + .byte $01 ; 230/e6 ___________ + .byte $01 ; 231/e7 ___________ + .byte $01 ; 232/e8 ___________ + .byte $01 ; 233/e9 ___________ + .byte $01 ; 234/ea ___________ + .byte $01 ; 235/eb ___________ + .byte $01 ; 236/ec ___________ + .byte $01 ; 237/ed ___________ + .byte $01 ; 238/ee ___________ + .byte $01 ; 239/ef ___________ + .byte $01 ; 240/f0 ___________ + .byte $01 ; 241/f1 ___________ + .byte $01 ; 242/f2 ___________ + .byte $01 ; 243/f3 ___________ + .byte $01 ; 244/f4 ___________ + .byte $01 ; 245/f5 ___________ + .byte $01 ; 246/f6 ___________ + .byte $01 ; 247/f7 ___________ + .byte $01 ; 248/f8 ___________ + .byte $01 ; 249/f9 ___________ + .byte $01 ; 250/fa ___________ + .byte $01 ; 251/fb ___________ + .byte $01 ; 252/fc ___________ + .byte $01 ; 253/fd ___________ + .byte $01 ; 254/fe ___________ + .byte $00 ; 255/ff ___________ + diff --git a/libsrc/telemon30/graphics.s b/libsrc/telemon30/graphics.s new file mode 100644 index 000000000..1d0beefa5 --- /dev/null +++ b/libsrc/telemon30/graphics.s @@ -0,0 +1,51 @@ + .export _paper,_hires,_text,_circle,_curset, _switchOffCursor + .importzp sp,tmp2,tmp3,tmp1 + + .include "telemon30.inc" + +.proc _paper + ldx #0 ; First window + ; A contains the paper + BRK_TELEMON XPAPER + rts +.endproc + +; XINK is bugged, it corrupt memory : removing from export +.proc _ink + ldx #0 ; First window + ; A contains the ink + BRK_TELEMON XINK + rts +.endproc + +; can be optimized with a macro +.proc _hires + BRK_TELEMON XHIRES + rts +.endproc + +.proc _text + BRK_TELEMON XTEXT + rts +.endproc + +.proc _curset + sta HRSX + sty HRSY + BRK_TELEMON XCURSE + rts +.endproc + +.proc _circle + sta HRS1 + BRK_TELEMON XCIRCL + rts +.endproc + +.proc _switchOffCursor + ldx #0 + BRK_TELEMON XCOSCR + rts +.endproc + + diff --git a/libsrc/telemon30/keyboard.s b/libsrc/telemon30/keyboard.s new file mode 100644 index 000000000..974f841e6 --- /dev/null +++ b/libsrc/telemon30/keyboard.s @@ -0,0 +1,13 @@ + .export _key + .importzp sp,tmp2,tmp3,tmp1 + + .include "telemon30.inc" + + +; char key(void); + +.proc _key + BRK_TELEMON XRDW0 ; read keyboard + rts +.endproc + diff --git a/libsrc/telemon30/mainargs.s b/libsrc/telemon30/mainargs.s new file mode 100644 index 000000000..452d0d6d6 --- /dev/null +++ b/libsrc/telemon30/mainargs.s @@ -0,0 +1,137 @@ +; +; 2003-03-07, Ullrich von Bassewitz +; 2011-01-28, Stefan Haubenthal +; 2014-09-10, Greg King +; +; Set up arguments for main +; + + .constructor initmainargs, 24 + .import __argc, __argv + .import ptr1 + .include "telemon30.inc" + .macpack generic + +MAXARGS = 10 ; Maximum number of arguments allowed + + + + + +; Assume that the program was loaded, a moment ago, by the traditional LOAD +; statement. Save the "most-recent filename" as argument #0. +initmainargs: + + ldx #0 ; Limit the length + ; lda #0 ; The terminating NUL character + ; beq L1 ; Branch always +L0: lda BUFEDT,x + beq L3 + cmp #' ' + bne L1 + lda #0 + beq L3 +L1: sta name,x + inx + cpx #FNAME_LEN + bne L0 + lda #0 +L3: + sta name,x + inc __argc ; argc always is equal to, at least, 1 + + + + + + ldy #1 * 2 ; Point to second argv slot + +next: lda BUFEDT,x + beq done ; End of line reached + inx + cmp #' ' ; Skip leading spaces + beq next + + + + + +found: cmp #'"' ; Is the argument quoted? + beq setterm ; Jump if so + dex ; Reset pointer to first argument character + + + lda #' ' ; A space ends the argument +setterm:sta term ; Set end of argument marker + +; Now, store a pointer, to the argument, into the next slot. + + txa ; Get low byte + clc + adc #BUFEDT + ;adc #>args + sta argv+1,y + iny + iny + inc __argc ; Found another arg + +; Search for the end of the argument + + + +argloop:lda BUFEDT,x + beq done + inx + cmp term + bne argloop + +; We've found the end of the argument. X points one character behind it, and +; A contains the terminating character. To make the argument a valid C string, +; replace the terminating character by a zero. + + lda #0 + sta BUFEDT-1,x + +; Check if the maximum number of command line arguments is reached. If not, +; parse the next one. + + lda __argc ; Get low byte of argument count + cmp #MAXARGS ; Maximum number of arguments reached? + bcc next ; Parse next one if not + + + + +done: lda #argv + sta __argv + stx __argv + 1 + rts + + + +.segment "INIT" + +term: .res 1 + + +.data + +name: .res FNAME_LEN + 1 +args: .res SCREEN_XSIZE * 2 - 1 + +ptr_current: + .res 2 +param_found: + .res 1 +; char* argv[MAXARGS+1]={name}; +argv: + .addr name + .res MAXARGS * 2 diff --git a/libsrc/telemon30/mym.s b/libsrc/telemon30/mym.s new file mode 100644 index 000000000..f387f9d64 --- /dev/null +++ b/libsrc/telemon30/mym.s @@ -0,0 +1,626 @@ + .export _Mym_MusicStart + .importzp sp,tmp2,tmp3,tmp1,ptr1 + + .include "telemon30.inc" + +; To check: AYC +; http://cpcwiki.eu/index.php/AYC + + + + +_DecodedByte :=$D0 ; Byte being currently decoded from the MYM stream +_DecodeBitCounter :=$D2 ; Number of bits we can read in the current byte +_DecodedResult :=$D3 ; What is returned by the 'read bits' function +_CurrentAYRegister :=$D4 ; Contains the number of the register being decoded +_RegisterBufferHigh :=$D5 ; Points to the high byte of the decoded register buffer, increment to move to the next register +_BufferFrameOffset :=$D6 ; From 0 to 127, used when filling the decoded register buffer +_MusicResetCounter :=$D7 ; 2 bytes Contains the number of rows to play before reseting +_CurrentFrame :=$D9 ; From 0 to 255 and then cycles... the index of the frame to play this vbl +_PlayerVbl :=$DA +_FrameLoadBalancer :=$DB ; We depack a new frame every 9 VBLs, this way the 14 registers are evenly depacked over 128 frames + + +VIA_1 := $30f +VIA_2 := $30c + +_MusicData := $c000 + +; mym(char *buf) + + + + +; +; Current PSG values during unpacking +; + + +.proc _Mym_MusicStart + + ; The two first bytes of the MYM music is the number of rows in the music + ; We decrement that at each frame, and when we reach zero, time to start again. + sta ptr1 + stx ptr1+1 + + ldy #0 + lda (ptr1),y + sta _MusicResetCounter+0 + iny + lda (ptr1),y + tax + inx + stx _MusicResetCounter+1 + + ;ldx _MusicData+0 + ;stx _MusicResetCounter+0 + ;ldx _MusicData+1 + ;inx + ;stx _MusicResetCounter+1 + + + ; Initialize the read bit counter + ldy #2 ; should be useless because we can do iny which earn 1 byte + + lda ptr1 + clc + adc #2 + bcc next20 + inc ptr1+1 + lda ptr1+1 + sta __auto_music_ptr+2 +next20: + sta ptr1 + sta __auto_music_ptr+1 + + + + ;lda #<(_MusicData+2) + ;sta __auto_music_ptr+1 + ;lda #>(_MusicData+2) + ;sta __auto_music_ptr+2 + + lda #1 + sta _DecodeBitCounter + + ; Clear all data + lda #0 + sta _DecodedResult + sta _DecodedByte + sta _PlayerVbl + sta _PlayerRegCurrentValue + sta _BufferFrameOffset + sta _PlayerCount + sta _CurrentAYRegister + sta _CurrentFrame + + ldx #14 +loop_init: + dex + sta _PlayerRegValues,x + bne loop_init + + + ; + ; Unpack the 128 first register frames + ; + + lda #>_PlayerBuffer + sta _RegisterBufferHigh + + ldx #0 +unpack_block_loop: + stx _CurrentAYRegister + + ; Unpack that register + jsr _PlayerUnpackRegister2 + + ; Next register + ldx _CurrentAYRegister + inx + cpx #14 + bne unpack_block_loop + + + lda #128 + sta _PlayerVbl+0 + + lda #0 + sta _PlayerCount + sta _CurrentAYRegister + sta _CurrentFrame + + lda #9 + sta _FrameLoadBalancer + + lda #1 + sta _MusicPlaying + + ; + ; Install the IRQ + ; + php + sei + lda #<_Mym_PlayFrame + sta _InterruptCallBack_3+1 + lda #>_Mym_PlayFrame + sta _InterruptCallBack_3+2 + plp + + rts + + +_Mym_MusicStop: + + ; Indicate the main code that the music is finished + lda #0 + sta _MusicPlaying + + ; Disable the IRQ so it does not conflict or cause weird things + php + sei + lda #<_DoNothing + sta _InterruptCallBack_3+1 + lda #>_DoNothing + sta _InterruptCallBack_3+2 + plp + + ; Cut the sound so it does not sounds like a dying cat + + ; y=register number + ; x=value to write + ldy #7 ; Control register + ldx #$FF + jsr _PsgPlayRegister + + ldy #8 ; Volume A + ldx #0 + jsr _PsgPlayRegister + + ldy #9 ; Volume B + ldx #0 + jsr _PsgPlayRegister + + ldy #10 ; Volume C + ldx #0 + jsr _PsgPlayRegister + rts + + +_Mym_PlayFrame: + + ; + ; Check for end of music + ; CountZero: $81,$0d + dec _MusicResetCounter+0 + bne music_contines + dec _MusicResetCounter+1 + bne music_contines + +music_resets: + jmp _Mym_MusicStop + +music_contines: + + ; + ; Play a frame of 14 registers + ; + + lda _CurrentFrame + sta _auto_psg_play_read+1 + lda #>_PlayerBuffer + sta _auto_psg_play_read+2 + + ldy #0 +register_loop: + +_auto_psg_play_read: + ldx _PlayerBuffer + + ; y=register number + ; x=value to write + jsr _PsgPlayRegister + + inc _auto_psg_play_read+2 + iny + cpy #14 + bne register_loop + + + + inc _CurrentFrame + inc _PlayerCount + + lda _CurrentAYRegister + cmp #14 + bcs end_reg + + + dec _FrameLoadBalancer + bne end + + jsr _PlayerUnpackRegister + inc _CurrentAYRegister + lda #9 + sta _FrameLoadBalancer +end: + rts + + +end_reg: + + lda _PlayerCount + cmp #128 + bcc skip2 + + lda #0 + sta _CurrentAYRegister + sta _PlayerCount + lda #9 + sta _FrameLoadBalancer + + clc + lda _PlayerVbl+0 + adc #128 + sta _PlayerVbl+0 +skip2: + + + rts + + + +; y=register number +; x=value to write +_PsgPlayRegister: + + sty VIA_1 + txa + + pha + lda VIA_2 + ora #$EE ; $EE 238 11101110 + sta VIA_2 + + and #$11 ; $11 17 00010001 + ora #$CC ; $CC 204 11001100 + sta VIA_2 + + tax + pla + sta VIA_1 + txa + ora #$EC ; $EC 236 11101100 + sta VIA_2 + + and #$11 ; $11 17 00010001 + ora #$CC ; $CC 204 11001100 + sta VIA_2 + + rts + + + + +; +; Initialise X with the number of bits to read +; Y is not modifier +; +_ReadBits: + + lda #0 + sta _DecodedResult + + ; Will iterate X times (number of bits to read) +loop_read_bits: + + dec _DecodeBitCounter + beq get_next_byte + +shift_bit: + asl _DecodedByte + rol _DecodedResult + + dex + bne loop_read_bits + rts + +get_next_byte: + ; reset mask + lda #8 + sta _DecodeBitCounter + + ; fetch a new byte, and increment the adress. +__auto_music_ptr: + lda _MusicData+2 + sta _DecodedByte + + inc __auto_music_ptr+1 + bne shift_bit + inc __auto_music_ptr+2 + jmp shift_bit + + + + + +_PlayerUnpackRegister: + lda #>_PlayerBuffer + clc + adc _CurrentAYRegister + sta _RegisterBufferHigh +_PlayerUnpackRegister2: + ; + ; Init register bit count and current value + ; + ldx _CurrentAYRegister + lda _PlayerRegValues,x + sta _PlayerRegCurrentValue + + + ; + ; Check if it's packed or not + ; and call adequate routine... + ; + ldx #1 + jsr _ReadBits + ldx _DecodedResult + bne DecompressFragment + + +UnchangedFragment: + + ; + ; No change at all, just repeat '_PlayerRegCurrentValue' 128 times + ; + lda _RegisterBufferHigh ; highpart of buffer adress + register number + sta __auto_copy_unchanged_write+2 + + ldx #128 ; 128 iterations + lda _PlayerRegCurrentValue ; Value to write + + ldy _PlayerVbl + +repeat_loop: +__auto_copy_unchanged_write: + sta _PlayerBuffer,y + iny + dex + bne repeat_loop + + + jmp player_main_return + + +player_main_return: + ; Write back register current value + ldx _CurrentAYRegister + lda _PlayerRegCurrentValue + sta _PlayerRegValues,x + + ; Move to the next register buffer + inc _RegisterBufferHigh + rts + + + + +DecompressFragment: + lda _PlayerVbl ; Either 0 or 128 at this point else we have a problem... + sta _BufferFrameOffset + +decompressFragmentLoop: + +player_copy_packed_loop: + ; Check packing method + ldx #1 + jsr _ReadBits + + ldx _DecodedResult + bne PlayerNotCopyLast + +UnchangedRegister: + + ; We just copy the current value 128 times + lda _RegisterBufferHigh ; highpart of buffer adress + register number + sta __auto_player_copy_last+2 + + ldx _BufferFrameOffset ; Value between 00 and 7f + lda _PlayerRegCurrentValue ; Value to copy +__auto_player_copy_last: + sta _PlayerBuffer,x + + inc _BufferFrameOffset + + + +player_return: + + ; Check end of loop + lda _BufferFrameOffset + and #127 + bne decompressFragmentLoop + + jmp player_main_return + + +PlayerNotCopyLast: + ; Check packing method + ldx #1 + jsr _ReadBits + + ldx _DecodedResult + beq DecompressWithOffset + +ReadNewRegisterValue: + ; Read new register value (variable bit count) + ldx _CurrentAYRegister + lda _PlayerRegBits,x + tax + jsr _ReadBits + ldx _DecodedResult + stx _PlayerRegCurrentValue + + ; Copy to stream + lda _RegisterBufferHigh ; highpart of buffer adress + register number + sta __auto_player_read_new+2 + + ldx _BufferFrameOffset ; Value between 00 and 7f + lda _PlayerRegCurrentValue ; New value to write +__auto_player_read_new: + sta _PlayerBuffer,x + + inc _BufferFrameOffset + jmp player_return + + + + +DecompressWithOffset: + + ; Read Offset (0 to 127) + ldx #7 + jsr _ReadBits + + lda _RegisterBufferHigh ; highpart of buffer adress + register number + sta __auto_write+2 ; Write adress + sta __auto_read+2 ; Read adress + + ; Compute wrap around offset... + lda _BufferFrameOffset ; between 0 and 255 + clc + adc _DecodedResult ; + Offset Between 00 and 7f + sec + sbc #128 ; -128 + tay + + ; Read count (7 bits) + ldx #7 + jsr _ReadBits + + inc _DecodedResult ; 1 to 129 + + + ldx _BufferFrameOffset + +player_copy_offset_loop: + +__auto_read: + lda _PlayerBuffer,y ; Y for reading + iny + +__auto_write: + sta _PlayerBuffer,x ; X for writing + + inx + dec _DecodedResult + bne player_copy_offset_loop + + stx _BufferFrameOffset + sta _PlayerRegCurrentValue + + jmp player_return + + + + +; +; Size in bits of each PSG register +; +_PlayerRegBits: + ; Chanel A Frequency + .byt 8 + .byt 4 + + ; Chanel B Frequency + .byt 8 + .byt 4 + + ; Chanel C Frequency + .byt 8 + .byt 4 + + ; Chanel sound generator + .byt 5 + + ; select + .byt 8 + + ; Volume A,B,C + .byt 5 + .byt 5 + .byt 5 + + ; Wave period + .byt 8 + .byt 8 + + ; Wave form + .byt 8 + +_PlayerCount: + .res 1,0 ; must be equal to 0 +_MusicPlaying: + .res 1,0 ; must be equal to 0 + + +_PlayerRegValues: +_RegisterChanAFrequency: + ; Chanel A Frequency + .res 1,8 + .res 1,4 + +_RegisterChanBFrequency: + ; Chanel B Frequency + .res 1,8 + .res 1,4 + +_RegisterChanCFrequency: + ; Chanel C Frequency + .res 1,8 + .res 1,4 + +_RegisterChanNoiseFrequency: + ; Chanel sound generator + .res 1,5 + + ; select + .res 1,8 + + ; Volume A,B,C +_RegisterChanAVolume: + .res 1,5 +_RegisterChanBVolume: + .res 1,5 +_RegisterChanCVolume: + .res 1,5 + + ; Wave period + .res 1,8 + .res 1,8 + + ; Wave form + .res 1,8 + +_PlayerRegCurrentValue: + .res 1,0 +_DoNothing: + rts + +_InterruptCallBack_3: ; Used by the music player + jsr _DoNothing ; Transformed to "jsr _Mym_PlayFrame" -> 12 cycles + +; jsr MiniScrollLoading ; -> 338 cycles + + pla + tay + pla + tax + pla + + rti +_PlayerBuffer: + .res 256*14 ; About 3.5 kilobytes somewhere in memory, we put the music file in overlay memory + +.endproc + diff --git a/libsrc/telemon30/orixhdr.s b/libsrc/telemon30/orixhdr.s new file mode 100644 index 000000000..8744e86b0 --- /dev/null +++ b/libsrc/telemon30/orixhdr.s @@ -0,0 +1,36 @@ +; +; Based on code by Debrune Jérôme +; 2016-03-17, Greg King +; + + ; The following symbol is used by the linker config. file + ; to force this module to be included into the output file. + .export __ORIXHDR__:abs = 1 + + ; These symbols, also, come from the configuration file. + .import __AUTORUN__, __PROGFLAG__ + .import __BASHEAD_START__, __MAIN_LAST__ + + +; ------------------------------------------------------------------------ +; Oric cassette-tape header + +.segment "ORIXHDR" + + .byte $01, $00 ; + + .byte "ORI" + + .byte $01 ; version + .byte $00,$00 ; mode + .byte $00,$00 ; cpu type + .byte $00,$00 ; OS + + .byte $00 ; reserved + .byte $00 ; auto + + + .word __BASHEAD_START__ ; Address of start of file + .word __MAIN_LAST__ - 1 ; Address of end of file + .word __BASHEAD_START__ ; Address of start of file + diff --git a/libsrc/telemon30/oserrlist.s b/libsrc/telemon30/oserrlist.s new file mode 100644 index 000000000..8ec41de6d --- /dev/null +++ b/libsrc/telemon30/oserrlist.s @@ -0,0 +1,75 @@ +; +; Stefan Haubenthal, 2004-05-25 +; Ullrich von Bassewitz, 18.07.2002 +; +; Defines the platform specific error list. +; +; The table is built as a list of entries +; +; .byte entrylen +; .byte errorcode +; .asciiz errormsg +; +; and terminated by an entry with length zero that is returned if the +; error code could not be found. +; + + .export __sys_oserrlist + +;---------------------------------------------------------------------------- +; Macros used to generate the list (may get moved to an include file?) + +; Regular entry +.macro sys_oserr_entry code, msg + .local Start, End +Start: .byte End - Start + .byte code + .asciiz msg +End: +.endmacro + +; Sentinel entry +.macro sys_oserr_sentinel msg + .byte 0 ; Length is always zero + .byte 0 ; Code is unused + .asciiz msg +.endmacro + +;---------------------------------------------------------------------------- +; The error message table + +.rodata + +__sys_oserrlist: + sys_oserr_entry 1, "File not found" + sys_oserr_entry 2, "Invalid command end" + sys_oserr_entry 3, "No drive number" + sys_oserr_entry 4, "Bad drive number" + sys_oserr_entry 5, "Invalid filename" + sys_oserr_entry 6, "fderr=(error number)" + sys_oserr_entry 7, "Illegal attribute" + sys_oserr_entry 8, "Wildcard(s) not allowed" + sys_oserr_entry 9, "File already exists" + sys_oserr_entry 10, "Insufficient disc space" + sys_oserr_entry 11, "File open" + sys_oserr_entry 12, "Illegal quantity" + sys_oserr_entry 13, "End address missing" + sys_oserr_entry 14, "Start address > end address" + sys_oserr_entry 15, "Missing 'to'" + sys_oserr_entry 16, "Renamed file not on same disc" + sys_oserr_entry 17, "Unknown array" + sys_oserr_entry 18, "Target drive not source drive" + sys_oserr_entry 19, "Destination not specified" + sys_oserr_entry 20, "Cannot merge and overwrite" + sys_oserr_entry 21, "Single target file illegal" + sys_oserr_entry 22, "Syntax" + sys_oserr_entry 23, "Filename missing" + sys_oserr_entry 24, "Source file missing" + sys_oserr_entry 25, "Type mismatch" + sys_oserr_entry 26, "Disc write-protected" + sys_oserr_entry 27, "Incompatible drives" + sys_oserr_entry 28, "File not open" + sys_oserr_entry 29, "File end" + sys_oserr_sentinel "Unknown error" + + diff --git a/libsrc/telemon30/oserror.s b/libsrc/telemon30/oserror.s new file mode 100644 index 000000000..37c9bd7fc --- /dev/null +++ b/libsrc/telemon30/oserror.s @@ -0,0 +1,17 @@ +; +; 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/telemon30/print.s b/libsrc/telemon30/print.s new file mode 100644 index 000000000..56c513fd6 --- /dev/null +++ b/libsrc/telemon30/print.s @@ -0,0 +1,21 @@ +; +; Jede +; +; print (char * str); +; +; This function is a hack! +; + + .export _print + .import popax + .importzp tmp1 + .include "telemon30.inc" + +.proc _print + stx tmp1 + ldy tmp1 + BRK_TELEMON XWSTR0 + rts +.endproc + + diff --git a/libsrc/telemon30/sound.s b/libsrc/telemon30/sound.s new file mode 100644 index 000000000..2df18f4a0 --- /dev/null +++ b/libsrc/telemon30/sound.s @@ -0,0 +1,45 @@ + .export _kbdclick1,_oups,_ping,_explode,_shoot,_zap + .include "telemon30.inc" + +.proc _kbdclick1 + LDX #sound_bip_keyboard + BRK_TELEMON XSONPS + rts +sound_bip_keyboard: + .byte $1f,$00,$00,$00,$00,$00,$00,$3e,$10,$00,$00,$1f,$00,$00 +.endproc + +.proc _explode + BRK_TELEMON XEXPLO + rts +.endproc + +.proc _oups + BRK_TELEMON XOUPS + rts +.endproc + +.proc _ping + BRK_TELEMON XPING + rts +.endproc + +.proc _shoot + BRK_TELEMON XSHOOT + rts +.endproc + +.proc _zap + BRK_TELEMON XZAP + rts +.endproc + + + +; XPLAY := $43 +; XSOUND := $44 +; XMUSIC := $45 + + + diff --git a/libsrc/telemon30/sysuname.s b/libsrc/telemon30/sysuname.s new file mode 100644 index 000000000..51af1d8fe --- /dev/null +++ b/libsrc/telemon30/sysuname.s @@ -0,0 +1,46 @@ +; +; Ullrich von Bassewitz, 2003-08-12 +; +; unsigned char __fastcall__ _sysuname (struct utsname* buf); +; + + .export __sysuname, utsdata + + .import utscopy + + __sysuname = utscopy + +;-------------------------------------------------------------------------- +; Data. We define a fixed utsname struct here and just copy it. + +.rodata + +utsdata: + ; sysname + .asciiz "cc65" + + ; nodename + .asciiz "" + + ; release + .byte ((.VERSION >> 8) & $0F) + '0' + .byte '.' + .if ((.VERSION >> 4) & $0F) > 9 + .byte ((.VERSION >> 4) & $0F) / 10 + '0' + .byte ((.VERSION >> 4) & $0F) .MOD 10 + '0' + .else + .byte ((.VERSION >> 4) & $0F) + '0' + .endif + .byte $00 + + ; version + .if (.VERSION & $0F) > 9 + .byte (.VERSION & $0F) / 10 + '0' + .byte (.VERSION & $0F) .MOD 10 + '0' + .else + .byte (.VERSION & $0F) + '0' + .endif + .byte $00 + + ; machine + .asciiz "Oric Telestrat" diff --git a/libsrc/telemon30/write.s b/libsrc/telemon30/write.s new file mode 100644 index 000000000..32965fe3d --- /dev/null +++ b/libsrc/telemon30/write.s @@ -0,0 +1,61 @@ +; +; Ullrich von Bassewitz, 2003-04-13 +; +; int write (int fd, const void* buf, int count); +; +; This function is a hack! +; + + .export _write + .import popax + .importzp ptr1, ptr2, ptr3, tmp1 + + .include "telemon30.inc" + +.proc _write + + sta ptr3 + stx ptr3+1 ; save count as result + + eor #$FF + sta ptr2 + txa + eor #$FF + sta ptr2+1 ; Remember -count-1 + + jsr popax ; get buf + sta ptr1 + stx ptr1+1 + jsr popax ; get fd and discard +L1: inc ptr2 + bne L2 + inc ptr2+1 + beq L9 +L2: ldy #0 + lda (ptr1),y + tax + cpx #$0A ; Check for \n + bne L3 + BRK_TELEMON XWR0 ; Macro + lda #$0d ; return to the beggining of the line + BRK_TELEMON XWR0 ; Macro ; + + + ldx #$0D +L3: + BRK_TELEMON XWR0 ; Macro + + inc ptr1 + bne L1 + inc ptr1+1 + jmp L1 + +; No error, return count + +L9: lda ptr3 + ldx ptr3+1 + rts + +.endproc + + diff --git a/src/ar65.vcxproj b/src/ar65.vcxproj index b077134ce..003a5fa69 100644 --- a/src/ar65.vcxproj +++ b/src/ar65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/ca65.vcxproj b/src/ca65.vcxproj index 4e02fa2a9..fb7cf2e26 100644 --- a/src/ca65.vcxproj +++ b/src/ca65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/ca65/main.c b/src/ca65/main.c index d6c364e4b..4aa60f2f0 100644 --- a/src/ca65/main.c +++ b/src/ca65/main.c @@ -226,10 +226,6 @@ static void SetSys (const char* Sys) CBMSystem ("__C64__"); break; - case TGT_C65: - CBMSystem ("__C65__"); - break; - case TGT_VIC20: CBMSystem ("__VIC20__"); break; @@ -289,7 +285,15 @@ static void SetSys (const char* Sys) case TGT_ATMOS: NewSymbol ("__ATMOS__", 1); - break; + break; + + case TGT_TELEMON24: + NewSymbol ("__TELEMON24__", 1); + break; + + case TGT_TELEMON30: + NewSymbol ("__TELEMON30__", 1); + break; case TGT_NES: NewSymbol ("__NES__", 1); @@ -623,8 +627,7 @@ static void OptVersion (const char* Opt attribute ((unused)), const char* Arg attribute ((unused))) /* Print the assembler version */ { - fprintf (stderr, "%s V%s\n", ProgName, GetVersionAsString ()); - exit(EXIT_SUCCESS); + fprintf (stderr, "ca65 V%s\n", GetVersionAsString ()); } diff --git a/src/cc65.vcxproj b/src/cc65.vcxproj index 1c1f993fe..aa85b0936 100644 --- a/src/cc65.vcxproj +++ b/src/cc65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/cc65/main.c b/src/cc65/main.c index afbec43d7..f25a44d69 100644 --- a/src/cc65/main.c +++ b/src/cc65/main.c @@ -243,6 +243,14 @@ static void SetSys (const char* Sys) DefineNumericMacro ("__ATMOS__", 1); break; + case TGT_TELEMON24: + DefineNumericMacro ("__TELEMON24__", 1); + break; + + case TGT_TELEMON30: + DefineNumericMacro ("__TELEMON30__", 1); + break; + case TGT_NES: DefineNumericMacro ("__NES__", 1); break; @@ -742,7 +750,7 @@ static void OptVersion (const char* Opt attribute ((unused)), const char* Arg attribute ((unused))) /* Print the compiler version */ { - fprintf (stderr, "%s V%s\n", ProgName, GetVersionAsString ()); + fprintf (stderr, "cc65 V%s\n", GetVersionAsString ()); exit (EXIT_SUCCESS); } diff --git a/src/chrcvt65.vcxproj b/src/chrcvt65.vcxproj index 1daf7cae9..d120399d1 100644 --- a/src/chrcvt65.vcxproj +++ b/src/chrcvt65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/cl65.vcxproj b/src/cl65.vcxproj index 64c1126b1..b6ceb161a 100644 --- a/src/cl65.vcxproj +++ b/src/cl65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/co65.vcxproj b/src/co65.vcxproj index c66c8aac8..89eed36e1 100644 --- a/src/co65.vcxproj +++ b/src/co65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/common.vcxproj b/src/common.vcxproj index 053d23981..c466d9712 100644 --- a/src/common.vcxproj +++ b/src/common.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -113,13 +113,13 @@ StaticLibrary true - v120 + v140 false true StaticLibrary - v120 + v140 diff --git a/src/common/target.c b/src/common/target.c index 99a134c43..adbc080bf 100644 --- a/src/common/target.c +++ b/src/common/target.c @@ -147,12 +147,11 @@ static const TargetEntry TargetMap[] = { { "atari", TGT_ATARI }, { "atari5200", TGT_ATARI5200 }, { "atarixl", TGT_ATARIXL }, - { "atmos", TGT_ATMOS }, + { "atmos", TGT_ATMOS }, { "bbc", TGT_BBC }, { "c128", TGT_C128 }, { "c16", TGT_C16 }, { "c64", TGT_C64 }, - { "c65", TGT_C65 }, { "cbm510", TGT_CBM510 }, { "cbm610", TGT_CBM610 }, { "gamate", TGT_GAMATE }, @@ -171,6 +170,8 @@ static const TargetEntry TargetMap[] = { { "sim6502", TGT_SIM6502 }, { "sim65c02", TGT_SIM65C02 }, { "supervision", TGT_SUPERVISION }, + { "telemon24", TGT_TELEMON24 }, + { "telemon30", TGT_TELEMON30 }, { "vic20", TGT_VIC20 }, }; #define MAP_ENTRY_COUNT (sizeof (TargetMap) / sizeof (TargetMap[0])) @@ -199,6 +200,8 @@ static const TargetProperties PropertyTable[TGT_COUNT] = { { "geos-apple", CPU_65C02, BINFMT_BINARY, CTNone }, { "lunix", CPU_6502, BINFMT_O65, CTNone }, { "atmos", CPU_6502, BINFMT_BINARY, CTNone }, + { "telemon24", CPU_6502, BINFMT_BINARY, CTNone }, + { "telemon30", CPU_6502, BINFMT_BINARY, CTNone }, { "nes", CPU_6502, BINFMT_BINARY, CTNone }, { "supervision", CPU_65SC02, BINFMT_BINARY, CTNone }, { "lynx", CPU_65SC02, BINFMT_BINARY, CTNone }, @@ -206,7 +209,6 @@ static const TargetProperties PropertyTable[TGT_COUNT] = { { "sim65c02", CPU_65C02, BINFMT_BINARY, CTNone }, { "pce", CPU_HUC6280, BINFMT_BINARY, CTNone }, { "gamate", CPU_6502, BINFMT_BINARY, CTNone }, - { "c65", CPU_4510, BINFMT_BINARY, CTPET }, }; /* Target system */ diff --git a/src/common/target.h b/src/common/target.h index 4115ae21a..4bc00225d 100644 --- a/src/common/target.h +++ b/src/common/target.h @@ -73,6 +73,8 @@ typedef enum { TGT_GEOS_APPLE, TGT_LUNIX, TGT_ATMOS, + TGT_TELEMON24, + TGT_TELEMON30, TGT_NES, TGT_SUPERVISION, TGT_LYNX, @@ -80,7 +82,6 @@ typedef enum { TGT_SIM65C02, TGT_PCENGINE, TGT_GAMATE, - TGT_C65, TGT_COUNT /* Number of target systems */ } target_t; diff --git a/src/da65.vcxproj b/src/da65.vcxproj index 7810844dc..cf297fd32 100644 --- a/src/da65.vcxproj +++ b/src/da65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/grc65.vcxproj b/src/grc65.vcxproj index 211ad7cce..afac0cce1 100644 --- a/src/grc65.vcxproj +++ b/src/grc65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/ld65.vcxproj b/src/ld65.vcxproj index acb9b4240..cc5598aad 100644 --- a/src/ld65.vcxproj +++ b/src/ld65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/od65.vcxproj b/src/od65.vcxproj index c788ac961..2ace26001 100644 --- a/src/od65.vcxproj +++ b/src/od65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/sim65.vcxproj b/src/sim65.vcxproj index f87b4db6b..9ba0980ba 100644 --- a/src/sim65.vcxproj +++ b/src/sim65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 diff --git a/src/sp65.vcxproj b/src/sp65.vcxproj index 8db98346c..6e7d992d4 100644 --- a/src/sp65.vcxproj +++ b/src/sp65.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -18,12 +18,12 @@ true - v120 + v140 false true - v120 + v140 -- 2.39.5