flat assembler
Message board for the users of flat assembler.

Index > DOS > Make your own compiler

Author
Thread Post new topic Reply to topic
mbr_tsr



Joined: 03 Apr 2011
Posts: 12092
mbr_tsr 06 Apr 2011, 10:25
Code:

;COMPILE.ASM
;Make your own compiler
;This is a simple example of writing your own language
;It is easy to add commands
;You can run scripts placed in the Script: label
;Has a very nice command parser
;Variables are @0 to @9 set by using "set #" from 0 to 9
;Scripts can have more than one command in a line using |
;Every line of a script is terminated with a CRLF
;All scripts must end with the 'stop' command
;It would be easy to make your scripts into .com programs
;Could be ported to windows by fixing some DOS usage
;By Atomic_Bios (Feb. 2011)

Org 100h

push cs
push cs
pop ds
pop es

mov  EDI, VarBuff
mov  ECX, 1000 * 10
mov  al, 0
ClearVars:
stosb
loop ClearVars

mov   esi, Intro
call  TinyPrint

Main:

cmp  [Running], 1
jne  NotRunning
mov  ESI, Script
mov  al, [CurrentLine]
call PointP
cmp byte [ESI], 10
jne NoIncLF
inc ESI
NoIncLF:
mov  EDI, String
call CopyString
inc [CurrentLine]
jmp  SkipInput
NotRunning:

;We will skip the input prompt if running script
mov   esi, InputPrompt
call  TinyPrint
mov  ESI, String
call TinyInput

SkipInput:

mov  EDI, Buffer1
mov  ECX, BuffSize * 4
mov  al, 0
ClearBuffs:
stosb
loop ClearBuffs

call ParseCommand

cmp  [Debug], 0
je   NotDebugging1
call ShowVars
NotDebugging1:

mov   esi, CrLf
call  TinyPrint

;This will put variables into command buffers
;sends typed @0 to @9 buffer into parse buffer
mov  ECX, 10
mov  EBP, 0
mov  EBX, 0
ScannBufferVars:
push ECX
mov  ESI, VariableList
mov  EAX, EBP
call PointP

push EBP
mov  ECX, EAX
mov  EBP, VarBuff
IncScans:
add  EBP, 1000
loop IncScans
mov  ECX, 4
mov  EDI, Buffer1
TheBuffers:
push ECX
call Compare
cmp  eax, 0
je   NotMatch
mov  ESI, EBP
call CopyString
NotMatch:
add  EDI, BuffSize
pop  ECX
loop TheBuffers
pop  EBP

inc  EBP
pop  ECX
loop ScannBufferVars


;Here we will test what command was entered and react
mov  ESI, Buffer1
mov  EDI, Cmd00
call Compare
cmp  eax, 0
je   NotCmd00
mov  ah, 0x4c
int  0x21
jmp  CommandDone
NotCmd00:

mov  ESI, Buffer1
mov  EDI, Cmd01
call Compare
cmp  eax, 0
je   NotCmd01
mov  ESI, Buffer2
call TinyPrint
jmp  CommandDone
NotCmd01:

mov  ESI, Buffer1
mov  EDI, Cmd02
call Compare
cmp  eax, 0
je   NotCmd02
mov  ESI, Help
call TinyPrint
jmp  CommandDone
NotCmd02:

mov  ESI, Buffer1
mov  EDI, Cmd03
call Compare
cmp  eax, 0
je   NotCmd03
mov  ESI, Beep
call TinyPrint
jmp  CommandDone
NotCmd03:

mov  ESI, Buffer1
mov  EDI, Cmd04
call Compare
cmp  eax, 0
je   NotCmd04
mov [Running], 1
mov ESI, Script
mov EDI, Script
mov ECX, StrSize
MakeFormat:
lodsb
cmp al, '|'
je MultiCmd
cmp al, 13
jne Not13
MultiCmd:
mov al,0
Not13:
stosb
loop MakeFormat
jmp  CommandDone
NotCmd04:

mov  ESI, Buffer1
mov  EDI, Cmd05
call Compare
cmp  eax, 0
je   NotCmd05
mov [Running], 0
mov [CurrentLine], 0
jmp  CommandDone
NotCmd05:

mov  ESI, Buffer1
mov  EDI, Cmd06
call Compare
cmp  eax, 0
je   NotCmd06
cmp  byte [Debug], 0
je   TurnOn
cmp  byte [Debug], 1
je   TurnOff
mov  [Debug], 1
jmp  DoneDebugSetup
TurnOn:
mov  [Debug], 1
jmp  DoneDebugSetup
TurnOff:
mov  [Debug], 0
DoneDebugSetup:
jmp  CommandDone
NotCmd06:

