mads 2.0.9
   290 					opt l+
   227 					opt l+
   228
   229 				/* ----------------------------------------------------------------------- */
   230
   231
   232 2442			.proc	hiBYTE
   233 					lda :STACKORIGIN,x
   234 2442				:4 lsr @
   235 					sta :STACKORIGIN,x
   236 					rts
   237 				.endp
   238
   239 2442			.proc	hiWORD
   240 					lda :STACKORIGIN+STACKWIDTH,x
   241 					sta :STACKORIGIN,x
   242 					rts
   243 				.endp
   244
   245 2442			.proc	hiCARD
   246 					lda :STACKORIGIN+STACKWIDTH*3,x
   247 					sta :STACKORIGIN+STACKWIDTH,x
   248
   249 					lda :STACKORIGIN+STACKWIDTH*2,x
   250 					sta :STACKORIGIN,x
   251 					rts
   252 				.endp
   253
   254
   255 2442			.proc	movaBX_EAX		; mov [BX], EAX
   256 2442				:MAXSIZE mva eax+# :STACKORIGIN-1+#*STACKWIDTH,x
   257 					rts
   258 				.endp
   259
   260 				/*
   261 				.proc	@pushBYTE
   262 					adc :STACKORIGIN+STACKWIDTH,x
   263 					sta bp+1
   264
   265 					mva (bp),y :STACKORIGIN,x
   266
   267 				;	lda #$00
   268 				;	sta :STACKORIGIN+STACKWIDTH,x
   269 				;	sta :STACKORIGIN+STACKWIDTH*2,x
   270 				;	sta :STACKORIGIN+STACKWIDTH*3,x
   271
   272 					rts
   273 				.endp
   274
   275
   276 				.proc	@pullWORD (.word ya) .reg
   277 					add :STACKORIGIN-1,x
   278 					sta bp2
   279 					tya
   280 					adc :STACKORIGIN-1+STACKWIDTH,x
   281 					sta bp2+1
   282
   283 					ldy #$00
   284
   285 					mva :STACKORIGIN,x (bp2),y
   286 					iny
   287 					mva :STACKORIGIN+STACKWIDTH,x (bp2),y
   288
   289 					rts
   290 				.endp
   291
   292
   293 				.proc	@pullCARD (.word ya) .reg
   294 					add :STACKORIGIN-1,x
   295 					sta bp2
   296 					tya
   297 					adc :STACKORIGIN-1+STACKWIDTH,x
   298 					sta bp2+1
   299
   300 					ldy #$00
   301
   302 					mva :STACKORIGIN,x (bp2),y
   303 					iny
   304 					mva :STACKORIGIN+STACKWIDTH,x (bp2),y
   305 					iny
   306 					mva :STACKORIGIN+STACKWIDTH*2,x (bp2),y
   307 					iny
   308 					mva :STACKORIGIN+STACKWIDTH*3,x (bp2),y
   309
   310 					rts
   311 				.endp
   312
   313
   314 				.proc	@pushWORD (.word ya) .reg
   315 					add :STACKORIGIN,x
   316 					sta bp2
   317 					tya
   318 					adc :STACKORIGIN+STACKWIDTH,x
   319 					sta bp2+1
   320
   321 					ldy #$00
   322
   323 					mva (bp2),y :STACKORIGIN,x
   324 					iny
   325 					mva (bp2),y :STACKORIGIN+STACKWIDTH,x
   326
   327 					rts
   328 				.endp
   329
   330
   331 				.proc	@pushCARD (.word ya) .reg
   332 					add :STACKORIGIN,x
   333 					sta bp2
   334 					tya
   335 					adc :STACKORIGIN+STACKWIDTH,x
   336 					sta bp2+1
   337
   338 					ldy #$00
   339
   340 					mva (bp2),y :STACKORIGIN,x
   341 					iny
   342 					mva (bp2),y :STACKORIGIN+STACKWIDTH,x
   343 					iny
   344 					mva (bp2),y :STACKORIGIN+STACKWIDTH*2,x
   345 					iny
   346 					mva (bp2),y :STACKORIGIN+STACKWIDTH*3,x
   347
   348 					rts
   349 				.endp
   350 				*/
   350
   351
   352 2442			.proc	shlEAX_CL
   353
   354 				;SHORT	jsr @expandToCARD1.SHORT
   355 				;	jmp CARD
   356
   357 				;SMALL	jsr @expandToCARD1.SMALL
   358 				;	jmp CARD
   359
   360 2442			BYTE	lda #0
   361 					sta :STACKORIGIN-1+STACKWIDTH,x
   362
   363 2442			WORD	lda #0
   364 					sta :STACKORIGIN-1+STACKWIDTH*2,x
   365 					sta :STACKORIGIN-1+STACKWIDTH*3,x
   366
   367 2442			CARD	clc
   368 					ldy :STACKORIGIN,x	; cl
   369 					beq stop
   370 2442			@	asl :STACKORIGIN-1,x	; eax
   371 					rol :STACKORIGIN-1+STACKWIDTH,x
   372 					rol :STACKORIGIN-1+STACKWIDTH*2,x
   373 					rol :STACKORIGIN-1+STACKWIDTH*3,x
   374 					dey
   375 					bne @-
   376
   377 2442			stop	rts
   378 				.endp
   379
   380
   381 2442			.proc	shrAL_CL
   382
   383 				;SHORT	jsr @expandToCARD1.SHORT
   384 				;	jmp shrEAX_CL
   385
   386 2442			BYTE	ldy :STACKORIGIN,x	; cl
   387 					beq stop
   388 2442			@	lsr :STACKORIGIN-1,x
   389 					dey
   390 					bne @-
   391
   392 2442			stop	lda #0
   393 					sta :STACKORIGIN-1+STACKWIDTH,x
   394 					sta :STACKORIGIN-1+STACKWIDTH*2,x
   395 					sta :STACKORIGIN-1+STACKWIDTH*3,x
   396
   397 					rts
   398 				.endp
   399
   400 2442			.proc	shrAX_CL
   401
   402 				;SMALL	jsr @expandToCARD1.SMALL
   403 				;	jmp shrEAX_CL
   404
   405 2442			WORD	ldy :STACKORIGIN,x	; cl
   406 					beq stop
   407 2442			@	lsr :STACKORIGIN-1+STACKWIDTH,x
   408 					ror :STACKORIGIN-1,x
   409 					dey
   410 					bne @-
   411
   412 2442			stop	lda #0
   413 					sta :STACKORIGIN-1+STACKWIDTH*2,x
   414 					sta :STACKORIGIN-1+STACKWIDTH*3,x
   415
   416 					rts
   417 				.endp
   418
   419 2442			.proc	shrEAX_CL
   420
   421 					ldy :STACKORIGIN,x	; cl
   422 					beq stop
   423 2442			@	lsr :STACKORIGIN-1+STACKWIDTH*3,x
   424 					ror :STACKORIGIN-1+STACKWIDTH*2,x
   425 					ror :STACKORIGIN-1+STACKWIDTH,x
   426 					ror :STACKORIGIN-1,x
   427 					dey
   428 					bne @-
   429
   430 2442			stop	rts
   431 				.endp
   432
   433 				; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   434 				; wynik operacji ADD zostanie potraktowany jako INTEGER / CARDINAL
   435 				; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   436
   437 2442			.proc	addAL_CL
   438
   439 					ldy #0
   440
   441 					sty :STACKORIGIN-1+STACKWIDTH*2,x
   442 					sty :STACKORIGIN-1+STACKWIDTH*3,x
   443
   444 					lda :STACKORIGIN-1,x
   445 					add :STACKORIGIN,x
   446 					sta :STACKORIGIN-1,x
   447 					scc
   448 					iny
   449
   450 					sty :STACKORIGIN-1+STACKWIDTH,x
   451
   452 					rts
   453 				.endp
   454
   455 2442			.proc	addAX_CX
   456
   457 					ldy #0
   458
   459 					sty :STACKORIGIN-1+STACKWIDTH*3,x
   460
   461 					lda :STACKORIGIN-1,x
   462 					add :STACKORIGIN,x
   463 					sta :STACKORIGIN-1,x
   464
   465 					lda :STACKORIGIN-1+STACKWIDTH,x
   466 					adc :STACKORIGIN+STACKWIDTH,x
   467 					sta :STACKORIGIN-1+STACKWIDTH,x
   468 					scc
   469 					iny
   470
   471 					sty :STACKORIGIN-1+STACKWIDTH*2,x
   472
   473 					rts
   474 				.endp
   475
   476
   477 2442			.proc	addEAX_ECX
   478 				/*
   479 				SHORT	jsr @expandToCARD.SHORT
   480 					jsr @expandToCARD1.SHORT
   481 					jmp CARD
   482
   483 				SMALL	jsr @expandToCARD.SMALL
   484 					jsr @expandToCARD1.SMALL
   485 				*/
   485
   486 2442			CARD	lda :STACKORIGIN-1,x
   487 					add :STACKORIGIN,x
   488 					sta :STACKORIGIN-1,x
   489
   490 					lda :STACKORIGIN-1+STACKWIDTH,x
   491 					adc :STACKORIGIN+STACKWIDTH,x
   492 					sta :STACKORIGIN-1+STACKWIDTH,x
   493
   494 					lda :STACKORIGIN-1+STACKWIDTH*2,x
   495 					adc :STACKORIGIN+STACKWIDTH*2,x
   496 					sta :STACKORIGIN-1+STACKWIDTH*2,x
   497
   498 					lda :STACKORIGIN-1+STACKWIDTH*3,x
   499 					adc :STACKORIGIN+STACKWIDTH*3,x
   500 					sta :STACKORIGIN-1+STACKWIDTH*3,x
   501
   502 					rts
   503 				.endp
   504
   505
   506 2442			.proc	subAL_CL
   507
   508 					ldy #0
   509
   510 					lda :STACKORIGIN-1,x
   511 					sub :STACKORIGIN,x
   512 					sta :STACKORIGIN-1,x
   513 					scs
   514 					dey
   515
   516 					sty :STACKORIGIN-1+STACKWIDTH,x
   517 					sty :STACKORIGIN-1+STACKWIDTH*2,x
   518 					sty :STACKORIGIN-1+STACKWIDTH*3,x
   519
   520 					rts
   521 				.endp
   522
   523 2442			.proc	subAX_CX
   524
   525 					ldy #0
   526
   527 					lda :STACKORIGIN-1,x		; ax
   528 					sub :STACKORIGIN,x		; cx
   529 					sta :STACKORIGIN-1,x
   530
   531 					lda :STACKORIGIN-1+STACKWIDTH,x
   532 					sbc :STACKORIGIN+STACKWIDTH,x
   533 					sta :STACKORIGIN-1+STACKWIDTH,x
   534 					scs
   535 					dey
   536
   537 					sty :STACKORIGIN-1+STACKWIDTH*2,x
   538 					sty :STACKORIGIN-1+STACKWIDTH*3,x
   539
   540 					rts
   541 				.endp
   542
   543 2442			.proc	subEAX_ECX
   544
   545 					lda :STACKORIGIN-1,x
   546 					sub :STACKORIGIN,x
   547 					sta :STACKORIGIN-1,x
   548
   549 					lda :STACKORIGIN-1+STACKWIDTH,x
   550 					sbc :STACKORIGIN+STACKWIDTH,x
   551 					sta :STACKORIGIN-1+STACKWIDTH,x
   552
   553 					lda :STACKORIGIN-1+STACKWIDTH*2,x
   554 					sbc :STACKORIGIN+STACKWIDTH*2,x
   555 					sta :STACKORIGIN-1+STACKWIDTH*2,x
   556
   557 					lda :STACKORIGIN-1+STACKWIDTH*3,x
   558 					sbc :STACKORIGIN+STACKWIDTH*3,x
   559 					sta :STACKORIGIN-1+STACKWIDTH*3,x
   560
   561 					rts
   562 				.endp
   563
   564
   565 2442			.proc	@expandSHORT2SMALL
   566 					ldy #$00
   567 					lda :STACKORIGIN,x
   568 					spl
   569 					dey
   570 					sty :STACKORIGIN+STACKWIDTH,x
   571
   572 					rts
   573 				.endp
   574
   575 2442			.proc	@expandSHORT2SMALL1
   576 					ldy #$00
   577 					lda :STACKORIGIN-1,x
   578 					spl
   579 					dey
   580 					sty :STACKORIGIN-1+STACKWIDTH,x
   581
   582 					rts
   583 				.endp
   584
   585
   586 2442			.proc	@expandToCARD
   587
   588 2442			SMALL	lda :STACKORIGIN+STACKWIDTH,x
   589 					bpl WORD
   590
   591 					lda #$ff
   592 					bne _wo
   593
   594 2442			WORD	lda #$00
   595 					beq _wo
   596
   597 2442			SHORT	lda :STACKORIGIN,x
   598 					bpl BYTE
   599
   600 					lda #$ff
   601 					bne _by
   602
   603 2442			BYTE	lda #$00
   604
   605 2442			_by	sta :STACKORIGIN+STACKWIDTH,x
   606 2442			_wo	sta :STACKORIGIN+STACKWIDTH*2,x
   607 2442			_lo	sta :STACKORIGIN+STACKWIDTH*3,x
   608 					rts
   609 				.endp
   610
   611
   612 2442			.proc	@expandToCARD1
   613
   614 2442			SMALL	lda :STACKORIGIN-1+STACKWIDTH,x
   615 					bpl WORD
   616
   617 					lda #$ff
   618 					bne _wo
   619
   620 2442			WORD	lda #$00
   621 					beq _wo
   622
   623 2442			SHORT	lda :STACKORIGIN-1,x
   624 					bpl BYTE
   625
   626 					lda #$ff
   627 					bne _by
   628
   629 2442			BYTE	lda #$00
   630
   631 2442			_by	sta :STACKORIGIN-1+STACKWIDTH,x
   632 2442			_wo	sta :STACKORIGIN-1+STACKWIDTH*2,x
   633 2442			_lo	sta :STACKORIGIN-1+STACKWIDTH*3,x
   634 					rts
   635 				.endp
   636
   637 				/*
   638 				.proc	@cmpFor_WORD (.word ya) .reg
   639 					sta ztmp
   640 					sty ztmp+1
   641
   642 					ldy #1
   643 					lda (ztmp),y
   644 					cmp :STACKORIGIN+1+STACKWIDTH,x
   645 					bne stop
   646 					dey
   647 					lda (ztmp),y
   648 					cmp :STACKORIGIN+1,x
   649 				stop	rts
   650 				.endp
   651
   652
   653 				.proc	@cmpFor_CARD (.word ya) .reg
   654 					sta ztmp
   655 					sty ztmp+1
   656
   657 					ldy #3
   658 					lda (ztmp),y
   659 					cmp :STACKORIGIN+1+STACKWIDTH*3,x
   660 					bne stop
   661 					dey
   662 					lda (ztmp),y
   663 					cmp :STACKORIGIN+1+STACKWIDTH*2,x
   664 					bne stop
   665 					dey
   666 					lda (ztmp),y
   667 					cmp :STACKORIGIN+1+STACKWIDTH,x
   668 					bne stop
   669 					dey
   670 					lda (ztmp),y
   671 					cmp :STACKORIGIN+1,x
   672
   673 				stop	rts
   674 				.endp
   675
   676
   677 				.proc	@cmpFor_SHORTINT(.word ya) .reg
   678 					sta ztmp
   679 					sty ztmp+1
   680
   681 					ldy	#0
   682 					lda	(ztmp),y
   683 					sec
   684 					sbc	:STACKORIGIN+1,x
   685 					bne	@cmpFor_INT.L4
   686
   687 					jmp	@cmpFor_INT.L1
   688 				.endp
   689
   690
   691 				.proc	@cmpFor_SMALLINT(.word ya) .reg
   692 					sta ztmp
   693 					sty ztmp+1
   694
   695 					ldy	#1
   696 					lda	(ztmp),y
   697 					sec
   698 					sbc	:STACKORIGIN+1+STACKWIDTH,x
   699 					bne	@cmpFor_INT.L4
   700
   701 					dey
   702 					lda	(ztmp),y
   703 					cmp	:STACKORIGIN+1,x
   704
   705 					jmp	@cmpFor_INT.L1
   706 				.endp
   707
   708
   709 				.proc	@cmpFor_INT(.word ya) .reg
   710 					sta ztmp
   711 					sty ztmp+1
   712
   713 					ldy	#3
   714 					lda	(ztmp),y
   715 					sec
   716 					sbc	:STACKORIGIN+1+STACKWIDTH*3,x
   717 					bne	L4
   718
   719 					dey
   720 					lda	(ztmp),y
   721 					cmp	:STACKORIGIN+1+STACKWIDTH*2,x
   722 					bne	L1
   723
   724 					dey
   725 					lda	(ztmp),y
   726 					cmp	:STACKORIGIN+1+STACKWIDTH,x
   727 					bne	L1
   728
   729 					dey
   730 					lda	(ztmp),y
   731 					cmp	:STACKORIGIN+1,x
   732
   733 				L1	beq	L2
   734 					bcs	L3
   735
   736 					lda	#$FF	; Set the N flag
   737 				L2	rts
   738
   739 				L3	lda	#$01	; Clear the N flag
   740 					rts
   741
   742 				L4	bvc	L5
   743 					eor	#$FF	; Fix the N flag if overflow
   744 					ora	#$01	; Clear the Z flag
   745 				L5	rts
   746 				.endp
   747 				*/
   747
   748
   749 				; Piotr Fusik, 15.04.2002
   750 				; originally by Ullrich von Bassewitz
   751
   752 2442			.proc	cmpSHORTINT
   753 					lda	:STACKORIGIN-1,x
   754 					clv:sec
   755 					sbc	:STACKORIGIN,x
   756 					bne	cmpINT.L4
   757
   758 					jmp	cmpINT.L1
   759 				.endp
   760
   761
   762 2442			.proc	cmpSMALLINT
   763 					lda	:STACKORIGIN-1+STACKWIDTH,x
   764 					clv:sec
   765 					sbc	:STACKORIGIN+STACKWIDTH,x
   766 					bne	cmpINT.L4
   767
   768 					lda	:STACKORIGIN-1,x
   769 					cmp	:STACKORIGIN,x
   770
   771 					jmp	cmpINT.L1
   772 				.endp
   773
   774
   775 2442			.proc	cmpINT
   776 					lda	:STACKORIGIN-1+STACKWIDTH*3,x
   777 					clv:sec
   778 					sbc	:STACKORIGIN+STACKWIDTH*3,x
   779 					bne	L4
   780
   781 					lda	:STACKORIGIN-1+STACKWIDTH*2,x
   782 					cmp	:STACKORIGIN+STACKWIDTH*2,x
   783 					bne	L1
   784
   785 					lda	:STACKORIGIN-1+STACKWIDTH,x
   786 					cmp	:STACKORIGIN+STACKWIDTH,x
   787 					bne	L1
   788
   789 					lda	:STACKORIGIN-1,x
   790 					cmp	:STACKORIGIN,x
   791
   792 2442			L1	beq	L2
   793 					bcs	L3
   794
   795 					lda	#$FF	; Set the N flag
   796 2442			L2	rts
   797
   798 2442			L3	lda	#$01	; Clear the N flag
   799 					rts
   800
   801 2442			L4	bvc	L5
   802 					eor	#$FF	; Fix the N flag if overflow
   803 					ora	#$01	; Clear the Z flag
   804 2442			L5	rts
   805 				.endp
   806
   807
   808 2442			.proc	cmpEAX_ECX
   809 					lda :STACKORIGIN-1+STACKWIDTH*3,x
   810 					cmp :STACKORIGIN+STACKWIDTH*3,x
   811 					bne _done
   812 					lda :STACKORIGIN-1+STACKWIDTH*2,x
   813 					cmp :STACKORIGIN+STACKWIDTH*2,x
   814 					bne _done
   815 2442			AX_CX
   816 					lda :STACKORIGIN-1+STACKWIDTH,x
   817 					cmp :STACKORIGIN+STACKWIDTH,x
   818 					bne _done
   819 					lda :STACKORIGIN-1,x
   820 					cmp :STACKORIGIN,x
   821
   822 2442			_done	rts
   823 				.endp
   824
   825
   826 2442			.proc	cmpSTRING2CHAR
   827
   828 					lda :STACKORIGIN-1,x
   829 					sta ztmp8
   830 					lda :STACKORIGIN-1+STACKWIDTH,x
   831 					sta ztmp8+1
   832
   833 					lda :STACKORIGIN,x
   834 					sta ztmp10
   835
   836 					ldy #0
   837
   838 					lda (ztmp8),y		; if length <> 1
   839 					cmp #1
   840 					bne fail
   841
   842 					iny
   843
   844 2442			loop	lda (ztmp8),y
   845 					cmp ztmp10
   846 					bne fail
   847
   848 					lda #0
   849 					seq
   850
   851 2442			fail	lda #$ff
   852
   853 					ldy #1
   854
   855 					cmp #0
   856 					rts
   857 				.endp
   858
   859
   860
   861 2442			.proc	cmpCHAR2STRING
   862
   863 					lda :STACKORIGIN-1,x
   864 					sta ztmp8
   865
   866 					lda :STACKORIGIN,x
   867 					sta ztmp10
   868 					lda :STACKORIGIN+STACKWIDTH,x
   869 					sta ztmp10+1
   870
   871 					ldy #0
   872
   873 					lda (ztmp10),y		; if length <> 1
   874 					cmp #1
   875 					bne fail
   876
   877 					iny
   878
   879 2442			loop	lda (ztmp10),y
   880 					cmp ztmp8
   881 					bne fail
   882
   883 					lda #0
   884 					seq
   885
   886 2442			fail	lda #$ff
   887
   888 					ldy #1
   889
   890 					cmp #0
   891 					rts
   892 				.endp
   893
   894
   895 2442			.proc	cmpSTRING
   896
   897 					lda :STACKORIGIN-1,x
   898 					sta ztmp8
   899 					lda :STACKORIGIN-1+STACKWIDTH,x
   900 					sta ztmp8+1
   901
   902 					lda :STACKORIGIN,x
   903 					sta ztmp10
   904 					lda :STACKORIGIN+STACKWIDTH,x
   905 					sta ztmp10+1
   906
   907 					ldy #0
   908
   909 					lda (ztmp8),y		; if length1 = 0
   910 					beq fail
   911 					lda (ztmp10),y		; if length2 = 0
   912 					beq fail
   913
   914 					lda (ztmp8),y		; if length1 <> length2
   915 					cmp (ztmp10),y
   916 					bne fail
   917
   918 					sta max
   919
   920 					inw ztmp8
   921 					inw ztmp10
   922
   923 2442			loop	lda (ztmp8),y
   924 					cmp (ztmp10),y
   925 					bne fail
   926
   927 					iny
   928
   929 					cpy #0
   930 2442			max	equ *-1
   931 					bne loop
   932
   933 					lda #0
   934 					seq
   935
   936 2442			fail	lda #$ff
   937
   938 					ldy #1
   939
   940 					cmp #0
   941 					rts
   942 				.endp
   943
   944
   945 2442			.proc	notaBX
   946
   947 					.rept MAXSIZE
   948 					LDA :STACKORIGIN+#*STACKWIDTH,X
   949 					EOR #$FF
   950 					STA :STACKORIGIN+#*STACKWIDTH,X
   951 					.ENDR
   951 					.endr
Source: REPT
   948 					LDA :STACKORIGIN+#*STACKWIDTH,X
   948 					EOR #$FF
   948 					STA :STACKORIGIN+#*STACKWIDTH,X
   948 					LDA :STACKORIGIN+#*STACKWIDTH,X
   948 					EOR #$FF
   948 					STA :STACKORIGIN+#*STACKWIDTH,X
   948 					LDA :STACKORIGIN+#*STACKWIDTH,X
   948 					EOR #$FF
   948 					STA :STACKORIGIN+#*STACKWIDTH,X
   948 					LDA :STACKORIGIN+#*STACKWIDTH,X
   948 					EOR #$FF
   948 					STA :STACKORIGIN+#*STACKWIDTH,X
