; Assessment, Excersise 1
;
; Program to print the contents of a file
; to the debug channel
;
AREA printFile, CODE, READONLY ; declare code area
SWI_WriteC EQU 0x0 ; output character in r0
SWI_Exit EQU 0x11 ; finish program
SWI_Open EQU 0x66 ; open a file or device
SWI_Close EQU 0x68 ; close an open file or device
SWI_Read EQU 0x6a ; read from an open file or device
SWI_Flen EQU 0x6c ; returns the current length of an open file or device
readonly EQU 0 ; open a file or device for reading
ENTRY ; code entry point
START ADR r0, FILENAME ; set r0 to point to FILENAME
MOV r1, #readonly ; set access mode to file as readonly
SWI SWI_Open ; open the file pointed at by r0
CMP r0, #0 ; check for success on opening file
SWIEQ SWI_Exit ; if file could not be opened then exit now
MOV r5, r0 ; save the file handle in r5 for later
SWI SWI_Flen ; store the length of the file in r0
CMP r0, #1 ; check that the call was successful
SWIEQ SWI_Exit ; if the call failed then exit now
MOV r2, r0 ; move the length of the file into r2
MOV r0, r5 ; move the file handle back into r0
ADR r1, FILECONTENTS ; point r1 at a place for the contents of the file
SWI SWI_Read ; read the data from the file
CMP r0, #0 ; check that the call was successful
SWIEQ SWI_Exit ; if anything was left unread from the file then exit now
LOOP LDRB r0, [r1], #1 ; get the next byte
CMP r0, #0 ; check for 'null' character
SWINE SWI_WriteC ; if not end, print ..
BNE LOOP ; .. and loop back
MOV r0, r5 ; move the file handle back into r0
SWI SWI_Close ; close the file
SWI SWI_Exit ; end of execution
FILENAME = "turing.txt", 0 ; filename + null
FILECONTENTS = "" ; arbitrary amount of memory for contents of file
END