1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-26 08:32:00 +00:00

changes from Fatih

git-svn-id: svn://svn.cc65.org/cc65/trunk@4468 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cpg 2009-11-15 14:46:09 +00:00
parent 097b094fdd
commit b739a2d335
16 changed files with 404 additions and 330 deletions

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 10
grmode = 10
; X resolution
.define x_res 80
x_res = 80
; Y resolution
.define y_res 192
y_res = 192
; Number of colors
.define colors 9
colors = 9
; Pixels per byte
.define ppb 2
ppb = 2
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0400 ; 4:1
aspect = $0400 ; 4:1
; Free memory needed
.define mem_needed 7147
mem_needed = 7147
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 10
grmode = 10
; X resolution
.define x_res 80
x_res = 80
; Y resolution
.define y_res 192
y_res = 192
; Number of colors
.define colors 9
colors = 9
; Pixels per byte
.define ppb 2
ppb = 2
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0400 ; 4:1
aspect = $0400 ; 4:1
; Free memory needed
.define mem_needed 15339
mem_needed = 15339
; Number of screen pages
.define pages 2
pages = 2
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 11
grmode = 11
; X resolution
.define x_res 80
x_res = 80
; Y resolution
.define y_res 192
y_res = 192
; Number of colors
.define colors 16
colors = 16
; Pixels per byte
.define ppb 2
ppb = 2
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0400 ; 4:1
aspect = $0400 ; 4:1
; Free memory needed
.define mem_needed 7147
mem_needed = 7147
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 14
grmode = 14
; X resolution
.define x_res 160
x_res = 160
; Y resolution
.define y_res 192
y_res = 192
; Number of colors
.define colors 2
colors = 2
; Pixels per byte
.define ppb 8
ppb = 8
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0200 ; 2:1
aspect = $0200 ; 2:1
; Free memory needed
.define mem_needed 3305
mem_needed = 3305
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 15
grmode = 15
; X resolution
.define x_res 160
x_res = 160
; Y resolution
.define y_res 192
y_res = 192
; Number of colors
.define colors 4
colors = 4
; Pixels per byte
.define ppb 4
ppb = 4
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0200 ; 2:1
aspect = $0200 ; 2:1
; Free memory needed
.define mem_needed 7147
mem_needed = 7147
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 15
grmode = 15
; X resolution
.define x_res 160
x_res = 160
; Y resolution
.define y_res 192
y_res = 192
; Number of colors
.define colors 4
colors = 4
; Pixels per byte
.define ppb 4
ppb = 4
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0200 ; 2:1
aspect = $0200 ; 2:1
; Free memory needed
.define mem_needed 15339
mem_needed = 15339
; Number of screen pages
.define pages 2
pages = 2
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 3
grmode = 3
; X resolution
.define x_res 40
x_res = 40
; Y resolution
.define y_res 24
y_res = 24
; Number of colors
.define colors 4
colors = 4
; Pixels per byte
.define ppb 4
ppb = 4
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0100 ; 1:1
aspect = $0100 ; 1:1
; Free memory needed
.define mem_needed 1
mem_needed = 1
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels
@ -62,6 +62,7 @@
;
; ----------------------------------------------------------------------
.code
; Copy the palette
ldy #colors - 1
loop: lda (ptr1),y

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 4
grmode = 4
; X resolution
.define x_res 80
x_res = 80
; Y resolution
.define y_res 48
y_res = 48
; Number of colors
.define colors 2
colors = 2
; Pixels per byte
.define ppb 8
ppb = 8
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0100 ; 1:1
aspect = $0100 ; 1:1
; Free memory needed
.define mem_needed 1
mem_needed = 1
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 5
grmode = 5
; X resolution
.define x_res 80
x_res = 80
; Y resolution
.define y_res 48
y_res = 48
; Number of colors
.define colors 4
colors = 4
; Pixels per byte
.define ppb 4
ppb = 4
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0100 ; 1:1
aspect = $0100 ; 1:1
; Free memory needed
.define mem_needed 185
mem_needed = 185
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 6
grmode = 6
; X resolution
.define x_res 160
x_res = 160
; Y resolution
.define y_res 96
y_res = 96
; Number of colors
.define colors 2
colors = 2
; Pixels per byte
.define ppb 8
ppb = 8
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0100 ; 1:1
aspect = $0100 ; 1:1
; Free memory needed
.define mem_needed 1193
mem_needed = 1193
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 7
grmode = 7
; X resolution
.define x_res 160
x_res = 160
; Y resolution
.define y_res 96
y_res = 96
; Number of colors
.define colors 4
colors = 4
; Pixels per byte
.define ppb 4
ppb = 4
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0100 ; 1:1
aspect = $0100 ; 1:1
; Free memory needed
.define mem_needed 3209
mem_needed = 3209
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 8
grmode = 8
; X resolution
.define x_res 320
x_res = 320
; Y resolution
.define y_res 192
y_res = 192
; Number of colors
.define colors 2
colors = 2
; Pixels per byte
.define ppb 8
ppb = 8
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0100 ; 1:1
aspect = $0100 ; 1:1
; Free memory needed
.define mem_needed 7147
mem_needed = 7147
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 8
grmode = 8
; X resolution
.define x_res 320
x_res = 320
; Y resolution
.define y_res 192
y_res = 192
; Number of colors
.define colors 2
colors = 2
; Pixels per byte
.define ppb 8
ppb = 8
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0100 ; 1:1
aspect = $0100 ; 1:1
; Free memory needed
.define mem_needed 15339
mem_needed = 15339
; Number of screen pages
.define pages 2
pages = 2
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 9
grmode = 9
; X resolution
.define x_res 80
x_res = 80
; Y resolution
.define y_res 192
y_res = 192
; Number of colors
.define colors 16
colors = 16
; Pixels per byte
.define ppb 2
ppb = 2
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0400 ; 4:1
aspect = $0400 ; 4:1
; Free memory needed
.define mem_needed 7147
mem_needed = 7147
; Number of screen pages
.define pages 1
pages = 1
.rodata
mask_table: ; Mask table to set pixels