mov  ESI, Buffer1
mov  EDI, Cmd07
call Compare
cmp  eax, 0
je   NotCmd07
mov  esi, Buffer2
call ScanHex
mov  ECX, EAX
mov  ESI, Buffer3
mov  EDI, VarBuff
cmp  ECX, 0
jle  ZeroBaby
cmp  ECX, 9
ja   OUA
IncScan:
add  EDI, 1000
loop IncScan
ZeroBaby:
call CopyString
OUA:
jmp  CommandDone
NotCmd07:

mov  ESI, Buffer1
mov  EDI, Cmd08
call Compare
cmp  eax, 0
je   NotCmd08
;Add your command contents here
jmp  CommandDone
NotCmd08:

mov  ESI, Buffer1
mov  EDI, Cmd09
call Compare
cmp  eax, 0
je   NotCmd09
;Add your command contents here
jmp  CommandDone
NotCmd09:

mov  ESI, Buffer1
mov  EDI, Cmd10
call Compare
cmp  eax, 0
je   NotCmd10
;Add your command contents here
jmp  CommandDone
NotCmd10:

mov   esi, Error
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
call  ShowVars
jmp   AllOver

CommandDone:

cmp   byte [Debug],0        ;Show okay message if debugging
je    NotDebugging2
mov   esi, Okay
call  TinyPrint
NotDebugging2:

AllOver:
jmp Main

ParseCommand:
mov   edi, Buffer1
mov   ecx, BuffSize
mov   edx, 0
mov   eax, 4
mul   ecx
mov   ecx, eax
mov   al, 0
ClearTheMem:
stosb
loop ClearTheMem

mov  esi, String
GoParse:
mov  ecx, BuffSize
ltrim:
mov  al, byte [esi]
cmp  al, ' '
jne  DoneIt
inc  esi
loop ltrim
DoneIt:
mov  byte [incy], 0
mov  byte [qcount], 0
mov  EBX, 0
mov  EDX, 0
mov  ECX, 0
mov  AL, 1
Parses:
mov  AL, byte [ESI+EBX]
inc  EBX

cmp  al, 13
jne Cant13
mov al, 0
Cant13:
cmp  al, 10
jne Cant10
mov al, 0
Cant10:

cmp  AL, ';'
je   EndParses
cmp  AL, ' '
jne  NotSpace
CommaAsSpace:
cmp  byte [qcount], 1
je   OkayW
mov  ECX, 128
FixMultiSpaceInc:
mov  AL, byte [ESI+EBX]
cmp  al, ','
je  CommaSameAsSpace
cmp  al, ' '
jne  CeaseSpc
CommaSameAsSpace:
inc  EBX
loop FixMultiSpaceInc
CeaseSpc:
inc  byte [incy]
mov  EDX, 0
jmp  Trim

NotSpace:
cmp  AL, ','
je   CommaAsSpace

cmp  AL, 34
jne  NotQuote
cmp  byte [qcount], 0
je   SetTo1
mov  byte [qcount], 0
jmp  Trim
SetTo1:
mov  byte [qcount], 1
jmp  Trim
NotQuote:

OkayW:
cmp  byte [incy], 0
je   Zero
cmp  byte [incy], 1
je   One
cmp  byte [incy], 2
je   Two
cmp  byte [incy], 3
je   Three
jmp  EndParses

Zero:
mov  EDI, Buffer1
add  EDI, EDX
mov  byte [EDI], AL
inc  EDX
jmp  Trim
One:
mov  EDI, Buffer2
add  EDI, EDX
mov  byte [EDI], AL
inc  EDX
jmp  Trim
Two:
mov  EDI, Buffer3
add  EDI, EDX
mov  byte [EDI], AL
inc  EDX
jmp  Trim
Three:
mov  EDI, Buffer4
add  EDI, EDX
mov  byte [EDI], AL
inc  EDX
jmp  Trim
Trim:
cmp  AL, 0
je   EndParses
jmp  Parses
EndParses:
ret

;Read input from keyboard into ESI
TinyInput:
mov  ah, 0
int  0x16
mov  bx, 000fh
mov  ah, 0x0e
int  10h
cmp  al, 13
jne  NotIOverTiny
mov  byte [ESI], 0
jmp  GotItTiny
NotIOverTiny:
mov  byte [ESI], al
inc  ESI
jmp  TinyInput
GotItTiny:
ret

