mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-28 17:20:22 +00:00
Added BlitzBasic
This commit is contained in:
@@ -134,6 +134,15 @@ Batchfile:
|
||||
Befunge:
|
||||
primary_extension: .befunge
|
||||
|
||||
BlitzBasic:
|
||||
type: programming
|
||||
aliases:
|
||||
- blitzplus
|
||||
- blitz3d
|
||||
primary_extension: .bb
|
||||
extensions:
|
||||
- .decls
|
||||
|
||||
BlitzMax:
|
||||
primary_extension: .bmx
|
||||
|
||||
|
||||
147
samples/BlitzBasic/HalfAndDouble.bb
Normal file
147
samples/BlitzBasic/HalfAndDouble.bb
Normal file
@@ -0,0 +1,147 @@
|
||||
|
||||
Local bk = CreateBank(8)
|
||||
PokeFloat bk, 0, -1
|
||||
Print Bin(PeekInt(bk, 0))
|
||||
Print %1000000000000000
|
||||
Print Bin(1 Shl 31)
|
||||
Print $1f
|
||||
Print $ff
|
||||
Print $1f + (127 - 15)
|
||||
Print Hex(%01111111100000000000000000000000)
|
||||
Print Hex(~%11111111100000000000000000000000)
|
||||
|
||||
Print Bin(FloatToHalf(-2.5))
|
||||
Print HalfToFloat(FloatToHalf(-200000000000.0))
|
||||
|
||||
Print Bin(FToI(-2.5))
|
||||
|
||||
WaitKey
|
||||
End
|
||||
|
||||
|
||||
; Half-precision (16-bit) arithmetic library
|
||||
;============================================
|
||||
|
||||
Global Half_CBank_
|
||||
|
||||
Function FToI(f#)
|
||||
If Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4)
|
||||
PokeFloat Half_CBank_, 0, f
|
||||
Return PeekInt(Half_CBank_, 0)
|
||||
End Function
|
||||
|
||||
Function HalfToFloat#(h)
|
||||
Local signBit, exponent, fraction, fBits
|
||||
|
||||
signBit = (h And 32768) <> 0
|
||||
exponent = (h And %0111110000000000) Shr 10
|
||||
fraction = (h And %0000001111111111)
|
||||
|
||||
If exponent = $1F Then exponent = $FF : ElseIf exponent Then exponent = (exponent - 15) + 127
|
||||
fBits = (signBit Shl 31) Or (exponent Shl 23) Or (fraction Shl 13)
|
||||
|
||||
If Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4)
|
||||
PokeInt Half_CBank_, 0, fBits
|
||||
Return PeekFloat(Half_CBank_, 0)
|
||||
End Function
|
||||
|
||||
Function FloatToHalf(f#)
|
||||
Local signBit, exponent, fraction, fBits
|
||||
|
||||
If Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4)
|
||||
PokeFloat Half_CBank_, 0, f
|
||||
fBits = PeekInt(Half_CBank_, 0)
|
||||
|
||||
signBit = (fBits And (1 Shl 31)) <> 0
|
||||
exponent = (fBits And $7F800000) Shr 23
|
||||
fraction = fBits And $007FFFFF
|
||||
|
||||
If exponent
|
||||
exponent = exponent - 127
|
||||
If Abs(exponent) > $1F
|
||||
If exponent <> ($FF - 127) Then fraction = 0
|
||||
exponent = $1F * Sgn(exponent)
|
||||
Else
|
||||
exponent = exponent + 15
|
||||
EndIf
|
||||
exponent = exponent And %11111
|
||||
EndIf
|
||||
fraction = fraction Shr 13
|
||||
|
||||
Return (signBit Shl 15) Or (exponent Shl 10) Or fraction
|
||||
End Function
|
||||
|
||||
Function HalfAdd(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
Function HalfSub(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
Function HalfMul(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
Function HalfDiv(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
Function HalfLT(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
Function HalfGT(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
|
||||
; Double-precision (64-bit) arithmetic library)
|
||||
;===============================================
|
||||
|
||||
Global DoubleOut[1], Double_CBank_
|
||||
|
||||
Function DoubleToFloat#(d[1])
|
||||
|
||||
End Function
|
||||
|
||||
Function FloatToDouble(f#)
|
||||
|
||||
End Function
|
||||
|
||||
Function IntToDouble(i)
|
||||
|
||||
End Function
|
||||
|
||||
Function SefToDouble(s, e, f)
|
||||
|
||||
End Function
|
||||
|
||||
Function DoubleAdd(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
Function DoubleSub(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
Function DoubleMul(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
Function DoubleDiv(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
Function DoubleLT(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
Function DoubleGT(l, r)
|
||||
|
||||
End Function
|
||||
|
||||
|
||||
;~IDEal Editor Parameters:
|
||||
;~F#1A#20#2F
|
||||
;~C#Blitz3D
|
||||
369
samples/BlitzBasic/LList.bb
Normal file
369
samples/BlitzBasic/LList.bb
Normal file
@@ -0,0 +1,369 @@
|
||||
|
||||
; Double-linked list container class
|
||||
;====================================
|
||||
|
||||
; with thanks to MusicianKool, for concept and issue fixes
|
||||
|
||||
|
||||
Type LList
|
||||
Field head_.ListNode
|
||||
Field tail_.ListNode
|
||||
End Type
|
||||
|
||||
Type ListNode
|
||||
Field pv_.ListNode
|
||||
Field nx_.ListNode
|
||||
Field Value
|
||||
End Type
|
||||
|
||||
Type Iterator
|
||||
Field Value
|
||||
Field l_.LList
|
||||
Field cn_.ListNode, cni_
|
||||
End Type
|
||||
|
||||
|
||||
;Create a new LList object
|
||||
Function CreateList.LList()
|
||||
Local l.LList = New LList
|
||||
|
||||
l\head_ = New ListNode
|
||||
l\tail_ = New ListNode
|
||||
|
||||
l\head_\nx_ = l\tail_ ;End caps
|
||||
l\head_\pv_ = l\head_ ;These make it more or less safe to iterate freely
|
||||
l\head_\Value = 0
|
||||
|
||||
l\tail_\nx_ = l\tail_
|
||||
l\tail_\pv_ = l\head_
|
||||
l\tail_\Value = 0
|
||||
|
||||
Return l
|
||||
End Function
|
||||
|
||||
;Free a list and all elements (not any values)
|
||||
Function FreeList(l.LList)
|
||||
ClearList l
|
||||
Delete l\head_
|
||||
Delete l\tail_
|
||||
Delete l
|
||||
End Function
|
||||
|
||||
;Remove all the elements from a list (does not free values)
|
||||
Function ClearList(l.LList)
|
||||
Local n.ListNode = l\head_\nx_
|
||||
While n <> l\tail_
|
||||
Local nx.ListNode = n\nx_
|
||||
Delete n
|
||||
n = nx
|
||||
Wend
|
||||
l\head_\nx_ = l\tail_
|
||||
l\tail_\pv_ = l\head_
|
||||
End Function
|
||||
|
||||
;Count the number of elements in a list (slow)
|
||||
Function ListLength(l.LList)
|
||||
Local i.Iterator = GetIterator(l), elems
|
||||
While EachIn(i)
|
||||
elems = elems + 1
|
||||
Wend
|
||||
Return elems
|
||||
End Function
|
||||
|
||||
;Return True if a list contains a given value
|
||||
Function ListContains(l.LList, Value)
|
||||
Return (ListFindNode(l, Value) <> Null)
|
||||
End Function
|
||||
|
||||
;Create a linked list from the intvalues in a bank (slow)
|
||||
Function ListFromBank.LList(bank)
|
||||
Local l.LList = CreateList()
|
||||
Local size = BankSize(bank), p
|
||||
|
||||
For p = 0 To size - 4 Step 4
|
||||
ListAddLast l, PeekInt(bank, p)
|
||||
Next
|
||||
|
||||
Return l
|
||||
End Function
|
||||
|
||||
;Create a bank containing all the values in a list (slow)
|
||||
Function ListToBank(l.LList)
|
||||
Local size = ListLength(l) * 4
|
||||
Local bank = CreateBank(size)
|
||||
|
||||
Local i.Iterator = GetIterator(l), p = 0
|
||||
While EachIn(i)
|
||||
PokeInt bank, p, i\Value
|
||||
p = p + 4
|
||||
Wend
|
||||
|
||||
Return bank
|
||||
End Function
|
||||
|
||||
;Swap the contents of two list objects
|
||||
Function SwapLists(l1.LList, l2.LList)
|
||||
Local tempH.ListNode = l1\head_, tempT.ListNode = l1\tail_
|
||||
l1\head_ = l2\head_
|
||||
l1\tail_ = l2\tail_
|
||||
l2\head_ = tempH
|
||||
l2\tail_ = tempT
|
||||
End Function
|
||||
|
||||
;Create a new list containing the same values as the first
|
||||
Function CopyList.LList(lo.LList)
|
||||
Local ln.LList = CreateList()
|
||||
Local i.Iterator = GetIterator(lo) : While EachIn(i)
|
||||
ListAddLast ln, i\Value
|
||||
Wend
|
||||
Return ln
|
||||
End Function
|
||||
|
||||
;Reverse the order of elements of a list
|
||||
Function ReverseList(l.LList)
|
||||
Local n1.ListNode, n2.ListNode, tmp.ListNode
|
||||
|
||||
n1 = l\head_
|
||||
n2 = l\head_\nx_
|
||||
|
||||
While n1 <> l\tail_
|
||||
n1\pv_ = n2
|
||||
tmp = n2\nx_
|
||||
n2\nx_ = n1
|
||||
n1 = n2
|
||||
n2 = tmp
|
||||
Wend
|
||||
|
||||
tmp = l\head_
|
||||
l\head_ = l\tail_
|
||||
l\tail_ = tmp
|
||||
|
||||
l\head_\pv_ = l\head_
|
||||
l\tail_\nx_ = l\tail_
|
||||
End Function
|
||||
|
||||
;Search a list to retrieve the first node with the given value
|
||||
Function ListFindNode.ListNode(l.LList, Value)
|
||||
Local n.ListNode = l\head_\nx_
|
||||
|
||||
While n <> l\tail_
|
||||
If n\Value = Value Then Return n
|
||||
n = n\nx_
|
||||
Wend
|
||||
|
||||
Return Null
|
||||
End Function
|
||||
|
||||
;Append a value to the end of a list (fast) and return the node
|
||||
Function ListAddLast.ListNode(l.LList, Value)
|
||||
Local n.ListNode = New ListNode
|
||||
|
||||
n\pv_ = l\tail_\pv_
|
||||
n\nx_ = l\tail_
|
||||
n\Value = Value
|
||||
|
||||
l\tail_\pv_ = n
|
||||
n\pv_\nx_ = n
|
||||
|
||||
Return n
|
||||
End Function
|
||||
|
||||
;Attach a value to the start of a list (fast) and return the node
|
||||
Function ListAddFirst.ListNode(l.LList, Value)
|
||||
Local n.ListNode = New ListNode
|
||||
|
||||
n\pv_ = l\head_
|
||||
n\nx_ = l\head_\nx_
|
||||
n\Value = Value
|
||||
|
||||
l\head_\nx_ = n
|
||||
n\nx_\pv_ = n
|
||||
|
||||
Return n
|
||||
End Function
|
||||
|
||||
;Remove the first occurence of the given value from a list
|
||||
Function ListRemove(l.LList, Value)
|
||||
Local n.ListNode = ListFindNode(l, Value)
|
||||
If n <> Null Then RemoveListNode n
|
||||
End Function
|
||||
|
||||
;Remove a node from a list
|
||||
Function RemoveListNode(n.ListNode)
|
||||
n\pv_\nx_ = n\nx_
|
||||
n\nx_\pv_ = n\pv_
|
||||
Delete n
|
||||
End Function
|
||||
|
||||
;Return the value of the element at the given position from the start of the list,
|
||||
;or backwards from the end of the list for a negative index
|
||||
Function ValueAtIndex(l.LList, index)
|
||||
Local n.ListNode = ListNodeAtIndex(l, index)
|
||||
If n <> Null Then Return n\Value : Else Return 0
|
||||
End Function
|
||||
|
||||
;Return the ListNode at the given position from the start of the list, or backwards
|
||||
;from the end of the list for a negative index, or Null if invalid
|
||||
Function ListNodeAtIndex.ListNode(l.LList, index)
|
||||
Local e, n.ListNode
|
||||
|
||||
If index >= 0
|
||||
n = l\head_
|
||||
For e = 0 To index
|
||||
n = n\nx_
|
||||
Next
|
||||
If n = l\tail_ Then n = Null ;Beyond the end of the list - not valid
|
||||
|
||||
Else ;Negative index - count backward
|
||||
n = l\tail_
|
||||
For e = 0 To index Step -1
|
||||
n = n\pv_
|
||||
Next
|
||||
If n = l\head_ Then n = Null ;Before the start of the list - not valid
|
||||
|
||||
EndIf
|
||||
|
||||
Return n
|
||||
End Function
|
||||
|
||||
;Replace a value at the given position (added by MusicianKool)
|
||||
Function ReplaceValueAtIndex(l.LList,index,value)
|
||||
Local n.ListNode = ListNodeAtIndex(l,index)
|
||||
If n <> Null Then n\Value = value:Else Return 0
|
||||
End Function
|
||||
|
||||
;Remove and return a value at the given position (added by MusicianKool)
|
||||
Function RemoveNodeAtIndex(l.LList,index)
|
||||
Local n.ListNode = ListNodeAtIndex(l,index),tval
|
||||
If n <> Null Then tval = n\Value:RemoveListNode(n):Return tval:Else Return 0
|
||||
End Function
|
||||
|
||||
;Retrieve the first value from a list
|
||||
Function ListFirst(l.LList)
|
||||
If l\head_\nx_ <> l\tail_ Then Return l\head_\nx_\Value
|
||||
End Function
|
||||
|
||||
;Retrieve the last value from a list
|
||||
Function ListLast(l.LList)
|
||||
If l\tail_\pv_ <> l\head_ Then Return l\tail_\pv_\Value
|
||||
End Function
|
||||
|
||||
;Remove the first element from a list, and return its value
|
||||
Function ListRemoveFirst(l.LList)
|
||||
Local val
|
||||
If l\head_\nx_ <> l\tail_
|
||||
val = l\head_\nx_\Value
|
||||
RemoveListNode l\head_\nx_
|
||||
EndIf
|
||||
Return val
|
||||
End Function
|
||||
|
||||
;Remove the last element from a list, and return its value
|
||||
Function ListRemoveLast(l.LList)
|
||||
Local val
|
||||
If l\tail_\pv_ <> l\head_
|
||||
val = l\tail_\pv_\Value
|
||||
RemoveListNode l\tail_\pv_
|
||||
EndIf
|
||||
Return val
|
||||
End Function
|
||||
|
||||
;Insert a value into a list before the specified node, and return the new node
|
||||
Function InsertBeforeNode.ListNode(Value, n.ListNode)
|
||||
Local bef.ListNode = New ListNode
|
||||
|
||||
bef\pv_ = n\pv_
|
||||
bef\nx_ = n
|
||||
bef\Value = Value
|
||||
|
||||
n\pv_ = bef
|
||||
bef\pv_\nx_ = bef
|
||||
|
||||
Return bef
|
||||
End Function
|
||||
|
||||
;Insert a value into a list after the specified node, and return then new node
|
||||
Function InsertAfterNode.ListNode(Value, n.ListNode)
|
||||
Local aft.ListNode = New ListNode
|
||||
|
||||
aft\nx_ = n\nx_
|
||||
aft\pv_ = n
|
||||
aft\Value = Value
|
||||
|
||||
n\nx_ = aft
|
||||
aft\nx_\pv_ = aft
|
||||
|
||||
Return aft
|
||||
End Function
|
||||
|
||||
;Get an iterator object to use with a loop
|
||||
;This function means that most programs won't have to think about deleting iterators manually
|
||||
;(in general only a small, constant number will be created)
|
||||
Function GetIterator.Iterator(l.LList)
|
||||
Local i.Iterator
|
||||
|
||||
If l = Null Then RuntimeError "Cannot create Iterator for Null"
|
||||
|
||||
For i = Each Iterator ;See if there's an available iterator at the moment
|
||||
If i\l_ = Null Then Exit
|
||||
Next
|
||||
|
||||
If i = Null Then i = New Iterator ;If there wasn't, create one
|
||||
|
||||
i\l_ = l
|
||||
i\cn_ = l\head_
|
||||
i\cni_ = -1
|
||||
i\Value = 0 ;No especial reason why this has to be anything, but meh
|
||||
|
||||
Return i
|
||||
End Function
|
||||
|
||||
;Use as the argument to While to iterate over the members of a list
|
||||
Function EachIn(i.Iterator)
|
||||
|
||||
i\cn_ = i\cn_\nx_
|
||||
|
||||
If i\cn_ <> i\l_\tail_ ;Still items in the list
|
||||
i\Value = i\cn_\Value
|
||||
i\cni_ = i\cni_ + 1
|
||||
Return True
|
||||
|
||||
Else
|
||||
i\l_ = Null ;Disconnect from the list, having reached the end
|
||||
i\cn_ = Null
|
||||
i\cni_ = -1
|
||||
Return False
|
||||
|
||||
EndIf
|
||||
End Function
|
||||
|
||||
;Remove from the containing list the element currently pointed to by an iterator
|
||||
Function IteratorRemove(i.Iterator)
|
||||
If (i\cn_ <> i\l_\head_) And (i\cn_ <> i\l_\tail_)
|
||||
Local temp.ListNode = i\cn_
|
||||
|
||||
i\cn_ = i\cn_\pv_
|
||||
i\cni_ = i\cni_ - 1
|
||||
i\Value = 0
|
||||
|
||||
RemoveListNode temp
|
||||
|
||||
Return True
|
||||
Else
|
||||
Return False
|
||||
EndIf
|
||||
End Function
|
||||
|
||||
;Call this before breaking out of an EachIn loop, to disconnect the iterator from the list
|
||||
Function IteratorBreak(i.Iterator)
|
||||
i\l_ = Null
|
||||
i\cn_ = Null
|
||||
i\cni_ = -1
|
||||
i\Value = 0
|
||||
End Function
|
||||
|
||||
|
||||
;~IDEal Editor Parameters:
|
||||
;~F#5#A#10#18#2A#32#3E#47#4C#58#66#6F#78#8F#9B#A9#B7#BD#C5#CC
|
||||
;~F#E3#E9#EF#F4#F9#103#10D#11B#12B#13F#152#163
|
||||
;~C#Blitz3D
|
||||
66
samples/BlitzBasic/PObj.bb
Normal file
66
samples/BlitzBasic/PObj.bb
Normal file
@@ -0,0 +1,66 @@
|
||||
|
||||
Local i, start, result
|
||||
|
||||
Local s.Sum3Obj = New Sum3Obj
|
||||
|
||||
For i = 1 To 100000
|
||||
s = New Sum3Obj
|
||||
result = Handle Before s
|
||||
Delete s
|
||||
Next
|
||||
|
||||
start = MilliSecs()
|
||||
For i = 1 To 1000000
|
||||
result = Sum3_(MakeSum3Obj(i, i, i))
|
||||
Next
|
||||
start = MilliSecs() - start
|
||||
Print start
|
||||
|
||||
start = MilliSecs()
|
||||
For i = 1 To 1000000
|
||||
result = Sum3(i, i, i)
|
||||
Next
|
||||
start = MilliSecs() - start
|
||||
Print start
|
||||
|
||||
WaitKey
|
||||
End
|
||||
|
||||
|
||||
Function Sum3(a, b, c)
|
||||
Return a + b + c
|
||||
End Function
|
||||
|
||||
|
||||
Type Sum3Obj
|
||||
Field isActive
|
||||
Field a, b, c
|
||||
End Type
|
||||
|
||||
Function MakeSum3Obj(a, b, c)
|
||||
Local s.Sum3Obj = Last Sum3Obj
|
||||
If s\isActive Then s = New Sum3Obj
|
||||
s\isActive = True
|
||||
s\a = a
|
||||
s\b = b
|
||||
s\c = c
|
||||
|
||||
Restore label
|
||||
Read foo
|
||||
|
||||
Return Handle(s)
|
||||
End Function
|
||||
|
||||
.label
|
||||
Data (10 + 2), 12, 14
|
||||
:
|
||||
Function Sum3_(a_)
|
||||
Local a.Sum3Obj = Object.Sum3Obj a_
|
||||
Local return_ = a\a + a\b + a\c
|
||||
Insert a Before First Sum3Obj :: a\isActive = False
|
||||
Return return_
|
||||
End Function
|
||||
|
||||
|
||||
;~IDEal Editor Parameters:
|
||||
;~C#Blitz3D
|
||||
Reference in New Issue
Block a user