
.Init
   STMFD    R13!,{R14}
   SWI      OS_RemoveCursors
   BL       Get_Graphics_Info
   BL       Claim_Event_Vector
   BL       Enable_Escape_Event
   BL       Enable_Vsync_Event
   BL       Setup_Error_Handler
   LDMFD    R13!,{R15}

.Shut_Down
   STMFD    R13!,{R14}
   BL       Disable_Escape_Event
   BL       Disable_Vsync_Event
   BL       Release_Event_Vector
   BL       Restore_Screen_Banks
   BL       Restore_Error_Handler
   SWI      OS_RestoreCursors
   LDMFD    R13!,{R15}

.Setup_Error_Handler
   MOV      R0,#6
   ADR      R1,Error_Handler
   ADR      R3,Block
   SWI      OS_ChangeEnvironment
   STR      R1,Old_Error_Handler
   MOV      R15,R14

.Restore_Error_Handler
   MOV      R0,#6
   LDR      R1,Old_Error_Handler
   SWI      OS_ChangeEnvironment
   MOV      R15,R14

.Error_Handler
   BL       Shut_Down
   ADR      R0,Block+8
   SWI      OS_Write0
   SWI      OS_NewLine
   SWI      OS_Exit

.Get_Graphics_Info
   MOV      R0,#-1
   MOV      R1,#11
   SWI      OS_ReadModeVariable
   ADD      R2,R2,#1
   STR      R2,Hpixels
   CMP      R2,#Min_Hpixels
   BLT      Generate_Mode_Error
   MOV      R3,R2,LSL #2
   STR      R3,Bytes_Per_Line
   MOV      R1,#12
   SWI      OS_ReadModeVariable
   ADD      R2,R2,#1
   STR      R2,Vpixels
   CMP      R2,#Min_Vpixels
   BLT      Generate_Mode_Error
   MUL      R3,R2,R3
   STR      R3,Screen_Size
   MOV      R1,#9
   SWI      OS_ReadModeVariable
   CMP      R2,#5
   BNE      Generate_Mode_Error
   MOV      R0,#2 OR 1 << 7
   SWI      OS_ReadDynamicArea
   CMP      R1,#0
   MOVEQ    R0,#3
   STREQ    R0,Num_Banks
   BEQ      Init_Ok_Banks
   LDR      R0,Screen_Size
   DIV      R2,R1,R0
   STR      R2,Num_Banks
   ;CMP      R1,#3
   ;BGE      Init_Ok_Banks
   ;Print "For smoothest display, increase the Task Manager screen memory to its maximum value. Press any key to continue":Get
.Init_Ok_Banks
   MOV      R0,#0
   STR      R0,Draw_Bank
   STR      R0,Display_Bank
   STR      R0,Enable_Banking
   STR      R0,Escape_Flag
   ADR      R0,Block
   ADD      R1,R0,#8
   MOV      R2,#149
   STR      R2,[R0]
   MVN      R2,#0
   STR      R2,[R0,#4]
   SWI      OS_ReadVduVariables
   LDR      R3,[R1]
   STR      R3,Screen_Base
   STR      R3,Screen_Start
   MOV      R15,R14

.Generate_Mode_Error
   ADR      R0,Mode_Error
   SWI      OS_GenerateError

.Mode_Error
   DCD      0
   DCB      "Application requires a minimum 800 x 600 resolution 24-bit colour screen mode",0
   ALIGN

.Restore_Screen_Banks
   MOV      R0,#112
   MOV      R1,#1
   SWI      OS_Byte
   MOV      R0,#113
   MOV      R1,#1
   SWI      OS_Byte
   MOV      R15,R14

#fppool
