home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-04-05 | 69.1 KB | 4,720 lines |
-
-
-
-
-
- ; **************************************************
- ; ******************* ADAM_V3 **********************
- ; **************** rechenprogramm ******************
- ; ****** verbesserte version : mehr als 5mal *******
- ; ********** schneller als version 2 !!! ***********
- ; ************** bcd-codierte zahlen ***************
- ; ****** dokumentation siehe in file `dokuv3` ******
- ; **************************************************
-
-
- ; ************ konstanten ************
-
- ; vst und nst müssen durch 4 teilbar sein !!!
-
- vst=200; vorkommastellen
- nst=200; nachkommastellen
-
- variab_anz=10; anzahl der zahlenvariablen
- rech_anz=5; anzahl der rechenfelder
- dez_anz=3; anzahl der konstanten
-
- vsb=vst/2
- nsb=nst/2
- st=vst+nst
- sb=vsb+nsb
- st1=sb+2
- st2=sb+4
- st3=sb+6
- ast1=st+2
- ast2=st+4
- ast3=st+6
-
- rt1_gr=sb*3+50
- tabr_gr=sb+4*21+50
- feldgr=sb+10
-
- ; libraryoffsets
-
- allocmem=-198
- freemem=-210
- openlib=-552
- closelib=-414
- open=-30
- close=-36
- read=-42
- write=-48
- input=-54
- forbid=-132
- permit=-138
- mode_old=1005
- mode_new=1006
-
-
- ; *************** makros ****************
-
- ; 1 --> startadresse 2 --> end-adresse
- prtxt: macro
- move.l #?1*8,d3
- bsr print_text
- endm
-
- ; 1 --> anzahl der zeichen
- p_buf: macro
- moveq #?1,d3
- bsr print_buf
- endm
-
- ; 1 --> startadresse 2 --> länge
- print: macro
- lea ?1(pc),a0
- moveq #?2,d3
- bsr print_sub
- endm
-
-
- ; ************ hauptprogramm ************
-
- x:
- movem.l d1-d7/a0-a6,-(sp)
- lea stackpt(pc),a0
- move.l a7,(a0)
-
- lea fdruck(pc),a0
- clr.w (a0)
-
- bra allocmemory
- alloc_rueck:
- bra openwind
- openw_rueck:
- bra st_pruefen
- st_pr_rueck:
- bra dezwandel
- haupt:
- prtxt 10; hauptmenubild malen
- move.w #vst,d4
- bsr zahlaus
- move.l buffer(pc),a0
- move.l #$0a099b36,(a0)+
- move.b #$43,(a0)
- p_buf 5
- move.w #nst,d4
- bsr zahlaus
-
- readfunk:
- move.l buffer(pc),a4
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr read(a6)
-
- cmp.b #$1b,(a4)
- beq.s a
- cmp.b #$9b,(a4)
- bne.s readfunk
-
- addq.l #1,a4
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #4,d3
- jsr read(a6)
-
- move.b (a4),d4
- lea cmp_tab(pc),a3
- moveq #4,d5
- suchz:
- cmp.b (a3)+,d4
- beq.s gefund
- dbf d5,suchz
-
- bra.s readfunk
- pidisp:
- bsr pi1
- bra haupt
- help1:
- bsr helptext
- bra haupt
- change_lang:
- lea text_tab+4(pc),a0
- tst.l (a0)
- beq.s text_ger_eng
-
- clr.l (a0)
- bra haupt
- text_ger_eng:
- move.l #eng_ttab-text_tabanf,(a0)
- bra haupt
-
- gefund:
- print sicht,3
- lea cmp_tab(pc),a3
-
- cmp.b (a3)+,d4
- beq.s a
- cmp.b (a3)+,d4
- beq.s rechnen
- cmp.b (a3)+,d4
- beq.s pidisp
- cmp.b (a3)+,d4
- beq.s help1
- cmp.b (a3)+,d4
- beq.s change_lang
-
- a:
- move.l conhandle(pc),d1
- jsr close(a6)
- close_dos:
- move.l 4.w,a6
- move.l dosbase(pc),a1
- jsr closelib(a6)
- dosoperr:
-
- bra freememory
- freem_rueck:
-
- ende:
- move.l stackpt(pc),a7
- movem.l (a7)+,d1-d7/a0-a6
- moveq #0,d0
-
- rts
-
-
- ; ************ rechnen *************
-
- rechnen:
- bsr bild
-
- move.l bcd1(pc),a0
- bsr zahlein
- kopin:
- move.l buffer(pc),a0
- bsr feldloesch
-
- bra operand
- rueckoperand:
- move.l bcd2(pc),a0
- bsr zahlein
-
- bra operation
- rueck1:
- bra ergebnis
- rueck2:
- prtxt 2
- readin:
- move.l buffer(pc),a4
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #2,d3
- jsr read(a6)
-
- cmp.b #$1b,(a4)
- beq haupt
- cmp.b #$9b,(a4)
- bne.s readin
-
- addq.l #1,a4
- move.l conhandle(pc),d1
- moveq #2,d3
- jsr read(a6)
-
- move.b -1(a4),d0
-
- cmp.b #$30,d0
- beq haupt
- cmp.b #$31,d0
- beq rechnen
- cmp.b #$32,d0
- beq.s nochmalkop
- cmp.b #$33,d0
- beq.s format_ae
- cmp.b #$34,d0
- beq.s speich_nochm
- cmp.b #$35,d0
- beq.s help2
-
- bra readin
- nochmalkop:
- bsr bild
- move.l bcd1(pc),a0
- bsr druck
- bra kopin
- format_ae:
- lea format(pc),a0
- tst.b (a0)
- bne.s formj_n
-
- move.b #1,(a0)
- prtxt 39
- bra rueck2
- formj_n:
- clr.b (a0)
- prtxt 38
- bra rueck2
- speich_nochm:
- move.l bcd1(pc),a0
- move.l speicher(pc),a1
- bsr kopieren
- bra rechnen
- help2:
- bsr helptext
- bsr bild
- move.l bcd1(pc),a0
- bsr druck
- prtxt 2
- bra readin
- bild:
- prtxt 7
- move.l speicher(pc),a0
- bsr druck
- print home,2
- rts
- helptext:
- prtxt 1
- bsr r_buf
- print sicht,3
- rts
-
-
- ;********** weitere makros ***************
-
- mkopieren: macro
- move.l ?1,a0
- move.l ?2,a1
- bsr kopieren
- endm
- mquadrat: macro
- move.l ?1,a0
- bsr quadrat
- endm
- mfeldloesch: macro
- move.l ?1,a0
- bsr feldloesch
- endm
- mplusu: macro
- move.l ?1,a0
- move.l ?2,a1
- bsr plusu
- endm
- mminusu: macro
- move.l ?1,a0
- move.l ?2,a1
- bsr minusu
- endm
- mmals: macro
- move.l ?1,a0
- move.l ?2,a1
- bsr mals
- endm
- mdiv: macro
- move.l ?1,a0
- move.l ?2,a1
- bsr div
- endm
- mdruck: macro
- move.l ?1,a0
- bsr druck
- endm
- mincrem: macro
- move.l ?1,a0
- bsr increm
- endm
- mveru: macro
- move.l ?1,a0
- move.l ?2,a1
- bsr veru
- endm
-
- mal10: macro; multipliziert ein register mit #10
- move.w ?1,d0
- add.w d0,d0
- add.w d0,d0
- add.w d0,?1
- add.w ?1,?1
- endm
-
-
- ;************* fehlermeldungen **************
-
- allocerr:
- move.l 4.w,a6
- lea dosname(pc),a1
- moveq #0,d0
- jsr openlib(a6); dos.library öffnen
- lea dosbase(pc),a0
- move.l d0,(a0)
- beq dosoperr
-
- move.l dosbase(pc),a6
- jsr -54(a6)
- lea conhandle(pc),a0
- move.l d0,(a0)
- beq close_dos
-
- prtxt 44
-
- bra close_dos
- vst_nst_falsch:
- bsr prtxt12
- prtxt 6
- print lflf,2
- prtxt 13
- bsr r_buf
- bra a
- st3fehler:
- bsr prtxt12
- prtxt 14
- bra fehleraus
- div_null:
- bsr prtxt12
- prtxt 21
- bra fehleraus
- sqr_negativ:
- bsr.s prtxt12
- prtxt 15
- bra.s fehleraus
- add_uberlauf:
- bsr.s prtxt12
- prtxt 27
- bra.s fehleraus
- mal_uberlauf:
- bsr.s prtxt12
- prtxt 29
- bra.s fehleraus
- div_uberlauf:
- bsr.s prtxt12
- prtxt 28
- bra.s fehleraus
- fakfehler:
- bsr.s prtxt12
- prtxt 34
- fehleraus:
- print lflf,2
- prtxt 13
- bsr r_buf
-
- move.l stackpt(pc),a7
- bra haupt
- prtxt12:
- prtxt 12
- rts
-
- ;************* unterprogramme **************
-
- ;----------------------------------
-
- openwind:
- move.l 4.w,a6
- lea dosname(pc),a1
- moveq #0,d0
- jsr openlib(a6); dos.library öffnen
- lea dosbase(pc),a0
-
- move.l d0,(a0)
- beq dosoperr
-
- ; maximale fenstergröße suchen
-
- lea intname(pc),a1
- moveq #33,d0
- jsr openlib(a6); intuition.lib öffnen
- tst.l d0
- beq.s no_intui
- move.l d0,a6
-
- move.l 56(a6),a1; aktueller screen
-
- lea windsize(pc),a0
- moveq #0,d0
- move.w 12(a1),d0; smax_width
- moveq #10,d1
- moveq #$30,d2
-
- bsr.s maked0
-
- move.b #`/`,(a0)+
- moveq #0,d0
- move.w 14(a1),d0; smax_height
-
- bsr.s maked0
-
- move.l a6,a1
- move.l 4.w,a6
- jsr closelib(a6)
- no_intui:
- move.l dosbase(pc),a6
-
- lea name(pc),a0
- move.l a0,d1
- move.l #mode_old,d2
- jsr open(a6); fenster öffnen
- lea conhandle(pc),a0
- move.l d0,(a0)
- beq.s no_window
-
- bra openw_rueck
- no_window:
- jsr -54(a6)
- lea conhandle(pc),a0
- move.l d0,(a0)
- beq close_dos
-
- prtxt 45
-
- bra close_dos
-
-
- maked0:
- divu d1,d0
- swap d0
- add.b d2,d0
- move.w d0,-(sp)
- clr.w d0
- swap d0
-
- divu d1,d0
- swap d0
- add.b d2,d0
- move.w d0,-(sp)
- swap d0
-
- add.b d2,d0
- move.b d0,(a0)+
-
- move.w (sp)+,d0
- move.b d0,(a0)+
- move.w (sp)+,d0
- move.b d0,(a0)+
-
- rts
-
- ;----------------------------------
-
- st_pruefen:
- move.w #vst,d4
- cmp.w #30000,d4
- bhs vst_nst_falsch
- cmp.w #20,d4
- blo vst_nst_falsch
- and.w #%11,d4
- bne vst_nst_falsch
-
- move.w #nst,d4
- cmp.w #30000,d4
- bhs vst_nst_falsch
- cmp.w #20,d4
- blo vst_nst_falsch
- and.w #%11,d4
- bne vst_nst_falsch
-
- bra st_pr_rueck
-
- ;----------------------------------
-
- ; 1 ---> länge
- ; 2 ---> adresse
-
- alloc: macro
- move.l #?1,d0
- move.l d6,d1
- jsr allocmem(a6)
- tst.l d0
- beq allocerr
-
- move.l #?1,(a4)+
- move.l d0,(a4)+
- lea ?2(pc),a0
- move.l d0,(a0)
- endm
-
-
- ; der belegte speicher wird in die memlist eingetragen,
- ; die mit 0,0 abgeschlossen ist.
-
- allocmemory:
- move.l 4.w,a6
- lea memlist(pc),a4
- moveq #29,d0
- alloccl:
- clr.l (a4)+
- dbf d0,alloccl
-
- lea memlist(pc),a4
- move.l #$10000,d6
-
- ; speicher für buffer, byte1, rt1, r1 und tabr
-
- alloc st+48,buffer
- alloc rt1_gr,rt1
- alloc tabr_gr,tabr
- alloc st+10,byte1
- alloc st+10,r1
- alloc sb+10,pi
-
- ; speicher für variablen speicher,bcd1-9
-
- move.w #feldgr,d0
- mulu #variab_anz,d0
- move.l d0,d7
- move.l d6,d1
- jsr allocmem(a6)
- tst.l d0
- beq allocerr
-
- move.l d7,(a4)+
- move.l d0,(a4)+
-
- moveq #variab_anz-1,d1
- lea speicher(pc),a0
- makev:
- move.l d0,(a0)+
- add.l #feldgr,d0
- dbf d1,makev
-
- ; speicher für rechenfelder sqr1-4,quadrat
-
- move.w #feldgr,d0
- mulu #rech_anz,d0
- move.l d0,d7
- move.l d6,d1
- jsr allocmem(a6)
- tst.l d0
- beq allocerr
-
- move.l d7,(a4)+
- move.l d0,(a4)+
-
- moveq #rech_anz-1,d1
- lea sqr1(pc),a0
- makerech:
- move.l d0,(a0)+
- add.l #feldgr,d0
- dbf d1,makerech
-
- ; speicher für konstantenfelder dez1-6
-
- move.w #feldgr,d0
- mulu #dez_anz,d0
- move.l d0,d7
- move.l d6,d1
- jsr allocmem(a6)
- tst.l d0
- beq allocerr
-
- move.l d7,(a4)+
- move.l d0,(a4)+
-
- moveq #dez_anz-1,d1
- lea dez1(pc),a0
- makedez:
- move.l d0,(a0)+
- add.l #feldgr,d0
- dbf d1,makedez
-
- clr.l (a4)+
- clr.l (a4)
-
- bra alloc_rueck
-
- ;----------------------------------
-
- freememory:
- move.l 4.w,a6
- lea memlist(pc),a4
- freem_in:
- move.l (a4)+,d0
- beq.s freem_aus
- move.l (a4)+,a1
- jsr freemem(a6)
-
- bra.s freem_in
- freem_aus:
- bra freem_rueck
-
- ;----------------------------------
-
- ; diese routine kopiert alle zahlenkonstanten in die
- ; konstantenfelder dez1, dez2, ...
-
- dezwandel:
- movem.l d0-d7/a0-a3,-(sp)
-
- moveq #dez_anz-1,d6
- lea dezdat1(pc),a0
- lea dez1(pc),a3
- move.l byte1(pc),a2
- wanf:
- move.l a2,a1
- move.w #st/2+3,d0
- clrb1:
- clr.w (a1)+
- dbf d0,clrb1
-
- move.l a2,a1
- move.w (a0)+,ast1(a2)
- move.w (a0)+,ast2(a2)
- move.w (a0)+,ast3(a2)
-
- cmp.w #1,ast3(a2)
- beq.s gerade
-
- tst.w ast1(a2)
- beq.s nachw
-
- move.w ast1(a2),d5
- move.l #vst,d4
- sub.w d5,d4
- add.l d4,a1
- subq.w #1,d5
- vorwand:
- move.b (a0)+,(a1)+
- dbf d5,vorwand
- nachw:
- tst.w ast2(a2)
- beq.s wandaus
-
- move.l byte1(pc),a1
- move.w ast2(a2),d5
- subq.w #1,d5
- add.l #vst,a1
- nachwand:
- move.b (a0)+,(a1)+
- dbf d5,nachwand
- wandaus:
- move.l a0,d0
-
- btst #0,d0
- beq gerade
- ungerade:
- addq.l #1,a0
- gerade:
- movem.l a0/a1,-(sp)
- move.l byte1(pc),a0
- move.l (a3)+,a1
- bsr wandbyte_bcd; zahl in bcd-format wandeln
- movem.l (sp)+,a0/a1
-
- dbf d6,wanf
-
- mfeldloesch speicher(pc)
-
- mkopieren dez1(pc),bcd1(pc)
- mdiv dez3(pc),bcd1(pc)
- mkopieren bcd1(pc),dez3(pc)
-
- ; pi einlesen
-
- move.l pi(pc),a0
- bsr feldloesch
- move.b #3,vsb-1(a0)
- move.w #1,st1(a0)
- move.w #2,st3(a0)
-
- move.l a0,a4
-
- lea piname(pc),a0
- move.l a0,d1
- move.l #mode_old,d2
- jsr open(a6)
- move.l d0,d7; datei öffnen
- beq.s pi_notfound
-
- move.l d7,d1
- move.l pi(pc),d2
- add.l #vsb,d2
- move.l #nsb,d3
- cmp.w #2000,d3
- bls.s pireadd3ok
- move.l #2000,d3
- pireadd3ok:
- jsr read(a6); datei schreiben
-
- move.l d7,d1
- jsr close(a6); und wieder schließen
-
- ; nachkommastellenzahl von pi ermitteln
-
- move.l a4,a0
- move.l a0,a1
- add.l #sb,a0
- move.w #nsb,d0
- pinachm:
- tst.b -(a0)
- bne.s pinachex
-
- subq.w #1,d0
- bne.s pinachm
-
- bra.s pinachaus
- pinsubeine:
- subq.w #1,d0
- bra.s pinachaus
- pinachex:
- add.w d0,d0
- move.b (a0),d1
- lsl.b #4,d1
- beq.s pinsubeine
- pinachaus:
- move.w d0,st2(a1)
- bra.s piliesaus
- pi_notfound:
- prtxt 41
- bsr r_buf
- move.l #$14159265,vsb(a4)
- move.w #8,st2(a4)
- piliesaus:
- movem.l (sp)+,d0-d7/a0-a3
-
- bra haupt
-
- ;----------- operand nach op holen ------------
-
- operand:
- print miplu+1,4
- opin:
- move.l conhandle(pc),d1
- lea op(pc),a2
- move.l a2,d2
- moveq #1,d3
- jsr read(a6)
-
- move.b (a2),d4
-
- cmp.b #"+",d4
- beq.s op1
- cmp.b #"-",d4
- beq.s op1
- cmp.b #"*",d4
- beq.s op1
- cmp.b #"/",d4
- beq.s op1
- cmp.b #"v",d4
- beq.s op1
- cmp.b #"m",d4
- beq.s op1
- cmp.b #"s",d4
- beq.s op1
- cmp.b #"q",d4
- beq.s op1
- cmp.b #"w",d4
- beq.s op1
- cmp.b #"!",d4
- beq.s op1
- cmp.b #"i",d4
- beq.s op1
- cmp.b #"k",d4
- beq.s op1
- cmp.b #"S",d4
- beq.s op1
- bra opin
- op1:
- print op,1
- op2:
- move.l conhandle(pc),d1
- lea op+1(pc),a0
- move.l a0,d2
- moveq #1,d3
- jsr read(a6)
-
- move.b op+1(pc),d4
- cmp.b #$d,d4
- beq.s opaus
- cmp.b #8,d4
- beq.s oploe
- bra.s op2
- oploe:
- bsr backspace
- bra opin
- opaus:
- lea op(pc),a0
- move.b (a0),d4
- cmp.b #"m",d4
- beq.s memin
- cmp.b #"s",d4
- beq.s opwurzel
- cmp.b #"q",d4
- beq.L opquadrat
- cmp.b #"w",d4
- beq opwechsel
- cmp.b #"!",d4
- beq opfak
- cmp.b #"k",d4
- beq opkehr
- cmp.b #"i",d4
- beq opinteg
- cmp.b #"S",d4
- beq opsin
-
- bsr lf_cr
- bra rueckoperand
-
- ;---------- speichern ---------------
-
- memin:
- mkopieren bcd1(pc),speicher(pc)
- bra rechnen
-
- ;------------ wurzelziehen -----------------
-
- opwurzel:
- prtxt 8
- move.l bcd1(pc),a0
- bsr sqrroot
- mdruck bcd1(pc)
- bra rueck2
-
- ;-------------- quadrieren -----------------
-
- opquadrat:
- prtxt 9
- mquadrat bcd1(pc)
- mdruck bcd1(pc)
- bra rueck2
-
- ;------------ vorzeichen wechseln ------------
-
- opwechsel:
- prtxt 35
- move.l bcd1(pc),a0
- bsr vorz_wechsel
- mdruck bcd1(pc)
- bra rueck2
-
- ;------------ fakultät ------------
-
- opfak:
- prtxt 20
- move.l bcd1(pc),a0
- bsr fakultaet
- mdruck bcd1(pc)
- bra rueck2
-
- ;------------ kehrwert ------------
-
- opkehr:
- prtxt 36
- mkopieren bcd1(pc),bcd2(pc)
- mkopieren dez1(pc),bcd1(pc)
- mdiv bcd2(pc),bcd1(pc)
- mdruck bcd1(pc)
- bra rueck2
-
- ;------------ integer ------------
-
- opinteg:
- prtxt 37
- move.l bcd1(pc),a0
- bsr integer
- mdruck bcd1(pc)
- bra rueck2
-
- ;------------ fakultät ------------
-
- opsin:
- prtxt 42
- move.l bcd1(pc),a0
- bsr sinus
- mdruck bcd1(pc)
- bra rueck2
-
- ;---------- operation ausführen -----------
-
- operation:
- lea op(pc),a0
- move.b op(pc),d4
- cmp.b #"v",d4
- beq vergleich
- cmp.b #"+",d4
- beq.s opplus
- cmp.b #"-",d4
- beq.s opminus
- cmp.b #"*",d4
- beq.s opmal
- cmp.b #"/",d4
- beq.s opdiv
-
- bra a
- opplus:
- move.l bcd2(pc),a0
- move.l bcd1(pc),a1
- bsr pluss
- bra.s operationaus
- opminus:
- move.l bcd2(pc),a0
- move.l bcd1(pc),a1
- bsr minuss
- bra.s operationaus
- opmal:
- move.l bcd2(pc),a0
- move.l bcd1(pc),a1
- bsr mals
- bra.s operationaus
- opdiv:
- move.l bcd2(pc),a0
- move.l bcd1(pc),a1
- bsr div
- bra.s operationaus
- vergleich:
- move.l bcd1(pc),a0
- move.l bcd2(pc),a1
- bsr vers
- operationaus:
- bra rueck1
-
- ;---------- ergebnis ausgeben -----------
-
- ergebnis:
- lea op(pc),a0
- cmp.b #"v",(a0)
- beq.s verglergebnis
-
- print ergeb,8
- mdruck bcd1(pc)
-
- bra.s ergaus
- verglergebnis:
- cmp.w #1,(a0)
- beq.s glei
- cmp.w #2,(a0)
- beq.s v1gr2
- prtxt 5
- bra.s ergaus
- glei:
- prtxt 3
- bra.s ergaus
- v1gr2:
- prtxt 4
- ergaus:
- bra rueck2
-
- ;************** subroutinen **************
-
- ;========== zeichenausgabe ==========
-
- lf_cr:
- print lflf,1
- rts
- backspace:
- print bs1,3
- rts
-
- ; liest ein zeichen in feld `buffer`
- r_buf:
- move.l conhandle(pc),d1
- move.l buffer(pc),d2
- moveq #1,d3
- jsr read(a6)
- rts
-
- ; subroutinen für die macros prtxt, p_buf und print
-
- print_text:
- lea text_tab(pc),a0
- move.l (a0)+,d1
- move.l (a0)+,d2
- add.l d3,a0
- add.l d2,a0
- move.l (a0)+,d2
- move.l (a0)+,d3
- jsr write(a6)
- rts
- print_buf:
- move.l conhandle(pc),d1
- move.l buffer(pc),d2
- jsr write(a6)
- rts
- print_sub:
- move.l conhandle(pc),d1
- move.l a0,d2
- jsr write(a6)
- rts
-
- ;============================================
-
- ; zahl in d4 (wort)
-
- zahlaus:
- movem.l d0-d5/a4/a5,-(sp)
-
- tst.w d4
- beq.s znull
-
- move.l buffer(pc),a4
- and.l #$ffff,d4
- dodez:
- move.l d4,d5
- divu #10,d5
- move.w d5,d4
- swap d5
- add.b #$30,d5
- move.b d5,(a4)+
-
- tst.w d4
- bne.s dodez
-
- move.l buffer(pc),d5
- move.l d5,a5
- addq.l #5,a5
- addq.l #5,a5
- move.l a5,d2
- sub.l a4,d5
- neg.l d5
- move.l d5,d3
- zahlin:
- move.b -(a4),(a5)+
- dbf d5,zahlin
-
- move.l conhandle(pc),d1
- jsr write(a6)
- bra.s zahlausex
- znull:
- print nu,1
- zahlausex:
- movem.l (sp)+,d0-d5/a4/a5
-
- rts
-
- ;==========================================
-
- ; stellenzahl in d4
-
- rechts:
- movem.l d4/a0,-(sp)
-
- lea r(pc),a0
- move.l a0,d2
-
- move.b #$9b,(a0)+
-
- and.l #$ffff,d4
- divu #10,d4
- tst.b d4
- beq.s nur_eine
-
- add.b #$30,d4
- move.b d4,(a0)+
- nur_eine:
- swap d4
-
- add.w #$30,d4
- move.b d4,(a0)+
-
- move.b #$43,(a0)+
-
- move.l conhandle(pc),d1
- move.l a0,d3
- sub.l d2,d3
- jsr write(a6)
-
- movem.l (sp)+,d4/a0
-
- rts
-
- ;===========================================
-
- nullsetzen:
- move.l buffer(pc),a0
- move.w #st2+1,d4
- nullsetz1:
- clr.b (a0)+
- dbf d4,nullsetz1
-
- moveq #variab_anz,d4
- subq.w #1,d4
- lea buffer(pc),a1
- nullsetz2:
- move.l (a1)+,a0
- bsr feldloesch
- dbf d4,nullsetz2
-
- clr.l -(sp)
- movem.l (sp),d0-d7/a0-a5
- addq.l #4,sp
-
- lea op(pc),a0
- clr.b (a0)
-
- rts
-
- ;================================================
-
- ; diese routine liest eine zahl in das feld ein, das in a0
- ; angegeben ist
-
- zahlein:
- movem.l d4-d7/a0-a5,-(sp)
-
- ; (a5) : punknum
- ; 2(a5) : vor
- ; 4(a5) : nach
- ; 6(a5) : vorzei
- vorp=2
- nachp=4
- vorzeip=6
-
- move.l a0,a3
- bsr feldloesch
-
- lea punknum(pc),a5
- clr.l (a5)
- clr.w 4(a5)
- clr.b 6(a5)
-
- print miplu+1,4
- move.l buffer(pc),a4
- ein2:
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr read(a6)
-
- move.b (a4),d4
-
- cmp.b #$d,d4
- beq return
- cmp.b #8,d4
- beq fbackspace
- cmp.b #"-",d4
- beq minzei
- cmp.b #".",d4
- beq punkt
- cmp.b #"0",d4
- beq zeinull
- cmp.b #"m",d4
- beq memory_pi
- cmp.b #"p",d4
- beq memory_pi
- cmp.b #$30,d4
- blo.s ein2
- cmp.b #$39,d4
- bhi.s ein2
- zeichein:
- tst.w (a5)
- beq.s verglvor
-
- cmp.w #nst,nachp(a5)
- beq.s ein2
-
- bra.s verglnach
- zeinull:
- cmp.l buffer(pc),a4
- beq ein2
- bra.s zeichein
- verglvor:
- cmp.w #vst,vorp(a5)
- beq ein2
- verglnach:
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr write(a6)
-
- tst.w (a5)
- beq.s vorincrem
-
- addq.w #1,nachp(a5)
- bra vorret
- vorincrem:
- addq.w #1,vorp(a5)
- vorret:
- addq.l #1,a4
- bra ein2
- memory_pi:
- cmp.l buffer(pc),a4
- bne ein2
-
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr write(a6)
- addq.l #1,a4
- mem:
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr read(a6)
-
- move.b (a4),d4
-
- cmp.b #$d,d4
- beq.s memaus
- cmp.b #$8,d4
- beq.s mback
- bra.s mem
- mback:
- bsr backspace
- move.l buffer(pc),a4
- clr.w (a4)
- bra ein2
- memaus:
- cmp.b #"m",-1(a4)
- beq.s memsp
-
- move.l pi(pc),a0
- bra.s memsp1
- memsp:
- move.l speicher(pc),a0
- memsp1:
- move.l a3,a1
- bsr kopieren
- print plumi,1
- move.l a3,a0
- bsr druck
- bra zahleinex1
- return:
- cmp.l buffer(pc),a4
- beq nullzahl
-
- tst.w nachp(a5)
- bne nulloesch
- loein:
- move.l a4,d6
- sub.l buffer(pc),d6
-
- cmp.w (a5),d6
- beq punktloesch
-
- bra einaus
- nullzahl:
- cmp.b #1,vorzeip(a5)
- beq.s minloe
- minloeret:
- print nu,1
- bra zahleinex
- minloe:
- move.l byte1(pc),a0
- move.l a0,d2
- move.l #$0d3e2020,(a0)+
- move.b #$20,(a0)+
- move.l conhandle(pc),d1
- moveq #5,d3
- jsr write(a6)
-
- clr.b vorzeip(a5)
- bra.s minloeret
- nulloesch:
- move.l buffer(pc),a0
- add.w vor(pc),a0
- add.w nach(pc),a0
-
- cmp.b #$30,(a0)
- beq.s nullo
- bra loein
- nullo:
- subq.w #1,nachp(a5)
- subq.l #1,a4
- bsr backspace
- bra nulloesch
- punktloesch:
- bsr backspace
- move.l a4,d4
- subq.l #1,d4
-
- cmp.l buffer(pc),d4
- beq nullzahl
- einaus:
- moveq #0,d4
- moveq #0,d5
- moveq #0,d6
- move.w vor(pc),d4
- move.w nach(pc),d5
- move.b vorzei(pc),d6
- move.l buffer(pc),a2
- move.l a3,a4
- move.l byte1(pc),a3
-
- move.l a3,a0
- move.w #st/2+3,d7
- lbyte1:
- clr.w (a0)+
- dbf d7,lbyte1
-
- bsr mittwandord
- move.l byte1(pc),a0
- move.l a4,a1
- bsr wandbyte_bcd
- zahleinex:
- bsr lf_cr
- zahleinex1:
- movem.l (sp)+,d4-d7/a0-a5
-
- rts
-
- ;------------ backspace ------------
-
- fbackspace:
- cmp.l buffer(pc),a4
- beq ein2
-
- move.l buffer(pc),a0
- addq.l #1,a0
-
- cmp.l a0,a4
- beq loeschen
-
- addq.l #1,a0
-
- cmp.l a0,a4
- beq loeschen2
- rueckk:
- tst.w (a5)
- bne backpunkt
- backein:
- bsr backspace
-
- tst.w (a5)
- beq.s vordecr
-
- subq.w #1,nachp(a5)
- bra.s backweiter
- vordecr:
- subq.w #1,vorp(a5)
- backweiter:
- clr.b (a4)
- subq.l #1,a4
-
- bra ein2
- loeschen:
- cmp.w #1,(a5)
- beq nullpuloe
-
- tst.b vorzeip(a5)
- beq.s backein
-
- move.l buffer(pc),a0
- move.l #$08200d3e,(a0)+
- move.l #$20202020,(a0)+
- p_buf 8
-
- subq.w #1,vorp(a5)
- subq.l #1,a4
- clr.b vorzeip(a5)
- bra ein2
- loeschen2:
- cmp.w #1,(a5)
- bne rueckk
-
- lea vorzei(pc),a0
- tst.b (a0)
- beq rueckk
-
- move.l buffer(pc),a0
- move.l #$9b302070,(a0)+
- move.l #$08200d3e,(a0)+
- move.l #$20209b31,(a0)+
- move.l #$439b2070,(a0)
- p_buf 16
-
- subq.w #1,a4
- subq.w #1,nachp(a5)
- clr.b vorzeip(a5)
- bra ein2
- backpunkt:
- move.l buffer(pc),d5
- move.l a4,d6
- sub.l d5,d6
-
- cmp.w (a5),d6
- bne backein
-
- clr.w (a5)
- addq.w #1,vorp(a5)
- bra backein
- nullpuloe:
- subq.l #1,a4
- clr.w (a5)
- bsr backspace
-
- bra ein2
-
- ;-------- minuszeichen --------------
-
- minzei:
- cmp.l buffer(pc),a4
- beq ein2
-
- move.l buffer(pc),a0
- addq.l #1,a0
-
- cmp.l a0,a4
- beq.s stell1
- bra.s stellgr1
- stell1:
- cmp.b #`.`,-1(a4)
- beq ein2
- stellgr1:
- tst.b vorzeip(a5)
- beq.s plumin
-
- print miplu,4
- clr.b vorzeip(a5)
- bra.s wechsaus
- plumin:
- print plumi,4
- move.b #1,vorzeip(a5)
- wechsaus:
- move.l a4,d6
- sub.l buffer(pc),d6
- addq.w #1,d6
-
- move.w d6,d4
- bsr rechts
-
- bra ein2
-
- ;---------------- punkt ----------------
-
- punkt:
- tst.w (a5)
- bne ein2
-
- print pu,1
-
- move.l a4,d7
- sub.l buffer(pc),d7
- lea punknum(pc),a0
- move.w d7,(a0)
- addq.w #1,(a0)
-
- addq.l #1,a4
- bra ein2
-
- ;============================================
-
- ; quelladresse in a2 , zieladrsse in a3
- ; vorkomma in d4 , nachkomma in d5
- ; vorzeichen in d6 : 0 = + , 1 = -
-
- mittwandord:
- movem.l d0-d7/a0-a5,-(sp)
- move.w d4,ast1(a3)
- move.w d5,ast2(a3)
-
- cmp.w #1,d6
- beq.s vorz_min
-
- tst.w d4
- beq.s vor_nix
- mrueck3:
- move.w #2,ast3(a3)
- bra anford
- vor_nix:
- tst.w d5
- beq.s mittwausnull
- bra.s mrueck3
- vorz_min:
- move.w #3,ast3(a3)
- anford:
- move.l d4,d6
- move.l a2,a4
- move.l a3,a5
-
- tst.w d4
- beq.s s2
-
- add.l d4,a2
- add.l #vst,a3
- subq.w #1,d4
- s1:
- move.b -(a2),-(a3)
- sub.b #$30,(a3)
- dbf d4,s1
- s2:
- tst.w d5
- beq.s s4
-
- cmp.b #$2e,(a2)
- beq.s nullp
- bra.s nuk
- nullp:
- addq.l #1,a2
- nuk:
- move.l a4,a2
- move.l a5,a3
- add.l d6,a4
- add.l #vst,a5
- addq.l #1,a4
- subq.w #1,d5
- s3:
- move.b (a4)+,(a5)+
- sub.b #$30,-1(a5)
- dbf d5,s3
- s4:
- bra.s mittwaus
- mittwausnull:
- move.w #1,ast3(a3)
- move.l a3,a0
- bsr feldloesch
- mittwaus:
- movem.l (sp)+,d0-d7/a0-a5
- rts
-
- ;====================================================
-
- ; adresse des feldes in a0
- ; außerdem wichtige variablen :
- ; fdruck : 0 = druck im fenster, 1 = druck in datei
- ; format : 0 = druck nicht formatiert, 1 = druck formatiert
-
- druck:
- bsr testa0
-
- movem.l d0-d7/a0-a6,-(sp)
-
- lea fehler(pc),a1
- clr.w (a1)
-
- move.l byte1(pc),a1
- bsr wandbcd_byte
- move.l a1,a0
-
- move.l a0,a1
- move.l buffer(pc),a2
-
- cmp.w #1,ast3(a0)
- beq.s dnullzahl
-
- cmp.w #3,ast3(a0)
- beq.s negativ
- positiv:
- move.l #$3e202020,(a2)+
- bra.s dru1
- negativ:
- move.l #$3e202d20,(a2)+
- dru1:
- tst.b fdruck
- bne.s nouns
- move.l #$9b302070,(a2)+
- nouns:
- moveq #0,d4
- moveq #0,d5
- moveq #0,d7
-
- move.w ast1(a0),d4
- move.w ast2(a0),d5
-
- tst.w d4
- beq.s drvornull
-
- bra.s vorkop
- drvornull:
- move.w #$302e,(a2)+
- bra.s nachkop
- dnullzahl:
- move.l #$3e202020,(a2)+
- move.b #$30,(a2)+
- bra ausdruck
- vorkop:
- subq.w #1,d4
- move.l #vst,d6
- sub.w ast1(a0),d6
- add.l d6,a1
- vkop:
- move.b (a1)+,(a2)
- add.b #$30,(a2)+
- dbf d4,vkop
-
- tst.w ast2(a0)
- beq ausdruck
-
- move.b #$2e,(a2)+
- nachkop:
- move.l a0,a1
- move.w ast2(a0),d4
- subq.w #1,d4
- move.l a0,a1
- add.l #vst,a1
- lea z1(pc),a3
- move.w #5,(a3)
- move.w #11,2(a3)
- moveq #0,d7
-
- tst.b format
- beq.s nkop
-
- move.w #$30,4(a3)
- move.b #$a,(a2)+
- move.b #$30,(a2)+
- move.b #$20,(a2)+
- nkop:
- move.b (a1)+,d0
-
- tst.b format
- beq.s z1rueck
-
- subq.w #1,(a3)
- bcs.s z1neu
- z1rueck:
- add.b #$30,d0
- move.b d0,(a2)+
- dbf d4,nkop
-
- bra.s ausdruck
- z1neu:
- move.b #$20,(a2)+
- addq.w #1,d7
- cmp.w #6,d7
- beq.s zd71w
- zd71r:
- move.w #4,(a3)
- subq.w #1,2(a3)
- bcc.s z1rueck
- move.b #$a,(a2)+
- move.w #11,2(a3)
- moveq #0,d7
- addq.w #1,4(a3)
- cmp.w #$39,4(a3)
- bhi.s z3neu
- z3ok:
- move.b z3+1(pc),(a2)+
- move.b #$20,(a2)+
- bra.s z1rueck
- zd71w:
- move.b #$20,(a2)+
- move.b #$20,(a2)+
- bra.s zd71r
- z3neu:
- move.w #$30,4(a3)
- bra.s z3ok
- ausdruck:
- lea fdruck(pc),a0
- tst.b (a0)
- beq.s winddruck
-
- ; datei schreiben
-
- lea datname(pc),a0
- move.l a0,d1
- move.l #mode_new,d2
- jsr open(a6)
- move.l d0,d7; datei öffnen
- beq.s dat_fehler
-
- move.l d7,d1
- move.l buffer(pc),d2
- move.l a2,d3
- sub.l d2,d3
- jsr write(a6); datei schreiben
-
- move.l d7,d1
- jsr close(a6); und wieder schließen
-
- bra.s druck2aus
- dat_fehler:
- lea fehler(pc),a0
- move.w #1,(a0)
- bra.s druck2aus
- winddruck:
- move.b #$9b,(a2)+
- move.b #$4b,(a2)+
- move.b #$a,(a2)+
- move.b #$9b,(a2)+
- move.b #$20,(a2)+
- move.b #$70,(a2)+
-
- move.l a2,d3
- move.l buffer(pc),d2
- sub.l d2,d3
- move.l conhandle(pc),d1
- jsr write(a6)
- druck2aus:
- movem.l (sp)+,d0-d7/a0-a6
-
- rts
-
- ; =================================================
-
- ; adresse des bcdfeldes in a0
- ; benutzt feld : buffer
-
- alldruck:
- movem.l d4-d7/a0-a6,-(sp)
-
- move.l a0,a1
- move.l buffer(pc),a2
-
- move.l #$3e202020,(a2)+
-
- move.w #vsb/2-1,d4
- bsr makehex
-
- ; nachkommateil kopieren
-
- move.b #".",(a2)+
- move.w #nsb/2-1,d4
- bsr makehex
- move.b #" ",(a2)+
- moveq #3,d4
- bsr makehex
-
- move.b #$9b,(a2)+
- move.b #$4b,(a2)+
- move.b #$a,(a2)+
-
- move.l a2,d3
- sub.l buffer(pc),d3
-
- move.l conhandle(pc),d1
- move.l buffer(pc),d2
- jsr write(a6)
-
- movem.l (sp)+,d4-d7/a0-a6
-
- rts
-
- makehex:
- moveq #3,d3
- move.w (a1)+,d5
- makehex1:
- rol.w #4,d5
- move.w d5,d6
- and.w #$f,d6
-
- cmp.w #9,d6
- bhi.s abuchst
-
- add.b #$30,d6
- bra.s az_ok
- abuchst:
- add.b #$37,d6
- az_ok:
- move.b d6,(a2)+
- dbf d3,makehex1
- dbf d4,makehex
- rts
-
-
- ;==================================================
- ;================ rechenroutinen ==================
- ;====== teil 1 : grundrechenarten und andere ======
- ;======= basis operationen wie vergleichen ========
- ;================ und feld löschen ================
- ;==================================================
-
-
- testa0:
- tst.w st3(a0)
- beq st3fehler
- cmp.w #3,st3(a0)
- bhi st3fehler
-
- rts
- testa0a1:
- tst.w st3(a0)
- beq st3fehler
- cmp.w #3,st3(a0)
- bhi st3fehler
-
- tst.w st3(a1)
- beq st3fehler
- cmp.w #3,st3(a1)
- bhi st3fehler
-
- rts
-
-
- ; adresse von bytefeld in a0
- ; adresse von bcdfeld und Ergebnisfeld in a1
-
- wandbyte_bcd:
- movem.l d0/d1/a0/a1,-(sp)
-
- move.w #sb-1,d0
- byte_bcd:
- move.b (a0)+,d1
- lsl.b #4,d1
- add.b (a0)+,d1
- move.b d1,(a1)+
- dbf d0,byte_bcd
-
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
-
- movem.l (sp)+,d0/d1/a0/a1
-
- rts
-
- ;==============================================
-
- ; adresse von bcdfeld in a0
- ; adresse von bytefeld und Ergebnisfeld in a1
-
- wandbcd_byte:
- movem.l d0-d2/a0/a1,-(sp)
-
- move.w #sb-1,d0
- bcd_byte:
- move.b (a0)+,d1
- move.b d1,d2
- lsr.b #4,d1
- move.b d1,(a1)+
- and.b #$f,d2
- move.b d2,(a1)+
- dbf d0,bcd_byte
-
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
-
- movem.l (sp)+,d0-d2/a0/a1
-
- rts
-
- ;=======================================================
-
- ; adresse von feld in a0
- ; teilt ein feld durch 2
-
- durch2:
- bsr testa0
-
- movem.l d3-d5/a0/a1,-(sp)
-
- cmp.w #1,st3(a0)
- beq durch2aus
-
- bsr dist_st
-
- move.l a0,a1
- lsr.w #1,d4
- bcc.s no2a
-
- btst #0,d5
- bne.s no2a
-
- addq.l #2,d5
- no2a:
- add.l d4,a1
- addq.w #1,d5
- lsr.w #1,d5
- add.l d5,a1
-
- subq.w #1,d5
- durch21:
- move.b -(a1),d4
- move.b d4,d3
- and.b #$f,d4
- lsr.b #1,d4
- bcc.s nopl51
- add.b #$50,1(a1)
- nopl51:
- lsr.b #4,d3
- lsr.b #1,d3
- bcc.s nopl52
- addq.b #5,d4
- nopl52:
- lsl.b #4,d3
- add.b d3,d4
- move.b d4,(a1)
-
- dbf d5,durch21
-
- moveq #0,d4
- move.w st1(a0),d4
- beq.s d2vaus
-
- move.l a0,a1
- add.l #vsb,a1
- clr.w d5
- lsr.w #1,d4
- addx.w d5,d5
- sub.l d4,a1
- tst.w d5
- beq.s tsteq
-
- tst.b -1(a1)
- bne.s d2vaus
- bra.s subd2v
- tsteq:
- cmp.b #9,(a1)
- bhi.s d2vaus
- subd2v:
- subq.w #1,st1(a0)
- d2vaus:
- moveq #0,d4
- move.w st2(a0),d4
-
- move.l a0,a1
- add.l #vsb,a1
- clr.w d5
- lsr.w #1,d4
- addx.w d5,d5
- add.l d4,a1
-
- tst.w d5
- beq.s tst2eq
-
- move.b (a1),d4
- and.b #$f,d4
- beq.s durch2aus
- bra.s d2npl
- tst2eq:
- tst.b (a1)
- beq.s durch2aus
- d2npl:
- addq.w #1,st2(a0)
- cmp.w #nst,st2(a0)
- bls.s durch2aus
- clr.w sb(a0)
- move.w #nst,st2(a0)
- durch2aus:
- movem.l (sp)+,d3-d5/a0/a1
-
- rts
-
- ;=================================================
-
- ; plus mit vorzeichen
- ; adresse von Summand 1 in a0
- ; adresse von Summand 2 und Ergebnisfeld in a1
-
- pluss:
- bsr testa0a1
-
- movem.l d4/d5/a0/a1,-(sp)
-
- move.w st3(a0),d4
- move.w st3(a1),d5
-
- cmp.w #1,d4
- beq plussex
-
- cmp.w #2,d4
- beq.s p_pl1
-
- bra.s p_mi1
- p_kop_plussex:
- bsr kopieren
- bra.s plussex
- p_pl1:
- cmp.w #1,d5
- beq.s p_kop_plussex
-
- cmp.w #2,d5
- beq.s p_pl1_pl2
- p_pl1_mi2:
- bsr minusu
-
- cmp.w #2,st3(a1)
- beq.s p_pl_mi
-
- move.w #2,st3(a1)
-
- bra.s plussex
- p_pl_mi:
- move.w #3,st3(a1)
- bra.s plussex
- p_mi1:
- cmp.w #1,d5
- beq.s p_kop_plussex
-
- cmp.w #2,d5
- beq.s p_mi1_pl2
- p_mi1_mi2:
- bsr plusu
- move.w #3,st3(a1)
- bra.s plussex
- p_pl1_pl2:
- bsr plusu
- bra.s plussex
- p_mi1_pl2:
- bsr minusu
- plussex:
- movem.l (sp)+,d4/d5/a0/a1
-
- rts
-
- ;=====================================================
-
- ; minus mit vorzeichen
- ; adresse von minuend 1 in a0
- ; adresse von subtrahent und ergebnisfeld in a1
-
- minuss:
- bsr testa0a1
-
- movem.l d4/d5/a0/a1,-(sp)
-
- move.w st3(a0),d4
- move.w st3(a1),d5
-
- cmp.w #1,d4
- beq.s minussex
-
- cmp.w #2,d4
- beq.s m_pl1
- m_mi1:
- cmp.w #1,d5
- beq.s kop_minussex
-
- cmp.w #2,d5
- beq.s m_mi1_pl2
- m_mi1_mi2:
- bsr minusu
-
- cmp.w #2,st3(a1)
- beq.s m_pl_mi
-
- move.w #2,st3(a1)
- bra.s minussex
- m_pl_mi:
- move.w #3,st3(a1)
- bra.s minussex
- m_pl1:
- cmp.w #1,d5
- beq.s m_pl1_n2
-
- cmp.w #2,d5
- beq.s m_pl1_pl2
- m_pl1_mi2:
- bsr plusu
- move.w #3,st3(a1)
- bra.s minussex
- m_pl1_n2:
- bsr kopieren
- move.w #3,st3(a1)
- bra.s minussex
- m_pl1_pl2:
- bsr minusu
- bra.s minussex
- kop_minussex:
- bsr kopieren
- bra.s minussex
- m_mi1_pl2:
- bsr plusu
- move.w #2,st3(a1)
- minussex:
- movem.l (sp)+,d4/d5/a0/a1
-
- rts
-
- ;====================================================
-
- ; vergleich mit vorzeichen
- ; adresse der felder in a0 und in a1
- ; ergebnis in d4
- ; 1 : beide gleich
- ; 2 : a0 grösser a1
- ; 3 : a1 grösser a0
-
- vers:
- bsr testa0a1
-
- movem.l d5/a0/a1,-(sp)
-
- move.w st3(a0),d4
- move.w st3(a1),d5
-
- cmp.w #1,d4
- beq.s v_n1
-
- cmp.w #2,d4
- beq.s v_pl1
-
- bra.s v_mi1
- v_n1:
- cmp.w #1,d5
- beq.s v_n1_n2
-
- cmp.w #2,d5
- beq.s v_n1_pl2
- v_n1_mi2:
- moveq #2,d4
- bra.s versex
- v_pl1:
- cmp.w #1,d5
- beq.s v_pl1_n2
-
- cmp.w #2,d5
- beq.s v_pl1_pl2
- v_pl1_mi2:
- moveq #2,d4
- bra.s versex
- v_mi1:
- cmp.w #1,d5
- beq.s v_mi1_n2
-
- cmp.w #2,d5
- beq.s v_mi1_pl2
- v_mi1_mi2:
- bsr veru
-
- cmp.b #2,d4
- beq.s v_gr_kl
-
- cmp.b #1,d4
- beq.s v_gl
- v_kl_gr:
- moveq #2,d4
-
- bra.s versex
- v_gr_kl:
- moveq #3,d4
- bra.s versex
- v_gl:
- move.l #1,d4
- bra versex
- v_n1_n2:
- moveq #1,d4
- bra versex
- v_n1_pl2:
- moveq #3,d4
- bra versex
- v_pl1_n2:
- moveq #2,d4
- bra.s versex
- v_pl1_pl2:
- bsr veru
- bra.s versex
- v_mi1_n2:
- v_mi1_pl2:
- moveq #3,d4
- versex:
- movem.l (sp)+,d5/a0/a1
-
- rts
-
- ;==================================================
-
- ; plus ohne vorzeichen
- ; adresse von Summand 1 in a0
- ; adresse von Summand 2 und Ergebnisfeld in a1
-
- plusu:
- bsr testa0a1
-
- movem.l d4-d7/a0-a4,-(sp)
-
- cmp.w #1,st3(a0)
- beq pende
-
- move.b (a0),d4
- move.b (a1),d5
- sub.w d6,d6
- abcd d5,d4
- bcs add_uberlauf
-
- cmp.w #1,st3(a1)
- beq kop0
-
- bsr findrausgrkl
-
- move.w d4,st1(a1)
- move.w d5,st2(a1)
-
- move.l a0,a3; a3 : summand 1
- move.l a1,a4; a4 : summand 2 und ergebnis
-
- add.l #vsb,a3
- add.l #vsb,a4
-
- move.w d4,d6
- addq.w #1,d4
- addq.w #1,d5
- lsr.w #1,d4
- lsr.w #1,d5
- move.l d5,d7
- add.l d5,a3
- add.l d5,a4
- move.l a4,a2
- add.w d4,d5
- sub.w d4,d4; x-flag löschen
- plus1:
- abcd -(a3),-(a4)
- dbf d5,plus1
-
- ; vorkomma
-
- btst #0,d6
- beq.s plu_ger
-
- move.b 1(a4),d4
- lsr.b #4,d4
- bne.s addeinestelle
- bra.s plaus
- plu_ger:
- tst.b (a4)
- bne.s addeinestelle
-
- bra.s plaus
- addeinestelle:
- addq.w #1,st1(a1)
- plaus:
- move.w #2,st3(a1)
-
- move.w d7,d4
- beq.s movd4a1
-
- move.l a1,a3
- add.l #vsb,a3
- add.l d7,a3
- pin:
- tst.b -(a3)
- beq.s subeinestelle
-
- bra.s paus
- subeinestelle:
- subq.w #1,d4
- beq.s paus0
- bra.s pin
- paus0:
- clr.w st2(a1)
- bra.s pende
- paus:
- add.w d4,d4
- move.b (a3),d5
- and.b #$f,d5
- beq.s plnaeinweni
- movd4a1:
- move.w d4,st2(a1)
- bra.s pende
- plnaeinweni:
- subq.w #1,d4
- bra.s movd4a1
- kop0:
- bsr kopieren
- pende:
- movem.l (sp)+,d4-d7/a0-a4
-
- rts
-
- ;=======================================================
-
- ; minus ohne vorzeichen
- ; adresse von Subtrahent in a0
- ; adresse von Subtraktor und Ergebnisfeld in a1
-
- minusu:
- bsr testa0a1
-
- movem.l d3-d7/a0-a4,-(sp)
-
- move.l a0,a2
- move.l a1,a3
- bsr veru
- move.b d4,d3
-
- cmp.b #1,d4
- beq minnull
-
- bsr findrausgrkl
- move.w d4,st1(a1)
- move.w d5,st2(a1)
-
- move.l a0,a3; a3 : summand 1
- move.l a1,a4; a4 : summand 2 und ergebnis
-
- add.l #vsb,a3
- add.l #vsb,a4
-
- addq.w #1,d4
- addq.w #1,d5
- lsr.w #1,d4
- lsr.w #1,d5
- move.w d4,d6
- move.l d5,d7
- add.l d5,a3
- add.l d5,a4
- move.l a4,a2
- add.w d4,d5
-
- cmp.b #2,d3
- beq.s tauschsubtr
-
- move.w #2,st3(a1)
- bra.s subtr_ok
- tauschsubtr:
- movem.l d0/a0/a1,-(sp)
-
- move.l a4,a0
- move.l rt1(pc),a1
- add.l #sb,a1
- move.w d5,d0
- tauschsub:
- move.b -(a0),-(a1)
- move.b -(a3),(a0)
- dbf d0,tauschsub
-
- movem.l (sp)+,d0/a0/a1
- move.l rt1(pc),a3
- add.l #sb,a3
- move.w #3,st3(a1)
- subtr_ok:
- sub.w d4,d4; x-flag löschen
- minus1:
- sbcd -(a3),-(a4)
- dbf d5,minus1
-
- ; vorkommastellenzahl errechnen
-
- tst.w d6
- beq.s mind6ok
- addq.l #1,a4
- minsubback:
- tst.b (a4)
- beq.s minsubein
- bra.s minvaus
- minsubein:
- subq.w #1,d6
- beq.s mind6ok
- addq.l #1,a4
- bra.s minsubback
- minvaus:
- add.w d6,d6
- move.b (a4),d4
- lsr.b #4,d4
- beq.s subnaein
- bra.s mind6ok
- subnaein:
- subq.w #1,d6
- mind6ok:
- move.w d6,st1(a1)
-
- ; nachkommastellenzahl errechnen
-
- move.w d7,d4
- beq.s mid4ok
-
- move.l a1,a3
- add.l #vsb,a3
- add.l d7,a3
- miin:
- tst.b -(a3)
- beq.s misubnein
-
- bra.s miaus
- misubnein:
- subq.w #1,d4
- beq.s miaus0
- bra.s miin
- miaus0:
- clr.w st2(a1)
- bra.s minex
- miaus:
- add.w d4,d4
- move.b (a3),d5
- and.b #$f,d5
- beq.s minaeinweni
- mid4ok:
- move.w d4,st2(a1)
- bra.s minex
- minaeinweni:
- subq.w #1,d4
- bra.s mid4ok
- minnull:
- move.l a1,a0
- bsr feldloesch
- minex:
- movem.l (sp)+,d3-d7/a0-a4
-
- rts
-
- ;=======================================================
-
- ; multiplikation mit vorzeichen
- ; adresse von faktor 1 in a0
- ; adresse von faktor 2 und ergebnisfeld in a1
-
- mals:
- bsr testa0a1
-
- movem.l d0-d7/a0-a5,-(sp)
-
- cmp.w #1,st3(a0)
- beq malnull1
- cmp.w #1,st3(a1)
- beq malsaus
-
- ; vorzeichen des ergebnisses ermitteln
-
- move.w st3(a0),d0
- cmp.w st3(a1),d0
- beq.s mgleich
- move.w #3,st3(a1)
- bra.s mvorzaus
- mgleich:
- move.w #2,st3(a1)
- mvorzaus:
-
- ; rechenfeld rt1 loeschen
-
- move.w #sb*3/2+10,d4
- move.l rt1(pc),a3
- mlo:
- clr.w (a3)+
- dbf d4,mlo
-
- ; stellenzahlen und distanzwerte
-
- moveq #0,d4
- moveq #0,d5
- move.l a0,a2; a3 : adresse von faktor 1
- move.l a1,a3; a4 : adresse von faktor 2
-
- bsr dist_st
-
- move.l d4,d0
- move.l d5,d1
-
- bsr maketab
-
- move.l a1,a5; a5 : adresse des ergebnisfeldes
- moveq #0,d4
- moveq #0,d5
- move.l a1,a0
- bsr dist_st
-
- moveq #0,d7
- move.w d4,d7
- clr.w d6
- lsr.w #1,d7
- addx.w d6,d6
- tst.w d6
- sne d6
- add.l d7,a0
-
- ; anfangsadresse im rechenfeld rt1 ermitteln
-
- move.l rt1(pc),a3
- move.l #vst+8,d2
- move.l d0,d3
- sub.l #vst,d3
- add.l d3,d2
- sub.l #vst,d4
- add.l d4,d2
- moveq #0,d7
- asr.l #1,d2
- addx.w d7,d7
- tst.w d7
- sne d7
-
- moveq #0,d3
- btst d3,d4
- beq.s d0test
- subq.l #1,d2
- bra.s d2aus1
- d0test:
- btst d3,d0
- bne.s d2aus1
- subq.l #2,d2
- d2aus1:
- btst d3,d0
- bne.s d1test
- btst d3,d1
- beq.s d2aus2
- addq.l #1,d2
- bra.s d2aus2
- d1test:
- btst d3,d1
- bne.s d2aus2
- subq.l #1,d2
- d2aus2:
- cmp.w #2,d2
- blo mal_uberlauf
- tst.w d2
- bmi mal_uberlauf
-
- moveq #0,d3
- move.w d1,d3
- lsr.w #1,d3
- add.l d3,d2
- add.l d2,a3
-
- move.l tabr(pc),a1
- subq.w #1,d5
-
- move.w d1,d2
- lsr.w #1,d1
- addq.w #1,d2
- lsr.w #1,d2
- move.w d2,d1
-
- move.l r1(pc),a5
- move.w #sb+10/2-1,d0
- clrr1a:
- clr.w (a5)+
- dbf d0,clrr1a
-
- move.l a5,d2
- move.w #sb+4,d3
- move.l #sb+4*10+2,d4
-
- ; verwendete rechenfelder:
- ;
- ; r1 : 01
- ; rt1: rechenfeld für subtraktion (rest, 3-fache länge)
- ; tabr: tabelle fur multiplikation von 1 bis 10
- ;
- ; register:
- ;
- ; d0 : rechenregister
- ; d1 : laufzahl multergebnis
- ; d2 : zeiger auf r1, rechts
- ; d3 : sb+4
- ; d4 : sb+4*10+2
- ; d5 : laufzahl gesamt
- ; d6 : bit für wechsel von neuer zahl
- ; d7 : bit für wechsel von tabr
- ;
- ; a0 : zeiger auf nächste zahl
- ; a1 : zeiger auf tabr
- ; a2 : rechenregister
- ; a3 : zeiger auf rt1 rechts
- ; a4 : rechenregister
- ; a5 : adresse von nullbytes (ende)
- ; a6 : nicht benutzt
-
-
- mmulanf:
- moveq #0,d0
- not.b d6
- beq.s mbcdr
-
- move.b (a0),d0
- lsr.b #4,d0
- bra.s mbcdraus
- mbcdr:
- move.b (a0)+,d0
- and.b #$f,d0
- mbcdraus:
- tst.b d0
- beq.s muladdnull
-
- mulu d3,d0
- move.l a1,a2
- add.l d0,a2
-
- not.b d7
- beq.s noadd
- add.l d4,a2
- addq.l #1,a3
- noadd:
- move.l a3,a4
- sub.w d0,d0
- move.w d1,d0
- muladd:
- abcd -(a2),-(a4)
- dbf d0,muladd
- bcs.s weiadd
-
- bra.s muladdaus
- muladdnull:
- not.b d7
- beq.s muladdaus
- addq.l #1,a3
- bra.s muladdaus
- weiadd:
- abcd -(a5),-(a4)
- bcs.s weiadd
-
- move.l d2,d0
- sub.l a5,d0
- subq.w #1,d0
- clrr1b:
- clr.b (a5)+
- dbf d0,clrr1b
- move.l d2,a5
- muladdaus:
- dbf d5,mmulanf
-
- move.l 4*9(sp),a5
-
- move.l rt1,a0
- tst.w (a0)
- bne mal_uberlauf
-
- ; ergebnis vom rechenfeld zum ergebnisfeld kopieren
-
- addq.l #2,a0
- move.l a5,a4
- move.w #sb/2-1,d0
- moveq #0,d1
- moveq #0,d2
- kopmal:
- move.w (a0)+,(a4)+
- sne d1
- or.w d1,d2
- dbf d0,kopmal
-
- tst.w d2
- beq malnullerg
-
- ; letzte stelle aufrunden
-
- cmp.b #$49,(a0)
- bhi.s maufrd
- bra.s maufrdaus
- maufrd:
- move.l a4,a3
-
- move.l rt1(pc),a0
- move.w #sb,d0
- mclrrt1:
- clr.w (a0)+
- dbf d0,mclrrt1
-
- move.b #1,-1(a0)
- sub.w d0,d0
- contrm:
- abcd -(a0),-(a4)
- bcs.s contrm
-
- move.l a3,a4
- maufrdaus:
-
- ; nachkommastellenzahl ermitteln
-
- move.w #nsb,d0
- mnachm:
- tst.b -(a4)
- bne.s mnachex
-
- subq.w #1,d0
- bne.s mnachm
-
- bra.s mnachaus
- mnsubeine:
- subq.w #1,d0
- bra.s mnachaus
- mnachex:
- add.w d0,d0
- move.b (a4),d1
- lsl.b #4,d1
- beq.s mnsubeine
- mnachaus:
- move.w d0,st2(a5)
-
- ; vorkommastellen ermitteln
-
- move.l a5,a4
- move.w #vsb-1,d0
- tsta4:
- tst.b (a4)+
- bne.s mvor
- dbf d0,tsta4
- clr.w d0
- bra.s mvoraus
- mvor:
- addq.w #1,d0
- add.w d0,d0
- move.b -1(a4),d1
- lsr.b #4,d1
- bne.s mvoraus
-
- subq.w #1,d0
- mvoraus:
- move.w d0,st1(a5)
- bra.s malsaus
- malnullerg:
- clr.l (a4)+
- move.l #$00000001,(a4)
- bra.s malsaus
- malnull1:
- move.l a1,a0
- bsr feldloesch
- malsaus:
- movem.l (sp)+,d0-d7/a0-a5
-
- rts
-
- ;===========================================================
-
- ; division mit vorzeichen
- ; adresse von dividend in a0
- ; adresse von divisor und ergebnisfeld in a1
-
- ; f1 ist das feld in a0
- ; f2 ist das feld in a1
-
- div:
- bsr testa0a1
-
- cmp.w #1,st3(a0)
- beq div_null
-
- movem.l d0-d7/a0-a5,-(sp)
-
- cmp.w #1,st3(a1)
- beq divaus
-
- ; vorzeichen ermitteln
-
- move.w st3(a1),d4
- cmp.w st3(a0),d4
- beq.s dgleich
-
- move.w #3,st3(a1)
- bra.s dvorzaus
- dgleich:
- move.w #2,st3(a1)
- dvorzaus:
-
- ; rechenfeld rt1 löschen
-
- move.l rt1(pc),a5
- move.w #sb*3/2,d4
- div1:
- clr.w (a5)+
- dbf d4,div1
-
- ; distanzwert und stellenzahl für f1 ermitteln
-
- exg a0,a1
- bsr dist_st
- exg a0,a1
-
- move.l d4,d0
- move.l d5,d1
-
- clr.w d7
- lsr.w #1,d4
- bcs.s koprt11
-
- move.l a1,a4
- add.l d4,a4
- subq.w #1,d5
- move.l rt1(pc),a5
- addq.l #2,a5
- div2:
- move.b (a4)+,(a5)+
- dbf d5,div2
-
- bra.s koprt1aus
- koprt11:
- move.l a1,a4
- add.l d4,a4
- moveq #0,d7
- lsr.w #1,d5
- addx.w d7,d7
- add.l d5,a4
- addq.l #1,a4
- move.l rt1(pc),a5
- addq.l #2,a5
- add.l d5,a5
- tst.w d7
- beq.s d7eq
- bra.s kop_rt12
- d7eq:
- move.b (a4),d7
- lsr.b #4,d7
- move.b d7,(a5)
- kop_rt12:
- move.b -(a4),d7
- move.b d7,d4
- lsl.b #4,d4
- add.b d4,(a5)
- lsr.b #4,d7
- move.b d7,-(a5)
- dbf d5,kop_rt12
- koprt1aus:
-
- ; distanzwert und stellenzahl für f2 ermitteln
-
- bsr dist_st
- move.w d4,d2
-
- ; beginn des ergebnisses ermitteln
-
- cmp.w d0,d2
- beq.s d0gld2
- cmp.w #vst,d2
- beq.s d2_vst
- cmp.w #vst,d2
- bhi.s grglvst
- klvst:
- cmp.w d2,d0
- bhi.s d2_gr_d0
- move.w #vst,d1
- sub.w d2,d1
- add.w d1,d0
- subq.w #1,d0
- bra.s staus
- d2_gr_d0:
- move.w #vst-1,d1
- sub.w d2,d1
- add.w d1,d0
- bra.s staus
- d2_vst:
- subq.w #1,d0
- bra.s staus
- d0gld2:
- move.w #vst-1,d0
- bra.s staus
- grglvst:
- sub.w #vst-1,d2
- sub.w d2,d0
- staus:
-
- ; in d0 : distanzwert für anfang des ergebnisses
- ; tabelle erstellen
-
- bsr maketab
-
- move.l d0,d2
- clr.w d3
- lsr.w #1,d2
- addx.w d3,d3; d3 : flag für wechsel von ergebnis
- tst.w d3
- seq d3
-
- move.l a1,a2
- add.l d2,a2; a2 : zeiger auf ergebnisfeld, richtige stelle
-
- move.w d0,a5
- move.w #st,d6
- sub.w d0,d6
- bcs divergnull
- cmp.w #st+1,d6
- bhi div_uberlauf; wenn das ergebnis zu groß ist
- lea divzaeh(pc),a3
- move.w d6,(a3); divzaeh : divisionszähler
-
- ; die ersten 3 zahlen von f2 nach d6
-
- move.l a0,a3
- moveq #0,d0
- move.w d4,d0
- clr.w d1
- lsr.w #1,d0
- addx.w d1,d1
-
- add.l d0,a3; a3 : zeiger auf f2, links
-
- moveq #0,d6
- moveq #0,d7
-
- tst.b d1
- bne.s deiw
-
- move.b (a3)+,d6
- move.b d6,d7
- lsr.w #4,d6
- mal10 d6
- and.w #$f,d7
- add.w d7,d6
- move.b (a3),d7
- lsr.w #4,d7
- mal10 d6
- add.w d7,d6
-
- bra.s deiwaus
- deiw:
- move.b (a3)+,d6
- move.b (a3),d7
- lsr.w #4,d7
- mal10 d6
- add.w d7,d6
- move.b (a3),d7
- and.w #$f,d7
- mal10 d6
- add.w d7,d6
- deiwaus:
- tst.w d1
- bne.s vb
-
- btst #0,d5
- bne.s ok
- bra.s lk
- vb:
- btst #0,d5
- beq.s ok
- bra.s lk
- ok:
- bchg #0,d1
- lk:
- lsr.w #1,d5
-
- ; f2 (ergebnisfeld) löschen
-
- move.w #sb/2+1,d7
- div4:
- clr.w (a1)+
- dbf d7,div4
-
- move.l rt1(pc),a0; a0 : zeiger auf rechenfeld, links
- addq.l #1,a0
- move.l tabr(pc),a4
- addq.l #1,a4; a4 : basisadresse des multiplikationsfeldes
-
- tst.w d1
- sne d1
- st d4
-
- ; verwendete rechenfelder :
- ;
- ; rt1: rechenfeld für subtraktion (rest, 3-fache länge)
- ; tabr: tabelle fur multiplikation von 1 bis 10
- ;
- ; register:
- ;
- ; d0 : rechenregister
- ; d1 : bit für wechsel von tabr
- ; d2 : rechenregister
- ; d3 : bit für wechsel von ergebnis
- ; d4 : bit für wechsel von rt1
- ; d5 : stellenzahl von f2
- ; d6 : 3 zahlen von f2 (konstant)
- ; d7 : 4 zahlen von rt1
- ;
- ; a0 : zeiger auf rechenfeld rt1
- ; a1 : arbeitsregister für subtraktion
- ; a2 : zeiger auf ergebnisfeld, richtige stelle
- ; a3 : adresse des multiplikationsergebnisses, rechts
- ; a4 : basis des multiplikationsfeldes
- ; a5 : zähler für division (stellen insgesamt)
- ; a6 : nicht benutzt
-
- divanf:
-
- ; 4 zahlen vom rest nach d7
-
- moveq #0,d7
- moveq #0,d2
- move.l a4,a3
- move.l a0,a1
-
- not.b d4
- beq.s wandrt11
-
- move.b 1(a0),d7
- move.b d7,d2
- lsr.b #4,d7
- mal10 d7
- and.b #$f,d2
- add.b d2,d7
- mal10 d7
- move.b 2(a0),d2
- lsr.b #4,d2
- add.w d2,d7
- mal10 d7
- move.b 2(a0),d2
- and.b #$f,d2
- add.w d2,d7
-
- addq.l #1,a0
- add.l #sb+4*10,a3
-
- addq.l #2,a1
- not.b d1
- bne.s wandrt1aus
-
- addq.l #1,a3
- bra.s wandrt1aus
- wandrt11:
- move.b (a0),d7
- mal10 d7
- move.b 1(a0),d2
- lsr.b #4,d2
- add.b d2,d7
- mal10 d7
- move.b 1(a0),d2
- and.b #$f,d2
- add.w d2,d7
- mal10 d7
- move.b 2(a0),d2
- lsr.b #4,d2
- add.w d2,d7
-
- subq.l #1,a3
-
- not.b d1
- bne.s nomuladd2
-
- addq.l #2,a1
- bra.s wandrt1aus
- nomuladd2:
- addq.l #1,a1
- wandrt1aus:
- divu d6,d7
-
- not.b d3
- beq.s ergli
- add.b d7,(a2)+
- bra.s divergaus
- ergli:
- lsl.b #4,d7
- move.b d7,(a2)
- lsr.b #4,d7
- divergaus:
- tst.b d7
- beq.s dminaus
-
- ; adresse des multiplikationsergebnisses errechnen
-
- mulanf:
- move.w d7,d0
- mulu #sb+4,d0
- add.l d0,a3
-
- ; mult.ergebnis von rt1 abziehen
- ; adresse des mult.ergebnisses in a3
-
- divminin:
- move.w d5,d2
- addq.w #1,d2
- add.l d5,a1
- sub.w d0,d0
- divmin:
- sbcd -(a3),-(a1)
- dbf d2,divmin
- bcs.s wiederadd
- dminaus:
- lea divzaeh(pc),a1
- subq.w #1,(a1)
- bcc divanf
-
- bra.s divschleifaus
-
- ; wenn fehler, dann f2 wieder auf rt1 addieren
-
- wiederadd:
- move.w d5,d2
- addq.w #1,d2
- add.l d5,a1
- addq.l #2,a1
- add.l d5,a3
- addq.l #2,a3
- sub.w d0,d0
- divadd:
- abcd -(a3),-(a1)
- dbf d2,divadd
-
- tst.b d3
- beq.s neuerg1
-
- subq.b #1,-1(a2)
- bra.s neuergaus
- neuerg1:
- sub.b #%10000,(a2)
- neuergaus:
- subq.w #1,d7
- beq.s dminaus
-
- addq.l #2,a1
- add.l d5,a3
- sub.l #sb+2,a3
-
- bra.s divminin
- divschleifaus:
-
- ; letzte stelle aufrunden
-
- cmp.b #$49,(a2)
- bhi.s daufrd
- bra.s aufrdaus
- daufrd:
- move.l a2,a1
-
- move.l rt1(pc),a0
- move.w #sb,d0
- dclrrt1:
- clr.w (a0)+
- dbf d0,dclrrt1
-
- move.b #1,-1(a0)
- sub.w d0,d0
- contrd:
- abcd -(a0),-(a2)
- bcs.s contrd
-
- move.l a1,a2
- aufrdaus:
- clr.b (a2)
-
- move.l 9*4(sp),a4
-
- ; vorkommastellenzahl
-
- cmp.w #vst,a5
- bhi.s dvornull
-
- move.w #vst,d0
- sub.w a5,d0
- beq.s dvoraus
-
- move.w d0,d1
- clr.w d2
- lsr.w #1,d1
- addx.w d2,d2
-
- move.l a4,a5
- add.l #vsb,a5
- and.l #$ffff,d1
- sub.l d1,a5
-
- tst.w d2
- beq.s tsta0cl
-
- tst.b -1(a5)
- beq.s subeine
-
- bra.s dvoraus
- tsta0cl:
- move.b (a5),d1
- lsr.b #4,d1
- beq.s subeine
-
- bra.s dvoraus
- subeine:
- subq.w #1,d0
- bra.s dvoraus
- dvornull:
- clr.w d0
- dvoraus:
- move.w d0,st1(a4)
-
- ; nachkommastellenzahl ermitteln
-
- move.l a4,a5
- add.l #sb,a5
- move.w #nsb,d4
- dnachm:
- tst.b -(a5)
- bne.s dnachex
-
- subq.w #1,d4
- bne.s dnachm
-
- bra.s dnachaus
- dnsubeine:
- subq.w #1,d4
- bra.s dnachaus
- dnachex:
- add.w d4,d4
- move.b (a5),d0
- lsl.b #4,d0
- beq.s dnsubeine
- dnachaus:
- move.w d4,st2(a4)
- bra.s divaus
- divergnull:
- move.l a1,a0
- bsr feldloesch
- divaus:
- movem.l (sp)+,d0-d7/a0-a5
-
- rts
-
- ;==================================================
-
- ; adresse des feldes in a0
- ; ergebnis: distanzwert in d4
- ; stellenzahl in d5
-
- dist_st:
- movem.l d3/d6/d7/a0,-(sp)
-
- move.w st2(a0),d7
- move.w st1(a0),d6
- beq.s vnull
-
- move.l #vst,d4
- sub.w d6,d4
-
- tst.w d7
- beq.s suchen
-
- moveq #0,d5
- move.w d6,d5
- add.w d7,d5
- bra.s distaus
- suchen:
- add.l #vsb,a0
- moveq #0,d7
- nnull1:
- tst.b -(a0)
- bne.s naus
-
- addq.w #1,d7
- bra.s nnull1
- naus:
- add.w d7,d7
- move.b (a0),d3
- and.b #$f,d3
- beq.s nauspl1
- bra.s nausd4ok
- nauspl1:
- addq.w #1,d7
- nausd4ok:
- moveq #0,d5
- move.w d6,d5
- sub.w d7,d5
- bra.s distaus
- distnullaus:
- moveq #0,d4
- moveq #0,d5
- bra.s distaus
- vnull:
- tst.w d7
- beq.s distnullaus
-
- move.l #vsb,d4
- vnull1:
- tst.b (a0,d4.w)
- bne.s vaus
-
- addq.w #1,d4
- bra.s vnull1
- vaus:
- move.b (a0,d4.w),d6
- add.w d4,d4
- lsr.b #4,d6
- beq.s vnullpl1
- bra.s vnulld4ok
- vnullpl1:
- addq.w #1,d4
- vnulld4ok:
- moveq #0,d5
- move.w d7,d5
- add.w #vst,d5
- sub.w d4,d5
- distaus:
- movem.l (sp)+,d3/d6/d7/a0
-
- rts
-
- ;==========================================
-
- ; diese routine erstellt die tabelle für multiplikation und
- ; division bei tabr. alle register bleiben unverändert.
- ; kann direkt im anschluß an dist_st aufgerufen werden.
- ; a0 : zeiger auf feld
- ; d4 : distanzwert
- ; d5 : stellenzahl
-
- maketab:
- movem.l d2-d7/a0-a3,-(sp)
-
- move.l #sb+4,d2
- subq.w #1,d5
-
- move.l tabr(pc),a1
- move.w #sb+4*20+20/4,d6
- clrtabr:
- clr.l (a1)+
- dbf d6,clrtabr
-
- lsr.w #1,d4
- bcs.s kop1m
-
- add.l d4,a0
- lsr.w #1,d5
- add.l d5,a0
- addq.l #1,a0; a0 : zeiger rechts
- move.l a0,a1
- move.l tabr(pc),a2
- add.l d2,a2
- move.w d5,d6
- kop_f1:
- move.b -(a1),-(a2)
- dbf d6,kop_f1
- bra.s addtab1aus
- kop1m:
- add.l d4,a0
- moveq #0,d7
- lsr.w #1,d5
- addx.w d7,d7
- add.l d5,a0; a0 : f2 rechts
- addq.l #1,a0
- move.l a0,a1
- move.l tabr(pc),a2
- add.l #sb+3,a2
- move.w d5,d6
- addq.w #1,d6
- tst.w d7
- bne d7ne
- bra.s kop_f11
- d7ne:
- move.b (a1),d7
- lsr.b #4,d7
- move.b d7,(a2)
- addq.w #1,d5
- kop_f11:
- move.b -(a1),d7
- move.b d7,d4
- lsl.b #4,d4
- add.b d4,(a2)
- lsr.b #4,d7
- move.b d7,-(a2)
- dbf d6,kop_f11
- addtab1aus:
- move.l tabr(pc),a0
- move.l a0,a2
- add.l d2,a0
- add.l d2,a2
- add.l d2,a2
- moveq #8,d7
- addtab1:
- move.w d5,d6
- move.l a0,a1
- move.l a2,a3
- addtab2:
- move.b -(a1),-(a3)
- dbf d6,addtab2
-
- move.l a2,a1
- move.l a2,a3
- sub.l d2,a1
-
- move.w d5,d6
- addq.w #1,d6
- sub.w d3,d3
- addtab3:
- abcd -(a1),-(a3)
- dbf d6,addtab3
-
- add.l d2,a2
- dbf d7,addtab1
-
- ; verschobene tabelle erstellen
-
- move.l tabr(pc),a0
- move.l a0,a2
- add.l d2,a0
- add.l #sb+4*11+2,a2
- moveq #9,d7
- verschtab1:
- move.w d5,d6
- addq.w #1,d6
- move.l a0,a1
- move.l a2,a3
- verschtab2:
- move.b -(a1),d4
- move.b d4,d3
- lsl.b #4,d3
- add.b d3,-(a3)
- lsr.b #4,d4
- move.b d4,-1(a3)
- dbf d6,verschtab2
-
- add.l d2,a0
- add.l d2,a2
- dbf d7,verschtab1
-
- movem.l (sp)+,d2-d7/a0-a3
-
- rts
-
- ;==============================================
-
- ; setzt ein feld auf null
- ; feldadresse in a0
-
- feldloesch:
- movem.l d0/a0,-(sp)
-
- move.w #sb/2+2,d0
- lanf:
- clr.w (a0)+
- dbf d0,lanf
- move.w #1,(a0)+
-
- movem.l (sp)+,d0/a0
-
- rts
-
- ;================================================
-
- ; adresse des 1. feldes in a0
- ; adresse des 2. feldes in a1
- ; grössere vorkommazahl in d4
- ; grössere nachkommazahl in d5
-
- findrausgrkl:
- move.l d6,-(sp)
-
- moveq #0,d4
- moveq #0,d5
-
- move.w st1(a1),d6
- cmp.w st1(a0),d6
- blt.s vor1grvor2
- bgt.s vor1klvor2
- move.w st1(a0),d4
- frueck1:
- move.w st2(a1),d6
- cmp.w st2(a0),d6
- blt.s nach1grnach2
- bgt.s nach1klnach2
- move.w st2(a1),d5
-
- bra.s findaus
- vor1grvor2:
- move.w st1(a0),d4
- bra.s frueck1
- vor1klvor2:
- move.w st1(a1),d4
- bra.s frueck1
- nach1grnach2:
- move.w st2(a0),d5
- bra.s findaus
- nach1klnach2:
- move.w st2(a1),d5
- findaus:
- move.l (sp)+,d6
-
- rts
-
- ;=====================================================
-
- ; kopiert feld in a0 auf feld in a1
- ; adresse des quellfeldes in a0
- ; adresse des zielfeldes in a1
-
- kopieren:
- movem.l d4/a0/a1,-(sp)
-
- move.w #sb/2+3,d4
- kopieren1:
- move.w (a0)+,(a1)+
- dbf d4,kopieren1
-
- movem.l (sp)+,d4/a0/a1
-
- rts
-
- ;=====================================================
-
- ; tauscht felder in a0 und a1 aus
- ; adresse der felder in a0 und in a1
-
- tausch:
- movem.l d4/d5/a0/a1,-(sp)
-
- move.w #sb/2+3,d4
- tau1:
- move.w (a0),d5
- move.w (a1),(a0)+
- move.w d5,(a1)+
- dbf d4,tau1
-
- movem.l (sp)+,d4/d5/a0/a1
-
- rts
-
- ;=====================================================
-
- ; vergleich ohne vorzeichen
- ; adresse der felder in a0 und in a1
- ; ergebnis in d4
- ; 1 : beide gleich
- ; 2 : a0 grösser a1
- ; 3 : a1 grösser a0
-
- veru:
- bsr testa0a1
-
- movem.l a0/a1,-(sp)
-
- move.w #sb/2-1,d4
- ver1:
- cmpm.w (a1)+,(a0)+
- blo.s a1_gr_a0
- bhi.s a0_gr_a1
- dbf d4,ver1
-
- moveq #1,d4
- bra.s veraus
- a1_gr_a0:
- moveq #3,d4
- bra.s veraus
- a0_gr_a1:
- moveq #2,d4
- veraus:
- movem.l (sp)+,a0/a1
-
- rts
-
- ;=================================================
-
- ; feld(a0) := feld(a0) - 1
- ; adresse des feldes in a0
-
- decrem:
- bsr testa0
-
- movem.l d0/d1/a0-a2,-(sp)
-
- cmp.w #1,st3(a0)
- beq.s decremex
- tst.w st2(a0)
- bne.s decremex
-
- move.l dez1(pc),a2
- add.l #vsb,a2
-
- move.l a0,a1
- add.l #vsb,a1
- sub.w d0,d0
- decweiadd:
- sbcd -(a2),-(a1)
- bcs.s decweiadd
-
- move.w st1(a0),d0
- moveq #0,d1
- move.w d0,d1
- lsr.w #1,d1
- move.l a0,a1
- add.l #vsb,a1
- sub.l d1,a1
-
- btst #0,d0
- bne.s tstm1
-
- move.b (a1),d0
- lsr.b #4,d0
- beq.s dec1weniger
-
- bra.s decremex
- tstm1:
- tst.b -1(a1)
- beq.s dec1weniger
-
- bra.s decremex
- alloe:
- move.w #1,st3(a0)
- bra.s decremex
- dec1weniger:
- subq.w #1,st1(a0)
- beq.s alloe
- decremex:
- movem.l (sp)+,d0/d1/a0-a2
-
- rts
-
- ;==============================================
-
- ; feld(a0) := feld(a0) + 1
- ; adresse des feldes in a0
-
- increm:
- bsr testa0
-
- movem.l d0/d1/a0-a2,-(sp)
-
- cmp.w #1,st3(a0)
- beq.s increm0_1
- tst.w st2(a0)
- bne.s incremex
-
- move.l dez1(pc),a2
- add.l #vsb,a2
-
- move.l a0,a1
- add.l #vsb,a1
- sub.w d0,d0
- incweiadd:
- abcd -(a2),-(a1)
- bcs.s incweiadd
-
- move.w st1(a0),d0
- moveq #0,d1
- move.w d0,d1
- lsr.w #1,d1
- move.l a0,a1
- add.l #vsb-1,a1
- sub.l d1,a1
-
- btst #0,d0
- bne.s itstm1
-
- tst.b (a1)
- bne.s inc1mehr
-
- bra.s incremex
- itstm1:
- move.b (a1),d0
- lsr.b #4,d0
- bne.s inc1mehr
-
- bra.s incremex
- increm0_1:
- move.w #1,st1(a0)
- move.w #2,st3(a0)
- move.b #1,vsb-1(a0)
- bra.s incremex
- inc1mehr:
- addq.w #1,st1(a0)
- incremex:
- movem.l (sp)+,d0/d1/a0-a2
-
- rts
-
- ;==============================================
-
- ; wechselt das vorzeichen
- ; adresse des feldes in a0
-
- vorz_wechsel:
- bsr testa0
-
- move.l d0,-(sp)
-
- move.w st3(a0),d0
-
- cmp.w #1,d0
- beq.s vor_wechsaus
-
- cmp.w #2,d0
- beq.s plus_minus
-
- move.w #2,st3(a0)
- bra.s vor_wechsaus
- plus_minus:
- move.w #3,st3(a0)
- vor_wechsaus:
- move.l (sp)+,d0
-
- rts
-
- ;==================================================
-
- ; löscht den nachkommateil des feldes in a0
- ; adresse des feldes in a0
-
- integer:
- bsr testa0
-
- movem.l d0/a0,-(sp)
-
- cmp.w #1,st3(a0)
- beq.s integ_aus
- tst.w st2(a0)
- beq.s integ_aus
-
- tst.w st1(a0)
- bne.s integnnull
-
- move.w #1,st3(a0)
- integnnull:
- clr.w st2(a0)
-
- move.w #nsb/2-1,d0
- add.l #vsb,a0
- clrinteg:
- clr.w (a0)+
- dbf d0,clrinteg
- integ_aus:
- movem.l (sp)+,d0/a0
-
- rts
-
- ;===========================================
- ;============= rechenroutinen ==============
- ;=== teil 2 : routinen, die die grund- =====
- ;====== rechenfunktionen benutzen. =========
- ;======== z.b. sqrroot oder pi1 ============
- ;===========================================
-
-
- ; adresse des feldes in a0
-
- sinus:
- bsr testa0
-
- movem.l d0/d1/a0-a2,-(sp)
-
- move.l a0,a2
-
- ; zahl zwischen +pi/2 und -pi/2 bringen
-
- mkopieren a2,sqr1(pc)
- mdiv pi(pc),sqr1(pc)
-
- move.l sqr1(pc),a0
- cmp.b #$49,vsb(a0)
- bhi.s sinaufrd
-
- bsr integer
- bra.s sinaufrdaus
- sinaufrd:
- bsr integer
- bsr increm
- sinaufrdaus:
- mmals pi(pc),sqr1(pc)
- mminusu sqr1(pc),a2
-
- mkopieren a2,sqr1(pc)
- mkopieren a2,sqr2(pc)
- mquadrat sqr2(pc)
- mkopieren dez1(pc),sqr3(pc)
- mkopieren dez1(pc),sqr4(pc)
-
- ; sin(x) = x - x^3/3! + x^5/5! -x^7/7! ...
- ; sqr1 : jeweiliges x^n
- ; sqr2 : x^2
- ; sqr3 : n!
- ; sqr4 : n
-
- st d4
- moveq #82,d5
- makesin:
- mincrem sqr4(pc)
- mmals sqr4(pc),sqr3(pc)
- mincrem sqr4(pc)
- mmals sqr4(pc),sqr3(pc)
-
- mmals sqr2(pc),sqr1(pc)
- sin_in:
- mfeldloesch sqr5(pc)
- mkopieren sqr1(pc),sqr5(pc)
- mdiv sqr3(pc),sqr5(pc)
-
- cmp.w #1,st3(a1)
- beq.s sin_aus
-
- not.b d4
- beq.s sinabzieh
-
- mplusu sqr5(pc),a2
- bra.s sin_2
- sinabzieh:
- mminusu sqr5(pc),a2
- sin_2:
- dbf d5,makesin
- sin_aus:
- movem.l (sp)+,d0/d1/a0-a2
-
- rts
-
- ;================================================
-
- ; adresse des feldes in a0
-
- fakultaet:
- bsr testa0
-
- movem.l d0/d1/a0-a2,-(sp)
-
- cmp.w #1,st3(a0)
- beq fak_1
-
- cmp.w #3,st3(a0)
- beq fakfehler
- tst.w st2(a0)
- bne fakfehler
-
- moveq #0,d0
- move.b vsb-2(a0),d0
- move.w d0,d1
- lsr.w #4,d0
- mulu #10,d0
- and.w #$f,d1
- add.w d1,d0
- mulu #10,d0
-
- moveq #0,d1
- move.b vsb-1(a0),d1
- lsr.w #4,d1
- add.w d1,d0
- mulu #10,d0
- move.b vsb-1(a0),d1
- and.w #$f,d1
- add.w d1,d0
-
- tst.w d0
- beq fakfehler
- cmp.w #1,d0
- beq fakaus
- cmp.w #2,d0
- beq fakaus
-
- move.l a0,a2
-
- move.l sqr1(pc),a1
- bsr kopieren
-
- subq.w #2,d0
- fak:
- move.l sqr1(pc),a0
- bsr decrem
- mmals sqr1(pc),a2
- dbf d0,fak
-
- bra.s fakaus
- fak_1:
- bsr feldloesch
- move.b #1,vsb-1(a0)
- move.w #1,st1(a0)
- move.w #2,st3(a0)
- fakaus:
- movem.l (sp)+,d0/d1/a0-a2
-
- rts
-
- ;===============================================
-
- ; adresse des feldes in a0
-
- sqrroot:
- bsr testa0
-
- cmp.w #3,st3(a0)
- beq sqr_negativ
-
- cmp.w #1,st3(a0)
- beq wurzaus2
-
- movem.l d4-d7/a0-a5,-(sp)
-
- move.l sqr1(pc),a1
- bsr kopieren
-
- cmp.w #4,st1(a0)
- bhi.s kleinermachen
-
- bsr dist_st
-
- cmp.w #vst,d4
- bhi.s groessermachen
-
- bra.s anfwurz
- groessermachen:
- sub.w #vst-1,d4
- lsr.w #1,d4
- add.w #vst-1,d4
- moveq #0,d5
- move.w d4,d5
-
- lsr.w #1,d5
- move.l sqr1(pc),a1
- add.l d5,a1
- move.b #5,(a1)
-
- bra.s anfwurz
- kleinermachen:
- move.w st1(a0),d4
- lsr.w #1,d4
-
- move.l #vst,d5
- sub.w d4,d5
- lsr.w #1,d5
- move.l sqr1,a1
- add.l d5,a1
- move.w d5,d4
- subq.w #1,d5
- move.b #$50,(a1)
- kl1:
- clr.b -(a1)
- dbf d5,kl1
-
- move.w #vsb,d5
- sub.w d4,d5
- add.w d5,d5
- move.l sqr1,a1
- move.w d5,st1(a1)
-
- ; x[n+1] = 0.5 * ( x[n] + a / x[n] )
- ; sqr1 : x[n]
- ; sqr3 : rechenfeld für überprüfung
- ; sqr4 : zwischenergebnis der division
-
- anfwurz:
- move.l a0,a4; a4 : originaladresse
- moveq #10,d4; anzahl der iterationen
- move.l sqr1(pc),d6
- move.l sqr4(pc),d7
- move.l sqr3(pc),a5
-
- wurz:
- mkopieren a4,sqr4(pc)
-
- mdiv d6,d7
- mplusu d7,d6
- move.l d6,a0
- bsr durch2
- dbf d4,wurz
-
- ueberpruefen:
- mkopieren d6,a5; sqr3 : x[n]
- mkopieren a4,d7
- mdiv d6,d7
- mplusu d7,d6
- move.l d6,a0
- bsr durch2; sqr1 : x[n+1]
-
- mveru d6,a5
-
- cmp.b #1,d4
- beq.s wurzaus1
-
- bra.s ueberpruefen
- wurzaus1:
- mkopieren d6,a4
- wurzaus:
- movem.l (sp)+,d4-d7/a0-a5
- wurzaus2:
- rts
-
- ;=============================================
-
- ; adresse des feldes in a0
-
- quadrat:
- bsr testa0
-
- movem.l a0/a1,-(sp)
-
- move.l sqr1(pc),a1
- bsr kopieren
- exg a0,a1
- bsr mals
-
- movem.l (sp)+,a0/a1
-
- rts
-
- ;=============================================
-
- ; adresse des feldes in a0
-
-
- pi1:
- movem.l d4-d7/a0-a6,-(sp)
-
- prtxt 16
-
- move.l buffer(pc),a4
- moveq #0,d6
- piein:
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr read(a6)
-
- move.b (a4),d4
-
- cmp.b #$d,d4
- beq pireturn
- cmp.b #$8,d4
- beq pibackspace
- cmp.b #$30,d4
- beq pizeinull
-
- cmp.b #$30,d4
- blt.s piein
- cmp.b #$39,d4
- bgt.s piein
-
- move.l buffer(pc),a0
- addq.l #4,a0
-
- cmp.l a0,a4
- beq piein
- inordnung:
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr write(a6)
-
- sub.b #$30,(a4)
- addq.l #1,a4
- addq.w #1,d6
- bra piein
- pibackspace:
- cmp.l buffer(pc),a4
- beq piein
-
- bsr backspace
-
- clr.b (a4)
- subq.l #1,a4
- subq.w #1,d6
- bra piein
- pizeinull:
- cmp.l buffer(pc),a4
- beq piein
-
- bra inordnung
- pireturn:
- cmp.l buffer(pc),a4
- beq pi1aus
-
- subq.w #1,d6
- move.l buffer(pc),a4
- clr.l d5
- clr.w d7
- wand:
- move.b (a4)+,d7
- mulu #10,d5
- add.w d7,d5
- dbf d6,wand
-
- ; felder vorbesetzen
-
- prtxt 19
-
- mkopieren dez2(pc),bcd1(pc)
- mquadrat bcd1(pc)
- mkopieren dez3(pc),bcd2(pc)
- mquadrat bcd2(pc)
-
- mkopieren dez2(pc),bcd3(pc)
- mkopieren dez3(pc),bcd4(pc)
- mkopieren dez2(pc),bcd5(pc)
- mkopieren dez3(pc),bcd6(pc)
- mkopieren dez1(pc),bcd7(pc)
-
- prtxt 22
- move.w #vst,d4
- bsr zahlaus
- prtxt 23
- move.w #nst,d4
- bsr zahlaus
- prtxt 11
- move.w d5,d4
- bsr zahlaus
-
-
- ; pi = 4 * ( 4*arctan(1/5) - arctan(1/239) )
- ; arctan(x) = x - x^3/3 + x^5/5 - x^7/7 + x^9/9 ...
- ; bcd1 : (1/5)^2
- ; bcd2 : (1/239)^2
- ; bcd3 : zwischenergebnis arctan(1/5)
- ; bcd4 : zwischenergebnis arctan(1/239)
- ; bcd5 : (1/5)^n
- ; bcd6 : (1/239)^n
- ; bcd7 : zähler
-
- move.w d5,d6
- moveq #1,d7; anzeigen
- lea plflag(pc),a0
- st (a0)
- move.l 4.w,a5
- lea bcd1(pc),a3
- schlanf1:
- print str2,6
-
- move.w d5,d4
- sub.w d6,d4
- bsr zahlaus
-
- print miplu+2,1
-
- cmp.w #2,d7
- beq.s ueberspring
-
- prtxt 18
- bsr berecherg
- mdruck bcd8(pc)
- ueberspring:
- btst #6,$bfe001
- beq piweiter
- cmp.b #$3d,$bfec01
- beq piweiter
- berechwei:
- exg a5,a6
- jsr forbid(a6)
-
- mmals (a3),4*4(a3); v6 : v3 : (1/5)^2
- mkopieren 4*4(a3),7*4(a3)
-
- mmals 4(a3),5*4(a3); v7 : v4 * (1/239)^2
- mkopieren 5*4(a3),8*4(a3)
-
- mincrem 6*4(a3)
- mincrem 6*4(a3); v5 := v5+2
- mdiv 6*4(a3),7*4(a3)
- mdiv 6*4(a3),8*4(a3)
-
- lea plflag(pc),a0
- not.b (a0)
- beq.s plabzieh
-
- mplusu 7*4(a3),2*4(a3)
- mplusu 8*4(a3),3*4(a3)
- bra.s arcaus
- plabzieh:
- mminusu 7*4(a3),2*4(a3)
- mminusu 8*4(a3),3*4(a3)
- arcaus:
- jsr permit(a6)
- exg a5,a6
-
- dbf d6,schlanf1
-
- prtxt 18
- bsr berecherg
- mdruck bcd8
- print dt24,5
- bra fragsave0
- berechweiin:
- cmp.w #2,d7
- beq.s q_ja
-
- move.l buffer(pc),a0
- move.l #$0d9b4b00,(a0)
- p_buf 3
- bra berechwei
- q_ja:
- prtxt 25
- bra berechwei
- zquiet:
- cmp.w #1,d7
- beq.s anz_qu
- qu_wiederanz:
- moveq #1,d7
- bra.s berechweiin
- anz_qu:
- moveq #2,d7
- prtxt 25
- bra berechwei
- piweiter:
- cmp.w #1,d7
- beq.s qtext
- prtxt 24
- bra.s pireadin
- qtext:
- prtxt 17
- pireadin:
- move.l buffer(pc),a4
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr read(a6)
-
- move.b (a4),d4
-
- cmp.b #"y",d4
- beq.s piread1
- cmp.b #"n",d4
- beq.s piread1
- cmp.b #"q",d4
- beq.s piread1
- bra.s pireadin
- piread1:
- move.l buffer(pc),a4
- lea z1(pc),a0
- move.l (a4),(a0)
-
- p_buf 1
- piread2:
- move.l buffer(pc),a4
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr read(a6)
-
- move.b (a4),d4
-
- cmp.b #$d,d4
- beq pireadaus
- cmp.b #8,d4
- beq.s pireadloe
- bra.s piread2
- pireadloe:
- bsr backspace
- bra.s pireadin
- pireadaus:
- move.b z1(pc),d4
-
- cmp.b #"y",d4
- beq berechweiin
- cmp.b #"q",d4
- beq zquiet
- fragsave0:
- prtxt 30
- fragsave:
- move.l buffer(pc),a4
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr read(a6)
-
- move.b (a4),d4
-
- cmp.b #"y",d4
- beq.s fragsave2
- cmp.b #"n",d4
- beq.s fragsave2
- bra.s fragsave
- fragsave2:
- move.l buffer(pc),a4
- lea z1(pc),a0
- move.l (a4),(a0)
- p_buf 1
- fragsave3:
- move.l buffer(pc),a4
- move.l conhandle(pc),d1
- move.l a4,d2
- moveq #1,d3
- jsr read(a6)
-
- move.b (a4),d4
-
- cmp.b #$d,d4
- beq.s fragsaveaus
- cmp.b #$8,d4
- beq.s fragsaveloe
- bra.s fragsave3
- fragsaveloe:
- bsr backspace
- bra.s fragsave
- fragsaveaus:
- move.b z1(pc),d4
-
- cmp.b #"n",d4
- beq berechaus
-
- bsr namein; dateinamen eingeben
-
- lea datname(pc),a0
- tst.b (a0)
- beq.s no_name
-
- bsr berecherg
-
- lea fdruck(pc),a3
- move.b #1,(a3)
- mdruck bcd8(pc); zahl in datei speichern
- clr.b (a3)
-
- lea fehler(pc),a0
- tst.w (a0)
- bne piwrite_err
- bsr namedruck
- prtxt 33
- bsr r_buf
- bra pi1aus
- piwrite_err:
- prtxt 40
- bsr r_buf
- bra.s pi1aus
- no_name:
- prtxt 43
- bra.s pi1aus1
- berechaus:
- print str3,5
- prtxt 13
- pi1aus1:
- bsr r_buf
- pi1aus:
- movem.l (sp)+,d4-d7/a0-a6
-
- rts
-
- ;--------------------
-
- berecherg:
- mkopieren 2*4(a3),7*4(a3)
- mkopieren 2*4(a3),8*4(a3)
- mplusu 7*4(a3),8*4(a3)
- mkopieren 8*4(a3),7*4(a3)
- mplusu 8*4(a3),7*4(a3); v8 : 4*arctan(1/5)
-
- mminusu 3*4(a3),7*4(a3); v8 : 4*arctan(1/5)-arctan(1/239)
-
- mkopieren 7*4(a3),8*4(a3)
- mplusu 7*4(a3),8*4(a3)
- mkopieren 8*4(a3),7*4(a3)
- mplusu 8*4(a3),7*4(a3); v8 : pi-ergebnis
-
- rts
-
- ;--------------------
-
- namein:
- prtxt 32
- lea datname(pc),a4
-
- move.l conhandle(pc),d7
- nnamein:
- move.l d7,d1
- move.l a4,d2
- moveq #1,d3
- jsr read(a6)
-
- cmp.b #$d,(a4)
- beq.s nameex
- cmp.b #$8,(a4)
- beq.s nback
- cmp.b #$9b,(a4)
- beq.s frgs_ctrl
- cmp.l #datname+40,a4
- beq.s nnamein
-
- move.l d7,d1
- move.l a4,d2
- move.l #1,d3
- jsr write(a6)
-
- addq.l #1,a4
- bra.s nnamein
- frgs_ctrl:
- move.l d7,d1
- move.l a4,d2
- moveq #10,d3
- jsr read(a6)
-
- bra.s nnamein
- nback:
- lea datname(pc),a0
- cmp.l a0,a4
- beq.s nnamein
-
- bsr backspace
- subq.l #1,a4
- bra.s nnamein
- nameex:
- clr.b (a4)
-
- rts
-
- ;--------------------
-
- namedruck:
- prtxt 31
-
- lea datname(pc),a4
- move.l a4,d2
- moveq #0,d3
- addname:
- tst.b (a4)+
- beq.s addraus
- addq.w #1,d3
- bra.s addname
- addraus:
- move.l conhandle(pc),d1
- jsr write(a6)
-
- print zeiloe,2
-
- rts
-
-
- ;************ daten,variablen ***********
-
- dosname:dc.b `dos.library`,0
- intname:dc.b `intuition.library`,0
- piname: dc.b `pidat`,0
- name: dc.b `raw:0/0/`
- windsize: dc.b `640/200/************** ADAM_V3 **************`,0
-
- ; deutsche texte
-
- dt1:
- dc.b $c,$9b,`0 p`,$9b,`20C`,$9b,`4;31;40mManulle Eingabe`
- dc.b $9b,`0;31;40m`,$a,$a
- dc.b ` Das Prompt-Zeichen > fordert zur Eingabe auf. In der`
- dc.b ` ersten und in der`,$a,` dritten Zeile`
- dc.b ` wird die Eingabe einer Zahl erwartet, in der`,$a
- dc.b ` zweiten Zeile die Eingabe eines Befehls.`,$a
- dc.b ` Hier können die Zeichen +, -, *, /`
- dc.b ` oder ein Buchstabe eingegegeben werden.`,$a
- dc.b ` Buchstaben, die Befehle auslösen:`,$a,$a,9
- dc.b `m = speichern`,9,9,9,`q = quadrieren`,$a,9
- dc.b `s = Wurzel ziehen`,9,9,`v = vergleichen`,$a,9
- dc.b `k = Kehrwert`,9,9,9,`! = Fakultät`,$a,9
- dc.b `w = Vorzeichen wechseln`,9,9,`i = Integer`,$a,9
- dc.b `S = Sinus`,$a,$a
- dc.b ` Anstatt eine Zahl einzugeben kann auch`,$a
- dc.b ` - p für pi`,$a
- dc.b ` - m für die Zahl im Speicher`,$a
- dc.b ` eingegeben werden.`,$a
- dc.b ` Jede Eingabe kann mit der Backspace-Taste gelöscht`
- dc.b ` werden`,$a,` und muß mit Return-Taste abgeschlossen`
- dc.b ` werden.`,$a,$a,9,9,`Drücke eine Taste `
- dt2:
- dc.b $9b,`0 p`,$9b
- dc.b `K f1, Esc = Hauptmenü`,9,9,9,`f2 = nochmal`,$a,$9b
- dc.b `K f3 = nochmal mit dem Ergebnis`,9,9,`f4 = format ändern `
- dc.b $a,$9b,`K f5 = Ergebnis speichern und nochmal f6 = help `
- dc.b $9b,` p`
- dt3: dc.b ` Beide Zahlen sind gleich gross`,$a
- dt4: dc.b ` Die erste Zahl ist grösser als die zweite`,$a
- dt5: dc.b ` Die zweite Zahl ist grösser als die erste`,$a
- dt6: dc.b ` Bedingungen für nst und vst:`,$a,9
- dc.b `- vst und nst müssen durch 4 teilbar sein`,$a,9
- dc.b `- vst und nst müssen kleiner als 30000 und größer`
- dc.b `als 19 sein`
- dt7: dc.b $c,$9b,`20B Speicher =`,$a
- dt8: dc.b `qr =`,$a
- dt9: dc.b 8,`^2 =`,$a
- dt10: dc.b $9b,`0 p`,$c,$a,$9b,`24C`,$9b,`4;31;40mHauptmenü`
- dc.b $9b,`0;31;40m`,$9b
- dc.b `3E f1, Esc = Ende`,$9b
- dc.b `2E f2 = rechnen`,$9b
- dc.b `2E f3 = Pi berechnen`,$9b
- dc.b `2E f4 = Hilfe `,$9b
- dc.b `2E f5 = Sprache : Deutsch`,$9b,`3E `
- dc.b $9b,`4;31;40mFeldgröße :`,$9b,`0;31;40m`,$a,$a
- dc.b 9,`vst =`,$a,9,`nst = `,$b
- dt11: dc.b $9b,`1;42H`,$9b,`4;31;40mIterationen :`
- dc.b $9b,`0;31;40m von `
- dt12: dc.b $c,$a,$9b,`24C`,$9b,`4;33;40mFehlermeldung`
- dc.b $9b,`0;31;40m`,$a,$a
- dt13: dc.b $d,` Bitte eine Taste drücken `,$9b,$4b
- dt14: dc.b ` Im Artwort des Feldes (st3) ist eine Null statt`
- dc.b ` 1,2 oder 3`
- dt15: dc.b ` Wurzel aus einer negativen Zahl`
- dt16: dc.b $c,` Anzahl der Iterationen ?`,$9b,`4E`
- dc.b ` Die Berechnung kann mit dem linken Mausknopf und`
- dc.b ` der rechten Shifttaste`,$a,` unterbrochen werden`
- dc.b $9b,`3F> `
- dt17: dc.b $9b,`3;1H`
- dc.b ` Weitermachen (y/n) oder quiet (q) ? `,$9b,$4b
- dt18: dc.b $9b,`5;1H Pi = `,$a
- dt19: dc.b $9b,`5E Einen Moment ... `
- dt20: dc.b ` =`,$9b,$4b,$a
- dt21: dc.b ` Division durch null`
- dt22: dc.b $c,` `,$9b,`4;31;40mFeldgröße :`
- dc.b $9b,`0;31;40m vst = `
- dt23: dc.b `, nst = `
- dt24: dc.b $9b,`3;1H Weitermachen`
- dc.b ` (y/n) oder wieder anzeigen (q) ? `,$9b,$4b
- dt25: dc.b $d,` quiet`,$9b,$4b
- dt26:
- dt27: dc.b ` Überlauf bei Addition`
- dt28: dc.b ` Überlauf bei Division`
- dt29: dc.b ` Überlauf bei Multiplikation`
- dt30: dc.b $d,` Zahl speichern (y/n) ? `,$9b,$4b
- dt31: dc.b $d,` Zahl gespeichert als : `,$9b,$4b
- dt32: dc.b $d,` Dateiname : `,$9b,$4b
- dt33: dc.b ` < Taste > `,$9b,$4b
- dt34: dc.b ` Fakultät einer negativen Zahl und einer nicht`
- dc.b `ganzen Zahl ist nicht erlaubt`
- dt35: dc.b 8,`* -1 =`,$a
- dt36: dc.b 8,`^ -1 =`,$a
- dt37: dc.b 8,`integer =`,$a
- dt38: dc.b $a,` Format : unformatiert`,$9b,$4b,$9b,`3F`
- dt39: dc.b $a,` Format : formatiert`,$9b,$4b,$9b,`3F`
- dt40: dc.b $d,` Fehler : Datei konnte nicht geöffnet werden `
- dc.b ` < Taste >`,$9b,$4b
- dt41: dc.b $a,` Datei `,34,`pidat`,34,` konnte nicht`
- dc.b ` geöffnet werden < Taste > `,$9b,$4b
- dt42: dc.b 8,`Sinus =`,$a
- dt43: dc.b $d,` Nicht gespeichert < Taste > `
- dt44: dc.b $a,9,`Nicht genug Speicher !`
- dt45: dc.b $a,9,`Konnte Fenster nicht öffnen !`
- dt46:
-
- ; englische texte
-
- et1:
- dc.b $c,$9b,`0 p`,$9b,`20C`,$9b,`4;31;40mHow to enter a`
- dc.b ` number`,$9b,`0;31;40m`,$a,$a
- dc.b ` The prompt > requests your enters. `
- dc.b `In the first`,$a,` and third line`
- dc.b ` you are expected to type in a number,`,$a
- dc.b ` in the second line a command.`,$a
- dc.b ` These are the commands :`,$a,$a
- dc.b 9,`+, -, *, / = add, subract, multiply, divide`,$a
- dc.b 9,`m = copy to memory`,9,9,`q = square`,$a
- dc.b 9,`s = square root`,9,9,9,`v = compare`,$a
- dc.b 9,`k = reciprocal`,9,9,9,`! = faculty`,$a
- dc.b 9,`w = change sign`,9,9,9,`i = integer`,$a
- dc.b 9,`S = sine`,$a,$a
- dc.b ` Instead of typing a number you can type`,$a
- dc.b ` - m for the number that is currently in the `
- dc.b `memory and `,$a,9,` is displayed at the bottom or `
- dc.b $a,` - p for pi`
- dc.b $a,` Each number and command must be concluded by `
- dc.b `<RETURN>`,$a,` and can be erased by <BACKSPACE>.`
- dc.b $a,$a,9,9,` Press any key `
- et2:
- dc.b $9b,`0 p`,$9b
- dc.b `K f1, Esc = Main Menu`,9,9,9,`f2 = once again`,$a,$9b
- dc.b `K f3 = once again with result`,9,9,`f4 = change format`
- dc.b $a,$9b,`K f5 = store result and once again f6 = help `
- dc.b $9b,` p`
- et3: dc.b ` The numbers are equal`,$a
- et4: dc.b ` The first number is higher`,$a
- et5: dc.b ` The second number is higher`,$a
- et6: dc.b ` Conditions for st : `,$a,$a
- dc.b ` vst and nst can be divided by 4 without a rest`
- dc.b $a,` vst and nst must be smaller than 30000 and `
- dc.b `greater than 19`
- et7: dc.b $c,$9b,`20B memory =`,$a
- et8: dc.b `qr =`,$a
- et9: dc.b 8,`^2 =`,$a
- et10: dc.b $9b,`0 p`,$c,$a,$9b,`24C`,$9b,`4;31;40mMain menu`
- dc.b $9b,`0;31;40m`,$9b
- dc.b `3E f1, Esc = Exit`,$9b
- dc.b `2E f2 = calculate`,$9b
- dc.b `2E f3 = calculate pi`,$9b
- dc.b `2E f4 = help `,$9b
- dc.b `2E f5 = language : English`,$9b,`3E `
- dc.b $9b,`4;31;40mSize of numbers :`,$9b,`0;31;40m`
- dc.b $a,$a,9,`vst =`,$a,9,`nst = `,$b
- et11: dc.b $9b,`1;43H`,$9b,`4;31;40mIterations :`
- dc.b $9b,`0;31;40m of `
- et12: dc.b $c,$a,$9b,`24C`,$9b,`4;33;40mErrormessage`
- dc.b $9b,`0;31;40m`,$a,$a
- et13: dc.b $d,` Press any key `,$9b,$4b
- et14: dc.b ` In the signword of the array is 0 instead of`
- dc.b ` 1,2 or 3`
- et15: dc.b ` Squareroot of a negative number`
- et16: dc.b $c,` How many iterations ?`,$9b,`4`,$45
- dc.b ` The calculation can be interrupted by pressing `
- dc.b `the left mousebutton`,$a,` or pressing the right`
- dc.b ` shift-key`,$9b,`3F> `
- et17: dc.b $9b,`3;1H`
- dc.b ` Go on (y/n) oder quiet (q) ? `,$9b,$4b
- et18: dc.b $9b,`5;1H pi = `,$a
- et19: dc.b $9b,`5`,$45,` one moment please ... `
- et20: dc.b ` =`,$9b,$4b,$a
- et21: dc.b ` Division by 0`
- et22: dc.b $c,` `,$9b,`4;31;40mSize of numbers :`
- dc.b $9b,`0;31;40m vst = `
- et23: dc.b `, nst = `
- et24: dc.b $9b,`3;1H Go on`
- dc.b ` (y/n) or print pi (q) ? `,$9b,$4b
- et25: dc.b $d,` quiet`,$9b,$4b
- et26:
- et27: dc.b ` Overflow at addition`
- et28: dc.b ` Overflow at division`
- et29: dc.b ` Overflow at multiplikation`
- et30: dc.b $d,` Write pi to file (y/n) ? `,$9b,$4b
- et31: dc.b $d,` Number saved as : `,$9b,$4b
- et32: dc.b $d,` File name : `,$9b,$4b
- et33: dc.b ` < press any key > `,$9b,$4b
- et34: dc.b ` Faculty of a negative and of a not integer number`
- dc.b `is not allowed`
- et35: dc.b 8,`* -1 =`,$a
- et36: dc.b 8,`^ -1 =`,$a
- et37: dc.b 8,`integer =`,$a
- et38: dc.b $a,` format : not formatted`,$9b,$4b,$9b,`3F`
- et39: dc.b $a,` format : formatted`,$9b,$4b,$9b,`3F`
- et40: dc.b $a,` File `,34,`pidat`,34,` could not be opened `
- dc.b ` < press any key >`,$9b,$4b
- et41: dc.b $a,` File `,34,`pidat`,34,` not found`
- dc.b ` < press any key >`,$9b,$4b
- et42: dc.b 8,`sine =`,$a
- et43: dc.b $d,$9b,`K Not done < press any key >`
- et44: dc.b $a,9,`ADAM : short of memory !`
- et45: dc.b $a,9,`Could not open window !`
- et46:
- even
-
- conhandle:
- text_tab:
- dc.l 0; conhandle
- dc.l eng_ttab-text_tabanf; distanzwert für sprache
- text_tabanf:
- dc.l 0,0; text0 gibt es nicht
- dc.l dt1,dt2-dt1,dt2,dt3-dt2,dt3,dt4-dt3,dt4,dt5-dt4
- dc.l dt5,dt6-dt5,dt6,dt7-dt6,dt7,dt8-dt7,dt8,dt9-dt8
- dc.l dt9,dt10-dt9,dt10,dt11-dt10,dt11,dt12-dt11
- dc.l dt12,dt13-dt12,dt13,dt14-dt13,dt14,dt15-dt14
- dc.l dt15,dt16-dt15,dt16,dt17-dt16,dt17,dt18-dt17
- dc.l dt18,dt19-dt18,dt19,dt20-dt19,dt20,dt21-dt20
- dc.l dt21,dt22-dt21,dt22,dt23-dt22,dt23,dt24-dt23
- dc.l dt24,dt25-dt24,dt25,dt26-dt25,dt26,dt27-dt26
- dc.l dt27,dt28-dt27,dt28,dt29-dt28,dt29,dt30-dt29
- dc.l dt30,dt31-dt30,dt31,dt32-dt31,dt32,dt33-dt32
- dc.l dt33,dt34-dt33,dt34,dt35-dt34,dt35,dt36-dt35
- dc.l dt36,dt37-dt36,dt37,dt38-dt37,dt38,dt39-dt38
- dc.l dt39,dt40-dt39,dt40,dt41-dt40,dt41,dt42-dt41
- dc.l dt42,dt43-dt42,dt43,dt44-dt43,dt44,dt45-dt44
- dc.l dt45,dt46-dt45
- eng_ttab:
- dc.l 0,0,et1,et2-et1,et2,et3-et2,et3,et4-et3,et4,et5-et4
- dc.l et5,et6-et5,et6,et7-et6,et7,et8-et7,et8,et9-et8
- dc.l et9,et10-et9,et10,et11-et10,et11,et12-et11
- dc.l et12,et13-et12,et13,et14-et13,et14,et15-et14
- dc.l et15,et16-et15,et16,et17-et16,et17,et18-et17
- dc.l et18,et19-et18,et19,et20-et19,et20,et21-et20
- dc.l et21,et22-et21,et22,et23-et22,et23,et24-et23
- dc.l et24,et25-et24,et25,et26-et25,et26,et27-et26
- dc.l et27,et28-et27,et28,et29-et28,et29,et30-et29
- dc.l et30,et31-et30,et31,et32-et31,et32,et33-et32
- dc.l et33,et34-et33,et34,et35-et34,et35,et36-et35
- dc.l et36,et37-et36,et37,et38-et37,et38,et39-et38
- dc.l et39,et40-et39,et40,et41-et40,et41,et42-et41
- dc.l et42,et43-et42,et43,et44-et43,et44,et45-et44
- dc.l et45,et46-et45
-
- ; schriftzeichen
- pu: dc.b `.`
- nu: dc.b `0`
-
- ; steuerzeichen
- bs1: dc.b 8,$20,8
- home: dc.b $9b,$48
- str2: dc.b $9b,`1;56H`
- str3: dc.b $9b,`3;1H`
- plumi: dc.b $d,`> -`
- miplu: dc.b $d,`> `
- zeiloe: dc.b $9b,$4b
- lflf: dc.b $a,$a
- ergeb: dc.b `> =`,$9b,$4b,$a
- cmp_tab:dc.b `01234`
- sicht: dc.b $9b,` p`
- r: dc.b 0,0,0,0
-
- ; variablenfelder (anzahl auch bei variab_anz ändern !)
-
- even
- speicher: dc.l 0; memoryfeld
- bcd1: dc.l 0
- bcd2: dc.l 0
- bcd3: dc.l 0
- bcd4: dc.l 0
- bcd5: dc.l 0
- bcd6: dc.l 0
- bcd7: dc.l 0
- bcd8: dc.l 0
- bcd9: dc.l 0
-
- ; rechenfelder (anzahl auch bei rech_anz ändern !)
-
- sqr1: dc.l 0; für sqrroot
- sqr2: dc.l 0; für sqrroot
- sqr3: dc.l 0; für sqrroot
- sqr4: dc.l 0; für sqrroot
- sqr5: dc.l 0; für sqrroot
-
- ; dezimalkonstanten (anzahl auch bei dez_anz ändern !)
-
- dez1: dc.l 0
- dez2: dc.l 0
- dez3: dc.l 0
-
- ; sonstige felder
-
- r1: dc.l 0; für mals
- rt1: dc.l 0; für div und mals und minusu und decrem
- tabr: dc.l 0; multiplikationstabelle für div und mals
- byte1: dc.l 0; für zahlein und druck
- buffer: dc.l 0; eingabe- und ausgabefeld
- pi: dc.l 0
-
- ; daten fur die zahlenkonstanten. bevor das ausgabefenster geöffnet
- ; wird, werden die daten in die variablen dez1,dez2... übertragen.
- ; sie dürfen vom programm nicht verändert werden !!!
-
- dezdat1: dc.w 1,0,2; 1
- dc.b 1,0
- dc.w 0,1,2; 0.2
- dc.b 2,0
- dc.w 3,0,2; 1/239
- dc.b 2,3,9,0
-
- stackpt: dc.l 0
- dosbase: dc.l 0
- datname: blk.b 44,0
- memlist: blk.l 30,0
- fehler: dc.w 0
- divzaeh: dc.w 0
-
- ; die folgenden variablen nicht umstellen !!!
-
- z1: dc.w 0
- z2: dc.w 0
- z3: dc.w 0
- punknum: dc.w 0
- vor: dc.w 0
- nach: dc.w 0
- vorzei: dc.b 0
-
- plflag: dc.b 0
- fdruck: dc.b 0
- format: dc.b 0
- op: dc.b 0
-
-