; Demo STE
; --------
; by Martin Backschat, editor of ST-Magazin, Markt&Technik AG, West Germany
; ! this demo is public domain !

; for what: Demo showing the new features of the STE
; - horizontical hardware scrolling of 70 lines (4 bitplanes)
; - digital sound output (monitor speakers & stereo output)
; - all 4096 colors on screen

; by the way, demo was developped using OMIKRON.ASSEMBLER!
; but i think it works fine with different assemblers.
; please notice, that no code optimation (branches...) was done, due to
; the fact omikron.assembler optimizes automatically.

splitline:      EQU 70

                TEXT
; create 4096 color palette in >mypalette< ------------
          lea           calcpal,A1      ; pointer to table 3210->0321 color form
          lea           mypalette,A0

          move.w        #0,D5           ; start with color 000
          move.w        #128-1,D7       ; generate 128 lines
b:
          move.w        #32-1,D6        ; 128 lines by 32 COLORS per line
          move.w        D5,D0
a:
; transform color 3210 into 0321
          move.w        D0,-(SP)
          cmpi.w        #16,D6
          bge           ok
          move.w        D0,D1
          not.w         D1
          andi.w        #$0F00,D1
          andi.w        #$FF,D0
          or.w          D1,D0
          addi.w        #$80,D0
ok:
          move.w        D0,D2
          andi.w        #$0F,D2
          lsl.w         #1,D2
          move.w        0(A1,D2.w),D2
          move.w        D0,D3
          andi.w        #$F0,D3
          lsr.w         #3,D3
          move.w        0(A1,D3.w),D3
          lsl.w         #4,D3
          add.w         D3,D2
          move.w        D0,D4
          andi.w        #$0F00,D4
          lsr.w         #7,D4
          move.w        0(A1,D4.w),D4
          lsl.w         #8,D4
          add.w         D4,D2
          move.w        D2,(A0)+
          move.w        (SP)+,D0

          addi.w        #$0100,D0
          dbra          D6,a
          addq.w        #1,D5
          dbra          D7,b


; system initiation ----------------

          clr.l         -(SP)
          move.w        #$20,-(SP)
          trap          #1              ; enter super mode
          lea           stack,SP        ; my own stack!
          move.l        D0,spvi

          cmpi.w        #$E0,$68        ; Ste or normal ST?
          bne           abort           ; (using hbl is foul, but it works!)

          move.w        #4,-(SP)
          trap          #14             ; save resolution
          addq.l        #2,SP
          cmp.w         #2,D0
          beq           abort           ; not working in monochrome!
          move.w        D0,-(SP)

          move.w        #2,-(SP)
          trap          #14
          addq.l        #2,SP
          move.l        D0,-(SP)        ; save screen location
          move.l        D0,-(SP)

          clr.w         -(SP)
          pea           -1
          pea           -1
          move.w        #5,-(SP)
          trap          #14             ; enter low res.
          lea           12(SP),SP
          move.w        #37,-(SP)
          trap          #14             ; make sure we're in lowres
          addq.l        #2,SP

; --- load sound file

          clr.w         -(SP)
          pea           sound
          move.w        #$3D,-(SP)
          trap          #1
          addq.l        #8,SP
          tst.w         D0
          bmi           abort           ; open error -> exit programme
          move.w        D0,-(SP)

          pea           sndstart        ; load 122226 of sound file
          pea           122226
          move.w        D0,-(SP)
          move.w        #$3F,-(SP)
          trap          #1
          lea           12(SP),SP

          move.w        #$3E,-(SP)
          trap          #1
          addq.l        #4,SP

; --- load degas elite picture

          clr.w         -(SP)
          pea           muster
          move.w        #$3D,-(SP)
          trap          #1
          addq.l        #8,SP
          tst.w         D0
          bmi           abort           ; open error -> exit programme
          move.w        D0,-(SP)

          pea           picture
          pea           32034
          move.w        D0,-(SP)
          move.w        #$3F,-(SP)
          trap          #1
          lea           12(SP),SP

          move.w        #$3E,-(SP)
          trap          #1
          addq.l        #4,SP

; prepare screen ----------------

          lea           pic+(splitline*160),A0 ; address of 4096 color screen
          move.l        A0,picline69

          lea           pic,A0
          lea           scrollpic,A1    ; screen for double-lined screen
          move.w        #splitline-1,D0
ps0:
          move.w        #40-1,D1
ps1:
          move.l        (A0)+,(A1)+
          dbra          D1,ps1
          lea           -160(A0),A0
          move.w        #40-1,D1        ; duplicate each line
ps2:
          move.l        (A0)+,(A1)+
          dbra          D1,ps2
          dbra          D0,ps0


; feeze system -----------------

          move          #$2700,SR

          lea           $FF8240,A0
          lea           oldpal,A1
          move.w        #15,D0
savpal:
          move.w        (A0)+,(A1)+     ; save old color palette
          dbra          D0,savpal

          lea           $FFFA00,A0
          movep.w       $07(A0),D0      ; save enable-register a,b
          movep.w       $13(A0),D1      ; save mask-register a,b
          movem.w       D0-D1,-(SP)
          move.b        #1,$13(A0)      ; enable TiB
          clr.b         $15(A0)

          move.l        $70,-(SP)
          move.l        #vbl,$70        ; set my own vbl
          move.l        #timerb1,$0120  ; set my own TiB-irq (first of 3)
          move.l        #mypalette,palptr ; initially point to head of palette