;print ESI to the screen
TinyPrint:
push EAX
push EBX
push ESI
ShowLoopTiny:
lodsb
cmp  al, 0
je   DoneTiny
cmp  al, '$'
je   DoneTiny
mov  ah, 0x0E
mov  bh, 0x00
mov  bl, 0x07
int  0x10
jmp  ShowLoopTiny
DoneTiny:
pop  ESI
pop  EBX
pop  EAX
ret

ShowVars:
mov   esi, CrLf
call  TinyPrint
mov   esi, Bar
call  TinyPrint
mov   esi, Data0
call  TinyPrint
mov   esi, String
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
mov   esi, Data1
call  TinyPrint
mov   esi, Buffer1
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
mov   esi, Data2
call  TinyPrint
mov   esi, Buffer2
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
mov   esi, Data3
call  TinyPrint
mov   esi, Buffer3
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
mov   esi, Data4
call  TinyPrint
mov   esi, Buffer4
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
mov   esi, Bar
call  TinyPrint

mov EDX, 0
mov ECX, 10
Debuggy:
mov ESI, VariableList
mov EAX, EDX
push EDX
call PointP
call TinyPrint
mov ESI, VarBuff
mov EAX, EDX
mov EBX, 1000
mul EBX
add ESI, EAX
call TinyPrint
mov  esi, CrLf
call  TinyPrint
pop EDX
inc EDX
loop Debuggy

ret

;compare esi with edi if they are the same return eax as 1
;if they are not the same return eax as 0
Compare:
push edi
push esi
mov  eax, 0
c_loop2:
lodsb
cmp  byte [edi], al
jne  c_nope2
cmp  al, 00
je   c_yup2
inc edi
jmp  c_loop2
c_yup2:
mov  eax, 01
jmp  GotCmpVal
c_nope2:
mov  eax, 00
jmp  GotCmpVal
GotCmpVal:
pop esi
pop edi
ret

;call with ESI array and al element#
;points to a specific string withing arrow of NUL terminated strings
PointP:
push EAX
push ECX
push EDX
mov  DL, AL
mov  ECX, 64000
cmp  DL, 0
je   cAllOverPc
cCounterLoopc:
cmp  byte [ESI], 0
jne  cNotUpCountc
inc  ESI
dec  DL
cmp  DL, 0
je   cAllOverPc
cNotUpCountc:
inc ESI
loop cCounterLoopc
cAllOverPc:
pop  EDX
pop  ECX
pop  EAX
ret

;copy string in ESI to EDI
CopyString:
push ESI
push EDI
CpyMem:
mov  AL, byte [ESI]
mov  byte [EDI], AL
cmp  AL, 0
je   CopyOver
inc  ESI
inc  EDI
jmp  CpyMem
CopyOver:
pop  EDI
pop  ESI
ret

;convert hex in ds:si into ascii into AX or AL
ScanHex:
push esi
push ecx
push edx
mov  cl,4
xor  edx,edx
scn:
lodsb
cmp  al,'0'
jb   endr
cmp  al,'9'
jna  decdgt
or   al,0x20
cmp  al,'a'
jb   endr
cmp  al,'z'
ja   endr
sub  al,'a'-'9'-1
decdgt:
sub  al,'0'
shl  dx,cl
or   dl,al
jmp  scn
endr:
xchg edx, eax
dec  esi
pop  edx
pop  ecx
pop esi
ret

CrLf db 0x0d,0x0a,0
incy db 0                             ;keeps trek of parse
qcount db 0                           ;keeps treq of quotes
Running db 0                          ;0=user entry 1=running script
CurrentLine db 0                      ;line number of running program
Debug db 0
InputPrompt db 0x0d,0x0a,"?",0
Bar db "=========================================================",0x0d,0x0a,0

Data0 db "Command =",0
Data1 db "Paramiter1 =",0
Data2 db "Paramiter2 =",0
Data3 db "Paramiter3 =",0
Data4 db "Paramiter4 =",0

Intro db "ZOS32",0x0d,0x0a,0

Help db "Commands",0x0d,0x0a
     db "exit = exit program and return to OS",0x0d,0x0a
     db "print text = display a message on the screen",0x0d,0x0a
     db "help = show this help screen info on commands",0x0d,0x0a
     db "beep = send a beeping noise to the PC speaker",0x0d,0x0a
     db "run = start running the built-in program script",0x0d,0x0a     
     db "stop = used by scripts to stop running themself",0x0d,0x0a     
     db "debug = toggle show extra info during commands",0x0d,0x0a     
     db "set # text = set variable from 0 to 9 to text",0x0d,0x0a     
     db "note that variable names are from @0 to @9",0x0d,0x0a     
