Posted By
   Harry Potter on 2022-12-07 10:56:16
  |   Re: AdvSkel65/128k Plus4/cc65: Hannes memory not loaded properly
  I really want this to work.  I'm attaching the config file:
 ---------------------- FEATURES {     STARTADDRESS: default = $1001; } SYMBOLS {     __LOADADDR__:  type = import;     __EXEHDR__:    type = import;     __STACKSIZE__: type = weak, value = $0800; # 2k stack     __HIMEM__:     type = weak, value = $FC00; } MEMORY {     ZP:       file = "", define = yes, start = $0002, size = $0036;     LOADADDR: file = %O,               start = %S - 2,          size = $0002;     HEADER:   file = %O, define = yes, start = %S,              size = $000D;     MAIN:     file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __MAIN_START__ - __STACKSIZE__;     ZP2:      file = "adv-low4.prg",      start = $36, size = $90-$36;# 88 BYTES
      BASBUF:   file = "adv-low2.prg", 			start = $01FE, size = $5A;		# 90 bytes     TAPE:     file = "adv-low1.prg", 			start = $330, size = $0494-$0330;	#356 bytes     BSTACK:   file = "", 			start = $06EC, size = $07AF-$06EC;	#180 bytes     GRAPHIC1: file = "adv-low3.prg", 			start = $02AB, size = $0300-$02AB;	# 85 bytes
      BANK1:    file = "bank1.seq", define = yes, start = $1000, size = $EC00; } SEGMENTS {     ZEROPAGE: load = ZP,       type = zp;     LOADADDR: load = LOADADDR, type = ro;     EXEHDR:   load = HEADER,   type = ro;     STARTUP:  load = MAIN,     type = ro;     LOWCODE:  load = MAIN,     type = ro,  optional = yes;     CODE:     load = MAIN,     type = ro;     MEMBANK:  load = MAIN,     run = BSTACK, 				optional = yes, define   = yes;     ONCE:     load = MAIN,     type = ro,  optional = yes;     RODATA:   load = MAIN,     type = ro;     DATA:     load = MAIN,     type = rw;     INIT:     load = MAIN,     type = bss;     BSS:      load = MAIN,     type = bss, define   = yes;
      #BASBSTART:load = BASBUF,   type = ro,  optional = yes;     BASBCODE: load = MAIN,	type = ro,  optional = yes;     #BASBCONST:load = BASBUF,   type = ro,  optional = yes;     #BASBDATA: load = BASBUF,   type = rw,  optional = yes;     GRSTART:  load = GRAPHIC1, type = ro,  optional = yes;     GRCODE:   load = GRAPHIC1, type = ro,  optional = yes;     GRCONST:  load = GRAPHIC1, type = ro,  optional = yes;     GRDATA:   load = GRAPHIC1, type = rw,  optional = yes;     BASISTART:load = BASBUF,    type = ro,  optional = yes;     BASICODE: load = BASBUF,    type = ro,  optional = yes;     BASICONST:load = BASBUF,    type = ro,  optional = yes;     BASIDATA: load = BASBUF,    type = rw,  optional = yes;     TAPESTART:load = TAPE,     type = ro,  optional = yes;     TAPECODE: load = TAPE,     type = ro,  optional = yes;     TAPECONST:load = TAPE,     type = ro,  optional = yes;     TAPEDATA: load = TAPE,     type = rw,  optional = yes;     TAPEBSS:  load = TAPE,     type = bss, optional = yes;     ZP2START:	load = ZP2,      type = ro,                optional = yes;     ZP2CODE:	load = ZP2,      type = ro,                optional = yes;
      B1CODDE:  load = BANK1,    type = ro,  optional = yes;     B1RODATA: load = BANK1,    type = ro,  optional = yes;     B1DATA:   load = BANK1,    type = rw,  optional = yes;     B1BSS:    load = BANK1,    type = bss, optional = yes; } FEATURES {     CONDES: type    = constructor,             label   = __CONSTRUCTOR_TABLE__,             count   = __CONSTRUCTOR_COUNT__,             segment = ONCE;     CONDES: type    = destructor,             label   = __DESTRUCTOR_TABLE__,             count   = __DESTRUCTOR_COUNT__,             segment = RODATA;      CONDES: type    = interruptor,             label   = __INTERRUPTOR_TABLE__,             count   = __INTERRUPTOR_COUNT__,             segment = RODATA,             import  = __CALLIRQ__; } --------------- and the crt0.s file: ----------------------------------- ; ; Startup code for cc65 (C128 version) ; ; This must be the *first* file on the linker command line ;
      	.export	     	_exit         .export         __STARTUP__ : absolute = 1      ; Mark as startup     	.import	     	callirq, initlib, donelib     	.import	     	zerobss     	.import		push0, pushax, callmain, _puts, _cgetc, _printf 	.import		_main         .import         RESTOR, BSOUT, CLRCH 	;.import	       	__INTERRUPTOR_COUNT__     	.import	 	__RAM_START__, __RAM_SIZE__ 	.import		__BANK1C_LOAD__, __BANK1C_RUN__, __BANK1C_SIZE__
  	.importzp	ST         .include        "zeropage.inc"     	.include 	"c128.inc"
 
  ; ------------------------------------------------------------------------ ; Constants
  ;IRQInd		= $2FD	; JMP $0000 - used as indirect IRQ vector
  ; ------------------------------------------------------------------------ ; Place the startup code in a special segment to cope with the quirks of ; c128 banking.
  .segment       	"STARTUP"
  ; BASIC header with a SYS call
  	.org	$1BFF         .word   Head            ; Load address Head:   .word   @Next         .word   .version        ; Line number ;<---Changed by Harry Potter---> 	.byte	$FE,$02		; BANK 15: 	.byte	'1','5',':'		         .byte   $9E,"7186"      ; SYS 7186 ;<---End changed by Harry Potter--->         .byte   $00             ; End of BASIC line @Next:  .word   0               ; BASIC end marker 	.reloc
  ; ------------------------------------------------------------------------ ; Actual code
  ; Close open files ;<---Changed by Harry Potter---> 	;lda	#$00 	;sta	$FF00  	jsr	CLRCH
  ; Switch to the second charset
   	lda	#14  	jsr	BSOUT 	;lda	#%00111111 	;sta	$FF00 	lda	#$00 	sta	$D503
  	sta	$FF01 ;<---End changed by Harry Potter---> ; Before doing anything else, we have to setup our banking configuration. ; Otherwise just the lowest 16K are actually RAM. Writing through the ROM ; to the underlying RAM works, but it is bad style. 	;lda	MMU_CR	 	; Get current memory configuration...        	;pha		 	; ...and save it for later ;<---Changed by Harry Potter--->        ;lda    	#MMU_CFG_CC65	; Bank0 with kernal ROM 	;lda    	#$00     	;sta	MMU_CR ;<---End changed by Harry Potter--->
  ; Save the zero page locations we need
         	ldx	#zpspace-1 L1:	;lda    	sp,x 	lda    	$0C,x    	sta	zpsave,x  	dex        	bpl	L1
  ; Clear the BSS data
  	jsr	zerobss
  ; Save system stuff and setup the stack
  	;pla		 	; Get MMU setting 	;sta	mmusave        	tsx        	stx    	spsave	 	; Save the system stack pointer
  	lda    	#<(__RAM_START__ + __RAM_SIZE__) 	sta	sp 	lda	#>(__RAM_START__ + __RAM_SIZE__)        	sta	sp+1   		; Set argument stack ptr
  ;Copy Bank 1 access routines to the memory visible to both Bank 0 and ;Bank 1. 	ldx	#<__BANK1C_SIZE__ @CopyB1Code: 	dex 	lda	__BANK1C_LOAD__,x 	sta	__BANK1C_RUN__,x 	cpx	#0 	bne	@CopyB1Code ; Call module constructors
  ;lda	#$3F ;sta	$FF00         lda     #0         sta     FNAM_BANK sta	$FF01 	jsr	initlib ;pla ;sta	$FF00
  ; Set the bank for the file name to our execution bank. We must do this, ; *after* calling constructors, because some of them may depend on the ; original value of this register.
 
  ; If we have IRQ functions, chain our stub into the IRQ vector
  ;        lda     #<__INTERRUPTOR_COUNT__ ;      	beq	NoIRQ1 ;      	lda	IRQVec ;       	ldx	IRQVec+1 ;      	sta	IRQInd+1 ;      	stx	IRQInd+2 ;      	lda	#;      	ldx	#>IRQStub ;      	sei ;      	sta	IRQVec ;      	stx	IRQVec+1 ;      	cli ; Push arguments and call main()
  NoIRQ1:	 sta	$FF01 	jsr	callmain
  ; Back from main (this is also the _exit entry). Reset the IRQ vector if we ; chained it.
  _exit:	pha				; Save the return code on stack 	;lda	#	;ldx	#>M 	;jsr	_puts 	;jsr	_cgetc			;Wait for keypress. ;	lda     #<__INTERRUPTOR_COUNT__ ;	beq	NoIRQ2 ;	lda	IRQInd+1 ;	ldx	IRQInd+2 ;	sei ;	sta	IRQVec ;	stx	IRQVec+1 ;	cli ; Run module destructors
  NoIRQ2: jsr    	donelib
  ; Copy back the zero page stuff
   	ldx	#zpspace-1 L2:	lda	zpsave,x      	sta	sp,x      	dex      	bpl	L2
  ; Place the program return code into ST
  	pla 	sta	ST
  ; Reset the stack and the memory configuration
  	ldx    	spsave  	txs ;<---Changed by Harry Potter--->        	;ldx   	mmusave 	;stx	MMU_CR ;<---End changed by Harry Potter--->
  ; Done, restore kernal vectors in an attempt to cleanup 	;lda	#$00 	sta	$FF03 	;jsr	RESTOR      	;jmp	($FFFC)		;Call C128 kernal reset routine 	jmp	RESTOR
  ; ------------------------------------------------------------------------ ; The C128 has ROM parallel to the RAM starting from $4000. The startup code ; above will change this setting so that we have RAM from $0000-$BFFF. This ; works quite well with the exception of interrupts: The interrupt handler ; is in ROM, and the ROM switches back to the ROM configuration, which means ; that parts of our program may not be accessible. To solve this, we place ; the following code into a special segment called "LOWCODE" which will be ; placed just above the startup code, so it goes into a RAM area that is ; not banked.
  .segment        "LOWCODE"
  ;IRQStub: ;	cld    	       		   	; Just to be sure ;	lda     MMU_CR 		   	; Get old register value ;	pha    	       		   	; And save on stack ;	lda     #MMU_CFG_CC65		; Bank 0 with kernal ROM ;	sta    	MMU_CR ;       	jsr    	callirq                 ; Call the functions ;	pla    	       			; Get old register value ;	sta    	MMU_CR ;       	jmp    	IRQInd			; Jump to the saved IRQ vector ;
  ; ------------------------------------------------------------------------ ; Data
  .rodata ;M:	.byte	"Your program has finished.  Press any",13 ;	.byte	"key to continue...",13,0
  .data zpsave:	.res	zpspace
  .bss spsave:	.res	1 mmusave:.res	1
  .segment "APPSTART" .word	$1300
  .segment "B1START" .word	$0400 ------------------------------- 
  |