diff --git a/024.simple_text/Makefile b/024.simple_text/Makefile index fb3ea20..e885d10 100644 --- a/024.simple_text/Makefile +++ b/024.simple_text/Makefile @@ -5,7 +5,7 @@ BASE_ADDRESS=4000 # if you change this you must also change link.script.x # note: this must be high enough not to conflict with MFMbufE BOOTBLOCK_ASM=alpine_bootblock.s -OBJS=out/init.o out/utils.o out/trackloader.o out/image.o out/disk.o out/blittext.o out/cpu.o out/blit.o +OBJS=out/init.o out/utils.o out/image.o out/blittext.o out/cpu.o out/blit.o IMAGES=font.png IMAGEDATA=$(addprefix out/, $(IMAGES:.png=.bin)) diff --git a/024.simple_text/README.md b/024.simple_text/README.md index aacc3ee..d269e73 100644 --- a/024.simple_text/README.md +++ b/024.simple_text/README.md @@ -1,19 +1,9 @@ -photo slideshow -=============== +simple text +=========== -The main theme of this demo is trackloading data whilst the application is running. - -We cram a DD floppy full of image and music data, then load and display each image in turn whilst playing a P61 module. - -There are quite a few new things in here: - - * We use a [modified bootloader](alpine_bootloader.s) that reads the size of the main program from the disk before trackloading it. - * Photon's trackloader is also now copied into the main program so it can be used to load subsequent data. - * We use multiple sections and a [linker script](link.script.x) to help with organising data on the ADF image. The linker script is not technically required, however I wanted to see what I could do with vlink and linker scripts. - * We switched to the [doynamite68k](https://github.com/AxisOxy/Planet-Rocklobster/tree/master/tools/doynamite68k) compressor/decompressor. The compressed file are larger than those generated by Shinkler, however the decompressor is a lot faster. - * P61 is configured to use CIA mode. +Work in progress try it ------ - * [Download disk image](bin/slideshow.adf?raw=true) - * Run in SAE + * [Download disk image](bin/simple_text.adf?raw=true) + * Run in SAE diff --git a/024.simple_text/disk.s b/024.simple_text/disk.s deleted file mode 100644 index b763365..0000000 --- a/024.simple_text/disk.s +++ /dev/null @@ -1,27 +0,0 @@ - xdef LoadDiskData - -LoadDiskData: - ;; a0 - destination address - ;; a1 - start address - ;; d0 - size - movem.l d0-a6,-(sp) - lea $dff002,a6 ; LoadMFMB uses this custom base addr - - move.l d0,d1 - - move.l a1,d0 - move.l #startCode,d2 - sub.l d2,d0 ; offset from start of this module - lsr.l #6,d0 ; bytes -> sectors - lsr.l #3,d0 - add.l #2,d0 ; offset for bootblock - - - add.l #512,d1 - lsr.l #6,d1 ; bytes -> sectors - lsr.l #3,d1 - neg.w d1 - jsr LoadMFMB ; load the data! - - movem.l (sp)+,d0-a6 - rts diff --git a/024.simple_text/font.png b/024.simple_text/font.png deleted file mode 100644 index 67f0b54..0000000 Binary files a/024.simple_text/font.png and /dev/null differ diff --git a/024.simple_text/module.s b/024.simple_text/module.s deleted file mode 100644 index fd10212..0000000 --- a/024.simple_text/module.s +++ /dev/null @@ -1,21 +0,0 @@ - xdef LoadModule - -LoadModule: - movem.l d0-a6,-(sp) - lea bitplanes1,a0 - lea compressedModule,a1 - move.l #endCompressedModule,d0 - sub.l #compressedModule,d0 - ;; a0 - destination address - ;; a1 - start address - ;; d0 - size - jsr LoadDiskData - - ;; a0 - input buffer to be decompressed. Must be 16-bit aligned! - ;; a1 - output buffer. Points to the end of the data at exit - lea bitplanes1,a0 - lea Module,a1 - jsr Depack - - movem.l (sp)+,d0-a6 - rts \ No newline at end of file diff --git a/024.simple_text/trackloader.s b/024.simple_text/trackloader.s deleted file mode 100644 index 92cf07a..0000000 --- a/024.simple_text/trackloader.s +++ /dev/null @@ -1,203 +0,0 @@ -*** MFMLoader.S by Photon *** ;requires a6=$dff002 - - xdef LoadMFMB - -MFMsync equ $4489 ;AmigaDOS standard sync marker. -MFMlen equ 12980 ;Legacy trackdata read length in bytes - -ShortWt:MACRO ;CPU-independent nop;nop replacement - tst.w (a6) - ENDM - -MFMcyl: dc.w 0 -MFMhead: dc.w 0 -MFMdrv: dc.w 0 -MFMchk: dc.l 0 - -LoadMFMB: ;loadsectors.a0=dst,d0=startsec.W,d1=nrsecs.W(-=Step0) - MOVEM.L D0-D7/A0-A6,-(SP) - lea $bfd100,a4 - bsr MotorOn - tst.w d1 ;if neg length,then Step0 first - bpl.s .NoSt0 - neg.w d1 -.St0: btst #4,$f01(a4) ;head on cyl 0? - beq.s .Rdy0 - bsr.s StepOut - bra.s .St0 -.Rdy0: lea MFMcyl(PC),a1 - clr.w (a1) -.NoSt0: and.l #$ffff,d0 - divu #22,d0 ;startcyl - sub.w MFMcyl(PC),d0 ;delta-step - beq.s .StRdy - bmi.s .StOut - subq.w #1,d0 -.StIn: bsr.s StepIn - dbf d0,.StIn - bra.s .StRdy - not.w d0 ;=neg+sub#1 -.StOut: bsr.s StepOut - dbf d0,.StIn -.StRdy: swap d0 ;startsec within cyl - cmp.w #11,d0 - blt.s .Head0 - sub.w #11,d0 - bra.s .Head1 -.Head0: bset #2,(a4) - lea MFMhead(PC),a1 - clr.w (a1) - bsr LoadTrak ;read track+decode - beq.s .End -.Head1: bclr #2,(a4) ;Head 1 - lea MFMhead(PC),a1 - move.w #1,(a1) - bsr LoadTrak ;read track+decode - beq.s .End - bsr.s StepIn ;1 cyl forward - bra.s .Head0 -.End: bsr.s MotorOff - MOVEM.L (SP)+,D0-D7/A0-A6 - RTS - -StepOut: - bset #1,(a4) - lea MFMcyl(PC),a1 - subq.w #1,(a1) - ShortWt - bclr #0,(a4) - ShortWt - bset #0,(a4) - bsr.s StepWt - RTS - -StepIn: - bclr #1,(a4) - lea MFMcyl(PC),a1 - addq.w #1,(a1) - ShortWt - bclr #0,(a4) - ShortWt - bset #0,(a4) - bsr.s StepWt - RTS - -StepWt: - moveq #67,d6 ;wait >3 ms -LeaveLine: -.loop1: move.b 6-2(a6),d7 -.loop2: cmp.b 6-2(a6),d7 - beq.s .loop2 - dbf d6,.loop1 - RTS - -MotorOn: - move.w MFMdrv(PC),d7 - addq.w #3,d7 - or.b #$78,(a4) - bset d7,(a4) - ShortWt - bclr #7,(a4) ;turns motor on - ShortWt - bclr d7,(a4) - ShortWt -.DiskR: btst #5,$f01(a4) ;wait until motor running - bne.s .DiskR - RTS - -MotorOff: - move.w MFMdrv(PC),d7 - addq.w #3,d7 - bset d7,(a4) - ShortWt - bset #7,(a4) - ShortWt - bclr d7,(a4) - RTS - -LoadTrak: ;loadtrack+decode.a0=dst,d0=secoffs,d1=secsleft - MOVE.W D0,-(SP) - MOVE.W D1,-(SP) - lea MFMbuf,a1 - move.w #2,$9c-2(a6) ;Clr Req - move.l a1,$20-2(a6) - move.w #$8210,$96-2(a6) ;DskEna - move.w #MFMsync,$7e-2(a6) - move.w #$9500,$9e-2(a6) - move.w #$4000,$24-2(a6) - move.w #$8000+MFMlen/2,$24-2(a6);DskLen(12980)+DmaEn - move.w #$8000+MFMlen/2,$24-2(a6);start reading MFMdata -.Wrdy: - btst #1,$1f-2(a6) ;wait until data read - beq.s .Wrdy - move.w d0,d2 - add.w d1,d2 ;highest sec# (d0=lowest) - cmp.w #11,d2 - ble.s .NoOvr - moveq #11,d2 -.NoOvr: sub.w d0,d2 ;nrsecs - move.l #$55555555,d3 ;and-const - move.w d2,d1 - subq.w #1,d1 ;loopctr -.FindS: cmp.w #MFMsync,(a1)+ ;search for a sync word - bne.s .FindS - cmp.b (a1),d3 ;search for 0-nibble - bne.s .FindS - move.l (a1)+,d4 ;decode fmtbyte/trk#,sec#,eow# - move.l (a1)+,d5 - and.w d3,d4 - and.w d3,d5 - add.w d4,d4 - or.w d5,d4 - lsr.w #8,d4 ;sec# - sub.w d0,d4 ;do we want this sec? - bmi.s .Skip - cmp.w d2,d4 - blt.s .DeCode -.Skip: lea 48+1024(a1),a1 ;nope - bra.s .FindS -.DeCode:lea 40(a1),a1 ;found a sec,skip unnecessary data - move.l a1,d6 - lea MFMchk(PC),a1 - clr.l (a1) - move.l d6,a1 - move.l (a1)+,d6 ;decode data chksum.L - move.l (a1)+,d5 - and.l d3,d6 - and.l d3,d5 - add.l d6,d6 - or.l d5,d6 ;chksum - lea 512(a1),a2 - add.w d4,d4 ;x512 - lsl.w #8,d4 - lea (a0,d4.w),a3 ;dest addr for this sec - moveq #127,d7 -.DClup: move.l (a1)+,d4 - move.l (a2)+,d5 - and.l d3,d4 - and.l d3,d5 - eor.l d4,d6 ;EOR with checksum - eor.l d5,d6 ;EOR with checksum - add.l d4,d4 - or.l d5,d4 - move.l d4,(a3)+ - dbf d7,.DClup ;chksum should now be 0 if correct - lea MFMchk(PC),a1 - or.l d6,(a1) ;or with track total chksum - move.l a2,a1 - dbf d1,.FindS ;decode next sec - MOVE.W (SP)+,D1 - MOVE.W (SP)+,D0 - move.l MFMchk(PC),d3 ;track total chksum OK? - bne LoadTrak ;no,retry - moveq #0,d0 ;set to start of track - move.w d2,d3 - add.w d3,d3 - lsl.w #8,d3 - add.w d3,a0 - sub.w d2,d1 ;sub #secs loaded - RTS - -;MFMbuf is placed here after bootblock end, $3c0.w or so when copied. -MFMbuf: - dcb.b MFMlen