db 0

Beep db 7,0

CommandList:
Cmd00 db "exit",0
Cmd01 db "print",0
Cmd02 db "help",0
Cmd03 db "beep",0
Cmd04 db "run",0
Cmd05 db "stop",0
Cmd06 db "debug",0
Cmd07 db "set",0
Cmd08 db "empty",0
Cmd09 db "empty",0
Cmd10 db "empty",0

VariableList:
Var0 db "@0",0
Var1 db "@1",0
Var2 db "@2",0
Var3 db "@3",0
Var4 db "@4",0
Var5 db "@5",0
Var6 db "@6",0
Var7 db "@7",0
Var8 db "@8",0
Var9 db "@9",0

Error db "Error = Unknown command",0x0d,0x0a,0
Okay db "OKAY",0x0d,0x0a,0

Script:
db 'print "example script will beep three times"',0x0d,0x0a
db 'beep | beep | beep | print Done!',0x0d,0x0a
db 'stop',0x0d,0x0a

ScriptSizeLimit rb 12000              ;Give some room for scripts

String rb 7000                        ;the main command goes here
StrSize = $ - String
Buffer1  rb 1000                      ;the paramiters go here
BuffSize = $ - Buffer1
Buffer2  rb 1000
Buffer3  rb 1000
Buffer4  rb 1000
VarBuff rb 1000 * 10

    
Post 06 Apr 2011, 10:25
View user's profile Send private message Reply with quote
masonswanson



Joined: 17 Aug 2010
Posts: 51
masonswanson 07 Apr 2011, 07:25
This Is Fabulous! Thanks
Post 07 Apr 2011, 07:25
View user's profile Send private message Send e-mail Visit poster's website Yahoo Messenger Reply with quote
rain_storm



Joined: 05 Apr 2007
Posts: 67
Location: Ireland
rain_storm 11 Apr 2011, 20:37
Nice work
Post 11 Apr 2011, 20:37
View user's profile Send private message Reply with quote
mbr_tsr