Source: cpu6502.asm
   952
   953 					rts
   954 				.endp
   955
   956
   957 2442			.proc	notBOOLEAN
   958 					lda :STACKORIGIN,x
   959 					bne _0
   960
   961 					lda #true
   962 					sne
   963
   964 2442			_0	lda #false
   965 					sta :STACKORIGIN,x
   966
   967 					rts
   968 				.endp
   969
   970
   971 2442			.proc	negBYTE
   972 					lda #$00
   973 					sub :STACKORIGIN,x
   974 					sta :STACKORIGIN,x
   975
   976 					lda #$00
   977 					sbc #$00
   978 					sta :STACKORIGIN+STACKWIDTH,x
   979
   980 					lda #$00
   981 					sbc #$00
   982 					sta :STACKORIGIN+STACKWIDTH*2,x
   983
   984 					lda #$00
   985 					sbc #$00
   986 					sta :STACKORIGIN+STACKWIDTH*3,x
   987
   988 					rts
   989 				.endp
   990
   991 2442			.proc	negWORD
   992 					lda #$00
   993 					sub :STACKORIGIN,x
   994 					sta :STACKORIGIN,x
   995
   996 					lda #$00
   997 					sbc :STACKORIGIN+STACKWIDTH,x
   998 					sta :STACKORIGIN+STACKWIDTH,x
   999
  1000 					lda #$00
  1001 					sbc #$00
  1002 					sta :STACKORIGIN+STACKWIDTH*2,x
  1003
  1004 					lda #$00
  1005 					sbc #$00
  1006 					sta :STACKORIGIN+STACKWIDTH*3,x
  1007
  1008 					rts
  1009 				.endp
  1010
  1011 2442			.proc	negCARD
  1012 					lda #$00
  1013 					sub :STACKORIGIN,x
  1014 					sta :STACKORIGIN,x
  1015
  1016 					lda #$00
  1017 					sbc :STACKORIGIN+STACKWIDTH,x
  1018 					sta :STACKORIGIN+STACKWIDTH,x
  1019
  1020 					lda #$00
  1021 					sbc :STACKORIGIN+STACKWIDTH*2,x
  1022 					sta :STACKORIGIN+STACKWIDTH*2,x
  1023
  1024 					lda #$00
  1025 					sbc :STACKORIGIN+STACKWIDTH*3,x
  1026 					sta :STACKORIGIN+STACKWIDTH*3,x
  1027
  1028 					rts
  1029 				.endp
  1030
  1031
  1032 2442			.proc	negBYTE1
  1033 					lda #$00
  1034 					sub :STACKORIGIN-1,x
  1035 					sta :STACKORIGIN-1,x
  1036
  1037 					lda #$00
  1038 					sbc #$00
  1039 					sta :STACKORIGIN-1+STACKWIDTH,x
  1040
  1041 					lda #$00
  1042 					sbc #$00
  1043 					sta :STACKORIGIN-1+STACKWIDTH*2,x
  1044
  1045 					lda #$00
  1046 					sbc #$00
  1047 					sta :STACKORIGIN-1+STACKWIDTH*3,x
  1048
  1049 					rts
  1050 				.endp
  1051
  1052 2442			.proc	negWORD1
  1053 					lda #$00
  1054 					sub :STACKORIGIN-1,x
  1055 					sta :STACKORIGIN-1,x
  1056
  1057 					lda #$00
  1058 					sbc :STACKORIGIN-1+STACKWIDTH,x
  1059 					sta :STACKORIGIN-1+STACKWIDTH,x
  1060
  1061 					lda #$00
  1062 					sbc #$00
  1063 					sta :STACKORIGIN-1+STACKWIDTH*2,x
  1064
  1065 					lda #$00
  1066 					sbc #$00
  1067 					sta :STACKORIGIN-1+STACKWIDTH*3,x
  1068
  1069 					rts
  1070 				.endp
  1071
  1072 2442			.proc	negCARD1
  1073 					lda #$00
  1074 					sub :STACKORIGIN-1,x
  1075 					sta :STACKORIGIN-1,x
  1076
  1077 					lda #$00
  1078 					sbc :STACKORIGIN-1+STACKWIDTH,x
  1079 					sta :STACKORIGIN-1+STACKWIDTH,x
  1080
  1081 					lda #$00
  1082 					sbc :STACKORIGIN-1+STACKWIDTH*2,x
  1083 					sta :STACKORIGIN-1+STACKWIDTH*2,x
  1084
  1085 					lda #$00
  1086 					sbc :STACKORIGIN-1+STACKWIDTH*3,x
  1087 					sta :STACKORIGIN-1+STACKWIDTH*3,x
  1088
  1089 					rts
  1090 				.endp
  1091
  1092
  1093 2442			.proc	andAL_CL
  1094
  1095 					lda :STACKORIGIN-1,x
  1096 					and :STACKORIGIN,x
  1097 					sta :STACKORIGIN-1,x
  1098
  1099 					rts
  1100 				.endp
  1101
  1102 2442			.proc	andAX_CX
  1103
  1104 					.rept 2
  1105 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1106 					AND :STACKORIGIN+#*STACKWIDTH,X
  1107 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1108 					.ENDR
  1108 					.endr
Source: REPT
  1105 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1105 					AND :STACKORIGIN+#*STACKWIDTH,X
  1105 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1105 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1105 					AND :STACKORIGIN+#*STACKWIDTH,X
  1105 					STA :STACKORIGIN-1+#*STACKWIDTH,X
Source: cpu6502.asm
  1109
  1110 					rts
  1111 				.endp
  1112
  1113 2442			.proc	andEAX_ECX
  1114
  1115 					.rept MAXSIZE
  1116 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1117 					AND :STACKORIGIN+#*STACKWIDTH,X
  1118 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1119 					.ENDR
  1119 					.endr
Source: REPT
  1116 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1116 					AND :STACKORIGIN+#*STACKWIDTH,X
  1116 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1116 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1116 					AND :STACKORIGIN+#*STACKWIDTH,X
  1116 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1116 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1116 					AND :STACKORIGIN+#*STACKWIDTH,X
  1116 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1116 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1116 					AND :STACKORIGIN+#*STACKWIDTH,X
  1116 					STA :STACKORIGIN-1+#*STACKWIDTH,X
Source: cpu6502.asm
  1120
  1121 					rts
  1122 				.endp
  1123
  1124
  1125 2442			.proc	orAL_CL
  1126
  1127 					lda :STACKORIGIN-1,x
  1128 					ora :STACKORIGIN,x
  1129 					sta :STACKORIGIN-1,x
  1130
  1131 					rts
  1132 				.endp
  1133
  1134 2442			.proc	orAX_CX
  1135
  1136 					.rept 2
  1137 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1138 					ORA :STACKORIGIN+#*STACKWIDTH,X
  1139 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1140 					.ENDR
  1140 					.endr
Source: REPT
  1137 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1137 					ORA :STACKORIGIN+#*STACKWIDTH,X
  1137 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1137 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1137 					ORA :STACKORIGIN+#*STACKWIDTH,X
  1137 					STA :STACKORIGIN-1+#*STACKWIDTH,X
Source: cpu6502.asm
  1141
  1142 					rts
  1143 				.endp
  1144
  1145 2442			.proc	orEAX_ECX
  1146
  1147 					.rept MAXSIZE
  1148 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1149 					ORA :STACKORIGIN+#*STACKWIDTH,X
  1150 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1151 					.ENDR
  1151 					.endr
Source: REPT
  1148 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1148 					ORA :STACKORIGIN+#*STACKWIDTH,X
  1148 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1148 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1148 					ORA :STACKORIGIN+#*STACKWIDTH,X
  1148 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1148 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1148 					ORA :STACKORIGIN+#*STACKWIDTH,X
  1148 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1148 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1148 					ORA :STACKORIGIN+#*STACKWIDTH,X
  1148 					STA :STACKORIGIN-1+#*STACKWIDTH,X
Source: cpu6502.asm
  1152
  1153 					rts
  1154 				.endp
  1155
  1156
  1157 2442			.proc	xorAL_CL
  1158
  1159 					lda :STACKORIGIN-1,x
  1160 					eor :STACKORIGIN,x
  1161 					sta :STACKORIGIN-1,x
  1162
  1163 					rts
  1164 				.endp
  1165
  1166 2442			.proc	xorAX_CX
  1167
  1168 					.rept 2
  1169 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1170 					EOR :STACKORIGIN+#*STACKWIDTH,X
  1171 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1172 					.ENDR
  1172 					.endr
Source: REPT
  1169 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1169 					EOR :STACKORIGIN+#*STACKWIDTH,X
  1169 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1169 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1169 					EOR :STACKORIGIN+#*STACKWIDTH,X
  1169 					STA :STACKORIGIN-1+#*STACKWIDTH,X
Source: cpu6502.asm
  1173
  1174 					rts
  1175 				.endp
  1176
  1177 2442			.proc	xorEAX_ECX
  1178
  1179 					.rept MAXSIZE
  1180 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1181 					EOR :STACKORIGIN+#*STACKWIDTH,X
  1182 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1183 					.ENDR
  1183 					.endr
Source: REPT
  1180 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1180 					EOR :STACKORIGIN+#*STACKWIDTH,X
  1180 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1180 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1180 					EOR :STACKORIGIN+#*STACKWIDTH,X
  1180 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1180 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1180 					EOR :STACKORIGIN+#*STACKWIDTH,X
  1180 					STA :STACKORIGIN-1+#*STACKWIDTH,X
  1180 					LDA :STACKORIGIN-1+#*STACKWIDTH,X
  1180 					EOR :STACKORIGIN+#*STACKWIDTH,X
  1180 					STA :STACKORIGIN-1+#*STACKWIDTH,X
Source: cpu6502.asm
  1184
  1185 					rts
  1186 				.endp
  1187
  1188
  1189 				/*
  1190 				.proc	iniEAX_ECX_BYTE
  1191
  1192 					mva :STACKORIGIN,x ecx
  1193 					mva :STACKORIGIN-1,x eax
  1194
  1195 					rts
  1196 				.endp
  1197 				*/
  1197
  1198
  1199
  1200 2442			.proc	iniEAX_ECX_WORD
  1201
  1202 					mva :STACKORIGIN,x ecx
  1203 					mva :STACKORIGIN+STACKWIDTH,x ecx+1
  1204
  1205 					mva :STACKORIGIN-1,x eax
  1206 					mva :STACKORIGIN-1+STACKWIDTH,x eax+1
  1207
  1208 					mva #$00 ecx+2
  1209 					sta ecx+3
  1210
  1211 					sta eax+2
  1212 					sta eax+3
  1213
  1214 					rts
  1215 				.endp
  1216
  1217
  1218 2442			.proc	iniEAX_ECX_CARD
  1219 					mva :STACKORIGIN,x ecx
  1220 					mva :STACKORIGIN+STACKWIDTH,x ecx+1
  1221 					mva :STACKORIGIN+STACKWIDTH*2,x ecx+2
  1222 					mva :STACKORIGIN+STACKWIDTH*3,x ecx+3
  1223
  1224 					mva :STACKORIGIN-1,x eax
  1225 					mva :STACKORIGIN-1+STACKWIDTH,x eax+1
  1226 					mva :STACKORIGIN-1+STACKWIDTH*2,x eax+2
  1227 					mva :STACKORIGIN-1+STACKWIDTH*3,x eax+3
  1228
  1229 					rts
  1230 				.endp
  1231
  1232 2442			.proc	movZTMP_aBX
  1233 					mva ZTMP8 :STACKORIGIN-1,x
  1234 					mva ZTMP9 :STACKORIGIN-1+STACKWIDTH,x
  1235 					mva ZTMP10 :STACKORIGIN-1+STACKWIDTH*2,x
  1236 					mva ZTMP11 :STACKORIGIN-1+STACKWIDTH*3,x
  1237
  1238 					rts
  1239 				.endp
  1240
  1241
  1242 2442				icl '6502\cpu6502_sio.asm'
Source: cpu6502_sio.asm
     1
     2 2442			.proc	@sio
     3
     4 					stx dbufa		;< adres bufora
     5 					sty dbufa+1		;> adres bufora
     6 					sta dcmnd		; 'R' read sector / 'P' write sector
     7
     8 					ldy dunit
     9 					lda lsector-1,y
    10 					sta dsctln		; < dlugosc sektora
    11 				;	sta dbyt		;< dlugosc bufora
    12
    13 					lda hsector-1,y
    14 					sta dsctln+1		; > dlugosc sektora 
    15 				;	sta dbyt+1		;> dlugosc bufora
    16
    17 					lda #$c0		; $40 read / $80 write
    18 					sta dstats
    19
    20 					lda #0
    21 					sta casflg		; = 00 to indicate that it isn't a cassette operation
    22
    23 					jmp jdskint
    24
    25 				// A = [1..8]
    26 2442			devnrm	tax
    27
    28 					CLC			; clear carry for add
    29 					ADC #$FF-8		; make m = $FF
    30 					ADC #8-1+1		; carry set if in range n to m
    31 					bcs ok
    32
    33 					ldy #-123		; kod bledu "DEVICE OR FILE NOT OPEN"
    34 					rts
    35 					
    36 2442			ok	txa
    37 					sta dunit		; nr stacji
    38 					ora #$30
    39 					sta ddevic		; nr stacji + $30
    40
    41 					lda #7
    42 					sta dtimlo		; timeout
    43
    44 					ldy #0
    45 					rts
    46
    47 2442			devsec	tya			; zapisz rozmiar sektora
    48 					ldy dunit
    49 					sta hsector-1,y
    50 					txa
    51 					sta lsector-1,y
    52 					rts
    53
    54 2442			lsector	:8 dta l(256)
    55 2442			hsector	:8 dta h(256)
    56
    57 				.endp
  1243 2442				icl '6502\cpu6502_cio.asm'
Source: cpu6502_cio.asm
     1
     2 				/*
     3 					Reset(f, record)
     4 					Rewrite(f, record)
     5
     6 					C = 1	SEC	IOCHECK TRUE
     7 					C = 0	CLC	IOCHECK FALSE
     8 				*/
     8
     9
    10 2442			.proc	@openfile (.word ya .byte x) .reg
    11
    12 					sta bp2
    13 					sty bp2+1
    14
    15 					stx code
    16
    17 					lda #0
    18 					rol @
    19 					sta iocheck
    20
    21 					ldy #s@file.status
    22 					lda (bp2),y
    23 					and #e@file.eof^$ff
    24 					sta (bp2),y
    25
    26 					ldy #s@file.pfname
    27 					lda (bp2),y
    28 					add #1
    29 					sta lfname
    30 					iny
    31 					lda (bp2),y
    32 					adc #0
    33 					sta hfname
    34
    35 					jsr lookup
    36 					bmi error
    37
    38 					ldy #s@file.chanel
    39 					txa
    40 					sta (bp2),y		;CHANNEL
    41
    42 				; -----------------------------------------
    43
    44 					lda #$03		;komenda: OPEN
    45 					sta iccmd,x
    46 					lda #$00		;adres nazwy pliku
    47 2442			lfname	equ *-1
    48 					sta icbufa,x
    49 					lda #$00
    50 2442			hfname	equ *-1
    51 					sta icbufa+1,x
    52 					lda #$00		;kod dostepu: $04 odczyt, $08 zapis, $09 dopisywanie, $0c odczyt/zapis, $0d odczyt/dopisywanie
    53 2442			code	equ *-1
    54 					sta icax1,x
    55 					lda #$00		;dodatkowy parametr, $00 jest zawsze dobre
    56 					sta icax2,x
    57 					jsr ciov
    58
    59 2442			error	sty MAIN.SYSTEM.IOResult
    60
    61 					bpl ok
    62
    63 2442			msg	lda #true
    64 2442			iocheck	equ *-1
    65 					beq skp
    66
    67 					sty dx
    68 				;	sty FX_CORE_RESET
    69
    70 					@clrscr
    71
    72 					lda <_error
    73 					ldy >_error
    74 					jsr @printSTRING
    75
    76 					lda #$00
    77 					sta dx+1
    78 					sta dx+2
    79 					sta dx+3
    80
    81 					jsr @printVALUE
    82
    83 					jmp MAIN.@halt
    84
    85 2442			skp	ldy #s@file.status
    86 					lda (bp2),y
    87 					ora #e@file.eof
    88 					sta (bp2),y
    89
    90 					ldy #s@file.record
    91 					lda #$00
    92 					sta (bp2),y
    93 					iny
    94 					sta (bp2),y
    95
    96 					rts
    97
    98 2442			ok	ldy #s@file.status
    99 					lda (bp2),y
   100 					ora #e@file.open
   101 					sta (bp2),y
   102
   103 					rts
   104
   105 2442			_error	dta 6,c'ERROR '
   106
   107 				; -----------------------------------------
   108
   109 2442			lookup	ldx #$00
   110 					ldy #$01
   111 2442			loop	lda icchid,x
   112 					cmp #$ff
   113 					beq found
   114 					txa
   115 					clc
   116 					adc #$10
   117 					tax
   118 					bpl loop
   119 					ldy #-95       		; kod bledu "TOO MANY CHANNELS OPEN"
   120 2442			found	rts
   121 				.endp
   122
   123
   124 				/*
   125 					Close(f)
   126
   127 					C = 1	SEC	IOCHECK TRUE
   128 					C = 0	CLC	IOCHECK FALSE
   129 				*/
   129
   130
   131 2442			.proc	@closefile (.word ya) .reg
   132 					sta	bp2
   133 					sty	bp2+1
   134
   135 					ldy	#s@file.status
   136
   137 					lda	#0
   138 					rol	@
   139 					sta	@openfile.iocheck
   140 				;	beq	ok_open
   141
   142 					lda	(bp2),y
   143 					and 	#e@file.open
   144 					bne	ok_open
   145
   146 					ldy	#-123		; kod bledu "DEVICE OR FILE NOT OPEN"
   147 					jmp	@openfile.error
   148
   149 2442			ok_open	lda	(bp2),y
   150 					ora	#e@file.eof
   151 					sta	(bp2),y
   152
   153 					ldy	#s@file.chanel
   154 					lda	(bp2),y
   155 					tax
   156
   157 					lda	#$0c		;komenda: CLOSE
   158 					sta	iccmd,x
   159 					jsr	ciov
   160
   161 				;	lda	#0		; iocheck off
   162 				;	sta	@openfile.iocheck
   163
   164 					jmp	@openfile.error
   165
   166 				.endp
   167
   168
   169 				/*
   170 					BlockRead(f, buf, num_records, numread)
   171 					BlockWrite(f, buf, num_records, numwrite)
   172
   173 					C = 1	SEC	IOCHECK TRUE
   174 					C = 0	CLC	IOCHECK FALSE
   175 				*/
   175
   176
   177 2442			.proc	@readfile (.word ya .byte x) .reg
   178
   179 					sta	bp2
   180 					sty	bp2+1
   181
   182 					stx	code
   183
   184 					lda	#$00
   185 					sta	eax+2
   186 					sta	eax+3
   187 					sta	ecx+2
   188 					sta	ecx+3
   189
   190 					sta	MAIN.SYSTEM.IOResult
   191
   192 					rol	@
   193 					sta	@openfile.iocheck
   194
   195 					ldy	#s@file.status
   196 					lda	(bp2),y
   197 					and	#e@file.open
   198 					bne	ok_open
   199
   200 					ldy	#-123			; kod bledu "DEVICE OR FILE NOT OPEN"
   201 					jmp	@openfile.error
   202
   203 2442			ok_open	ldy	#s@file.record
   204 					mwa	(bp2),y	ecx
   205
   206 					ldy	#s@file.nrecord
   207 					mwa	(bp2),y	eax
   208
   209 				;	lda	#0
   210 					jsr	imulCX			; record * nrecord = file length to load
   211
   212 					cpw	eax #0
   213 					beq	nothing
   214
   215 					ldy	#s@file.chanel
   216 					lda	(bp2),y
   217 					tax
   218
   219 					mwa	eax	icbufl,x
   220
   221 					ldy	#s@file.buffer
   222 					mwa	(bp2),y	icbufa,x
   223
   224 					lda	#$00
   225 2442			code	equ *-1
   226 					and	#$7f
   227 					sta	iccmd,x
   228
   229 					jsr	ciov
   230
   231 					sty	MAIN.SYSTEM.IOResult
   232
   233 					bpl ok
   234
   235 					cpy #136
   236 					beq done
   237
   238 					jsr eof
   239
   240 					lda #$00
   241 					sta eax
   242 					sta eax+1
   243
   244 					jmp	@openfile.msg
   245
   246 2442			done	jsr eof
   247
   248 2442			ok	mwa icbufl,x	eax
   249 					ldy #s@file.record
   250 					mwa (bp2),y	ecx
   251
   252 					lda #$00
   253 					jsr idivAX_CX.main
   254
   255 2442			nothing	lda code
   256 					bpl quit			; blockread(f, buf, len)   short version
   257
   258 					ldy #s@file.numread
   259 					mwa (bp2),y ztmp
   260
   261 					ldy #0
   262 					mwa eax (ztmp),y		; length of loaded data / record = number of records
   263
   264 2442			quit	rts
   265
   266 2442			eof	ldy #s@file.status
   267 					lda (bp2),y
   268 					ora #e@file.eof
   269 					sta (bp2),y
   270
   271 					rts
   272 				.endp
   273
   274
   275 2442			.proc	@ReadDirFileName (.word ya) .reg
   276
   277 					ldx #5
   278 					clc		; iocheck off
   279 					jsr @readfile	; (ya, x)
   280
   281 					ldy eax
   282
   283 					lda MAIN.SYSTEM.IOResult
   284 					smi
   285 					lda #0		; ok
   286
   287 					rts
   288 				.endp
   289
   290
   291 2442			.proc	@DirFileName
   292
   293 					lda #0
   294 					sta attr
   295
   296 					cpy #$12
   297 					bne stop
   298
   299 					lda @buf
   300 					cmp #'*'
   301 					bne skp
   302
   303 					lda #MAIN.SYSUTILS.faReadOnly
   304 					sta attr
   305
   306 2442			skp	ldy #1
   307 					ldx #2
   308 					lda #10
   309 					jsr cpName
   310
   311 					ldx #10
   312 					lda @buf,x
   313 					pha
   314 					bpl files
   315
   316 					lda attr
   317 					ora #MAIN.SYSUTILS.faDirectory
   318 					sta attr
   319
   320 					jmp skp2
   321
   322 2442			files	lda attr
   323 					ora #MAIN.SYSUTILS.faArchive
   324 					sta attr
   325
   326 2442			skp2	pla
   327 					beq stp2
   328
   329 					lda #'.'
   330 					sta (bp2),y
   331 					iny
   332
   333 					lda #13
   334 					jsr cpName
   335 2442			stp2
   336 					dey
   337 					tya
   338 2442			stop	ldy #0
   339 					sta (bp2),y
   340
   341 					ldx #0
   342 2442			attr	equ *-1
   343 					rts
   344
   345 2442			cpName	sta ln
   346 2442			cp	lda @buf,x
   347 					cmp #' '
   348 					beq stp
   349 					sta (bp2),y
   350 					iny
   351 					inx
   352 					cpx #0
   353 2442			ln	equ *-1
   354 					bne cp
   355 2442			stp	rts
   356 				.endp
   357
  1244
  1245 2442				icl '6502\cpu6502_shortint.asm'		; mul / div -> SHORTINT
Source: cpu6502_shortint.asm
     1
     2 				/*
     3 					mulSHORTINT
     4 					divmulSHORTINT
     5 				*/
     5
     6
     7
     8 2442			.proc	mulSHORTINT
     9
    10 					jsr imulBYTE
    11
    12 					lda :STACKORIGIN-1,x
    13 					bpl @+
    14 						sec
    15 						lda eax+1
    16 						sbc :STACKORIGIN,x
    17 						sta eax+1
    18 2442			@
    19 					lda :STACKORIGIN,x
    20 					bpl @+
    21 						sec
    22 						lda eax+1
    23 						sbc :STACKORIGIN-1,x
    24 						sta eax+1
    25 2442			@
    26 					jmp movaBX_EAX
    27 				.endp
    28
    29
    30 2442			.proc	divmulSHORTINT
    31
    32 2442			MOD	mva #{jsr} _mod
    33
    34 					lda :STACKORIGIN,x		; divisor sign
    35 					spl
    36 					jsr negBYTE
    37
    38 2442			DIV	ldy <idivBYTE
    39 					lda >idivBYTE
    40
    41 2442			skp	sty addr
    42 					sta addr+1
    43
    44 					ldy #0
    45
    46 					lda :STACKORIGIN-1,x		; dividend sign
    47 					bpl @+
    48 					jsr negBYTE1
    49 					iny
    50
    51 2442			@	lda :STACKORIGIN,x		; divisor sign
    52 					bpl @+
    53 					jsr negBYTE
    54 					iny
    55
    56 2442			@	tya
    57 					and #1
    58 					pha
    59
    60 					jsr $ffff			; idiv ecx
    61 2442			addr	equ *-2
    62
    63 					jsr movaBX_EAX
    64
    65 2442			_mod	bit movZTMP_aBX			; mod
    66 					mva #{bit} _mod
    67
    68 					pla
    69 					seq
    70 					jmp negCARD1
    71
    72 					rts
    73 				.endp
  1246 2442				icl '6502\cpu6502_smallint.asm'		; mul / div -> SMALLINT
Source: cpu6502_smallint.asm
     1
     2 				/*
     3 					mulSMALLINT
     4 					divmulSMALLINT
     5 				*/
     5
     6
     7
     8 2442			.proc	mulSMALLINT
     9
    10 					jsr imulWORD
    11
    12 					lda :STACKORIGIN-1+STACKWIDTH,x	; t1
    13 					bpl @+
    14 						sec
    15 						lda eax+2
    16 						sbc :STACKORIGIN,x
    17 						sta eax+2
    18 						lda eax+3
    19 						sbc :STACKORIGIN+STACKWIDTH,x
    20 						sta eax+3
    21 2442			@
    22 					lda :STACKORIGIN+STACKWIDTH,x	; t2
    23 					bpl @+
    24 						sec
    25 						lda eax+2
    26 						sbc :STACKORIGIN-1,x
    27 						sta eax+2
    28 						lda eax+3
    29 						sbc :STACKORIGIN-1+STACKWIDTH,x
    30 						sta eax+3
    31 2442			@
    32 					jmp movaBX_EAX
    33 				.endp
    34
    35
    36 2442			.proc	divmulSMALLINT
    37
    38 2442			SHORTREAL
    39 					ldy <divSHORTREAL
    40 					lda >divSHORTREAL
    41 					bne skp
    42
    43 2442			MOD	mva #{jsr} _mod
    44
    45 					lda :STACKORIGIN+STACKWIDTH,x	; divisor sign
    46 					spl
    47 					jsr negWORD
    48
    49 2442			DIV	ldy <idivWORD
    50 					lda >idivWORD
    51
    52 2442			skp	sty addr
    53 					sta addr+1
    54
    55 					ldy #0
    56
    57 					lda :STACKORIGIN-1+STACKWIDTH,x	; dividend sign
    58 					bpl @+
    59 					jsr negWORD1
    60 					iny
    61 2442			@
    62 					lda :STACKORIGIN+STACKWIDTH,x	; divisor sign
    63 					bpl @+
    64 					jsr negWORD
    65 					iny
    66 2442			@
    67 					tya
    68 					and #1
    69 					pha
    70
    71 					jsr $ffff			; idiv cx
    72 2442			addr	equ *-2
    73
    74 					jsr movaBX_EAX
    75
    76 2442			_mod	bit movZTMP_aBX			; mod
    77 					mva #{bit} _mod
    78
    79 					pla
    80 					seq
    81 					jmp negCARD1
    82
    83 					rts
    84 				.endp
  1247 2442				icl '6502\cpu6502_integer.asm'		; mul / div -> INTEGER
