;
; (c) Copyright 1998, 1998 BinGate Automation
; Version 0.01 (Apr 13 1998)
;
; File: fp100.asm
; Date: Mon Jan
26 15:59:04 1998
; CPU: MOS
Technology 6502
;
FPROC EQU
0
FPADD EQU
1
FPSUB EQU
2
FPMUL EQU
3
FPDIV EQU
4
FPABS EQU
5
FPRNDINT EQU 6
FPSQRT EQU
7
FPTAN EQU
8
FPSIN EQU
9
FPCOS EQU
10
FPDEG EQU
11
FPRAD EQU
12
FPOWER EQU
13
FPHTN EQU
14
FPLN EQU
15
FPLOG EQU
16
FPYTOX EQU
17
FPEXP EQU
18
FPTENTOX EQU 19
FPACOT EQU
20
FPACS EQU
21
FPASN EQU
22
FPSEC EQU
23
FPCSC EQU
24
FPATN EQU
25
FPTWOTOX EQU 26
FPATHH EQU
27
FPCOMP EQU
28
; hooks to other roms
L1002 EQU $1002
LA002 EQU $A002
LC231 EQU $C231
LC278 EQU $C278
LC279 EQU $C279
LC3CB EQU $C3CB
LC372 EQU $C372
LC3CD EQU $C3CD
LC434 EQU $C434
LC4D9 EQU $C4D9
LC4E1 EQU $C4E1
LC4E4 EQU $C4E4
LC54A EQU $C54A
LC558 EQU $C558
LC55B EQU $C55B
LC569 EQU $C569
LC78B EQU $C78B
LC8BC EQU $C8BC
LC99F EQU $C99F
LCA1B EQU $CA1B
LCA4C EQU $CA4C
LCB29 EQU $CB29
LCCD5 EQU $CCD5
LCD09 EQU $CD09
LCEB1 EQU $CEB1
LCF3E EQU $CF3E
LCF41 EQU $CF41
LEE7C EQU $EE7C
LF802 EQU $F802
LFFD1 EQU $FFD1
LFFC5 EQU $FFC5
LFFC8 EQU $FFC8
LFFD4 EQU $FFD4
;
org $CFF0
DFB 0, 0, 0, 0,0, 0, 0, 0,0, 0, 0, 0,0, 0, 0, 0 ; 16 dummy's
DFB $AA
DFB $55
DFB $0E, $d1
DFB $5e, $d1
XD006:
DFB '('
DFB INIT1/256
DFB INIT1%256
FCS "ACS"
DFB ACS/256
DFB ACS%256
FCS "ASN"
DFB ASN/256
DFB ASN%256
FCS "ATN"
DFB ATN/256
DFB ATN%256
FCS "ABS"
DFB ABS/256
DFB ABS%256
FCS "COS"
DFB COS/256
DFB COS%256
;FCS
"FPINIT"
;DFB
FPINIT/256
;DFB
FPINIT%256
FCS "EXP"
DFB EXP/256
DFB EXP%256
FCS "HTN"
DFB HTN/256
DFB HTN%256
FCS "LOG"
DFB LOG/256
DFB LOG%256
FCS "PI"
DFB PI/256
DFB PI%256
FCS "SIN"
DFB SIN/256
DFB SIN%256
FCS "SQR"
DFB SQR/256
DFB SQR%256
FCS "TAN"
DFB TAN/256
DFB TAN%256
FCS "DEG"
DFB DEG/256
DFB DEG%256
FCS "RAD"
DFB RAD/256
DFB RAD%256
FCS "SGN"
DFB SGN/256
DFB SGN%256
FCS "VAL"
DFB VAL/256
DFB VAL%256
FCS "FLT"
DFB FLT/256
DFB FLT%256
FCS "FGET"
DFB FGET/256
DFB FGET%256
DFB PER1/256
DFB PER1%256
FCS "%"
DFB VAR/256
DFB VAR%256
FCS "FIF"
DFB FIF/256
DFB FIF%256
FCS "FUNTIL"
DFB FUNTIL/256
DFB FUNTIL%256
FCS "COLOUR"
DFB LEE7C/256
DFB LEE7C%256
FCS "FDIM"
DFB FDIM/256
DFB FDIM%256
FCS "STR"
DFB STR/256
DFB STR%256
FCS "FPRINT"
DFB FPRINT/256
DFB FPRINT%256
FCS "FINPUT"
DFB FINPUT/256
DFB FINPUT%256
FCS "FPUT"
DFB FPUT/256
DFB FPUT%256
DFB OTHERROM/256
DFB OTHERROM%256
FCS "+"
DFB FP_PLS/256
DFB FP_PLS%256
FCS "-"
DFB FP_MIN/256
DFB FP_MIN%256
DFB $FE
FCS "*"
DFB FP_MAAL/256
DFB FP_MAAL%256
FCS "/"
DFB FP_DIV/256
DFB FP_DIV%256
DFB $FE
FCS "^"
DFB FP_MACH/256
DFB FP_MACH%256
DFB $FE
FCS "+"
DFB FPL_pl/256
DFB FPL_pl%256
FCS "-"
DFB FPL_min/256
DFB FPL_min%256
DFB FPL_pl/256
DFB FPL_pl%256
FCS ")"
DFB LC278/256
DFB LC278%256
DFB $FF
dfb ';', LC54A/256, LC54A%256
dfb $0d, LC54A/256, LC54A%256
dfb ',', FPRINT/256, FPRINT%256, LD339/256, LD339%256
dfb ',', FINPUT/256, FINPUT%256, LC558/256, LC558%256
dfb
'=', EQUAL/256, EQUAL%256 ; nog te
testen ; DONE
dfb
'<>', NEQUAL/256, NEQUAL%256 ; nog te testen ; DONE
dfb
'<=', LEQUAL/256, LEQUAL%256 ; nog te testen ; DONE
dfb
'<', LT/256, LT%256
; nog te testen ; DONE
dfb
'>=', GEQUAL/256, GEQUAL%256 ; nog te testen ; DONE
DFB
'>', GT/256, GT%256, $FF ; nog
te testen ; DONE
;
INIT1: JSR LD0FC
LDX #$B4
BNE LD10B
BEP_ARG:
clc
LD0EC:
ror $73
ldx #$AC
bne LD10B
LD0F2: jsr LD85D
LD0F5: jsr LD106 ; we doen wat recursie
LD0F8: ldx #$A1
bne LD10B
LD0FC: jsr LD0F5 ; nog meer recursie
LD0FF: ldx #$9A
bne LD10B
LD103: jsr LD85D ; copier waarde
LD106: jsr BEP_ARG
LD109: ldx #$A8
LD10B: clc
bcc LD113 ; geforceerde sprong in het duister
ldx #$5F
sty $03
LD112: sec
LD113: ror $53
ldy $03
dey
LD118: iny
lda ($05),y
cmp #$20
beq LD118
dey
sty $52
dex
LD123: ldy $52
LD125: inx
iny
LD127: lda XD006,x
bmi LD146
cmp ($05),y
beq LD125
dex
LD131: inx
lda XD006,x
bpl LD131
inx
bit $53
bpl LD123
lda ($05),y
cmp #'.' ; afgekort?
bne LD123
iny
dex
bcs LD127
LD146: cmp #$FE ; einde tabel?
bcs LD15B
sta $53
lda $D007,x
sta $52
sty $03
ldx $04
jmp ($0052) ; jump naar de
kanibalen.
LD158: ldx $04
rts
;
LD15B: beq LD158
brk ; valt geen chocola van
te maken: fp fout.
INIT: sty $03
jsr LD0EC
jsr LD89A
lda $5A
sta $60
lda $5B
sta $5F
lda $5C
sta $5E
ldy #$5D
jmp LC99F
;
FP_PLS: ; eerste argument is beschikbaar als
we hier zijn
jsr LD0F2 ; haal eerste en tweede argument op
jsr
LD870
jsr
LD804
lda #FPADD ; afdeling optelle
jsr
pc_opdracht2 ; eerste argument overpompen
jsr
naar_pc1 ; HIER TWEEDE argument
jsr van_pc
jmp LD0FF ; staat nu op 0x59 en verder
;
FP_MIN:
jsr
LD0F2 ; FP
MIN
jsr
LD870
jsr
LD804
lda
#FPSUB
jsr
pc_opdracht2
jsr
naar_pc1 ; plaats van stack naar
werkruimte
jsr van_pc
jmp LD0FF
;
FP_MAAL:
jsr
LD103 ; FP
MAAL
jsr
LD870
jsr
LD804
lda #FPMUL
jsr
pc_opdracht2
jsr
naar_pc1
jsr van_pc
jmp LD0F8
;
FP_DIV:
jsr
LD103 ; FP
GEDEELD
jsr
LD870
jsr
LD804
lda
#FPDIV
jsr
pc_opdracht2
jsr
naar_pc1
jsr van_pc
jmp LD0F8
;
FP_MACH:
jsr
LD103 ; FP
GEDEELD
jsr BEP_NUL ; bepaal waarde argument
beq END_MC ; bij 0 doen we nix
bpl mch_verder ; boven 0 kan wortel bepaald worden
brk ; daaronder gaan we gillend
op ons bek
mch_verder:
jsr
LD870
jsr
LD804
lda #FPYTOX
jsr
pc_opdracht2
jsr
naar_pc1
jsr van_pc
END_MC: jmp LD109
;
FPL_min: jsr FPL_pl
LD1BF: jsr BEP_NUL
beq FPL_end
chng_sg: lda $57
eor #$80 ; verander
teken
sta $57
FPL_end: rts
;
FPL_pl: ldy $03 FP plus?
dey
skp_spc: iny
lda ($05),y
cmp #' ' ; spatie
?
beq skp_spc ; ja, dan
skip
cmp #'%' ; fp.
variabele?
bne LD20B ; nee,
door naar ..
inc $03 ; verhoog adres
jsr waarde_uit_var ;
haal waarde uit var
bcc LD20B
ldy #$6F
jsr LC3CD
copy_waarde:
ldy #$04 clear waarde
lda #$0
sta $5E
sta $58
sta $57
copy_lus:
lda ($6F),y
sta $59,y
ora $57
sta $57
dey
bpl copy_lus
tax
beq LD207 ; hij, de laagste waarde 59 is 0
lda $5A
sta $57 ; zet
koud in 57
ora
#$80 ; forceer
bit
sta $5A ; en terug
in zijn hok (maar waarom???
txa ; een return waarde 59 in a
LD207: rts
;
LD208:
sty $03
rts
;
LD20B:
jsr LD5A5
bcs LD208
ldx #$0
jmp LD112
;
ABS: jsr BEP_ARG
jsr BEP_NUL
bmi chng_sg ; voor <1 naar
de 0 anders klaar
rts
;
ACS: jsr BEP_ARG ; buurten bij argument
routine
lda #FPACS ; afdeling arc cosinus
jsr pc_opdracht
rts
;
ASN: jsr BEP_ARG
lda #FPASN ; afdeling arc sinus
jsr pc_opdracht
rts
;
RAD: jsr BEP_ARG
lda #FPRAD ; afdeling radiatoren
jsr pc_opdracht
rts
;
DEG: jsr BEP_ARG
lda #FPDEG ; afdeling GRADEN
jsr pc_opdracht
rts
SGN: jsr BEP_ARG
jsr BEP_NUL
beq isalnul
pha
jsr LDE8D ; een -1 een 0 of een 1
pla
sta $57
isalnul:
rts
;
PER1: bit $73
bmi LD2C0
FLT: jsr LC8BC
ldy #$5D
jsr LC3CD
sta $5A
lda $5F
sta $5B
lda $5E
sta $5C
lda #$A0
sta $59
ldy #$0
sty $5E
lda $5A
sta $57
bpl LD2BD
jsr LD8D5
LD2BD:
jmp LD7C8
LD2C0:
jmp LCA1B
;
PI: lda #$82
sta $59
lda
#$C9
sta $5a
lda
#$0f
sta $5b
lda
#$da
sta $5c
lda
#$a2
sta $5d
rts
;
FGET:
jsr LCF3E
ldx #$04 ; haal 5 bytes uit geopende file
LD2D1:
jsr LFFD4 ; get byte uit handle
sta $03C5,x ; zet hem weg
dex
bpl LD2D1 ; totdat we er 5 hebben
jsr LDBAA ; ?
jmp copy_waarde ; zet hem op de gewenst plek
LDbrk: BRK ; inserted om ass. error te voorkomen
;
VAL: jsr LCEB1 ; neem het fatsoenlijk numeriek deel
ldy #$0
LD2E4:
jsr LD304
cmp #'+'
beq LD2FB
cmp #'-'
bne LD2FE
jsr LD303
sty $54
jsr LD5B1
jmp LD1BF
;
LD2FB:
jsr LD303
LD2FE:
sty $54
jmp LD5B1 ; hier zijn we klaar
;
LD303: ; skip space
iny
LD304:
lda ($52),y
cmp #' ' ; is het een spatie
beq LD303
rts
;
VAR: jsr waarde_uit_var
bcc LDbrk
jsr LC279
jsr LD0FC
jsr LC4E4
jsr
Sla_op
jmp LC55B ; volgende statement
;
STR: jsr LD0FC
jsr LC231
jsr LC4E1
jsr LC3CB
jsr LD4D0
jmp LC55B ; volgende statement
;
FPRINT: jsr LC372
ldx #$B8
jmp LD10B ; bepaal deel van argument
;
LD339: jsr LD0FC
lda #$C5
sta $52
lda #$03
sta $53
jsr LD4D0
dec $6F
lda $0321 ; neemde waarde in @
sec
sbc $6F
bcc LD35C
beq LD35C
tay
lda #$20
pr_sp:
jsr LCA4C ; print 'Y' spaties
dey
bne pr_sp
LD35C:
ldy #$0
LD35E:
lda ($52),y
cmp #$0D ; einde van de opdracht
beq FPRINT
jsr LCA4C
iny
bne LD35E
FINPUT: jsr LC372
lda ($05),y
cmp #'%' ; fp. variabele in aantocht?
bne LD37B ; nee,
iny
sty $03
jsr waarde_uit_var
bcs LD380
LD37B:
ldx #$C3
jmp LD10B ; bepaal deel van argument
;
LD380:
jsr LCD09
tay
lda $05
pha
lda $06
pha
lda $03
pha
sty $03
iny
sty $06
lda #$40
sta $05
jsr LD0FC
pla
sta $03
pla
sta $06
pla
sta $05
jsr Sla_op
jmp LD37B
;
FIF: jsr LD9EB ; vergelijken; Zet Cxxx
adres op stack
jmp LC569
;
FUNTIL: jsr LD9EB ; zet het return adres
HIGH van Cxxx op stack
jmp LCCD5 ; ook vergelijken
;
FPUT: jsr LD494 ; plaats 5 bytes naar output
jsr LD0FC
jsr LC4E4
jsr LD831
ldx $04 ; 5 bytes
jsr LCF41
ldx #$04 ; 5 bytes
LD3C7:
lda $03C5,x ; haal hem op
jsr LFFD1 ; stuur hem weg
dex
bpl LD3C7 ; en dat 5 keer
jmp LC55B ; klaar zijn we
;
FDIM: lda $01
ora $02
beq LD443
jsr LC434
bcs LD443
ldy $03
lda ($05),y
cmp #'%' ; praten we over fp. getallen
bne LD443 ; nee.
iny
lda ($05),y ; haal
waarde op
iny
cmp ($05),y ; vergelijk
met bovenbuurvrouw (AA-ZZ)
bne LD443 ; nee, niet gelijk. Helemaal fout dus.
cmp #'[' ; groter dan Z
bcs LD443 ; Ja, helemaal fout dus.
sbc #$3F ; maak van ascii absolute waarde
bcc LD443 ; <0? (A), foute boel dus. Wegwezen.
iny
sty $03
pha
jsr LC78B ; argument ophalen.
inc $15,x
bne LD403
inc $24,x
LD403:
jsr LD49A
pla
tay
clc
lda $23 ; top
sta $0687,y ; basisopstelling
adc $16
sta $23
lda $24
sta $06A2,y ; basisopstelling high
adc $25
sta $24
ldy #$0
sty $04
lda #$AA
sta ($23),y ; kijk
of hier ook ram zit
cmp ($23),y
bne LD443 ; helaas. Past dus niet meer. Fout.
lsr a ; extra testje, ivm spiegels
sta ($23),y
cmp ($23),y
bne LD443 ; alsnog fout. Zonde, he?
jsr LC434 ; alles fris.
bcs LD443
ldy $03
lda ($05),y
cmp #',' ; wordt er soms nog meer gedimmed?
bne LD440 ; nee, het volgende statement aande
beurt
inc $03
jmp FDIM ; ja, dan doen we het nog eens.
LD440:
jmp LC558
;
LD443: brk
;
waarde_uit_var:
jsr LC434 ; geldige variabele naam?
bcc LD457 ; neen. Dikke mik dus. Misschien direct?
lda $15,x
asl a
asl a
adc $15,x
sta $15,x
lda #$06
sta $24,x
sec
rts
;
LD457:
ldy $03
lda ($05),y ; byte from commandline
cmp #'!' ; is het de
pling?
bne no_pling ; nee.
inc $03
jsr LC8BC
LD464:
sec
rts
;
no_pling:
iny
cmp ($05),y
bne LD473
cmp #'[' ; zitten we in de reeks van A-Z
bcs LD473
sbc #$3F ; maak absolute waarde van
bcs LD475 ; als geldig (>0) gaan we door
LD473: clc ; ziet er niet fris uit.
rts
;
LD475: iny
sty $03
pha
jsr LC8BC
jsr LD49A ; bepaal y-> als variabele
pla
tay
bcs LD493
lda $0687,y ; haal onze vrienden op uit page
6
adc $15,x
sta $15,x
lda $06A2,y
adc $24,x
sta $24,x ; en
sla ze op
bcc LD464
LD493:
brk
LD494:
jsr LC8BC
jmp LC231
;
LD49A:
ldy $24,x
lda $15,x
asl a
rol $24,x
asl a
rol $24,x
clc
adc $15,x
sta $15,x
tya
adc $24,x
sta $24,x
rts
;
OTHERROM: lda $1000
cmp #$40
beq LD4C0
lda $A001
cmp #$BF
bne LD440
jmp LA002
LD4C0:
jmp L1002 ; naar onze rom manager.
;
ASC2DEC:
cmp #$3A HEX A-F
bcs A_error
cmp #$30 LAGER DAN 0
bcc A_ok
sbc #$30
A_ok: rts
;
A_error:
clc
rts
;
LD4D0:
lda #$0
sta $6F
jsr BEP_NUL
bne LD4EB ; geen null, dus geen default print 0.0
lda #'0' ; een null
jsr In_Buf ; store waarde in buffer en verhoog
adres
lda #'.' ; een punt
jsr In_Buf ; store waarde in buffer en verhoog
adres
lda #'0' ; een null
jsr In_Buf ; store waarde in buffer en verhoog
adres
jmp LD571
;
LD4EB:
bpl LD4F2 ; groter dan 0? ja,
lda #'-' ; een minnetje
jsr In_Buf ; store waarde in buffer en verhoog
adres
LD4F2:
lda #$0
sta $6D
LD4F6:
lda $59
cmp #$81
bcs LD504
jsr LD6A0
dec $6D
jmp LD4F6
;
LD504:
cmp #$84
bcc LD518
bne LD510
lda $5A
cmp #$A0 ; groter dan ?
bcc LD518 ; nee
LD510:
jsr LD71B
inc $6D
jmp LD4F6
;
LD518:
lda $59
cmp #$84
bcs LD525
jsr LD6D8
inc $59
bne LD518
LD525:
sec
lda #$FF
jsr LD636
lda $5A
cmp #$A0
bcs LD510
lda #$01
ldy $6D
bmi LD541
cpy #$08
bcs LD541
iny
lda #$0
sta $6D
tya
LD541:
sta $70
ldx #$09
stx $54
LD547:
jsr LD575
dec $70
bne LD553
lda #'.'
jsr In_Buf ; store waarde in buffer en verhoog adres
LD553:
dec $54
bne LD547
lda $6D
beq LD571
lda #'E' ; pratend over e macht notatie
jsr In_Buf ; store waarde in buffer en verhoog adres
lda $6D
bpl LD56E ; niet te klein?
lda #'-'
jsr In_Buf
sec
lda #$0
sbc $6D
LD56E:
jsr LD587
LD571:
lda #$0D ; een CR als einde buffer
bne In_Buf ; store waarde in buffer en verhoog adres
LD575:
lda $5A
lsr a
lsr a
lsr a
lsr a
jsr LD58B
lda $5A
and #$0F
sta $5A
jmp LD64E
;
LD587:
cmp #$0A
bcs LD594
LD58B:
ora #$30
In_Buf:
ldy $6F ; plaats
de ASCII in buffer
sta ($52),y
inc $6F
rts
;
LD594:
ldx #$FF
LD596:
inx
sbc #$0A
bcs LD596
adc #$0A
pha
txa
jsr LD587
pla
bpl LD58B
LD5A5:
lda $03
sta $54
lda $05
sta $52
lda $06
sta $53
LD5B1:
jsr CLR_WRK
sta $6C
sta $6D
jsr LD67B
cmp #'.'
beq LD5CD
jsr ASC2DEC
bcc LD635
sta $5E
LD5C6:
jsr LD67B
cmp #'.'
bne LD5D6
LD5CD:
lda $6C
clc
bne LD60C
inc $6C
bne LD5C6
LD5D6:
cmp #'E'
beq LD601
jsr ASC2DEC
bcc LD60C
sta $6E
lda $5A
cmp #$18
bcc LD5EF
lda $6C
bne LD5C6
inc $6D
bcs LD5C6
LD5EF:
lda $6C
beq LD5F5
dec $6D
LD5F5:
jsr LD64E
clc
lda $6E
jsr LD636
jmp LD5C6
;
LD601:
jsr LD67B
jsr LD778
clc
adc $6D
sta $6D
LD60C:
lda #$A8
sta $59
jsr BEP_NUL
beq LD631
jsr LD7C8
lda $6D
bmi LD627
beq LD62E
LD61E:
jsr LD6A0
dec $6D
bne LD61E
beq LD62E
LD627:
jsr LD71B
inc $6D
bne LD627
LD62E:
jsr LDA9B
LD631:
sec
ldy $54
dey
LD635:
rts
;
LD636:
ldx #$05
LD638:
adc $59,x
sta $59,x
lda #$0
dex
bne LD638
rts
;
LD642:
ldx #$05
LD644:
lda $59,x
adc $61,x
sta $59,x
dex
bne LD644
rts
;
LD64E:
ldx #$05
lda #$0
sta $67
LD654:
lda #$0
sta $68
lda $59,x
asl a
rol $68
asl a
rol $68
clc
adc $59,x
bcc LD667
inc $68
LD667:
asl a
rol $68
clc
adc $67
bcc LD671
inc $68
LD671:
sta $59,x
lda $68
sta $67
dex
bne LD654
rts
;
LD67B:
sty $55
ldy $54
lda ($52),y
ldy $55
inc $54
rts
;
BEP_NUL: ; test op nullen
lda $5A
ora $5B
ora $5C
ora $5D
ora $5E
beq LD699
lda $57
bne LD69F
lda #$01
rts
;
LD699: ; store waarde in fp.
werkruimte
sta $57
sta $59
sta $58
LD69F:
rts
;
LD6A0:
clc
lda $59
adc #$03
sta $59
bcc LD6AB
inc $58
LD6AB:
jsr LD6C3
jsr LD6FB
jsr LD6FB
LD6B4:
jsr LD642
LD6B7:
bcc LD6C2
jsr LD6D8
inc $59
bne LD6C2
inc $58
LD6C2:
rts
;
LD6C3: ; copy waarde in werkruimte
ldx #$08
LD6C5:
lda $56,x
sta $5E,x
dex
bne LD6C5
rts
;
LD6CD: ; * 2 routine
asl $5E
rol $5D
rol $5C
rol $5B
rol $5A
rts
;
LD6D8: ; / 2 routine
ror $5A
ror $5B
ror $5C
ror $5D
ror $5E
rts
;
lda $5D ; schuif de zaak
1 byte op
sta $5E
lda $5C
sta $5D
lda $5B
sta $5C
lda $5A
sta $5B
lda
#$0 ; en schoon het hoogste
byte
sta $5A
rts
;
LD6F8:
jsr LD6C3
LD6FB:
lsr $62 ; /2 routine
ror $63
ror $64
ror $65
ror $66
rts
;
lda $65 ; copieer wat
bytes
sta $66
lda $64
sta $65
lda $63
sta $64
lda $62
sta $63
lda
#$0 ; en schoon
de hoogste vriend
sta $62
rts
;
LD71B:
sec
lda $59
sbc #$04
sta $59
bcs LD726
dec $58
LD726:
jsr LD6F8
jsr LD6B4
jsr LD6F8
jsr LD6FB
jsr LD6FB
jsr LD6FB
jsr LD6B4
lda #$0
sta $62
lda $5A
sta $63
lda $5B
sta $64
lda $5C
sta $65
lda $5D
sta $66
lda $5E
rol a
jsr LD6B4
lda #$
sta $62
sta $63
lda $5A
sta $64
lda $5B
sta $65
lda $5C
sta $66
lda $5D
rol a
jsr LD6B4
lda $5B
rol a
lda $5A
LD772:
jsr LD636
jmp LD6B7
;
LD778:
ldy #$FF
cmp #$2B
beq LD783
cmp #$2D
bne LD786
iny
LD783:
jsr LD67B
LD786:
jsr ASC2DEC
bcc LD7AF
tax
jsr LD67B
jsr ASC2DEC
bcc LD7A4
sta $6E
jsr LD67B
txa
sta $67
asl a
asl a
adc $67
asl a
adc $6E
tax
LD7A4:
tya
bne LD7AD
stx $6E
sec
sbc $6E
rts
;
LD7AD:
txa
rts
;
LD7AF:
lda #$0
LD7B1:
rts
LD7C8:
jsr BEP_NUL
beq LD7B1
LD7CD:
lda $5A
bne LD7F2
lda $5B
sta $5A
lda $5C
sta $5B
lda $5D
sta $5C
lda $5E
sta $5D
lda #$0
sta $5E
sec
lda $59
sbc #$08
sta $59
bcs LD7CD
dec $58
bcc LD7CD
LD7F2:
lda $5A
bmi LD7B1
jsr LD6CD
lda $59
bne LD7FF
dec $58
LD7FF:
dec $59
jmp LD7F2
LD804:
ldy #$04
lda #$0
sta $66
sta $60
sta $5F
LD80E:
lda ($6F),y
sta $61,y
ora $5F
sta $5F
dey
bpl LD80E
tax
beq LD826
lda $62
sta $5F
ora
#$80
sta $62
txa
LD826:
rts
;
LD831:
jsr LDBAA
bne LD83D
Sla_op:
ldx $04
ldy #$6F
jsr LC3CD zet in basic stack
LD83D:
ldy #$0
lda $59
sta ($6F),y
iny
lda $57
and #$80
sta $57
lda $5A
and #$7F
ora $57
sta ($6F),y
LD852:
iny
lda $59,y
sta ($6F),y
cpy
#$04
bne LD852
rts
;
LD85D: ; kopier stack
naar werkruimte
ldy #$52
sty $6F
lda #$0
sta $70
jsr LD83D ; kopier een deel
jsr LC4D9 ; basis rom doet
de rest
lda $56
sta $73,x
rts
;
LD870: ; plaats van stack
naar werkruimte
ldx $04
jsr LC3CB
lda $74,x
sta $56
sty $6F
lda #$0
sta $70
rts
;
LD880:
lda $5E
cmp #$80
bcc LD88D
beq LD892
lda #$FF
jsr LD772
LD88D:
lda #$0
sta $5E
rts
;
LD892:
lda $5D
ora #$01
sta $5D
bne LD88D
LD89A:
jsr LD8C7
beq LD8A5
LD89F:
lda $59
cmp #$A0
bcs LD8B9
LD8A5:
lsr $5A
ror $5B
ror $5C
ror $5D
ror $62
ror $63
ror $64
ror $65
inc $59
bne LD89F
LD8B9:
beq LD8D1
LD8BB:
lda #$7F
sta $5A
lda #$FF
sta $5B
sta $5C
sta $5D
LD8C7:
ldx #$08
lda #$0
LD8CB:
sta $5F,x
dex
bne LD8CB
rts
;
LD8D1:
lda $57
bpl LD8E1
LD8D5:
sec
ldx #$04
LD8D8:
lda #$0
sbc $59,x
sta $59,x
dex
bne LD8D8
LD8E1:
rts
;
LD8E8:
lda #$0
sbc $61,x
sta $61,x
dex
bne LD8E8
lda $57
eor #$80
sta $57
bpl LD90A
LD8F9:
inc $5D
bne LD909
inc $5C
bne LD909
inc $5B
bne LD909
inc $5A
beq LD8BB
LD909:
rts
;
LD90A:
jsr LD8D5
jsr LD8F9
jmp LD8D5
;
LD913:
ldx #$05
LD915:
lda $61,x
sta $59,x
dex
bne LD915
lda #$80
sta $59
jmp LD7C8
;
LD929:
ldx #$08
LD92B:
lda $5E,x
sta $56,x
dex
bne LD92B
LD932:
rts
;
LD939:
jsr LD1BF
jsr LD804
beq LD932
LD941:
jsr BEP_NUL
beq LD929
lda $59
cmp $61
beq LD972
bcc LD95D
sbc $61
cmp #$21
bcs LD932
tax
LD955:
jsr LD6FB
dex
bne LD955
beq LD972
LD95D:
sec
lda $61
sbc $59
cmp #$21
bcs LD929
tax
LD967:
clc
jsr LD6D8
dex
bne LD967
lda $61
sta $59
LD972:
lda $57
eor $5F
bpl LD9C1
lda $5A
cmp $62
bne LD999
lda $5B
cmp $63
bne LD999
lda $5C
cmp $64
bne LD999
lda $5D
cmp $65
bne LD999
lda $5E
cmp $66
bne LD999
jmp CLR_WRK
;
LD999:
bcs LD9C8
sec
lda $66
sbc $5E
sta $5E
lda $65
sbc $5D
sta $5D
lda $64
sbc $5C
sta $5C
lda $63
sbc $5B
sta $5B
lda $62
sbc $5A
sta $5A
lda $5F
sta $57
jmp LDA98
;
LD9C1:
clc
jsr LD6B4
jmp LDA9B
;
LD9C8:
sec
lda $5E
sbc $66
sta $5E
lda $5D
sbc $65
sta $5D
lda $5C
sbc $64
sta $5C
lda $5B
sbc $63
sta $5B
lda $5A
sbc $62
sta $5A
jmp LDA98
;
brk
LD9EB:
jsr LD0FC
lda #$C7 ; het high adres op de stack voor de
latere return
pha
ldx #$C8
jmp LD10B ; bepaal het argument
;
EQUAL:
jsr jsrcomp
lda
#$5D ; Hier worden bijdehande geintjes uitgehaald
bne LDA0C ; het basic adres voor vergelijkingen uit
de C000
LEQUAL:
jsr jsrcomp
lda
#$66 ; rom wordt van stal gehaald en het low adres wordt
bne
LDA0C ; op de stack gezet
NEQUAL:
jsr jsrcomp
lda
#$6F
bne
LDA0C
LT:
jsr jsrcomp
lda
#$76
bne
LDA0C
GEQUAL:
jsr jsrcomp
lda
#$7D
bne
LDA0C
GT:
jsr jsrcomp
lda
#$84
LDA0C:
pha
; zet returadres low op de stack
jsr
LD0FC
; als alles gelijk is. anders NE
jsr
naar_pc1 ;
tweede argument naar de PC
jsr
LFFC5
; haal byte op. Hierin het resultaat.
and #$03 ; hoogste
6 bits resetten
sta $59 ; tijdelijk
opslaan
php ; status op stack
pla ; status in accu
and #$fc ; bovenste
6 bits bewaren
ora #59 ; zero en carry
erbij schrijven
pha ; en accu via stack
plp ; naar status register
LDA3C:
rts ; en jump naar de
basic rom
;
jsrcomp: lda #FPCOMP ; om de zaak
iets in te korten
jmp pc_opdracht1 ; via externe RTS
terug naar caller
LDA45:
jsr BEP_NUL
beq LDA3C
jsr LD804
bne LDA52
jmp CLR_WRK
;
LDA52:
clc
lda $59
adc $61
sta $59
bcc LDA5D
inc $58
LDA5D:
sec
lda $59
sbc #$80
sta $59
bcs LDA68
dec $58
LDA68:
ldx #$05
ldy #$0
LDA6C:
lda $59,x
sta $66,x
sty $59,x
dex
bne LDA6C
lda $57
eor $5F
sta $57
ldy #$20
jsr LD6FB
LDA80:
lda $67
bpl LDA88
clc
jsr LD642
LDA88:
jsr LD6FB
asl $6B
rol $6A
rol $69
rol $68
rol $67
dey
bne LDA80
LDA98:
jsr LD7C8
LDA9B:
jsr LD880
lda $58
beq LDAAD
bpl LDAA7
CLR_WRK:
ldx #$08
;
lda #$0
;
LDAA8:
sta $56,x
dex
bne LDAA8
LDAAD:
rts
LDAA7:
brk
;
LDAAE:
jsr LD831
jsr LDE8D
LDAB6:
jsr BEP_NUL
beq LDAA7
jsr LD6C3
jsr copy_waarde
rts
;
TAN: jsr BEP_ARG
jsr BEP_NUL ; als ie nul is
houdt alles op
beq tan_exit
lda #FPTAN ; afdeling tangers
jsr pc_opdracht
tan_exit:
rts
;
SQR: jsr BEP_ARG ; bepaal waarde argument
LDB72: jsr BEP_NUL ; bepaal waarde argument
beq ENDSQR ; bij 0 doen we nix
bpl sqr_verder ; boven 0 kan wortel bepaald worden
brk ; daaronder gaan we gillend
op ons bek
sqr_verder:
lda #FPSQRT ; afdeling wortels
jsr pc_opdracht
ENDSQR: rts
;
LDB9E:
lda
#$D4 ; hier weer een bijdehante
waarde
bne LDBAC
LDBA2:
lda #$CA
bne LDBAC
LDBA6:
lda #$CF
bne LDBAC
LDBAA:
lda #$C5
LDBAC:
sta $6F
lda #$03
sta $70
rts
;
LOG: jsr BEP_ARG
LDBB6:
jsr BEP_NUL
beq te_klein
bpl log_verder
te_klein:
brk
log_verder:
lda #FPLOG ; afdeling logge rakkers
jsr pc_opdracht
rts
;
ATN: jsr BEP_ARG
LDC67: jsr BEP_NUL
beq atn_exit ; bij 0 houdt alles op
lda #FPATN ; afdeling wortels
jsr pc_opdracht
atn_exit:
rts
;
COS: JSR BEP_ARG
lda #FPCOS ; afdeling ko en sinas
jsr pc_opdracht
rts
;
SIN: jsr BEP_ARG
lda #FPSIN ; afdeling ko en sinas
jsr pc_opdracht
rts
EXP: jsr BEP_ARG
LDDD7: lda $59
cmp #$87
bcc LDDED
bne LDDE5
lda $5A
cmp #$B3
bcc LDDED
LDDE5:
lda $57
bpl L_tegroot
bmi LDDED
jmp CLR_WRK
;
L_tegroot:
brk
LDDED:
lda #FPEXP ; afdeling exponentiele
gevallen
jsr pc_opdracht
rts
;
HTN: jsr BEP_ARG ; bepaal hyperbolische
tangens
lda #FPHTN ; afdeling exponentiele
gevallen
jsr pc_opdracht
rts
;
naar_pc2:
ldx #$0 ; op 0
lda $62 ; met 62 is
iets geks. Daar staat: -
;or
#$80 ; masker bit 7
sta $62
LD02: txa
pha
; x als index koud stellen
lda $61,x
jsr
LFFC8 ; stuur een 5 bytes argument
op
pla
tax
; x weer terug van stack
inx
cpx
#$05 ; alles gehad
bne
LD02
rts
naar_pc1:
ldx #$0 ; op 0
lda
$5a ; met 5a is iets geks.
Daar staat: -
;or
#$80 ; masker bit 7
sta
$5a
LD01: txa
pha
; x als index koud stellen
lda
$59,x
jsr
LFFC8 ; stuur een 5 bytes argument
op
pla
tax
; x weer terug van stack
inx
cpx
#$05 ; alles gehad
bne
LD01
rts
van_pc:
lda
#$0 clear waarde
sta $5E
sta $58
sta $57
LL01: pha ; a wordt koud gezet
jsr LFFC5 ; haal byte op
tax ; berg tijdelijk in x
pla ; wat was de index waarde
tay ; die doen we in y
txa ; x copieren we
sta $59,y ; sla waarde op
ora $57 ; test op 0
sta $57
iny ; index verhogen we
tya ; copie
cmp #$05 ; alles gehad
bne LL01
ldx $57
beq LLexit
lda $5a
sta $57
ORA
#$80
sta $5a
txa
LLexit: rts
pc_opdracht2:
sta $70
lda #$0 ; attentie terminal: er komt
iets!!!
jsr
LFFC8
lda #$62 ; floating point routines
jsr
LFFC8
lda $70 ; tijdelijke jongen
jsr
LFFC8
jsr
naar_pc2
rts
pc_opdracht1:
sta $70
lda #$0 ; attentie terminal: er komt
iets!!!
jsr
LFFC8
lda #$62 ; floating point routines
jsr
LFFC8
lda $70 ; tijdelijke jongen
jsr
LFFC8
jsr
naar_pc1
rts
pc_opdracht:
sta $70
lda #$0 ; attentie terminal: er komt
iets!!!
jsr
LFFC8
lda #$62 ; floating point routines
jsr
LFFC8
lda $70 ; tijdelijke jongen
jsr
LFFC8
jsr
naar_pc1
jsr van_pc ; deze copieert de waarde
van stack
rts
LDE8D:
jsr CLR_WRK
ldy #$80
sty $5A
iny
sty $59
rts
FPINIT: lda #$00
jsr
LFFC8
lda #$62 ; floating point routines
jsr
LFFC8
lda $0 ; tijdelijke jongen
jsr LFFC8
lda $0 ; tijdelijke jongen
jsr LFFC8
jsr LFFC5 ; hier het resultaat
pha
jsr LF802
pla
rts
JMP
LC55B ; einde init
fill $ea,255
fill $ea,255
fill $ea,255
fill $ea,51
nop
; vanaf hier colour routines
lda $52
and #$03
tay
lda XDF4E,y
sta $03FD
lda $03DA
and #$F0
cmp #$70
bne LDF25
lda #$0
tay
LDF1C:
sta $8600,y
sta $8700,y
dey
bne LDF1C
LDF25:
lda $03DA
and #$DF
sta $03DA
rol a
rol a
rol a
and #$03
tay
lda XDF42,y
sta $03FE
lda XDF46,y
sta $03FF
jmp LC558
XDF42: DFB colo1%256, colo2%256, colo3%256, colo4%256
XDF46: DFB colo1/256, colo2/256, colo3/256, colo4/256
XDF4A: DFB $3F, $cf, $f3, $FC
XDF4E: DFB $0, $55, $aa, $ff
colo1: lda $5B
ora $5D
bne TE_GROOT
lda $5A
cmp #$40
bcs TE_GROOT
lsr a
lsr a
sta $5F
ldy #$0
sty $60
lda #$3F
sec
sbc $5C
cmp #$40
bcc LDFBE
rts
;
colo2: lda $5B
ora $5D
bne TE_GROOT
lda $5A
bmi TE_GROOT
lsr a
lsr a
sta $5F
lda #$3F
sec
sbc $5C
cmp #$40
bcc LDFB7
rts
;
colo3: lda $5B
ora $5D
bne TE_GROOT
lda $5A
bmi TE_GROOT
lsr a
lsr a
sta $5F
lda #$5F
sec
sbc $5C
cmp #$60
bcc LDFB7
TE_GROOT:
rts
;
colo4: lda $5B
ora $5D
bne TE_GROOT
lda $5A
bmi TE_GROOT
lsr a
lsr a
sta $5F
lda #$BF
sec
sbc $5C
cmp #$C0
bcs TE_GROOT
LDFB7:
ldy #$0
sty $60
asl a
rol $60
LDFBE:
asl a
rol $60
asl a
rol $60
asl a
rol $60
asl a
rol $60
adc $5F
sta $5F
lda $60
adc #$80
sta $60
lda $5A
and #$03
tax
lda XDF4A,x
ldx $5E
dex
beq LDFF0
dex
beq LDFE9
and ($5F),y
sta ($5F),y
rts
;
LDFE9:
eor #$FF
eor ($5F),y
sta ($5F),y
rts
;
LDFF0:
tax
and ($5F),y
sta ($5F),y
txa
eor #$FF
and $03FD
ora ($5F),y
sta ($5F),y
rts
;
end
|