In   -
Out  !RunImage
Type Module
Ver  1.00j

Define Module
 Name      TinyView
 Author    HEx
 Start     start
 ;Init      init
 ;Final     final
 Commands
 Name      TinyView
 Code      command
 Max       2
 Min       1
 Syntax     <> [<flags>]
 End Commands
 Workspace 256
End Module

.command
   mov     r2,r0
   xswi    "OS_Module",2,^module_title
.taskid
   equs    "TASK"
.taskname
   equza   "TinyView"
.msglist
   equd    0
   equd    -1
.windowdef
   equd    96
   equd    128
   equd    96+512
   equd    128+640
   equd    0
   equd    0
   equd    -1
   ;         3         2         1         0
   equd    %11111111000000100001000000000010
   equd    &00070207
   equd    &000C0103
   equd    0
   equd    -512
   equd    384
   equd    0
   ;         3         2         1         0
   equd    %00001111000000000000000100011001
   equd    (%0011)<<12
   equd    1
   equd    0
   equd    0
   equd    0
   equd    255
   equd    0
.filename
   equza   "rafs::bucket.$.o"
.start
   movs    r0,r0
   moveq   pc,r14
   ldr     r12,[r12]
   add     r13,r12,#256
   xswi    "OS_Module",6,,,64
   mov     r11,r2
   mov     r0,#80
   strb    r0,[r11,#0]
   mov     r0,#7
   strb    r0,[r11,#1]
   mov     r0,#128
   strb    r0,[r11,#2]
   adr     r0,filename
   add     r1,r11,#32
$copyloop
   ldrb    r2,[r0],#1
   strb    r2,[r1],#1
   teq     r2,#0
   bne     $copyloop
   ldr     r1,taskid
   xswi    "Wimp_Initialise",300,,^taskname,^msglist
   str     r1,[r11,#4]
   ;xswi    "OS_ChangeEnvironment",6,^error,r11
   swi     "OS_GetEnv"
   xswi    "OS_File",17,^filename
   tst     r0,#1
   xswieq  "OS_File",19,,0
   str     r4,[r11,#12]
$virtual
   str     r4,[r11,#16]                  ; fileptr > eof
   mov     r0,#16384                     ; buffer size
   xswi    "Wimp_SlotSize",,-1
   cmp     r0,#0
   blt     $memerror
   str     r0,[r11,#20]
   b       $converge
$real
   mvn     r1,#0
   str     r1,[r11,#16]
   xswi    "Wimp_SlotSize",r4
   cmp     r0,r4
   blt     $memerror
   str     r0,[r11,#20]
   add     r1,r11,#24
   xswi    "OS_File",16,,&8000,0
   b       $converge
$memerror
   b       exit
$converge
   adr     r1,windowdef
   ldrb    r0,[r11,#0]
   mov     r2,r0,lsl#4
   str     r2,[r1,#48]
   add     r4,r4,r0
   sub     r4,r4,#1
   FNdiv(4,0)
   mvn     r0,r4,lsl#5
   add     r0,r0,#1
   str     r0,[r1,#44]
   add     r0,r11,#32
   str     r0,[r1,#72]
   swi     "Wimp_CreateWindow"
   str     r0,[r11,#8]
   str     r0,[r12]
   xswi    "Wimp_GetWindowState",,r12
   swi     "Wimp_OpenWindow"
.pollloop
   xswi    "Wimp_Poll",0,r12
   add     pc,pc,r0,lsl#2
   nop
   b       pollloop
   b       redraw
   b       openwin
   b       closewin
   b       pollloop
   b       pollloop
   b       mouseclick
   b       pollloop
   b       keypress
   b       menusel
   b       pollloop
   b       pollloop
   b       pollloop
   b       pollloop
   b       pollloop
   b       pollloop
   b       pollloop
   b       message
   b       message
.ack
   b       pollloop
.redraw
   swi    "Wimp_RedrawWindow"
$redrawloop
   movs    r0,r0
   beq     pollloop
   ldrb    r10,[r11,#0]
   add     r1,r1,#128
   ldr     r0,[r11,#8]
   str     r0,[r1]
   swi     "Wimp_GetWindowState"
   ldr     r7,[r1,#(272-256)]
   ldr     r8,[r1,#(280-256)]
   sub     r7,r7,r8
   ldr     r0,[r12,#40]
   sub     r8,r7,r0                      ; loop start
   mov     r8,r8,asr#5
   ldr     r0,[r12,#32]
   sub     r9,r7,r0
   add     r9,r9,#32                      ; loop end
   mov     r9,r9,asr#5


   ldr     r6,[r1,#4]
   ldr     r0,[r1,#20]
   sub     r6,r6,r0
   ldr     r7,[r1,#16]
   ldr     r0,[r1,#24]
   sub     r7,r7,r0
   sub     r7,r7,r8,asl#5
   sub     r7,r7,#4
   ;mov     r5,#&8000
   ;mul     r0,r8,r10
   ;add     r5,r5,r0
   mul     r5,r8,r10
   ldrb    r0,[r11,#1]
   swi     "Wimp_SetColour"
   ldrb    r0,[r11,#2]
   swi     "Wimp_SetColour"
   swi      256+16
$lineloop
   xswi    "OS_Plot",4,r6,r7
   ;ldrb    r1,[r11,#0]
   mov     r1,r10                        ; r10 is width
   mov     r0,r5                         ; r5 is filepointer
   bl      ensuredata
   ;returns in r4
   add     r5,r5,r10
   ;ldr     r0,[r11,#12]
   ;add     r0,r0,#&8000
   ;add     r2,r1,r5
   ;subs    r2,r2,r0
   ;subgt   r1,r1,r2
   mov     r2,r1
   add     r0,r12,#64                    ; max width 192
$charloop

   ldrb    r3,[r4],#1
   cmp     r3,#32
   movcc   r3,#46
   strb    r3,[r0],#1
   subs    r2,r2,#1
   bgt     $charloop
   add     r0,r12,#64
   swi     "OS_WriteN"
   sub     r7,r7,#32
   add     r8,r8,#1
   cmp     r8,r9
   blt     $lineloop
   mov     r1,r12
   xswi    "Wimp_GetRectangle"
   b       $redrawloop
.openwin
   swi     "Wimp_OpenWindow"
   b       pollloop
.closewin
   swi     "Wimp_CloseWindow"
   ldr     r0,[r1]
   ldr     r2,[r11,#8]
   teq     r0,r2
   beq     exit
   b       pollloop
.keypress
   ldr     r0,[r1,#24]
   sub     r2,r0,#&180
   teq     r2,#&E
   beq     cursdown
   teq     r2,#&F
   beq     cursup
   teq     r2,#&1E
   beq     pagedown
   teq     r2,#&1F
   beq     pageup
   teq     r2,#&2E
   beq     ctrlup
   teq     r2,#&2F
   beq     ctrldown
   teq     r2,#&22
   beq     exit
   teq     r0,#20
   beq     togglesize
   teq     r0,#6
   beq     tofront
   bne notourkey
.cursup
   swi     "Wimp_GetWindowState"
   ldr     r0,[r1,#24]
   add     r0,r0,#32
   bic     r0,r0,#31
   str     r0,[r1,#24]
   swi     "Wimp_OpenWindow"
   b       pollloop
.cursdown
   swi     "Wimp_GetWindowState"
   ldr     r0,[r1,#24]
   ldr     r2,[r1,#16]
   ldr     r3,[r1,#8]
   sub     r2,r3,r2
   rsb     r2,r2,#32
   and     r2,r2,#31
   sub     r0,r0,#32
   bic     r0,r0,#31
   orr     r0,r0,r2
   str     r0,[r1,#24]
   swi     "Wimp_OpenWindow"
   b       pollloop
.pageup
   swi     "Wimp_GetWindowState"
   ldr     r0,[r1,#24]
   ldr     r2,[r1,#16]
   ldr     r3,[r1,#8]
   sub     r2,r3,r2
   bic     r2,r2,#31
   sub     r0,r0,r2
   bic     r0,r0,#31
   str     r0,[r1,#24]
   swi     "Wimp_OpenWindow"
   b       pollloop
.pagedown
   swi     "Wimp_GetWindowState"
   ldr     r0,[r1,#24]
   ldr     r2,[r1,#16]
   ldr     r3,[r1,#8]
   sub     r2,r3,r2
   bic     r3,r2,#31
   and     r2,r2,#31
   add     r0,r0,r3
   bic     r0,r0,#31
   orr     r0,r0,r2
   str     r0,[r1,#24]
   swi     "Wimp_OpenWindow"
   b       pollloop
.ctrlup
   swi     "Wimp_GetWindowState"
   mov     r0,#0
   str     r0,[r1,#24]
   swi     "Wimp_OpenWindow"
   b       pollloop
.ctrldown
   swi     "Wimp_GetWindowState"
   mov     r0,#1<<20
   str     r0,[r1,#24]
   swi     "Wimp_OpenWindow"
   b       pollloop
.togglesize
   swi     "Wimp_GetWindowState"
   ldr     r0,[r1,#32]
   eor     r0,r0,#1<<18
   str     r0,[r1,#32]
   swi     "Wimp_OpenWindow"
   b       pollloop
.tofront
   swi     "Wimp_GetWindowState"
   mvn     r0,#0
   str     r0,[r1,#28]
   swi     "Wimp_OpenWindow"
   b       pollloop
.notourkey
   swi     "Wimp_ProcessKey"
   b       pollloop
.mouseclick
   ldr     r0,[r11,#8]
   ldr     r2,[r1,#12]
   teq     r0,r2
   bne     pollloop
   ldr     r0,[r1,#8]
   tst     r0,#5
   beq     pollloop
   xswi    "Wimp_SetCaretPosition",r2,-1,0,0,1<<25
   b       pollloop
.menusel
   b       pollloop
.message
   ldr     r0,[r1,#16]
   teq     r0,#0
   bne     pollloop
   b       exit
.error
   ladr    r2,module_title
   xswi    "Wimp_ReportError",,%10
   mov     r11,r12
.exit
   ldr     r0,[r11,#4]
   ladr    r1,taskid
   swi     "Wimp_CloseDown"
   xswi    "XOS_Module",7,,r11
   swi     "OS_Exit"
; *******************************************************************
; Subroutine:   ensuredata
; Description:  loads data from file into buffer if necessary
; Parameters:   r0=file offset,r1=length,r11,r12
; Returns:      r0=buffer ptr
; *******************************************************************

.ensuredata
   ;stmfd   r13!,{r0-r2}
   ldr     r2,[r11,#16]
   cmn     r2,#1
   addeq   r0,r0,#&8000                  ; real
   moveq   pc,r14
   cmp     r0,r2
   blt     loaddata
   sub     r2,r0,r2
   ldr     r4,[r11,#20]
   add     r3,r2,r1
   cmp     r3,r4
   bge     loaddata
   add     r4,r2,#&8000
   mov     pc,r14
.loaddata
   mov     r4,r0
   str     r0,[r11,#16]
   ;mov     r3,r1
   ldr     r3,[r11,#20]
   add     r1,r11,#24
   xswi    "OS_Find",&40
   mov     r1,r0
   xswi    "OS_GBPB",3,,&8000
   xswi    "OS_Find",0

   mov     r4,#&8000
   mov     pc,r14
.init
.final
   mov     pc,r14

#End
REM FNdiv(a,b) : Divide a by b and return result in a
DEFFNdiv(top,bot)
result=3:REMFNfindfreereg(top,bot,top,bot)
bit=2:REMFNfindfreereg(top,bot,result,sign)
[OPT pass%
 ;  STMFD   (sp)!,{result,sign,bit}
   MOV     result,#0
   MOV     bit,#1
 ;  EOR     sign,top,bot
 ;  CMP     bot,#0
 ;  RSBMI   bot,bot,#0
 ;  CMP     top,#0
 ;  RSBMI   top,top,#0
   CMP     top,#2^24
   BLT     P%+(7*3)*4+4
   FNdivcode(31)
   FNdivcode(30)
   FNdivcode(29)
   FNdivcode(28)
   FNdivcode(27)
   FNdivcode(26)
   FNdivcode(25)
   CMP     top,#2^16
   BLT     P%+(8*3)*4+4
   FNdivcode(24)
   FNdivcode(23)
   FNdivcode(22)
   FNdivcode(21)
   FNdivcode(20)
   FNdivcode(19)
   FNdivcode(18)
   FNdivcode(17)
   CMP     top,#2^8
   BLT     P%+(8*3)*4+4
   FNdivcode(16)
   FNdivcode(15)
   FNdivcode(14)
   FNdivcode(13)
   FNdivcode(12)
   FNdivcode(11)
   FNdivcode(10)
   FNdivcode(9)
   FNdivcode(8)
   FNdivcode(7)
   FNdivcode(6)
   FNdivcode(5)
   FNdivcode(4)
   FNdivcode(3)
   FNdivcode(2)
   FNdivcode(1)
   FNdivcode(0)
   MOV     top,result
 ;  CMP     sign,#0
 ;  RSBMI   top,top,#0
 ;  LDMFD   (sp)!,{result,sign,bit}
]
=0
:
DEFFNdivcode(it)
IF it>0 THEN
[OPT pass%
   CMP     bot,top,LSR #it
   ORRLE   result,result,bit,ASL #it
   SUBLE   top,top,bot,ASL #it
]
ELSE
[OPT pass%
   CMP     bot,top
   ORRLE   result,result,#1
   SUBLE   top,top,bot
]
ENDIF
=0