Source: cpu6502_integer.asm
     1
     2 				/*
     3 					mulINTEGER
     4 					divmulINT
     5 				*/
     5
     6
     7 2442			.proc	mulINTEGER
     8
     9 					jsr imulCARD
    10
    11 					jmp movaBX_EAX
    12 				.endp
    13
    14
    15 2442			.proc	divmulINT
    16
    17 2442			REAL	ldy <divREAL
    18 					lda >divREAL
    19 					bne skp
    20
    21 2442			MOD	mva #{jsr} _mod
    22
    23 					lda :STACKORIGIN+STACKWIDTH*3,x		; divisor sign
    24 					spl
    25 					jsr negCARD
    26
    27 2442			DIV	ldy <idivCARD
    28 					lda >idivCARD
    29
    30 2442			skp	sty addr
    31 					sta addr+1
    32
    33 					ldy #0
    34
    35 					lda :STACKORIGIN-1+STACKWIDTH*3,x	; dividend sign
    36 					bpl @+
    37 					jsr negCARD1
    38 					iny
    39
    40 2442			@	lda :STACKORIGIN+STACKWIDTH*3,x		; divisor sign
    41 					bpl @+
    42 					jsr negCARD
    43 					iny
    44
    45 2442			@	tya
    46 					and #1
    47 					pha
    48
    49 					jsr $ffff				; idiv ecx
    50 2442			addr	equ *-2
    51 					jsr movaBX_EAX
    52
    53 2442			_mod	bit movZTMP_aBX				; mod
    54 					mva #{bit} _mod
    55
    56 					pla
    57 					seq
    58 					jmp negCARD1
    59
    60 					rts
    61 				.endp
  1248
  1249 2442				icl '6502\cpu6502_byte.asm'		; mul / div -> BYTE
Source: cpu6502_byte.asm
     1
     2 				/*
     3 					fmulu_8
     4 					imulCL
     5 					imulBYTE
     6 					idivBYTE
     7 					idiv_AL_CL
     8 				*/
     8
     9
    10 				; Description: Unsigned 8-bit multiplication with unsigned 16-bit result.
    11 				;
    12 				; Input: 8-bit unsigned value in T1
    13 				;	 8-bit unsigned value in T2
    14 				;	 Carry=0: Re-use T1 from previous multiplication (faster)
    15 				;	 Carry=1: Set T1 (slower)
    16 				;
    17 				; Output: 16-bit unsigned value in PRODUCT
    18 				;
    19 				; Clobbered: PRODUCT, X, A, C
    20 				;
    21 				; Allocation setup: T1,T2 and PRODUCT preferably on Zero-page.
    22 				;		    square1_lo, square1_hi, square2_lo, square2_hi must be
    23 				;		    page aligned. Each table are 512 bytes. Total 2kb.
    24 				;
    25 				; Table generation: I:0..511
    26 				;		    square1_lo = <((I*I)/4)
    27 				;		    square1_hi = >((I*I)/4)
    28 				;		    square2_lo = <(((I-255)*(I-255))/4)
    29 				;		    square2_hi = >(((I-255)*(I-255))/4)
    30 2442			.proc fmulu_8
    31
    32 = 0082			t1	= eax
    33 = 008A			t2	= ecx
    34
    35 = 0082			product	= eax
    36
    37 					txa:tay
    38 				;		bcc :+
    39 						    lda T1
    40 						    sta sm1+1
    41 						    sta sm3+1
    42 						    eor #$ff
    43 						    sta sm2+1
    44 						    sta sm4+1
    45
    46 						ldx T2
    47 						sec
    48 2442			sm1:		lda square1_lo,x
    49 2442			sm2:		sbc square2_lo,x
    50 						sta PRODUCT+0
    51 2442			sm3:		lda square1_hi,x
    52 2442			sm4:		sbc square2_hi,x
    53
    54 						sta PRODUCT+1
    55
    56 					tya:tax
    57 						rts
    58 				.endp
    59
    60
    61 				/*
    62
    63 				 8 bit multiply and divide routines.
    64 				 Three 8 bit locations
    65 				 ACC, AUX and EXT must be set up,
    66 				 preferably on zero page.
    67
    68 				 MULTIPLY ROUTINE
    69
    70 				 EAX*ECX -> EAX (low,hi) 16 bit result
    71
    72 				*/
    72
    73
    74 2442			.proc	imulCL
    75
    76 					lda #$00
    77
    78 					LDY #$09
    79 					CLC
    80 2442			LOOP	ROR @
    81 					ROR eax
    82 					BCC MUL2
    83 					CLC		;DEC AUX above to remove CLC
    84 					ADC ecx
    85 2442			MUL2	DEY
    86 					BNE LOOP
    87
    88 					STA eax+1
    89
    90 					RTS
    91 				.endp
    92
    93
    94 2442			.proc	imulBYTE
    95
    96 					mva :STACKORIGIN,x ecx
    97 					mva :STACKORIGIN-1,x eax
    98
    99 					lda #$00
   100
   101 					sta eax+2
   102 					sta eax+3
   103
   104 					.ifdef fmulinit
   105 					jmp fmulu_8
   106 					els
   107 					jmp imulCL
   108 					eif
   109
   110 				.endp
   111
   112
   113 				.define	jsr_imodBYTE jsr idivBYTE
   114
   115 2442			.proc	idivBYTE
   116
   117 					mva :STACKORIGIN,x ecx
   118 					mva :STACKORIGIN-1,x eax
   119
   120 					jmp idivAL_CL
   121 				.endp
   122
   123
   124 				; DIVIDE ROUTINE (8 BIT)
   125 				; AL/CL -> ACC, remainder in ZTMP
   126
   127 2442			.proc idivAL_CL
   128
   129 				;	mva :STACKORIGIN,x cl
   130 				;	mva :STACKORIGIN-1,x al
   131
   132 					lda #$00
   133
   134 					sta eax+1
   135 					sta eax+2
   136 					sta eax+3
   137
   138 					STA ztmp+1
   139 					STA ztmp+2
   140 					STA ztmp+3
   141
   142 					LDY #$08
   143 2442			LOOP	ASL AL
   144 					ROL @
   145 					CMP CL
   146 					BCC DIV2
   147 					SBC CL
   148 					INC AL
   149 2442			DIV2
   150 					DEY
   151 					BNE LOOP
   152
   153 					STA ZTMP
   154
   155 					rts
   156 				.endp
   157
  1250 2442				icl '6502\cpu6502_word.asm'		; mul / div -> WORD
Source: cpu6502_word.asm
     1
     2 				/*
     3 					fmulu_16
     4 					imulCX
     5 					imulWORD
     6 					idivWORD
     7 					idivAX_CX
     8 				*/
     8
     9
    10 				; Description: Unsigned 16-bit multiplication with unsigned 32-bit result.
    11 				;
    12 				; Input: 16-bit unsigned value in T1
    13 				;	 16-bit unsigned value in T2
    14 				;	 Carry=0: Re-use T1 from previous multiplication (faster)
    15 				;	 Carry=1: Set T1 (slower)
    16 				;
    17 				; Output: 32-bit unsigned value in PRODUCT
    18 				;
    19 				; Clobbered: PRODUCT, X, A, C
    20 				;
    21 				; Allocation setup: T1,T2 and PRODUCT preferably on Zero-page.
    22 				;		    square1_lo, square1_hi, square2_lo, square2_hi must be
    23 				;		    page aligned. Each table are 512 bytes. Total 2kb.
    24 				;
    25 				; Table generation: I:0..511
    26 				;		    square1_lo = <((I*I)/4)
    27 				;		    square1_hi = >((I*I)/4)
    28 				;		    square2_lo = <(((I-255)*(I-255))/4)
    29 				;		    square2_hi = >(((I-255)*(I-255))/4)
    30 				//.proc multiply_16bit_unsigned
    31 						; <T1 * <T2 = AAaa
    32 						; <T1 * >T2 = BBbb
    33 						; >T1 * <T2 = CCcc
    34 						; >T1 * >T2 = DDdd
    35 						;
    36 						;	AAaa
    37 						;     BBbb
    38 						;     CCcc
    39 						; + DDdd
    40 						; ----------
    41 						;   PRODUCT!
    42
    43 						; Setup T1 if changed
    44 2442			.proc	fmulu_16
    45
    46 = 0082			t1	= eax
    47 = 008A			t2	= ecx
    48
    49 = 0082			product	= eax
    50
    51 					txa:pha
    52 				;		bcc @+
    53 						    lda T1+0
    54 						    sta sm1a+1
    55 						    sta sm3a+1
    56 						    sta sm5a+1
    57 						    sta sm7a+1
    58 						    eor #$ff
    59 						    sta sm2a+1
    60 						    sta sm4a+1
    61 						    sta sm6a+1
    62 						    sta sm8a+1
    63 						    lda T1+1
    64 						    sta sm1b+1
    65 						    sta sm3b+1
    66 						    sta sm5b+1
    67 						    sta sm7b+1
    68 						    eor #$ff
    69 						    sta sm2b+1
    70 						    sta sm4b+1
    71 						    sta sm6b+1
    72 						    sta sm8b+1
    73 				;@
    74 						; Perform <T1 * <T2 = AAaa
    75 						ldx T2+0
    76 						sec
    77 2442			sm1a:		lda square1_lo,x
    78 2442			sm2a:		sbc square2_lo,x
    79 						sta PRODUCT+0
    80 2442			sm3a:		lda square1_hi,x
    81 2442			sm4a:		sbc square2_hi,x
    82 						;sta _AA+1
    83 						tay
    84
    85 						; Perform >T1_hi * <T2 = CCcc
    86 						sec
    87 2442			sm1b:		lda square1_lo,x
    88 2442			sm2b:		sbc square2_lo,x
    89 						sta _cc+1
    90 2442			sm3b:		lda square1_hi,x
    91 2442			sm4b:		sbc square2_hi,x
    92 						sta _CC_+1
    93
    94 						; Perform <T1 * >T2 = BBbb
    95 						ldx T2+1
    96 						sec
    97 2442			sm5a:		lda square1_lo,x
    98 2442			sm6a:		sbc square2_lo,x
    99 						sta _bb+1
   100 2442			sm7a:		lda square1_hi,x
   101 2442			sm8a:		sbc square2_hi,x
   102 						sta _BB_+1
   103
   104 						; Perform >T1 * >T2 = DDdd
   105 						sec
   106 2442			sm5b:		lda square1_lo,x
   107 2442			sm6b:		sbc square2_lo,x
   108 						sta _dd+1
   109 2442			sm7b:		lda square1_hi,x
   110 2442			sm8b:		sbc square2_hi,x
   111 				;		sta PRODUCT+3
   112 						tax
   113
   114 						; Add the separate multiplications together
   115 						clc
   116 				;_AA:		lda #0
   117 						tya
   118 2442			_bb:		adc #0
   119 				;		sta PRODUCT+1
   120 						tay
   121 2442			_BB_:		lda #0
   122 2442			_CC_:		adc #0
   123 						sta PRODUCT+2
   124 						bcc @+
   125 				;		    inc PRODUCT+3
   126 						inx
   127 						    clc
   128 2442			@
   129 						tya
   130 2442			_cc:		adc #0
   131 				;		adc PRODUCT+1
   132 						sta PRODUCT+1
   133 2442			_dd:		lda #0
   134 						adc PRODUCT+2
   135 						sta PRODUCT+2
   136 						scc
   137 				;		    inc PRODUCT+3
   138 						inx
   139
   140 					stx PRODUCT+3
   141
   142 					pla:tax
   143
   144 					rts
   145 				.endp
   146
   147
   148 				/*
   149
   150 				 16 bit multiply and divide routines.
   151 				 Three 16 bit (two-byte) locations
   152 				 ACC, AUX and EXT must be set up,
   153 				 preferably on zero page.
   154
   155 				 MULTIPLY ROUTINE
   156
   157 				 EAX*ECX -> EAX (low,hi) 32 bit result
   158
   159 				*/
   159
   160
   161 2442			.proc	imulCX
   162
   163 2442 A9 00			lda #$00
   164 2444 85 85			sta eax+3
   165
   166 2446 A0 11			LDY #$11			; A = 0 !
   167 2448 18				CLC
   168 2449 66 85		LOOP	ROR eax+3
   169 244B 6A				ROR @
   170 244C 66 83			ROR eax+1
   171 244E 66 82			ROR eax
   172 2450 90 0B			BCC MUL2
   173 2452 18				CLC
   174 2453 65 8A			ADC ecx
   175 2455 48				PHA
   176 2456 A5 8B			LDA ecx+1
   177 2458 65 85			ADC eax+3
   178 245A 85 85			STA eax+3
   179 245C 68				PLA
   180 245D 88			MUL2	DEY
   181 245E D0 E9			BNE LOOP
   182
   183 2460 85 84			STA eax+2
   184
   185 2462 60				rts
   186 				.endp
   187
   188
   189 2463			.proc	imulWORD
   190
   191 					mva :STACKORIGIN,x ecx
   192 					mva :STACKORIGIN+STACKWIDTH,x ecx+1
   193
   194 					mva :STACKORIGIN-1,x eax
   195 					mva :STACKORIGIN-1+STACKWIDTH,x eax+1
   196
   197 					.ifdef fmulinit
   198 					jmp fmulu_16
   199 					els
   200 					jmp imulCX
   201 					eif
   202 				.endp
   203
   204
   205 				.define	jsr_imodWORD jsr idivWORD
   206
   207 2463			.proc	idivWORD
   208
   209 					mva :STACKORIGIN,x ecx
   210 					mva :STACKORIGIN+STACKWIDTH,x ecx+1
   211
   212 					mva :STACKORIGIN-1,x eax
   213 					mva :STACKORIGIN-1+STACKWIDTH,x eax+1
   214
   215 					jmp idivAX_CX
   216 				.endp
   217
   218
   219 				; DIVIDE ROUTINE (16 BIT)
   220 				; AX/CX -> ACC, remainder in ZTMP
   221
   222 2463			.proc	idivAX_CX
   223
   224 				;	jsr iniEAX_ECX_WORD
   225 2463			main
   226 					LDA #0
   227 					STA ztmp+1
   228 					STA ztmp+2
   229 					STA ztmp+3
   230
   231 					sta eax+2
   232 					sta eax+3
   233
   234 					.ifdef fmulinit
   235 					.rept 16
   236 					ASL ax
   237 					ROL ax+1
   238 					ROL @
   239 					ROL ztmp+1
   240 					tay
   241 					CMP cx
   242 					LDA ztmp+1
   243 					SBC cx+1
   244 					BCC @+
   245 					STA ztmp+1
   246 					tya
   247 					SBC cx
   248 					tay
   249 					INC ax
   250 				@	tya
   251 					.endr
   252
   253 					els
   254 					LDY #$10
   255
   256 2463			LOOP	ASL ax
   257 					ROL ax+1
   258 					ROL @
   259 					ROL ztmp+1
   260 					sta edx
   261 					CMP cx
   262 					LDA ztmp+1
   263 					SBC cx+1
   264 					BCC DIV2
   265 					STA ztmp+1
   266 					lda edx
   267 					SBC cx
   268 					sta edx
   269 					INC ax
   270 2463			DIV2	lda edx
   271 					DEY
   272 					BNE LOOP
   273 					eif
   274
   275 					STA ztmp
   276
   277 					rts
   278 				.endp
   279
  1251 2463				icl '6502\cpu6502_cardinal.asm'		; mul / div -> CARDINAL
Source: cpu6502_cardinal.asm
     1
     2 				/*
     3 					imulECX
     4 					imulCARD
     5 					idivCARD
     6 					idivEAX_ECX
     7 				*/
     7
     8
     9 				; *** MUL32: 32-bit multiply
    10 				; EAX * ECX -> ZTMP8-ZTMP11
    11 2463			.proc	imulECX
    12
    13 					lda #0
    14 					sta ZTMP10
    15 					sta ZTMP9
    16 					sta ZTMP8
    17
    18 					ldy #32
    19 2463			MUL320	lsr ZTMP10
    20 					ror ZTMP9
    21 					ror ZTMP8
    22 					ror @
    23 					ror eax+3
    24 					ror eax+2
    25 					ror eax+1
    26 					ror eax
    27 					bcc MUL321
    28 					clc
    29 					adc ecx
    30 					pha
    31 					lda ecx+1
    32 					adc ZTMP8
    33 					sta ZTMP8
    34 					lda ecx+2
    35 					adc ZTMP9
    36 					sta ZTMP9
    37 					lda ecx+3
    38 					adc ZTMP10
    39 					sta ZTMP10
    40 					pla
    41 2463			MUL321	dey
    42 				       	bpl MUL320
    43
    44 					rts
    45 				.endp
    46
    47
    48 2463			.proc	imulCARD
    49
    50 					jsr iniEAX_ECX_CARD
    51
    52 					jmp imulECX
    53 				.endp
    54
    55
    56 				.define	jsr_imodCARD jsr idivCARD
    57
    58 2463			.proc	idivCARD
    59
    60 					jsr iniEAX_ECX_CARD
    61
    62 					jmp idivEAX_ECX.CARD
    63 				.endp
    64
    65
    66 				; *** UDIV32: 32-bit unsigned division
    67 				; input: dividend at ZTMP0-ZTMP3
    68 				;        divisor at ZTMP4-ZTMP7
    69 				; output: result at ZTMP0-ZTMP3
    70 				;         remainder at ZTMP8-ZTMP11
    71 				; X,Y preserved
    72
    73 2463			.proc	idivEAX_ECX
    74
    75 2463			REAL	mva :STACKORIGIN-1+STACKWIDTH*2,x :STACKORIGIN-1+STACKWIDTH*3,x
    76 					mva :STACKORIGIN-1+STACKWIDTH,x :STACKORIGIN-1+STACKWIDTH*2,x
    77 					mva :STACKORIGIN-1,x :STACKORIGIN-1+STACKWIDTH,x
    78 					mva #$00 :STACKORIGIN-1,x
    79
    80 2463			CARD	;jsr iniEAX_ECX_CARD
    81
    82 2463			MAIN	LDA #0
    83 					STA ZTMP8
    84 					STA ZTMP9
    85 					STA ZTMP10
    86 					STA ZTMP11
    87
    88 					LDY #32
    89 2463			UDIV320	ASL eax
    90 					ROL eax+1
    91 					ROL eax+2
    92 					ROL eax+3
    93 					ROL ZTMP8
    94 					ROL ZTMP9
    95 					ROL ZTMP10
    96 					ROL ZTMP11
    97 							;do a subtraction
    98 					LDA ZTMP8
    99 					CMP ecx
   100 					LDA ZTMP9
   101 					SBC ecx+1
   102 					LDA ZTMP10
   103 					SBC ecx+2
   104 					LDA ZTMP11
   105 					SBC ecx+3
   106 					BCC UDIV321
   107 				 			;overflow, do the subtraction again, this time store the result
   108 					STA ecx+3	;we have the high byte already
   109 					LDA ZTMP8
   110 					SBC ecx		;byte 0
   111 					STA ZTMP8
   112 					LDA ZTMP9
   113 					SBC ecx+1
   114 					STA ZTMP9	;byte 1
   115 					LDA ZTMP10
   116 					SBC ecx+2
   117 					STA ZTMP10	;byte 2
   118 					INC eax		;set result bit
   119
   120 2463			UDIV321	DEY
   121 					BNE UDIV320
   122
   123 					rts
   124 				.endp
   125
  1252
  1253 2463				icl '6502\cpu6502_shortreal.asm'	; mul / div -> SHORTREAL	Q8.8
Source: cpu6502_shortreal.asm
     1 				; SHORTREAL	fixed-point Q8.8, 16bit
     2 				; https://en.wikipedia.org/wiki/Q_(number_format)
     3
     4 				/*
     5 					mulSHORTREAL
     6 					divSHORTREAL
     7 				*/
     7
     8
     9
    10 2463			.proc	mulSHORTREAL
    11
    12 					jsr imulWORD
    13
    14 					mva #0 eax+3
    15 					mva eax+1 eax
    16 					mva eax+2 eax+1
    17
    18 					ldy eax+3
    19
    20 					lda :STACKORIGIN-1+STACKWIDTH,x	; t1
    21 					bpl @+
    22 					sec
    23 					lda eax+1
    24 					sbc :STACKORIGIN,x
    25 					sta eax+1
    26 					tya
    27 					sbc :STACKORIGIN+STACKWIDTH,x
    28 					tay
    29 2463			@
    30 					lda :STACKORIGIN+STACKWIDTH,x	; t2
    31 					bpl @+
    32 					sec
    33 					lda eax+1
    34 					sbc :STACKORIGIN-1,x
    35 					sta eax+1
    36 					tya
    37 					sbc :STACKORIGIN-1+STACKWIDTH,x
    38 					tay
    39 2463			@
    40 					sty eax+2
    41
    42 					jmp movaBX_EAX
    43 				.endp
    44
    45
    46
    47 2463			.proc	divSHORTREAL
    48 					jsr iniEAX_ECX_WORD
    49
    50 					mva eax+1 eax+2
    51 					mva eax eax+1
    52 					lda #0
    53 					sta eax
    54 					sta eax+3
    55 					sta ecx+3
    56
    57 					jmp idivEAX_ECX.main
    58 				.endp
  1254 2463				icl '6502\cpu6502_real.asm'		; mul / div -> REAL		Q24.8
