1
0
mirror of https://github.com/cc65/cc65.git synced 2024-09-28 10:55:43 +00:00
This commit is contained in:
Christian Groessler 2013-09-27 22:01:54 +02:00
parent c88e0818b4
commit 39a98f250b
10 changed files with 809 additions and 809 deletions

View File

@ -33,10 +33,10 @@ MEMORY {
# "main program" load chunk # "main program" load chunk
MAINHDR: file = %O, start = $0000, size = $0004; MAINHDR: file = %O, start = $0000, size = $0004;
RAM: file = %O, define = yes, start = %S + RAM: file = %O, define = yes, start = %S +
__LOWDATA_SIZE__, size = $D000 - __LOWDATA_SIZE__, size = $D000 -
__STACKSIZE__ - __STACKSIZE__ -
%S - %S -
__LOWDATA_SIZE__; __LOWDATA_SIZE__;
# defines entry point into program # defines entry point into program
TRAILER: file = %O, start = $0000, size = $0006; TRAILER: file = %O, start = $0000, size = $0006;

View File

@ -28,10 +28,10 @@ MEMORY {
# "main program" load chunk # "main program" load chunk
MAINHDR: file = %O, start = $0000, size = $0004; MAINHDR: file = %O, start = $0000, size = $0004;
RAM: file = %O, define = yes, start = %S + RAM: file = %O, define = yes, start = %S +
__LOWDATA_SIZE__, size = $D000 - __LOWDATA_SIZE__, size = $D000 -
__STACKSIZE__ - __STACKSIZE__ -
%S - %S -
__LOWDATA_SIZE__; __LOWDATA_SIZE__;
# defines entry point into program # defines entry point into program
TRAILER: file = %O, start = $0000, size = $0006; TRAILER: file = %O, start = $0000, size = $0006;

View File

@ -41,7 +41,7 @@
.export _get_ostype .export _get_ostype
.include "atari.inc" .include "atari.inc"
.include "romswitch.inc" .include "romswitch.inc"
.ifdef __ATARIXL__ .ifdef __ATARIXL__
@ -50,8 +50,8 @@
.macro disable_rom_save_a .macro disable_rom_save_a
pha pha
disable_rom disable_rom
pla pla
.endmacro .endmacro
.else ; above atarixl, below atari .else ; above atarixl, below atari

View File

@ -6,8 +6,8 @@
; Christian Groessler, chris@groessler.org, 2013 ; Christian Groessler, chris@groessler.org, 2013
; ;
.import SAVMSC_save .import SAVMSC_save
.import MEMTOP_save .import MEMTOP_save
.import APPMHI_save .import APPMHI_save
.import RAMTOP_save .import RAMTOP_save
.import PORTB_save .import PORTB_save

View File

@ -8,18 +8,18 @@
.ifdef __ATARIXL__ .ifdef __ATARIXL__
.export SAVMSC_save .export SAVMSC_save
.export MEMTOP_save .export MEMTOP_save
.export APPMHI_save .export APPMHI_save
.export RAMTOP_save .export RAMTOP_save
.export PORTB_save .export PORTB_save
.segment "LOWDATA" .segment "LOWDATA"
SAVMSC_save: .res 2 SAVMSC_save: .res 2
MEMTOP_save: .res 2 MEMTOP_save: .res 2
APPMHI_save: .res 2 APPMHI_save: .res 2
RAMTOP_save: .res 1 RAMTOP_save: .res 1
PORTB_save: .res 1 PORTB_save: .res 1
.endif .endif

View File

@ -1,6 +1,6 @@
; Name of the "screen" device ; Name of the "screen" device
.export scrdev .export scrdev
.rodata .rodata

File diff suppressed because it is too large Load Diff

View File

@ -90,7 +90,7 @@ sramprep:
lda lodadr+1 lda lodadr+1
sta RAMTOP sta RAMTOP
; set APPMHI to MEMLO (+ 1 for sanity) ; set APPMHI to MEMLO (+ 1 for sanity)
lda MEMLO lda MEMLO
clc clc
adc #1 adc #1
@ -104,7 +104,7 @@ sramprep:
jsr findfreeiocb jsr findfreeiocb
.ifdef DEBUG ; only check in debug version, this shouldn't really happen(tm) .ifdef DEBUG ; only check in debug version, this shouldn't really happen(tm)
beq iocbok beq iocbok
print_string "Internal error, no free IOCB!" print_string "Internal error, no free IOCB!"
jsr delay jsr delay

View File

@ -11,11 +11,11 @@
; Christian Groessler, chris@groessler.org, 2013 ; Christian Groessler, chris@groessler.org, 2013
; ;
DEBUG = 1 DEBUG = 1
.ifdef __ATARIXL__ .ifdef __ATARIXL__
.export syschk .export syschk
.import __SYSCHK_LOAD__ .import __SYSCHK_LOAD__
.import __STARTADDRESS__ ; needed by xlmemchk.inc .import __STARTADDRESS__ ; needed by xlmemchk.inc
@ -24,36 +24,36 @@ DEBUG = 1
.macro print_string text .macro print_string text
.local start, cont .local start, cont
jmp cont jmp cont
start: .byte text, ATEOL start: .byte text, ATEOL
cont: ldx #0 ; channel 0 cont: ldx #0 ; channel 0
lda #<start lda #<start
sta ICBAL,x ; address sta ICBAL,x ; address
lda #>start lda #>start
sta ICBAH,x sta ICBAH,x
lda #<(cont - start) lda #<(cont - start)
sta ICBLL,x ; length sta ICBLL,x ; length
lda #>(cont - start) lda #>(cont - start)
sta ICBLH,x sta ICBLH,x
lda #PUTCHR lda #PUTCHR
sta ICCOM,x sta ICCOM,x
jsr CIOV_org jsr CIOV_org
.endmacro .endmacro
.macro print_string2 addr, len .macro print_string2 addr, len
ldx #0 ; channel 0 ldx #0 ; channel 0
lda #<addr lda #<addr
sta ICBAL,x ; address sta ICBAL,x ; address
lda #>addr lda #>addr
sta ICBAH,x sta ICBAH,x
lda #<len lda #<len
sta ICBLL,x ; length sta ICBLL,x ; length
lda #>len lda #>len
sta ICBLH,x sta ICBLH,x
lda #PUTCHR lda #PUTCHR
sta ICCOM,x sta ICCOM,x
jsr CIOV_org jsr CIOV_org
.endmacro .endmacro
@ -72,74 +72,74 @@ cont: ldx #0 ; channel 0
.segment "SYSCHK" .segment "SYSCHK"
; no XL machine ; no XL machine
no_xl: print_string "This program needs an XL machine." no_xl: print_string "This program needs an XL machine."
jmp fail jmp fail
; entry point ; entry point
syschk: syschk:
lda $fcd8 ; from ostype.s lda $fcd8 ; from ostype.s
cmp #$a2 cmp #$a2
beq no_xl beq no_xl
; we have an XL machine, now check memory ; we have an XL machine, now check memory
lda RAMSIZ lda RAMSIZ
cmp #$80 cmp #$80
bcs sys_ok bcs sys_ok
; not enough memory ; not enough memory
print_string "Not enough memory." print_string "Not enough memory."
fail: jsr delay fail: jsr delay
jmp (DOSVEC) jmp (DOSVEC)
sys_ok: sys_ok:
.include "xlmemchk.inc" ; calculate lowest address we will use when we move the screen buffer down .include "xlmemchk.inc" ; calculate lowest address we will use when we move the screen buffer down
sec sec
lda MEMLO lda MEMLO
sbc lowadr sbc lowadr
lda MEMLO+1 lda MEMLO+1
sbc lowadr+1 sbc lowadr+1
bcc memlo_ok bcc memlo_ok
; load address was too low ; load address was too low
print_string2 lmemerr_txt, lmemerr_txt_len print_string2 lmemerr_txt, lmemerr_txt_len
jsr delay ; long text takes longer to read, give user additional time jsr delay ; long text takes longer to read, give user additional time
jmp fail jmp fail
; all is well(tm), launch the application ; all is well(tm), launch the application
memlo_ok: memlo_ok:
.ifdef DEBUG .ifdef DEBUG
print_string "Stage #1 OK" print_string "Stage #1 OK"
jsr delay jsr delay
.endif .endif
rts rts
lmemerr_txt: lmemerr_txt:
.byte "Not enough memory to move screen", ATEOL .byte "Not enough memory to move screen", ATEOL
.byte "memory to low memory. Consider using", ATEOL .byte "memory to low memory. Consider using", ATEOL
.byte "a higher load address.", ATEOL .byte "a higher load address.", ATEOL
lmemerr_txt_len = * - lmemerr_txt lmemerr_txt_len = * - lmemerr_txt
; short delay ; short delay
.proc delay .proc delay
lda #10 lda #10
l: jsr delay1 l: jsr delay1
clc clc
sbc #0 sbc #0
bne l bne l
rts rts
delay1: ldx #0 delay1: ldx #0
ldy #0 ldy #0
loop: dey loop: dey
bne loop bne loop
dex dex
bne loop bne loop
rts rts
.endproc .endproc
@ -154,4 +154,4 @@ end:
.word INITAD+1 .word INITAD+1
.word syschk .word syschk
.endif ; .ifdef __ATARIXL__ .endif ; .ifdef __ATARIXL__

View File

@ -9,12 +9,12 @@
; by the screen memory afterwards. ; by the screen memory afterwards.
; ;
; inputs: ; inputs:
; __STARTADDRESS__ - load address of the program ; __STARTADDRESS__ - load address of the program
; outputs: ; outputs:
; lodadr - (high byte only) value to ; lodadr - (high byte only) value to
; write into RAMTOP ; write into RAMTOP
; lowadr - lowest address occupied by ; lowadr - lowest address occupied by
; screen data ; screen data
; ;
@ -35,85 +35,85 @@
; available memory, boundary crossing cannot happen. ; available memory, boundary crossing cannot happen.
SCRBUFSZ = (40 * 24) ; size of mode 0 screen buffer SCRBUFSZ = (40 * 24) ; size of mode 0 screen buffer
DLSZ = 32 ; size of mode 0 display list DLSZ = 32 ; size of mode 0 display list
scrmemtst: scrmemtst:
; subtract screen memory size from our load address ; subtract screen memory size from our load address
lda lodadr lda lodadr
sec sec
sbc #<SCRBUFSZ sbc #<SCRBUFSZ
sta tstadr sta tstadr
lda lodadr+1 lda lodadr+1
sbc #>SCRBUFSZ sbc #>SCRBUFSZ
sta tstadr+1 sta tstadr+1
; check if a 4K boundary is crossed ; check if a 4K boundary is crossed
lda lodadr+1 lda lodadr+1
and #$f0 and #$f0
sta tmp sta tmp
lda tstadr+1 lda tstadr+1
and #$f0 and #$f0
cmp tmp cmp tmp
beq scrmemok beq scrmemok
; if lodadr is at an exact 4K boundary, it's still ok ; if lodadr is at an exact 4K boundary, it's still ok
lda lodadr+1 lda lodadr+1
and #$0f and #$0f
beq scrmemok beq scrmemok
; 4K boundary will be crossed, use this 4K boundary address as lodadr ; 4K boundary will be crossed, use this 4K boundary address as lodadr
al4k: lda lodadr+1 al4k: lda lodadr+1
and #$f0 and #$f0
sta lodadr+1 sta lodadr+1
bne scrmemtst bne scrmemtst
; not reached ; not reached
.ifdef DEBUG .ifdef DEBUG
.byte "XLMEMCHK:>" .byte "XLMEMCHK:>"
.endif .endif
lodadr: .word __STARTADDRESS__ & $FF00 ; our program's load address, rounded down to page boundary lodadr: .word __STARTADDRESS__ & $FF00 ; our program's load address, rounded down to page boundary
tstadr: .res 2 tstadr: .res 2
lowadr: .res 2 lowadr: .res 2
tmp: .res 1 tmp: .res 1
; subtract display list size from calculated screen address ; subtract display list size from calculated screen address
scrmemok: scrmemok:
lda tstadr lda tstadr
sec sec
sbc #<DLSZ sbc #<DLSZ
sta lowadr sta lowadr
lda tstadr+1 lda tstadr+1
sbc #>DLSZ sbc #>DLSZ
sta lowadr+1 sta lowadr+1
.if 0 ; this cannot happen .if 0 ; this cannot happen
; check if a 1K boundary is crossed ; check if a 1K boundary is crossed
lda tstadr+1 lda tstadr+1
and #$fc and #$fc
sta tmp sta tmp
lda lowadr+1 lda lowadr+1
and #$fc and #$fc
cmp tmp cmp tmp
bne al4k ; 1K boundary will be crossed, decrease lodadr bne al4k ; 1K boundary will be crossed, decrease lodadr
.endif .endif
; address of display list is ok ; address of display list is ok
; decrease lowadr by two ; decrease lowadr by two
lda lowadr lda lowadr
sec sec
sbc #2 sbc #2
sta lowadr sta lowadr
bcs dec_cont bcs dec_cont
dec lowadr+1 dec lowadr+1
dec_cont: dec_cont: