Skip to content

Latest commit

 

History

History
181 lines (140 loc) · 7.75 KB

random.md

File metadata and controls

181 lines (140 loc) · 7.75 KB
                              R A N D O M 
                                           
      
      In  MCCM 58  stond deze  source. Deze  was echter zonder het 
      -TIME gedeelte.  Zonder eerst  RND(-TIME) te  doen krijg  je 
      geen  goede random. Het begint dan telkens hetzelfde. Verder 
      was vergeten de DAC op integer te zetten.
      
      De  Math-pack routines  zitten helaas niet alleen in de MSX1 
      BIOS. Ze zitten deels in de BASIC ROM, en dus dien je die in 
      te  schakelen  bij gebruik.  Je moet  dus even  opletten met 
      terugschakelen indien  je page  1 nog  nodig hebt. En zorgen 
      dat je geen data op page 1 gebruikt.
      
      
                    W B A S S 2   V S .   G E N 8 0 
      
      Ikzelf  gebruik GEN80,  maar ik heb ook maar even een WBASS2 
      source op  disk gezet. Misschien dat ik GEN80 maar eens moet 
      bespreken  vanuit mijn  oogpunt, want ik herinner me nog dat 
      op Sunrise Special #1 stond dat WBASS2 "beter" is.
      
      
                        B I O S   A A N R O E P 
      
      De math-pack  aanroepadressen zitten in de BIOS. Daarom even 
      een macrootje.
      
      BIOS:           MACRO  @Address
                      ld     iy,(#fcc0)
                      ld     ix,@Address
                      call   #001c
                      ENDM
      
      
      Start:          ld     h,#40            ;Page 1
                      ld     a,(#fcc1)        ;BIOS slot
                      call   #0024            ;ENASLT
      
      Om  te  beginnen  wordt  de BASIC  ROM op  page 1  gezet. De 
      aanroepadressen zitten dan wel in de BIOS, maar je moet toch 
      zorgen dat de BASIC ROM op page 1 staat.
      
      
                      ld     de,0             ;Benedengrens
                      ld     hl,#1000         ;Bovengrens
                      call   Random
                      call   PrintHL
      
      Dit behoort duidelijk te zijn.
      
      
                      ld     h,#40
                      ld     a,(#f342)        ;RAM voor page 1
                      call   #0024
                      rst    0
      
      Even page 1 terugzetten, ik weet niet of het ook goed zonder 
      dit, maar dit is altijd een stuk netter.
      
      
      ;PrintHL
      ;Doel     : zet hl op scherm
      ;In       : hl
      ;Verandert: alles
      
      PrintHL:        ld     a,h              ;eerst high byte
                      push   hl               ;hl bewaren
                      call   PrintA           ;print a
                      pop    hl
                      ld     a,l              ;dan low byte
      PrintA:         push   af               ;af bewaren
                      and    %11110000        ;high nibble
                      rrca                    ;verplaatsen naar
                      rrca                    ;low nibble
                      rrca
                      rrca
                      call   PrintNibble      ;nibble printen
                      pop    af
                      and    %1111            ;low nibble
      PrintNibble:    cp     10               ;ook A t/m F
                      jr     c,NoHex          ;goed printen
                      add    a,"A"-"0"-10
      NoHex:          add    a,"0"
                      BIOS   #a2              ;print karakter
                      ret
      
      Dit  is een handige manier om hl op het scherm te zetten. De 
      routine bevat  ook meteen routines om a of de low nibble van 
      a op het scherm te zetten.
      
      
      ;Random
      ;Doel     : genereert een random-getal tussen bepaalde
      ;           grenzen
      ;In       : hl=bovengrens, de=benedengrens
      ;Uit      : hl=random getal
      ;Verandert: alles
      ;Noot     : op page 1 moet de BASIC ROM staan
      
      ;Math-pack entry's
      FRCINT:         EQU    #2f8a            ;DAC -> integer
                                              ;[op (DAC+2)]
      FRCDBL:         EQU    #303a            ;DAC -> dubbele
                                              ;precisie
      RND:            EQU    #2bdf            ;DAC = RND (DAC)
      DECMUL:         EQU    #27e6            ;DAC = DAC * ARG
      
      ;Data voor Math-pack
      DAC:            EQU    #f7f6
      ARG:            EQU    #f847
      VALTYP:         EQU    #f663
      
      JIFFY:          EQU    #fc9e            ;TIME in BASIC
      
      De gebruikte adressen.
      
      
      Random:         ld     a,2              ;DAC is integer
                      ld     (VALTYP),a
                      ld     (Offset),de      ;Bewaar ondergrens
                      or     a                ;Carry laag
                      sbc    hl,de            ;Bereken vermenig-
                                              ;vuldigingsfactor
                      ld     (Multiply),hl
      
                      ld     a,(FlagRnd)      ;Routine al
                                              ;aangeroepen?
                      or     a
                      jr     z,RndFirst
      
      Als  Random  de  eerste  keer  wordt aangeroepen  wordt niet 
      RND(1)  maar  RND(-TIME)  gedaan.  Hierdoor  krijg je  echte 
      random, voor zover dat mogelijk is.
      
      
                      ld     hl,1             ;Neem RND(1)
      
      RndContinue:    ld     (DAC+2),hl
                      BIOS   RND
                      ld     hl,DAC           ;Verplaats DAC naar
                                              ;ARG
                      ld     de,ARG
                      ld     bc,8
                      ldir
                      ld     hl,(Multiply)    ;Vermenigvul-
                                              ;digingsfactor =>
                                              ;dubbele precisie
                      ld     (DAC+2),hl
                      ld     a,2              ;Is nu nog een
                                              ;integer
                      ld     (VALTYP),a
                      BIOS   FRCDBL
                      BIOS   DECMUL
                      BIOS   FRCINT
                      ld     hl,(DAC+2)       ;Offset erbij
                                              ;optellen
                      ld     de,(Offset)
                      add    hl,de
                      ret
      
      RndFirst:       ld     a,255            ;Zet flag
                      ld     (FlagRnd),a
                      ld     hl,(JIFFY)       ;hl=TIME
                      ex     de,hl            ;hl=-hl
                      ld     hl,0             ;-) Dit kan vast op
                      or     a                ; een betere manier,
                      sbc    hl,de            ; maar ik heb nu
                                              ; geen zin (tis
                                              ; 2:28u)
                      jr     RndContinue
      
      
      Multiply:       dw     0
      Offset:         dw     0
      FlagRnd:        db     0                ;Wordt 255 na eerste
                                              ;aanroep
      
      Einde:          END
      
                                                    Kasper Souren