Source: cpu6502_real.asm
     1 				; REAL	fixed-point Q24.8, 32bit
     2 				; https://en.wikipedia.org/wiki/Q_(number_format)
     3
     4 				/*
     5 					mulREAL
     6 					divREAL
     7 				*/
     7
     8
     9
    10 2463			.proc	mulREAl
    11
    12 				;	jsr iniEAX_ECX_CARD
    13
    14 					mva :STACKORIGIN,x ecx0
    15 					mva :STACKORIGIN+STACKWIDTH,x ecx1
    16 					mva :STACKORIGIN+STACKWIDTH*2,x ecx2
    17 					mva :STACKORIGIN+STACKWIDTH*3,x ecx3
    18
    19 					mva :STACKORIGIN-1,x eax
    20 					mva :STACKORIGIN-1+STACKWIDTH,x eax+1
    21 					mva :STACKORIGIN-1+STACKWIDTH*2,x eax+2
    22 					mva :STACKORIGIN-1+STACKWIDTH*3,x eax+3
    23
    24 				;	jsr imul64				; imul ecx 64 bit
    25
    26 					lda #$00
    27 					sta edx		;Clear upper half of
    28 					sta edx+1	;product
    29 					sta edx+2
    30 					sta edx+3
    31
    32 					sta ztmp8
    33 					sta ztmp9
    34 					sta ztmp10
    35 					sta ztmp11
    36
    37 					ldy #$20	;Set binary count to 32
    38 2463			SHIFT_R	lsr eax+3	;Shift multiplyer right
    39 					ror eax+2
    40 					ror eax+1
    41 					ror eax
    42 					bcc ROTATE_R	;Go rotate right if c = 0
    43 					lda edx		;Get upper half of product
    44 					clc		;and add multiplicand to
    45 					adc #0		;it
    46 2463			ecx0	equ *-1
    47 					sta edx
    48 					lda edx+1
    49 					adc #0
    50 2463			ecx1	equ *-1
    51 					sta edx+1
    52 					lda edx+2
    53 					adc #0
    54 2463			ecx2	equ *-1
    55 					sta edx+2
    56 					lda edx+3
    57 					adc #0
    58 2463			ecx3	equ *-1
    59 2463			ROTATE_R  ror @		;Rotate partial product
    60 				        sta edx+3	;right
    61 				        ror edx+2
    62 				        ror edx+1
    63 				        ror edx
    64 				        ror ztmp11
    65 				        ror ztmp10
    66 				        ror ztmp9
    67 				        ror ztmp8
    68 				        dey		;Decrement bit count and
    69 				        bne SHIFT_R	;loop until 32 bits are
    70
    71 				;	mva ztmp8 eax
    72 					mva ztmp9 eax
    73 					mva ztmp10 eax+1
    74 					mva ztmp11 eax+2
    75
    76
    77 				;	mva eax+1 eax
    78 				;	mva eax+2 eax+1
    79 				;	mva eax+3 eax+2
    80
    81 					ldy edx
    82
    83 					lda :STACKORIGIN-1+STACKWIDTH*3,x	; t1
    84 					bpl @+
    85 					sec
    86 					tya
    87 					sbc :STACKORIGIN,x
    88 					tay
    89 2463			@
    90 					lda :STACKORIGIN+STACKWIDTH*3,x		; t2
    91 					bpl @+
    92 					sec
    93 					tya
    94 					sbc :STACKORIGIN-1,x
    95 					tay
    96 2463			@
    97 					sty eax+3
    98
    99 					jmp movaBX_EAX
   100 				.endp
   101
   102
   103 				/*
   104 				;32 bit multiply with 64 bit product
   105
   106 				.proc	imul64
   107
   108 					lda #$00
   109 					sta edx		;Clear upper half of
   110 					sta edx+1	;product
   111 					sta edx+2
   112 					sta edx+3
   113
   114 					sta ztmp8
   115 					sta ztmp9
   116 					sta ztmp10
   117 					sta ztmp11
   118
   119 					ldy #$20	;Set binary count to 32
   120 				SHIFT_R	lsr eax+3	;Shift multiplyer right
   121 					ror eax+2
   122 					ror eax+1
   123 					ror eax
   124 					bcc ROTATE_R	;Go rotate right if c = 0
   125 					lda edx		;Get upper half of product
   126 					clc		;and add multiplicand to
   127 					adc ecx		;it
   128 					sta edx
   129 					lda edx+1
   130 					adc ecx+1
   131 					sta edx+1
   132 					lda edx+2
   133 					adc ecx+2
   134 					sta edx+2
   135 					lda edx+3
   136 					adc ecx+3
   137 				ROTATE_R  ror @		;Rotate partial product
   138 				        sta edx+3	;right
   139 				        ror edx+2
   140 				        ror edx+1
   141 				        ror edx
   142 				        ror ztmp11
   143 				        ror ztmp10
   144 				        ror ztmp9
   145 				        ror ztmp8
   146 				        dey		;Decrement bit count and
   147 				        bne SHIFT_R	;loop until 32 bits are
   148
   149 					mva ztmp8 eax
   150 					mva ztmp9 eax+1
   151 					mva ztmp10 eax+2
   152 					mva ztmp11 eax+3
   153
   154 					rts
   155 				.endp
   156 				*/
   156
   157
   158 				; 64bit / 32bit = 32bit
   159 				; eax = eax + edx
   160
   161 2463			.proc	divREAL
   162
   163 					mva :STACKORIGIN,x ecx0
   164 					sta ecx0_
   165 					mva :STACKORIGIN+STACKWIDTH,x ecx1
   166 					sta ecx1_
   167 					mva :STACKORIGIN+STACKWIDTH*2,x ecx2
   168 					sta ecx2_
   169 					mva :STACKORIGIN+STACKWIDTH*3,x ecx3
   170
   171 					mva :STACKORIGIN-1+STACKWIDTH*3,x eax+4
   172 					mva :STACKORIGIN-1+STACKWIDTH*2,x eax+3
   173 					mva :STACKORIGIN-1+STACKWIDTH,x eax+2
   174 					mva :STACKORIGIN-1,x eax+1
   175
   176 					lda #$00
   177 					sta eax
   178 					sta eax+5
   179 					sta eax+6
   180 					sta eax+7
   181
   182 					STA ZTMP8
   183 					STA ZTMP9
   184 					STA ZTMP10
   185 					STA ZTMP11
   186
   187 					LDY #64
   188 2463			UDIV320	ASL eax
   189 					ROL eax+1
   190 					ROL eax+2
   191 					ROL eax+3
   192 					ROL eax+4
   193 					ROL eax+5
   194 					ROL eax+6
   195 					ROL eax+7
   196
   197 					ROL ZTMP8
   198 					ROL ZTMP9
   199 					ROL ZTMP10
   200 					ROL ZTMP11
   201 							;do a subtraction
   202 					LDA ZTMP8
   203 					CMP #0
   204 2463			ecx0	equ *-1
   205 					LDA ZTMP9
   206 					SBC #0
   207 2463			ecx1	equ *-1
   208 					LDA ZTMP10
   209 					SBC #0
   210 2463			ecx2	equ *-1
   211 					LDA ZTMP11
   212 					SBC #0
   213 2463			ecx3	equ *-1
   214 					BCC UDIV321
   215 				 			;overflow, do the subtraction again, this time store the result
   216 					STA ecx3	;we have the high byte already
   217 					LDA ZTMP8
   218 					SBC #0		;byte 0
   219 2463			ecx0_	equ *-1
   220 					STA ZTMP8
   221 					LDA ZTMP9
   222 					SBC #0
   223 2463			ecx1_	equ *-1
   224 					STA ZTMP9	;byte 1
   225 					LDA ZTMP10
   226 					SBC #0
   227 2463			ecx2_	equ *-1
   228 					STA ZTMP10	;byte 2
   229
   230 					INC eax		;set result bit
   231
   232 2463			UDIV321	DEY
   233 					BNE UDIV320
   234
   235 					rts
   236 				.endp
   237
   238
   239 				/*
   240 				.proc	divREAL
   241
   242 					jsr iniEAX_ECX_CARD
   243
   244 					mva eax+3 eax+4
   245 					mva eax+2 eax+3
   246 					mva eax+1 eax+2
   247 					mva eax eax+1
   248
   249 					lda #$00
   250 					sta eax
   251 					sta eax+5
   252 					sta eax+6
   253 					sta eax+7
   254
   255 					STA ZTMP8
   256 					STA ZTMP9
   257 					STA ZTMP10
   258 					STA ZTMP11
   259
   260 					LDY #64
   261 				UDIV320	ASL eax
   262 					ROL eax+1
   263 					ROL eax+2
   264 					ROL eax+3
   265 					ROL eax+4
   266 					ROL eax+5
   267 					ROL eax+6
   268 					ROL eax+7
   269
   270 					ROL ZTMP8
   271 					ROL ZTMP9
   272 					ROL ZTMP10
   273 					ROL ZTMP11
   274 							;do a subtraction
   275 					LDA ZTMP8
   276 					CMP ecx
   277 					LDA ZTMP9
   278 					SBC ecx+1
   279 					LDA ZTMP10
   280 					SBC ecx+2
   281 					LDA ZTMP11
   282 					SBC ecx+3
   283 					BCC UDIV321
   284 				 			;overflow, do the subtraction again, this time store the result
   285 					STA ecx+3	;we have the high byte already
   286 					LDA ZTMP8
   287 					SBC ecx		;byte 0
   288 					STA ZTMP8
   289 					LDA ZTMP9
   290 					SBC ecx+1
   291 					STA ZTMP9	;byte 1
   292 					LDA ZTMP10
   293 					SBC ecx+2
   294 					STA ZTMP10	;byte 2
   295
   296 					INC eax		;set result bit
   297
   298 				UDIV321	DEY
   299 					BNE UDIV320
   300
   301 					rts
   302 				.endp
   303 				*/
   303
  1255 2463				icl '6502\cpu6502_single.asm'		; mul / div -> SINGLE		IEEE-754
