; -----------------------------------------------------------
; Mad Pascal Compiler version 1.6.2 [2019/11/05] for 6502
; -----------------------------------------------------------

STACKWIDTH	= 16
CODEORIGIN	= $2000

TRUE		= 1
FALSE		= 0

; -----------------------------------------------------------

	org $80

fxptr	.ds 2

eax	.ds 4						;8 bytes (aex + edx) -> divREAL
edx	.ds 4
ecx	.ds 4
bp	.ds 2
bp2	.ds 2

ztmp
ztmp8	.ds 1
ztmp9	.ds 1
ztmp10	.ds 1
ztmp11	.ds 1

TMP	.ds 2

STACKORIGIN	.ds STACKWIDTH*4

.print 'ZPFREE: $0000..',fxptr-1,' ; ',*,'..',$ff

; -----------------------------------------------------------

ax	= eax
al	= eax
ah	= eax+1

cx	= ecx
cl	= ecx
ch	= ecx+1

dx	= edx
dl	= edx
dh	= edx+1

	org eax

FP1MAN0	.ds 1
FP1MAN1	.ds 1
FP1MAN2	.ds 1
FP1MAN3	.ds 1

	org ztmp8

FP1SGN	.ds 1
FP1EXP	.ds 1

	org edx

FP2MAN0	.ds 1
FP2MAN1	.ds 1
FP2MAN2	.ds 1
FP2MAN3	.ds 1

	org ztmp10

FP2SGN	.ds 1
FP2EXP	.ds 1

	org ecx

FPMAN0	.ds 1
FPMAN1	.ds 1
FPMAN2	.ds 1
FPMAN3	.ds 1

	org bp2

FPSGN	.ds 1
FPEXP	.ds 1

; -----------------------------------------------------------

	org CODEORIGIN

	STATICDATA

START
	tsx
	stx MAIN.@halt+1

	.ifdef fmulinit
	fmulinit
	eif

	ift DATAORIGIN+VARINITSIZE > $BFFF
	ert 'Invalid memory address range ',DATAORIGIN+VARINITSIZE
	els
	@fill #DATAORIGIN+VARINITSIZE #VARDATASIZE-VARINITSIZE #0
	eif

	ldx #$0f
	mva:rpl $340,x MAIN.IOCB@COPY,x-

	inx		; X = 0 !!!
	stx bp		; lo BP = 0

	UNITINITIALIZATION

.local	MAIN						; PROCEDURE

	jmp l_0024

; -----------------------------------------------------------

.local	SYSTEM						; UNIT

.local	PEEK						; FUNCTION | ASSEMBLER | REGISTER

; -----------------------------------------------------------

; Generate Assignment for WORD / SMALLINT / SHORTREAL / POINTER
; as Pointer
	mva :STACKORIGIN,x A
	mva :STACKORIGIN+STACKWIDTH,x A+1
	dex						; sub bx, 1

; ---------------------  ASM Block 004  ---------------------

	ldy #0
	mva (edx),y Result


@exit

; -----------------------------------------------------------

; Push BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer

	inx						; add bx, 1
	mva RESULT :STACKORIGIN,x

	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif

; -----------------------------------------------------------

A	= edx
RESULT	= DATAORIGIN+$000B

@VarData	= RESULT
@VarDataSize	= 1

	rts						; ret
.endl

.local	DPEEK						; FUNCTION | ASSEMBLER | REGISTER

; -----------------------------------------------------------

; Generate Assignment for WORD / SMALLINT / SHORTREAL / POINTER
; as Pointer
	mva :STACKORIGIN,x A
	mva :STACKORIGIN+STACKWIDTH,x A+1
	dex						; sub bx, 1

; ---------------------  ASM Block 005  ---------------------

	ldy #0
	mva (edx),y Result
	iny
	mva (edx),y Result+1


@exit

; -----------------------------------------------------------

; Push WORD / SMALLINT / SHORTREAL / POINTER
; as Pointer

	inx						; add bx, 1
	mva RESULT :STACKORIGIN,x
	mva RESULT+1 :STACKORIGIN+STACKWIDTH,x

	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif

; -----------------------------------------------------------

A	= edx
RESULT	= DATAORIGIN+$000C

@VarData	= RESULT
@VarDataSize	= 2

	rts						; ret
.endl

; -----------------------------------------------------------

M_PI_2	= $0648
D_PI_2	= $0192
D_PI_180	= $0004
MGTIA	= $0000
MVBXE	= $0080
VBXE_XDLADR	= $0000
VBXE_BCBADR	= $0100
VBXE_MAPADR	= $1000
VBXE_OVRADR	= $5000
VBXE_WINDOW	= $B000
IDLI	= $0000
IVBL	= $0001
CH_DELCHR	= $00FE
CH_ENTER	= $009B
CH_ESC	= $001B
CH_CURS_UP	= $001C
CH_CURS_DOWN	= $001D
CH_CURS_LEFT	= $001E
CH_CURS_RIGHT	= $001F
CH_TAB	= $007F
CH_EOL	= $009B
CH_CLR	= $007D
CH_BELL	= $00FD
CH_DEL	= $007E
CH_DELLINE	= $009C
CH_INSLINE	= $009D
COLOR_BLACK	= $0000
COLOR_WHITE	= $000E
COLOR_RED	= $0032
COLOR_CYAN	= $0096
COLOR_VIOLET	= $0068
COLOR_GREEN	= $00C4
COLOR_BLUE	= $0074
COLOR_YELLOW	= $00EE
COLOR_ORANGE	= $004A
COLOR_BROWN	= $00E4
COLOR_LIGHTRED	= $003C
COLOR_GRAY1	= $0004
COLOR_GRAY2	= $0006
COLOR_GRAY3	= $000A
COLOR_LIGHTGREEN	= $00CC
COLOR_LIGHTBLUE	= $007C
FMOPENREAD	= $0004
FMOPENWRITE	= $0008
FMOPENAPPEND	= $0009
FMOPENREADWRITE	= $000C
SCREENWIDTH	= DATAORIGIN+$0000
SCREENHEIGHT	= DATAORIGIN+$0002
DATESEPARATOR	= DATAORIGIN+$0004
TVSYSTEM	= $D014
FILEMODE	= DATAORIGIN+$0005
SCREENMODE	= DATAORIGIN+$0006
IORESULT	= DATAORIGIN+$0007
EOLN	= DATAORIGIN+$0008
RNDSEED	= DATAORIGIN+$0009

