; brainfuck_interpreter_v0.asm - Naive and unoptimised implementation of a brainfuck interpreter ; ; This file is part of the 9086 project. ; ; Copyright (c) 2024 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 . 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 interpreter v0\n' bracket: .BLKB 280 data: .BLKB 560