Joined: 03 Apr 2011
Posts: 12092
mbr_tsr 17 Apr 2011, 19:42
Code:
;Make your own compiler
;This is a simple example of writing your own language
;It is easy to add commands
;You can run scripts placed in the Script: label
;Has a very nice command parser
;Variables are @0 to @9 set by using "set #" from 0 to 9
;Scripts can have more than one command in a line using |
;Every line of a script is terminated with a CRLF
;All scripts must end with the 'stop' command
;It would be easy to make your scripts into .com programs
;Port your scripts to Windows, DOS, and Linux, or Raw
;Press the ` key to quit during input
;By Atomic_Bios (Feb. 2011)

Org 100h

push cs
push cs
pop ds
pop es

mov  EDI, VarBuff
mov  ECX, 1000 * 10
mov  al, 0
ClearVars:
stosb
loop ClearVars

mov   esi, Intro
call  TinyPrint

Main:

cmp  [Running], 1
jne  NotRunning
mov  ESI, Script
mov  eax, [CurrentLine]
call PointP
GotOneAlready:
cmp byte [ESI], 10
jne NoIncLF
inc ESI
NoIncLF:
mov  EDI, String
call CopyString
inc [CurrentLine]
jmp  SkipInput
NotRunning:

;We will skip the input prompt if running script
mov   esi, InputPrompt
call  TinyPrint
mov  ESI, String
call TinyInput
SkipInput:

mov  EDI, Buffer1
mov  ECX, BuffSize * 4
mov  al, 0
ClearBuffs:
stosb
loop ClearBuffs

call ParseCommand

cmp  [Debug], 0
je   NotDebugging1
call ShowVars
mov   esi, CrLf
call  TinyPrint
NotDebugging1:

mov  ESI, Buffer1
mov  EDI, Cmd10
call Compare
cmp  eax, 1
je   InputCmd

;This will put variables into command buffers
;sends typed @0 to @9 buffer into parse buffer
mov  ECX, 10
mov  EBP, 0
mov  EBX, 0
ScannBufferVars:
push ECX
mov  ESI, VariableList
mov  EAX, EBP
call PointP

push EBP
mov  ECX, EAX
mov  EBP, VarBuff
cmp  EAX, 0
je   ItsNulZ
IncScans:
add  EBP, 1000
loop IncScans
ItsNulZ:
mov  ECX, 4
mov  EDI, Buffer1
TheBuffers:
push ECX
call Compare
cmp  eax, 0
je   NotMatch
mov  ESI, EBP
call CopyString
NotMatch:
add  EDI, BuffSize
pop  ECX
loop TheBuffers
pop  EBP

inc  EBP
pop  ECX
loop ScannBufferVars

InputCmd:

;Here we will test what command was entered and react
mov  ESI, Buffer1
mov  EDI, Cmd00
call Compare
cmp  eax, 0
je   NotCmd00
ForceQuit:
mov  ah, 0x4c
int  0x21
jmp  CommandDone
NotCmd00:

mov  ESI, Buffer1
mov  EDI, Cmd01
call Compare
cmp  eax, 0
je   NotCmd01
mov  ESI, Buffer2
call TinyPrint
mov  esi, CrLf
call TinyPrint
jmp  CommandDone
NotCmd01:

mov  ESI, Buffer1
mov  EDI, Cmd02
call Compare
cmp  eax, 0
je   NotCmd02
mov  ESI, Help
call TinyPrint
jmp  CommandDone
NotCmd02:

mov  ESI, Buffer1
mov  EDI, Cmd03
call Compare
cmp  eax, 0
je   NotCmd03
mov  ESI, Beep
call TinyPrint
jmp  CommandDone
NotCmd03:

mov  ESI, Buffer1
mov  EDI, Cmd04
call Compare
cmp  eax, 0
je   NotCmd04
mov [Running], 1
mov ESI, Script
mov EDI, Script
mov ECX, StrSize
MakeFormat:
lodsb
cmp al, '|'
je MultiCmd
cmp al, 13
jne Not13
MultiCmd:
mov al,0
Not13:
stosb
loop MakeFormat
jmp  CommandDone
NotCmd04:

mov  ESI, Buffer1
mov  EDI, Cmd05
call Compare
cmp  eax, 0
je   NotCmd05
mov [Running], 0
mov [CurrentLine], 0
mov [GotoLine], 0
jmp Main
NotCmd05:

mov  ESI, Buffer1
mov  EDI, Cmd06
call Compare
cmp  eax, 0
je   NotCmd06
cmp  byte [Debug], 0
je   TurnOn
cmp  byte [Debug], 1
je   TurnOff
mov  [Debug], 1
jmp  DoneDebugSetup
TurnOn:
mov  [Debug], 1
jmp  DoneDebugSetup
TurnOff:
mov  [Debug], 0
DoneDebugSetup:
jmp  CommandDone
NotCmd06:

mov  ESI, Buffer1
mov  EDI, Cmd07
call Compare
cmp  eax, 0
je   NotCmd07
mov  esi, Buffer2
call ScanHex
mov  ECX, EAX
mov  ESI, Buffer3
mov  EDI, VarBuff
cmp  ECX, 0
jle  ZeroBaby
cmp  ECX, 9
ja   OUA
IncScan:
add  EDI, 1000
loop IncScan
ZeroBaby:
call CopyString
OUA:
jmp  CommandDone
NotCmd07:

mov  ESI, Buffer1
mov  EDI, Cmd08
call Compare
cmp  eax, 0
je   NotCmd08
DirectGoto:
cmp [Running], 0
je SkipGoto
mov ESI, Buffer2
mov EDI, Buffer2
CutLabM:
lodsb
cmp al, ' '
je CutLabM
cmp al, 0
je DoneLabM
stosb
jmp CutLabM
DoneLabM:
mov al, 0
stosb

mov [GotoLine], 0
mov ECX, 64000
ScanGotoLines:

mov ESI, Script
mov EAX, [GotoLine]
mov EDI, TrimBuff
call PointP
StartTrim:
lodsb
cmp al, 0
je DoneScan
cmp al, ' '
jne NotSpace1
jmp SkipStore
NotSpace1:
stosb
SkipStore:
jmp StartTrim
DoneScan:
mov al, 0
stosb
mov ESI, TrimBuff

cmp byte [ESI], 10
jne NoIncLFG
inc ESI
NoIncLFG:

mov  EDI, Buffer2
call Compare
cmp eax, 1
je GotGotoLine
inc [GotoLine]
loop ScanGotoLines
jmp ErrOut
GotGotoLine:
mov EAX, [GotoLine]
mov [CurrentLine], EAX
jmp Main
ErrOut:
SkipGoto:
jmp  CommandDone
NotCmd08:

mov  ESI, Buffer1
mov  EDI, Cmd09
call Compare
cmp  eax, 0
je   NotCmd09
mov  ESI, Buffer2
mov  EDI, Buffer3
call Compare
cmp  eax, 0
je   NotSame
mov  ESI, Buffer4
jmp  GotOneAlready
NotSame:
jmp  CommandDone
NotCmd09:

mov  ESI, Buffer1
mov  EDI, Cmd10
call Compare
cmp  eax, 0
je   NotCmd10
mov  EDI, VarBuff
mov  ECX, 10
mov  EBP, 0
ScanInpVars:
push ECX
mov  ESI, Var0
mov  EAX, EBP
call PointP
push EDI
mov  EDI, Buffer2
call Compare
pop  EDI
cmp  eax, 0
je   NotInpVar1
pop  ECX
mov  ESI, EDI
call TinyInput
jmp  GotInput
NotInpVar1:
add  EDI, 1000
inc  EBP
pop  ECX
loop ScanInpVars
GotInput:
jmp  CommandDone
NotCmd10:

mov  ESI, Buffer1
mov  EDI, Cmd11
call Compare
cmp  eax, 0
je   NotCmd11
;Add your command contents here
jmp  CommandDone
NotCmd11:

mov  ESI, Buffer1
mov  EDI, Cmd12
call Compare
cmp  eax, 0
je   NotCmd12
;Add your command contents here
jmp  CommandDone
NotCmd12:

mov  ESI, Buffer1
mov  EDI, Cmd13
call Compare
cmp  eax, 0
je   NotCmd13
;Add your command contents here
jmp  CommandDone
NotCmd13:

mov  ESI, Buffer1
mov  EDI, Cmd14
call Compare
cmp  eax, 0
je   NotCmd14
;Add your command contents here
jmp  CommandDone
NotCmd14:

mov  ESI, Buffer1
mov  EDI, Cmd15
call Compare
cmp  eax, 0
je   NotCmd15
;Add your command contents here
jmp  CommandDone
NotCmd15:

cmp   byte [Debug],0
je    NotDebuggingGarb
mov   esi, Error
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
call  ShowVars
NotDebuggingGarb:
jmp   AllOver

CommandDone:

cmp   byte [Debug],0        ;Show okay message if debugging
je    NotDebugging2
mov   esi, Okay
call  TinyPrint
NotDebugging2:

AllOver:
jmp Main

ParseCommand:
mov   edi, Buffer1
mov   ecx, BuffSize
mov   edx, 0
mov   eax, 4
mul   ecx
mov   ecx, eax
mov   al, 0
ClearTheMem:
stosb
loop ClearTheMem

mov  esi, String
GoParse:
mov  ecx, BuffSize
ltrim:
mov  al, byte [esi]
cmp  al, ' '
jne  DoneIt
inc  esi
loop ltrim
DoneIt:
mov  byte [incy], 0
mov  byte [qcount], 0
mov  EBX, 0
mov  EDX, 0
mov  ECX, 0
mov  AL, 1
Parses:
mov  AL, byte [ESI+EBX]
inc  EBX

cmp  al, 13
jne Cant13
mov al, 0
Cant13:
cmp  al, 10
jne Cant10
mov al, 0
Cant10:

cmp  AL, ';'
je   EndParses
cmp  AL, ' '
jne  NotSpace
CommaAsSpace:
cmp  byte [qcount], 1
je   OkayW
mov  ECX, 128
FixMultiSpaceInc:
mov  AL, byte [ESI+EBX]
cmp  al, ','
je  CommaSameAsSpace
cmp  al, ' '
jne  CeaseSpc
CommaSameAsSpace:
inc  EBX
loop FixMultiSpaceInc
CeaseSpc:
inc  byte [incy]
mov  EDX, 0
jmp  Trim

NotSpace:
cmp  AL, ','
je   CommaAsSpace

cmp  AL, 34
jne  NotQuote
cmp  byte [qcount], 0
je   SetTo1
mov  byte [qcount], 0
jmp  Trim
SetTo1:
mov  byte [qcount], 1
jmp  Trim
NotQuote:

OkayW:
cmp  byte [incy], 0
je   Zero
cmp  byte [incy], 1
je   One
cmp  byte [incy], 2
je   Two
cmp  byte [incy], 3
je   Three
jmp  EndParses

Zero:
mov  EDI, Buffer1
add  EDI, EDX
mov  byte [EDI], AL
inc  EDX
jmp  Trim
One:
mov  EDI, Buffer2
add  EDI, EDX
mov  byte [EDI], AL
inc  EDX
jmp  Trim
Two:
mov  EDI, Buffer3
add  EDI, EDX
mov  byte [EDI], AL
inc  EDX
jmp  Trim
Three:
mov  EDI, Buffer4
add  EDI, EDX
mov  byte [EDI], AL
inc  EDX
jmp  Trim
Trim:
cmp  AL, 0
je   EndParses
jmp  Parses
EndParses:
ret

;Read input from keyboard into ESI
TinyInput:
mov  ah, 0
int  0x16
cmp  al, '`'
je   ForceQuit
mov  bx, 000fh
mov  ah, 0x0e
int  10h
cmp  al, 13
jne  NotIOverTiny
mov  byte [ESI], 0
jmp  GotItTiny
NotIOverTiny:
mov  byte [ESI], al
inc  ESI
jmp  TinyInput
GotItTiny:
ret

