1
0
mirror of https://github.com/moshix/mvs.git synced 2026-01-11 23:43:00 +00:00
moshix.mvs/assembler.bash
2024-06-29 03:00:10 +02:00

77 lines
1.9 KiB
Bash

#!/bin/bash
# this is the basic structure for an S/370 assembler in bash
# (c) 2024 by moshix
# can be easily extended
# works as fast as a python program
# v 0.1 humble beginnings
# v 0.2 first few instructions
# v 0.3 CSECT and DSECT
# Instruction set (extendable)
declare -A INSTRUCTIONS=(
["L"]="58" # Load
["ST"]="50" # Store
["A"]="5A" # Add
["S"]="5B" # Subtract
["M"]="5C" # Multiply
["D"]="5D" # Divide
["B"]="47" # Branch
["BZ"]="47" # Branch on Zero
["BN"]="47" # Branch on Negative
["MVI"]="92" # Move Immediate
# Add more instructions here as needed
)
# Function to assemble a single line of S/370 assembly code
assemble_line() {
local line="$1"
local instruction=$(echo "$line" | awk '{print $1}')
local operands=$(echo "$line" | awk '{print $2, $3}')
# Handle special directives
case "$instruction" in
"USING")
echo "Processing USING directive: $operands"
;;
"CSECT")
echo "Processing CSECT directive: $operands"
;;
"DSECT")
echo "Processing DSECT directive: $operands"
;;
*)
# Check if the instruction exists
if [[ -n "${INSTRUCTIONS[$instruction]}" ]]; then
local opcode="${INSTRUCTIONS[$instruction]}"
echo "$opcode $operands"
else
echo "Error: Unknown instruction '$instruction'" >&2
fi
;;
esac
}
# Main function to assemble a file
assemble_file() {
local file="$1"
if [[ ! -f "$file" ]]; then
echo "Error: File '$file' not found." >&2
return 1
fi
while IFS= read -r line; do
assemble_line "$line"
done < "$file"
}
# Check for input file argument
if [[ $# -ne 1 ]]; then
echo "Usage: $0 <assembly_file>" >&2
exit 1
fi
assemble_file "$1"