.endl							; UNIT SYSTEM

; -----------------------------------------------------------

.local	ATARI						; UNIT

; -----------------------------------------------------------

RTCLOK	= $0012
ATRACT	= $004D
LMARGIN	= $0052
RMARGIN	= $0053
ROWCRS	= $0054
COLCRS	= $0055
DINDEX	= $0057
SAVMSC	= $0058
VDSLST	= $0200
SDLSTL	= $0230
TXTROW	= $0290
TXTCOL	= $0291
TINDEX	= $0293
TXTMSC	= $0294
SDMCTL	= $022F
GPRIOR	= $026F
CRSINH	= $02F0
CHACT	= $02F3
CHBAS	= $02F4
CH	= $02FC
PCOLR0	= $02C0
PCOLR1	= $02C1
PCOLR2	= $02C2
PCOLR3	= $02C3
COLOR0	= $02C4
COLOR1	= $02C5
COLOR2	= $02C6
COLOR3	= $02C7
COLOR4	= $02C8
COLBAKS	= $02C8
HPOSP0	= $D000
HPOSP1	= $D001
HPOSP2	= $D002
HPOSP3	= $D003
HPOSM0	= $D004
HPOSM1	= $D005
HPOSM2	= $D006
HPOSM3	= $D007
SIZEP0	= $D008
SIZEP1	= $D009
SIZEP2	= $D00A
SIZEP3	= $D00B
SIZEM	= $D00C
GRAFP0	= $D00D
GRAFP1	= $D00E
GRAFP2	= $D00F
GRAFP3	= $D010
GRAFM	= $D011
P0PF	= $D004
PAL	= $D014
COLPM0	= $D012
COLPM1	= $D013
COLPM2	= $D014
COLPM3	= $D015
COLPF0	= $D016
COLPF1	= $D017
COLPF2	= $D018
COLPF3	= $D019
COLBK	= $D01A
PRIOR	= $D01B
GRACTL	= $D01D
HITCLR	= $D01E
AUDF1	= $D200
AUDC1	= $D201
AUDF2	= $D202
AUDC2	= $D203
AUDF3	= $D204
AUDC3	= $D205
AUDF4	= $D206
AUDC4	= $D207
AUDCTL	= $D208
SKSTAT	= $D20F
PORTB	= $D301
DMACTL	= $D400
CHACTL	= $D401
DLISTL	= $D402
HSCROL	= $D404
VSCROL	= $D405
PMBASE	= $D407
CHBASE	= $D409
WSYNC	= $D40A
VCOUNT	= $D40B
PENH	= $D40C
PENV	= $D40D
NMIEN	= $D40E

.endl							; UNIT ATARI

; -----------------------------------------------------------

.local	CRT						; UNIT

.local	READKEY						; FUNCTION | ASSEMBLER

; ---------------------  ASM Block 046  ---------------------

	txa:pha

	@GetKey

	sta Result

	pla:tax


@exit

; -----------------------------------------------------------

; Push BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer

	inx						; add bx, 1
	mva RESULT :STACKORIGIN,x

	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif

; -----------------------------------------------------------

RESULT	= DATAORIGIN+$000F

@VarData	= RESULT
@VarDataSize	= 1

	rts						; ret
.endl

.local	TEXTBACKGROUND					; PROCEDURE | ASSEMBLER

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x A
	dex						; sub bx, 1

; ---------------------  ASM Block 047  ---------------------

	mwa a colpf2s


; -----------------------------------------------------------

A	= DATAORIGIN+$0010

@VarData	= A
@VarDataSize	= 1

@exit
	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif
	rts						; ret
.endl

; -----------------------------------------------------------

TEXTATTR	= DATAORIGIN+$000E
CONSOL	= $D01F
CN_START_SELECT_OPTION	= $0000
CN_SELECT_OPTION	= $0001
CN_START_OPTION	= $0002
CN_OPTION	= $0003
CN_START_SELECT	= $0004
CN_SELECT	= $0005
CN_START	= $0006
CN_NONE	= $0007
BW40	= $0000
CO40	= $0001
BW80	= $0002
CO80	= $0003
MONO	= $0007
C40	= $0001
C80	= $0003
BLACK	= $0000
BLUE	= $0001
GREEN	= $0002
CYAN	= $0003
RED	= $0004
MAGENTA	= $0005
BROWN	= $0006
LIGHTGRAY	= $0007
DARKGRAY	= $0008
LIGHTBLUE	= $0009
LIGHTGREEN	= $000A
LIGHTCYAN	= $000B
LIGHTRED	= $000C
LIGHTMAGENTA	= $000D
YELLOW	= $000E
WHITE	= $000F
BLINK	= $0080