View File

@ -22,23 +22,23 @@
; ----------------------------------------------------------------------
; Graphics mode
.define grmode 9
grmode = 9
; X resolution
.define x_res 80
x_res = 80
; Y resolution
.define y_res 192
y_res = 192
; Number of colors
.define colors 16
colors = 16
; Pixels per byte
.define ppb 2
ppb = 2
; Screen memory size in bytes
.define scrsize x_res * y_res / ppb
scrsize = x_res * y_res / ppb
; Pixel aspect ratio
.define aspect $0400 ; 4:1
aspect = $0400 ; 4:1
; Free memory needed
.define mem_needed 15339
mem_needed = 15339
; Number of screen pages
.define pages 2
pages = 2
.rodata
mask_table: ; Mask table to set pixels

View File

@ -2,6 +2,8 @@
; Generic Atari graphics driver
;
.macpack longbranch
; ******************************************************************************
; ----------------------------------------------------------------------
@ -74,12 +76,14 @@
.bss
error:
.res 1 ; Error code
.if grmode = 9 || grmode = 11
.if ::grmode = 9 || ::grmode = 11
palette = default_palette
.else
.else
palette:
.res colors ; The current palette
.endif
.endif
mask:
.res 1 ; Current pixel mask
griocb:
@ -144,23 +148,29 @@ screen_device_length := * - screen_device
.code
; Initialize drawing color
.if ::ppb = 8
ldx #$FF
.elseif ::ppb = 4
ldx #$55
.elseif ::ppb = 2
ldx #$11
.endif
stx mask
; Find a free IOCB
clc
lda #$70
search: tax
ldy ICHID,x
cpy #$FF
beq found
sbc #$10
sub #$10
bcs search
; Out of resources
nores: lda #TGI_ERR_NO_RES
sta error
rts
; No free IOCB
lda #TGI_ERR_NO_IOCB
jmp exit
found: ; Check if enough RAM is available
lda #0
@ -169,17 +179,21 @@ found: ; Check if enough RAM is available
lda RAMTOP
sbc #>mem_needed
cmp APPMHI + 1
bcc nores
bcc nomem
bne switch
cpy APPMHI
bcc nores
bcs switch
; No memory
nomem: lda #TGI_ERR_NO_MEM
jmp exit
; Switch into graphics mode
switch: lda #OPEN
sta ICCOM,x
lda #OPNIN | OPNOT
sta ICAX1,x
lda #grmode
lda #::grmode
sta ICAX2,x
lda #<screen_device
sta ICBAL,x
@ -191,7 +205,7 @@ switch: lda #OPEN
sta ICBLH,x
jsr CIOV
.if pages = 2
.if ::pages = 2
; Reserve 8K of high memory
lda RAMTOP
sub #32
@ -205,7 +219,7 @@ switch: lda #OPEN
sta ICCOM,x
lda #OPNIN | OPNOT
sta ICAX1,x
lda #grmode
lda #::grmode
sta ICAX2,x
lda #<screen_device
sta ICBAL,x
@ -216,17 +230,18 @@ switch: lda #OPEN
lda #>screen_device_length
sta ICBLH,x
jsr CIOV
; Save screen poniters
; Save screen pointers
lda SAVMSC + 1
sta p0scr
lda SDLSTH
sta p0dls
.endif
.endif ; ::pages = 2
stx griocb
; Reset the error code and return
lda #TGI_ERR_OK
sta error
exit: sta error
rts
.endproc
@ -241,12 +256,13 @@ switch: lda #OPEN
; ----------------------------------------------------------------------
.code
.if pages = 2
.if ::pages = 2
; Free 8K of high memory
lda RAMTOP
add #32
sta RAMTOP
.endif
.endif
; Clear griocb
lda #$FF
@ -275,7 +291,7 @@ switch: lda #OPEN
sta ICBLH,x
jsr CIOV
; Now close it again; we don't need it anymore
; Now close it again; we don't need it anymore :)
lda #CLOSE
sta ICCOM,x
jmp CIOV
@ -319,24 +335,24 @@ switch: lda #OPEN
lda #0
tay
.if >::scrsize > 0
; Clear full pages if any
.if >(scrsize) > 0
ldx #>(scrsize)
ldx #>::scrsize
loop1: sta (sptr),y
iny
bne loop1
inc sptr + 1
dex
bne loop1
.endif
.endif
.if <::scrsize > 0
; Clear the rest, if any
.if <(scrsize) > 0
loop2: sta (sptr),y
iny
cpy #<(scrsize)
cpy #<::scrsize
bne loop2
.endif
.endif
rts
.endproc
@ -385,14 +401,17 @@ loop2: sta (sptr),y
.code
tax
.if grmode = 9
.if ::grmode = 9
; Map colors like this: 0 -> 0, 1 -> 15, 2 -> 1, 3 -> 2 etc.
beq @cont
beq cont
cpx #1
bne @map
bne map
ldx #16
@map: dex
@cont: .endif
map: dex
cont:
.endif
lda masks,x
sta mask
rts
@ -422,25 +441,28 @@ loop2: sta (sptr),y
sta temp
lda y1
.if x_res / ppb = 40
.define yrep 3
.elseif x_res / ppb = 20
.define yrep 2
.elseif x_res / ppb = 10
.define yrep 1
.endif
.if ::x_res / ::ppb = 40
yrep = 3
.elseif ::x_res / ::ppb = 20
yrep = 2
.elseif ::x_res / ::ppb = 10
yrep = 1
.endif
.repeat yrep
asl a
rol temp
.endrepeat
.repeat yrep
asl a
rol temp
.endrepeat
sta sptr
ldx temp
stx sptr + 1
.repeat 2
.repeat 2
asl a
rol temp
.endrepeat
.endrepeat
add sptr
sta sptr
lda temp
@ -457,17 +479,19 @@ loop2: sta (sptr),y
sta temp
lda x1
.if ppb = 8
.define xrep 3
.elseif ppb = 4
.define xrep 2
.elseif ppb = 2
.define xrep 1
.endif
.repeat xrep
.if ::ppb = 8
xrep = 3
.elseif ::ppb = 4
xrep = 2
.elseif ::ppb = 2
xrep = 1
.endif
.repeat xrep
lsr temp
ror a
.endrepeat
.endrepeat
tay
; sptr += SAVMSC
@ -495,7 +519,7 @@ loop2: sta (sptr),y
.code
jsr CALC
put_pixel
rts
rts
.endproc
; ******************************************************************************
@ -512,44 +536,48 @@ loop2: sta (sptr),y
jsr CALC
lda (sptr),y
and mask_table,x
.if ppb = 8
.if ::ppb = 8
beq zero
lda #1
zero: ldx #0
rts
.elseif ppb = 4
.elseif ::ppb = 4
loop: cpx #3
beq cont
beq done4
lsr a
lsr a
inx
bne loop
cont: and #$03
done4: and #$03
ldx #0
rts
.elseif ppb = 2
.elseif ::ppb = 2
dex
bne shift
and #$0F
jmp exit
shift: ldx #0
lsr a
shift: lsr a
lsr a
lsr a
lsr a
exit:
.if ::grmode = 9
; Mode 9 mapping
exit: .if grmode = 9
; Map colors like this: 0 -> 0, 15 -> 1, 2 -> 3, 3 -> 4 etc.
beq @cont
beq done9
cmp #15
bne @map
bne map9
lda #0
@map: add #1
@cont: .endif
map9: add #1
done9:
.endif
.if ::grmode = 10
; Mode 10 mapping
.if grmode = 10
; Map out-of-range colors like this:
; Map out of range colors like this:
; 9 -> 8
; 10 -> 8
; 11 -> 8
@ -558,15 +586,18 @@ exit: .if grmode = 9
; 14 -> 2
; 15 -> 3
cmp #9
bcc @cont
bcc done10
sub #12
bcs @cont
bcs done10
lda #8
@cont: .endif
done10:
.endif ; ::grmode = 10
; Done!
ldx #0
rts
.endif
.endif ; ::ppb = 2
.endproc
; ******************************************************************************
@ -579,6 +610,41 @@ exit: .if grmode = 9
;
; ----------------------------------------------------------------------
.ifdef USE_CIO_LINE
; position ptr1, ptr2
lda x1
sta OLDCOL
lda x1 + 1
sta OLDCOL + 1
lda y1
sta OLDROW
; plot
jsr SETPIXEL
; position ptr3,ptr4
lda x2
sta COLCRS
lda x2 + 1
sta COLCRS + 1
lda y2
sta ROWCRS
; drawto
ldx griocb
lda #DRAWLN
sta ICCOM,x
lda mask
.if ::grmode = 10
and #$0f
.else
and #colors - 1
.endif
sta ATACHR
jmp CIOV
.else ; USE_CIO_LINE
; locals
dx := sreg
@ -797,6 +863,7 @@ end_move:
jmp loop
exit: rts
.endscope
.endif ; USE_CIO_LINE
.endproc
; ******************************************************************************
@ -805,7 +872,8 @@ exit: rts
; ----------------------------------------------------------------------
;
; Clip and draw bar
; Clip and draw bar, this function will disappear when text clipping
; will be done int the TGI kernel
;
; ----------------------------------------------------------------------
@ -817,10 +885,12 @@ exit: rts
bcs off
lda x1 + 1
.if >(x_res - 1) > 0
.if >(::x_res - 1) > 0
cmp #>x_res
bcc check2
.endif
.endif
bne off
lda x1
cmp #<x_res
@ -834,10 +904,12 @@ check2: lda y2 + 1
bcs off
lda x2 + 1
.if >(x_res - 1) > 0
.if >(::x_res - 1) > 0
cmp #>x_res
bcc BAR
.endif
.endif
bne off
lda x2
cmp #<x_res
@ -882,10 +954,12 @@ check2: lda y2 + 1
; Calculate upper right corner
lda x2
sta x1
.if >(x_res - 1) > 0
.if >(::x_res - 1) > 0
lda x2 + 1
sta x1 + 1
.endif
.endif
jsr CALC
; Save the values
tya
@ -972,17 +1046,21 @@ skipm: ; Loop while --dy > 0
sta mag_y8 + 1
; Save 8 * mag_x
txa
.repeat 3
asl a
rol mag_x8 + 1
.endrepeat
sta mag_x8
; Save 8 * mag_y
tya
.repeat 3
asl a
rol mag_y8 + 1
.endrepeat
sta mag_y8
; Done!
rts
@ -1007,24 +1085,27 @@ skipm: ; Loop while --dy > 0
ataint: .byte 64,0,32,96
.bss
rows: .res 1
.if >(x_res - 1) > 0
.if >(::x_res - 1) > 0
oldx1: .res 2
oldx2: .res 2
.else
.else
oldx1: .res 1
oldx2: .res 1
.endif
.endif
oldy1: .res 1
oldy2: .res 1
inv: .res 1
.code
; Don't draw zero sized characters
lda mag_x
beq @exit
lda mag_y
bne @cont
@exit: rts
@cont: ; Save string address, ptr3 is needed by BAR
ora mag_y
bne not0
rts
not0: ; Save string address, ptr3 is needed by BAR
lda ptr3
sta string
lda ptr3 + 1
@ -1038,14 +1119,15 @@ skipm: ; Loop while --dy > 0
sub #1
add x1
sta x2
.if >(x_res - 1) > 0
.if >(::x_res - 1) > 0
lda x1 + 1
adc #0
sta x2 + 1
.else
.else
lda #0
sta x2 + 1
.endif
.endif
; Calculate y2 and adjust y1
dec y1
@ -1079,29 +1161,37 @@ vert: lda x1
sta y2
lda #0
sta y2 + 1
beq while ; Always
jmp while
; Main loop
loop: inc string
bne skiph
inc string + 1
skiph: ; Save coords
jsr save_text_y
; Draw one character
jsr outchar
; Restore coords
jsr restore_text_y
; End of loop
while: ldy #0
lda (string),y
bne loop ; Check for null character
rts
bit text_dir
bmi scvert
; --------------------
; Output one character
outchar:
ldx y1
stx oldy1
ldx y2
stx oldy2
jmp draw
scvert: ldx x1
stx oldx1
ldx x2
stx oldx2
.if >(::x_res - 1) > 0
ldx x1 + 1
stx oldx1 + 1
ldx x2 + 1
stx oldx2 + 1
.endif
; Draw one character
; Convert to ANTIC code
tay
draw: tay
rol a
rol a
rol a
@ -1118,32 +1208,36 @@ outchar:
sta font
lda #0
sta font + 1
.repeat 3
asl font
rol a
.endrepeat
adc CHBAS
sta font + 1
; Save old coords
bit text_dir
bpl @hor
bpl hor
lda y1
sta oldy1
lda y2
sta oldy2
jmp @cont
@hor: lda x1
jmp cont
hor: lda x1
sta oldx1
lda x2
sta oldx2
.if >(x_res - 1) > 0
.if >(::x_res - 1) > 0
lda x1 + 1
sta oldx1 + 1
lda x2 + 1
sta oldx2 + 1
.endif
.endif
; Get glyph pixels
@cont: ldy #7
cont: ldy #7
; Put one row of the glyph
putrow: sty rows
lda (font),y
@ -1167,118 +1261,89 @@ putcol: asl pixels
sta x1
next_col:
; Go to next column
jsr inc_x
dec cols
bpl putcol
next_row:
; Go to next row
jsr dec_y
; Restore old values
; increase x coords
bit text_dir
bpl @hor
lda oldy1
sta y1
lda oldy2
sta y2
jmp @cont
@hor: lda oldx1
sta x1
lda oldx2
sta x2
.if >(x_res - 1) > 0
lda oldx1 + 1
sta x1 + 1
lda oldx2 + 1
sta x2 + 1
.endif
; Next row
@cont: ldy rows
dey
bpl putrow
; We're done!
rts
; -------------------------
inc_x: ; increase x coords
bit text_dir
bmi @vert
bmi vertinc
lda mag_x
add x1
sta x1
bcc @1
bcc L1
inc x1 + 1
@1: lda mag_x
L1: lda mag_x
add x2
sta x2
bcc @2
bcc L2
inc x2 + 1
@2: rts
jmp L2
@vert: lda y1
vertinc:
lda y1
sub mag_x
sta y1
lda y2
sub mag_x
sta y2
rts
; -------------------------
dec_y: ; decrease y coords
L2:
dec cols
bpl putcol
next_row:
; Go to next row
bit text_dir
bmi @vert
bmi verty
lda y1
sub mag_y
sta y1
bcs @1
bcs L3
dec y1 + 1
@1: lda y2
L3: lda y2
sub mag_y
sta y2
bcs @2
bcs L6
dec y2 + 1
@2: rts
L4: jmp L6
@vert: lda x1
verty: lda x1
sub mag_y
sta x1
bcs @3
bcs L5
dec x1 + 1
@3: lda x2
L5: lda x2
sub mag_y
sta x2
bcs @4
bcs L6
dec x2 + 1
@4: rts
; -------------------------
save_text_y: ; Save text's height coords
L6:
; Restore old values
bit text_dir
bmi @vert
ldx y1
stx oldy1
ldx y2
stx oldy2
rts
@vert: ldx x1
stx oldx1
ldx x2
stx oldx2
.if >(x_res - 1) > 0
ldx x1 + 1
stx oldx1 + 1
ldx x2 + 1
stx oldx2 + 1
.endif
rts
bpl reshor
lda oldy1
sta y1
lda oldy2
sta y2
jmp nextrow
reshor: lda oldx1
sta x1
lda oldx2
sta x2
; -------------------------
restore_text_y: ; Position to next char
.if >(::x_res - 1) > 0
lda oldx1 + 1
sta x1 + 1
lda oldx2 + 1
sta x2 + 1
.endif
; Next row
nextrow:
ldy rows
dey
jpl putrow
; Restore coords
bit text_dir
bmi @vert
bmi resvert
ldx oldy1
stx y1
@ -1301,18 +1366,20 @@ restore_text_y: ; Position to next char
adc x2 + 1
sta x2 + 1
rts
jmp while
@vert: ldx oldx1
resvert:
ldx oldx1
stx x1
ldx oldx2
stx x2
.if >(x_res - 1) > 0
.if >(::x_res - 1) > 0
ldx oldx1 + 1
stx x1 + 1
ldx oldx2 + 1
stx x2 + 1
.endif
.endif
lda y1
sub mag_x8
@ -1327,6 +1394,10 @@ restore_text_y: ; Position to next char
sbc mag_x8 + 1
sta y2 + 1
; End of loop
while: ldy #0
lda (string),y
jne loop ; Check for null character
rts
.endproc
@ -1374,9 +1445,9 @@ done: rts
.code
tax
beq @cont
beq cont
lda #32
@cont: add p0scr
cont: add p0scr
sta SAVMSC + 1
rts
.endproc
@ -1405,8 +1476,10 @@ CONTROL:
INSTALL:
UNINSTALL:
.if pages = 1
SETVIEWPAGE:
SETDRAWPAGE:
.endif
rts