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 -------------------------------
|