.endl							; UNIT CRT

; -----------------------------------------------------------

.local	TYPES						; UNIT

; -----------------------------------------------------------

.endl							; UNIT TYPES

; -----------------------------------------------------------

.local	GRAPH						; UNIT

.local	INITGRAPH_0071					; PROCEDURE | OVERLOAD

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x MODE
	dex						; sub bx, 1

; optimize OK (GRAPH), line = 66

	mva #$00 GRAPHRESULT

; optimize OK (GRAPH), line = 68

	mva MODE SYSTEM.SCREENMODE

; ---------------------  ASM Block 057  ---------------------


	txa:pha

	mva #$2c @putchar.vbxe

	lda mode
	and #$0f
	tay

	ldx #$60	; 6*16
	lda mode	; %00010000 with text window
	and #$10
	eor #$10
	ora #2		; read

	.nowarn @graphics

; Fox/TQA

dindex	equ $57
tmccn	equ $ee7d
tmrcn	equ $ee8d

	ldx dindex
	lda tmccn,x
	ldy tmrcn,x
	ldx #0
	cmp #<320
	sne:inx
    
; X:A = horizontal resolution
; Y = vertical resolution

	sta MAIN.SYSTEM.ScreenWidth
	stx MAIN.SYSTEM.ScreenWidth+1
	
	sty MAIN.SYSTEM.ScreenHeight
	lda #0
	sta MAIN.SYSTEM.ScreenHeight+1

	pla:tax


; -----------------------------------------------------------

MODE	= DATAORIGIN+$002B

@VarData	= MODE
@VarDataSize	= 1

@exit
	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif
	rts						; ret
.endl

.local	SETBKCOLOR					; PROCEDURE | ASSEMBLER

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x COLOR
	dex						; sub bx, 1

; ---------------------  ASM Block 058  ---------------------

	mva color colbaks


; -----------------------------------------------------------

COLOR	= DATAORIGIN+$002C

@VarData	= COLOR
@VarDataSize	= 1

@exit
	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif
	rts						; ret
.endl

.local	SETCOLOR					; PROCEDURE | ASSEMBLER

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x COLOR
	dex						; sub bx, 1

; ---------------------  ASM Block 059  ---------------------

	mva color @COMMAND.colscr
	sta GetColor


; -----------------------------------------------------------

COLOR	= DATAORIGIN+$002D

@VarData	= COLOR
@VarDataSize	= 1

@exit
	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif
	rts						; ret
.endl

; -----------------------------------------------------------

CURRENTDRIVER	= $FFFFFF80
DETECT	= $0000
CGA	= $0001
MCGA	= $0002
EGA	= $0003
EGA64	= $0004
EGAMONO	= $0005
LOWRES	= $0006
HERCMONO	= $0007
VGA	= $0009
VESA	= $000A
D1BIT	= $000B
D2BIT	= $000C
D4BIT	= $000D
D6BIT	= $000E
D8BIT	= $000F
D12BIT	= $0010
M640X400	= $0018
M640X480	= $0018
GROK	= $0000
GRNOINITGRAPH	= $FFFFFFFF
GRNOTDETECTED	= $FFFFFFFE
GRFILENOTFOUND	= $FFFFFFFD
GRINVALIDDRIVER	= $FFFFFFFC
GRNOLOADMEM	= $FFFFFFFB
GRNOSCANMEM	= $FFFFFFFA
GRNOFLOODMEM	= $FFFFFFF9
GRFONTNOTFOUND	= $FFFFFFF8
GRNOFONTMEM	= $FFFFFFF7
GRINVALIDMODE	= $FFFFFFF6
GRERROR	= $FFFFFFF5
GRIOERROR	= $FFFFFFF4
GRINVALIDFONT	= $FFFFFFF3
GRINVALIDFONTNUM	= $FFFFFFF2
GRINVALIDVERSION	= $FFFFFFEE
CGAC0	= $0000
CGAC1	= $0001
CGAC2	= $0002
CGAC3	= $0003
CGAHI	= $0004
MCGAC0	= $0000
MCGAC1	= $0001
MCGAC2	= $0002
MCGAC3	= $0003
MCGAMED	= $0004
MCGAHI	= $0005
EGALO	= $0000
EGAHI	= $0001
EGA64LO	= $0000
EGA64HI	= $0001
EGAMONOHI	= $0003
VGALO	= $000A
VGAMED	= $001F
VGAHI	= $0018
WIN_LEFT	= DATAORIGIN+$0011
WIN_RIGHT	= DATAORIGIN+$0013
WIN_TOP	= DATAORIGIN+$0015
WIN_BOTTOM	= DATAORIGIN+$0017
GRAPHRESULT	= DATAORIGIN+$0019
GETCOLOR	= DATAORIGIN+$001A
adr.LASTARCCOORDS	= DATAORIGIN+$001B
.var LASTARCCOORDS	= adr.LASTARCCOORDS .word
LASTARCCOORDS.X	= DATAORIGIN+$001B
LASTARCCOORDS.Y	= DATAORIGIN+$001D
LASTARCCOORDS.XSTART	= DATAORIGIN+$001F
LASTARCCOORDS.YSTART	= DATAORIGIN+$0021
LASTARCCOORDS.XEND	= DATAORIGIN+$0023
LASTARCCOORDS.YEND	= DATAORIGIN+$0025
CURRENTX	= DATAORIGIN+$0027
CURRENTY	= DATAORIGIN+$0029

.endl							; UNIT GRAPH

; -----------------------------------------------------------

.local	DOS						; UNIT

; -----------------------------------------------------------

