ldy #opcode
sty _SMCDesignator
.else
- .error "Invalid usage of macro 'SMC_TransferOpcode'"
+ .error "Invalid usage of macro 'SMC_TransferOpcode'"
.endif
.endmacro
.elseif .match ({register}, y)
ldy _SMCDesignator
.else
- .error "Invalid usage of macro 'SMC_LoadOpcode'"
+ .error "Invalid usage of macro 'SMC_LoadOpcode'"
.endif
.endmacro
.elseif .match ({register}, y)
sty _SMCDesignator
.else
- .error "Invalid usage of macro 'SMC_StoreOpcode'"
+ .error "Invalid usage of macro 'SMC_StoreOpcode'"
.endif
.endmacro
ldy #(<(destination - _SMCDesignator - 2))
sty _SMCDesignator+1
.else
- .error "Invalid usage of macro 'SMC_ChangeBranch'"
+ .error "Invalid usage of macro 'SMC_ChangeBranch'"
.endif
.endmacro
ldy value
sty _SMCDesignator+1
.else
- .error "Invalid usage of macro 'SMC_TransferValue'"
+ .error "Invalid usage of macro 'SMC_TransferValue'"
.endif
.endmacro
.elseif .match ({register}, y)
ldy _SMCDesignator+1
.else
- .error "Invalid usage of macro 'SMC_LoadValue'"
+ .error "Invalid usage of macro 'SMC_LoadValue'"
.endif
.endmacro
.elseif .match ({register}, y)
sty _SMCDesignator+1
.else
- .error "Invalid usage of macro 'SMC_StoreValue'"
+ .error "Invalid usage of macro 'SMC_StoreValue'"
.endif
.endmacro
ldy value
sty _SMCDesignator+2
.else
- .error "Invalid usage of macro 'SMC_TransferHighByte'"
+ .error "Invalid usage of macro 'SMC_TransferHighByte'"
.endif
.endmacro
.elseif .match ({register}, y)
ldy _SMCDesignator+2
.else
- .error "Invalid usage of macro 'SMC_LoadHighByte'"
+ .error "Invalid usage of macro 'SMC_LoadHighByte'"
.endif
.endmacro
.elseif .match ({register}, y)
sty _SMCDesignator+2
.else
- .error "Invalid usage of macro 'SMC_StoreHighByte'"
+ .error "Invalid usage of macro 'SMC_StoreHighByte'"
.endif
.endmacro
sty _SMCDesignator+2
.endif
.else
- .error "Invalid usage of macro 'SMC_TransferAddressSingle'"
+ .error "Invalid usage of macro 'SMC_TransferAddressSingle'"
.endif
.endmacro
; MACRO
.macro BRK_TELEMON value
- .byte $00,value
+ .byte $00,value
.endmacro
__ORIXHDR__: type = import;
__STACKSIZE__: type = weak, value = $0800; # 2K stack
__GRAB__: type = weak, value = 0; # 0=don't grab graphics RAM, 1=grab graphics RAM
- __RAMEND__: type = weak, value = $9800 + $1C00 * __GRAB__;
+ __RAMEND__: type = weak, value = $9800 + $1C00 * __GRAB__;
}
MEMORY {
ZP: file = "", define = yes, start = $00B0, size = $003A;
/* TIA write / read registers */
struct __tia {
union {
- unsigned char vsync;
- unsigned char cxm0p;
+ unsigned char vsync;
+ unsigned char cxm0p;
};
union {
- unsigned char vblank;
- unsigned char cxm1p;
+ unsigned char vblank;
+ unsigned char cxm1p;
};
union {
- unsigned char wsync;
- unsigned char cxp0fb;
+ unsigned char wsync;
+ unsigned char cxp0fb;
};
union {
- unsigned char rsync;
- unsigned char cxp1fb;
+ unsigned char rsync;
+ unsigned char cxp1fb;
};
union {
- unsigned char nusiz0;
- unsigned char cxm0fb;
+ unsigned char nusiz0;
+ unsigned char cxm0fb;
};
union {
- unsigned char nusiz1;
- unsigned char cxm1fb;
+ unsigned char nusiz1;
+ unsigned char cxm1fb;
};
union {
- unsigned char colup0;
- unsigned char cxblpf;
+ unsigned char colup0;
+ unsigned char cxblpf;
};
union {
- unsigned char colup1;
- unsigned char cxppmm;
+ unsigned char colup1;
+ unsigned char cxppmm;
};
union {
- unsigned char colupf;
- unsigned char inpt0;
+ unsigned char colupf;
+ unsigned char inpt0;
};
union {
- unsigned char colubk;
- unsigned char inpt1;
+ unsigned char colubk;
+ unsigned char inpt1;
};
union {
- unsigned char ctrlpf;
- unsigned char inpt2;
+ unsigned char ctrlpf;
+ unsigned char inpt2;
};
union {
- unsigned char refp0;
- unsigned char inpt3;
+ unsigned char refp0;
+ unsigned char inpt3;
};
union {
- unsigned char refp1;
- unsigned char inpt4;
+ unsigned char refp1;
+ unsigned char inpt4;
};
union {
- unsigned char pf0;
- unsigned char inpt5;
+ unsigned char pf0;
+ unsigned char inpt5;
};
unsigned char pf1;
unsigned char pf2;
;
; unsigned char getcpu (void);
;
- .include "zeropage.inc"
+ .include "zeropage.inc"
.export _getcpu
; ---------------------------------------------------------------------------
; jede jede@oric.org 2017-10-01
;
.export _cgetc
-
+
.import cursor
-
+
.include "telestrat.inc"
.proc _cgetc
- ; this routine could be quicker if we wrote in page 2 variables,
+ ; this routine could be quicker if we wrote in page 2 variables,
; but it's better to use telemon routine in that case, because telemon can manage 4 I/O
ldx cursor ; if cursor equal to 0, then switch off cursor
beq switchoff_cursor
-
+
ldx #$00 ; x is the first screen
BRK_TELEMON(XCSSCR) ; display cursor
jmp loop ; could be replaced by a bne/beq but 'jmp' is cleaner than a bne/beq which could expect some matters
-
-switchoff_cursor:
+
+switchoff_cursor:
; at this step X is equal to $00, X must be set, because it's the id of the screen (telestrat can handle 4 virtuals screen)
- BRK_TELEMON(XCOSCR) ; switch off cursor
-
-loop:
+ BRK_TELEMON(XCOSCR) ; switch off cursor
+
+loop:
BRK_TELEMON XRD0 ; waits until key is pressed
bcs loop
rts
-.endproc
+.endproc
; jede jede@oric.org 2017-01-22
.export _close
-
- .import addysp,popax
-
- .include "zeropage.inc"
+
+ .import addysp,popax
+
+ .include "zeropage.inc"
.include "telestrat.inc"
.include "errno.inc"
- .include "fcntl.inc"
-
+ .include "fcntl.inc"
+
; int open (const char* name, int flags, ...); /* May take a mode argument */
.proc _close
- BRK_TELEMON XCLOSE ; launch primitive ROM
+ BRK_TELEMON XCLOSE ; launch primitive ROM
rts
.endproc
;
; jede jede@oric.org 2017-02-25
-;
+;
.export _clrscr
-
+
.importzp sp
-
+
.include "telestrat.inc"
.proc _clrscr
; Switch to text mode
- BRK_TELEMON(XTEXT)
+ BRK_TELEMON(XTEXT)
lda #<SCREEN
ldy #>SCREEN
ldx #>(SCREEN+SCREEN_XSIZE*SCREEN_YSIZE)
lda #' '
BRK_TELEMON XFILLM
-
-
+
+
; reset prompt position
lda #<(SCREEN+40)
sta ADSCRL
lda #>(SCREEN+40)
sta ADSCRH
-
+
; reset display position
lda #$01
sta SCRY
lda #$00
- sta SCRX
+ sta SCRX
rts
-.endproc
+.endproc
; jede jede@oric.org 2017-02-25
;
.export _gotox
-
+
.import popa
-
+
.importzp sp
.include "telestrat.inc"
.proc _gotox
sta SCRX
rts
-.endproc
+.endproc
.proc _gotoy
sta SCRY
rts
-.endproc
+.endproc
ldx #0 ; Limit the length
L0: lda BUFEDT,x
- beq L3
- cmp #' '
- bne L1
- lda #0
- beq L3
+ beq L3
+ cmp #' '
+ bne L1
+ lda #0
+ beq L3
L1: sta name,x
inx
- cpx #FNAME_LEN
+ cpx #FNAME_LEN
bne L0
- lda #0
-L3:
- sta name,x
+ 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
+ beq next
found: cmp #'"' ; Is the argument quoted?
beq setterm ; Jump if so
txa ; Get low byte
clc
- adc #<BUFEDT
- bcc L4
- inc L5+1
+ adc #<BUFEDT
+ bcc L4
+ inc L5+1
L4:
sta argv,y ; argv[y]=&arg
-L5:
+L5:
lda #>BUFEDT
sta argv+1,y
iny
lda __argc ; Get low byte of argument count
cmp #MAXARGS ; Maximum number of arguments reached?
- bcc next ; Parse next one if not
-
-
+ bcc next ; Parse next one if not
+
+
done: lda #<argv
ldx #>argv
sta __argv
stx __argv + 1
rts
-
-
+
+
.segment "INIT"
term: .res 1
args: .res SCREEN_XSIZE * 2 - 1
param_found:
- .res 1
+ .res 1
; char* argv[MAXARGS+1]={name};
-argv:
- .addr name
+argv:
+ .addr name
.res MAXARGS * 2
.export _open
-
+
.import addysp,popax
-
+
.importzp sp,tmp2,tmp3,tmp1
-
-
+
+
.include "telestrat.inc"
.include "errno.inc"
- .include "fcntl.inc"
+ .include "fcntl.inc"
; int open (const char* name, int flags, ...); /* May take a mode argument */
.proc _open
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
+ 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
jsr popax ; Get flagss
sta tmp3 ; save flags
; Get the filename from stack and parse it. Bail out if is not ok
- jsr popax ; Get name
- ldy tmp3 ; Get flags again
- BRK_TELEMON XOPEN ; launch primitive ROM
+ jsr popax ; Get name
+ ldy tmp3 ; Get flags again
+ BRK_TELEMON XOPEN ; launch primitive ROM
rts
.endproc
.include "zeropage.inc"
.include "telestrat.inc"
-
+
;int read (int fd, void* buf, unsigned count);
.proc _read
stx PTR_READ_DEST+1
sta ptr2 ; in order to calculate nb of bytes read
stx ptr2+1 ;
-
+
; jsr popax ; fp pointer don't care in this version
- lda ptr1 ;
+ lda ptr1 ;
ldy ptr1+1 ;
BRK_TELEMON XFREAD ; calls telemon30 routine
; compute nb of bytes read
lda PTR_READ_DEST+1
sec
sbc ptr2+1
- tax
+ tax
lda PTR_READ_DEST
sec
sbc ptr2
; Here A and X contains number of bytes read
rts
.endproc
-
-
; jede jede@oric.org 2017-02-25
;
.export _wherex
-
+
.importzp sp
.include "telestrat.inc"
ldx #$00
lda SCRX
rts
-.endproc
+.endproc
;
; jede jede@oric.org 2017-02-25
-;
+;
.export _wherey
-
+
.include "telestrat.inc"
.proc _wherey
ldx #$00
lda SCRY
rts
-.endproc
+.endproc
jsr popax ; get fd and discard
; if fd=0001 then it stdout
- cpx #0
- beq next
- jmp L1
-next:
- cmp #1
- beq L1
-
+ cpx #0
+ beq next
+ jmp L1
+next:
+ cmp #1
+ beq L1
+
; here it's a file opened
- lda ptr1
- sta PTR_READ_DEST
- lda ptr1+1
- sta PTR_READ_DEST+1
- lda ptr3
- ldy ptr3+1
+ lda ptr1
+ sta PTR_READ_DEST
+ lda ptr1+1
+ sta PTR_READ_DEST+1
+ lda ptr3
+ ldy ptr3+1
BRK_TELEMON XFWRITE
; compute nb of bytes written
-
+
lda PTR_READ_DEST+1
sec
sbc ptr1+1
- tax
+ tax
lda PTR_READ_DEST
sec
sbc ptr1
rts
-
-
+
+
L1: inc ptr2
bne L2
inc ptr2+1
BRK_TELEMON XWR0 ; macro send char to screen (channel 0 in telemon terms)
lda #$0D ; return to the beggining of the line
BRK_TELEMON XWR0 ; macro
-
+
ldx #$0D
-L3:
+L3:
BRK_TELEMON XWR0 ; macro
inc ptr1
rts
.endproc
-
-
bss_v = 0x88; // Testing BSS variable
for/*ever*/(;;) {
- // Vertical Sync signal
- TIA.vsync = 0x02;
- TIA.wsync = 0x00;
- TIA.wsync = 0x00;
- TIA.wsync = 0x00;
- TIA.vsync = 0x00;
-
- // Vertical Blank timer setting
- RIOT.tim64t = VBLANK_TIM64;
-
- // Doing frame computation during blank
- TIA.colubk = color++; // Update color
-
- // Wait for end of Vertical Blank
- while (RIOT.timint == 0) {}
- TIA.wsync = 0x00;
- TIA.vblank = 0x00; // Turn on beam
-
- // Display frame
- RIOT.t1024t = KERNAL_T1024;
- while (RIOT.timint == 0) {}
- TIA.wsync = 0x00;
- TIA.vblank = 0x02; // Turn off beam
-
- // Overscan
- RIOT.tim64t = OVERSCAN_TIM64;
- while (RIOT.timint == 0) {}
+ // Vertical Sync signal
+ TIA.vsync = 0x02;
+ TIA.wsync = 0x00;
+ TIA.wsync = 0x00;
+ TIA.wsync = 0x00;
+ TIA.vsync = 0x00;
+
+ // Vertical Blank timer setting
+ RIOT.tim64t = VBLANK_TIM64;
+
+ // Doing frame computation during blank
+ TIA.colubk = color++; // Update color
+
+ // Wait for end of Vertical Blank
+ while (RIOT.timint == 0) {}
+ TIA.wsync = 0x00;
+ TIA.vblank = 0x00; // Turn on beam
+
+ // Display frame
+ RIOT.t1024t = KERNAL_T1024;
+ while (RIOT.timint == 0) {}
+ TIA.wsync = 0x00;
+ TIA.vblank = 0x02; // Turn off beam
+
+ // Overscan
+ RIOT.tim64t = OVERSCAN_TIM64;
+ while (RIOT.timint == 0) {}
}
}
AddCodeLine ("lda %s,y", GetLabelName (CF_STATIC, Label, 0));
AddCodeLine ("sta (sp),y");
AddCodeLine ("iny");
- AddCmpCodeIfSizeNot256 ("cpy #$%02X", Size);
+ AddCmpCodeIfSizeNot256 ("cpy #$%02X", Size);
AddCodeLine ("bne %s", LocalLabelName (CodeLabel));
}
}
AddCodeLine ("lda %s,y", GetLabelName (CF_STATIC, InitLabel, 0));
AddCodeLine ("sta %s,y", GetLabelName (CF_STATIC, VarLabel, 0));
AddCodeLine ("iny");
- AddCmpCodeIfSizeNot256 ("cpy #$%02X", Size);
+ AddCmpCodeIfSizeNot256 ("cpy #$%02X", Size);
AddCodeLine ("bne %s", LocalLabelName (CodeLabel));
} else {
/* Use the easy way here: memcpy() */
FlagPragma (&B, &StaticLocals);
break;
- case PRAGMA_WRAPPED_CALL:
- WrappedCallPragma(&B);
- break;
+ case PRAGMA_WRAPPED_CALL:
+ WrappedCallPragma(&B);
+ break;
case PRAGMA_WARN:
WarnPragma (&B);
typedef struct IntPtrStack IntPtrStack;
struct IntPtrInner {
- long val;
- void *ptr;
+ long val;
+ void *ptr;
};
struct IntPtrStack {
unsigned Count;
.bss
temp_x: .byte 0
temp_y: .byte 0
-temp_a: .byte 0
+temp_a: .byte 0
irq_count: .byte 0
nmi_count: .byte 0
psx: .byte 0
ldy temp_y
rts
.endproc
-