/[projet1]/public/oric/demos/SlideShowDemo/code/loader.asm
Defence Force logotype

Diff of /public/oric/demos/SlideShowDemo/code/loader.asm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1037 by dbug, Sun Dec 15 15:35:39 2013 UTC revision 1038 by dbug, Tue Dec 17 21:24:32 2013 UTC
# Line 15  current_sector         .dsb 1          ; Index of the s Line 15  current_sector         .dsb 1          ; Index of the s
15  current_side            .dsb 1          ; Has the bit 4 set to 0 or 1 to be used as a mask on the Microdisc control register (other bits have to be set to zero)  current_side            .dsb 1          ; Has the bit 4 set to 0 or 1 to be used as a mask on the Microdisc control register (other bits have to be set to zero)
16  irq_save_a                      .dsb 1      ; To preserve the accumulator value in the IRQ code  irq_save_a                      .dsb 1      ; To preserve the accumulator value in the IRQ code
17    
18    ; Unpack test
19    ptr_source                      .dsb 2          ; Packed source data adress
20    ptr_destination         .dsb 2          ; Destination adress where we depack
21    ptr_destination_end     .dsb 2          ; Point on the end of the depacked stuff
22    ptr_source_back         .dsb 2          ; Temporary used to hold a pointer on depacked stuff
23    offset                          .dsb 2
24    mask_value                      .dsb 1
25    nb_dst                          .dsb 1
26    
27          .text          .text
28    
29          *=location_loader          *=location_loader
# Line 34  StartUp Line 43  StartUp
43          ;jmp StartUp          ;jmp StartUp
44          jsr SoftHiresWithCopyCharset          jsr SoftHiresWithCopyCharset
45    
46          ;ldx #LOADER_FIRST_PICTURE          ;ldx #LOADER_COMPRESSED_TEST
47          ;jsr LoadData          ;jsr LoadData
         ;STOP(1)  
48    
49          ; Load the slideshow          ; Load the slideshow
50          ldx #LOADER_SLIDESHOW          ldx #LOADER_SLIDESHOW
# Line 57  loop_forever_demo_finished Line 65  loop_forever_demo_finished
65  IrqHandler  IrqHandler
66          sta irq_save_a          sta irq_save_a
67          pla          pla
68            pha
69          and #%00010000  ; Check the saved B flag to detect a BRK          and #%00010000  ; Check the saved B flag to detect a BRK
70          bne from_brk          bne from_brk
71                    
72  from_irq  from_irq
73          bit $304  #ifdef LOADER_SHOW_DEBUGINFO    
   