PALNTSC	= $D014

.endl							; UNIT DOS

; -----------------------------------------------------------

.local	STRUTILS					; UNIT

; -----------------------------------------------------------

.endl							; UNIT STRUTILS

; -----------------------------------------------------------

.local	SYSUTILS					; UNIT

.local	GETTICKCOUNT					; FUNCTION | ASSEMBLER

; ---------------------  ASM Block 076  ---------------------

	mva :rtclok+2 Result
	mva :rtclok+1 Result+1
	mva :rtclok Result+2
	mva #$00 Result+3


@exit

; -----------------------------------------------------------

; Push CARDINAL / INTEGER / REAL / SINGLE
; as Pointer

	inx						; add bx, 1
	mva RESULT :STACKORIGIN,x
	mva RESULT+1 :STACKORIGIN+STACKWIDTH,x
	mva RESULT+2 :STACKORIGIN+STACKWIDTH*2,x
	mva RESULT+3 :STACKORIGIN+STACKWIDTH*3,x

	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif

; -----------------------------------------------------------

RESULT	= DATAORIGIN+$002E

@VarData	= RESULT
@VarDataSize	= 4

	rts						; ret
.endl

; -----------------------------------------------------------

FAREADONLY	= $0001
FAHIDDEN	= $0002
FASYSFILE	= $0004
FAVOLUMEID	= $0008
FADIRECTORY	= $0010
FAARCHIVE	= $0020
FAANYFILE	= $003F

.endl							; UNIT SYSUTILS

.local	RENDERCHESSMAN					; PROCEDURE

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x INVERT
	dex						; sub bx, 1

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x Y
	dex						; sub bx, 1

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x X
	dex						; sub bx, 1

; -----------------------------------------------------------

; Generate Assignment for WORD / SMALLINT / SHORTREAL / POINTER
; as Pointer
	mva :STACKORIGIN,x CHESSMAN
	mva :STACKORIGIN+STACKWIDTH,x CHESSMAN+1
	dex						; sub bx, 1

; optimize OK (chessboard.pas), line = 29

	lda #$00
	sta :eax+1
	lda X
	asl @
	rol :eax+1
	add X
	sta :eax
	lda :eax+1
	adc #$00
	sta :eax+1
	lda BMPADR
	add :eax
	sta :STACKORIGIN+9
	lda BMPADR+1
	adc :eax+1
	sta :STACKORIGIN+STACKWIDTH+9
	lda #$F8
	sta :ecx
	lda #$02
	sta :ecx+1
	lda Y
	sta :eax
	lda #$00
	sta :eax+1
	.ifdef fmulinit
	fmulu_16
	els
	imulCX
	eif
	lda :STACKORIGIN+9
	add :eax
	sta :STACKORIGIN+9
	lda :STACKORIGIN+STACKWIDTH+9
	adc :eax+1
	sta :STACKORIGIN+STACKWIDTH+9
	lda :STACKORIGIN+9
	add #$29
	sta P
	lda :STACKORIGIN+STACKWIDTH+9
	adc #$00
	sta P+1
; For

; optimize OK (chessboard.pas), line = 30

	mva #$00 I0B

; optimize OK (chessboard.pas), line = 30

; To
l_010F

; ForToDoCondition

; optimize OK (chessboard.pas), line = 30

	lda I0B
	cmp #$12
	scc
	jne l_011D

; optimize OK (chessboard.pas), line = 31

	lda CHESSMAN+1
	sta :bp+1
	ldy CHESSMAN
	lda (:bp),y
	eor INVERT
	sta :STACKORIGIN+10
	lda P
	add #$00
	tay
	lda P+1
	adc #0
	sta :bp+1
	lda :STACKORIGIN+10
	sta (:bp),y

; optimize FAIL (0, chessboard.pas), line = 31
	inw CHESSMAN

; optimize OK (chessboard.pas), line = 32

	lda CHESSMAN+1
	sta :bp+1
	ldy CHESSMAN
	lda (:bp),y
	eor INVERT
	sta :STACKORIGIN+10
	lda P
	add #$01
	tay
	lda P+1
	adc #0
	sta :bp+1
	lda :STACKORIGIN+10
	sta (:bp),y

; optimize FAIL (0, chessboard.pas), line = 32
	inw CHESSMAN

; optimize OK (chessboard.pas), line = 33

	lda CHESSMAN+1
	sta :bp+1
	ldy CHESSMAN
	lda (:bp),y
	eor INVERT
	sta :STACKORIGIN+10
	lda P
	add #$02
	tay
	lda P+1
	adc #0
	sta :bp+1
	lda :STACKORIGIN+10
	sta (:bp),y

; optimize FAIL (0, chessboard.pas), line = 33
	inw CHESSMAN

; optimize OK (chessboard.pas), line = 34

	lda P
	add #$28
	sta P
	scc
	inc P+1

; ForToDoEpilog
c_010F
	inc I0B						; inc ptr byte [CounterAddress]

	jne l_010F

l_011D
b_010F

; -----------------------------------------------------------

CHESSMAN	= DATAORIGIN+$0041
X	= DATAORIGIN+$0043
Y	= DATAORIGIN+$0044
INVERT	= DATAORIGIN+$0045
I0B	= DATAORIGIN+$0046
P	= DATAORIGIN+$0047
@FORTMP_010C	= $0012

@VarData	= CHESSMAN
@VarDataSize	= 8

@exit
	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif
	rts						; ret
.endl

.local	DRAWRECTANGLE					; PROCEDURE

