mirror of
https://frontier.innolan.net/github/AmigaExamples.git
synced 2026-01-12 09:19:45 +00:00
Semi working text rendering
This commit is contained in:
@ -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))
|
||||
|
||||
@ -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)
|
||||
* <a href="http://alpine9000.github.io/ScriptedAmigaEmulator/#amiga_examples/slideshow.adf" target="_blank">Run in SAE</a>
|
||||
* [Download disk image](bin/simple_text.adf?raw=true)
|
||||
* <a href="http://alpine9000.github.io/ScriptedAmigaEmulator/#amiga_examples/simple_text.adf" target="_blank">Run in SAE</a>
|
||||
|
||||
@ -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
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 7.6 KiB |
@ -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
|
||||
@ -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
|
||||
Reference in New Issue
Block a user