1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-04-14 10:37:36 +00:00

Merge commit 'f2bf3484ad84a75f644a47560f1d2a0dd42c1acd' into jesper_baseline_all_changes

(cherry picked from commit 74512e132625e2e4f8f0ae3a80beae043dcc642d)
This commit is contained in:
Sven Van de Velde 2023-04-11 09:00:46 +02:00
parent f2bf3484ad
commit 9cf5f4cd05

View File

@ -13,7 +13,7 @@
#pragma link("cx16-banking.ld")
#pragma var_model(mem)
// #include <cx16.h>
#include <cx16.h>
#include <conio.h>
#include <printf.h>
@ -24,33 +24,31 @@
// Functional code
__address(0x00) char RAM_Bank;
#pragma code_seg(Bank1) // The sequent functions will be addressed specified by segment bank1 in the linker.
#pragma bank(cx16_ram, 1) // The sequent functions will be banked using call method ram in bank number 1.
char add_a(char a) {
printf("add_a(%02x), ", RAM_Bank);
printf("add_a(%02x), ", bank_get_bram());
return a+1;
}
char add_c(char a) {
printf("add_c(%02x), ", RAM_Bank);
printf("add_c(%02x), ", bank_get_bram());
return add_a(a)+1; // Non banked call in ram bank 1.
}
char add_d(char a) {
printf("add_d(%02x), ",RAM_Bank);
printf("add_d(%02x), ",bank_get_bram());
return mul_a(a)+1; // Banked call fram ram bank 1 to ram bank 2.
}
char add_e(char a) {
printf("add_e(%02x), ",RAM_Bank);
printf("add_e(%02x), ",bank_get_bram());
return mul_b(a)+1; // Banked call fram ram bank 1 to ram bank 2.
}
char add_f(char a) {
printf("add_f(%02x), ",RAM_Bank);
printf("add_f(%02x), ",bank_get_bram());
return add_m(a)+1; // Non banked call fram ram bank 1 to main memory.
}
@ -59,27 +57,27 @@ char add_f(char a) {
#pragma bank(cx16_ram, 2) // The sequent functions will be banked using call method ram in bank number 2.
char mul_a(char m) {
printf("mul_a(%02x), ",RAM_Bank);
printf("mul_a(%02x), ",bank_get_bram());
return m * 2;
}
char mul_c(char m) {
printf("mul_c(%02x), ",RAM_Bank);
printf("mul_c(%02x), ",bank_get_bram());
return add_a(m)*2; // Banked call fram ram bank 2 to ram bank 1.
}
char mul_d(char m) {
printf("mul_d(%02x), ",RAM_Bank);
printf("mul_d(%02x), ",bank_get_bram());
return mul_a(m)*2; // Non banked call in ram bank 2.
}
char mul_e(char a) {
printf("mul_e(%02x), ",RAM_Bank);
printf("mul_e(%02x), ",bank_get_bram());
return mul_b(a)*2; // Non Banked call in ram bank 2.
}
char mul_f(char m) {
printf("mul_f(%02x), ",RAM_Bank);
printf("mul_f(%02x), ",bank_get_bram());
return add_m(m)*2; // Non banked call fram ram bank 2 to main memory.
}
@ -89,14 +87,14 @@ char mul_f(char m) {
#pragma code_seg(Bank1) // The sequent functions will be addressed specified by segment bank1 in the linker.
// The __bank directive declares this function to be banked using call method ram in bank number 1 of banked ram.
char __bank(cx16_ram, 1) add_b(char a) {
printf("add_b(%02x), ",RAM_Bank);
printf("add_b(%02x), ",bank_get_bram());
return a+1;
}
#pragma code_seg(Bank2) // The sequent functions will be addressed specified by segment bank1 in the linker.
// The __bank directive declares this function to be banked using call method ram in bank number 2 of banked ram.
char __bank(cx16_ram, 2) mul_b(char m) {
printf("mul_b(%02x), ",RAM_Bank);
printf("mul_b(%02x), ",bank_get_bram());
return m*2;
}
@ -104,13 +102,13 @@ char __bank(cx16_ram, 2) mul_b(char m) {
// Allocated in main memory.
char add_m(char a) {
printf("add_m(%02x), ",RAM_Bank);
printf("add_m(%02x), ",bank_get_bram());
return add_e(a)+1; // Banked call to ram in bank 1 fram main memory.
}
// Allocated in main memory.
char mul_m(char m) {
printf("mul_m(%02x), ",RAM_Bank);
printf("mul_m(%02x), ",bank_get_bram());
return mul_e(m)*2; // Banked call to ram in bank 2 fram main memory.
}
@ -118,46 +116,21 @@ char mul_m(char m) {
// Practically this means that the main() function is placed in main memory ...
void load_bank(char bank, char *file) {
RAM_Bank = bank;
//cbm_k_setnam(file);
char file_len = strlen(file);
asm {
lda file_len
ldx <file
ldy >file
jsr $FFBD
}
//cbm_k_setlfs(1,8,2);
asm {
lda #1
ldx #8
ldy #2
jsr $FFBA
}
//cbm_k_load((char*)0xA000, 0);
asm {
lda #0
ldx #<$A000
ldy #>$A000
jsr $FFD5
}
//cbm_k_close(1);
asm {
lda #1
jsr $FFC3
}
bank_set_bram(bank);
cbm_k_setnam(file);
cbm_k_setlfs(1,8,2);
cbm_k_load((char*)0xA000, 0);
cbm_k_close(1);
}
void main(void) {
clrscr();
load_bank(1, "BANK1.BIN");
load_bank(2, "BANK2.BIN");
RAM_Bank = 0;
bank_set_bram(0);
asm{.byte $db}
printf("result = %u\n", add_a(1)); // Banked call to ram in bank 1 fram main memory.