File: cmd.c

package info (click to toggle)
xtrs 4.9c-3.2
  • links: PTS
  • area: contrib
  • in suites: squeeze
  • size: 2,236 kB
  • ctags: 1,431
  • sloc: ansic: 19,941; makefile: 248; csh: 132; sh: 129
file content (77 lines) | stat: -rw-r--r-- 1,723 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* Routines to write a TRS-80 DOS "/cmd" file */
/* Copyright (c) 1996, Timothy Mann */

/* This software may be copied, modified, and used for any purpose
 * without fee, provided that (1) the above copyright notice is
 * retained, and (2) modified versions are clearly marked as having
 * been modified, with the modifier's name and the date included.  */

/* Last modified on Wed Aug 13 19:46:49 PDT 1997 by mann */

#include <stdio.h>

static int last_address, block_address;
static int block_size, got_transfer;
static unsigned char block[256];
static FILE* file;

void
cmd_init(FILE* f)
{
    last_address = block_address = -2;
    block_size = 0;
    got_transfer = 0;
    file = f;
}

void
cmd_data(int address, int value)
{
    unsigned char* p;

    if (value < 0 || address != last_address + 1 || block_size >= 256) {
	if (block_size > 0) {
	    /* close off current block */
	    putc(1, file);
	    putc((block_size + 2) & 0xff, file);
	    putc(block_address & 0xff, file);
	    putc((block_address >> 8) & 0xff, file);
	    p = block;
	    while (block_size) {
		putc(*p++, file);
		block_size--;
	    }
	}
	last_address = block_address = address;
	if (value == -2) {
	    /* transfer address */
	    putc(2, file);
	    putc(2, file);
	    putc(block_address & 0xff, file);
	    putc((block_address >> 8) & 0xff, file);
	    return;
	}
	if (value == -3) {
	    /* eof, no transfer address */
	    putc(3, file);
	    return;
	}
    }    
    /* continue current block */
    block[block_size++] = value;
    last_address = address;
    return;
}

void
cmd_transfer_address(int address)
{
    cmd_data(address, -2);
    got_transfer = 1;
}

void
cmd_end_of_file()
{
    if (!got_transfer) cmd_data(0, -3);
}