mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
Add Pep8 Assembly language (#2070)
Pep/8 is a toy assembly language used in some universities for teaching the basics of assembly and low-level programming. Signed-off-by: Lucas Bajolet <lucas.bajolet@gmail.com>
This commit is contained in:
committed by
Colin Seymour
parent
acbab53198
commit
ded651159d
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -839,3 +839,6 @@
|
|||||||
[submodule "vendor/grammars/language-jolie"]
|
[submodule "vendor/grammars/language-jolie"]
|
||||||
path = vendor/grammars/language-jolie
|
path = vendor/grammars/language-jolie
|
||||||
url = https://github.com/fmontesi/language-jolie
|
url = https://github.com/fmontesi/language-jolie
|
||||||
|
[submodule "vendor/grammars/Sublime-Pep8"]
|
||||||
|
path = vendor/grammars/Sublime-Pep8
|
||||||
|
url = https://github.com/R4PaSs/Sublime-Pep8
|
||||||
|
|||||||
@@ -100,6 +100,8 @@ vendor/grammars/Sublime-Modula-2:
|
|||||||
- source.modula2
|
- source.modula2
|
||||||
vendor/grammars/Sublime-Nit:
|
vendor/grammars/Sublime-Nit:
|
||||||
- source.nit
|
- source.nit
|
||||||
|
vendor/grammars/Sublime-Pep8/:
|
||||||
|
- source.pep8
|
||||||
vendor/grammars/Sublime-QML:
|
vendor/grammars/Sublime-QML:
|
||||||
- source.qml
|
- source.qml
|
||||||
vendor/grammars/Sublime-REBOL:
|
vendor/grammars/Sublime-REBOL:
|
||||||
|
|||||||
@@ -3160,6 +3160,14 @@ Pascal:
|
|||||||
codemirror_mode: pascal
|
codemirror_mode: pascal
|
||||||
codemirror_mime_type: text/x-pascal
|
codemirror_mime_type: text/x-pascal
|
||||||
language_id: 281
|
language_id: 281
|
||||||
|
Pep8:
|
||||||
|
type: programming
|
||||||
|
color: "#C76F5B"
|
||||||
|
extensions:
|
||||||
|
- ".pep"
|
||||||
|
ace_mode: text
|
||||||
|
tm_scope: source.pep8
|
||||||
|
language_id: 840372442
|
||||||
Perl:
|
Perl:
|
||||||
type: programming
|
type: programming
|
||||||
tm_scope: source.perl
|
tm_scope: source.perl
|
||||||
|
|||||||
34
samples/Pep8/div.pep
Normal file
34
samples/Pep8/div.pep
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
main: SUBSP 8, i
|
||||||
|
DECI 0, s
|
||||||
|
DECI 2, s
|
||||||
|
CALL div
|
||||||
|
DECO 4, s
|
||||||
|
CHARO '\n', i
|
||||||
|
DECO 6, s
|
||||||
|
CHARO '\n', i
|
||||||
|
STOP
|
||||||
|
|
||||||
|
; Divides two numbers following the euclidian method
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; SP + 2: Dividend
|
||||||
|
; SP + 4: Divider
|
||||||
|
; Returns:
|
||||||
|
; SP + 6: Quotient
|
||||||
|
; SP + 8: Remain
|
||||||
|
div: LDX 0, i
|
||||||
|
LDA dividend, s
|
||||||
|
divlp: CPA divider, s
|
||||||
|
BRLT divout
|
||||||
|
ADDX 1, i
|
||||||
|
SUBA divider, s
|
||||||
|
BR divlp
|
||||||
|
divout: STX quot, s
|
||||||
|
STA rem, s
|
||||||
|
RET0
|
||||||
|
dividend: .EQUATE 2
|
||||||
|
divider: .EQUATE 4
|
||||||
|
quot: .EQUATE 6
|
||||||
|
rem: .EQUATE 8
|
||||||
|
|
||||||
|
.END
|
||||||
23
samples/Pep8/flag.pep
Normal file
23
samples/Pep8/flag.pep
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
_start: LDA 0,i
|
||||||
|
LDX 0,i
|
||||||
|
LDA 20, i
|
||||||
|
ADDA 51, i
|
||||||
|
CPA 0,i
|
||||||
|
BRLT s3
|
||||||
|
BR s4
|
||||||
|
s1: LDBYTEA s3, x
|
||||||
|
NOTA
|
||||||
|
STBYTEA s3, x
|
||||||
|
ADDX 1,i
|
||||||
|
CPX 12, i
|
||||||
|
BRNE s1
|
||||||
|
s2: STOP
|
||||||
|
s4: LDA 31, d
|
||||||
|
LDX 50, d
|
||||||
|
RET0
|
||||||
|
STOP
|
||||||
|
s3: CPX -27746, d
|
||||||
|
ANDX -8241, i
|
||||||
|
SUBA -12337, sxf
|
||||||
|
LDX -12289, sx
|
||||||
|
.END
|
||||||
675
samples/Pep8/linked.pep
Normal file
675
samples/Pep8/linked.pep
Normal file
@@ -0,0 +1,675 @@
|
|||||||
|
; Linked list of integers API
|
||||||
|
;
|
||||||
|
; Contains the basis of the structure and a
|
||||||
|
; variety of available functions to call on it.
|
||||||
|
;
|
||||||
|
; Calling conventions:
|
||||||
|
;
|
||||||
|
; - When the number of arguments is <= 2, the fastcall convention will be used:
|
||||||
|
; Arguments will be passed by registers, no assumption is made concerning the
|
||||||
|
; state of the registers during execution, they will need to be saved.
|
||||||
|
;
|
||||||
|
; - When the number of arguments exceeds 2, the cdecl convention will be used:
|
||||||
|
; Arguments will be passed on the stack, no assumption is made concerning the
|
||||||
|
; state of the registers during execution, they will need to be saved.
|
||||||
|
|
||||||
|
; Simple test program, do no include when using the library
|
||||||
|
main: SUBSP 4, i
|
||||||
|
DECI mnelmt, s
|
||||||
|
CALL newlst
|
||||||
|
LDX mnlst, s
|
||||||
|
CALL lstgetst
|
||||||
|
LDX mnlst, s
|
||||||
|
CALL lstsetst
|
||||||
|
LDX mnlst, s
|
||||||
|
CALL lstgetst
|
||||||
|
LDX mnlst, s
|
||||||
|
CALL shftest
|
||||||
|
LDX mnlst, s
|
||||||
|
CALL ushftest
|
||||||
|
LDX mnlst, s
|
||||||
|
CALL shftest
|
||||||
|
ADDSP 4, i
|
||||||
|
STOP
|
||||||
|
; Pointer to the list
|
||||||
|
mnlst: .EQUATE 0
|
||||||
|
; Element read
|
||||||
|
mnelmt: .EQUATE 2
|
||||||
|
|
||||||
|
; TESTS
|
||||||
|
|
||||||
|
; Simple test for the get operation
|
||||||
|
; Gets the first element of the list and prints it
|
||||||
|
;
|
||||||
|
; REQUIRES: Non-empty list
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - X: Pointer to the list
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; void
|
||||||
|
lstgetst: SUBSP 2, i
|
||||||
|
LDA 0, i
|
||||||
|
CALL lstget
|
||||||
|
STA 0, s
|
||||||
|
DECO 0, s
|
||||||
|
CHARO '\n', i
|
||||||
|
ADDSP 2, i
|
||||||
|
RET0
|
||||||
|
|
||||||
|
; Test for the set operation
|
||||||
|
; Sets the first element of the list to a given value
|
||||||
|
; The value is read from stdin
|
||||||
|
;
|
||||||
|
; REQUIRES: Non-empty list
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - X: Pointer to the list
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; void
|
||||||
|
lstsetst: SUBSP 6, i
|
||||||
|
STX 0, s
|
||||||
|
DECI 4, s
|
||||||
|
LDA 0, i
|
||||||
|
STA 2, s
|
||||||
|
CALL lstset
|
||||||
|
ADDSP 6, i
|
||||||
|
RET0
|
||||||
|
|
||||||
|
; Tests shift operation on a list
|
||||||
|
; Gets the last element of the list and prints it
|
||||||
|
;
|
||||||
|
; REQUIRES: Non-empty list
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - X: Pointer to the list
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; void
|
||||||
|
shftest: SUBSP 2, i
|
||||||
|
CALL lstshft
|
||||||
|
STA 0, s
|
||||||
|
DECO 0, s
|
||||||
|
CHARO '\n', i
|
||||||
|
ADDSP 2, i
|
||||||
|
RET0
|
||||||
|
|
||||||
|
; Tests unshift operation on a list
|
||||||
|
; Unshifts a new element read from keyboard
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - X: Pointer to the list
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; void
|
||||||
|
ushftest: SUBSP 2, i
|
||||||
|
DECI 0, s
|
||||||
|
LDA 0, s
|
||||||
|
CALL lstunshf
|
||||||
|
ADDSP 2, i
|
||||||
|
RET0
|
||||||
|
|
||||||
|
; LIBRARY
|
||||||
|
|
||||||
|
; Creates a new list with `element` as head
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; SP + 4: Element
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; SP + 2: Pointer to the list
|
||||||
|
newlst: LDA lstlen, i
|
||||||
|
CALL new
|
||||||
|
STX 2, s
|
||||||
|
CALL newnode
|
||||||
|
SUBSP 2, i
|
||||||
|
STX 0, s
|
||||||
|
LDX nodeelmt, i
|
||||||
|
LDA 6, s
|
||||||
|
STA 0, sxf
|
||||||
|
LDA 0, s
|
||||||
|
LDX lsthead, i
|
||||||
|
STA 4, sxf
|
||||||
|
ADDSP 2, i
|
||||||
|
RET0
|
||||||
|
|
||||||
|
; Gets a node at specified index in a list
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - A: Index
|
||||||
|
; - X: Pointer to the list
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - A: Error code (0 if no error was produced)
|
||||||
|
; - X: Pointer to the node
|
||||||
|
;
|
||||||
|
; Errors:
|
||||||
|
; -1: Index < 0
|
||||||
|
; -2: Index >= list.length
|
||||||
|
nodeat: SUBSP 10, i
|
||||||
|
STA ndaind, s
|
||||||
|
STX ndalst, s
|
||||||
|
LDX lsthead, i
|
||||||
|
LDA ndalst, sxf
|
||||||
|
STA ndanode, s
|
||||||
|
LDA ndaind, s
|
||||||
|
CPA 0, i
|
||||||
|
LDA 0, i
|
||||||
|
STA ndacurri, s
|
||||||
|
BRGE ndagez
|
||||||
|
LDA -1, i
|
||||||
|
ADDSP 10, i
|
||||||
|
RET0
|
||||||
|
ndagez: LDX ndalst, s
|
||||||
|
CALL listlen
|
||||||
|
STA ndalstln, s
|
||||||
|
LDA ndaind, s
|
||||||
|
CPA ndalstln, s
|
||||||
|
BRLT ndalp
|
||||||
|
LDA -2, i
|
||||||
|
ADDSP 10, i
|
||||||
|
RET0
|
||||||
|
ndalp: LDA ndacurri, s
|
||||||
|
CPA ndaind, s
|
||||||
|
BREQ ndaout
|
||||||
|
LDX nodenxt, i
|
||||||
|
LDA ndanode, sxf
|
||||||
|
STA ndanode, s
|
||||||
|
LDA ndacurri, s
|
||||||
|
ADDA 1, i
|
||||||
|
STA ndacurri, s
|
||||||
|
BR ndalp
|
||||||
|
ndaout: LDX ndanode, s
|
||||||
|
LDA 0, i
|
||||||
|
ADDSP 10, i
|
||||||
|
RET0
|
||||||
|
ndaind: .EQUATE 0
|
||||||
|
ndanode: .EQUATE 2
|
||||||
|
ndalst: .EQUATE 4
|
||||||
|
ndalstln: .EQUATE 6
|
||||||
|
ndacurri: .EQUATE 8
|
||||||
|
|
||||||
|
; Length of the list passed as a parameter
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - X: List
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - A: Length
|
||||||
|
listlen: SUBSP 4, i
|
||||||
|
STX lenode, s
|
||||||
|
LDX lenode, sf
|
||||||
|
STX lenode, s
|
||||||
|
LDA 0, i
|
||||||
|
STA lencpt, s
|
||||||
|
llenlp: LDA lenode, s
|
||||||
|
CPA 0, i
|
||||||
|
BREQ lenout
|
||||||
|
LDA lencpt, s
|
||||||
|
ADDA 1, i
|
||||||
|
STA lencpt, s
|
||||||
|
LDX nodenxt, i
|
||||||
|
LDA lenode, sxf
|
||||||
|
STA lenode, s
|
||||||
|
BR llenlp
|
||||||
|
lenout: LDA lencpt, s
|
||||||
|
ADDSP 4, i
|
||||||
|
RET0
|
||||||
|
lenode: .EQUATE 0
|
||||||
|
lencpt: .EQUATE 2
|
||||||
|
|
||||||
|
; Gets an element in a list at a specified index
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - A: Index
|
||||||
|
; - X: Address of the list
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - A: Element value
|
||||||
|
;
|
||||||
|
; Error:
|
||||||
|
; If out of bounds, prints an error message and stops the program
|
||||||
|
lstget: SUBSP 2, i
|
||||||
|
STA 0, s
|
||||||
|
CALL nodeat
|
||||||
|
CPA 0, i
|
||||||
|
BRNE getoob
|
||||||
|
LDA 0, x
|
||||||
|
ADDSP 2, i
|
||||||
|
RET0
|
||||||
|
; Out of bounds
|
||||||
|
getoob: STRO getstrob, d
|
||||||
|
DECO 0, s
|
||||||
|
CHARO '\n', i
|
||||||
|
STOP
|
||||||
|
; String for out of bounds error
|
||||||
|
getstrob: .ASCII "Invalid index on get, index = \x00"
|
||||||
|
|
||||||
|
; Sets an element in a list at a specified index to a new value
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - SP + 2: Pointer to the list
|
||||||
|
; - SP + 4: Index
|
||||||
|
; - SP + 6: Element
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - A: 0 if all went well, an error code otherwise (analogous to the error codes in nodeat)
|
||||||
|
lstset: CHARO '\n', i
|
||||||
|
DECO lstsetlp, s
|
||||||
|
CHARO ' ', i
|
||||||
|
DECO lstsetin, s
|
||||||
|
CHARO ' ', i
|
||||||
|
DECO lstsetel, s
|
||||||
|
CHARO '\n', i
|
||||||
|
SUBSP 2, i
|
||||||
|
LDX lstsetlp, s
|
||||||
|
LDA lstsetin, s
|
||||||
|
CALL nodeat
|
||||||
|
CPA 0, i
|
||||||
|
BRNE lstsetrt
|
||||||
|
STX lstsetnp, s
|
||||||
|
LDA lstsetel, s
|
||||||
|
LDX nodeelmt, i
|
||||||
|
STA lstsetnp, sxf
|
||||||
|
LDA 0, i
|
||||||
|
lstsetrt: ADDSP 2, i
|
||||||
|
RET0
|
||||||
|
; Pointer to the list
|
||||||
|
lstsetlp: .EQUATE 4
|
||||||
|
; Element to set the value at
|
||||||
|
lstsetel: .EQUATE 8
|
||||||
|
; Index of the node
|
||||||
|
lstsetin: .EQUATE 6
|
||||||
|
; Pointer to the node
|
||||||
|
lstsetnp: .EQUATE 0
|
||||||
|
|
||||||
|
; Removes the first element of the list in parameter and returns its value
|
||||||
|
;
|
||||||
|
; REQUIRES: Non-empty list
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; ⁻ X: Pointer to the list
|
||||||
|
;
|
||||||
|
; Returns :
|
||||||
|
; - A: Element removed
|
||||||
|
lstshft: SUBSP 8, i
|
||||||
|
STX lshflp, s
|
||||||
|
LDX lsthead, i
|
||||||
|
LDA lshflp, sxf
|
||||||
|
CPA 0, i
|
||||||
|
BREQ shfterr
|
||||||
|
STA lshfohd, s
|
||||||
|
LDX nodenxt, i
|
||||||
|
LDA lshfohd, sxf
|
||||||
|
STA lshfnhd, s
|
||||||
|
LDX lsthead, i
|
||||||
|
STA lshflp, sxf
|
||||||
|
LDX nodeelmt, i
|
||||||
|
LDA lshfohd, sxf
|
||||||
|
ADDSP 8, i
|
||||||
|
RET0
|
||||||
|
shfterr: STRO shfterrm, d
|
||||||
|
STOP
|
||||||
|
; Pointer to the list
|
||||||
|
lshflp: .EQUATE 0
|
||||||
|
; Pointer to the old head
|
||||||
|
lshfohd: .EQUATE 2
|
||||||
|
; Old head's element
|
||||||
|
lshfhdel: .EQUATE 4
|
||||||
|
; Pointer to the new head
|
||||||
|
lshfnhd: .EQUATE 6
|
||||||
|
; Error message on shift
|
||||||
|
shfterrm: .ASCII "Cannot do shift on empty list.\n\x00"
|
||||||
|
|
||||||
|
; Inserts a new element at the beginning of a list
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - X: Pointer to the list
|
||||||
|
; - A: Element to add to the list
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - A: Error code, 0 if all right, a code otherwise
|
||||||
|
lstunshf: SUBSP 8, i
|
||||||
|
STA lunshelm, s
|
||||||
|
STX lunslp, s
|
||||||
|
CALL newnode
|
||||||
|
STX lunsnhd, s
|
||||||
|
LDX lsthead, i
|
||||||
|
LDA lunslp, sxf
|
||||||
|
STA lunsohd, s
|
||||||
|
LDX nodenxt, i
|
||||||
|
LDA lunsohd, s
|
||||||
|
STA lunsnhd, sxf
|
||||||
|
LDA lunshelm, s
|
||||||
|
LDX nodeelmt, i
|
||||||
|
STA lunsohd, sxf
|
||||||
|
LDX lsthead, i
|
||||||
|
LDA lunsnhd, s
|
||||||
|
STA lunslp, sxf
|
||||||
|
ADDSP 8, i
|
||||||
|
RET0
|
||||||
|
; Pointer to the list
|
||||||
|
lunslp: .EQUATE 0
|
||||||
|
; Pointer to the old head
|
||||||
|
lunsohd: .EQUATE 2
|
||||||
|
; Pointer to the new head
|
||||||
|
lunsnhd: .EQUATE 4
|
||||||
|
; Element to add
|
||||||
|
lunshelm: .EQUATE 6
|
||||||
|
|
||||||
|
; Finds whether or not an element is present in a list
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - X: Pointer to the list
|
||||||
|
; - A: Element to be found
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - A: 0 if element was not found, 1 if it was
|
||||||
|
lstfnd: SUBSP 6, i
|
||||||
|
STX lstfndlp, s
|
||||||
|
STA lstfndel, s
|
||||||
|
LDX lsthead, i
|
||||||
|
LDA lstfndlp, sxf
|
||||||
|
STA lstfndnd, s
|
||||||
|
fndloop: CPA 0, i
|
||||||
|
BREQ notfnd
|
||||||
|
LDX nodeelmt, i
|
||||||
|
LDA lstfndnd, sxf
|
||||||
|
CPA lstfndel, s
|
||||||
|
BREQ found
|
||||||
|
LDX nodenxt, i
|
||||||
|
LDA lstfndnd, sxf
|
||||||
|
STA lstfndnd, s
|
||||||
|
BR fndloop
|
||||||
|
notfnd: LDA 0, i
|
||||||
|
ADDSP 6, i
|
||||||
|
RET0
|
||||||
|
found: LDA 1, i
|
||||||
|
ADDSP 6, i
|
||||||
|
RET0
|
||||||
|
; Pointer to the list
|
||||||
|
lstfndlp: .EQUATE 0
|
||||||
|
; Element to search
|
||||||
|
lstfndel: .EQUATE 2
|
||||||
|
; Current node
|
||||||
|
lstfndnd: .EQUATE 4
|
||||||
|
|
||||||
|
; Pushes a new element at the end of the list
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - X: Pointer to the list
|
||||||
|
; - A: Element to push
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - A: 0 if all went well, an error code otherwise
|
||||||
|
lstpsh: SUBSP 8, i
|
||||||
|
STX lpshlp, s
|
||||||
|
STA lpshel, s
|
||||||
|
CALL newnode
|
||||||
|
STX lpshnd, s
|
||||||
|
LDX lpshlp, s
|
||||||
|
CALL listlen
|
||||||
|
CPA 0, i
|
||||||
|
BREQ lpshshft
|
||||||
|
SUBA 1, i
|
||||||
|
LDX lpshlp, s
|
||||||
|
CALL nodeat
|
||||||
|
STX lpshlnd, s
|
||||||
|
LDX nodenxt, i
|
||||||
|
LDA lpshnd, s
|
||||||
|
STA lpshlnd, sxf
|
||||||
|
LDA lpshel, s
|
||||||
|
LDX nodeelmt, i
|
||||||
|
STA lpshnd, sxf
|
||||||
|
ADDSP 8, i
|
||||||
|
RET0
|
||||||
|
lpshshft: LDX lpshlp, s
|
||||||
|
LDA lpshel, s
|
||||||
|
CALL lstunshf
|
||||||
|
ADDSP 8, i
|
||||||
|
RET0
|
||||||
|
; Pointer to the list
|
||||||
|
lpshlp: .EQUATE 0
|
||||||
|
; Element to add to the list
|
||||||
|
lpshel: .EQUATE 2
|
||||||
|
; Node to add to the list
|
||||||
|
lpshnd: .EQUATE 4
|
||||||
|
; Node to append
|
||||||
|
lpshlnd: .EQUATE 6
|
||||||
|
|
||||||
|
; Pops the last element of a list
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - X: Pointer to the list
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - A: Element removed from the list
|
||||||
|
lstpop: SUBSP 6, i
|
||||||
|
STX lpoplp, s
|
||||||
|
CALL listlen
|
||||||
|
CPA 0, i
|
||||||
|
BRNE poperrem
|
||||||
|
CPA 1, i
|
||||||
|
BREQ popshft
|
||||||
|
SUBA 2, i
|
||||||
|
LDX lpoplp, s
|
||||||
|
CALL nodeat
|
||||||
|
STX lpopndpr, s
|
||||||
|
LDX nodenxt, i
|
||||||
|
LDA lpopndpr, sxf
|
||||||
|
LDA 0, i
|
||||||
|
LDX nodenxt, i
|
||||||
|
STA lpopndpr, sxf
|
||||||
|
STA lpoplnd, s
|
||||||
|
LDX nodeelmt, i
|
||||||
|
LDA lpoplnd, s
|
||||||
|
ADDSP 6, i
|
||||||
|
RET0
|
||||||
|
poperrem: STRO poperrsm, d
|
||||||
|
STOP
|
||||||
|
popshft: LDX lpoplp, s
|
||||||
|
CALL lstshft
|
||||||
|
ADDSP 6, i
|
||||||
|
RET0
|
||||||
|
; Pointer to the list
|
||||||
|
lpoplp: .EQUATE 0
|
||||||
|
; Node to remove
|
||||||
|
lpoplnd: .EQUATE 2
|
||||||
|
;New last node
|
||||||
|
lpopndpr: .EQUATE 4
|
||||||
|
; Message to print when popping an empty list
|
||||||
|
poperrsm: .ASCII "Error: cannot pop an empty list.\n\x00"
|
||||||
|
|
||||||
|
; Inserts an element in a list at a given position
|
||||||
|
;
|
||||||
|
; REQUIRES: Non-empty list
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - SP + 2: Pointer to the list
|
||||||
|
; - SP + 4: Index to insert at
|
||||||
|
; - SP + 6: Element to add
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - A: Error code: 0 if all went well, -1 if index < 0, -2 if index > list.length
|
||||||
|
lstinsat: SUBSP 6, i
|
||||||
|
LDA lstinsid, s
|
||||||
|
CPA 0, i
|
||||||
|
BRLT lstinslz
|
||||||
|
BREQ lstinush
|
||||||
|
LDX lstinslp, s
|
||||||
|
CALL listlen
|
||||||
|
CPA lstinsel, s
|
||||||
|
BRLT lstinsgl
|
||||||
|
BREQ lstinpsh
|
||||||
|
LDX lstinslp, s
|
||||||
|
LDA lstinsel, s
|
||||||
|
SUBA 1, i
|
||||||
|
CALL nodeat
|
||||||
|
STX lstinsnd, s
|
||||||
|
LDX nodenxt, i
|
||||||
|
LDA lstinsnd, sxf
|
||||||
|
STA lstinscx, s
|
||||||
|
CALL newnode
|
||||||
|
STX lstinscn, s
|
||||||
|
LDX nodeelmt, i
|
||||||
|
LDA lstinsel, s
|
||||||
|
STA lstinscn, sxf
|
||||||
|
LDX nodenxt, i
|
||||||
|
LDA lstinscx, s
|
||||||
|
STA lstinscn, sxf
|
||||||
|
LDA lstinscn, s
|
||||||
|
LDX nodenxt, i
|
||||||
|
STA lstinsnd, sxf
|
||||||
|
ADDSP 6, i
|
||||||
|
RET0
|
||||||
|
lstinush: LDX lstinslp, s
|
||||||
|
LDA lstinsel, s
|
||||||
|
CALL lstunshf
|
||||||
|
ADDSP 6, i
|
||||||
|
RET0
|
||||||
|
lstinpsh: LDX lstinslp, s
|
||||||
|
LDA lstinsel, s
|
||||||
|
CALL lstpsh
|
||||||
|
ADDSP 6, i
|
||||||
|
RET0
|
||||||
|
; Insert with index < 0
|
||||||
|
lstinslz: LDA -1, i
|
||||||
|
ADDSP 6, i
|
||||||
|
RET0
|
||||||
|
; Insert with index > list.length
|
||||||
|
lstinsgl: LDA -2, i
|
||||||
|
ADDSP 6, i
|
||||||
|
RET0
|
||||||
|
; List pointer
|
||||||
|
lstinslp: .EQUATE 8
|
||||||
|
; Index of the newly created node
|
||||||
|
lstinsid: .EQUATE 10
|
||||||
|
; Element to add
|
||||||
|
lstinsel: .EQUATE 12
|
||||||
|
; Node to change the pointer to the next
|
||||||
|
lstinsnd: .EQUATE 0
|
||||||
|
; Node to insert
|
||||||
|
lstinscn: .EQUATE 2
|
||||||
|
; Pointer to the node after the created one (might be null)
|
||||||
|
lstinscx: .EQUATE 4
|
||||||
|
|
||||||
|
; Removes a node at a given index in a list,
|
||||||
|
; returns the element previously contained
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - X: Pointer to the list
|
||||||
|
; - A: Index of the element
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - A: Element removed
|
||||||
|
;
|
||||||
|
; Error:
|
||||||
|
; In case of error, the program aborts with an error message
|
||||||
|
lstremat: SUBSP 8, i
|
||||||
|
STX lremlp, s
|
||||||
|
STA lremid, s
|
||||||
|
CPA 0, i
|
||||||
|
BRLT lstremob
|
||||||
|
BREQ lstremz
|
||||||
|
CALL listlen
|
||||||
|
CPA lremid, s
|
||||||
|
BRGE lstremob
|
||||||
|
SUBA 1, i
|
||||||
|
CPA lremid, s
|
||||||
|
BREQ lrempop
|
||||||
|
LDA lremid, s
|
||||||
|
LDX lremlp, s
|
||||||
|
CALL nodeat
|
||||||
|
STX lremnd, s
|
||||||
|
LDA lremid, s
|
||||||
|
SUBA 1, i
|
||||||
|
LDX lremlp, s
|
||||||
|
CALL nodeat
|
||||||
|
STX lrempnd, s
|
||||||
|
LDX nodenxt, i
|
||||||
|
LDA lremnd, sxf
|
||||||
|
STA lrempnd, sxf
|
||||||
|
LDX nodeelmt, i
|
||||||
|
LDA lremnd, sxf
|
||||||
|
ADDSP 8, i
|
||||||
|
RET0
|
||||||
|
lstremz: LDX lremlp, s
|
||||||
|
CALL lstshft
|
||||||
|
ADDSP 8, i
|
||||||
|
RET0
|
||||||
|
lrempop: LDX lremlp, s
|
||||||
|
CALL lstpop
|
||||||
|
ADDSP 8, i
|
||||||
|
RET0
|
||||||
|
lstremob: STRO lremobst, d
|
||||||
|
DECO lremid, s
|
||||||
|
CHARO '\n', i
|
||||||
|
STOP
|
||||||
|
; Pointer to the list
|
||||||
|
lremlp: .EQUATE 0
|
||||||
|
; Index to remove an element at
|
||||||
|
lremid: .EQUATE 2
|
||||||
|
; Pointer to the node before the removed element
|
||||||
|
lrempnd: .EQUATE 4
|
||||||
|
; Pointer to the node to remove
|
||||||
|
lremnd: .EQUATE 6
|
||||||
|
; Error out of bounds string for remove_at
|
||||||
|
lremobst: .ASCII "Error: Out of bounds in remove_at, index = \x00"
|
||||||
|
|
||||||
|
; Creates a new node from scratch
|
||||||
|
; Sets its content to 0/NULL
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; void
|
||||||
|
;
|
||||||
|
; Return:
|
||||||
|
; - X: Address of the node
|
||||||
|
newnode: LDA nodeln, i
|
||||||
|
SUBSP 2, i
|
||||||
|
CALL new
|
||||||
|
STX 0, s
|
||||||
|
LDA 0, i
|
||||||
|
LDX nodenxt, i
|
||||||
|
STA 0, sxf
|
||||||
|
LDX nodeelmt, i
|
||||||
|
STA 0, sxf
|
||||||
|
LDX 0, s
|
||||||
|
ADDSP 2, i
|
||||||
|
RET0
|
||||||
|
|
||||||
|
; Allocates a new structure in the heap
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - A: Length of the structure to allocate (bytes)
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - X: Address of the allocated structure
|
||||||
|
new: ADDA hpptr, d
|
||||||
|
LDX hpptr, d
|
||||||
|
STA hpptr, d
|
||||||
|
RET0
|
||||||
|
|
||||||
|
; Node in a linked list
|
||||||
|
;
|
||||||
|
; Contains two fields:
|
||||||
|
; - Element: Offset 0
|
||||||
|
; - Next: Offset 2
|
||||||
|
;
|
||||||
|
nodeln: .EQUATE 4
|
||||||
|
nodeelmt: .EQUATE 0
|
||||||
|
nodenxt: .EQUATE 2
|
||||||
|
|
||||||
|
; Linked list capsule
|
||||||
|
;
|
||||||
|
; Contains one field:
|
||||||
|
; - Head: Offset 0
|
||||||
|
;
|
||||||
|
lstlen: .EQUATE 2
|
||||||
|
lsthead: .EQUATE 0
|
||||||
|
|
||||||
|
; Pointer to the next available byte on the heap
|
||||||
|
hpptr: .ADDRSS heap
|
||||||
|
; Start of the heap
|
||||||
|
heap: .BLOCK 1
|
||||||
|
.END
|
||||||
434
samples/Pep8/msq.pep
Normal file
434
samples/Pep8/msq.pep
Normal file
@@ -0,0 +1,434 @@
|
|||||||
|
; Reads a square from stdin, then computes whether it is a magic square or not.
|
||||||
|
;
|
||||||
|
; A Magic Square is a square following a specific set of rules, namely:
|
||||||
|
; - The sum of each row must be the same as the sum of the diagonal
|
||||||
|
; - The sum of the anti-diagonal must be the same as the sum of the diagonal
|
||||||
|
; - The sum of each column must be the same as the sum of the diagonal
|
||||||
|
;
|
||||||
|
; If any column, row, or anti-diagonal does not follow the aformented rules,
|
||||||
|
; the program will output its number to stdout.
|
||||||
|
;
|
||||||
|
; Columns are identified by a negative digit, ranging from -1 to -n
|
||||||
|
; The anti-diagonal is identified by the number 0.
|
||||||
|
; Finally, rows are identified by a positive integer, ranging from 1 to n.
|
||||||
|
;
|
||||||
|
; Formatting:
|
||||||
|
; First a number `n` is read from Stdin, it will determine the size of the square
|
||||||
|
; Then, enter the data for the square, `n` entries will be read
|
||||||
|
; The data is sequentially added to the square in memory, from the upper-left corner
|
||||||
|
; to the lower-right corner, in a zig-zag pattern
|
||||||
|
;
|
||||||
|
; Example:
|
||||||
|
; 3
|
||||||
|
; 4 9 3
|
||||||
|
; 3 5 7
|
||||||
|
; 8 1 6
|
||||||
|
;
|
||||||
|
; Limitation: Since there is no dynamic allocation, the size
|
||||||
|
; of the square is capped at a maximum of 32*32.
|
||||||
|
; Any size lower than 1 or higher than 32 will produce
|
||||||
|
; an error and the termination of the program.
|
||||||
|
|
||||||
|
;_start
|
||||||
|
DECI sidelen, d
|
||||||
|
LDA sidelen, d
|
||||||
|
CPA 1, i
|
||||||
|
BRLT sderror
|
||||||
|
CPA 32, i
|
||||||
|
BRGT sderror
|
||||||
|
LDX sidelen, d
|
||||||
|
CALL mult
|
||||||
|
STA sqlen, d
|
||||||
|
CALL fillsq
|
||||||
|
LDA sidelen, d
|
||||||
|
LDX square, i
|
||||||
|
CALL diagsum
|
||||||
|
STA dgsm, d
|
||||||
|
CALL colsums
|
||||||
|
LDA sidelen, d
|
||||||
|
LDX square, i
|
||||||
|
CALL cdiagsum
|
||||||
|
CPA dgsm, d
|
||||||
|
BREQ cnt
|
||||||
|
DECO 0, i
|
||||||
|
CHARO '\n', i
|
||||||
|
cnt: STA cdsm, d
|
||||||
|
CALL rowsums
|
||||||
|
STOP
|
||||||
|
el: .BLOCK 2
|
||||||
|
; Length of a side of the square
|
||||||
|
sidelen: .WORD 0
|
||||||
|
; Total length of the square
|
||||||
|
sqlen: .BLOCK 2
|
||||||
|
; 32 * 32 square of integers
|
||||||
|
square: .BLOCK 255
|
||||||
|
.BLOCK 255
|
||||||
|
.BLOCK 255
|
||||||
|
.BLOCK 255
|
||||||
|
.BLOCK 255
|
||||||
|
.BLOCK 255
|
||||||
|
.BLOCK 255
|
||||||
|
.BLOCK 255
|
||||||
|
.BLOCK 8
|
||||||
|
|
||||||
|
; Prints an error and terminates the program
|
||||||
|
sderror: STRO stderr, d
|
||||||
|
STOP
|
||||||
|
|
||||||
|
; Parameters: A: Size of a side of the square
|
||||||
|
; X: Base address of the square
|
||||||
|
; cscolid: Identifier of the column (0-based)
|
||||||
|
|
||||||
|
; Computes the sum of each column
|
||||||
|
; If the sum is not the same as dgsm, its index will be printed (in negative form)
|
||||||
|
;
|
||||||
|
; Parameters: A: Size of a side of the square
|
||||||
|
; X: Address of the square
|
||||||
|
;
|
||||||
|
; Return: void
|
||||||
|
colsums:STA clsmsqsz, d
|
||||||
|
STX clsmsqad, d
|
||||||
|
SUBA 1, i
|
||||||
|
STA clsmyp, d
|
||||||
|
clssmlp:CPA 0 ,i
|
||||||
|
BRLT clsmout
|
||||||
|
STA cscolid, d
|
||||||
|
LDA clsmsqsz, d
|
||||||
|
LDX clsmsqsz, d
|
||||||
|
CALL colsum
|
||||||
|
CPA dgsm, d
|
||||||
|
BREQ clsdecpt
|
||||||
|
LDX clsmyp, d
|
||||||
|
NEGX
|
||||||
|
STX clsmyp, d
|
||||||
|
DECO clsmyp, d
|
||||||
|
CHARO '\n', i
|
||||||
|
LDX clsmyp, d
|
||||||
|
NEGX
|
||||||
|
STX clsmyp, d
|
||||||
|
clsdecpt: LDA clsmyp, d
|
||||||
|
SUBA 1, i
|
||||||
|
STA clsmyp, d
|
||||||
|
BR clssmlp
|
||||||
|
clsmout: RET0
|
||||||
|
clsmsqad: .BLOCK 2
|
||||||
|
clsmsqsz: .BLOCK 2
|
||||||
|
clsmyp_: .BLOCK 2
|
||||||
|
|
||||||
|
; Compute the sum of each row
|
||||||
|
; Prints its index if the value does not match dgsum
|
||||||
|
;
|
||||||
|
; Parameters: A: Size of a side of the square
|
||||||
|
; X: Address of the square
|
||||||
|
;
|
||||||
|
; Returns: void
|
||||||
|
rowsums: STA maxrows, d
|
||||||
|
STX rowssqad, d
|
||||||
|
LDA 0, i
|
||||||
|
STA tmprwsm, d
|
||||||
|
STA rowid, d
|
||||||
|
rwsmslp: CPA maxrows, d
|
||||||
|
BRGE rwsmsout
|
||||||
|
STA rwxpos, d
|
||||||
|
LDA maxrows, d
|
||||||
|
LDX rowssqad, d
|
||||||
|
CALL rowsum
|
||||||
|
CPA dgsm, d
|
||||||
|
STA tmprwsm, d
|
||||||
|
BREQ rwinccpt
|
||||||
|
DECO rowid, d
|
||||||
|
CHARO '\n', i
|
||||||
|
rwinccpt: LDA rowid, d
|
||||||
|
ADDA 1, i
|
||||||
|
STA rowid, d
|
||||||
|
BR rwsmslp
|
||||||
|
rwsmsout: RET0
|
||||||
|
; Number of rows to compute
|
||||||
|
maxrows: .BLOCK 2
|
||||||
|
; Square address
|
||||||
|
rowssqad: .BLOCK 2
|
||||||
|
; Current rowid
|
||||||
|
rowid: .BLOCK 2
|
||||||
|
; Current rowsum
|
||||||
|
tmprwsm: .BLOCK 2
|
||||||
|
|
||||||
|
; Gets an element at the indexes given as parameter
|
||||||
|
; The square is supposed to contain only integers
|
||||||
|
; No check will be made on the correctness of the indexes
|
||||||
|
;
|
||||||
|
; Parameters: A: Size of a side of the square (in elements)
|
||||||
|
; X: Base address of the square
|
||||||
|
; xpos: Position in X for the element (0-indexed)
|
||||||
|
; ypos: Position in Y for the element (0-indexed)
|
||||||
|
;
|
||||||
|
; Return: A will contain the element
|
||||||
|
;
|
||||||
|
; Side-effects: Registers A and X will neither be saved nor restored upon call
|
||||||
|
; ypos will be altered
|
||||||
|
elemat: STX elsqaddr, d
|
||||||
|
ASLA
|
||||||
|
LDX xpos, d
|
||||||
|
CALL mult
|
||||||
|
STA xpos, d
|
||||||
|
LDX ypos, d
|
||||||
|
ASLX
|
||||||
|
STX ypos, d
|
||||||
|
ADDA ypos, d
|
||||||
|
ADDA elsqaddr, d
|
||||||
|
STA elsqaddr, d
|
||||||
|
LDX elsqaddr, d
|
||||||
|
LDA 0, x
|
||||||
|
RET0
|
||||||
|
; X-index in square (in elements)
|
||||||
|
xpos: .BLOCK 2
|
||||||
|
; Y-index in square (in elements)
|
||||||
|
ypos: .BLOCK 2
|
||||||
|
; Address to fetch elements at
|
||||||
|
elsqaddr: .BLOCK 2
|
||||||
|
|
||||||
|
; Fills the square with input from the user
|
||||||
|
;
|
||||||
|
; Pass via register A the number of inputs to be read
|
||||||
|
fillsq: LDX 0, i
|
||||||
|
filloop: SUBA 1, i
|
||||||
|
CPA 0, i
|
||||||
|
BRLT fillout
|
||||||
|
DECI square, x
|
||||||
|
ADDX 2, i
|
||||||
|
BR filloop
|
||||||
|
fillout: RET0
|
||||||
|
|
||||||
|
; Computes the sum of the digits of a column
|
||||||
|
; The square is supposed to contain integers only
|
||||||
|
;
|
||||||
|
; Parameters: A: Size of a side of the square
|
||||||
|
; X: Base address of the square
|
||||||
|
; cscolid: Identifier of the column (0-based)
|
||||||
|
;
|
||||||
|
; Return: A: Sum of the digits of the column
|
||||||
|
colsum: STA csclsqsz, d
|
||||||
|
STX csclsqad, d
|
||||||
|
LDA 0, i
|
||||||
|
STA csclsum, d
|
||||||
|
STA csclxpos, d
|
||||||
|
clsmloop: CPA csclsqsz, d
|
||||||
|
BRGE colout
|
||||||
|
LDA cscolid, d
|
||||||
|
STA ypos, d
|
||||||
|
LDA csclxpos, d
|
||||||
|
STA xpos, d
|
||||||
|
LDA csclsqsz, d
|
||||||
|
LDX csclsqad, d
|
||||||
|
CALL elemat
|
||||||
|
ADDA csclsum, d
|
||||||
|
STA csclsum, d
|
||||||
|
LDA csclxpos, d
|
||||||
|
ADDA 1, i
|
||||||
|
STA csclxpos, d
|
||||||
|
BR clsmloop
|
||||||
|
colout: LDA csclsum, d
|
||||||
|
RET0
|
||||||
|
; Identifier of the column which sum is to be computed
|
||||||
|
cscolid: .BLOCK 2
|
||||||
|
; Temporary for x position
|
||||||
|
csclxpos: .BLOCK 2
|
||||||
|
; Base address of the square
|
||||||
|
csclsqad: .BLOCK 2
|
||||||
|
; Size of a side of the square
|
||||||
|
csclsqsz: .BLOCK 2
|
||||||
|
; Sum of the column
|
||||||
|
csclsum: .BLOCK 2
|
||||||
|
|
||||||
|
; Computes the sum of the digits of a row
|
||||||
|
; The square is supposed to contain integers only
|
||||||
|
;
|
||||||
|
; Parameters: A: Size of a side of the square
|
||||||
|
; X: Base address of the square
|
||||||
|
; rwxpos: Row index (0-based)
|
||||||
|
;
|
||||||
|
; Returns: A: Sum of the digits of the row
|
||||||
|
rowsum: STA rwsqsz, d
|
||||||
|
STX rwbsqadr, d
|
||||||
|
LDA 0,i
|
||||||
|
STA rwsum, d
|
||||||
|
STA rwypos, d
|
||||||
|
rwsumlp: LDA rwypos, d
|
||||||
|
CPA rwsqsz, d
|
||||||
|
BRGE rwsumout
|
||||||
|
STA ypos, d
|
||||||
|
LDA rwxpos, d
|
||||||
|
STA xpos, d
|
||||||
|
LDA rwsqsz, d
|
||||||
|
LDX rwbsqadr, d
|
||||||
|
CALL elemat
|
||||||
|
ADDA rwsum, d
|
||||||
|
STA rwsum, d
|
||||||
|
LDA rwypos, d
|
||||||
|
ADDA 1, i
|
||||||
|
STA rwypos, d
|
||||||
|
BR rwsumlp
|
||||||
|
rwsumout: LDA rwsum, d
|
||||||
|
RET0
|
||||||
|
; Square size (in elements)
|
||||||
|
rwsqsz: .BLOCK 2
|
||||||
|
; Square base address
|
||||||
|
rwbsqadr: .BLOCK 2
|
||||||
|
; Position of the row to compute
|
||||||
|
rwxpos: .BLOCK 2
|
||||||
|
; Current column visited
|
||||||
|
rwypos: .BLOCK 2
|
||||||
|
; Sum of the row
|
||||||
|
rwsum: .BLOCK 2
|
||||||
|
|
||||||
|
; Computes the sum for the antidiagonal of a square
|
||||||
|
; The square is supposed to contain integers only
|
||||||
|
;
|
||||||
|
; Parameters: A: Size of a side of the square (elements)
|
||||||
|
; X: Base address of the square
|
||||||
|
;
|
||||||
|
; Returns: A: Sum of the antidiagonal
|
||||||
|
cdiagsum: STA cdsqsz, d
|
||||||
|
SUBA 1,i
|
||||||
|
STA cdtmpy, d
|
||||||
|
LDA 0, i
|
||||||
|
STA cdtmpx, d
|
||||||
|
STA cdsum, d
|
||||||
|
STX cdsqaddr, d
|
||||||
|
cdiaglp: LDA cdtmpx, d
|
||||||
|
STA xpos, d
|
||||||
|
LDA cdtmpy, d
|
||||||
|
STA ypos, d
|
||||||
|
CPA 0, i
|
||||||
|
BRLT cdout
|
||||||
|
LDA cdsqsz, d
|
||||||
|
LDX cdsqaddr, d
|
||||||
|
CALL elemat
|
||||||
|
ADDA cdsum, d
|
||||||
|
STA cdsum,d
|
||||||
|
LDA cdtmpx, d
|
||||||
|
ADDA 1, i
|
||||||
|
STA cdtmpx, d
|
||||||
|
LDA cdtmpy, d
|
||||||
|
SUBA 1, i
|
||||||
|
STA cdtmpy, d
|
||||||
|
BR cdiaglp
|
||||||
|
cdout: LDA cdsum, d
|
||||||
|
RET0
|
||||||
|
; Temporary handle for square size (elements)
|
||||||
|
cdsqsz: .BLOCK 2
|
||||||
|
; Square address
|
||||||
|
cdsqaddr: .BLOCK 2
|
||||||
|
; Keep x address
|
||||||
|
cdtmpx: .BLOCK 2
|
||||||
|
; Keep y address
|
||||||
|
cdtmpy: .BLOCK 2
|
||||||
|
; Sum of antidiagonal
|
||||||
|
cdsum: .BLOCK 2
|
||||||
|
|
||||||
|
; Computes the sum for the diagonal of a square
|
||||||
|
; The square is supposed to contain integers only
|
||||||
|
;
|
||||||
|
; Parameters: A: Size of a side of the square (elements)
|
||||||
|
; X: Base address of the square
|
||||||
|
;
|
||||||
|
; Returns: A: Sum of the diagonal
|
||||||
|
;
|
||||||
|
diagsum: STA dsqsz, d
|
||||||
|
STX dsqaddr, d
|
||||||
|
LDA 0, i
|
||||||
|
STA tmpsum, d
|
||||||
|
STA curra, d
|
||||||
|
dglp: CPA dsqsz, d
|
||||||
|
BRGE dglpout
|
||||||
|
STA xpos, d
|
||||||
|
STA ypos, d
|
||||||
|
LDA dsqsz, d
|
||||||
|
LDX dsqaddr, d
|
||||||
|
CALL elemat
|
||||||
|
ADDA tmpsum, d
|
||||||
|
STA tmpsum, d
|
||||||
|
LDA curra, d
|
||||||
|
ADDA 1, i
|
||||||
|
STA curra, d
|
||||||
|
BR dglp
|
||||||
|
dglpout: LDA tmpsum, d
|
||||||
|
RET0
|
||||||
|
; Address of the square
|
||||||
|
dsqaddr: .BLOCK 2
|
||||||
|
; Size of a side of the square (elements)
|
||||||
|
dsqsz: .BLOCK 2
|
||||||
|
; Current value of the x and y indexes
|
||||||
|
curra: .BLOCK 2
|
||||||
|
; Sum of the values
|
||||||
|
tmpsum: .BLOCK 2
|
||||||
|
|
||||||
|
; Muliplies two ints
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; Register A : Left part of the multiplication
|
||||||
|
; Register X : Right part of the multiplication
|
||||||
|
;
|
||||||
|
; Return:
|
||||||
|
; Register A : Result of the multiplication
|
||||||
|
;
|
||||||
|
; Side-effects:
|
||||||
|
; Uses multmp as a temporary value
|
||||||
|
mult: STA multmp, d
|
||||||
|
LDA 0, i
|
||||||
|
muloop: CPX 0, i
|
||||||
|
BRLE mulout
|
||||||
|
ADDA multmp, d
|
||||||
|
SUBX 1, i
|
||||||
|
BR muloop
|
||||||
|
mulout: RET0
|
||||||
|
; Temporary variable for mult function
|
||||||
|
; Holds the initial value of A
|
||||||
|
multmp: .WORD 0
|
||||||
|
|
||||||
|
; For debugging purposes
|
||||||
|
; Prints the content of the square to stdout
|
||||||
|
;
|
||||||
|
; Parameters: A: Size of a side
|
||||||
|
; X: Base address of square
|
||||||
|
;
|
||||||
|
; Side-effects:
|
||||||
|
; Consider variables sidesz, sqaddr, sqmaxa as local, they will be written
|
||||||
|
; Registers A and X will not be saved nor restored upon call
|
||||||
|
printsq: STA sidesz, d
|
||||||
|
STX sqaddr, d
|
||||||
|
LDX sidesz, d
|
||||||
|
CALL mult
|
||||||
|
ASLA
|
||||||
|
ADDA sqaddr, d
|
||||||
|
STA sqmaxa, d
|
||||||
|
LDX sqaddr, d
|
||||||
|
LDA 0, i
|
||||||
|
priloop: DECO 0, x
|
||||||
|
CHARO ' ', i
|
||||||
|
ADDX 2, i
|
||||||
|
CPX sqmaxa, d
|
||||||
|
BREQ priout
|
||||||
|
ADDA 1, i
|
||||||
|
CPA sidesz, d
|
||||||
|
BRLT priloop
|
||||||
|
LDA 0, i
|
||||||
|
CHARO '\n', i
|
||||||
|
BR priloop
|
||||||
|
priout: RET0
|
||||||
|
; Size of a side of the square
|
||||||
|
sidesz: .BLOCK 2
|
||||||
|
; Address of the square
|
||||||
|
sqaddr: .BLOCK 2
|
||||||
|
; Maximum address to iterate upon
|
||||||
|
sqmaxa: .BLOCK 2
|
||||||
|
|
||||||
|
; ------------------ GLOBALLY ACCESSIBLE SYMBOLS -------------------- ;
|
||||||
|
;
|
||||||
|
; Sum of the diagonal for the square
|
||||||
|
; Reference value for magic-square
|
||||||
|
dgsm: .WORD 0
|
||||||
|
; Sum of the counter-diagonal
|
||||||
|
cdsm: .WORD 0
|
||||||
|
; Input error string
|
||||||
|
stderr: .ASCII "A number between 1 and 32 (both inclusive) must be entered as value for the size of the square for the program to work.\n\x00"
|
||||||
|
.END
|
||||||
227
samples/Pep8/qsort.pep
Normal file
227
samples/Pep8/qsort.pep
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
; Sorts a statically defined array using the recursive implementation
|
||||||
|
; of the quicksort algorithm.
|
||||||
|
;
|
||||||
|
; In this implementation, the pivot is supposed to be the rightmost
|
||||||
|
; value of the slice of the array being sorted.
|
||||||
|
;
|
||||||
|
; Note that the code presented below should work on any array,
|
||||||
|
; whether defined statically or dynamically.
|
||||||
|
;
|
||||||
|
; Calling conventions:
|
||||||
|
; Except when mentionned otherwise, every parameter is to be passed on the stack.
|
||||||
|
; The return values are also on the stack.
|
||||||
|
; No assumption is to be made on the content of a register on a function call.
|
||||||
|
; The values of the registers are to be locally saved for further use if necessary.
|
||||||
|
main: SUBSP 4, i
|
||||||
|
LDA 11, i
|
||||||
|
ASLA
|
||||||
|
STA 2, s
|
||||||
|
LDA arr, i
|
||||||
|
STA 0, s
|
||||||
|
CALL printarr
|
||||||
|
SUBSP 2, i
|
||||||
|
LDA arr, i
|
||||||
|
STA 0, s
|
||||||
|
LDA 0, i
|
||||||
|
STA 2, s
|
||||||
|
LDA 10, i
|
||||||
|
STA 4, s
|
||||||
|
CALL qsort
|
||||||
|
ADDSP 2, i
|
||||||
|
CHARO '\n', i
|
||||||
|
LDA 11, i
|
||||||
|
ASLA
|
||||||
|
STA 2, s
|
||||||
|
LDA arr, i
|
||||||
|
STA 0, s
|
||||||
|
CALL printarr
|
||||||
|
STOP
|
||||||
|
|
||||||
|
; Sorts an array using the quicksort algorithm
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - SP + 2: Address of the array
|
||||||
|
; - SP + 4: Left bound
|
||||||
|
; - SP + 6: Right bound
|
||||||
|
; Returns:
|
||||||
|
; void
|
||||||
|
qsort: SUBSP 2, i
|
||||||
|
LDA qsarrlb, s
|
||||||
|
CPA qsarrrb, s
|
||||||
|
BRGE qsortout
|
||||||
|
SUBSP 6, i
|
||||||
|
LDA 10, s
|
||||||
|
STA 0, s
|
||||||
|
LDA 12, s
|
||||||
|
STA 2, s
|
||||||
|
LDA 14, s
|
||||||
|
STA 4, s
|
||||||
|
CALL part
|
||||||
|
LDA 10, s
|
||||||
|
STA 0, s
|
||||||
|
LDA 12, s
|
||||||
|
STA 2, s
|
||||||
|
LDA 6, s
|
||||||
|
SUBA 1, i
|
||||||
|
STA 4, s
|
||||||
|
CALL qsort
|
||||||
|
LDA 10, s
|
||||||
|
STA 0, s
|
||||||
|
LDA 6, s
|
||||||
|
ADDA 1, i
|
||||||
|
STA 2, s
|
||||||
|
LDA 14, s
|
||||||
|
STA 4, s
|
||||||
|
CALL qsort
|
||||||
|
ADDSP 6, i
|
||||||
|
qsortout: ADDSP 2, i
|
||||||
|
RET0
|
||||||
|
; Address of the array
|
||||||
|
qsarradd: .EQUATE 4
|
||||||
|
; Left bound
|
||||||
|
qsarrlb: .EQUATE 6
|
||||||
|
; Right bound
|
||||||
|
qsarrrb: .EQUATE 8
|
||||||
|
; Pivot value returned by the part command
|
||||||
|
qsortp: .EQUATE 0
|
||||||
|
|
||||||
|
; Partitions an array in two following the quicksort rules.
|
||||||
|
;
|
||||||
|
; All the lower values compared to the pivot will be on the left
|
||||||
|
; All the upper values compared to the pivot will be on the right
|
||||||
|
; The pivot's final index is then returned
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - SP + 2: Address of the array
|
||||||
|
; - SP + 4: Left bound
|
||||||
|
; - SP + 6: Right bound
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - SP + 8: Pivot final index
|
||||||
|
part: SUBSP 8, i
|
||||||
|
LDA parrrb, s
|
||||||
|
STA partpiv, s
|
||||||
|
LDA parrlb, s
|
||||||
|
STA pstind, s
|
||||||
|
STA piter, s
|
||||||
|
partflp: CPA parrrb, s
|
||||||
|
BRGE partout
|
||||||
|
LDX piter, s
|
||||||
|
ASLX
|
||||||
|
LDA paraddr, sxf
|
||||||
|
STA parrival, s
|
||||||
|
LDX partpiv, s
|
||||||
|
ASLX
|
||||||
|
LDA paraddr, sxf
|
||||||
|
CPA parrival, s
|
||||||
|
BRLT parlpinc
|
||||||
|
SUBSP 6, i ; Call swap(arr, i, st_index)
|
||||||
|
LDA 16, s
|
||||||
|
STA 0, s
|
||||||
|
LDA 8, s
|
||||||
|
STA 2, s
|
||||||
|
LDA 10, s
|
||||||
|
STA 4, s
|
||||||
|
CALL swap
|
||||||
|
ADDSP 6, i
|
||||||
|
LDA pstind, s
|
||||||
|
ADDA 1, i
|
||||||
|
STA pstind, s
|
||||||
|
parlpinc: LDA piter, s
|
||||||
|
ADDA 1, i
|
||||||
|
STA piter, s
|
||||||
|
BR partflp
|
||||||
|
partout: SUBSP 6, i ; Call swap(arr, piv, st_index)
|
||||||
|
LDA 16, s
|
||||||
|
STA 0, s
|
||||||
|
LDA 12, s
|
||||||
|
STA 2, s
|
||||||
|
LDA 10, s
|
||||||
|
STA 4, s
|
||||||
|
CALL swap
|
||||||
|
ADDSP 6, i
|
||||||
|
LDA pstind, s
|
||||||
|
ADDSP 8, i
|
||||||
|
STA 8, s
|
||||||
|
RET0
|
||||||
|
; Address of the array
|
||||||
|
paraddr: .EQUATE 10
|
||||||
|
; Left bound
|
||||||
|
parrlb: .EQUATE 12
|
||||||
|
; Right bound
|
||||||
|
parrrb: .EQUATE 14
|
||||||
|
; Pivot value
|
||||||
|
partpiv: .EQUATE 6
|
||||||
|
; st_index
|
||||||
|
pstind: .EQUATE 4
|
||||||
|
; For iterator value
|
||||||
|
piter: .EQUATE 2
|
||||||
|
; arr[i] value
|
||||||
|
parrival: .EQUATE 0
|
||||||
|
|
||||||
|
; Swaps the value of two elements of an array of integers
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - SP + 2: Address of the array
|
||||||
|
; - SP + 4: Index of the 1st element to swap
|
||||||
|
; - SP + 6: Index of the 2nd element to swap
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; void
|
||||||
|
swap: SUBSP 2, i
|
||||||
|
LDX fstelind, s
|
||||||
|
ASLX
|
||||||
|
LDA arraddr, sxf
|
||||||
|
STA swaptmp, s
|
||||||
|
LDX secelind, s
|
||||||
|
ASLX
|
||||||
|
LDA arraddr, sxf
|
||||||
|
LDX fstelind, s
|
||||||
|
ASLX
|
||||||
|
STA arraddr, sxf
|
||||||
|
LDA swaptmp, s
|
||||||
|
LDX secelind, s
|
||||||
|
ASLX
|
||||||
|
STA arraddr, sxf
|
||||||
|
ADDSP 2, i
|
||||||
|
RET0
|
||||||
|
; Temporary value for the swap
|
||||||
|
swaptmp: .EQUATE 0
|
||||||
|
; Address of the array on which the swap is done
|
||||||
|
arraddr: .EQUATE 4
|
||||||
|
; Index of the first element
|
||||||
|
fstelind: .EQUATE 6
|
||||||
|
; Index of the second element
|
||||||
|
secelind: .EQUATE 8
|
||||||
|
|
||||||
|
; Prints the content of an array
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; SP + 2: Address of the array
|
||||||
|
; SP + 4: Length of the array
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; void
|
||||||
|
printarr: LDX 0, i
|
||||||
|
parrlp: CPX 4, s
|
||||||
|
BRGE parrout
|
||||||
|
DECO 2, sxf
|
||||||
|
CHARO ' ', i
|
||||||
|
ADDX 2, i
|
||||||
|
BR parrlp
|
||||||
|
parrout: RET0
|
||||||
|
|
||||||
|
; Unsorted array for testing purposes
|
||||||
|
arr: .WORD 9
|
||||||
|
.WORD 5
|
||||||
|
.WORD 8
|
||||||
|
.WORD 10
|
||||||
|
.WORD 4
|
||||||
|
.WORD 7
|
||||||
|
.WORD 0
|
||||||
|
.WORD 3
|
||||||
|
.WORD 2
|
||||||
|
.WORD 1
|
||||||
|
.WORD 6
|
||||||
|
|
||||||
|
.END
|
||||||
61
samples/Pep8/stri_buf.pep
Normal file
61
samples/Pep8/stri_buf.pep
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
main:
|
||||||
|
|
||||||
|
; Reads a string in stdin, returns the buffer it was read in
|
||||||
|
; Stops reading at the first encounter of a \n character.
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; void
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - X: Address of the buffer
|
||||||
|
stri: SUBSP 2, i
|
||||||
|
LDA 32, i
|
||||||
|
CALL new
|
||||||
|
CPX buflen, s
|
||||||
|
BRGE strinlrg
|
||||||
|
strinlrg: LDA buflen, d
|
||||||
|
LDX 2, i
|
||||||
|
CALL mult
|
||||||
|
STA buflen
|
||||||
|
CALL new
|
||||||
|
|
||||||
|
buflen: .EQUATE 0
|
||||||
|
|
||||||
|
; Copies the content of a buffer to another one
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - SP + 2: Destination buffer
|
||||||
|
; - SP + 4: Source buffer
|
||||||
|
; - SP + 6: Length to copy
|
||||||
|
memcpy: LDX 0, i
|
||||||
|
memcplp: CPX cpylen, s
|
||||||
|
BREQ memcpout
|
||||||
|
LDBYTEA srcbuf, sxf
|
||||||
|
STBYTEA dstbuf, sxf
|
||||||
|
ADDX 1, i
|
||||||
|
BR memcplp
|
||||||
|
memcpout: RET0
|
||||||
|
; Destination buffer
|
||||||
|
dtsbuf: .EQUATE 2
|
||||||
|
; Source buffer
|
||||||
|
srcbuf: .EQUATE 4
|
||||||
|
; Copy length
|
||||||
|
cpylen: .EQUATE 6
|
||||||
|
|
||||||
|
; Allocates a new structure in the heap
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - A: Length of the structure to allocate (bytes)
|
||||||
|
;
|
||||||
|
; Returns:
|
||||||
|
; - X: Address of the allocated structure
|
||||||
|
new: ADDA hpptr, d
|
||||||
|
LDX hpptr, d
|
||||||
|
STA hpptr, d
|
||||||
|
RET0
|
||||||
|
|
||||||
|
; Pointer to the next available byte on the heap
|
||||||
|
hpptr: .ADDRSS heap
|
||||||
|
; Start of the heap
|
||||||
|
heap: .BLOCK 1
|
||||||
|
.END
|
||||||
50
samples/Pep8/stristack.pep
Normal file
50
samples/Pep8/stristack.pep
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
main: SUBSP 34, i
|
||||||
|
LDA 31, i
|
||||||
|
STA 0, s
|
||||||
|
CALL fgets
|
||||||
|
ADDSP 2, i
|
||||||
|
CALL ststro
|
||||||
|
STOP
|
||||||
|
|
||||||
|
; Reads a string from stdin, stops reading when one of the following is true:
|
||||||
|
; - Read a \n
|
||||||
|
; - Read a maximum of `max` chars
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; - SP + 2: `max`, the maximum number of chars to read
|
||||||
|
; - SP + 4: `buffer` of length `max` + 1
|
||||||
|
; Returns:
|
||||||
|
; void
|
||||||
|
fgets: LDX 0, i
|
||||||
|
LDA 0, i
|
||||||
|
fgetslp: CHARI buffer, sx
|
||||||
|
LDBYTEA buffer, sx
|
||||||
|
CPA '\n', i
|
||||||
|
BREQ fout
|
||||||
|
CPX max, s
|
||||||
|
BREQ fout
|
||||||
|
ADDX 1, i
|
||||||
|
BR fgetslp
|
||||||
|
fout: LDA '\x00', i
|
||||||
|
STBYTEA buffer, sx
|
||||||
|
RET0
|
||||||
|
max: .EQUATE 2
|
||||||
|
buffer: .EQUATE 4
|
||||||
|
|
||||||
|
; Prints a string stored in stack
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; SP + 2: `string`
|
||||||
|
; Returns:
|
||||||
|
; void
|
||||||
|
ststro: LDX 0, i
|
||||||
|
LDA 0, i
|
||||||
|
strolp: LDBYTEA string, sx
|
||||||
|
CPA '\x00', i
|
||||||
|
BREQ strout
|
||||||
|
CHARO string, sx
|
||||||
|
ADDX 1, i
|
||||||
|
BR strolp
|
||||||
|
strout: RET0
|
||||||
|
string: .EQUATE 2
|
||||||
|
.END
|
||||||
1
vendor/grammars/Sublime-Pep8
vendored
Submodule
1
vendor/grammars/Sublime-Pep8
vendored
Submodule
Submodule vendor/grammars/Sublime-Pep8 added at be653c638b
18
vendor/licenses/grammar/Sublime-Pep8.txt
vendored
Normal file
18
vendor/licenses/grammar/Sublime-Pep8.txt
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
type: grammar
|
||||||
|
name: Sublime-Pep8
|
||||||
|
license: wtfpl
|
||||||
|
---
|
||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
Version 2, December 2004
|
||||||
|
|
||||||
|
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim or modified
|
||||||
|
copies of this license document, and changing it is allowed as long
|
||||||
|
as the name is changed.
|
||||||
|
|
||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||||
Reference in New Issue
Block a user