; ------------ enable digital sound

          lea           $FF8900,A0
          move.l        #sndend,D0
          movep.l       D0,$0D(A0)
          move.l        #sndstart,D0
          movep.l       D0,1(A0)

          move.w        #$07FF,$24(A0)
          move.w        #%10011101000,D0 ; master volume 0 db
          bsr           writemw
          move.w        #%10101110100,D0 ; left channel 0 db
          bsr           writemw
          move.w        #%10100110100,D0 ; right channel 0 db
          bsr           writemw
          move.w        #%10010110000,D0 ; set treble 0 db
          bsr           writemw
          move.w        #%10001110110,D0 ; set bass 0 db
          bsr           writemw

          move.w        #%10000010,$20(A0) ; mono 25 kHz
          move.w        #%11,$00(A0)    ; enable loop sound

          move          #$2300,SR       ; enable my work

; the wait-for-godot do-nothing-routine -------------

wait:
          cmpi.b        #$39,$FFFC02    ; wait for SPACE
          bne           wait

; enable system --------------

          move          #$2700,SR       ; hold my work

          clr.w         $FF8900         ; stop sound
          lea           $FF8200,A0
          clr.b         $0F(A0)         ; clear low byte of screen location
          clr.b         $0D(A0)         ; clear linewid
          clr.b         $65(A0)         ; clear hscroll

          move.l        (SP)+,$70       ; restore vbl

          movem.w       (SP)+,D0-D1
          lea           $FFFA00,A0
          movep.w       D0,$07(A0)      ; restore mfp-registers
          movep.w       D1,$13(A0)

          lea           oldpal,A0
          lea           $FF8240,A1
          move.w        #15,D0
restpal:  move.w        (A0)+,(A1)+
          dbra          D0,restpal      ; restore old color palette

          move          #$2300,SR       ; enable system work finally

          move.w        #5,-(SP)
          trap          #14             ; restore resolution
          lea           12(SP),SP

abort:
          move.l        spvi,-(SP)
          move.w        #$20,-(SP)
          trap          #1              ; back to user mode
          clr.w         -(SP)
          trap          #1              ; quit programm


; ------------ my own vbl
vbl:
          lea           $FF8200,A0
          move.b        #80,D3          ; linewid = 80 words

          move.l        #scrollpic,D0   ; scroll upper part of screen
          move.l        offs,D1
          move.w        bitoffs,D2
          cmpi.b        #16-1,D2
          blo           vblscr1
          clr.w         D2
          cmp.l         #160-8,D1       ; reach end of line?
          bge           vblscr1a
          addq.l        #8,D1
          bra           vblscr2
vblscr1a:
          clr.l         D1
          bra           vblscr2
vblscr1:
          addi.b        #1,D2
          subi.b        #4,D3
vblscr2:
          move.b        D2,$65(A0)
          move.w        D2,bitoffs
          move.b        D3,$0F(A0)
          move.l        D1,offs
          add.l         D1,D0
          movep.l       D0,$03(A0)

          movem.l       picpalette,D0-D7 ; use my own colors in upper part
          movem.l       D0-D7,$40(A0)

          move.b        #1,$FFFA07      ; enable TiB-irq
          clr.b         $FFFA1B
          move.b        #splitline,$FFFA21 ; countdown 1 line
          move.b        #8,$FFFA1B
          move.l        #timerb1,$0120  ; reset TiB-irq-pointer

          move.l        #mypalette,palptr ; initialize palptr for TiB-irq
          rte

; ------------ my own TiB-irq
timerb1:
          lea           $FF8200,A0
          clr.b         $0F(A0)         ; linewid = 0 words
          clr.b         $65(A0)         ; hscroll = 0
          move.l        picline69,D0    ; set screen location
          movep.l       D0,$03(A0)
ss:
          move.l        #timerb2,$0120  ; set pointer to routine II
          clr.b         $FFFA1B
          move.b        #1,$FFFA21      ; wait for 1 line
          move.b        #8,$FFFA1B
          bclr          #0,$FFFA0F      ; serve TiB in
          rte

timerb2:
          movea.l       palptr,A5
          lea           $FF8242,A6
          move.l        (A5)+,(A6)+     ; write  32 colors (15+15+2)
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.w        (A5)+,(A6)+
          lea           $FF8242,A6
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.l        (A5)+,(A6)+
          move.w        (A5)+,(A6)
          move.l        (A5)+,$FF8242
          move.l        A5,palptr
          bclr          #0,$FFFA0F
          rte

; subroutine for writing data into microwire-interface
writemw:
          cmpi.w        #$07FF,$FF8924
          bne           writemw
          move.w        D0,$FF8922
          rts


; ------------  DATA STORAGE
                DATA
muster:
                DC.B "stedemo.pi1",0
sound:
                DC.B "stedemo.snd",0
                EVEN

calcpal:
                DC.W 0,%1000,%1,%1001,%10
                DC.W %1010,%11,%1011
                DC.W %100,%1100,%101
                DC.W %1101,%110,%1110,%111,%1111

rainbow:
                DC.W $0432,$0543,$0654,$0765
                DC.W $20,$40,$50,$70,$05,$07
                DC.W 0,0,0,0,0
                DC.W $0432,$0543,$0654,$0765
                DC.W $20,$40,$50,$70,$05,$07
                DC.W 0,0,0,0,0
                DC.W $0432,$0543

; ------------  RANDOM DATA STORAGE
                BSS
spvi:
                DS.L 1
palptr:
                DS.L 1
oldpal:
                DS.L 16         ; Original color palette

picline69:
                DS.L 1
offs:
                DS.L 1
bitoffs:
                DS.W 1

picture:
                DS.W 1
picpalette:
                DS.W 16
pic:
                DS.B 32000

                DS.L 256
stack:

mypalette:
                DS.W 4096
scrollpic:
                DS.B splitline*160*2 ; double width
sndstart:
                DS.W 122226/2
sndend:

                END