74          lda $bfdf          lda $bfdf
75          eor #1          eor #1
76          ora #16          ora #16
77          sta $bfdf          sta $bfdf
78    #endif
79          lda irq_save_a          lda irq_save_a
80          pha          bit $304
81  IrqDoNothing  IrqDoNothing
82          rti              rti    
83                    
# Line 98  SetLoadAddress Line 106  SetLoadAddress
106    
107  ; X=File index  ; X=File index
108  LoadData  LoadData
109            ;STOP(2)
110    
111            ; We have to start somewhere no matter what, compressed or not
112            jsr StartReadOperation
113    
114            ; Now at this stage we have to check if the data is compressed or not
115            lda FileStoredSizeLow,x
116            cmp FileSizeLow,x
117            bne LoadCompressedData
118    
119            lda FileStoredSizeHigh,x
120            cmp FileSizeHigh,x
121            bne LoadCompressedData
122    
123    LoadUncompressedData    
124    
125            ;
126            ; Loop to read all the sectors  
127            ;
128    read_sectors_loop
129        jsr ReadNextSector
130    
131            ; Try to let time to an IRQ to play, and during that time copy the sector to the final location
132            cli
133    
134            ldy #0
135    loop_copy
136            lda $200,y                      ; Load the byte from page 2
137    __auto_write_address
138            sta $c000,y             ; Store it to the final location
139            iny
140            bne loop_copy
141    
142            nop
143            nop
144          sei          sei
145    
146            ; Next sector
147            inc __auto_write_address+2
148            dec sectors_to_go
149            bne read_sectors_loop
150    
151            ; Data successfully loaded (we hope), so we restore the interrupts
152            cli
153            rts
154    
155    
156    LoadCompressedData
157            clc
158            lda FileLoadAdressLow,x
159            sta ptr_destination+0
160            adc FileSizeLow,x
161            sta ptr_destination_end+0
162    
163            lda FileLoadAdressHigh,x
164            sta ptr_destination+1
165            adc FileSizeHigh,x
166            sta ptr_destination_end+1
167    
168            ;STOP(2)
169    
170            jsr UnpackData
171            cli
172            rts
173    
174            
175    StartReadOperation      
176            sei
177    
178          ; Make sure the microdisc IRQ is disabled                ; Make sure the microdisc IRQ is disabled      
179          jsr WaitCompletion          jsr WaitCompletion
180                    
# Line 137  first_side Line 212  first_side
212    
213      ; FileSizeLow/FileSizeHigh      ; FileSizeLow/FileSizeHigh
214          ; Number of sectors to load          ; Number of sectors to load
215          lda FileSizeHigh,x                .(
216            lda FileStoredSizeHigh,x        
217          sta sectors_to_go          sta sectors_to_go
218          lda FileSizeLow,x          lda FileStoredSizeLow,x
219          beq skip          beq skip
220          inc sectors_to_go          inc sectors_to_go
221  skip      skip
222                    .)      
223          ;          rts
224          ; Loop to read all the sectors    
225          ;  
226  read_sectors_loop        ReadNextSector
227            cli
228    
229          ; Check if we have reached the end of the track          ; Check if we have reached the end of the track
230          lda current_sector          lda current_sector
# Line 164  read_sectors_loop Line 241  read_sectors_loop
241          lda #0          lda #0
242          sta current_track          sta current_track
243    
244            sei
245    
246          lda #%00010000          lda #%00010000
247          sta current_side                  sta current_side        
248  stay_on_same_side  stay_on_same_side
249    
250            
251          ; Reset the sector position          ; Reset the sector position
252          lda #1          lda #1
253          sta current_sector          sta current_sector
# Line 175  same_track Line 255  same_track
255    
256  #ifdef LOADER_SHOW_DEBUGINFO      #ifdef LOADER_SHOW_DEBUGINFO    
257          ; Display debug info          ; Display debug info
258            cli
259          jsr DisplayPosition          jsr DisplayPosition
260            sei
261  #endif  #endif
262    
263          lda current_sector          lda current_sector
# Line 227  microdisc_read_data Line 309  microdisc_read_data
309          lda FDC_status_register          lda FDC_status_register
310          and #$1C          and #$1C
311    
         ; Try to let time to an IRQ to play, and during that time copy the sector to the final location  
         cli  
   
         ldy #0  
 loop_copy  
         lda $200,y                      ; Load the byte from page 2  
 __auto_write_address  
         sta $c000,y             ; Store it to the final location  
         iny  
         bne loop_copy  
   
         nop  
         nop  
         sei  
   
         ; Next sector  
         inc __auto_write_address+2  
         dec sectors_to_go  
         bne read_sectors_loop  
   
312          jsr WaitCompletion          jsr WaitCompletion
   
         ; Data successfully loaded (we hope), so we restore the interrupts  