; optimize OK (chessboard.pas), line = 42

	mva BMPADR P1
	mva BMPADR+1 P1+1

; optimize OK (chessboard.pas), line = 43

	lda BMPADR
	add #$19
	sta P2
	lda BMPADR+1
	adc #$00
	sta P2+1
; For

; optimize OK (chessboard.pas), line = 44

	mva #$00 I0B

; optimize OK (chessboard.pas), line = 44

; To
l_0171

; ForToDoCondition

; optimize OK (chessboard.pas), line = 44

	lda I0B
	cmp #$99
	scc
	jne l_017F

; optimize OK (chessboard.pas), line = 45

	lda P1
	add #$00
	tay
	lda P1+1
	adc #0
	sta :bp+1
	lda #$01
	sta (:bp),y

; optimize OK (chessboard.pas), line = 45

	lda P1
	add #$28
	sta P1
	scc
	inc P1+1

; optimize OK (chessboard.pas), line = 46

	lda P2
	add #$00
	tay
	lda P2+1
	adc #0
	sta :bp+1
	lda #$80
	sta (:bp),y

; optimize OK (chessboard.pas), line = 46

	lda P2
	add #$28
	sta P2
	scc
	inc P2+1

; ForToDoEpilog
c_0171
	inc I0B						; inc ptr byte [CounterAddress]

	jne l_0171

l_017F
b_0171

; optimize OK (chessboard.pas), line = 48

	mva BMPADR P1
	mva BMPADR+1 P1+1

; optimize OK (chessboard.pas), line = 49

	lda BMPADR
	add #$E8
	sta P2
	lda BMPADR+1
	adc #$17
	sta P2+1
; For

; optimize OK (chessboard.pas), line = 50

	mva #$01 I0B

; optimize OK (chessboard.pas), line = 50

; To
l_01A7

; ForToDoCondition

; optimize OK (chessboard.pas), line = 50

	lda I0B
	cmp #$18
	scc
	jne l_01B5

; optimize OK (chessboard.pas), line = 51

	lda P1
	add I0B
	tay
	lda P1+1
	adc #0
	sta :bp+1
	lda #$FF
	sta (:bp),y

; optimize OK (chessboard.pas), line = 52

	lda P2
	add I0B
	tay
	lda P2+1
	adc #0
	sta :bp+1
	lda #$FF
	sta (:bp),y

; ForToDoEpilog
c_01A7
	inc I0B						; inc ptr byte [CounterAddress]

	jne l_01A7

l_01B5
b_01A7

; -----------------------------------------------------------

I0B	= DATAORIGIN+$0049
P1	= DATAORIGIN+$004A
P2	= DATAORIGIN+$004C
@FORTMP_016E	= $0099
@FORTMP_01A4	= $0018

@VarData	= I0B
@VarDataSize	= 5

@exit
	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif
	rts						; ret
.endl

.local	DRAWBOARD					; PROCEDURE

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x SIDE
	dex						; sub bx, 1

; optimize FAIL ('DRAWRECTANGLE', chessboard.pas), line = 61
	jsr DRAWRECTANGLE

; optimize OK (chessboard.pas), line = 62

	mva #$01 CHESSMAN
; For

; optimize OK (chessboard.pas), line = 63

	mva #$00 I1B

; optimize OK (chessboard.pas), line = 63

; To
l_01DD

; ForToDoCondition

; optimize OK (chessboard.pas), line = 63

	lda I1B
	cmp #$07
	scc
	jne l_01EB

; For

; optimize OK (chessboard.pas), line = 64

	mva #$00 I0B

; optimize OK (chessboard.pas), line = 64

; To
l_01F4

; ForToDoCondition

; optimize OK (chessboard.pas), line = 64

	lda I0B
	cmp #$07
	scc
	jne l_0202

; optimize OK (chessboard.pas), line = 65

	lda I0B
	add I1B
	and #1
	.ifdef IFTMP_92
	sta IFTMP_92
	eif
	jeq l_0214

; optimize OK (chessboard.pas), line = 65

	mva SIDE INVERT
l_0214

; Restore conditional expression
	lda IFTMP_92

; else condition
	jne l_0224

; optimize OK (chessboard.pas), line = 65

	lda SIDE
	eor #$ff
	sta INVERT
l_0224

; optimize OK (chessboard.pas), line = 66

	ldy #1
	lda I1B
	cmp #$01
	seq
	bcs @+
	dey
@
	sty :STACKORIGIN+9
	ldy #1
	lda I1B
	cmp #$06
	bcc @+
	dey
@
	tya
	and :STACKORIGIN+9
	.ifdef IFTMP_93
	sta IFTMP_93
	eif
	jeq l_024B

; optimize FAIL ('RENDERCHESSMAN', chessboard.pas), line = 67
	inx
	mva #$1D :STACKORIGIN,x
	mva #$20 :STACKORIGIN+STACKWIDTH,x
	inx
	mva I0B :STACKORIGIN,x
	inx
	mva I1B :STACKORIGIN,x
	inx
	mva INVERT :STACKORIGIN,x
	jsr @expandToCARD.BYTE
	jsr notaBX
	jsr RENDERCHESSMAN
l_024B

; Restore conditional expression
	lda IFTMP_93

; else condition
	jne l_0263

; optimize FAIL ('RENDERCHESSMAN', chessboard.pas), line = 69
	inx
	lda CHESSMAN
	asl @
	tay
	mva adr.CHESSBOARD,y :STACKORIGIN,x
	mva adr.CHESSBOARD+1,y :STACKORIGIN+STACKWIDTH,x
	inx
	mva I0B :STACKORIGIN,x
	inx
	mva I1B :STACKORIGIN,x
	inx
	mva INVERT :STACKORIGIN,x
	jsr RENDERCHESSMAN

