In   -
Out  !RunImage
Type Module
Ver  1.00n

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"
   ;equza   "temp:;spo"
.start
   movs    r0,r0
   moveq   pc,r14
   ldr     r12,[r12]
   add     r13,r12,#256
   xswi    "OS_Module",6,,,128
   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,#32
   xswi    "OS_File",16,,&8000,0
   b       $converge
$memerror
   b       exit
$converge
   adr     r1,windowdef
   ldrb    r0,[r11,#0]

   bl      text_init
   ;replace!
   adr     r1,windowdef
   mov     r5,r5,lsl#4
   str     r5,[r1,#48]
   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

   bl      text_redrawinit

   ldr     r6,[r12,#132]
   ldr     r0,[r12,#148]
   sub     r6,r6,r0
   ldr     r7,[r12,#144]
   ldr     r0,[r12,#152]
   sub     r7,r7,r0
   sub     r7,r7,r8,asl#5
   sub     r7,r7,#4

   ldrb    r0,[r11,#1]
   swi     "Wimp_SetColour"
   ldrb    r0,[r11,#2]
   swi     "Wimp_SetColour"
   swi      256+16
$lineloop
   xswi    "OS_Plot",4,r6,r7

   bl      text_redrawline

   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
   bl      text_final
   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:      r4=buffer ptr,r0-r3 corrupt
; *******************************************************************

.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,#32
   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
; *******************************************************************
; Subroutine:   init
; Description:  initialise, and find no. of lines in window
; Parameters:   r0=width, r4=file length,r11,r12
; Returns:      r4=lines in window,r5=chars/line
; *******************************************************************

; *******************************************************************
; Subroutine:   redrawinit
; Description:  finds fileptr given line no.
; Parameters:   r8 line no. to start,r9-r12
; Returns:      r5 filepointer, r8-r12 preserved
; *******************************************************************

; *******************************************************************
; Subroutine:   redrawline
; Description:  redraws line in window
; Parameters:   r5 filepointer, r10 width, r11,r12
; Returns:      r5 updated, r6-r12 preserved
; *******************************************************************

.ascii_init
   add     r4,r4,r0
   sub     r4,r4,#1
   FNdiv(4,0)
   mov     r5,r0
   mov     pc,r14

.ascii_redrawinit
   mul     r5,r8,r10
.ascii_final
   mov     pc,r14

.ascii_redrawline
   stmfd   r13!,{r14}
   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
$charloop
   ldrb    r0,[r4],#1
   cmp     r0,#32
   movcc   r0,#46
   swi     "OS_WriteC"
   subs    r1,r1,#1
   bgt     $charloop
   ldmfd   r13!,{pc}


.text_init
   stmfd   r13!,{r14}
   mov     r10,r0                        ; width
   mov     r9,r4                         ; file length
   mov     r8,#0                         ; lines so far
   ldr     r7,[r11,#20]                  ; buflen
   mov     r6,#0                         ; offset
   mov     r5,#0                         ; char offset into line
   mov     r3,r9,lsr#11                  ; line store; 8 bytes every 16K
   add     r3,r3,#8
   xswi    "OS_Module",6
   str     r2,[r11,#28]
   mov     r0,#16384                        ; was 16K (1st offset to write)
   mov     r1,#1
   stmia   r2!,{r0-r1,r5-r6}
$bufloop
   ldr     r0,[r11,#28]
   ldr     r1,[r0]
   cmp     r6,r1
   blt     $notthere
   add     r1,r1,#16384
   str     r1,[r0]
   ldr     r1,[r0,#4]
   add     r1,r1,#1
   str     r1,[r0,#4]
   add     r1,r0,r1,lsl#3
   stmia   r1,{r2,r3}
$notthere
   mov     r0,r6
   mov     r1,r7
   bl      ensuredata
   sub     r1,r9,r6
   cmp     r1,r7
   movgt   r1,r7
$charloop
   ldrb    r0,[r4],#1
   teq     r0,#10
   addne   r5,r5,#1
   ;teqne   r5,r10
   moveq   r5,#0
   addeq   r8,r8,#1
   moveq   r2,r6
   moveq   r3,r8
   subs    r1,r1,#1
   bne     $charloop
   add     r6,r6,r7
   cmp     r6,r9
   blt     $bufloop
   teq     r5,#0
   addne   r4,r8,#1
   moveq   r4,r8
   ;ldr     r0,[r11,#28]
   ;ldr     r1,[r0,#4]
   ;add     r1,r1,#1
   ;mov     r2,#1<<30
   ;str     r2,[r0,r1,lsl#3]!
   ;str     r2,[r0,#4]
   mov     r5,r10
   ldmfd   r13!,{pc}

.text_redrawinit
   teq     r8,#0
   moveq   r5,#0
   moveq   r6,#0
   moveq   pc,r14
   ldr     r4,[r11,#28]
   ldr     r0,[r4,#4]
   add     r4,r4,r0,lsl#3
   ;;add     r4,r4,#12
   ;add     r4,r4,#8
$findstore
   ;ldr     r1,[r4],#8
   ldmdb   r4!,{r5,r6}
   cmp     r6,r8
   bgt     $findstore
   ;;sub     r4,r4,#20
   ;sub     r4,r4,#16
   ;ldmia   r4,{r5-r6}
   ;;mov     pc,r14
   moveq   pc,r14
   stmfd   r13!,{r14}
$forloop
   mov     r0,r5
   mov     r1,r10
   bl      ensuredata
   mov     r2,r10
$floop
   ldrb    r0,[r4],#1
   add     r5,r5,#1
   teq     r0,#10
   beq     $floopend
   subs    r2,r2,#1
   bne     $floop
$floopend
   add     r6,r6,#1
   teq     r6,r8
   bne     $forloop
   ;ldr     r4,[r11,#28]
   ;stmia   r4,{r5-r6}
   ldmfd   r13!,{pc}

.text_redrawline
;rem "%r5%C"
;mov pc,r14
   stmfd   r13!,{r14}
   mov     r1,r10                        ; r10 is width
   mov     r0,r5                         ; r5 is filepointer
   bl      ensuredata
   ;returns in r4
   ;ldr     r0,[r11,#12]
   ;add     r0,r0,#&8000
   ;add     r2,r1,r5
   ;subs    r2,r2,r0
   ;subgt   r1,r1,r2
$charloop
   ldrb    r0,[r4],#1
   add     r5,r5,#1
   teq     r0,#10
   ldmeqfd r13!,{pc}
   cmp     r0,#32
   movcc   r0,#46
   swi     "OS_WriteC"
   subs    r1,r1,#1
   bne     $charloop
   ldmfd   r13!,{pc}

.text_final
   ldr     r2,[r11,#28]
   xswi    "XOS_Module",7
   mov     pc,r14

#End
REM FNdiv(a,b) : Divide a by b and return result in a
DEFFNdiv(top,bot) LOCAL result,bit,loop,m
result=3:REMFNfindfreereg(top,bot,top,bot)
bit=2:REMFNfindfreereg(top,bot,result,sign)
loop=1
[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
   MOV     loop,#31
.m
   CMP     bot,top,LSR loop
   ORRLE   result,result,bit,ASL loop
   SUBLE   top,top,bot,ASL loop
   SUBS    loop,loop,#1
   BNE     m
   CMP     bot,top
   ORRLE   result,result,#1
   SUBLE   top,top,bot
   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