;print ESI to the screen
TinyPrint:
push EAX
push EBX
push ESI
ShowLoopTiny:
lodsb
cmp  al, 0
je   DoneTiny
cmp  al, '$'
je   DoneTiny
mov  ah, 0x0E
mov  bh, 0x00
mov  bl, 0x07
int  0x10
jmp  ShowLoopTiny
DoneTiny:
pop  ESI
pop  EBX
pop  EAX
ret

ShowVars:
mov   esi, CrLf
call  TinyPrint
mov   esi, Bar
call  TinyPrint
mov   esi, Data0
call  TinyPrint
mov   esi, String
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
mov   esi, Data1
call  TinyPrint
mov   esi, Buffer1
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
mov   esi, Data2
call  TinyPrint
mov   esi, Buffer2
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
mov   esi, Data3
call  TinyPrint
mov   esi, Buffer3
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
mov   esi, Data4
call  TinyPrint
mov   esi, Buffer4
call  TinyPrint
mov   esi, CrLf
call  TinyPrint
mov   esi, Bar
call  TinyPrint

mov EDX, 0
mov ECX, 10
Debuggy:
mov ESI, VariableList
mov EAX, EDX
push EDX
call PointP
call TinyPrint
mov ESI, VarBuff
mov EAX, EDX
mov EBX, 1000
mul EBX
add ESI, EAX
call TinyPrint
mov  esi, CrLf
call  TinyPrint
pop EDX
inc EDX
loop Debuggy

