Monday, March 25, 2013

NCB85 5. File I/O

Prvý program Hello World overil funkčnosť konzolového I/O a cross compilácie. Druhý program otestoval spracovanie vstupných parametrov z CP/M príkazového riadku. Ďalším krokom je test file systému. Pripravil som krátky program, ktorý vypíše na konzolu obsah súboru. Názov súboru sa zadáva ako parameter. Ak sa nezadá žiadny parameter, alebo viac ako jeden parameter, program vypíše usage. Ak sa nepodarí otvoriť súbor, tak vypíše chybové hlásenie.
/*
* 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++);
    }
}

CRTSO sa zase trošku zmenilo. Pribudla inicializácia STDIO systému. Toto je asi aj finálna verzia. Už tam je všetko, čo je potrebné na prácu v CP/M.
    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

Do projektu pribudli ďalšie podporné súbory: io8080.c, bdos1.c a exit.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
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


Výsledný COM sa nafúkol na cca 7.5kB. Z toho sú ale 2kB buffer pre čítanie sektorov z filesystému. To preto, lebo je dovolené mať otvorené naraz až 4 súbory. Odhadom ďalšie 0.5kB sú pomocné štruktúry ako 4x FCB atď.

No comments:

Post a Comment