; optimize FAIL (0, chessboard.pas), line = 70
	inc CHESSMAN
l_0263

; ForToDoEpilog
c_01F4
	inc I0B						; inc ptr byte [CounterAddress]

	jne l_01F4

l_0202
b_01F4

; ForToDoEpilog
c_01DD
	inc I1B						; inc ptr byte [CounterAddress]

	jne l_01DD

l_01EB
b_01DD

; -----------------------------------------------------------

SIDE	= DATAORIGIN+$004E
I0B	= DATAORIGIN+$004F
I1B	= DATAORIGIN+$0050
INVERT	= DATAORIGIN+$0051
CHESSMAN	= DATAORIGIN+$0052
@FORTMP_01DA	= $0007
@FORTMP_01F1	= $0007
IFTMP_92	= DATAORIGIN+$0053
IFTMP_93	= DATAORIGIN+$0054

@VarData	= SIDE
@VarDataSize	= 7

@exit
	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif
	rts						; ret
.endl
l_0024

; optimize FAIL ('GRAPH.INITGRAPH_0071', chessboard.pas), line = 80
	inx
	mva #$08 :STACKORIGIN,x
	jsr GRAPH.INITGRAPH_0071

; optimize OK (chessboard.pas), line = 81

	lda $0058
	sta BMPADR
	lda $0058+1
	sta BMPADR+1

; optimize FAIL ('GRAPH.SETCOLOR', chessboard.pas), line = 83
	inx
	mva #$01 :STACKORIGIN,x
	jsr GRAPH.SETCOLOR

; optimize OK (chessboard.pas), line = 85

	mva #$02 COLOR

; optimize FAIL ('GRAPH.SETBKCOLOR', chessboard.pas), line = 86
	inx
	mva COLOR :STACKORIGIN,x
	jsr GRAPH.SETBKCOLOR

; optimize FAIL ('CRT.TEXTBACKGROUND', chessboard.pas), line = 87
	inx
	mva COLOR :STACKORIGIN,x
	jsr CRT.TEXTBACKGROUND

; optimize FAIL ('SYSUTILS.GETTICKCOUNT', chessboard.pas), line = 89
	jsr SYSUTILS.GETTICKCOUNT
	mva :STACKORIGIN,x START
	mva :STACKORIGIN+STACKWIDTH,x START+1
	mva :STACKORIGIN+STACKWIDTH*2,x START+2
	mva :STACKORIGIN+STACKWIDTH*3,x START+3
	dex

; optimize FAIL ('DRAWBOARD', chessboard.pas), line = 90
	inx
	mva #$00 :STACKORIGIN,x
	jsr DRAWBOARD

; optimize FAIL ('SYSUTILS.GETTICKCOUNT', chessboard.pas), line = 91
	jsr SYSUTILS.GETTICKCOUNT
	mva :STACKORIGIN,x STOP
	mva :STACKORIGIN+STACKWIDTH,x STOP+1
	mva :STACKORIGIN+STACKWIDTH*2,x STOP+2
	mva :STACKORIGIN+STACKWIDTH*3,x STOP+3
	dex

	@printSTRING #CODEORIGIN+$000D

; -----------------------------------------------------------

; Push CARDINAL / INTEGER / REAL / SINGLE
; as Pointer

	inx						; add bx, 1
	mva STOP :STACKORIGIN,x
	mva STOP+1 :STACKORIGIN+STACKWIDTH,x
	mva STOP+2 :STACKORIGIN+STACKWIDTH*2,x
	mva STOP+3 :STACKORIGIN+STACKWIDTH*3,x

; -----------------------------------------------------------

; Push CARDINAL / INTEGER / REAL / SINGLE
; as Pointer

	inx						; add bx, 1
	mva START :STACKORIGIN,x
	mva START+1 :STACKORIGIN+STACKWIDTH,x
	mva START+2 :STACKORIGIN+STACKWIDTH*2,x
	mva START+3 :STACKORIGIN+STACKWIDTH*3,x

; Generate Binary Operation for CARDINAL
	jsr subEAX_ECX					; sub :eax, :ecx
	dex						; sub bx, 1

	jsr @printCARD
	dex						; sub bx, 1
	@printEOL

	jsr CRT.READKEY					; call Entry

	dex						; sub bx, 1

; -----------------------------------------------------------

adr.WHITE_SQUARE	= CODEORIGIN+$001D
.var WHITE_SQUARE	= adr.WHITE_SQUARE .word
adr.PAWN_SE	= CODEORIGIN+$0056
.var PAWN_SE	= adr.PAWN_SE .word
adr.PAWN_EE	= CODEORIGIN+$008F
.var PAWN_EE	= adr.PAWN_EE .word
adr.KING_SE	= CODEORIGIN+$00C8
.var KING_SE	= adr.KING_SE .word
adr.KING_EE	= CODEORIGIN+$0101
.var KING_EE	= adr.KING_EE .word
adr.QUEEN_SE	= CODEORIGIN+$013A
.var QUEEN_SE	= adr.QUEEN_SE .word
adr.QUEEN_EE	= CODEORIGIN+$0173
.var QUEEN_EE	= adr.QUEEN_EE .word
adr.ROOK_SE	= CODEORIGIN+$01AC
.var ROOK_SE	= adr.ROOK_SE .word
adr.ROOK_EE	= CODEORIGIN+$01E5
.var ROOK_EE	= adr.ROOK_EE .word
adr.KNIGHT_SE	= CODEORIGIN+$021E
.var KNIGHT_SE	= adr.KNIGHT_SE .word
adr.KNIGHT_EE	= CODEORIGIN+$0257
.var KNIGHT_EE	= adr.KNIGHT_EE .word
adr.BISHOP_SE	= CODEORIGIN+$0290
.var BISHOP_SE	= adr.BISHOP_SE .word
adr.BISHOP_EE	= CODEORIGIN+$02C9
.var BISHOP_EE	= adr.BISHOP_EE .word
adr.CHESSBOARD	= CODEORIGIN+$0302
.var CHESSBOARD	= adr.CHESSBOARD .word
BMPADR	= DATAORIGIN+$0032
COLOR	= DATAORIGIN+$0034
START	= DATAORIGIN+$0035
STOP	= DATAORIGIN+$0039
TOTAL	= DATAORIGIN+$003D

