130 lines
1.9 KiB
NASM
130 lines
1.9 KiB
NASM
|
; brainfuck_interpreter_v0.asm - Naive and unoptimised implementation of a brainfuck interpreter
|
||
|
;
|
||
|
; This file is part of the 9086 project.
|
||
|
;
|
||
|
; Copyright (c) 2023 Efthymios Kritikos
|
||
|
;
|
||
|
; This program is free software: you can redistribute it and/or modify
|
||
|
; it under the terms of the GNU General Public License as published by
|
||
|
; the Free Software Foundation, either version 3 of the License, or
|
||
|
; (at your option) any later version.
|
||
|
;
|
||
|
; This program is distributed in the hope that it will be useful,
|
||
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
; GNU General Public License for more details.
|
||
|
;
|
||
|
; You should have received a copy of the GNU General Public License
|
||
|
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
mov bx,#bootup_msg
|
||
|
mov ah,#0x02
|
||
|
bootup_print:
|
||
|
mov dl,[bx]
|
||
|
int #0x21
|
||
|
inc bx
|
||
|
cmp dl,#0x0A
|
||
|
jne bootup_print
|
||
|
|
||
|
mov si,#prog
|
||
|
mov BX,#data
|
||
|
mov CX,#bracket
|
||
|
dec si
|
||
|
INTERPRET:
|
||
|
inc si
|
||
|
mov al,[si]
|
||
|
cmp al,#'+
|
||
|
jz WAS_PLUS
|
||
|
cmp al,#'-
|
||
|
jz WAS_MINUS
|
||
|
cmp al,#'>
|
||
|
jz WAS_MR
|
||
|
cmp al,#'<
|
||
|
jz WAS_ML
|
||
|
cmp al,#'[
|
||
|
jz WAS_PL
|
||
|
cmp al,#']
|
||
|
jz WAS_PR
|
||
|
cmp al,#'.
|
||
|
jz WAS_PRINT
|
||
|
jmp PROG_END
|
||
|
|
||
|
WAS_PLUS:
|
||
|
inc BYTE [BX]
|
||
|
JMP INTERPRET
|
||
|
|
||
|
WAS_MINUS:
|
||
|
dec BYTE [BX]
|
||
|
JMP INTERPRET
|
||
|
|
||
|
WAS_MR:
|
||
|
inc bx
|
||
|
JMP INTERPRET
|
||
|
|
||
|
WAS_ML:
|
||
|
dec bx
|
||
|
JMP INTERPRET
|
||
|
|
||
|
WAS_PL:
|
||
|
MOV AL,[BX]
|
||
|
cmp AL,#0
|
||
|
jz SKIP_CODE_BLOCK
|
||
|
;have to enter loop
|
||
|
MOV AX,SI
|
||
|
inc CX
|
||
|
inc CX
|
||
|
MOV SI,CX
|
||
|
mov [SI],AX
|
||
|
mov SI,AX
|
||
|
JMP INTERPRET
|
||
|
|
||
|
SKIP_CODE_BLOCK:
|
||
|
;have to skip loop
|
||
|
MOV DX,#0
|
||
|
SKIP_LOOP:
|
||
|
INC SI
|
||
|
mov AL,[SI]
|
||
|
CMP AL,#']
|
||
|
JZ WAS_CLOSE1
|
||
|
CMP AL,#'[
|
||
|
JZ WAS_OPEN1
|
||
|
JMP SKIP_LOOP
|
||
|
|
||
|
WAS_CLOSE1:
|
||
|
CMP DX,#0
|
||
|
JZ INTERPRET
|
||
|
DEC DX
|
||
|
JMP SKIP_LOOP
|
||
|
WAS_OPEN1:
|
||
|
INC DX
|
||
|
JMP SKIP_LOOP
|
||
|
|
||
|
WAS_PR:
|
||
|
mov AL,[BX]
|
||
|
cmp AL,#0
|
||
|
JZ EXIT_PR
|
||
|
MOV SI,CX
|
||
|
mov ax,[SI]
|
||
|
mov si,ax
|
||
|
JMP INTERPRET
|
||
|
|
||
|
|
||
|
EXIT_PR:
|
||
|
DEC CX
|
||
|
DEC CX
|
||
|
jmp INTERPRET
|
||
|
|
||
|
|
||
|
WAS_PRINT:
|
||
|
mov ah, #0x02
|
||
|
MOV DL,[BX]
|
||
|
int #0x21
|
||
|
JMP INTERPRET
|
||
|
|
||
|
PROG_END:
|
||
|
hlt
|
||
|
|
||
|
bootup_msg: .ASCII 'Brainfuck interpeter v0\n'
|
||
|
bracket: .BLKB 280
|
||
|
data: .BLKB 560
|