Source: cpu6502_single.asm
     1 				; JAVA IEEE-32 (IEEE-754)
     2 				; David Schmenk
     3 				; https://sourceforge.net/projects/vm02/
     4 				; http://vm02.cvs.sourceforge.net/viewvc/vm02/vm02/src/
     5
     6 				/*
     7 					org eax
     8
     9 				FP1MAN0	.ds 1
    10 				FP1MAN1	.ds 1
    11 				FP1MAN2	.ds 1
    12 				FP1MAN3	.ds 1
    13
    14 					org ztmp8
    15
    16 				FP1SGN	.ds 1
    17 				FP1EXP	.ds 1
    18
    19 					org edx
    20
    21 				FP2MAN0	.ds 1
    22 				FP2MAN1	.ds 1
    23 				FP2MAN2	.ds 1
    24 				FP2MAN3	.ds 1
    25
    26 					org ztmp10
    27
    28 				FP2SGN	.ds 1
    29 				FP2EXP	.ds 1
    30
    31 					org ecx
    32
    33 				FPMAN0	.ds 1
    34 				FPMAN1	.ds 1
    35 				FPMAN2	.ds 1
    36 				FPMAN3	.ds 1
    37
    38 					org bp2
    39
    40 				FPSGN	.ds 1
    41 				FPEXP	.ds 1
    42
    43 				*/
    43
    44
    45 = 008F			@rx	= bp+1
    46
    47 = 000A			MIN_EXPONENT	= 10
    48 = 00FF			MAX_EXPONENT	= 255
    49
    50
    51 2463			.proc	NEGINT
    52
    53 					LDA	#$00
    54 					SEC
    55
    56 2463			enter	SBC	FPMAN0
    57 					STA	FPMAN0
    58 					LDA	#$00
    59 					SBC	FPMAN1
    60 					STA	FPMAN1
    61 					LDA	#$00
    62 					SBC	FPMAN2
    63 					STA	FPMAN2
    64 					LDA	#$00
    65 					SBC	FPMAN3
    66 					STA	FPMAN3
    67 					RTS
    68 				.endp
    69
    70
    71 2463			.proc	FFRAC
    72 					inx
    73 					lda :STACKORIGIN-1,x
    74 					sta :STACKORIGIN,x
    75
    76 					lda :STACKORIGIN-1+STACKWIDTH,x
    77 					sta :STACKORIGIN+STACKWIDTH,x
    78
    79 					lda :STACKORIGIN-1+STACKWIDTH*2,x
    80 					sta :STACKORIGIN+STACKWIDTH*2,x
    81
    82 					lda :STACKORIGIN-1+STACKWIDTH*3,x
    83 					eor #$80
    84 					sta :STACKORIGIN+STACKWIDTH*3,x
    85
    86 					dex
    87
    88 					jsr F2I
    89 					jsr I2F
    90
    91 					lda :STACKORIGIN+STACKWIDTH*3,x
    92 					eor #$80
    93 					sta :STACKORIGIN+STACKWIDTH*3,x
    94
    95 					inx
    96
    97 					jsr FSUB
    98
    99 					dex
   100
   101 					rts
   102 				.endp
   103
   104
   105 2463			.proc	FROUND
   106 				;	LDA	#$00
   107 				;	STA	FP2SGN
   108
   109 					lda :STACKORIGIN,x
   110 					STA	FP2MAN0
   111 					lda :STACKORIGIN+STACKWIDTH,x
   112 					STA	FP2MAN1
   113 					lda :STACKORIGIN+STACKWIDTH*2,x
   114 					CMP	#$80		; SET CARRY FROM MSB
   115 					ORA	#$80		; SET HIDDEN BIT
   116 					STA	FP2MAN2
   117 					lda :STACKORIGIN+STACKWIDTH*3,x
   118 				;	EOR	FP2SGN		; TOGGLE SIGN FOR FSUB
   119 					ROL
   120 					STA	FP2EXP
   121 					LDA	#$00
   122 					STA	FPSGN
   123 					BCC	@+
   124 					SBC	FP2MAN0
   125 					STA	FP2MAN0
   126 					LDA	#$00
   127 					SBC	FP2MAN1
   128 					STA	FP2MAN1
   129 					LDA	#$00
   130 					SBC	FP2MAN2
   131 					STA	FP2MAN2
   132 					LDA	#$FF
   133 2463			@	STA	FP2MAN3
   134 					lda #$00
   135 					STA	FP1MAN0
   136 					STA	FP1MAN1
   137 					CMP	#$80		; SET CARRY FROM MSB
   138 					ORA	#$80		; SET HIDDEN BIT
   139 					STA	FP1MAN2
   140
   141 					lda :STACKORIGIN+STACKWIDTH*3,x
   142 					and #$80
   143 					ora #$3f		; 0.5 / -0.5
   144
   145 					inx
   146
   147 					jsr FSUB.enter
   148
   149 					dex
   150
   151 					rts
   152 				.endp
   153
   154
   155 2463			.proc	FSUB
   156 					LDA	#$80		; TOGGLE SIGN
   157 					BNE	@+
   158 2463			FADD:	LDA	#$00
   159 2463			@	STA	FP2SGN
   160 				;	stx @rx
   161
   162 					lda :STACKORIGIN,x
   163 					STA	FP2MAN0
   164 					lda :STACKORIGIN+STACKWIDTH,x
   165 					STA	FP2MAN1
   166 					lda :STACKORIGIN+STACKWIDTH*2,x
   167 					CMP	#$80		; SET CARRY FROM MSB
   168 					ORA	#$80		; SET HIDDEN BIT
   169 					STA	FP2MAN2
   170 					lda :STACKORIGIN+STACKWIDTH*3,x
   171 					EOR	FP2SGN		; TOGGLE SIGN FOR FSUB
   172 					ROL
   173 					STA	FP2EXP
   174 					LDA	#$00
   175 					STA	FPSGN
   176 					BCC	@+
   177 					SBC	FP2MAN0
   178 					STA	FP2MAN0
   179 					LDA	#$00
   180 					SBC	FP2MAN1
   181 					STA	FP2MAN1
   182 					LDA	#$00
   183 					SBC	FP2MAN2
   184 					STA	FP2MAN2
   185 					LDA	#$FF
   186 2463			@	STA	FP2MAN3
   187 					lda :STACKORIGIN-1,x
   188 					STA	FP1MAN0
   189 					lda :STACKORIGIN-1+STACKWIDTH,x
   190 					STA	FP1MAN1
   191 					lda :STACKORIGIN-1+STACKWIDTH*2,x
   192 					CMP	#$80		; SET CARRY FROM MSB
   193 					ORA	#$80		; SET HIDDEN BIT
   194 					STA	FP1MAN2
   195 					lda :STACKORIGIN-1+STACKWIDTH*3,x
   196 2463			enter	ROL
   197 					STA	FP1EXP
   198 					LDA	#$00
   199 					BCC	@+
   200 					SBC	FP1MAN0
   201 					STA	FP1MAN0
   202 					LDA	#$00
   203 					SBC	FP1MAN1
   204 					STA	FP1MAN1
   205 					LDA	#$00
   206 					SBC	FP1MAN2
   207 					STA	FP1MAN2
   208 					LDA	#$FF
   209 2463			@	STA	FP1MAN3
   210 					LDA	FP1EXP		; CALCULATE WHICH MANTISSA TO SHIFT
   211 					STA	FPEXP
   212 					SEC
   213 					SBC	FP2EXP
   214 					BEQ	FADDMAN
   215 					BCS	@+
   216 					EOR	#$FF
   217 					TAY
   218 					INY
   219 					LDA	FP2EXP
   220 					STA	FPEXP
   221 					LDA	FP1MAN3
   222 					CPY	#24		; KEEP SHIFT RANGE VALID
   223 					BCC	FP1SHFT
   224 					LDA	#$00
   225 					STA	FP1MAN3
   226 					STA	FP1MAN2
   227 					STA	FP1MAN1
   228 					STA	FP1MAN0
   229 					BEQ	FADDMAN
   230 2463			FP1SHFT:	CMP	#$80	; SHIFT FP1 DOWN
   231 					ROR
   232 					ROR	FP1MAN2
   233 					ROR	FP1MAN1
   234 					ROR	FP1MAN0
   235 					DEY
   236 					BNE	FP1SHFT
   237 					STA	FP1MAN3
   238 					JMP	FADDMAN
   239
   240 2463			@	TAY
   241 					LDA	FP2MAN3
   242 					CPY	#24		; KEEP SHIFT RANGE VALID
   243 					BCC	FP2SHFT
   244 					LDA	#$00
   245 					STA	FP2MAN3
   246 					STA	FP2MAN2
   247 					STA	FP2MAN1
   248 					STA	FP2MAN0
   249 					BEQ	FADDMAN
   250 2463			FP2SHFT:	CMP	#$80	; SHIFT FP2 DOWN
   251 					ROR
   252 					ROR	FP2MAN2
   253 					ROR	FP2MAN1
   254 					ROR	FP2MAN0
   255 					DEY
   256 					BNE	FP2SHFT
   257 					STA	FP2MAN3
   258 2463			FADDMAN:	LDA	FP1MAN0
   259 					CLC
   260 					ADC	FP2MAN0
   261 					STA	FPMAN0
   262 					LDA	FP1MAN1
   263 					ADC	FP2MAN1
   264 					STA	FPMAN1
   265 					LDA	FP1MAN2
   266 					ADC	FP2MAN2
   267 					STA	FPMAN2
   268 					LDA	FP1MAN3
   269 					ADC	FP2MAN3
   270 					STA	FPMAN3
   271 					BPL	FPNORM
   272
   273 					LDA	#$80
   274 					STA	FPSGN
   275
   276 					JSR	NEGINT
   277
   278 					jmp FPNORM
   279 				.endp
   280
   281
   282 2463			.proc	FPNORM
   283 					BEQ	FPNORMLEFT	; NORMALIZE FP, A = FPMANT3
   284 2463			FPNORMRIGHT:	INC	FPEXP
   285 					LSR
   286 					STA	FPMAN3
   287 					ROR	FPMAN2
   288 					ROR	FPMAN1
   289 					LDA	FPMAN0
   290 					ROR
   291 					ADC	#$00
   292 					STA	FPMAN0
   293 					LDA	FPMAN1
   294 					ADC	#$00
   295 					STA	FPMAN1
   296 					LDA	FPMAN2
   297 					ADC	#$00
   298 					STA	FPMAN2
   299 					LDA	FPMAN3
   300 					ADC	#$00
   301 					BNE	FPNORMRIGHT
   302 					LDA	FPEXP
   303 					ASL	FPMAN2
   304 					LSR
   305 					ORA	FPSGN
   306
   307 				;	ldx @rx
   308 					sta :STACKORIGIN-1+STACKWIDTH*3,x
   309 					LDA	FPMAN2
   310 					ROR
   311 					sta :STACKORIGIN-1+STACKWIDTH*2,x
   312
   313 					lda :STACKORIGIN-1+STACKWIDTH*3,x
   314 					asl @
   315 					tay
   316 					lda :STACKORIGIN-1+STACKWIDTH*2,x
   317 					spl
   318 					iny
   319 					cpy #MIN_EXPONENT	; to small 6.018531E-36
   320 					bcc zero
   321 					cpy #MAX_EXPONENT
   322 					beq zero		; number is infinity (if the mantissa is zero) or a NaN (if the mantissa is non-zero)
   323
   324 					LDA	FPMAN1
   325 					sta :STACKORIGIN-1+STACKWIDTH,x
   326 					LDA	FPMAN0
   327 					sta :STACKORIGIN-1,x
   328 					rts
   329
   330 2463			FPNORMLEFT:	LDA	FPMAN2
   331 					BNE	FPNORMLEFT1
   332 					LDA	FPMAN1
   333 					BNE	FPNORMLEFT8
   334 					LDA	FPMAN0
   335 					BNE	FPNORMLEFT16
   336
   337 				;	ldx @rx			; RESULT IS ZERO
   338 2463			zero	lda #0
   339
   340 					sta :STACKORIGIN-1,x
   341 					sta :STACKORIGIN-1+STACKWIDTH,x
   342 					sta :STACKORIGIN-1+STACKWIDTH*2,x
   343 					sta :STACKORIGIN-1+STACKWIDTH*3,x
   344 					rts
   345
   346 2463			FPNORMLEFT16:	TAY
   347 					LDA	FPEXP
   348 					SEC
   349 					SBC	#$10
   350 					STA	FPEXP
   351 					LDA	#$00
   352 					STA	FPMAN1
   353 					STA	FPMAN0
   354 					TYA
   355 					BNE	FPNORMLEFT1
   356 2463			FPNORMLEFT8:	TAY
   357 					LDA	FPMAN0
   358 					STA	FPMAN1
   359 					LDA	FPEXP
   360 					SEC
   361 					SBC	#$08
   362 					STA	FPEXP
   363 					LDA	#$00
   364 					STA	FPMAN0
   365 					TYA
   366 2463			FPNORMLEFT1:	BMI	FPNORMDONE
   367 2463			@	DEC	FPEXP
   368 					ASL	FPMAN0
   369 					ROL	FPMAN1
   370 					ROL
   371 					BPL	@-
   372 2463			FPNORMDONE:	ASL
   373 					TAY
   374 					LDA	FPEXP
   375 					LSR
   376 					ORA	FPSGN
   377
   378 				;	ldx @rx
   379 					sta :STACKORIGIN-1+STACKWIDTH*3,x
   380 					TYA
   381 					ROR
   382 					sta :STACKORIGIN-1+STACKWIDTH*2,x
   383
   384 					lda :STACKORIGIN-1+STACKWIDTH*3,x
   385 					asl @
   386 					tay
   387 					lda :STACKORIGIN-1+STACKWIDTH*2,x
   388 					spl
   389 					iny
   390 					cpy #MIN_EXPONENT	; to small 6.018531E-36
   391 					bcc zero
   392 					cpy #MAX_EXPONENT
   393 					beq zero		; number is infinity (if the mantissa is zero) or a NaN (if the mantissa is non-zero)
   394
   395 					LDA	FPMAN1
   396 					sta :STACKORIGIN-1+STACKWIDTH,x
   397 					LDA	FPMAN0
   398 					sta :STACKORIGIN-1,x
   399
   400 					rts
   401 				.endp
   402
   403
   404 2463			.proc	FMUL
   405
   406 					stx @rx
   407
   408 					lda :STACKORIGIN,x
   409 					STA	FP2MAN0
   410 					lda :STACKORIGIN+STACKWIDTH,x
   411 					STA	FP2MAN1
   412 					lda :STACKORIGIN+STACKWIDTH*2,x
   413 					CMP	#$80		; SET CARRY FROM MSB
   414 					ORA	#$80		; SET HIDDEN BIT
   415 					STA	FP2MAN2
   416 				 	lda :STACKORIGIN+STACKWIDTH*3,x
   417 					ROL
   418 					STA	FP2EXP
   419 					BNE	@+
   420
   421 				; MUL BY ZERO, RESULT ZERO
   422 				;	LDA	#$00
   423 2463			ZERO:	STA :STACKORIGIN-1,x
   424 					STA :STACKORIGIN-1+STACKWIDTH,x
   425 					STA :STACKORIGIN-1+STACKWIDTH*2,x
   426 					STA :STACKORIGIN-1+STACKWIDTH*3,x
   427 					rts
   428
   429 2463			@	LDA	#$00
   430 					ROR
   431 					STA	FPSGN
   432 					lda :STACKORIGIN-1,x
   433 					STA	FP1MAN0
   434 					lda :STACKORIGIN-1+STACKWIDTH,x
   435 					STA	FP1MAN1
   436 					lda :STACKORIGIN-1+STACKWIDTH*2,x
   437 					CMP	#$80		; SET CARRY FROM MSB
   438 					ORA	#$80		; SET HIDDEN BIT
   439 					STA	FP1MAN2
   440 					lda :STACKORIGIN-1+STACKWIDTH*3,x
   441 					ROL
   442 					STA	FP1EXP
   443 					BEQ	ZERO		; MUL BY ZERO, RESULT ZERO
   444
   445 					LDA	#$00
   446 					ROR
   447 					EOR	FPSGN
   448 					STA	FPSGN
   449 					LDA	FP1EXP
   450 					CLC			; ADD EXPONENTS
   451 					ADC	FP2EXP
   452 					SEC			; SUBTRACT BIAS
   453 					SBC	#$7F
   454 					STA	FPEXP
   455 					LDX	#$00
   456 					STX	FPMAN0
   457 					STX	FPMAN1
   458 					STX	FPMAN2
   459 					STX	FPMAN3
   460 					STX	TMP
   461 2463			FMULNEXTBYTE:	LDA	FP1MAN0,X
   462 					BNE	@+
   463 					LDX	FPMAN1		; SHORT CIRCUIT BYTE OF ZERO BITS
   464 					STX	FPMAN0
   465 					LDX	FPMAN2
   466 					STX	FPMAN1
   467 					LDX	FPMAN3
   468 					STX	FPMAN2
   469 					STA	FPMAN3
   470 					INC	TMP
   471 					LDX	TMP
   472 					CPX	#$03
   473 					BNE	FMULNEXTBYTE
   474
   475 					ldx @rx
   476 					LDA	FPMAN3
   477 					JMP	FPNORM
   478
   479 2463			@	EOR	#$FF
   480 					LDX	#$08
   481 2463			FMULTSTBITS:	LSR	FPMAN3
   482 					ROR	FPMAN2
   483 					ROR	FPMAN1
   484 					ROR	FPMAN0
   485 					LSR
   486 					BCS	FMULNEXTTST
   487 					TAY
   488 					LDA	FP2MAN0
   489 					ADC	FPMAN0
   490 					STA	FPMAN0
   491 					LDA	FP2MAN1
   492 					ADC	FPMAN1
   493 					STA	FPMAN1
   494 					LDA	FP2MAN2
   495 					ADC	FPMAN2
   496 					STA	FPMAN2
   497 					LDA	#$00
   498 					ADC	FPMAN3
   499 					STA	FPMAN3
   500 					TYA
   501 2463			FMULNEXTTST:	DEX
   502 					BNE	FMULTSTBITS
   503 					INC	TMP
   504 					LDX	TMP
   505 					CPX	#$03
   506 					BNE	FMULNEXTBYTE
   507
   508 					ldx @rx
   509 					LDA	FPMAN3
   510 					JMP	FPNORM
   511 				.endp
   512
   513
   514 2463			.proc	FDIV
   515
   516 					stx @rx
   517
   518 					lda :STACKORIGIN,x
   519 					STA	FP2MAN0
   520 					lda :STACKORIGIN+STACKWIDTH,x
   521 					STA	FP2MAN1
   522 					lda :STACKORIGIN+STACKWIDTH*2,x
   523 					CMP	#$80		; SET CARRY FROM MSB
   524 					ORA	#$80		; SET HIDDEN BIT
   525 					STA	FP2MAN2
   526 					lda :STACKORIGIN+STACKWIDTH*3,x
   527 					ROL
   528 					STA	FP2EXP
   529 					BNE	@+
   530
   531 				;	LDA	#$00
   532 2463			ZERO:	STA :STACKORIGIN-1,x
   533 					STA :STACKORIGIN-1+STACKWIDTH,x
   534 					STA :STACKORIGIN-1+STACKWIDTH*2,x
   535 					STA :STACKORIGIN-1+STACKWIDTH*3,x
   536 					rts
   537 				;	LDA	#23		; DIVIDE BY ZERO, ERROR
   538 				;	JMP	SYSTHROW
   539
   540 2463			@	LDA	#$00
   541 					ROR
   542 					STA	FPSGN
   543 					lda :STACKORIGIN-1,x
   544 					STA	FP1MAN0
   545 					lda :STACKORIGIN-1+STACKWIDTH,x
   546 					STA	FP1MAN1
   547 					lda :STACKORIGIN-1+STACKWIDTH*2,x
   548 					CMP	#$80		; SET CARRY FROM MSB
   549 					ORA	#$80		; SET HIDDEN BIT
   550 					STA	FP1MAN2
   551 					lda :STACKORIGIN-1+STACKWIDTH*3,x
   552 					ROL
   553 					STA	FP1EXP
   554 					BEQ	ZERO		; DIVIDE ZERO, RESULT ZERO
   555
   556 					LDA	#$00
   557 					STA	FP1MAN3
   558 					ROR
   559 					EOR	FPSGN
   560 					STA	FPSGN
   561 					LDA	FP1EXP
   562 					SEC			; SUBTRACT EXPONENTS
   563 					SBC	FP2EXP
   564 					CLC
   565 					ADC	#$7F		; ADD BACK BIAS
   566 					STA	FPEXP
   567
   568 					LDX	#24		; #BITS
   569 2463			FDIVLOOP:	LDA	FP1MAN0
   570 					SEC
   571 					SBC	FP2MAN0
   572 					STA	TMP
   573 					LDA	FP1MAN1
   574 					SBC	FP2MAN1
   575 					STA	TMP+1
   576 					LDA	FP1MAN2
   577 					SBC	FP2MAN2
   578 					TAY
   579 					LDA	FP1MAN3
   580 					SBC	#$00
   581 					BCC	FDIVNEXTBIT
   582 					STA	FP1MAN3
   583 					STY	FP1MAN2
   584 					LDA	TMP+1
   585 					STA	FP1MAN1
   586 					LDA	TMP
   587 					STA	FP1MAN0
   588 2463			FDIVNEXTBIT:	ROL	FPMAN0
   589 					ROL	FPMAN1
   590 					ROL	FPMAN2
   591 					ASL	FP1MAN0
   592 					ROL	FP1MAN1
   593 					ROL	FP1MAN2
   594 					ROL	FP1MAN3
   595 					DEX
   596 					BNE	FDIVLOOP
   597
   598 					ldx @rx
   599 					LDA	#$00
   600 					JMP	FPNORM
   601 				.endp
   602
   603
   604 2463			.proc	FCMPL
   605 2463			FCMPG:
   606 					CLV
   607
   608 					LDA	:STACKORIGIN+STACKWIDTH*3,X	; COMPARE SIGNS
   609 					AND	#$80
   610 					STA	FP2SGN
   611 					LDA	:STACKORIGIN-1+STACKWIDTH*3,X
   612 					AND	#$80
   613 					CMP	FP2SGN
   614 					BCC	FCMPGTSGN
   615 					BEQ	@+
   616 					BCS	FCMPLTSGN
   617 2463			@	LDA	:STACKORIGIN-1+STACKWIDTH*3,X	; COMPARE AS MAGNITUDE
   618 					CMP	:STACKORIGIN+STACKWIDTH*3,X
   619 					BCC	FCMPLT
   620 					BEQ	@+
   621 					BCS	FCMPGT
   622 2463			@	LDA	:STACKORIGIN-1+STACKWIDTH*2,X
   623 					CMP	:STACKORIGIN+STACKWIDTH*2,X
   624 					BCC	FCMPLT
   625 					BEQ	@+
   626 					BCS	FCMPGT
   627 2463			@	LDA	:STACKORIGIN-1+STACKWIDTH,X
   628 					CMP	:STACKORIGIN+STACKWIDTH,X
   629 					BCC	FCMPLT
   630 					BEQ	@+
   631 					BCS	FCMPGT
   632 2463			@	LDA	:STACKORIGIN-1,X
   633 					CMP	:STACKORIGIN,X
   634 					BCC	FCMPLT
   635 					BEQ	FCMPEQ
   636 					BCS	FCMPGT
   637 2463			FCMPEQ:	LDA #0			; EQUAL
   638 					RTS
   639
   640 2463			FCMPGT:	LDA	FP2SGN		; FLIP RESULT IF NEGATIVE #S
   641 					BMI	FCMPLTSGN
   642 2463			FCMPGTSGN:	LDA	#$01	; GREATER THAN
   643 					RTS
   644
   645 2463			FCMPLT:	LDA	FP2SGN		; FLIP RESULT IF NEGATIVE #S
   646 					BMI	FCMPGTSGN
   647 2463			FCMPLTSGN:	LDA	#$FF	; LESS THAN
   648 					RTS
   649 				.endp
   650
   651
   652 2463			.proc	F2I
   653
   654 					lda :STACKORIGIN,x
   655 					STA	FPMAN0
   656 					lda :STACKORIGIN+STACKWIDTH,x
   657 					STA	FPMAN1
   658 					lda :STACKORIGIN+STACKWIDTH*2,x
   659 					CMP	#$80		; SET CARRY FROM MSB
   660 					ORA	#$80		; SET HIDDEN BIT
   661 					STA	FPMAN2
   662 					lda :STACKORIGIN+STACKWIDTH*3,x
   663 					ROL	@
   664 					STA	FPEXP
   665 					LDA	#$00
   666 					ROR	@
   667 					STA	FPSGN
   668 					LDA	FPEXP		; CHECK FOR LESS THAN ONE
   669 					SEC
   670 					SBC	#$7F
   671 					BCS	@+
   672
   673 2463			ZERO:	LDA	#$00		; RETURN ZERO
   674 					STA :STACKORIGIN,x
   675 					STA :STACKORIGIN+STACKWIDTH,x
   676 					STA :STACKORIGIN+STACKWIDTH*2,x
   677 					STA :STACKORIGIN+STACKWIDTH*3,x
   678 					rts
   679
   680 2463			@	CMP	#23
   681 					BCS	F2ISHL
   682 					STA	FPEXP
   683 					LDA	#23
   684 					SEC
   685 					SBC	FPEXP
   686 					TAY			; SHIFT MANTISSA RIGHT
   687 					LDA	FPMAN2
   688 2463			F2ISHR:	LSR	@
   689 					ROR	FPMAN1
   690 					ROR	FPMAN0
   691 					DEY
   692 					BNE	F2ISHR
   693 					STA	FPMAN2
   694 					STY	FPMAN3
   695 2463			F2ICHKNEG:	LDA	FPSGN
   696 					BPL	@+		; CHECK FOR NEGATIVE
   697 					ASL	@		; LDA #$00; SEC
   698
   699 					JSR	NEGINT.enter
   700
   701 2463			@	LDA	FPMAN3
   702 					STA :STACKORIGIN+STACKWIDTH*3,x
   703 					LDA	FPMAN2
   704 					STA :STACKORIGIN+STACKWIDTH*2,x
   705 					LDA	FPMAN1
   706 					STA :STACKORIGIN+STACKWIDTH,x
   707 					LDA	FPMAN0
   708 					STA :STACKORIGIN,x
   709 					rts
   710
   711 2463			F2ISHL:	CMP	#32
   712 					BCC	@+
   713 					LDA	#$FF		; OVERFLOW, STORE MAXINT
   714 					STA	FPMAN0
   715 					STA	FPMAN1
   716 					STA	FPMAN2
   717 					LSR	@
   718 					STA	FPMAN3
   719 					BNE	F2ICHKNEG
   720 2463			@	SEC
   721 					SBC	#23
   722 					BNE	@+
   723 					STA	FPMAN3
   724 					BEQ	F2ICHKNEG
   725 2463			@	TAY			; SHIFT MANTISSA LEFT
   726 					LDA	#$00
   727 2463			@	ASL	FPMAN0
   728 					ROL	FPMAN1
   729 					ROL	FPMAN2
   730 					ROL	@
   731 					DEY
   732 					BNE	@-
   733 					STA	FPMAN3
   734 					BEQ	F2ICHKNEG
   735 				.endp
   736
   737
   738 2463			.proc	I2F
   739
   740 					lda :STACKORIGIN,x
   741 					STA	FPMAN0
   742 					lda :STACKORIGIN+STACKWIDTH,x
   743 					STA	FPMAN1
   744 					lda :STACKORIGIN+STACKWIDTH*2,x
   745 					STA	FPMAN2
   746 					lda :STACKORIGIN+STACKWIDTH*3,x
   747 					STA	FPMAN3
   748 					AND	#$80
   749 					STA	FPSGN
   750 					BPL	@+
   751 				;	LDX	#FPMAN0
   752 					JSR	NEGINT
   753 2463			@	LDA	#$7F+23
   754 					STA	FPEXP
   755
   756 					inx			; ten zabieg zapisze pod :STACKORIGIN,x
   757 								; zamiast :STACKORIGIN-1,x
   758 					LDA	FPMAN3
   759 					JSR	FPNORM
   760
   761 					dex
   762 					rts
   763 				.endp
   764
   765
   766 2463			.proc	I2F_m
   767
   768 					lda :STACKORIGIN-1,x
   769 					STA	FPMAN0
   770 					lda :STACKORIGIN-1+STACKWIDTH,x
   771 					STA	FPMAN1
   772 					lda :STACKORIGIN-1+STACKWIDTH*2,x
   773 					STA	FPMAN2
   774 					lda :STACKORIGIN-1+STACKWIDTH*3,x
   775
   776 					STA	FPMAN3
   777 					AND	#$80
   778 					STA	FPSGN
   779 					BPL	@+
   780 				;	LDX	#FPMAN0
   781 					JSR	NEGINT
   782 2463			@	LDA	#$7F+23
   783 					STA	FPEXP
   784
   785 					LDA	FPMAN3
   786 					JMP	FPNORM
   787 				.endp
  1256
  1257
  1258 2463			.proc	@printCHAR
  1259 					ldy :STACKORIGIN,x
  1260 					jmp @print
  1261 				.endp
  1262
  1263
  1264 2463			.proc	@printEOL
  1265 					ldy #eol
  1266 					jmp @print
  1267 				.endp
  1268
  1269
  1270 2463			.proc	@print (.byte y) .reg
  1271 					txa:pha
  1272
  1273 					tya
  1274 					jsr @putchar
  1275
  1276 					pla:tax
  1277 					rts
  1278 				.endp
  1279
  1280
  1281 2463			.proc	@printPCHAR (.word ya) .reg
  1282
  1283 					cpy #0
  1284 					beq empty
  1285
  1286 					sta ztmp
  1287 					sty ztmp+1
  1288
  1289 					stx @sp
  1290
  1291 					lda #0
  1292 					sta loop+1
  1293
  1294 2463			loop	ldy #0
  1295 					lda (ztmp),y
  1296 					beq stop
  1297
  1298 					inc loop+1
  1299 					beq stop
  1300
  1301 					jsr @putchar
  1302
  1303 					jmp loop
  1304
  1305 2463			stop	ldx #0
  1306 2463			@sp	equ *-1
  1307
  1308 2463			empty	rts
  1309 				.endp
  1310
  1311
  1312 2463			.proc	@printSTRING (.word ya) .reg
  1313
  1314 					cpy #0
  1315 					beq empty
  1316
  1317 					sta ztmp
  1318 					sty ztmp+1
  1319
  1320 					stx @sp
  1321
  1322 					ldy #0
  1323 					sty loop+1
  1324 					lda (ztmp),y
  1325 					sta ln
  1326
  1327 					inw ztmp
  1328
  1329 2463			loop	ldy #0
  1330 					lda (ztmp),y
  1331 				;	beq stop
  1332
  1333 					cpy #0
  1334 2463			ln	equ *-1
  1335 					beq stop
  1336
  1337 					inc loop+1
  1338
  1339 					jsr @putchar
  1340
  1341 					jmp loop
  1342
  1343 2463			stop	ldx #0
  1344 2463			@sp	equ *-1
  1345
  1346 2463			empty	rts
  1347 				.endp
  1348
  1349
  1350 2463			.proc	@printBOOLEAN
  1351 					lda :STACKORIGIN,x
  1352 					beq _0
  1353
  1354 2463			_1	lda <_true
  1355 					ldy >_true
  1356 					jmp @printSTRING
  1357
  1358 2463			_0	lda <_false
  1359 					ldy >_false
  1360 					jmp @printSTRING
  1361
  1362 2463			_true	dta 4,c'TRUE'
  1363 2463			_false	dta 5,c'FALSE'
  1364 				.endp
  1365
  1366
  1367 2463			.proc	mov_BYTE_DX
  1368 					mva :STACKORIGIN,x dx
  1369 					mva #$00 dx+1
  1370 					sta dx+2
  1371 					sta dx+3
  1372
  1373 					rts
  1374 				.endp
  1375
  1376 2463			.proc	mov_WORD_DX
  1377 					mva :STACKORIGIN,x dx
  1378 					mva :STACKORIGIN+STACKWIDTH,x dx+1
  1379 					mva #$00 dx+2
  1380 					sta dx+3
  1381
  1382 					rts
  1383 				.endp
  1384
  1385 2463			.proc	mov_CARD_DX
  1386 					mva :STACKORIGIN,x dx
  1387 					mva :STACKORIGIN+STACKWIDTH,x dx+1
  1388 					mva :STACKORIGIN+STACKWIDTH*2,x dx+2
  1389 					mva :STACKORIGIN+STACKWIDTH*3,x dx+3
  1390
  1391 					rts
  1392 				.endp
  1393
  1394
  1395 2463			.proc	@printMINUS
  1396 					ldy #'-'
  1397 					jsr @printVALUE.pout
  1398
  1399 					jmp negCARD
  1400 				.endp
  1401
  1402
  1403 2463			.proc	@printSHORTREAL
  1404 					jsr @expandToCARD.SMALL
  1405 					jmp @printREAL
  1406 				.endp
  1407
  1408
  1409 2463			.proc	@FTOA
  1410
  1411 = 0086			i	= edx
  1412 = 008A			fra	= ecx
  1413 = 0082			hlp	= eax
  1414
  1415 = 0092			exp	= ztmp
  1416 = 0093			b	= ztmp+1
  1417 = 0094			sht	= ztmp+2
  1418
  1419 = 0440			bit	= @buf+64
  1420
  1421 					stx @sp
  1422
  1423 					mva :STACKORIGIN,x I
  1424 					sta :STACKORIGIN+9
  1425 					mva :STACKORIGIN+STACKWIDTH,x I+1
  1426 					sta :STACKORIGIN+STACKWIDTH+9
  1427 					mva :STACKORIGIN+STACKWIDTH*2,x I+2
  1428 					sta :STACKORIGIN+STACKWIDTH*2+9
  1429 					mva :STACKORIGIN+STACKWIDTH*3,x I+3
  1430 					sta :STACKORIGIN+STACKWIDTH*3+9	; Sign
  1431
  1432 					bpl skp
  1433
  1434 					ldy #'-'
  1435 					jsr @printVALUE.pout
  1436
  1437 2463			skp
  1438 				; optimize OK (test_3.pas), line = 32
  1439
  1440 					lda :STACKORIGIN+STACKWIDTH*3+9
  1441 					asl :STACKORIGIN+9
  1442 					rol :STACKORIGIN+STACKWIDTH+9
  1443 					rol :STACKORIGIN+STACKWIDTH*2+9
  1444 					rol @
  1445 					sta EXP				; Exponent
  1446
  1447 				; optimize OK (test_3.pas), line = 33
  1448
  1449 					lda I
  1450 					sta FRA
  1451 					lda I+1
  1452 					sta FRA+1
  1453 					lda I+2
  1454 					sta FRA+2
  1455 					lda I+3
  1456 					sta FRA+3
  1457 					asl FRA
  1458 					rol FRA+1
  1459 					rol FRA+2
  1460 					rol FRA+3
  1461
  1462 				; optimize OK (test_3.pas), line = 35
  1463
  1464 					lda EXP
  1465 					sub #$7F
  1466 					sta SHT
  1467
  1468 				; optimize OK (test_3.pas), line = 37
  1469
  1470 					ldx #$3f
  1471 					lda #0
  1472 					sta:rpl bit,x-
  1473
  1474 				; For
  1475
  1476 				; optimize OK (test_3.pas), line = 39
  1477
  1478 				;	sta B
  1479 					tax
  1480
  1481 				; optimize OK (test_3.pas), line = 39
  1482
  1483 2463			l_01D4
  1484 				;	lda B
  1485 				;	cmp #$17
  1486 					cpx #$17
  1487 					bcc *+7
  1488 					beq *+5
  1489
  1490 				; ForToDoProlog
  1491 					jmp l_01EE
  1492
  1493 				; optimize OK (test_3.pas), line = 40
  1494
  1495 				;	lda #$20
  1496 				;	add B
  1497 				;	tax
  1498
  1499 					lda FRA+2
  1500 					sta BIT+$20,x
  1501
  1502 				; optimize OK (test_3.pas), line = 41
  1503
  1504 					asl FRA
  1505 					rol FRA+1
  1506 					rol FRA+2
  1507 					rol FRA+3
  1508
  1509 				; ForToDoEpilog
  1510 2463			c_01D4
  1511 				;	inc B
  1512 					inx
  1513
  1514 					seq
  1515
  1516 				; WhileDoEpilog
  1517 					jmp l_01D4
  1518 2463			l_01EE
  1519 2463			b_01D4
  1520
  1521 				; optimize OK (test_3.pas), line = 44
  1522
  1523 					mva #$80 BIT+$1f
  1524
  1525 				; optimize OK (test_3.pas), line = 46
  1526
  1527 					mva #$00 I
  1528 					sta I+1
  1529 					sta I+2
  1530 					sta I+3
  1531
  1532 				; optimize OK (test_3.pas), line = 47
  1533
  1534 					sta FRA+1
  1535 					sta FRA+2
  1536 					sta FRA+3
  1537
  1538 					mva #$01 FRA
  1539
  1540 				; For
  1541
  1542 				; optimize OK (test_3.pas), line = 49
  1543
  1544 					lda SHT
  1545 					add #$1F
  1546 					sta B
  1547
  1548 				; optimize OK (test_3.pas), line = 49
  1549
  1550 					tay
  1551
  1552 2463			l_035B
  1553 				;	lda B
  1554 				;	cmp #$00
  1555 				;	bcs *+5
  1556
  1557 				; ForToDoProlog
  1558 				;	jmp l_0375
  1559
  1560 				; optimize OK (test_3.pas), line = 50
  1561
  1562 				;	ldy B
  1563 					lda BIT,y
  1564 					bpl l_03D7
  1565
  1566 				; optimize OK (test_3.pas), line = 50
  1567
  1568 					lda I				; Mantissa
  1569 					add FRA
  1570 					sta I
  1571 					lda I+1
  1572 					adc FRA+1
  1573 					sta I+1
  1574 					lda I+2
  1575 					adc FRA+2
  1576 					sta I+2
  1577 					lda I+3
  1578 					adc FRA+3
  1579 					sta I+3
  1580
  1581 				; IfThenEpilog
  1582 2463			l_03D7
  1583
  1584 				; optimize OK (test_3.pas), line = 52
  1585
  1586 					asl FRA
  1587 					rol FRA+1
  1588 					rol FRA+2
  1589 					rol FRA+3
  1590
  1591 				; ForToDoEpilog
  1592 2463			c_035B
  1593 				;	dec B
  1594 					dey
  1595
  1596 				;	lda B
  1597 				;	cmp #$ff
  1598 					cpy #$ff
  1599 					seq
  1600
  1601 				; WhileDoEpilog
  1602 					jmp l_035B
  1603 2463			l_0375
  1604 2463			b_035B
  1605
  1606 				; optimize OK (test_3.pas), line = 55
  1607
  1608 					mva #$00 FRA
  1609 					sta FRA+1
  1610 					sta FRA+2
  1611 					sta FRA+3
  1612
  1613 				; optimize OK (test_3.pas), line = 56
  1614
  1615 					sta EXP
  1616
  1617 					sta hlp
  1618 					sta hlp+1
  1619
  1620 					lda #$80
  1621 					sta hlp+2
  1622 				; For
  1623
  1624 				; optimize OK (test_3.pas), line = 58
  1625
  1626 					lda SHT
  1627 					add #$20
  1628 				;	sta B
  1629
  1630 					tay
  1631
  1632 				; optimize OK (test_3.pas), line = 58
  1633
  1634 					add #23
  1635 					sta FORTMP_1273
  1636 				; To
  1637 2463			l_0508
  1638
  1639 				; ForToDoCondition
  1640
  1641 				; optimize OK (test_3.pas), line = 58
  1642
  1643 				;	lda B
  1644 				;	cmp #0
  1645 					cpy #0
  1646 2463			FORTMP_1273	equ *-1
  1647 					bcc *+7
  1648 					beq *+5
  1649
  1650 				; ForToDoProlog
  1651 					jmp l_0534
  1652
  1653 				; optimize OK (test_3.pas), line = 59
  1654
  1655 				;	ldy B
  1656 					lda BIT,y
  1657 					bpl l_0596
  1658
  1659 				; optimize OK (test_3.pas), line = 59
  1660
  1661 					lda FRA
  1662 					add hlp
  1663 					sta FRA
  1664 					lda FRA+1
  1665 					adc hlp+1
  1666 					sta FRA+1
  1667 					lda FRA+2
  1668 					adc hlp+2
  1669 					sta FRA+2
  1670
  1671 				; IfThenEpilog
  1672 2463			l_0596
  1673
  1674 					lsr hlp+2
  1675 					ror hlp+1
  1676 					ror hlp
  1677
  1678 				; ForToDoEpilog
  1679 2463			c_0508
  1680 				;	inc B						; inc ptr byte [CounterAddress]
  1681 					iny
  1682
  1683 					seq
  1684
  1685 				; WhileDoEpilog
  1686 					jmp l_0508
  1687 2463			l_0534
  1688 2463			b_0508
  1689 2463				:3 mva fra+# fracpart+#
  1690
  1691 					mva #6 @float.afterpoint	; wymagana liczba miejsc po przecinku
  1692 					@float #500000
  1693
  1694 					ldx #0
  1695 2463			@sp	equ *-1
  1696
  1697 					rts
  1698 				.endp
  1699
  1700
  1701 2463			.proc	@printREAL
  1702
  1703 					stx @sp
  1704
  1705 					lda :STACKORIGIN+STACKWIDTH*3,x
  1706 					spl
  1707 					jsr @printMINUS
  1708
  1709 					jsr mov_CARD_DX
  1710
  1711 					mva dx+1 intpart		; intpart := uvalue shr 8
  1712 					mva dx+2 intpart+1
  1713 					mva dx+3 intpart+2
  1714 					mva #$00 intpart+3
  1715
  1716 					sta dx+3			; fracpart := uvalue and $FF (dx)
  1717 					sta dx+2
  1718 					sta dx+1
  1719
  1720 					sta fracpart
  1721 					sta fracpart+1
  1722
  1723 					lda dx
  1724 					sta fracpart+2
  1725
  1726 2463				:4 mva intpart+# dx+#		; integer part
  1727
  1728 					mva #4 @float.afterpoint		; wymagana liczba miejsc po przecinku
  1729 					@float #5000
  1730
  1731 					ldx #0
  1732 2463			@sp	equ *-1
  1733 					rts
  1734
  1735 2463 00 00 00 00		intpart		.dword
  1736
  1737 				.endp
  1738
  1739
  1740 2467			.proc	@float (.long axy) .reg
  1741
  1742 					sty cx
  1743 					stx cx+1
  1744 					sta cx+2
  1745
  1746 					lda @printVALUE.pout		; print integer part
  1747 					pha
  1748 					jsr @printVALUE
  1749 					pla
  1750 					sta @printVALUE.pout
  1751
  1752 					lda #0
  1753 					sta dx
  1754 					sta dx+1
  1755 					sta dx+2
  1756 					sta dx+3
  1757
  1758 2467			loop	lda fracpart+2
  1759 					bpl skp
  1760
  1761 					clc
  1762 				;	lda cx
  1763 				;	spl
  1764 				;	sec
  1765
  1766 					lda dx
  1767 					adc cx
  1768 					sta dx
  1769 					lda dx+1
  1770 					adc cx+1
  1771 					sta dx+1
  1772 					lda dx+2
  1773 					adc cx+2
  1774 					sta dx+2
  1775 				;	lda dx+3
  1776 				;	adc #0
  1777 				;	sta dx+3
  1778
  1779 2467			skp	lsr cx+2
  1780 					ror cx+1
  1781 					ror cx
  1782
  1783 					asl fracpart
  1784 					rol fracpart+1
  1785 					rol fracpart+2
  1786
  1787 					lda cx
  1788 					ora cx+1
  1789 					ora cx+2
  1790
  1791 					bne loop
  1792
  1793 					ldy #'.'
  1794 					jsr @printVALUE.pout
  1795
  1796 2467				:4 mva dx+# fracpart+#
  1797
  1798 					lda @printVALUE.pout
  1799 					pha
  1800
  1801 					lda #{rts}
  1802 					sta @printVALUE.pout
  1803 					jsr @printVALUE			; floating part length
  1804
  1805 					sta cnt
  1806
  1807 					pla
  1808 					sta @printVALUE.pout
  1809
  1810 2467			lp	lda #0
  1811 2467			cnt	equ *-1
  1812 					cmp #4				; N miejsc po przecinku
  1813 2467			afterpoint equ *-1
  1814 					bcs ok
  1815
  1816 					ldy #'0'
  1817 					jsr @printVALUE.pout
  1818
  1819 					inc cnt
  1820 					bne lp
  1821
  1822 2467			ok	:4 mva fracpart+# dx+#
  1823 					jmp @printVALUE			; print floating part
  1824
  1825 				.endp
  1826
  1827
  1828 2467			.proc	@printSHORTINT
  1829
  1830 					lda :STACKORIGIN,x
  1831 					spl
  1832 					jsr @printMINUS
  1833
  1834 					jmp @printBYTE
  1835 				.endp
  1836
  1837
  1838 2467			.proc	@printSMALLINT
  1839
  1840 					lda :STACKORIGIN+STACKWIDTH,x
  1841 					spl
  1842 					jsr @printMINUS
  1843
  1844 					jmp @printWORD
  1845 				.endp
  1846
  1847
  1848 2467			.proc	@printINT
  1849
  1850 					lda :STACKORIGIN+STACKWIDTH*3,x
  1851 					spl
  1852 					jsr @printMINUS
  1853
  1854 					jmp @printCARD
  1855 				.endp
  1856
  1857
  1858 2467			.proc	@printCARD
  1859 					jsr mov_CARD_DX
  1860 					jmp @printVALUE
  1861 				.endp
  1862
  1863
  1864 2467			.proc	@printWORD
  1865 					jsr mov_WORD_DX
  1866 					jmp @printVALUE
  1867 				.endp
  1868
  1869
  1870 2467			.proc	@printBYTE
  1871 					jsr mov_BYTE_DX
  1872 					jmp @printVALUE
  1873 				.endp
  1874
  1875
  1876 2467			.proc	@printVALUE
  1877
  1878 					lda dx+3
  1879 					bne _32bit
  1880
  1881 					lda dx+2
  1882 					bne _24bit
  1883
  1884 					lda dx+1
  1885 					bne _16bit
  1886
  1887 2467			_8bit	lda #3
  1888 					bne l3
  1889
  1890 2467			_16bit	lda #5
  1891 					bne l3
  1892
  1893 2467			_24bit	lda #8
  1894 					bne l3
  1895
  1896 					; prints a 32 bit value to the screen (Graham)
  1897
  1898 2467			_32bit	lda #10
  1899
  1900 2467			l3	sta limit
  1901
  1902 					stx @sp
  1903
  1904 					ldx #0
  1905 					stx cnt
  1906
  1907 2467			lp	jsr div10
  1908
  1909 					sta tmp,x
  1910 					inx
  1911 					cpx #10
  1912 2467			limit	equ *-1
  1913 					bne lp
  1914
  1915 					;ldx #9
  1916 					dex
  1917
  1918 2467			l1	lda tmp,x
  1919 					bne l2
  1920 					dex		; skip leading zeros
  1921 					bne l1
  1922
  1923 2467			l2	lda tmp,x
  1924 					ora #$30
  1925 					tay
  1926
  1927 					jsr pout
  1928 					inc cnt
  1929
  1930 					dex
  1931 					bpl l2
  1932
  1933 					mva #{jmp*} pout
  1934
  1935 					lda #0
  1936 2467			cnt	equ *-1
  1937
  1938 					ldx #0
  1939 2467			@sp	equ *-1
  1940 					rts
  1941
  1942 2467			pout	jmp @print
  1943
  1944 					sty @buf+1
  1945 2467			pbuf	equ *-2
  1946 					inc pbuf
  1947
  1948 					rts
  1949
  1950 2467			tmp	.byte 0,0,0,0,0,0,0,0,0,0
  1951
  1952 				.endp
  1953
  1954
  1955 				; divides a 32 bit value by 10
  1956 				; remainder is returned in akku
  1957
  1958 2467			.proc	div10
  1959 				        ldy #32		; 32 bits
  1960 				        lda #0
  1961 				        clc
  1962 2467			l4      rol @
  1963 				        cmp #10
  1964 				        bcc skip
  1965 				        sbc #10
  1966 2467			skip    rol dx
  1967 				        rol dx+1
  1968 				        rol dx+2
  1969 				        rol dx+3
  1970 				        dey
  1971 				        bpl l4
  1972
  1973 					rts
  1974 				.endp
  1975
  1976
  1977 2467			.proc	@hexStr
  1978
  1979 = 0086			Value	= edx
  1980 = 008A			Digits	= ecx
  1981
  1982 					ldx Digits
  1983 					cpx #32
  1984 					scc
  1985 					ldx #32
  1986
  1987 					stx Digits
  1988
  1989 					lda Value
  1990 					jsr hex
  1991 					lda Value+1
  1992 					jsr hex
  1993 					lda Value+2
  1994 					jsr hex
  1995 					lda Value+3
  1996 					jsr hex
  1997
  1998 					lda Digits
  1999 					sta @buf
  2000 					rts
  2001
  2002 2467			hex	pha
  2003 					and #$f
  2004 					jsr put
  2005 					pla
  2006 2467				:4 lsr @
  2007 2467			put	tay
  2008 					lda thex,y
  2009 					sta @buf,x
  2010 					dex
  2011 					rts
  2012
  2013 2467			thex	dta c'0123456789ABCDEF'
  2014 				.endp
  2015
  2016
  2017 2467			.proc	@ValueToStr (.word ya) .reg
  2018
  2019 					sta adr
  2020 					sty adr+1
  2021
  2022 					mva #{bit*} @printVALUE.pout
  2023 					mva <@buf+1 @printVALUE.pbuf
  2024
  2025 					jsr $ffff
  2026 2467			adr	equ *-2
  2027
  2028 					ldy @printVALUE.pbuf
  2029 					dey
  2030 					sty @buf
  2031
  2032 					rts
  2033 				.endp
  2034
  2035
  2036 				;	ecx	isSign
  2037 				;	edx	Result
  2038
  2039 2467			.proc	@StrToInt (.word ya) .reg
  2040
  2041 					sta bp2
  2042 					sty bp2+1
  2043
  2044 					ldy #0
  2045 					sty MAIN.SYSTEM.IOResult
  2046 					sty edx
  2047 					sty edx+1
  2048 					sty edx+2
  2049 					sty edx+3
  2050
  2051 					lda (bp2),y
  2052 					beq stop
  2053 					sta len
  2054
  2055 					inw bp2
  2056
  2057 					lda (bp2),y
  2058 					cmp #'-'
  2059 					sne
  2060 					iny
  2061
  2062 					sty ecx
  2063
  2064 2467			l1	lda (bp2),y
  2065
  2066 					CLC
  2067 					ADC #$FF-'9'	; make m = $FF
  2068 					ADC #'9'-'0'+1	; carry set if in range n to m
  2069 					bcs ok
  2070
  2071 					lda #106	; Invalid numeric format
  2072 					sta MAIN.SYSTEM.IOResult
  2073
  2074 					rts		; reg Y contains the index of the character in S which prevented the conversion
  2075
  2076 2467			ok	jsr fmul10
  2077
  2078 					lda (bp2),y
  2079 					sub #$30
  2080 					sta ztmp
  2081
  2082 					lda #$00
  2083 					sta ztmp+1
  2084 					sta ztmp+2
  2085 					sta ztmp+3
  2086
  2087 					jsr fmul10.add32bit
  2088
  2089 					iny
  2090 					cpy #0
  2091 2467			len	equ *-1
  2092 					bne l1
  2093
  2094 					lda ecx
  2095 					beq stop
  2096
  2097 					jsr negEDX
  2098
  2099 2467			stop	ldy #0		; reg Y = 0 conversion successful
  2100 					rts
  2101 				.endp
  2102
  2103
  2104 2467			.proc	negEDX
  2105 					lda #$00	; minus
  2106 					sub edx
  2107 					sta edx
  2108
  2109 					lda #$00
  2110 					sbc edx+1
  2111 					sta edx+1
  2112
  2113 					lda #$00
  2114 					sbc edx+2
  2115 					sta edx+2
  2116
  2117 					lda #$00
  2118 					sbc edx+3
  2119 					sta edx+3
  2120
  2121 					rts
  2122 				.endp
  2123
  2124
  2125 2467			.proc	fmul10
  2126 					asl edx		;multiply by 2
  2127 					rol edx+1	;temp store in ZTMP
  2128 					rol edx+2
  2129 					rol edx+3
  2130
  2131 					lda edx
  2132 					sta ztmp
  2133 					lda edx+1
  2134 					sta ztmp+1
  2135 					lda edx+2
  2136 					sta ztmp+2
  2137 					lda edx+3
  2138 					sta ztmp+3
  2139
  2140 					asl edx
  2141 					rol edx+1
  2142 					rol edx+2
  2143 					rol edx+3
  2144
  2145 					asl edx
  2146 					rol edx+1
  2147 					rol edx+2
  2148 					rol edx+3
  2149
  2150 2467			add32bit
  2151 					lda edx
  2152 					add ztmp
  2153 					sta edx
  2154 					lda edx+1
  2155 					adc ztmp+1
  2156 					sta edx+1
  2157 					lda edx+2
  2158 					adc ztmp+2
  2159 					sta edx+2
  2160 					lda edx+3
  2161 					adc ztmp+3
  2162 					sta edx+3
  2163
  2164 					rts
  2165 				.endp
  2166
  2167
  2168 2467			.proc	@trunc
  2169
  2170 					ldy :STACKORIGIN+STACKWIDTH*3,x
  2171 					spl
  2172 					jsr negCARD
  2173
  2174 					mva :STACKORIGIN+STACKWIDTH,x :STACKORIGIN,x
  2175 					mva :STACKORIGIN+STACKWIDTH*2,x :STACKORIGIN+STACKWIDTH,x
  2176 					mva :STACKORIGIN+STACKWIDTH*3,x :STACKORIGIN+STACKWIDTH*2,x
  2177 					mva #$00 :STACKORIGIN+STACKWIDTH*3,x
  2178
  2179 					tya
  2180 					spl
  2181 					jsr negCARD
  2182
  2183 					rts
  2184 				.endp
  2185
  2186
  2187 2467			.proc	@round
  2188
  2189 					ldy :STACKORIGIN+STACKWIDTH*3,x
  2190 					spl
  2191 					jsr negCARD
  2192
  2193 					lda :STACKORIGIN,x
  2194 				//	add #$80
  2195 					cmp #$80
  2196 					lda :STACKORIGIN+STACKWIDTH,x
  2197 					adc #0
  2198 					sta :STACKORIGIN,x
  2199 					lda :STACKORIGIN+STACKWIDTH*2,x
  2200 					adc #0
  2201 					sta :STACKORIGIN+STACKWIDTH,x
  2202 					lda :STACKORIGIN+STACKWIDTH*3,x
  2203 					adc #0
  2204 					sta :STACKORIGIN+STACKWIDTH*2,x
  2205
  2206 					mva #$00 :STACKORIGIN+STACKWIDTH*3,x
  2207
  2208 					tya
  2209 					spl
  2210 					jsr negCARD
  2211
  2212 					rts
  2213 				.endp
  2214
  2215
  2216 2467			.proc	@frac
  2217
  2218 					ldy :STACKORIGIN+STACKWIDTH*3,x
  2219 					spl
  2220 					jsr negCARD
  2221
  2222 					lda #$00
  2223 					sta :STACKORIGIN+STACKWIDTH,x
  2224 					sta :STACKORIGIN+STACKWIDTH*2,x
  2225 					sta :STACKORIGIN+STACKWIDTH*3,x
  2226
  2227 					tya
  2228 					spl
  2229 					jsr negCARD
  2230
  2231 					rts
  2232 				.endp
  2233
  2234
  2235 2467			.proc	@int
  2236
  2237 					ldy :STACKORIGIN+STACKWIDTH*3,x
  2238 					spl
  2239 					jsr negCARD
  2240
  2241 					lda #$00
  2242 					sta :STACKORIGIN,x
  2243
  2244 					tya
  2245 					spl
  2246 					jsr negCARD
  2247
  2248 					rts
  2249 				.endp
  2250
  2251
  2252 				;----------------------------;
  2253 				; Biblioteka procedur        ;
  2254 				; graficznych                ;
  2255 				;----------------------------;
  2256 				; Autorzy:                   ;
  2257 				;  Slawomir 'SERO' Ritter,   ;
  2258 				;  Jakub Cebula,             ;
  2259 				;  Winfried Hofacker         ;
  2260 				;----------------------------;
  2261 				; Wersja:1.1 DATA:09.01.2008 ;
  2262 				;----------------------------;
  2263
  2264 = 0003			@open	= $03		; Otworz kanal
  2265 = 000C			@close	= $0c		; Zamknij kanal
  2266
  2267 = 0007			@IDget	= $07		; Narysuj punkt
  2268 = 0009			@IDput	= $09		; Narysuj punkt
  2269 = 0011			@IDdraw	= $11		; Narysuj linie
  2270 = 0012			@IDfill	= $12		; Wypelnij obszar
  2271
  2272
  2273 				;------------------------;
  2274 				;Wy:.Y-numer bledu (1-OK);
  2275 				;   f(N)=1-wystapil blad ;
  2276 				;------------------------;
  2277 2467			.proc	@COMMAND
  2278
  2279 2467 A2 00			ldx	#$00
  2280 = 2468			scrchn	equ *-1
  2281
  2282 2469 9D 42 03			sta	iocom,x
  2283
  2284 246C A9 00			lda	#$00
  2285 = 246D			colscr	equ *-1
  2286 246E 8D FB 02			sta	atachr
  2287
  2288 2471 4C 56 E4			jmp	ciov
  2289 				.endp
  2290
  2291 				;------------------------;
  2292 				; Ustaw tryb ekranu      ;
  2293 				;------------------------;
  2294 				;We:.X-numer kanalu      ;
  2295 				;      (normalnie 0)     ;
  2296 				;   .Y-numer trybu (O.S.);
  2297 				;   .A-Ustawiony bit nr :;
  2298 				;     5-Nie kasowanie    ;
  2299 				;       pamieci ekranu   ;
  2300 				;     4-Obecnosc okna    ;
  2301 				;       tekstowego       ;
  2302 				;     2-Odczyt z ekranu  ;
  2303 				;------------------------;
  2304 				;Wy:SCRCHN-numer kanalu  ;
  2305 				;  .Y-numer bledu (1-OK) ;
  2306 				;   f(N)=1 wystapil blad ;
  2307 				;------------------------;
  2308 2474			@GRAPHICS .proc (.byte x,y,a) .reg
  2309
  2310 2474 8D 83 24			sta	byte1
  2311 2477 8C 8A 24			sty	byte2
  2312
  2313 247A 8E 68 24			stx	@COMMAND.scrchn
  2314
  2315 247D A9 0C			lda	#@close
  2316 247F 20 9A 24			jsr	xcio
  2317
  2318 2482 A9 00			lda	#0		; =opcje
  2319 = 2483			byte1	equ	*-1
  2320 2484 09 08			ora	#8		; +zapis na ekranie
  2321 2486 9D 4A 03			sta	ioaux1,x
  2322
  2323 2489 A9 00			lda	#0
  2324 = 248A			byte2	equ	*-1
  2325 248B 9D 4B 03			sta	ioaux2,x	;=nr.trybu
  2326
  2327 248E A9 A0 9D 44 03 A9 + 	mwa	#sname	ioadr,x
  2328
  2329 2498 A9 03			lda	#@open
  2330
  2331 249A 9D 42 03		xcio	sta iocom,x
  2332 249D 4C 56 E4			jmp ciov
  2333
  2334 24A0 53 3A 9B		sname	dta c'S:',$9b
  2335
  2336 					.endp
  2337
  2338
  2339 24A3			.proc	@ata2int
  2340 				        asl
  2341 				        php
  2342 				        cmp #2*$60
  2343 				        bcs @+
  2344 				        sbc #2*$20-1
  2345 				        bcs @+
  2346 				        adc #2*$60
  2347 24A3			@       plp
  2348 				        ror
  2349 					rts
  2350 				.endp
  2351
  2352
  2353 				/*
  2354 				  PUT CHAR
  2355
  2356 				  Procedura wyprowadza znak na ekran na pozycji X/Y kursora okreslonej przez zmienne odpowiednio
  2357 				  COLCRS ($55-$56) i ROWCRS ($54). Zaklada sie, ze obowiazuja przy tym domyslne ustawienia OS-u,
  2358 				  to jest ekran jest w trybie Graphics 0, a kanal IOCB 0 jest otwarty dla edytora ekranowego.
  2359
  2360 				  Wyprowadzenie znaku polega na zaladowaniu jego kodu ATASCII do akumulatora i wykonaniu rozkazu
  2361 				  JSR PUTCHR.
  2362 				*/
  2362
  2363
  2364 24A3			.proc	@putchar (.byte a) .reg
  2365
  2366 24A3			vbxe	bit *
  2367
  2368 					ldx #$00
  2369 					.ifdef MAIN.CRT.TextAttr
  2370 					ora MAIN.CRT.TextAttr
  2371 					.endif
  2372 					tay
  2373 					lda icputb+1,x
  2374 					pha
  2375 					lda icputb,x
  2376 					pha
  2377 					tya
  2378
  2379 					rts
  2380
  2381 				.endp
  2382
  2383
  2384 				/*
  2385 				  GETLINE
  2386
  2387 				  Program czeka, az uzytkownik wpisze ciag znak�w z klawiatury i nacisnie klawisz RETURN.
  2388 				  Znaki podczas wpisywania sa wyswietlane na ekranie, dzialaja tez normalne znaki kontrolne
  2389 				  (odczyt jest robiony z edytora ekranowego).
  2390
  2391 				  Wywolanie funkcji polega na zaladowaniu adresu, pod jaki maja byc wpisane znaki,
  2392 				  do rejestr�w A/Y (mlodszy/starszy) i wykonaniu rozkazu JSR GETLINE.
  2393
  2394 				*/
  2394
  2395
  2396 24A3			.proc	@GetLine
  2397
  2398 					stx @sp
  2399
  2400 					ldx #0
  2401
  2402 					stx MAIN.SYSTEM.EoLn
  2403
  2404 					mwa	#@buf+1	icbufa,x
  2405
  2406 					mwa	#$ff	icbufl,x	; maks. wielkosc tekstu
  2407
  2408 					mva	#$05	iccmd,x
  2409
  2410 					jsr	ciov
  2411
  2412 					dew icbufl
  2413 					mva icbufl @buf			; length
  2414
  2415 					ldx @buf+1
  2416 					cpx #EOL
  2417 					bne skp
  2418
  2419 					ldx #TRUE
  2420 					stx MAIN.SYSTEM.EoLn
  2421 24A3			skp
  2422 					ldx #0
  2423 24A3			@sp	equ *-1
  2424
  2425 					rts
  2426 				.endp
  2427
  2428
  2429 24A3			.proc	@GetKey
  2430
  2431 24A3 AD FC 02		getk	lda kbcodes	; odczytaj kbcodes
  2432 24A6 C9 FF			cmp #255		; czy jest znak?
  2433 24A8 F0 F9			beq getk	; nie: czekaj
  2434 24AA A0 FF			ldy #255		; daj zna�, �e klawisz
  2435 24AC 8C FC 02			sty kbcodes	; zosta� odebrany
  2436 24AF A8				tay		; kod klawisza jako indeks
  2437 24B0 B1 79			lda (keydef),y	; do tablicy w ROM-ie
  2438
  2439 24B2 60				rts
  2440 				.endp
  2441
  2442
  2443 24B3			.proc	@moveSTRING (.word ya) .reg
  2444
  2445 					sta @move.dst
  2446 					sty @move.dst+1
  2447
  2448 					mva :STACKORIGIN,x @move.src
  2449 					mva :STACKORIGIN+STACKWIDTH,x @move.src+1
  2450
  2451 					ldy #$00
  2452 					lda (@move.src),y
  2453 					add #1
  2454 					sta @move.cnt
  2455 					scc
  2456 					iny
  2457 					sty @move.cnt+1
  2458
  2459 					jmp @move
  2460 				.endp
  2461
  2462
  2463 24B3			.proc	@moveSTRING_1 (.word ya) .reg
  2464
  2465 					sta @move.dst
  2466 					sty @move.dst+1
  2467
  2468 					mva :STACKORIGIN,x @move.src
  2469 					mva :STACKORIGIN+STACKWIDTH,x @move.src+1
  2470
  2471 					ldy #$00
  2472 					lda (@move.src),y
  2473 				;	add #1
  2474 					sta @move.cnt
  2475 					sty @move.cnt+1
  2476
  2477 					inw @move.src
  2478
  2479 					jmp @move
  2480 				.endp
  2481
  2482
  2483 				; Ullrich von Bassewitz, 2003-08-20
  2484 				; Performance increase (about 20%) by
  2485 				; Christian Krueger, 2009-09-13
  2486
  2487 24B3			.proc	@moveu		; assert Y = 0
  2488
  2489 = 0086			ptr1	= edx
  2490 = 008A			ptr2	= ecx
  2491 = 0082			ptr3	= eax
  2492
  2493 					stx @sp
  2494
  2495 					ldy	#0
  2496
  2497 					ldx     ptr3+1		; Get high byte of n
  2498 					beq     L2		; Jump if zero
  2499
  2500 				L1:     .rept 2		; Unroll this a bit to make it faster...
  2501 					LDA     (PTR1),Y	
  2502 					STA     (PTR2),Y
  2503 					INY
  2504 					.ENDR
  2504 					.endr
