DamnedAngel / MSX-Templates-for-VisualStudio

MSX Application Templates for MS Visual Studio.
GNU Affero General Public License v3.0
38 stars 7 forks source link

CRT0: gsinit falling for on 2nd page of the program before the 2nd page is configured. #35

Closed DamnedAngel closed 1 year ago

DamnedAngel commented 1 year ago

[22:38, 23/08/2022] Danilo MSX: a CRT0 tá toda quebrada... não está inicializando as variáveis globais nem quando o programa funciona [22:39, 23/08/2022] Danilo MSX: seguinte [22:39, 23/08/2022] Danilo MSX: faz um teste [22:39, 23/08/2022] Danilo MSX: Vai na sua CRT0 [22:39, 23/08/2022] Danilo MSX: e move o step 4 para antes do step 2 [22:47, 23/08/2022] Danilo MSX: acontece que quando o seu código fica maior que ~16k, a gsinit cai na página 2 ($8000-$bfff) [22:48, 23/08/2022] Danilo MSX: Só que a mapeamento de slot padrão tem a página 2 no slot 2 que é RAM [22:48, 23/08/2022] Rodrigo: é, o código em ROM passou dos 16K há alguns dias. E logo depois criei algumas outras variáveis globais, daí ferrou tudo [22:49, 23/08/2022] Danilo MSX: ai, nese passo 2, eu tento chamar a gsinit, cujo endereço DEVERIA estar apontando para a ROM, mas no seu caso está apontando para a RAM [22:49, 23/08/2022] Danilo MSX: e está apontando para a RAM porque ainda não executou isso [22:50, 23/08/2022] Danilo MSX: ou seja, esse passo 4 precisa ser executado antes do 2.

DamnedAngel commented 1 year ago

Correction:

[2:54 PM, 2/5/2023] +55 11 99156-0918: No fim, o msxromcrt0.s ficou funcionando assim: [2:54 PM, 2/5/2023] +55 11 99156-0918: ;---------------------------------------------------------- ; Step 1: Initialize heap pointer init:: ld hl, #_HEAP_start ld (#_heap_top), hl

;---------------------------------------------------------- ; Step 4: Enables page 2 on the same slot/subslot as page 1 ; (useful for 32kb ROMs on pages 1 and 2) .if SET_PAGE_2 di call #BIOS_RSLREG rrca rrca and #0x03
ld c, a ld hl, #BIOS_EXPTBL add a, l ld l, a ld a, (hl) and #0x80 or c ld c, a inc l inc l inc l inc l ld a, (hl) and #0x0c or c ld h, #0x80 call #BIOS_ENASLT ei .endif

;---------------------------------------------------------- ; Step 2: Initialize globals call gsinit

;---------------------------------------------------------- ; Step 3: Sets stack to HIMEM .ifne RETURN_TO_BASIC .if STACK_HIMEM di ld sp, (#BIOS_HIMEM) ;Stack at the top of memory. ei .endif .endif

;---------------------------------------------------------- ; Step 5: Run application .if RETURN_TO_BASIC jp _main .else call _main RST 0 ;CHKRAM .endif

DamnedAngel commented 1 year ago

Fixed gsinit falling for on 2nd page of the program before the 2nd page is configured. Fixed seeting stack to HIMEM. Routine was protected by wrong .if clauses.

Order now is: Step 1: Initialize heap pointer Step 2: Enables page 2 on the same slot/subslot as page 1 Step 3: Sets stack to HIMEM Step 4: Initialize globals (gsinit) Step 5: Run application