title The Game of Robot name ('ROBOT') include solvdm.lib ; ROBOT, A VDM ROBOT SIMULATION ; ; FROM BYTE, APRIL 1978 ; ; ######################################################## ; # Angepasst an den JOYCE, Werner Cirsovius, Maerz 2002 # ; ######################################################## ; extrn SOLon,CONsta,CONdat _rob equ _bel speed0 equ 5fffh speed1 equ 1fffh ; start: ld sp,stack ; Stack laden call SOLon ; SOL einschalten call randomize ; Zufallszahl initiieren ; ; Aufbau des Feldrahmens ; ld d,14 ld hl,SOLvid ; HL auf VDM-Startadresse ld bc,256*(maxcol+2)+' '+MSB call load scrn: ld bc,256*(maxcol-4)+' ' call load ld bc,256*4+' '+MSB call load dec d jr nz,scrn ld bc,256*(maxcol-2)+' '+MSB call load ; ; Spielstart ; ld hl,SOLvid+8*maxcol+32 ld_hl_8 _rob ; Roboter auf den Bildschirm go: call rnd ; Zufallszahl holen and 00000010b jr z,rc0 ld a,00010000b rc0: call rec ; Neuen Status ablegen dis: call rnd ; Zufallszahl holen ld (dstat),a dir: call rnd ; Zufallszahl holen ld b,a ld a,(pstat) ; Status laden and 00010000b add a,b ld (pstat),a chek: ld b,a ld a,(ostat) ; Alten Status laden xor b cp 00010000b jr z,dir wait: ld a,(pstat) ; Status laden and 00001111b cp 00000001b jr z,swait lwait: ld bc,speed0 ; Verzoegerung laden jr dec swait: ld bc,speed1 dec: dec bc ld a,b or a ; Test ob Null jr nz,dec ld_hl_8 ' ' mov1: ld a,(pstat) ; Status laden cp 00000000b ; .. und testen jr z,ur cp 00000001b jr z,rt cp 00000010b jr z,dr cp 00010011b jr z,dn cp 00010000b jr z,dl cp 00010001b jr z,lft cp 00010010b jr z,ul cp 0000011b jr z,up ur: ld de,-(maxcol-2) ; Bewegung holen jr next rt: ld de,1 jr next dr: ld de,maxcol+2 jr next dn: ld de,maxcol jr next dl: ld de,maxcol-2 jr next lft: ld de,-1 jr next ul: ld de,-(maxcol+2) jr next up: ld de,-maxcol next: add hl,de ; Neuen Wert berechnen call bounds ; Test ob Spielgrenze ; call CONsta ; Test ob Taste betaetigt jr z,nextt call CONdat nextt: ld_hl_8 _rob ; Roboter setzen ld a,(dstat) dec a ld (dstat),a cp -1 jr nz,wait jp go ; ; Test ob Spielgrenze erreicht ist ; bounds: ld_a_hl ; Zeichen laden and MSB ; .. test ob Grenze ret z ; .. nein pop af ; Stack fixieren ld a,(pstat) ; Status laden ld c,00010000b xor c ld (pstat),a jr mov1 ; ; Zeichen in Reg C b-mal in den Videospeicher ablegen ; load: ld_hl_c ; Zeichen speichern inc hl djnz load ret ; ; Neuen Status ablegen ; rec: push hl ld hl,pstat ld c,(hl) ld (hl),a inc hl ld (hl),c pop hl ret ; ; Zufallszahl erzeugen ; rnd: push hl ld hl,sh+3 ld b,8 rtop: ld a,(hl) rlca rlca rlca xor (hl) rla rla dec hl dec hl dec hl rl (hl) inc hl rl (hl) inc hl rl (hl) inc hl rl (hl) djnz rtop ld a,(hl) and 03h pop hl ret ; ; Zufallszahl initiieren ; randomize: ld a,r ; Refresh Counter ld (sh+3),a ; .. fuer Zahl nop nop nop ld a,r ld (sh+1),a ret ; sh: dw 1234h dw 5678h pstat: ; \ db 00000001b ; | ostat: ; | db 00000001b ; / dstat: db 1 ; ds 2*32 stack equ $ end