include "includes.i" xdef copperList xdef onscreen xdef offscreen xdef copperListBplPtr Y_POS equ 8 NUM_LINES equ 27 byteMap: dc.l Entry dc.l endCode-byteMap Entry: lea userstack,a7 lea CUSTOM,a6 move #$7ff,DMACON(a6) ; disable all dma move #$7fff,INTENA(a6) ; disable all interrupts jsr InstallPalette lea Level3InterruptHandler,a3 move.l a3,LVL3_INT_VECTOR jsr SwitchBuffers move.w #(INTF_SETCLR|INTF_VERTB|INTF_INTEN),INTENA(a6) move.w #(DMAF_BLITTER|DMAF_SETCLR!DMAF_MASTER),DMACON(a6) move.l onscreen,a0 move.l #BACKGROUND_COLOR,d0 move.w #SCREEN_HEIGHT,d1 move.w #0,d2 ; ypos jsr BlitFillColor move.l offscreen,a0 move.l #BACKGROUND_COLOR,d0 move.w #SCREEN_HEIGHT,d1 move.w #0,d2 ; ypos jsr BlitFillColor WaitBlitter jsr Init ; enable the playfield MainLoop: jsr WaitVerticalBlank move.l #NUM_LINES-1,d3 .loop: bsr UpdateLine dbra d3,.loop jsr SwitchBuffers bra MainLoop UpdateLine: ;; d3 - line number movem.l d0-a6,-(sp) lea.l textLookupTable,a2 move.l d3,d4 mulu.w #16,d4 ; #16 is size of lookup table entry add.l d4,a2 ; address of line's entry in the textLookupTable cmp.l #8,8(a2) bne .shift .drawtext: move.l #BITPLANE_WIDTH-16,d0 ; xpos move.l onscreen,a0 move.l #FONT_HEIGHT+1,d1 ; ypos move.l d3,d4 ; line number bsr GetNextChar mulu.w d3,d1 ; y pos jsr BlitChar8 move.l #0,8(a2) ; reset shift counter .shift: move.l offscreen,a0 ; dest move.l onscreen,a1 ; src move.l #FONT_HEIGHT,d1 ; height move.l #FONT_HEIGHT+1,d2 ; ypos mulu.w d3,d2 move.l 12(a2),d0 ; bits to shift per frame jsr BlitScroll ; scroll line add.l d0,8(a2) ; current shift counter += bits to shift per frame movem.l (sp)+,d0-a6 rts GetNextChar: ;; d4 - line number ;; a2 - address of textLookupTable entry ;; d2 (out) - next char movem.l a3,-(sp) move.l (a2),a3 ; address of next char cmp.b #0,(a3) ; check for null termination bne .moreText .wrapText: move.l 4(a2),(a2) ; reset current char pointer to reset value .moreText: add.l #1,(a2) ; increment current char pointer sub.l d2,d2 ; clear d2 move.b (a3),d2 ; d2 (out) = next char movem.l (sp)+,a3 rts Level3InterruptHandler: movem.l d0-a6,-(sp) lea CUSTOM,a6 .checkVerticalBlank: move.w INTREQR(a6),d0 and.w #INTF_VERTB,d0 beq.s .checkCopper .verticalBlank: move.w #INTF_VERTB,INTREQ(a6) ; clear interrupt bit .checkCopper: move.w INTREQR(a6),d0 and.w #INTF_COPER,d0 beq.s .interruptComplete .copperInterrupt: move.w #INTF_COPER,INTREQ(a6) ; clear interrupt bit .interruptComplete: movem.l (sp)+,d0-a6 rte textLookupTable: dc.l text1 ; line 1 - current char pointer dc.l text2 ; line 1 - reset to this address on null dc.l 8 ; line 1 - current shift counter dc.l 1 ; line 1 - bits to shift per frame (scroll speed) dc.l text3 ; line 2 - current char pointer dc.l text4 ; line 2 - reset to this address on null dc.l 8 ; line 2 - current shift counter dc.l 2 ; line 2 - bits to shift per frame (scroll speed) dc.l text5 ; etc dc.l text4 dc.l 8 dc.l 4 dc.l text3 dc.l text2 dc.l 8 dc.l 8 dc.l text1 dc.l text2 dc.l 8 dc.l 4 dc.l text3 dc.l text4 dc.l 8 dc.l 2 dc.l text1 dc.l text3 dc.l 8 dc.l 1 dc.l text5 dc.l text1 dc.l 8 dc.l 2 dc.l text1 dc.l text2 dc.l 8 dc.l 4 dc.l text3 dc.l text1 dc.l 8 dc.l 8 dc.l text5 dc.l text5 dc.l 8 dc.l 4 dc.l text4 dc.l text4 dc.l 8 dc.l 2 dc.l text2 dc.l text4 dc.l 8 dc.l 1 dc.l text1 dc.l text2 dc.l 8 dc.l 2 dc.l text4 dc.l text5 dc.l 8 dc.l 4 dc.l text2 dc.l text3 dc.l 8 dc.l 8 dc.l text1 dc.l text3 dc.l 8 dc.l 4 dc.l text3 dc.l text4 dc.l 8 dc.l 2 dc.l text5 dc.l text2 dc.l 8 dc.l 1 dc.l text3 dc.l text3 dc.l 8 dc.l 2 dc.l text1 dc.l text4 dc.l 8 dc.l 4 dc.l text4 dc.l text3 dc.l 8 dc.l 8 dc.l text2 dc.l text3 dc.l 8 dc.l 4 dc.l text4 dc.l text5 dc.l 8 dc.l 2 dc.l text1 dc.l text2 dc.l 8 dc.l 1 dc.l text3 dc.l text4 dc.l 8 dc.l 2 dc.l text3 dc.l text2 dc.l 8 dc.l 4 dc.l text1 dc.l text2 dc.l 8 dc.l 8 dc.l text3 dc.l text4 dc.l 8 dc.l 4 dc.l text4 dc.l text5 dc.l 8 dc.l 2 text1: dc.b "In this chapter, you will learn how to use the Amiga's graphics coprocessor (or Copper) and its simple instruction set to organize mid-screen register value modifications and pointer register set-up during the vertical blanking interval. The chapter shows how to organize Copperinstructions into Copper lists, how to use Copper lists in interlacedmode, and how to use the Copper with the blitter. The Copper is discussed in this chapter in a general fashion. The chapters that deal withplayfields, sprites, audio, and the blitter contain more specificsuggestions for using the Copper." dc.b 0 text2: dc.b "The Amiga is a family of personal computers sold by Commodore in the 1980s and 1990s. Based on the Motorola 68000 family of microprocessors, the machine has a custom chipset with graphics and sound capabilities that were unprecedented for the price, and a pre-emptive multitasking operating system called AmigaOS." dc.b 0 text3: dc.b "This repo contains example programs I have written as I re-learn how to program an amiga. The programs are written in assembler and directly access the hardware. The target is an Amiga 500 (my long lost friend). Currently I do not own an amiga, so I can only test using UAE, so it's possible they will not work on the real hardware." dc.b 0 text4: dc.b "The Amiga 1000 was officially released in July 1985, but a series of production problems meant it did not become widely available until early 1986. The best selling model, the Amiga 500, was introduced in 1987 and became one of the leading home computers of the late 1980s and early 1990s with four to six million sold.[1] The A3000, introduced in 1990, started the second generation of Amiga systems, followed by the A500+ and the A600. Finally, as the third generation, the A1200 and the A4000 were released in 1992. The platform became particularly popular for gaming and programming demos. It also found a prominent role in the desktop video, video production, and show control business, leading to affordable video editing systems such as the Video Toaster. The Amiga's native ability to simultaneously play back multiple digital sound samples made it a popular platform for early 'tracker' music software. The relatively powerful processor and ability to access several megabytes of memory led to the development of several 3D rendering packages, including LightWave 3D, Imagine, Aladdin 4D, and TurboSilver." dc.b 0 text5: dc.b "Although early Commodore advertisements attempt to cast the computer as an all-purpose business machine, especially when outfitted with the Amiga Sidecar PC compatibility addon, the Amiga was most commercially successful as a home computer, with a wide range of games and creative software.[2][3] It was also a less expensive alternative to the Apple Macintosh and IBM PC as a general-purpose business or home computer. Initially, the Amiga was developed alongside various Commodore PC clones, but Commodore later left the PC market. Poor marketing and the failure of the later models to repeat the technological advances of the first systems meant that the Amiga quickly lost its market share to competing platforms, such as the fourth generation game consoles, Apple Macintosh, and later IBM PC compatibles.[1] Commodore ultimately went bankrupt in April 1994 after the 'make or break' Amiga CD32 model failed in the marketplace." dc.b 0 endText: dc.b 0 align 4 copperList: copperListBplPtr: dc.w BPL1PTL,0 dc.w BPL1PTH,0 dc.w BPL2PTL,0 dc.w BPL2PTH,0 dc.w BPL3PTL,0 dc.w BPL3PTH,0 dc.w BPL4PTL,0 dc.w BPL4PTH,0 dc.w BPL5PTL,0 dc.w BPL5PTH,0 dc.w BPL6PTL,0 dc.w BPL6PTH,0 dc.w COLOR01,$fff dc.w $3507,$fffe dc.w COLOR01,$0f0 dc.w $3e07,$fffe dc.w COLOR01,$f00 dc.w $4707,$fffe dc.w COLOR01,$00f dc.w $5007,$fffe dc.w COLOR01,$0ff dc.w $5907,$fffe dc.w COLOR01,$ff0 dc.w $6207,$fffe dc.w COLOR01,$f0f dc.w $6b07,$fffe dc.w COLOR01,$555 dc.w $7407,$fffe dc.w COLOR01,$70e dc.w $7d07,$fffe dc.w COLOR01,$e07 dc.w $8607,$fffe dc.w COLOR01,$e70 dc.w $8f07,$fffe dc.w COLOR01,$7e7 dc.w $9807,$fffe dc.w COLOR01,$e77 dc.w $a107,$fffe dc.w COLOR01,$77e dc.w $aa07,$fffe dc.w COLOR01,$25e dc.w $b307,$fffe dc.w COLOR01,$e52 dc.w $bc07,$fffe dc.w COLOR01,$5e2 dc.w $c507,$fffe dc.w COLOR01,$ABC dc.w $ce07,$fffe dc.w COLOR01,$486 dc.w $d707,$fffe dc.w COLOR01,$787 dc.w $e007,$fffe dc.w COLOR01,$500 dc.w $e907,$fffe dc.w COLOR01,$9fa dc.w $f207,$fffe dc.w COLOR01,$222 dc.w $fb07,$fffe dc.w COLOR01,$ccc dc.w $ffdf,$fffe dc.w $407,$fffe dc.w COLOR01,$f00 dc.w $d07,$fffe dc.w COLOR01,$0f0 dc.w $1607,$fffe dc.w COLOR01,$00f dc.l $fffffffe InstallPalette: include "out/font8x8-palette.s" rts GreyPalette: include "out/font8x8-grey.s" rts onscreen: dc.l bitplanes1 offscreen: dc.l bitplanes2 section .bss bitplanes1: ds.b IMAGESIZE+(512) bitplanes2: ds.b IMAGESIZE+(512*2) startUserstack: ds.b $1000 ; size of stack userstack: