pmode 4 demo

Started by Sheldon, May 11, 2025, 04:35 PM

Previous topic - Next topic

Sheldon

Here is the source code built with dual ide (waiting on update) as well as lwasm assembler + bin

dual ide code:

    opt    forwardrefmax
#include    coco\main_lib.txt
#include    coco\disk_lib.txt
#include    coco\pmode4_lib.txt
#memstart    15904    ;$3e20
    org    $4500    ;mem start?
start
    lds    #$44e0    ;<$4500
    createsinetable()
    std    sine_table
    cg6_display(#1)
    cg6_cls(#0,#0,#0)
    cg6_cls(#1,#0,#0)
    lda    #0
    sta    my_col
;    sta    65497    ;hi speed poke cc3
    clr    page
    lda    #0
    sta    rotation
    lda    #128
    sta    rotation5
dostart
    cg6_scroll_left(page,#1)
    lda    rotation
    adda    #4
    sta    rotation
    plot(sine_table,#175,#96,#40,#50,rotation)
    std    my_x1
    plot(sine_table,my_x1,my_y1,#10,#20,rotation)
    std    my_x1
    lda    rotation
    adda    #32
    sta    rotation2
    plot(sine_table,my_x1,my_y1,#10,#20,rotation2)
    std    my_x2
    cg6_line(page,my_x1,my_y1,my_x2,my_y2,#1)
    lda    rotation
    adda    #64
    sta    rotation3
    plot(sine_table,#127,#96,#40,#50,rotation3)
    std    my_x1
    plot(sine_table,my_x1,my_y1,#10,#20,rotation3)
    std    my_x1
    lda    rotation3
    adda    #32
    sta    rotation4
    plot(sine_table,my_x1,my_y1,#10,#20,rotation4)
    std    my_x2
    cg6_line(page,my_x1,my_y1,my_x2,my_y2,#0)
;second
    lda    rotation5
    suba    #4
    sta    rotation5
    plot(sine_table,#127,#96,#40,#50,rotation5)
    std    my_x1
    plot(sine_table,my_x1,my_y1,#20,#10,rotation5)
    std    my_x1
    lda    rotation5
    suba    #32
    sta    rotation6
    plot(sine_table,my_x1,my_y1,#20,#10,rotation6)
    std    my_x2
    cg6_line(page,my_x1,my_y1,my_x2,my_y2,#1)
    lda    rotation5
    suba    #64
    sta    rotation7
    plot(sine_table,#79,#96,#40,#50,rotation7)
    std    my_x1
    plot(sine_table,my_x1,my_y1,#20,#10,rotation7)
    std    my_x1
    lda    rotation7
    suba    #32
    sta    rotation8
    plot(sine_table,my_x1,my_y1,#20,#10,rotation8)
    std    my_x2
    cg6_line(page,my_x1,my_y1,my_x2,my_y2,#0)
    cg6_nosync(page)
    lbra    dostart




def    rotation    byte
def    rotation2    byte
def    rotation3    byte
def    rotation4    byte
def    rotation5    byte
def    rotation6    byte
def    rotation7    byte
def    rotation8    byte

def    my_x1    byte
def    my_y1    byte
def    my_x2    byte
def    my_y2    byte
def    my_col    byte
def    page    byte
def    sine_table    word

; end of program
cocoromend


    end    start







Sheldon

and code for lwasm....... expanded!


; coco header
opt forwardrefmax
; Function file loaded: coco\main_lib.txt
; Function file loaded: coco\disk_lib.txt
; Function file loaded: coco\pmode4_lib.txt
; function mem start address = $3E20
org $4500 ;mem start?
start
lds #$44e0 ;<$4500
jsr createsinetable
std sine_table
pshs x
ldb #1
stb cg6_display_c
jsr cg6_display
puls x
ldb #0
stb cg6_cls_page
ldb #0
stb cg6_cls_col
ldd #0
std cg6_cls_copy
jsr cg6_cls
ldb #1
stb cg6_cls_page
ldb #0
stb cg6_cls_col
ldd #0
std cg6_cls_copy
jsr cg6_cls
lda #0
sta my_col
; sta 65497 ;hi speed poke cc3
clr page
lda #0
sta rotation
lda #128
sta rotation5
dostart
ldb page
stb cg6_scroll_left_page
ldb #1
stb cg6_scroll_left_lines
jsr cg6_scroll_left
lda rotation
adda #4
sta rotation
pshs x
ldd sine_table
std plot_sintb1
ldb #175
stb plot_plotx
ldb #96
stb plot_ploty
ldb #40
stb plot_radx
ldb #50
stb plot_rady
ldb rotation
stb plot_angle
jsr plot
puls x
std my_x1
pshs x
ldd sine_table
std plot_sintb1
ldb my_x1
stb plot_plotx
ldb my_y1
stb plot_ploty
ldb #10
stb plot_radx
ldb #20
stb plot_rady
ldb rotation
stb plot_angle
jsr plot
puls x
std my_x1
lda rotation
adda #32
sta rotation2
pshs x
ldd sine_table
std plot_sintb1
ldb my_x1
stb plot_plotx
ldb my_y1
stb plot_ploty
ldb #10
stb plot_radx
ldb #20
stb plot_rady
ldb rotation2
stb plot_angle
jsr plot
puls x
std my_x2
ldb page
stb cg6_line_page
ldb my_x1
stb cg6_line_x1
ldb my_y1
stb cg6_line_y1
ldb my_x2
stb cg6_line_x2
ldb my_y2
stb cg6_line_y2
ldb #1
stb cg6_line_col
jsr cg6_line
lda rotation
adda #64
sta rotation3
pshs x
ldd sine_table
std plot_sintb1
ldb #127
stb plot_plotx
ldb #96
stb plot_ploty
ldb #40
stb plot_radx
ldb #50
stb plot_rady
ldb rotation3
stb plot_angle
jsr plot
puls x
std my_x1
pshs x
ldd sine_table
std plot_sintb1
ldb my_x1
stb plot_plotx
ldb my_y1
stb plot_ploty
ldb #10
stb plot_radx
ldb #20
stb plot_rady
ldb rotation3
stb plot_angle
jsr plot
puls x
std my_x1
lda rotation3
adda #32
sta rotation4
pshs x
ldd sine_table
std plot_sintb1
ldb my_x1
stb plot_plotx
ldb my_y1
stb plot_ploty
ldb #10
stb plot_radx
ldb #20
stb plot_rady
ldb rotation4
stb plot_angle
jsr plot
puls x
std my_x2
ldb page
stb cg6_line_page
ldb my_x1
stb cg6_line_x1
ldb my_y1
stb cg6_line_y1
ldb my_x2
stb cg6_line_x2
ldb my_y2
stb cg6_line_y2
ldb #0
stb cg6_line_col
jsr cg6_line
;second
lda rotation5
suba #4
sta rotation5
pshs x
ldd sine_table
std plot_sintb1
ldb #127
stb plot_plotx
ldb #96
stb plot_ploty
ldb #40
stb plot_radx
ldb #50
stb plot_rady
ldb rotation5
stb plot_angle
jsr plot
puls x
std my_x1
pshs x
ldd sine_table
std plot_sintb1
ldb my_x1
stb plot_plotx
ldb my_y1
stb plot_ploty
ldb #20
stb plot_radx
ldb #10
stb plot_rady
ldb rotation5
stb plot_angle
jsr plot
puls x
std my_x1
lda rotation5
suba #32
sta rotation6
pshs x
ldd sine_table
std plot_sintb1
ldb my_x1
stb plot_plotx
ldb my_y1
stb plot_ploty
ldb #20
stb plot_radx
ldb #10
stb plot_rady
ldb rotation6
stb plot_angle
jsr plot
puls x
std my_x2
ldb page
stb cg6_line_page
ldb my_x1
stb cg6_line_x1
ldb my_y1
stb cg6_line_y1
ldb my_x2
stb cg6_line_x2
ldb my_y2
stb cg6_line_y2
ldb #1
stb cg6_line_col
jsr cg6_line
lda rotation5
suba #64
sta rotation7
pshs x
ldd sine_table
std plot_sintb1
ldb #79
stb plot_plotx
ldb #96
stb plot_ploty
ldb #40
stb plot_radx
ldb #50
stb plot_rady
ldb rotation7
stb plot_angle
jsr plot
puls x
std my_x1
pshs x
ldd sine_table
std plot_sintb1
ldb my_x1
stb plot_plotx
ldb my_y1
stb plot_ploty
ldb #20
stb plot_radx
ldb #10
stb plot_rady
ldb rotation7
stb plot_angle
jsr plot
puls x
std my_x1
lda rotation7
suba #32
sta rotation8
pshs x
ldd sine_table
std plot_sintb1
ldb my_x1
stb plot_plotx
ldb my_y1
stb plot_ploty
ldb #20
stb plot_radx
ldb #10
stb plot_rady
ldb rotation8
stb plot_angle
jsr plot
puls x
std my_x2
ldb page
stb cg6_line_page
ldb my_x1
stb cg6_line_x1
ldb my_y1
stb cg6_line_y1
ldb my_x2
stb cg6_line_x2
ldb my_y2
stb cg6_line_y2
ldb #0
stb cg6_line_col
jsr cg6_line
pshs x
ldb page
stb cg6_nosync_pg
jsr cg6_nosync
puls x
lbra dostart
rotation equ $3E46
rotation2 equ $3E47
rotation3 equ $3E48
rotation4 equ $3E49
rotation5 equ $3E4A
rotation6 equ $3E4B
rotation7 equ $3E4C
rotation8 equ $3E4D
my_x1 equ $3E4E
my_y1 equ $3E4F
my_x2 equ $3E50
my_y2 equ $3E51
my_col equ $3E52
page equ $3E53
sine_table equ $3E54
; end of program
;rem createsinetable() creates and returns sine table location to d
;rem this table is needed for rotational graphics such as circle
;rem

createsinetable_tbl


fcb 128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174
fcb 177,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216
fcb 218,220,222,224,226,228,230,232,234,235,237,239,240,241,243,244
fcb 245,246,248,249,250,250,251,252,253,253,254,254,254,254,254,254
fcb 254,254,254,254,254,254,254,253,253,252,251,250,250,249,248,246
fcb 245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220
fcb 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179
fcb 177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131
fcb 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82
fcb 79,77,74,71,68,65,63,60,57,55,52,50,47,45,43,40
fcb 38,36,34,32,30,28,26,24,22,21,19,17,16,15,13,12
fcb 11,10,8,7,6,6,5,4,3,3,2,2,2,1,1,1
fcb 1,1,1,1,2,2,2,3,3,4,5,6,6,7,8,10
fcb 11,12,13,15,16,17,19,21,22,24,26,28,30,32,34,36
fcb 38,40,43,45,47,50,52,55,57,60,63,65,68,71,74,77
fcb 79,82,85,88,91,94,97,100,103,106,109,112,116,119,122,125

createsinetable

ldd #createsinetable_tbl

rts

;rem cg6_display( mode.b )
;rem starts page 0 at 3584
;rem sets the display mode to 256x192 - 2 color mode with color set 0 or 1
;rem
cg6_display_c equ $3E20

; stack push = x
; stack pull = x

cg6_display

lda #0
ldx #65472
sta 0,x
ldx #65475
sta 0,x
ldx #65477
sta 0,x

; setup memory page 0
; @e00
clra ;set value 7 so its at 3584 view
ldx #$ffc6
sta 1,x
sta 3,x
sta 5,x
sta 6,x
sta 8,x
sta 10,x
sta 12,x

; if statement processing
ldb #0
cmpb cg6_display_c
lbne iforelse_1
iforelse_0
lda #240
sta $ff22
iforelse_1
iforelse_9

; if statement processing
ldb #1
cmpb cg6_display_c
lbne iforelse_11
iforelse_10
lda #248
sta $ff22
iforelse_11
iforelse_19

rts

;rem cg6_cls( page.b , color.b , copy.w )
;rem clears working screen with color 0 or 1 and can copy from ram instead of clear screen
;rem
;rem

cg6_cls_col equ $3E21
cg6_cls_page equ $3E22
cg6_cls_copy equ $3E23

cg6_cls_colmap
fdb 0,65535

cg6_cls
; if statement processing
ldb #0
cmpb cg6_cls_page
lbne iforelse_21
iforelse_20
ldx #$e00
lbra iforelse_29
iforelse_21
ldx #$2600
iforelse_29

; if statement processing
ldd #0
cmpd cg6_cls_copy
lbne iforelse_31
iforelse_30
ldy #cg6_cls_colmap
lda #2
ldb cg6_cls_col
mul
leay d,y
ldd ,y

ldy #192
cg6_cls_lp
std 0,x
std 2,x
std 4,x
std 6,x
std 8,x
std 10,x
std 12,x
std 14,x
std 16,x
std 18,x
std 20,x
std 22,x
std 24,x
std 26,x
std 28,x
std 30,x
leax 32,x
leay -1,y
bne cg6_cls_lp

lbra iforelse_39
iforelse_31

ldu cg6_cls_copy
ldy #192
cg6_cls_lp2
ldd ,u
std ,x
ldd 2,u
std 2,x
ldd 4,u
std 4,x
ldd 6,u
std 6,x
ldd 8,u
std 8,x
ldd 10,u
std 10,x
ldd 12,u
std 12,x
ldd 14,u
std 14,x
ldd 16,u
std 16,x
ldd 18,u
std 18,x
ldd 20,u
std 20,x
ldd 22,u
std 22,x
ldd 24,u
std 24,x
ldd 26,u
std 26,x
ldd 28,u
std 28,x
ldd 30,u
std 30,x

leax 32,x
leau 32,u
leay -1,y
bne cg6_cls_lp2


iforelse_39

rts
;rem cg6_scroll_left( page.b, lines.b)
;rem scrolls working page left by lines
;rem
;rem


cg6_scroll_left_page equ $3E25
cg6_scroll_left_lines equ $3E26

cg6_scroll_left
; if statement processing
ldb #0
cmpb cg6_scroll_left_page
lbne iforelse_41
iforelse_40
ldx #$e00
lbra iforelse_49
iforelse_41
ldx #$2600
iforelse_49

ldb cg6_scroll_left_lines
cmpb #8
lbeq cg6_scroll_left_full


ldb cg6_scroll_left_lines
lbeq cg6_scroll_left_dn

ldy #191
cg6_scroll_left_lp1
andcc #$fe
rol 31,x
rol 30,x
rol 29,x
rol 28,x
rol 27,x
rol 26,x
rol 25,x
rol 24,x
rol 23,x
rol 22,x
rol 21,x
rol 20,x
rol 19,x
rol 18,x
rol 17,x
rol 16,x
rol 15,x
rol 14,x
rol 13,x
rol 12,x
rol 11,x
rol 10,x
rol 9,x
rol 8,x
rol 7,x
rol 6,x
rol 5,x
rol 4,x
rol 3,x
rol 2,x
rol 1,x
rol 0,x
decb
bne cg6_scroll_left_lp1
leax 32,x
ldb cg6_scroll_left_lines
leay -1,y
bne cg6_scroll_left_lp1


cg6_scroll_left_dn
rts

cg6_scroll_left_full
ldy #191

cg6_scroll_left_fullp
ldd 1,x
std 0,x
ldd 3,x
std 2,x
ldd 5,x
std 4,x
ldd 7,x
std 6,x
ldd 9,x
std 8,x
ldd 11,x
std 10,x
ldd 13,x
std 12,x
ldd 15,x
std 14,x
ldd 17,x
std 16,x
ldd 19,x
std 18,x
ldd 21,x
std 20,x
ldd 23,x
std 22,x
ldd 25,x
std 24,x
ldd 27,x
std 26,x
ldd 29,x
std 28,x
lda 31,x
ldb #0
std 30,x

leax 32,x
leay -1,y
lbne cg6_scroll_left_fullp
rts

;rem plot(sintblpointer.w,x1.b,y1.b,diamx.b,diamy.b,angle.b)
;rem max rad 34 circle angle 0-255 as percentage of 360
;rem
;rem returns x,y on a,b

plot_sintb1 equ $3E27
plot_angle equ $3E29
plot_plotx equ $3E2A
plot_ploty equ $3E2B
plot_radx equ $3E2C
plot_rady equ $3E2D
plot_x1 equ $3E2E
plot_y1 equ $3E2F

; stack push = x
; stack pull = x

plot
clra
ldx plot_sintb1
ldb plot_angle
abx
ldb ,x
lda plot_radx
mul
aslb
rola
suba plot_radx
adda plot_plotx
sta plot_x1

; if statement processing
ldb plot_plotx
cmpb plot_x1
lbls iforelse_51
iforelse_50
inc plot_x1
iforelse_51
iforelse_59

;cos
ldx plot_sintb1
ldb plot_angle
addb #64
abx
ldb ,x
lda plot_rady
mul
aslb
rola
suba plot_rady
adda plot_ploty
sta plot_y1
; if statement processing
ldb plot_ploty
cmpb plot_y1
lbls iforelse_61
iforelse_60
inc plot_y1
iforelse_61
iforelse_69


ldd plot_x1
rts
;rem cg6_line( page.b , x1.b, y1.b , x2.b , y2.b , color.b )
;rem draws a line color 0 or 1
;rem
;rem

cg6_line_col equ $3E30
cg6_line_page equ $3E31
cg6_line_x equ $3E32
cg6_line_y equ $3E33
cg6_line_x1 equ $3E34
cg6_line_y1 equ $3E35
cg6_line_x2 equ $3E36
cg6_line_y2 equ $3E37

cg6_line_distx equ $3E38
cg6_line_disty equ $3E3A
cg6_line_wn equ $3E3C
cg6_line_cntx equ $3E3E
cg6_line_cnty equ $3E40
cg6_line_dirx equ $3E42
cg6_line_diry equ $3E43

cg6_line_count equ $3E44


cg6_line_mask
fcb 127,191,223,239,247,251,253,254
cg6_line_mask2
fcb 128,64,32,16,8,4,2,1

cg6_line

;check distances

;x first
; if statement processing
ldb cg6_line_x2
cmpb cg6_line_x1
lbls iforelse_71
iforelse_70
clra
ldb cg6_line_x2
subb cg6_line_x1
std cg6_line_distx
lda #1
sta cg6_line_dirx

lbra iforelse_79
iforelse_71

clra
ldb cg6_line_x1
subb cg6_line_x2
std cg6_line_distx
clr cg6_line_dirx
iforelse_79

;y next
; if statement processing
ldb cg6_line_y2
cmpb cg6_line_y1
lbls iforelse_81
iforelse_80
clra
ldb cg6_line_y2
subb cg6_line_y1
std cg6_line_disty
lda #1
sta cg6_line_diry

lbra iforelse_89
iforelse_81

clra
ldb cg6_line_y1
subb cg6_line_y2
std cg6_line_disty
clr cg6_line_diry
iforelse_89

ldd #0
std cg6_line_cntx
std cg6_line_cnty
;deal out whole number
; if statement processing
ldd cg6_line_disty
cmpd cg6_line_distx
lbhs iforelse_91
iforelse_90
ldd cg6_line_distx
std cg6_line_wn
stb cg6_line_count
; ldb cg6_line_disty
; clra
; std cg6_line_cnty
lbra iforelse_99
iforelse_91

ldd cg6_line_disty
std cg6_line_wn
stb cg6_line_count
; ldb cg6_line_distx
; clra
; std cg6_line_cntx
iforelse_99


; ok lets draw line
inc cg6_line_count


ldy #cg6_line_mask
ldu #cg6_line_mask2

cg6_line_drawlp

;draw dot
; if statement processing
ldb #0
cmpb cg6_line_page
lbne iforelse_101
iforelse_100
ldx #$e00
lbra iforelse_109
iforelse_101
ldx #$2600
iforelse_109

; if statement processing
ldb #1
cmpb cg6_line_col
lbne iforelse_111
iforelse_110
lda cg6_line_y1
ldb #32
mul
leax d,x
ldb cg6_line_x1
lsrb
lsrb
lsrb
leax b,x
; we are at said line set of 8
ldb cg6_line_x1
andb #7

lda ,x
anda b,y
adda b,u
sta ,x

lbra iforelse_119
iforelse_111

lda cg6_line_y1
ldb #32
mul
leax d,x
ldb cg6_line_x1
lsrb
lsrb
lsrb
leax b,x
; we are at said line set of 8
ldb cg6_line_x1
andb #7

lda ,x
anda b,y
sta ,x
iforelse_119

;drew a dot

;look at x
ldd cg6_line_cntx
addd cg6_line_distx
std cg6_line_cntx

; if statement processing
ldd cg6_line_wn
cmpd cg6_line_cntx
lbhi iforelse_121
iforelse_120
ldd cg6_line_cntx
subd cg6_line_wn
std cg6_line_cntx

; if statement processing
ldb #1
cmpb cg6_line_dirx
lbne iforelse_131
iforelse_130
inc cg6_line_x1
lbra iforelse_139
iforelse_131
dec cg6_line_x1
iforelse_139

iforelse_121
iforelse_129

;look at y
ldd cg6_line_cnty
addd cg6_line_disty
std cg6_line_cnty

; if statement processing
ldd cg6_line_wn
cmpd cg6_line_cnty
lbhi iforelse_141
iforelse_140
ldd cg6_line_cnty
subd cg6_line_wn
std cg6_line_cnty

; if statement processing
ldb #1
cmpb cg6_line_diry
lbne iforelse_151
iforelse_150
inc cg6_line_y1
lbra iforelse_159
iforelse_151
dec cg6_line_y1
iforelse_159

iforelse_141
iforelse_149

dec cg6_line_count
lbne cg6_line_drawlp


rts
;rem cg6_nosync( page.b )
;rem nosyncs the working display onto screen
;rem pages 0,1
;rem

cg6_nosync_pg equ $3E45

; stack push = x
; stack pull = x

cg6_nosync

; if statement processing
ldb #0
cmpb cg6_nosync_pg
lbne iforelse_161
iforelse_160
; setup memory page 0
; @e00=7
clra ;set value 7 so its at 3584 view
ldx #$ffc6
sta 1,x
sta 3,x
sta 5,x
sta 6,x
sta 8,x
sta 10,x
sta 12,x
rts
iforelse_161
iforelse_169


; setup memory page 2
; @2600 = 19
clra ;set value 7 so its at 9728 view
ldx #$ffc6
sta 1,x
sta 3,x
sta 4,x
sta 6,x
sta 9,x
sta 10,x
sta 12,x


rts
cocoromend
end start


Sheldon

Here is the disk image