Keby to vždy išlo takto hladko :-) Odteraz sa budem snažiť testovať a ladiť na NCB85. ZetaSBC ale ostáva na stole, budem sa snažiť overovať programy na obidvoch CP/M strojoch.
/*
* File: main.c, march 2013
* file test on CP/M
*/
#include <stdio.h>
FILE *input;
/**
* main routine
* @return
*/
main(int argc, int argv[]) {
char k;
print("File test\r\n");
if (argc == 2) {
print("file:");
print(argv[1]);
print("\r\n");
if ((input = fopen(argv[1], "r")) == NULL) {
print("Open failure\n");
exit(1);
}
while ((k = fgetc (input)) != EOF) {
putchar(k);
}
fclose(input);
} else {
print("usage: fltst file.ext");
}
}
print(char *str) {
while (*str) {
putchar(*str++);
}
}
lxi h,0
dad sp
shld stksav ; save the stack pointer
lhld 6 ; pick up core top
lxi d,-10 ; decrease by 10 for safety
dad d
sphl ; set stack pointer
call stdioinit ; initialize stdio
lxi h,0x0080
push h
call Xarglist
lhld Xargc
push h
lxi h,Xargv
push h
call main ; call main program
jmp 0
stksav: .ds 2
crtsoend:
.end
Building project
scc8080 -t -a main.c
as8085 -l -o -s -p -g main.s
scc8080 -t -a bdos.c
as8085 -l -o -s -p -g bdos.s
scc8080 -t -a chio8080.c
as8085 -l -o -s -p -g chio8080.s
scc8080 -t -a arglist.c
as8085 -l -o -s -p -g arglist.s
scc8080 -t -a charclass.c
as8085 -l -o -s -p -g charclass.s
scc8080 -t -a io8080.c
as8085 -l -o -s -p -g io8080.s
scc8080 -t -a bdos1.c
as8085 -l -o -s -p -g bdos1.s
scc8080 -t -a exit.c
as8085 -l -o -s -p -g exit.s
as8085 -l -o -s -p -g cret.asm
as8085 -l -o -s -p -g crun8080lib.asm
aslink -n -i -u -o -m -b CRET=0x0100 -b LIB8080=crtsoend+0x0100 -b SMALLC_GENERATED=crun8080_end+crtsoend+0x0100 cmd cret.rel crun8080lib.rel main.rel bdos.rel chio8080.rel arglist.rel charclass.rel io8080.rel bdos1.rel exit.rel
sort -k1.8,1.9 -k1.4,1.7 cmd.ihx > cmd.hex
hex2bin -e com -c cmd.hex
hex2bin v1.0.1, Copyright (C) 1999 Jacques Pelletier
Lowest address = 00000100
Highest address = 00001DD3
Build finished
; Run time start off for Small C.
.module CRET
.area CRET (REL,CON) ;program area CRTSO is RELOCATABLE
.list (err, loc, bin, eqt, cyc, lin, src, lst, md)
.nlist (pag)
.globl crtsoend
lxi h,0
dad sp
shld stksav ; save the stack pointer
lhld 6 ; pick up core top
lxi d,-10 ; decrease by 10 for safety
dad d
sphl ; set stack pointer
lxi h,0x0080
push h ; line buffer is at 0080H
call Xarglist
lhld Xargc
push h
lxi h,Xargv
push h
call main ; call main program
jmp 0 ; warm boot, reload CCP
stksav: .ds 2
crtsoend:
.end
/*
* File: main.c, march 2013
* command line arguments testing on CP/M
*/
/**
* main routine
* @return
*/
main(int argc, int argv[]) {
int i;
print("Argument test\r\n");
for (i=1; i < argc; i++) {
print("arg:");
putchar('0' + i);
print(", value:");
print(argv[i]);
print("\r\n");
}
}
print(char *str) {
while (*str) {
putchar(*str++);
}
}
A0>cmd a b -t
Argument test
arg:1, value:A
arg:2, value:B
arg:3, value:-T
Building projectVýsledný COM už narástol na 727 bytov hexadecimálne.
scc8080 -t -a main.c
as8085 -l -o -s -p -g main.s
scc8080 -t -a bdos.c
as8085 -l -o -s -p -g bdos.s
scc8080 -t -a chio8080.c
as8085 -l -o -s -p -g chio8080.s
scc8080 -t -a arglist.c
as8085 -l -o -s -p -g arglist.s
scc8080 -t -a charclass.c
as8085 -l -o -s -p -g charclass.s
as8085 -l -o -s -p -g cret.asm
as8085 -l -o -s -p -g crun8080lib.asm
aslink -n -i -u -o -m -b CRET=0x0100 -b LIB8080=crtsoend+0x0100 -b SMALLC_GENERATED=crun8080_end+crtsoend+0x0100 cmd cret.rel crun8080lib.rel main.rel bdos.rel chio8080.rel arglist.rel charclass.rel
sort -k1.8,1.9 -k1.4,1.7 cmd.ihx > cmd.hex
hex2bin -e com -c cmd.hex
hex2bin v1.0.1, Copyright (C) 1999 Jacques Pelletier
Lowest address = 00000100
Highest address = 00000827
Build finished
; Run time start off for Small C.Všimnime si volanie "call main". Áno to je ono. Tu nám zavádzač spúšťa našu main metódu. Tá bižutéria okolo, je už len presunutie zásobníka. Vlastnej tvorbe a fantázii sa medze nekladú. Musel som upraviť SmallC verziu pretože, neviem prečo ale bola zlá. Hneď na začiatku bolo SPHL. Nastavenie SP na hodnotu v HL. Ale to je asi blbosť. Veď CP/M nedáva v HL žiadnu hodnotu hovoriacu o zásobníku. Zase keby som nechal SP bez zmeny, tak by ukazoval niekam do CCP kde je priestor iba pre 8 úrovní. Preto som zvolil inú taktiku. Radšej si ho alokujem tam kde bolo CCP a miesta mám habadej.
; cseg
.module CRET
.area CRET (REL,CON) ;program area CRTSO is RELOCATABLE
.list (err, loc, bin, eqt, cyc, lin, src, lst, md)
.nlist (pag)
.globl crtsoend
lxi h,0
dad sp
shld stksav
lhld 6 ; pick up core top
lxi d,-10 ; decrease by 10 for safety
dad d
sphl ; set stack pointer
call main ; call main program
lhld stksav ; restore stack pointer
sphl
ret ; go back to CCP
stksav: .ds 2
crtsoend:
.end
/*
* File: main.c, march 2013
* hello world on CP/M
*/
/**
* main routine
* @return
*/
main() {
print("Hello World!!");
}
/**
* prints zero terminated string
* @param str
* @return
*/
print(char *str) {
while (*str) {
putchar(*str++);
}
}
#define EOL 10
getchar() {
return (bdos(1,1));
}
putchar (c) char c; {
if (c == EOL) bdos(2,13);
bdos(2,c);
return c;
}
Building project
scc8080 -t -a main.c
as8085 -l -o -s -p -g main.s
scc8080 -t -a bdos.c
as8085 -l -o -s -p -g bdos.s
scc8080 -t -a chio8080.c
as8085 -l -o -s -p -g chio8080.s
as8085 -l -o -s -p -g cret.asm
as8085 -l -o -s -p -g crun8080lib.asm
aslink -n -i -u -o -m -b CRET=0x0100 -b LIB8080=crtsoend+0x0100 -b SMALLC_GENERATED=crun8080_end+crtsoend+0x0100 hello cret.rel crun8080lib.rel main.rel bdos.rel chio8080.rel
sort -k1.8,1.9 -k1.4,1.7 hello.ihx > hello.hex
hex2bin -e com -c hello.hex
hex2bin v1.0.1, Copyright (C) 1999 Jacques Pelletier
Lowest address = 00000100
Highest address = 00000374
Build finished