ret

;compare esi with edi if they are the same return eax as 1
;if they are not the same return eax as 0
Compare:
push edi
push esi
mov  eax, 0
c_loop2:
lodsb
cmp  byte [edi], al
jne  c_nope2
cmp  al, 00
je   c_yup2
inc edi
jmp  c_loop2
c_yup2:
mov  eax, 01
jmp  GotCmpVal
c_nope2:
mov  eax, 00
jmp  GotCmpVal
GotCmpVal:
pop esi
pop edi
ret

;call with ESI array and al element#
;points to a specific string withing array of NUL terminated strings
PointP:
push EAX
push ECX
push EDX
mov  DL, AL
mov  ECX, 64000
cmp  DL, 0
je   cAllOverPc
cCounterLoopc:
cmp  byte [ESI], 0
jne  cNotUpCountc
inc  ESI
dec  DL
cmp  DL, 0
je   cAllOverPc
cNotUpCountc:
inc ESI
loop cCounterLoopc
cAllOverPc:
pop  EDX
pop  ECX
pop  EAX
ret

;copy string in ESI to EDI
CopyString:
push ESI
push EDI
CpyMem1:
mov  AL, byte [ESI]
mov  byte [EDI], AL
cmp  AL, 0
je   CopyOver
inc  ESI
inc  EDI
jmp  CpyMem1
CopyOver:
pop  EDI
pop  ESI
ret

;convert hex in ds:si into ascii into AX or AL
ScanHex:
push esi
push ecx
push edx
mov  cl,4
xor  edx,edx
scn:
lodsb
cmp  al,'0'
jb   endr
cmp  al,'9'
jna  decdgt
or   al,0x20
cmp  al,'a'
jb   endr
cmp  al,'z'
ja   endr
sub  al,'a'-'9'-1
decdgt:
sub  al,'0'
shl  dx,cl
or   dl,al
jmp  scn
endr:
xchg edx, eax
dec  esi
pop  edx
pop  ecx
pop esi
ret

