mirror of
https://github.com/moshix/mvs.git
synced 2026-03-01 09:21:03 +00:00
Create assembler.bash
This commit is contained in:
74
assembler.bash
Normal file
74
assembler.bash
Normal file
@@ -0,0 +1,74 @@
|
||||
# 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
|
||||
#!/bin/bash
|
||||
|
||||
# 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}')
|
||||
|
||||
# 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"
|
||||
Reference in New Issue
Block a user