Source: REPT
  2501 					LDA     (PTR1),Y	
  2501 					STA     (PTR2),Y
  2501 					INY
  2501 					LDA     (PTR1),Y	
  2501 					STA     (PTR2),Y
  2501 					INY
Source: cpu6502.asm
  2505
  2506 					bne     L1
  2507 					inc     ptr1+1
  2508 					inc     ptr2+1
  2509 					dex			; Next 256 byte block
  2510 					bne	L1		; Repeat if any
  2511
  2512 					; the following section could be 10% faster if we were able to copy
  2513 					; back to front - unfortunately we are forced to copy strict from
  2514 					; low to high since this function is also used for
  2515 					; memmove and blocks could be overlapping!
  2516 					; {
  2517 24B3			L2:				; assert Y = 0
  2518 					ldx     ptr3		; Get the low byte of n
  2519 					beq     done		; something to copy
  2520
  2521 24B3			L3:     lda     (ptr1),Y	; copy a byte
  2522 					sta     (ptr2),Y
  2523 					iny
  2524 					dex
  2525 					bne     L3
  2526
  2527 					; }
  2528
  2529 24B3			done	ldx #0
  2530 24B3			@sp	equ *-1
  2531 					rts
  2532 				.endp
  2533
  2534
  2535 24B3			@move	.proc (.word ptr1, ptr2, ptr3) .var
  2536
  2537 = 0086			ptr1	= edx
  2538 = 008A			ptr2	= ecx
  2539 = 0082			ptr3	= eax
  2540
  2541 = 0086			src	= ptr1
  2542 = 008A			dst	= ptr2
  2543 = 0082			cnt	= ptr3
  2544
  2545 					cpw ptr2 ptr1
  2546 					scs
  2547 					jmp @moveu
  2548
  2549 					stx @sp
  2550
  2551 				; Copy downwards. Adjust the pointers to the end of the memory regions.
  2552
  2553 					lda     ptr1+1
  2554 					add     ptr3+1
  2555 					sta     ptr1+1
  2556
  2557 					lda     ptr2+1
  2558 					add     ptr3+1
  2559 					sta     ptr2+1
  2560
  2561 				; handle fractions of a page size first
  2562
  2563 					ldy     ptr3		; count, low byte
  2564 					bne     @entry		; something to copy?
  2565 					beq     PageSizeCopy	; here like bra...
  2566
  2567 24B3			@copyByte:
  2568 					lda     (ptr1),y
  2569 					sta     (ptr2),y
  2570 24B3			@entry:
  2571 					dey
  2572 					bne     @copyByte
  2573 					lda     (ptr1),y	; copy remaining byte
  2574 					sta     (ptr2),y
  2575
  2576 24B3			PageSizeCopy:			; assert Y = 0
  2577 					ldx     ptr3+1		; number of pages
  2578 					beq     done		; none? -> done
  2579
  2580 24B3			@initBase:
  2581 					dec     ptr1+1		; adjust base...
  2582 					dec     ptr2+1
  2583 					dey			; in entry case: 0 -> FF
  2584 					lda     (ptr1),y	; need to copy this 'intro byte'
  2585 					sta     (ptr2),y	; to 'land' later on Y=0! (as a result of the '.repeat'-block!)
  2586 					dey			; FF ->FE
  2587 24B3			@copyBytes:
  2588 					.rept 2		; Unroll this a bit to make it faster...
  2589 					LDA     (PTR1),Y
  2590 					STA     (PTR2),Y
  2591 					DEY
  2592 					.ENDR
  2592 					.endr
Source: REPT
  2589 					LDA     (PTR1),Y
  2589 					STA     (PTR2),Y
  2589 					DEY
  2589 					LDA     (PTR1),Y
  2589 					STA     (PTR2),Y
  2589 					DEY
