178 lines
3.5 KiB
ArmAsm
178 lines
3.5 KiB
ArmAsm
; Graphics Module
|
|
; ---------------------------------------------------------------------------
|
|
|
|
INCDIR "c:/Users/capitano/Documents/giochino/"
|
|
INCLUDE "custom.i"
|
|
|
|
; XDEF InitGraphics
|
|
; XDEF CopperList
|
|
; XDEF Bitplane1
|
|
; XDEF ClearScreen
|
|
; XDEF DrawText
|
|
; XDEF DrawChar
|
|
|
|
; XREF Font8x8
|
|
|
|
; SECTION Code,CODE_C
|
|
|
|
InitGraphics:
|
|
lea CUSTOM,a6
|
|
|
|
; 1. Setup Bitplanes
|
|
move.w #$1200,BPLCON0(a6) ; 1 Bitplane, Color on
|
|
move.w #0,BPLCON1(a6) ; Scroll 0
|
|
move.w #0,BPLCON2(a6) ; Priority 0
|
|
move.w #0,BPL1MOD(a6) ; Modulo 0
|
|
|
|
; Setup Display Window
|
|
move.w #$2c81,DIWSTRT(a6)
|
|
move.w #$2cc1,DIWSTOP(a6)
|
|
move.w #$0038,DDFSTRT(a6)
|
|
move.w #$00d0,DDFSTOP(a6)
|
|
|
|
; 2. Setup Copper List
|
|
lea CopperList,a0
|
|
move.l a0,COP1LCH(a6)
|
|
move.w #0,COPJMP1(a6)
|
|
|
|
; 3. Setup Bitplane Pointers
|
|
lea Bitplane1,a1
|
|
move.l a1,d0
|
|
lea CopperBplPtr,a0
|
|
swap d0
|
|
move.w d0,2(a0)
|
|
swap d0
|
|
move.w d0,6(a0)
|
|
|
|
; 4. Clear Screen
|
|
bsr ClearScreen
|
|
|
|
rts
|
|
|
|
ClearScreen:
|
|
lea Bitplane1,a0
|
|
move.w #(40*256)/4-1,d0 ; Longwords
|
|
.loop:
|
|
move.l #0,(a0)+
|
|
dbf d0,.loop
|
|
rts
|
|
|
|
; DrawText
|
|
; d0 = X, d1 = Y, a0 = String
|
|
DrawText:
|
|
movem.l d0-d3/a0-a2,-(sp)
|
|
|
|
; d0 = Initial X (keep in d3 for CR)
|
|
move.w d0,d3
|
|
|
|
; Initial Setup
|
|
bsr .calcAddr
|
|
|
|
.charLoop:
|
|
move.b (a0)+,d2 ; Get char
|
|
beq.s .done ; Null terminator?
|
|
|
|
cmp.b #10,d2 ; Newline (LF)?
|
|
beq.s .newline
|
|
cmp.b #13,d2 ; CR?
|
|
beq.s .carriageReturn
|
|
|
|
sub.b #32,d2 ; ASCII adjustment
|
|
ext.w d2
|
|
|
|
; Get font address
|
|
lea Font8x8,a2
|
|
lsl.w #3,d2 ; * 8
|
|
add.w d2,a2
|
|
|
|
; Draw 8 lines of the char
|
|
move.b (a2)+,(a1)
|
|
move.b (a2)+,40(a1)
|
|
move.b (a2)+,80(a1)
|
|
move.b (a2)+,120(a1)
|
|
move.b (a2)+,160(a1)
|
|
move.b (a2)+,200(a1)
|
|
move.b (a2)+,240(a1)
|
|
move.b (a2)+,280(a1)
|
|
|
|
addq.w #1,a1 ; Next char pos
|
|
bra.s .charLoop
|
|
|
|
.newline:
|
|
addq.w #1,d1 ; Increment Y (lines)
|
|
bsr .calcAddr ; Recalculate address (Resets X to d3)
|
|
bra.s .charLoop
|
|
|
|
.carriageReturn:
|
|
; Just reset X to d3, keep Y
|
|
bsr .calcAddr
|
|
bra.s .charLoop
|
|
|
|
.done:
|
|
movem.l (sp)+,d0-d3/a0-a2
|
|
rts
|
|
|
|
.calcAddr:
|
|
lea Bitplane1,a1
|
|
move.l d1,d4 ; Copy Y
|
|
mulu #320,d4 ; Y * 320
|
|
add.l d4,a1
|
|
add.w d3,a1 ; Add Initial X
|
|
rts
|
|
|
|
; DrawChar
|
|
; d2 = Char code, d0 = X, d1 = Y
|
|
DrawChar:
|
|
movem.l d0-d3/a0-a2,-(sp)
|
|
lea Bitplane1,a1
|
|
mulu #320,d1
|
|
add.l d1,a1
|
|
add.w d0,a1
|
|
|
|
sub.b #32,d2
|
|
ext.w d2
|
|
lea Font8x8,a2
|
|
lsl.w #3,d2
|
|
add.w d2,a2
|
|
|
|
move.b (a2)+,(a1)
|
|
move.b (a2)+,40(a1)
|
|
move.b (a2)+,80(a1)
|
|
move.b (a2)+,120(a1)
|
|
move.b (a2)+,160(a1)
|
|
move.b (a2)+,200(a1)
|
|
move.b (a2)+,240(a1)
|
|
move.b (a2)+,280(a1)
|
|
|
|
movem.l (sp)+,d0-d3/a0-a2
|
|
rts
|
|
|
|
; SECTION Data,DATA_C
|
|
|
|
CNOP 0,4
|
|
CopperList:
|
|
DC.W COLOR00, $0333 ; Background
|
|
DC.W COLOR01, $0FF0 ; Text
|
|
|
|
CopperBplPtr:
|
|
DC.W BPL1PTH, $0000
|
|
DC.W BPL1PTL, $0000
|
|
|
|
; Desk Top
|
|
DC.W $2c07, $FFFE
|
|
DC.W COLOR00, $0642
|
|
|
|
; Monitor Area (Lines 80-200 approx)
|
|
DC.W $5007, $FFFE
|
|
DC.W COLOR00, $0000
|
|
|
|
; Desk Bottom
|
|
DC.W $D007, $FFFE
|
|
DC.W COLOR00, $0642
|
|
|
|
DC.W $FFFF, $FFFE
|
|
|
|
CNOP 0,4
|
|
Bitplane1:
|
|
DS.B 40*256
|