@exit

@halt	ldx #0
	txs

	rts

IOCB@COPY	:16 brk

.local	@DEFINES
ATARI
.endl

.endl

; -----------------------------------------------------------

	icl 'cpu6502.asm'

; -----------------------------------------------------------

.macro UNITINITIALIZATION

	.ifdef MAIN.SYSTEM.@UnitInit
	jsr MAIN.SYSTEM.@UnitInit
	eif

	.ifdef MAIN.ATARI.@UnitInit
	jsr MAIN.ATARI.@UnitInit
	eif

	.ifdef MAIN.CRT.@UnitInit
	jsr MAIN.CRT.@UnitInit
	eif

	.ifdef MAIN.TYPES.@UnitInit
	jsr MAIN.TYPES.@UnitInit
	eif

	.ifdef MAIN.GRAPH.@UnitInit
	jsr MAIN.GRAPH.@UnitInit
	eif

	.ifdef MAIN.DOS.@UnitInit
	jsr MAIN.DOS.@UnitInit
	eif

	.ifdef MAIN.STRUTILS.@UnitInit
	jsr MAIN.STRUTILS.@UnitInit
	eif

	.ifdef MAIN.SYSUTILS.@UnitInit
	jsr MAIN.SYSUTILS.@UnitInit
	eif
.endm

	ift .SIZEOF(MAIN.SYSTEM) > 0
	.print 'SYSTEM: ',MAIN.SYSTEM,'..',MAIN.SYSTEM+.SIZEOF(MAIN.SYSTEM)-1
	eif

	ift .SIZEOF(MAIN.ATARI) > 0
	.print 'ATARI: ',MAIN.ATARI,'..',MAIN.ATARI+.SIZEOF(MAIN.ATARI)-1
	eif

	ift .SIZEOF(MAIN.CRT) > 0
	.print 'CRT: ',MAIN.CRT,'..',MAIN.CRT+.SIZEOF(MAIN.CRT)-1
	eif

	ift .SIZEOF(MAIN.TYPES) > 0
	.print 'TYPES: ',MAIN.TYPES,'..',MAIN.TYPES+.SIZEOF(MAIN.TYPES)-1
	eif

	ift .SIZEOF(MAIN.GRAPH) > 0
	.print 'GRAPH: ',MAIN.GRAPH,'..',MAIN.GRAPH+.SIZEOF(MAIN.GRAPH)-1
	eif

	ift .SIZEOF(MAIN.DOS) > 0
	.print 'DOS: ',MAIN.DOS,'..',MAIN.DOS+.SIZEOF(MAIN.DOS)-1
	eif

	ift .SIZEOF(MAIN.STRUTILS) > 0
	.print 'STRUTILS: ',MAIN.STRUTILS,'..',MAIN.STRUTILS+.SIZEOF(MAIN.STRUTILS)-1
	eif

	ift .SIZEOF(MAIN.SYSUTILS) > 0
	.print 'SYSUTILS: ',MAIN.SYSUTILS,'..',MAIN.SYSUTILS+.SIZEOF(MAIN.SYSUTILS)-1
	eif

	.print 'CODE: ',CODEORIGIN,'..',*-1

DATAORIGIN
.by  $28 $00 $18 $00 $2D $0C $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $9F $00 $00 $00 $BF

VARINITSIZE	= *-DATAORIGIN
VARDATASIZE	= 85

PROGRAMSTACK	= DATAORIGIN+VARDATASIZE

	.print 'DATA: ',DATAORIGIN,'..',PROGRAMSTACK

	run START

; -----------------------------------------------------------