CrLf db 0x0d,0x0a,0
incy db 0                             ;keeps trek of parse
qcount db 0                           ;keeps treq of quotes
Running db 0                          ;0=user entry 1=running script
CurrentLine dd 0                      ;line number of running program
GotoLine dd 0
Debug db 0
InputPrompt db 0x0d,0x0a,"?",0
Bar db "=========================================================",0x0d,0x0a,0

Data0 db "Command =",0
Data1 db "Paramiter1 =",0
Data2 db "Paramiter2 =",0
Data3 db "Paramiter3 =",0
Data4 db "Paramiter4 =",0

Intro db "ZOS32",0x0d,0x0a,0

Help db "Commands",0x0d,0x0a
     db "exit = exit program and return to OS",0x0d,0x0a
     db "print text = display a message on the screen",0x0d,0x0a
     db "help = show this help screen info on commands",0x0d,0x0a
     db "beep = send a beeping noise to the PC speaker",0x0d,0x0a
     db "run = start running the built-in program script",0x0d,0x0a     
     db "stop = used by scripts to stop running themself",0x0d,0x0a     
     db "debug = toggle show extra info during commands",0x0d,0x0a     
     db "set # text = set variable from 0 to 9 to text",0x0d,0x0a     
     db "goto label: = goto any label: within your script",0x0d,0x0a
     db "compare txt1 txt2 code = run code if txt1 and txt2 are equal",0x0d,0x0a
     db "input @var = read keyboard input into @0 to @9",0x0d,0x0a
     db "note that variable names are from @0 to @9",0x0d,0x0a     
db 0

Beep db 7,0

CommandList:
Cmd00 db "exit",0
Cmd01 db "print",0
Cmd02 db "help",0
Cmd03 db "beep",0
Cmd04 db "run",0
Cmd05 db "stop",0
Cmd06 db "debug",0
Cmd07 db "set",0
Cmd08 db "goto",0
Cmd09 db "compare",0
Cmd10 db "input",0
Cmd11 db "empty",0
Cmd12 db "empty",0
Cmd13 db "empty",0
Cmd14 db "empty",0
Cmd15 db "empty",0

VariableList:
Var0 db "@0",0
Var1 db "@1",0
Var2 db "@2",0
Var3 db "@3",0
Var4 db "@4",0
Var5 db "@5",0
Var6 db "@6",0
Var7 db "@7",0
Var8 db "@8",0
Var9 db "@9",0

Error db "Error = Unknown command",0x0d,0x0a,0
Okay db "OKAY",0x0d,0x0a,0

Script:
db 'MainLabel:',0x0d,0x0a
db 'print "beeping three times"',0x0d,0x0a
db 'beep | beep | beep | print Done!',0x0d,0x0a
db 'InputLabel:',0x0d,0x0a
db 'print "Commands: exit, restart, help"',0x0d,0x0a
db 'input @1',0x0d,0x0a
db 'print "You Typed:" | print @1',0x0d,0x0a
db 'compare @1 restart "goto MainLabel:"',0x0d,0x0a
db 'compare @1 exit "goto ExitLabel:"',0x0d,0x0a
db 'compare @1 help "goto HelpLabel:"',0x0d,0x0a
db 'print "Unknown Command"',0x0d,0x0a
db 'goto InputLabel:',0x0d,0x0a
db 'ExitLabel:',0x0d,0x0a
db 'print Goodbye...',0x0d,0x0a
db 'stop',0x0d,0x0a
db 'HelpLabel:',0x0d,0x0a
db 'print "exit=return to OS',0x0d,0x0a
db 'print "restart=restart demo',0x0d,0x0a
db 'print "help=show command summary',0x0d,0x0a
db 'goto InputLabel:',0x0d,0x0a

ScriptSizeLimit rb 12000              ;Give some room for scripts

String rb 7000                        ;the main command goes here
StrSize = $ - String
Buffer1  rb 1000                      ;the paramiters go here
BuffSize = $ - Buffer1
Buffer2  rb 1000
Buffer3  rb 1000
Buffer4  rb 1000
VarBuff rb 1000 * 10
TrimBuff rb 88
db 0
    
Post 17 Apr 2011, 19:42
View user's profile Send private message Reply with quote
mbr_tsr



Joined: 03 Apr 2011
Posts: 12092
mbr_tsr 17 Apr 2011, 20:51
This can be ported to any OS by changing TinyInput: and TinyPrint: and the header Org 100h to Win32 Console or Linux int 0x80, right now it runs as a Kernel except for int 0x21 function 0x4c that can be changed to 0xCC
Post 17 Apr 2011, 20:51
View user's profile Send private message Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.

Website powered by rwasa.