Source: cpu6502.asm
  2593 24B3			@copyEntry:			; in entry case: 0 -> FF
  2594 					bne     @copyBytes
  2595 					lda     (ptr1),y	; Y = 0, copy last byte
  2596 					sta     (ptr2),y
  2597 					dex			; one page to copy less
  2598 					bne     @initBase	; still a page to copy?
  2599
  2600 24B3			done	ldx #0
  2601 24B3			@sp	equ *-1
  2602 					rts
  2603 				.endp
  2604
  2605
  2606 				; Ullrich von Bassewitz, 29.05.1998
  2607 				; Performance increase (about 20%) by
  2608 				; Christian Krueger, 12.09.2009, slightly improved 12.01.2011
  2609
  2610 24B3			.proc	@fill (.word ptr1, ptr3 .byte ptr2) .var
  2611
  2612 = 0086			ptr1 = edx
  2613 = 008A			ptr3 = ecx
  2614 = 0082			ptr2 = eax
  2615
  2616 24B3 8A 48			txa:pha
  2617
  2618 24B5 A6 82			ldx ptr2
  2619
  2620 24B7 A0 00			ldy #0
  2621
  2622 24B9 46 8B		        lsr	ptr3+1          ; divide number of
  2623 24BB 66 8A		        ror	ptr3            ; bytes by two to increase
  2624 24BD 90 09		        bcc	evenCount       ; speed (ptr3 = ptr3/2)
  2625 24BF			oddCount:
  2626 								; y is still 0 here
  2627 24BF 8A			        txa			; restore fill value
  2628 24C0 91 86		        sta	(ptr1),y	; save value and increase
  2629 24C2 E6 86		        inc	ptr1		; dest. pointer
  2630 24C4 D0 02		        bne	evenCount
  2631 24C6 E6 87		        inc	ptr1+1
  2632 24C8			evenCount:
  2633 24C8 A5 86			lda	ptr1		; build second pointer section
  2634 24CA 18				clc
  2635 24CB 65 8A			adc	ptr3		; ptr2 = ptr1 + (length/2) <- ptr3
  2636 24CD 85 82			sta     ptr2
  2637 24CF A5 87			lda     ptr1+1
  2638 24D1 65 8B			adc     ptr3+1
  2639 24D3 85 83			sta     ptr2+1
  2640
  2641 24D5 8A			        txa			; restore fill value
  2642 24D6 A6 8B		        ldx	ptr3+1		; Get high byte of n
  2643 24D8 F0 13		        beq	L2		; Jump if zero
  2644
  2645 				; Set 256/512 byte blocks
  2646 								; y is still 0 here
  2647 				L1:	.rept 2		; Unroll this a bit to make it faster
  2648 					STA	(PTR1),Y	
  2649 					STA	(PTR2),Y	
  2650 					INY
  2651 					.ENDR
  2651 					.endr
Source: REPT
  2648 24DA 91 86			STA	(PTR1),Y	
  2648 24DC 91 82			STA	(PTR2),Y	
  2648 24DE C8				INY
  2648 24DF 91 86			STA	(PTR1),Y	
  2648 24E1 91 82			STA	(PTR2),Y	
  2648 24E3 C8				INY
Source: cpu6502.asm
  2652 24E4 D0 F4		        bne	L1
  2653 24E6 E6 87		        inc	ptr1+1
  2654 24E8 E6 83		        inc	ptr2+1
  2655 24EA CA			        dex                     ; Next 256 byte block
  2656 24EB D0 ED		        bne	L1              ; Repeat if any
  2657
  2658 				; Set the remaining bytes if any
  2659
  2660 24ED A4 8A		L2:	ldy	ptr3            ; Get the low byte of n
  2661 24EF F0 07			beq	leave           ; something to set? No -> leave
  2662
  2663 24F1 88			L3:	dey
  2664 24F2 91 86			sta	(ptr1),y	; set bytes in low
  2665 24F4 91 82			sta	(ptr2),y	; and high section
  2666 24F6 D0 F9			bne     L3		; flags still up to date from dey!
  2667
  2668 24F8 68 AA		leave	pla:tax
  2669 24FA 60				rts			; return
  2670 				.endp
  2671
  2672
  2673 				/*
  2674 				 add strings
  2675 				 result -> @buf
  2676 				*/
  2676
  2677 24FB			.proc	@addString(.word ya) .reg
  2678
  2679 					sta ztmp
  2680 					sty ztmp+1
  2681
  2682 					stx @sp
  2683
  2684 					ldx @buf
  2685 					inx
  2686 					beq stop
  2687
  2688 					ldy #0
  2689 					lda (ztmp),y
  2690 					sta ile
  2691 					beq stop
  2692
  2693 					iny
  2694
  2695 24FB			load	lda (ztmp),y
  2696 					sta @buf,x
  2697
  2698 					iny
  2699 					inx
  2700 					beq stop
  2701 					dec ile
  2702 					bne load
  2703
  2704 24FB			stop	dex
  2705 					stx @buf
  2706
  2707 					ldx #0
  2708 24FB			@sp	equ *-1
  2709 					rts
  2710
  2711 24FB			ile	brk
  2712 				.endp
  2713
  2714
  2715 				/* ----------------------------------------------------------------------- */
  2716
  2717
  2718 24FB			.proc	@AllocMem(.word ztmp .word ztmp+2) .var
  2719
  2720 					jsr swap
  2721
  2722 					adw spoint ztmp+2
  2723
  2724 					rts
  2725
  2726 24FB			swap	txa:pha
  2727
  2728 					mwa spoint bp2
  2729
  2730 					ldx #0
  2731 					ldy #0
  2732
  2733 24FB			loop	cpy ztmp+2
  2734 					bne @+
  2735 					cpx ztmp+3
  2736 					beq stop
  2737
  2738 24FB			@	lda (bp2),y
  2739 					pha
  2740
  2741 					lda (ztmp),y
  2742 					sta (bp2),y
  2743
  2744 					pla
  2745 					sta (ztmp),y
  2746
  2747 					iny
  2748 					bne loop
  2749
  2750 					inc ztmp+1
  2751 					inc bp2+1
  2752 					inx
  2753
  2754 					jmp loop
  2755
  2756 24FB			stop	pla:tax
  2757
  2758 					rts
  2759
  2760 24FB			spoint	dta a(PROGRAMSTACK)
  2761 				.endp
  2762
  2763
  2764 24FB			.proc	@FreeMem(.word ztmp .word ztmp+2) .var
  2765
  2766 					sbw @AllocMem.spoint ztmp+2
  2767
  2768 					jmp @AllocMem.swap
  2769 				.endp
  2770
  2771
  2772 				/* ----------------------------------------------------------------------- */
  2773
  2774
  2775 24FB			.proc	@vbxe_detect
  2776
  2777 					ldy #.sizeof(detect)-1
  2778 					mva:rpl copy,y detect,y-
  2779
  2780 					jmp detect
  2781
  2782 24FB			copy
  2783 0400				.local	detect,@buf
  2784 				;
  2785 				; 2009 by KMK/DLT
  2786 				;
  2787 					lda #0
  2788 					sta fxptr
  2789
  2790 				        lda #$d6
  2791 				        sta fxptr+1
  2792 				        ldy #FX_MEMB
  2793 				        jsr ?clr
  2794
  2795 				        jsr ?try
  2796 				        bcc ok
  2797
  2798 				        inc fxptr+1
  2799
  2800 					jsr ?try
  2801 					bcc ok
  2802
  2803 					lda #0
  2804 					sta fxptr+1
  2805 					rts
  2806
  2807 0400			?try    ldx $4000
  2808 				        jsr ?chk
  2809 				        bcc ?ret
  2810 				        inx
  2811 				        stx $4000
  2812 				        jsr ?chk
  2813 				        dec $4000
  2814 0400			?ret    rts
  2815
  2816 0400			ok	ldy	#VBXE_MINOR		; get core minor version
  2817 					lda	(fxptr),y
  2818 					rts
  2819
  2820 0400			?chk    lda #$80
  2821 				        jsr _vbxe_write
  2822 				        cpx $4000
  2823 				        bne ?fnd
  2824 				        sec
  2825 0400			        .byte $24
  2826 0400			?fnd    clc
  2827 0400			?clr    lda #$00
  2828 0400			_vbxe_write
  2829 				        sta (fxptr),y
  2830 				        rts
  2831
  2832 				/*
  2833 					lda	#0
  2834 					ldx	#0xd6
  2835 					sta	0xd640			; make sure it isn't coincidence
  2836 					lda	0xd640
  2837 					cmp	#0x10			; do we have major version here?
  2838 					beq	VBXE_Detected		; if so, then VBXE is detected
  2839 					lda	#0
  2840 					inx
  2841 					sta	0xd740			; no such luck, try other location
  2842 					lda	0xd740
  2843 					cmp	#0x10
  2844 					beq	VBXE_Detected
  2845 					ldx 	#0  			; not here, so not present or FX core version too low
  2846 					stx	fxptr+1
  2847 					stx	fxptr
  2848
  2849 					sec
  2850 					rts
  2851
  2852 				VBXE_Detected
  2853 					stx	fxptr+1
  2854 					lda	#0
  2855 					sta	fxptr
  2856
  2857 					ldy	#VBXE_MINOR		; get core minor version
  2858 					lda	(fxptr),y
  2859
  2860 					clc
  2861 					rts	 			; x - page of vbxe
  2862 				*/
  2862
  2863
  2864 					.endl
  2865
  2866 				.endp
  2867
  2868
  2869 24FB			.proc	@setxdl(.byte a) .reg
  2870
  2871 					asl @
  2872 					sta idx
  2873
  2874 					fxs FX_MEMS #$80+MAIN.SYSTEM.VBXE_XDLADR/$1000
  2875
  2876 					ldy #0
  2877 24FB			idx	equ *-1
  2878
  2879 					lda MAIN.SYSTEM.VBXE_WINDOW+s@xdl.xdlc
  2880 					and msk,y
  2881 					ora val,y
  2882 					sta MAIN.SYSTEM.VBXE_WINDOW+s@xdl.xdlc
  2883
  2884 					lda MAIN.SYSTEM.VBXE_WINDOW+s@xdl.xdlc+1
  2885 					and msk+1,y
  2886 					ora val+1,y
  2887 					sta MAIN.SYSTEM.VBXE_WINDOW+s@xdl.xdlc+1
  2888
  2889 					fxs FX_MEMS #0
  2890 					rts
  2891
  2892 24FB			msk	.array [6] .word
  2893 					[e@xdl.mapon]  = [XDLC_MAPON|XDLC_MAPOFF]^$FFFF
  2894 					[e@xdl.mapoff] = [XDLC_MAPON|XDLC_MAPOFF]^$FFFF
  2895 					[e@xdl.ovron]  = [XDLC_GMON|XDLC_OVOFF|XDLC_LR|XDLC_HR]^$FFFF
  2896 					[e@xdl.ovroff] = [XDLC_GMON|XDLC_OVOFF|XDLC_LR|XDLC_HR]^$FFFF
  2897 					[e@xdl.hr]     = [XDLC_GMON|XDLC_OVOFF|XDLC_LR|XDLC_HR]^$FFFF
  2898 					[e@xdl.lr]     = [XDLC_GMON|XDLC_OVOFF|XDLC_LR|XDLC_HR]^$FFFF
  2899 					.enda
  2900
  2901 24FB			val	.array [6] .word
  2902 					[e@xdl.mapon]  = XDLC_MAPON
  2903 					[e@xdl.mapoff] = XDLC_MAPOFF
  2904 					[e@xdl.ovron]  = XDLC_GMON
  2905 					[e@xdl.ovroff] = XDLC_OVOFF
  2906 					[e@xdl.hr]     = XDLC_GMON|XDLC_HR
  2907 					[e@xdl.lr]     = XDLC_GMON|XDLC_LR
  2908 					.enda
  2909
  2910 				.endp
  2911
  2912
  2913 24FB			.proc	@vbxe_init
  2914
  2915 					fxs FX_MEMC #%1000+>MAIN.SYSTEM.VBXE_WINDOW	; $b000..$bfff (4K window), cpu on, antic off
  2916 					fxs FX_MEMS #$80+MAIN.SYSTEM.VBXE_XDLADR/$1000	; enable VBXE BANK #0
  2917
  2918 					ldx #.sizeof(s@xdl)-1
  2919 					mva:rpl xdlist,x MAIN.SYSTEM.VBXE_XDLADR+MAIN.SYSTEM.VBXE_WINDOW,x-
  2920
  2921 					jsr cmapini		; init color map
  2922
  2923 					fxsa FX_P1		; A = 0
  2924 					fxsa FX_P2
  2925 					fxsa FX_P3
  2926
  2927 					fxsa FX_IRQ_CONTROL
  2928 					fxsa FX_BLITTER_START
  2929
  2930 					fxsa FX_XDL_ADR0	; XDLIST PROGRAM ADDRES (VBXE_XDLADR = $0000) = bank #0
  2931 					fxsa FX_XDL_ADR1
  2932 					fxsa FX_XDL_ADR2
  2933
  2934 					sta colpf0s
  2935
  2936 					fxs FX_P0 #$ff
  2937
  2938 					mwa #@vbxe_cmap @putchar.vbxe+1
  2939 					mva #{jsr*} @putchar.vbxe
  2940
  2941 					fxs FX_VIDEO_CONTROL #VC_XDL_ENABLED|VC_XCOLOR	;|VC_NO_TRANS
  2942
  2943 					rts
  2944
  2945 24FB			cmapini	lda colpf1s
  2946 					and #$0f
  2947 					sta colpf1s
  2948
  2949 					lda #$80+MAIN.SYSTEM.VBXE_MAPADR/$1000
  2950 					sta ztmp
  2951
  2952 					mva #4 ztmp+1
  2953
  2954 24FB			loop	fxs FX_MEMS ztmp
  2955
  2956 					lda >MAIN.SYSTEM.VBXE_WINDOW
  2957 					sta bp+1
  2958
  2959 					ldx #16
  2960 					ldy #0
  2961
  2962 24FB			lop	mva #$00	(bp),y+
  2963 					mva colpf1s	(bp),y+
  2964 					mva colpf2s	(bp),y+
  2965 					mva #%00010000	(bp),y+		; overlay palette #1
  2966 					bne lop
  2967
  2968 					inc bp+1
  2969 					dex
  2970 					bne lop
  2971
  2972 					inc ztmp
  2973
  2974 					dec ztmp+1
  2975 					bne loop
  2976
  2977 					fxs FX_MEMS #$00		; disable VBXE BANK
  2978 					rts
  2979
  2980 				xdlist	dta s@xdl [0] (XDLC_RPTL, 24-1,\
  2981 					XDLC_END|XDLC_RPTL|XDLC_MAPON|XDLC_MAPADR|XDLC_OVADR|XDLC_MAPPAR|XDLC_OVATT,\	;|XDLC_GMON,\
  2982 					192-1, MAIN.SYSTEM.VBXE_OVRADR, 320,\
  2983 					MAIN.SYSTEM.VBXE_MAPADR, $100,\
  2984 					0, 0, 7, 7, %00010001, $ff)
  2984 24FB			XDLIST	DTA S@XDL [0] (XDLC_RPTL, 24-1,	XDLC_END|XDLC_RPTL|XDLC_MAPON|XDLC_MAPADR|XDLC_OVADR|XDLC_MAPPAR|XDLC_OVATT,	192-1, MAIN.SYSTEM.VBXE_OVRADR, 320,	MAIN.SYSTEM.VBXE_MAPADR, $100,	0, 0, 7, 7, %00010001, $ff)
  2985 				.endp
  2986
  2987
  2988 24FB			.proc	@vbxe_cmap
  2989
  2990 					pha
  2991
  2992 					cmp #eol
  2993 					beq stop
  2994
  2995 					cmp #$7d		; clrscr
  2996 					bne skp
  2997
  2998 					jsr @vbxe_init.cmapini
  2999 					jmp stop
  3000
  3001 24FB			skp	lda rowcrs
  3002 					pha
  3003 24FB				:4 lsr @
  3004 					add #$80+MAIN.SYSTEM.VBXE_MAPADR/$1000
  3005 					fxsa FX_MEMS
  3006
  3007 					pla
  3008 					and #$0f
  3009 					add >MAIN.SYSTEM.VBXE_WINDOW
  3010 					sta bp+1
  3011
  3012 					lda colcrs
  3013 					asl @
  3014 					asl @
  3015 					tay
  3016 					mva colpf0s (bp),y
  3017 					iny
  3018 					mva colpf1s (bp),y
  3019 					iny
  3020 					mva colpf2s (bp),y
  3021
  3022 					fxs FX_MEMS #$00
  3023
  3024 24FB			stop	pla
  3025
  3026 					rts
  3027 				.endp
  3028
  3029
  3030 				/* ----------------------------------------------------------------------- */
  3031
  3032
  3033 				/*
  3034 				.proc	@cmdline (.byte a) .reg
  3035
  3036 					stx @sp
  3037
  3038 					sta idpar
  3039
  3040 					lda #0
  3041 					sta parno
  3042
  3043 					lda boot?		; sprawdzamy, czy DOS w ogole jest w pamieci
  3044 					lsr
  3045 					bcc _no_command_line
  3046
  3047 					lda dosvec+1		; a jesli tak, czy DOSVEC nie wskazuje ROM-u
  3048 					cmp #$c0
  3049 					bcs _no_command_line
  3050
  3051 					ldy #$03
  3052 					lda (dosvec),y
  3053 					cmp #{jmp}
  3054 					bne _no_command_line
  3055
  3056 					ldy #$0a		; COMTAB+$0A (BUFOFF)
  3057 					lda (dosvec),y
  3058 					sta lbuf
  3059 					iny
  3060 					lda (dosvec),y
  3061 					sta hbuf
  3062
  3063 					adw dosvec #3 zcr
  3064
  3065 				loop	lda #0
  3066 					sta @buf
  3067
  3068 					jsr $ffff
  3069 				zcr	equ *-2
  3070 					beq stop
  3071
  3072 					lda idpar
  3073 					bne skp
  3074
  3075 					ldy #33			; ParamStr(0)
  3076 				_par0	lda (dosvec),y
  3077 					sta @buf-33+1,y
  3078 					iny
  3079 					cpy #36
  3080 					bne _par0
  3081
  3082 					lda #3
  3083 					sta @buf
  3084 					bne stop
  3085
  3086 				skp	ldy #36
  3087 				_cp	lda (dosvec),y
  3088 					sta @buf-36+1,y
  3089 					iny
  3090 					cmp #$9b
  3091 					bne _cp
  3092
  3093 					tya
  3094 					sub #37
  3095 					sta @buf
  3096
  3097 					inc parno
  3098 					lda #0
  3099 				parno	equ *-1
  3100 					cmp #0
  3101 				idpar	equ *-1
  3102
  3103 					bne loop
  3104
  3105 				stop	ldy #$0a		; przywracamy poprzednia wartosc BUFOFF
  3106 					lda #0
  3107 				lbuf	equ *-1
  3108 					sta (dosvec),y
  3109 					iny
  3110 					lda #0
  3111 				hbuf	equ *-1
  3112 					sta (dosvec),y
  3113
  3114 				_no_command_line		; przeskok tutaj oznacza brak dostepnosci wiersza polecen
  3115
  3116 					lda parno
  3117
  3118 					ldx #0
  3119 				@sp	equ *-1
  3120 					rts
  3121 				.endp
  3122 				*/
  3122
  3123
  3124
  3125 24FB			.proc	@CmdLine (.byte a) .reg
  3126
  3127 					stx @sp
  3128
  3129 					sta idpar
  3130
  3131 					lda #0
  3132 					sta parno
  3133 					sta loop+1
  3134
  3135 					lda	#{jsr*}
  3136 					sta	res
  3137
  3138 				; Get filename from SpartaDOS...
  3139 24FB			get_param
  3140 					lda boot?		; sprawdzamy, czy DOS w ogole jest w pamieci
  3141 					lsr
  3142 					bcc no_sparta
  3143
  3144 					lda dosvec+1		; a jesli tak, czy DOSVEC nie wskazuje ROM-u
  3145 					cmp #$c0
  3146 					bcs no_sparta
  3147
  3148 					ldy #$03
  3149 					lda (dosvec),y
  3150 					cmp #{jmp}
  3151 					bne no_sparta
  3152
  3153 					ldy #$0a		; COMTAB+$0A (BUFOFF)
  3154 					lda (dosvec),y
  3155 					sta lbuf
  3156 					iny
  3157 					lda (dosvec),y
  3158 					sta hbuf
  3159
  3160 					adw dosvec #33 tmp
  3161
  3162 					ldy #0
  3163 24FB			fnm	lda (tmp),y
  3164 					iny
  3165 					cmp #$9b
  3166 					bne fnm
  3167
  3168 					tya			; remove .COM
  3169 					sub #5
  3170 					tay
  3171 					lda #0
  3172 					sta (tmp),y
  3173 					tay
  3174
  3175 					lda	#3
  3176 					sta	loop+1
  3177 					add	dosvec
  3178 					sta	get_adr
  3179 					lda	#0
  3180 					adc	dosvec+1
  3181 					sta	get_adr+1
  3182
  3183 					jmp	_ok
  3184
  3185 24FB			no_sparta
  3186 					mwa #next get_adr
  3187
  3188 					lda	#{bit*}
  3189 					sta	res
  3190
  3191 				; ... or channel #0
  3192 					lda	MAIN.IOCB@COPY+2	; command
  3193 					cmp	#5			; read line
  3194 					bne	_no_command_line
  3195 					lda	MAIN.IOCB@COPY+3	; status
  3196 					bmi	_no_command_line
  3197 				; don't assume the line is EOL-terminated
  3198 				; DOS II+/D overwrites the EOL with ".COM"
  3199 				; that's why we rely on the length
  3200 					lda	MAIN.IOCB@COPY+9	; length hi
  3201 					bne	_no_command_line
  3202 					ldx	MAIN.IOCB@COPY+8	; length lo
  3203 					beq	_no_command_line
  3204 					inx:inx
  3205 					stx	arg_len
  3206 				; give access to three bytes before the input buffer
  3207 				; in DOS II+/D the device prompt ("D1:") is there
  3208 					lda	MAIN.IOCB@COPY+4
  3209 					sub	#3
  3210 					sta	tmp
  3211 					lda	MAIN.IOCB@COPY+5
  3212 					sbc	#0
  3213 					sta	tmp+1
  3214
  3215 					lda	#0
  3216 					ldy	#0
  3217 24FB			arg_len	equ *-1
  3218 					sta	(tmp),y
  3219
  3220
  3221 24FB			loop	ldy	#0
  3222
  3223 24FB			_ok	ldx	#0
  3224
  3225 24FB			lprea	lda	(tmp),y
  3226 					sta	@buf+1,x
  3227
  3228 					beq	stop
  3229
  3230 					cmp	#$9b
  3231 					beq	stop
  3232 					cmp	#' '
  3233 					beq	stop
  3234
  3235 					iny
  3236 					inx
  3237 					cpx #32
  3238 					bne lprea
  3239
  3240 24FB			stop	lda #0
  3241 24FB			parno	equ *-1
  3242 					cmp #0
  3243 24FB			idpar	equ *-1
  3244 					beq found
  3245
  3246 					jsr $ffff		; sty loop+1
  3247 24FB			get_adr	equ *-2
  3248 					beq found
  3249
  3250 					inc parno
  3251 					bne loop
  3252
  3253 24FB			found	lda #0	;+$9b
  3254 					sta @buf+1,x
  3255 					stx @buf
  3256
  3257 24FB			res	jsr sdxres
  3258
  3259 24FB			_no_command_line		; przeskok tutaj oznacza brak dostepnosci wiersza polecen
  3260
  3261 					lda parno
  3262
  3263 					ldx #0
  3264 24FB			@sp	equ *-1
  3265 					rts
  3266
  3267
  3268 24FB			sdxres	ldy #$0a		; przywracamy poprzednia wartosc BUFOFF
  3269 					lda #0
  3270 24FB			lbuf	equ *-1
  3271 					sta (dosvec),y
  3272 					iny
  3273 					lda #0
  3274 24FB			hbuf	equ *-1
  3275 					sta (dosvec),y
  3276 					rts
  3277
  3278
  3279 24FB			_next	iny
  3280 24FB			next	lda (tmp),y
  3281 					beq _eol
  3282 					cmp #' '
  3283 					beq _next
  3284
  3285 					cmp #$9b
  3286 					beq _eol
  3287
  3288 					sty loop+1
  3289 					rts
  3290
  3291 24FB			_eol	lda #0
  3292 					rts
  3293
  3294 				.endp
  3295
  3296
  3297 				/* ----------------------------------------------------------------------- */
  3298
  3299 				/*
  3300 				.proc	@rstsnd
  3301 					lda #0
  3302 					sta $d208
  3303 					sta $d218
  3304
  3305 					ldy #3
  3306 					sty $d20f
  3307 					sty $d21f
  3308 					rts
  3309 				.endp
  3310 				*/
  3310
  3311
  3312 				;	ert (*>$3fff) .and (*<$8000)
  3313
  3314
  3315 				/* ----------------------------------------------------------------------- */
  3316
  3317
  3318 24FB			.proc	@xmsBank
  3319
  3320 = 0082			ptr3 = eax			; position	(4)
  3321
  3322 					mva ptr3+3 ztmp+1	; position shr 14
  3323 					mva ptr3+2 ztmp
  3324 					lda ptr3+1
  3325
  3326 					.rept 6
  3327 					LSR ZTMP+1
  3328 					ROR ZTMP
  3329 					ROR @
  3330 					.ENDR
  3330 					.endr
Source: REPT
  3327 					LSR ZTMP+1
  3327 					ROR ZTMP
  3327 					ROR @
  3327 					LSR ZTMP+1
  3327 					ROR ZTMP
  3327 					ROR @
  3327 					LSR ZTMP+1
  3327 					ROR ZTMP
  3327 					ROR @
  3327 					LSR ZTMP+1
  3327 					ROR ZTMP
  3327 					ROR @
  3327 					LSR ZTMP+1
  3327 					ROR ZTMP
  3327 					ROR @
  3327 					LSR ZTMP+1
  3327 					ROR ZTMP
  3327 					ROR @