.macro	STATICDATA
.by  $04 $54 $52 $55 $45 $00 $05 $46  $41 $4C $53 $45 $00 $0E $64 $72  $61 $77 $69 $6E $67 $20 $74 $69
.by  $6D $65 $3A $20 $00 $FF $FF $FF  $FF $FF $FF $FF $FF $FF $FF $FF  $FF $FF $FF $FF $FF $FF $FF $FF
.by  $FF $FF $FF $FF $FF $FF $FF $FF  $FF $FF $FF $FF $FF $FF $FF $FF  $FF $FF $FF $FF $FF $FF $FF $FF
.by  $FF $FF $FF $FF $FF $FF $FF $FF  $FF $FF $FF $FF $FF $FF $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
.by  $00 $00 $00 $3C $00 $00 $7E $00  $00 $7E $00 $00 $3C $00 $00 $18  $00 $00 $3C $00 $00 $7E $00 $00
.by  $3C $00 $00 $3C $00 $00 $3C $00  $00 $3C $00 $00 $7E $00 $00 $FF  $00 $01 $FF $80 $01 $FF $80 $00
.by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $3C $00 $00 $42 $00 $00 $81  $00 $00 $81 $00 $00 $42 $00 $00
.by  $24 $00 $00 $42 $00 $00 $81 $00  $00 $42 $00 $00 $42 $00 $00 $42  $00 $00 $42 $00 $00 $81 $00 $01
.by  $00 $80 $02 $00 $40 $02 $00 $40  $00 $00 $00 $00 $00 $00 $00 $18  $00 $00 $18 $00 $00 $7E $00 $07
.by  $7E $E0 $0F $99 $F0 $1F $DB $F8  $1F $FF $F8 $1F $FF $F8 $1F $E7  $F8 $1F $DB $F8 $0F $BD $F0 $07
.by  $BD $E0 $07 $DB $E0 $02 $66 $40  $03 $FF $C0 $01 $00 $80 $01 $FF  $80 $00 $00 $00 $00 $0E $00 $00
.by  $11 $80 $03 $16 $40 $04 $E1 $A0  $08 $04 $50 $08 $00 $50 $07 $00  $50 $08 $00 $50 $04 $E0 $50 $03
.by  $20 $A0 $00 $41 $40 $00 $81 $40  $01 $22 $80 $02 $42 $80 $04 $82  $80 $04 $81 $40 $04 $00 $A0 $02
.by  $00 $50 $00 $00 $00 $00 $00 $00  $00 $00 $00 $11 $18 $88 $1B $BD  $D8 $1B $BD $D8 $1B $BD $D8 $1F
.by  $FF $F8 $1F $FF $F8 $1F $FF $F8  $1F $FF $F8 $0F $FF $F0 $0F $FF  $F0 $0C $00 $30 $07 $FF $E0 $06
.by  $00 $60 $03 $FF $C0 $03 $00 $C0  $01 $FF $80 $00 $00 $00 $00 $00  $00 $11 $18 $88 $2A $A5 $54 $24
.by  $42 $24 $24 $42 $24 $24 $42 $24  $20 $00 $04 $20 $00 $04 $20 $00  $04 $20 $00 $04 $10 $00 $08 $10
.by  $00 $08 $13 $FF $C8 $08 $00 $10  $09 $FF $90 $04 $00 $20 $04 $FF  $20 $02 $00 $40 $00 $00 $00 $00
.by  $00 $00 $00 $00 $00 $00 $00 $00  $03 $BD $C0 $03 $BD $C0 $03 $BD  $C0 $03 $FF $C0 $01 $FF $80 $00
.by  $FF $00 $00 $FF $00 $00 $FF $00  $00 $FF $00 $00 $FF $00 $00 $FF  $00 $01 $FF $80 $01 $FF $80 $07
.by  $FF $E0 $07 $FF $E0 $00 $00 $00  $00 $00 $00 $00 $00 $00 $03 $BD  $C0 $04 $42 $20 $04 $42 $20 $04
.by  $42 $20 $04 $00 $20 $02 $00 $40  $01 $00 $80 $01 $00 $80 $01 $00  $80 $01 $00 $80 $01 $00 $80 $01
.by  $00 $80 $02 $00 $40 $06 $00 $60  $08 $00 $10 $08 $00 $10 $00 $00  $00 $00 $00 $00 $00 $0E $00 $00
.by  $09 $80 $03 $1E $40 $07 $FB $A0  $07 $FF $A0 $00 $FF $A0 $07 $FF  $A0 $03 $1F $A0 $00 $1F $40 $00
.by  $3E $80 $00 $7E $80 $00 $DD $00  $01 $BD $00 $03 $7D $00 $03 $7E  $80 $03 $FF $40 $01 $FF $A0 $00
.by  $00 $00 $00 $0E $00 $00 $11 $80  $03 $16 $40 $04 $E1 $A0 $08 $04  $50 $08 $00 $50 $07 $00 $50 $08
.by  $00 $50 $04 $E0 $50 $03 $20 $A0  $00 $41 $40 $00 $81 $40 $01 $22  $80 $02 $42 $80 $04 $82 $80 $04
.by  $81 $40 $04 $00 $A0 $02 $00 $50  $00 $00 $00 $00 $00 $00 $00 $18  $00 $00 $7E $00 $00 $FF $00 $01
.by  $E7 $80 $01 $E7 $80 $03 $E7 $C0  $03 $E7 $C0 $03 $18 $C0 $03 $E7  $C0 $03 $E7 $C0 $03 $E7 $C0 $01
.by  $E7 $80 $01 $FF $80 $00 $E7 $00  $00 $7E $00 $0F $66 $F0 $19 $DB  $98 $00 $00 $00 $00 $18 $00 $00
.by  $66 $00 $00 $81 $00 $01 $00 $80  $02 $18 $40 $02 $18 $40 $04 $18  $20 $04 $18 $20 $04 $E7 $20 $04
.by  $18 $20 $04 $18 $20 $04 $18 $20  $02 $18 $40 $02 $00 $40 $01 $18  $80 $0E $81 $70 $10 $99 $08 $26
.by  $24 $64 $1D $20 $AC $21 $57 $22  $90 $22 $73 $21 $C8 $20 $C9 $22  $1E $22 $E5 $21 $8F $20 $56 $20
.by  $8F $20 $56 $20 $8F $20 $56 $20  $8F $20 $56 $20 $8F $20 $56 $20  $8F $20 $56 $20 $8F $20 $56 $20
.by  $8F $20 $56 $20 $AC $21 $57 $22  $90 $22 $73 $21 $C8 $20 $C9 $22  $1E $22 $E5 $21
.endm

	end