313          cli          cli
314          rts          rts
315            
316    
317  ExecuteData      ExecuteData    
318  __auto_execute_address  __auto_execute_address
319          jmp $a000          jmp $a000
# Line 326  DisplayPosition Line 387  DisplayPosition
387  #endif  #endif
388                    
389    
390    ; 97 bytes, would not fit in the boot sector unfortunately...
391  SoftHiresWithCopyCharset  SoftHiresWithCopyCharset
392          ldy #$00                ;copy charset          ldy #$00                ;copy charset
393          .(          .(
# Line 381  hm_02 Line 443  hm_02
443          bne hm_04          bne hm_04
444          rts          rts
445    
446    
447    
448    
449    
450    
451    UnpackError
452            rts
453    
454    
455    
456    GetNextByte
457            php
458            lda __fetchByte+1
459            bne __fetchByte
460            nop
461            nop
462            nop
463            nop
464            sei
465            jsr     ReadNextSector
466            nop
467            nop
468            nop
469            nop
470            cli
471            ldx #0
472            ldy #0
473    __fetchByte
474            lda $200
475            inc __fetchByte+1
476            plp
477            rts
478    
479    /*
480    GetNextByte
481            lda (ptr_source),y              
482            ; Move stream pointer (one byte)
483            .(
484            inc ptr_source                  
485            bne skip
486            inc ptr_source+1
487    skip
488            .)
489            rts
490    */
491    
492    
493    
494    ; void file_unpack(void *ptr_dst,void *ptr_src)
495    
496    ; Need to be called with valid values in:
497    ; ptr_destination
498    ; ptr_source
499    ; ptr_destination_end (Destination + size)
500    UnpackData
501            ;jmp UnpackData
502    .(
503            cli
504    
505            ; Initialise variables
506            ; We try to keep "y" null during all the code,
507            ; so the block copy routine has to be sure that
508            ; y is null on exit
509            ldy #0
510            sty __fetchByte+1
511            lda #1
512            sta mask_value
513            
514    unpack_loop
515            ; Handle bit mask
516            lsr mask_value
517            bne end_reload_mask
518            
519            jsr GetNextByte         ; Read from source stream
520    
521            ror
522            sta mask_value  
523    end_reload_mask
524            bcc back_copy
525    
526    write_byte
527            ; Copy one byte from the source stream
528            jsr GetNextByte         ; Read from source stream
529            sta (ptr_destination),y
530    
531            lda #1
532            sta nb_dst
533    
534    
535    
536    _UnpackEndLoop
537            ;// We increase the current destination pointer,
538            ;// by a given value, white checking if we reach
539            ;// the end of the buffer.
540            clc
541            lda ptr_destination
542            adc nb_dst
543            sta ptr_destination
544    
545            .(
546            bcc skip
547            inc ptr_destination+1
548    skip
549            .)
550            cmp ptr_destination_end
551            lda ptr_destination+1
552            sbc ptr_destination_end+1
553            bcc unpack_loop  
554            rts
555            
556    
557    back_copy
558            ;BreakPoint jmp BreakPoint      
559            ; Copy a number of bytes from the already unpacked stream
560            ; Here we know that y is null. So no need for clearing it.
561            ; Just be sure it's still null at the end.
562            ; At this point, the source pointer points to a two byte
563            ; value that actually contains a 4 bits counter, and a
564            ; 12 bit offset to point back into the depacked stream.
565            ; The counter is in the 4 high order bits.
566            ;clc  <== No need, since we access this routie from a BCC
567            jsr GetNextByte         ; Read from source stream
568            adc #1
569            sta offset
570            jsr GetNextByte         ; Read from source stream
571            tax
572            and #$0f
573            adc #0
574            sta offset+1
575    
576            txa
577            lsr
578            lsr
579            lsr
580            lsr
581            clc
582            adc #3
583            sta nb_dst
584    
585            sec
586            lda ptr_destination
587            sbc offset
588            sta ptr_source_back
589            lda ptr_destination+1
590            sbc offset+1
591            sta ptr_source_back+1
592    
593            ; Beware, in that loop, the direction is important
594            ; since RLE like depacking is done by recopying the
595            ; very same byte just copied... Do not make it a
596            ; reverse loop to achieve some speed gain...
597            .(
598    copy_loop
599            lda (ptr_source_back),y ; Read from already unpacked stream
600            sta (ptr_destination),y ; Write to destination buffer
601            iny
602            cpy nb_dst
603            bne copy_loop
604            .)
605            ldy #0
606            beq _UnpackEndLoop
607            rts
608    .)
609    
610    
611    ; Taille actuelle du code 279 octets
612    ; 0x08d7 - 0x07e8 => 239 octets
613    ; 0x08c8 - 0x07e5 => 227 octets
614    ; 0x08d5 - 0x0800 => 213 octets
615    ; 0x08c9 - 0x0800 => 201 octets
616    ; 0x08c5 - 0x0800 => 197 octets
617    ; 0x08c3 - 0x0800 => 195 octets
618    ; 0x08c0 - 0x0800 => 192 octets
619    ; => 146 octets
620    
621    
622  _EndLoaderCode  _EndLoaderCode
623    
624  ;  ;
# Line 415  _VectorIRQ                     .word IrqHandler                ; FFFE-F Line 653  _VectorIRQ                     .word IrqHandler                ; FFFE-F
653    
654  ; End of the loader - Nothing should come after because it's out of the addressable memory range :)  ; End of the loader - Nothing should come after because it's out of the addressable memory range :)
655    
656    #print (UnpackError -SoftHiresWithCopyCharset)

Legend:
Removed from v.1037  
changed lines
  Added in v.1038

  ViewVC Help
Powered by ViewVC 1.1.26