Source: cpu6502.asm
  3331
  3332 					tax			; index to bank
  3333
  3334 					lda portb
  3335 					and #1
  3336 					ora main.misc.adr.banks,x
  3337 					sta portb
  3338
  3339 					lda ptr3 		; offset
  3340 					sta ztmp
  3341 					lda ptr3+1
  3342 					and #$3f
  3343 					ora #$40
  3344 					sta ztmp+1
  3345
  3346 					rts
  3347 				.endp
  3348
  3349
  3350 24FB			.proc	@xmsReadBuf (.word ptr1, ptr2) .var
  3351
  3352 = 0086			ptr1 = dx	; buffer	(2)
  3353
  3354 = 008A			ptr2 = cx	; count		(2)
  3355 = 008C			pos = cx+2	; position	(2) pointer
  3356
  3357 = 0082			ptr3 = eax	; position	(4)
  3358
  3359 					txa:pha
  3360
  3361 					ldy #0
  3362 					lda (pos),y
  3363 					sta ptr3
  3364 					iny
  3365 					lda (pos),y
  3366 					sta ptr3+1
  3367 					iny
  3368 					lda (pos),y
  3369 					sta ptr3+2
  3370 					iny
  3371 					lda (pos),y
  3372 					sta ptr3+3
  3373
  3374 					lda ptr2+1
  3375 					beq lp2
  3376
  3377 24FB			lp1	jsr @xmsBank
  3378
  3379 					lda ztmp+1
  3380 					cmp #$7f
  3381 					bne skp
  3382 					lda ztmp
  3383 					beq skp
  3384
  3385 					lda #0
  3386 					jsr nextBank
  3387 					jmp skp2
  3388
  3389 24FB			skp	ldy #0
  3390 					mva:rne (ztmp),y @buf,y+
  3391
  3392 24FB			skp2	lda portb
  3393 					and #1
  3394 					ora #$fe
  3395 					sta portb
  3396
  3397 					ldy #0
  3398 					mva:rne @buf,y (dx),y+
  3399
  3400 					inc dx+1	// inc(dx, $100)
  3401
  3402 					inl ptr3+1	// inc(position, $100)
  3403
  3404 					dec ptr2+1
  3405 					bne lp1
  3406
  3407 24FB			lp2	jsr @xmsBank
  3408
  3409 					lda ztmp+1		; zakonczenie kopiowania
  3410 					cmp #$7f		; jesli przekraczamy granice banku $7FFF
  3411 					bne skp_
  3412
  3413 					lda ztmp
  3414 					add ptr2
  3415 					bcc skp_
  3416
  3417 					lda ptr2		; to realizuj wyjatek NEXTBANK, kopiuj PTR2 bajtow
  3418 					jsr nextBank
  3419 					jmp skp3
  3420
  3421 24FB			skp_	ldy #0
  3422 24FB			mv	lda (ztmp),y
  3423 					sta @buf,y
  3424 					iny
  3425 					cpy ptr2
  3426 					bne mv
  3427
  3428 24FB			skp3	lda portb
  3429 					and #1
  3430 					ora #$fe
  3431 					sta portb
  3432
  3433 					ldy #0
  3434 24FB			lp3	lda @buf,y
  3435 					sta (dx),y
  3436 					iny
  3437 					cpy ptr2
  3438 					bne lp3
  3439
  3440 					jmp @xmsUpdatePosition
  3441
  3442 24FB			.local	nextBank
  3443
  3444 					sta max
  3445
  3446 					mwa ztmp src
  3447
  3448 					ldy #0
  3449 24FB			mv0	lda $ffff,y
  3450 24FB			src	equ *-2
  3451 					sta @buf,y
  3452 					iny
  3453 					inc ztmp
  3454 					bne mv0
  3455
  3456 					lda portb
  3457 					and #1
  3458 					ora main.misc.adr.banks+1,x
  3459 					sta portb
  3460
  3461 					ldx #0
  3462 24FB			mv1	cpy #0
  3463 24FB			max	equ *-1
  3464 					beq stp
  3465 					lda $4000,x
  3466 					sta @buf,y
  3467 					inx
  3468 					iny
  3469 					bne mv1
  3470 24FB			stp	rts
  3471 				.endl
  3472
  3473 				.endp
  3474
  3475
  3476 24FB			.proc	@xmsWriteBuf (.word ptr1, ptr2) .var
  3477
  3478 = 0086			ptr1 = dx	; buffer	(2)
  3479
  3480 = 008A			ptr2 = cx	; count		(2)
  3481 = 008C			pos = cx+2	; position	(2) pointer
  3482
  3483 = 0082			ptr3 = eax	; position	(4)
  3484
  3485 					txa:pha
  3486
  3487 					ldy #0			; przepisz POSITION spod wskaznika
  3488 					lda (pos),y
  3489 					sta ptr3
  3490 					iny
  3491 					lda (pos),y
  3492 					sta ptr3+1
  3493 					iny
  3494 					lda (pos),y
  3495 					sta ptr3+2
  3496 					iny
  3497 					lda (pos),y
  3498 					sta ptr3+3
  3499
  3500 24FB			lp1	lda portb		; wylacz dodatkowe banki
  3501 					and #1
  3502 					ora #$fe
  3503 					sta portb
  3504
  3505 					ldy #0			; przepisz 256b z BUFFER do @BUF
  3506 					mva:rne (dx),y @buf,y+
  3507
  3508 					jsr @xmsBank		; wlacz dodatkowy bank
  3509
  3510 					lda ptr2+1
  3511 					beq lp2
  3512
  3513 					lda ztmp+1		; jesli przekraczamy granice banku $7FFF
  3514 					cmp #$7f
  3515 					bne skp
  3516 					lda ztmp
  3517 					beq skp
  3518
  3519 					lda #0			; to realizuj wyjatek NEXTBANK, kopiuj 256b
  3520 					jsr nextBank
  3521 					jmp skp2
  3522
  3523 24FB			skp	mva:rne @buf,y (ztmp),y+
  3524
  3525 24FB			skp2	inc dx+1		// inc(dx, $100)
  3526
  3527 					inl ptr3+1		// inc(position, $100)
  3528
  3529 					dec ptr2+1
  3530 					bne lp1
  3531
  3532 24FB			lp2	lda ztmp+1		; zakonczenie kopiowania
  3533 					cmp #$7f		; jesli przekraczamy granice banku $7FFF
  3534 					bne skp_
  3535
  3536 					lda ztmp
  3537 					add ptr2
  3538 					bcc skp_
  3539
  3540 					lda ptr2		; to realizuj wyjatek NEXTBANK, kopiuj PTR2 bajtow
  3541 					jsr nextBank
  3542 					jmp quit
  3543
  3544 24FB			skp_	ldy #0
  3545 24FB			lp3	lda @buf,y
  3546 					sta (ztmp),y
  3547
  3548 					iny
  3549 					cpy ptr2
  3550 					bne lp3
  3551
  3552 24FB			quit	lda portb
  3553 					and #1
  3554 					ora #$fe
  3555 					sta portb
  3556
  3557 					jmp @xmsUpdatePosition
  3558
  3559 24FB			.local	nextBank
  3560
  3561 					sta max
  3562
  3563 					mwa ztmp dst
  3564
  3565 					ldy #0
  3566 24FB			mv0	lda @buf,y
  3567 					sta $ffff,y
  3568 24FB			dst	equ *-2
  3569 					iny
  3570 					inc ztmp
  3571 					bne mv0
  3572
  3573 					lda portb
  3574 					and #1
  3575 					ora main.misc.adr.banks+1,x
  3576 					sta portb
  3577
  3578 					ldx #0
  3579 24FB			mv1	cpy #0
  3580 24FB			max	equ *-1
  3581 					beq stp
  3582 					lda @buf,y
  3583 					sta $4000,x
  3584 					inx
  3585 					iny
  3586 					bne mv1
  3587 24FB			stp	rts
  3588 				.endl
  3589
  3590 				.endp
  3591
  3592
  3593 24FB			.proc	@xmsAddPosition
  3594
  3595 24FB				.use @xmsReadBuf
  3596
  3597 					add ptr3
  3598 					sta ptr3
  3599 					lda #$00
  3600 					adc ptr3+1
  3601 					sta ptr3+1
  3602 					lda #$00
  3603 					adc ptr3+2
  3604 					sta ptr3+2
  3605 					lda #$00
  3606 					adc ptr3+3
  3607 					sta ptr3+3
  3608
  3609 					rts
  3610 				.endp
  3611
  3612
  3613 24FB			.proc	@xmsUpdatePosition
  3614
  3615 24FB				.use @xmsReadBuf
  3616
  3617 					tya
  3618 					jsr @xmsAddPosition
  3619
  3620 					ldy #0
  3621 					lda ptr3
  3622 					sta (pos),y
  3623 					iny
  3624 					lda ptr3+1
  3625 					sta (pos),y
  3626 					iny
  3627 					lda ptr3+2
  3628 					sta (pos),y
  3629 					iny
  3630 					lda ptr3+3
  3631 					sta (pos),y
  3632
  3633 					pla:tax
  3634 					rts
  3635 				.endp
  3636
  3637
  3638 				/* ----------------------------------------------------------------------- */
  3639
  3640
  3641 24FB			.proc	@ClrScr
  3642
  3643 					ldx #$00
  3644 					lda #$0c
  3645 					jsr xcio
  3646
  3647 					mwa #ename ioadr,x
  3648
  3649 					mva #$0c ioaux1,x
  3650 					mva #$00 ioaux2,x
  3651
  3652 					lda #$03
  3653
  3654 24FB			xcio	sta iocom,x
  3655 					jmp ciov
  3656
  3657 24FB			ename	.byte 'E:',$9b
  3658
  3659 				.endp
  3660
  3661
  3662 				/* ----------------------------------------------------------------------- */
  3663
  3664
  3665 					opt l+
  1340
  1341 				; -----------------------------------------------------------
  1342
  1343 				.macro UNITINITIALIZATION
  1344 				
  1345 					.ifdef MAIN.SYSTEM.@UnitInit
  1346 					jsr MAIN.SYSTEM.@UnitInit
  1347 					eif
  1348 				
  1349 					.ifdef MAIN.ATARI.@UnitInit
  1350 					jsr MAIN.ATARI.@UnitInit
  1351 					eif
  1352 				
  1353 					.ifdef MAIN.CRT.@UnitInit
  1354 					jsr MAIN.CRT.@UnitInit
  1355 					eif
  1356 				
  1357 					.ifdef MAIN.TYPES.@UnitInit
  1358 					jsr MAIN.TYPES.@UnitInit
  1359 					eif
  1360 				
  1361 					.ifdef MAIN.FASTGRAPH.@UnitInit
  1362 					jsr MAIN.FASTGRAPH.@UnitInit
  1363 					eif
  1364 				.endm
  1365
  1366 					ift .SIZEOF(MAIN.SYSTEM) > 0
  1367 					.print 'SYSTEM: ',MAIN.SYSTEM,'..',MAIN.SYSTEM+.SIZEOF(MAIN.SYSTEM)-1
  1367 				SYSTEM: $202C..$204D
  1368 					eif
  1369
  1370 					ift .SIZEOF(MAIN.ATARI) > 0
  1371 					.print 'ATARI: ',MAIN.ATARI,'..',MAIN.ATARI+.SIZEOF(MAIN.ATARI)-1
  1372 					eif
  1373
  1374 					ift .SIZEOF(MAIN.CRT) > 0
  1375 					.print 'CRT: ',MAIN.CRT,'..',MAIN.CRT+.SIZEOF(MAIN.CRT)-1
  1375 				CRT: $204E..$2071
  1376 					eif
  1377
  1378 					ift .SIZEOF(MAIN.TYPES) > 0
  1379 					.print 'TYPES: ',MAIN.TYPES,'..',MAIN.TYPES+.SIZEOF(MAIN.TYPES)-1
  1380 					eif
  1381
  1382 					ift .SIZEOF(MAIN.FASTGRAPH) > 0
  1383 					.print 'FASTGRAPH: ',MAIN.FASTGRAPH,'..',MAIN.FASTGRAPH+.SIZEOF(MAIN.FASTGRAPH)-1
  1383 				FASTGRAPH: $2072..$2387
  1384 					eif
  1385
  1386 					.print 'CODE: ',CODEORIGIN,'..',*-1
  1386 				CODE: $2000..$24FA
  1387
  1388 24FB			DATAORIGIN
  1389
  1390 24FB 28 00 18 00 2D 0C + .by  $28 $00 $18 $00 $2D $0C $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $9F $00 $00 $00 $BF $00
  1391 2513 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1392 252B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1393 2543 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1394 255B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1395 2573 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1396 258B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1397 25A3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1398 25BB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1399 25D3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1400 25EB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1401 2603 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1402 261B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1403 2633 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1404 264B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1405 2663 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1406 267B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1407 2693 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1408 26AB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1409 26C3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1410 26DB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1411 26F3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1412 270B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1413 2723 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1414 273B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1415 2753 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1416 276B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1417 2783 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1418 279B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1419 27B3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1420 27CB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1421 27E3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1422 27FB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1423 2813 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1424 282B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1425 2843 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1426 285B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1427 2873 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1428 288B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1429 28A3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1430 28BB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1431 28D3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1432 28EB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1433 2903 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1434 291B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1435 2933 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1436 294B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1437 2963 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1438 297B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1439 2993 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1440 29AB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1441 29C3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1442 29DB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1443 29F3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1444 2A0B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1445 2A23 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1446 2A3B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1447 2A53 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1448 2A6B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1449 2A83 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1450 2A9B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1451 2AB3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1452 2ACB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1453 2AE3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1454 2AFB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1455 2B13 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1456 2B2B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1457 2B43 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1458 2B5B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1459 2B73 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1460 2B8B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1461 2BA3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1462 2BBB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1463 2BD3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1464 2BEB 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1465 2C03 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00
  1466 2C1B 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $00 $01 $01 $01 $01 $01
  1467 2C33 01 01 01 01 01 01 + .by  $01 $01 $01 $01 $01 $01 $01 $01  $01 $01 $01 $01 $01 $01 $01 $01  $01 $01 $01 $01 $01 $01 $01 $01
  1468 2C4B 01 01 01 01 01 01 + .by  $01 $01 $01 $01 $01 $01 $01 $00  $00 $00 $00 $00 $00 $00 $01 $00  $00 $00 $01 $00 $01 $00 $00 $01
  1469 2C63 01 01 01 01 01 01 + .by  $01 $01 $01 $01 $01 $01 $00 $00  $01 $00 $00 $00 $00 $00 $00 $00  $01 $01 $00 $01 $01 $01 $01 $01
  1470 2C7B 00 01 00 00 00 01 + .by  $00 $01 $00 $00 $00 $01 $01 $00  $01 $00 $00 $00 $00 $00 $01 $01  $01 $01 $01 $01 $00 $01 $01 $01
  1471 2C93 01 01 00 01 01 00 + .by  $01 $01 $00 $01 $01 $00 $01 $00  $00 $00 $01 $00 $01 $00 $01 $00  $00 $01 $00 $00 $00 $01 $00 $00
  1472 2CAB 01 01 01 00 00 01 + .by  $01 $01 $01 $00 $00 $01 $01 $00  $01 $00 $00 $00 $01 $00 $01 $01  $00 $01 $00 $00 $00 $01 $00 $01
  1473 2CC3 00 00 01 00 01 00 + .by  $00 $00 $01 $00 $01 $00 $00 $00  $01 $01 $00 $01 $01 $00 $01 $00  $01 $01 $00 $01 $00 $00 $00 $01
  1474 2CDB 00 01 01 00 01 00 + .by  $00 $01 $01 $00 $01 $00 $00 $00  $01 $00 $01 $01 $01 $01 $01 $01  $00 $00 $01 $01 $01 $00 $01 $01
  1475 2CF3 00 01 00 00 01 00 + .by  $00 $01 $00 $00 $01 $00 $01 $00  $00 $00 $01 $00 $01 $01 $00 $01  $01 $01 $01 $01 $00 $01 $00 $01
  1476 2D0B 01 00 00 01 00 00 + .by  $01 $00 $00 $01 $00 $00 $01 $00  $00 $00 $00 $01 $00 $00 $01 $01  $00 $01 $01 $01 $01 $01 $00 $01
  1477 2D23 01 00 00 00 00 00 + .by  $01 $00 $00 $00 $00 $00 $00 $00  $01 $00 $01 $00 $01 $00 $01 $00  $01 $00 $01 $00 $01 $00 $01 $00
  1478 2D3B 01 00 01 00 00 00 + .by  $01 $00 $01 $00 $00 $00 $00 $00  $00 $00 $01 $01 $01 $01 $01 $01  $01 $01 $01 $01 $01 $00 $01 $01
  1479 2D53 00 00 01 01 00 00 + .by  $00 $00 $01 $01 $00 $00 $00 $01  $01 $01 $01 $00 $00 $01 $01 $01  $01 $01 $01 $01 $01 $01 $01 $00
  1480 2D6B 00 01 01 00 00 00 + .by  $00 $01 $01 $00 $00 $00 $01 $01  $01 $01 $00 $01 $00 $00 $01 $01  $00 $01 $00 $01 $00 $01 $00 $00
  1481 2D83 01 01 00 01 00 00 + .by  $01 $01 $00 $01 $00 $00 $00 $00  $01 $01 $00 $00 $01 $01 $00 $00  $01 $00 $01 $00 $00 $01 $00 $01
  1482 2D9B 01 00 00 01 00 00 + .by  $01 $00 $00 $01 $00 $00 $01 $01  $01 $01 $01 $00 $01 $01 $00 $00  $01 $01 $00 $01 $01 $00 $01 $00
  1483 2DB3 00 00 01 00 01 00 + .by  $00 $00 $01 $00 $01 $00 $01 $01  $00 $00 $01 $01 $01 $00 $00 $01  $01 $01 $00 $00 $01 $01 $01 $01
  1484 2DCB 01 00 01 00 00 01 + .by  $01 $00 $01 $00 $00 $01 $01 $01  $00 $01 $00 $01 $01 $01 $01 $00  $01 $01 $00 $00 $01 $00 $01 $00
  1485 2DE3 01 00 00 01 01 01 + .by  $01 $00 $00 $01 $01 $01 $01 $00  $01 $00 $01 $01 $01 $01 $01 $00  $00 $01 $01 $01 $01 $00 $01 $00
  1486 2DFB 00 00 00 00 01 00 + .by  $00 $00 $00 $00 $01 $00 $01 $00  $00 $00 $00 $00 $00 $01 $00 $00  $01 $00 $01 $00 $01 $01 $01 $01
  1487 2E13 00 00 01 01 01 01 + .by  $00 $00 $01 $01 $01 $01 $00 $01  $00 $00 $00 $01 $01 $01 $00 $00  $01 $01 $01 $01 $01 $01 $00 $00
  1488 2E2B 00 01 00 01 01 00 + .by  $00 $01 $00 $01 $01 $00 $00 $00  $00 $00 $00 $00 $01 $01 $00 $01  $01 $00 $01 $01 $00 $00 $00 $00
  1489 2E43 01 00 01 00 01 01 + .by  $01 $00 $01 $00 $01 $01 $00 $00  $00 $00 $00 $00 $01 $01 $01 $00  $00 $01 $01 $01 $00 $00 $01 $00
  1490 2E5B 00 01 01 01 00 00 + .by  $00 $01 $01 $01 $00 $00 $01 $01  $00 $00 $01 $00 $00 $01 $00 $01  $00 $01 $01 $01 $00 $00 $01 $01
  1491 2E73 01 01 00 01 00 01 + .by  $01 $01 $00 $01 $00 $01 $00 $00  $00 $00 $01 $00 $00 $01 $01 $00  $01 $01 $00 $01 $01 $00 $00 $00
  1492 2E8B 01 01 00 00 01 00 + .by  $01 $01 $00 $00 $01 $00 $00 $01  $00 $00 $00 $00 $00 $01 $01 $01  $00 $01 $01 $00 $01 $01 $01 $01
  1493 2EA3 01 01 00 01 01 00 + .by  $01 $01 $00 $01 $01 $00 $01 $01  $01 $00 $01 $00 $01 $01 $00 $00  $00 $01 $01 $01 $00 $01 $00 $01
  1494 2EBB 00 01 00 01 01 01 + .by  $00 $01 $00 $01 $01 $01 $01 $00  $01 $01 $00 $01 $01 $00 $01 $01  $01 $01 $00 $00 $00 $00 $01 $00
  1495 2ED3 00 01 01 01 00 01 + .by  $00 $01 $01 $01 $00 $01 $00 $01  $01 $01 $00 $00 $01 $01 $01 $01  $01 $00 $01 $00 $00 $01 $01 $01
  1496 2EEB 00 00 01 00 00 00 + .by  $00 $00 $01 $00 $00 $00 $01 $00  $01 $01 $01 $01 $00 $01 $01 $00  $01 $00 $01 $01 $00 $00 $00 $01
  1497 2F03 01 01 01 00 00 00 + .by  $01 $01 $01 $00 $00 $00 $01 $01  $01 $01 $01 $01 $01 $00 $00 $00  $01 $00 $01 $00 $00 $01 $00 $01
  1498 2F1B 00 01 01 01 00 01 + .by  $00 $01 $01 $01 $00 $01 $00 $00  $00 $01 $00 $00 $00 $00 $01 $00  $01 $01 $01 $01 $01 $01 $00 $00
  1499 2F33 01 00 01 00 01 00 + .by  $01 $00 $01 $00 $01 $00 $01 $00  $00 $01 $00 $01 $01 $00 $00 $01  $00 $01 $01 $00 $01 $01 $01 $00
  1500 2F4B 01 01 00 01 01 01 + .by  $01 $01 $00 $01 $01 $01 $00 $01  $01 $01 $01 $00 $01 $01 $00 $00  $01 $00 $00 $01 $01 $01 $01 $00
  1501 2F63 00 00 01 01 01 00 + .by  $00 $00 $01 $01 $01 $00 $00 $00  $01 $01 $01 $01 $01 $00 $01 $01  $00 $01 $01 $01 $01 $01 $01 $00
  1502 2F7B 01 01 01 01 00 01 + .by  $01 $01 $01 $01 $00 $01 $00 $00  $01 $00 $01 $01 $00 $00 $01 $01  $01 $00 $01 $00 $01 $01 $01 $01
  1503 2F93 01 00 01 01 01 01 + .by  $01 $00 $01 $01 $01 $01 $01 $00  $00 $00 $01 $00 $01 $00 $01 $01  $00 $00 $00 $01 $01 $01 $01 $01
  1504 2FAB 00 01 00 00 00 01 + .by  $00 $01 $00 $00 $00 $01 $01 $00  $00 $00 $00 $00 $01 $00 $00 $01  $01 $01 $01 $01 $01 $01 $01 $01
  1505 2FC3 01 01 00 00 01 01 + .by  $01 $01 $00 $00 $01 $01 $00 $00  $00 $01 $00 $00 $01 $01 $01 $01  $01 $01 $00 $01 $01 $01 $00 $01
  1506 2FDB 01 00 01 01 01 00 + .by  $01 $00 $01 $01 $01 $00 $00 $00  $00 $00 $00 $00 $01 $01 $00 $01  $01 $01 $00 $01 $00 $01 $00 $01
  1507 2FF3 01 00 00 00 01 00 + .by  $01 $00 $00 $00 $01 $00 $01 $00  $01 $00 $00 $00 $01 $01 $01 $01  $00 $01 $01 $01 $01 $01 $00 $01
  1508 300B 00 01 01 01 01 00 + .by  $00 $01 $01 $01 $01 $00 $01 $00  $01 $00 $00 $01 $00 $00 $00 $00  $00 $01 $01 $01 $00 $00 $01 $00
  1509 3023 00 01 01 00 01 00 + .by  $00 $01 $01 $00 $01 $00 $00 $00  $01 $00 $01 $00 $00 $00 $01 $00  $00 $00 $01 $01 $00 $00 $01 $00
  1510 303B 00 01 01 00 00 00 + .by  $00 $01 $01 $00 $00 $00 $00 $00  $01 $01 $01 $00 $01 $01 $00 $01  $00 $00 $00 $01 $00 $01 $01 $00
  1511 3053 01 00 01 00 01 00 + .by  $01 $00 $01 $00 $01 $00 $00 $01  $00 $00 $01 $01 $01 $01 $00 $01  $01 $01 $01 $01 $01 $00 $00 $01
  1512 306B 01 00 01 00 00 00 + .by  $01 $00 $01 $00 $00 $00 $01 $00  $01 $01 $01 $00 $01 $00 $01 $00  $00 $00 $00 $01 $01 $01 $00 $00
  1513 3083 01 00 01 01 01 01 + .by  $01 $00 $01 $01 $01 $01 $00 $01  $00 $01 $01 $01 $00 $01 $01 $01  $01 $01 $00 $01 $00 $00 $01 $00
  1514 309B 00 00 00 00 01 00 + .by  $00 $00 $00 $00 $01 $00 $01 $01  $01 $00 $00 $01 $01 $00 $00 $00  $00 $00 $01 $01 $01 $01 $01 $00
  1515 30B3 00 00 00 00 00 00 + .by  $00 $00 $00 $00 $00 $00 $01 $00  $01 $00 $00 $00 $01 $00 $01 $00  $01 $01 $00 $00 $00 $01 $01 $01
  1516 30CB 01 00 01 01 01 01 + .by  $01 $00 $01 $01 $01 $01 $01 $00  $01 $01 $01 $01 $01 $01 $01 $01  $01 $01 $01 $01 $01 $01 $01 $01
  1517 30E3 01 01 01 01 01 01 + .by  $01 $01 $01 $01 $01 $01 $01 $01  $01 $01 $01 $01 $01 $01 $01 $01  $01 $01 $01 $01
  1518
  1519 = 0BFC			VARINITSIZE	= *-DATAORIGIN
  1520 = 0BFC			VARDATASIZE	= 3068
  1521
  1522 = 30F7			PROGRAMSTACK	= DATAORIGIN+VARDATASIZE
  1523
  1524 					.print 'DATA: ',DATAORIGIN,'..',PROGRAMSTACK
  1524 				DATA: $24FB..$30F7
  1525
  1526 02E0-02E1> 00 20			run START
  1527
  1528 				; -----------------------------------------------------------
  1529
  1530 				.macro	STATICDATA
  1531 				.endm
  1532
  1533 					end
