disk8: Initial commit
[pdp8.git] / sw / disk8 / src / ops.c
CommitLineData
919757fd
PH
1
2#include <stdio.h>
3#include "structures.h"
4#include "ops.h"
5
6/*
7 * Pack an OS/8 filename into 6 bit code, 2 digits per 12 bit word.
8 * Argument is a zero-terminated string, containing the full name with
9 * the dot, i.E. "XXXXXX.YY",0 is the legal form.
10 */
11void os8_file_name_pack(os8_file_name_t * filename, char * data){
12
13 /* Read and write positions */
14 int inpos=0, outpos=0;
15
16 /* Zero out all data in target */
17 for (outpos=0; outpos<4; outpos++) filename->data[outpos]=0;
18
19 for (outpos=0; outpos<8 && data[inpos];){
20 if (data[inpos]=='.'){
21 inpos++;
22 if (outpos<6) outpos=6;
23 continue;
24 }
25 filename->data[outpos/2] |= os8_ascii2pdp(data[inpos++]) << ((!(outpos%2))*6);
26 outpos++;
27 }
28}
29
30void os8_file_name_extract(os8_file_name_t * filename, char * data){
31
32 /* Read and write positions */
33 int inpos=0, outpos=0;
34
35 for (inpos=0; inpos<8; inpos++){
36
37 unsigned short int current=filename->data[inpos/2]; /* Get right word */
38 if (!(inpos%2)) current >>= 6;
39 current &= 077;
40
41 if ((!current) && ((inpos==0)||(inpos==6))){ /* Empty file name or extension*/
42 data[outpos]=0; /* Terminate file name in buffer */
43 break; /* Leave the loop! */
44 }
45
46 if (inpos==6){
47 data[outpos++]='.'; /* Insert dot into new name */
48 }
49
50 if (current) { /* Insert character into output */
51 data[outpos++]=os8_pdp2ascii(current);
52 }
53 }
54 data[outpos]=0; /* Terminate string. */
55}
56
57/* Pack one character into 6 bit OS/8 reduced ASCII code */
58unsigned char os8_ascii2pdp(unsigned char inchar){
59 unsigned char result=inchar & 077; /* Strip upper bits */
60 return result;
61}
62
63/* Extract one character from 6 bit OS/8 reduced ASCII code */
64unsigned char os8_pdp2ascii(unsigned char inchar){
65 inchar &=077;
66 if (inchar<040) return inchar|0100;
67 return inchar;
68}
69
70/* Negate a p8word */
71p8word p8_neg(p8word in){
72 return (-in)&07777;
73}
74
75/* Twist the bytes for little endian machines */
76p8word p8_twist(p8word in){
77 return (in&0xff)<<8 | ((in>>8)&0xff);
78}
79
80
81
82
83
84