[ASM] Worm for ZX

Старый спектрумистский форум

Moderator: Shaos

alone
Writer
Posts: 19
Joined: 06 Sep 2007 07:05
Location: 212.26.238.228

Post by alone »

Собственно, вот как оно короче всего получается на ZX Spectrum (через калькулятор). 121 байт. Опубликовано в IG#10.

Ступеньками обозначена глубина стека калькулятора.

Code: Select all

;SNAKE light edition by Alone Coder 19iii2007
;h - left
;k - right
;l - down
;p - up
;mem-0 is used in mod
;mem-0..2 are used in sin
        MACRO INCREMENT
        DB #A1 ;stk-one
        DB #0F ;addition
        ENDM 

;POKE=7808=#1E80 (gets A from stack, gets BC with keeping)
        MACRO POKE1ST
        DB #34 ;stk-data
        DB %00111101 ;1 b, EXP=#8D
        DB #74
        DB #CB ;st-mem-11 ;const POKE
        DB #2D ;usr-no
        ENDM 

        MACRO POKE
        DB #EB ;get-mem-11 ;const POKE
        DB #2D ;usr-no
        ENDM 

        MACRO SCRADDR1ST
       DB #34 ;stk-data ;=32
       DB %00110110 ;1 b, EXP=#86
       DB #00
      DB #C8 ;st-mem-8 ;const 32
      DB #04 ;multiply Y*32
       DB #0F ;addition
        DB #34 ;stk-data ;=#5800
        DB %00111111 ;1 b, EXP=#8F
        DB #30
       DB #CC ;st-mem-12 ;const #5800
       DB #0F ;addition
        ENDM 

        MACRO SCRADDR
       DB #E8 ;get-mem-8 ;const 32
      DB #04 ;multiply Y*32
       DB #0F ;addition
        DB #EC ;get-mem-12 ;const #5800
       DB #0F ;addition
        ENDM 

        ORG #6000
;attr=0 may be done in BASIC, and these 8 bytes may be killed
        XOR A
        LD H,#5B
clm0    DEC HL
        LD (HL),A
        CP (HL)
        JZ clm0
        RST #28
        DB #34 ;stk-data ;=24
        DB %00110101 ;1 b, EXP=#85
        DB #40
       DB #C9 ;st-mem-9 ;const 24 ;ATRRABB
       DB #C4 ;st-mem-4 ;RABBIT =1
        DB #A0 ;stk-zero
       DB #C5 ;st-mem-5 ;TAIL =0
       DB #C6 ;st-mem-6 ;XPOS =0
       DB #C3 ;st-mem-3 ;YPOS =0
loop
       ;stack:HEAD
        DB #34 ;stk-data ;BUF=#7A00=BUFLEN*4
        DB %00111111 ;1 b, EXP=#8F
        DB #74
       DB #CA ;st-mem-10 ;const BUF
       DB #0F ;addition HEAD+BUF
        DB #E6 ;get-mem-6 ;XPOS
       POKE1ST
        INCREMENT
        DB #E3 ;get-mem-3 ;YPOS
       POKE
        INCREMENT
        DB #EB ;get-mem-11 ;const BUFLEN
       DB #32 ;n-mod-m
       DB #02 ;delete ;BUF/BUFLEN = 4/5
       ;stack:HEAD

        DB #E5 ;get-mem-5 ;TAIL
       DB #E4 ;get-mem-4 ;RABBIT
      DB #30 ;not (1 if RABBIT=0)
      DB #31 ;duplicate
     DB #0F ;addition (2 if RABBIT=0)
      DB #0F ;addition TAIL+0/2
       DB #EB ;get-mem-11 ;const BUFLEN
      DB #32 ;n-mod-m
      DB #02 ;delete ;TAIL/BUFLEN = 4/5
       DB #C5 ;st-mem-5 ;TAIL
      ;stack:HEAD,TAIL

       DB #EA ;get-mem-10 ;const BUF
      DB #0F ;addition TAIL+BUF
       DB #31 ;duplicate ;for peek YPOS
      DB #2B ;peek ;XTAIL
      DB #01 ;exchange ;XPOS,addr
      INCREMENT
      DB #2B ;peek ;YTAIL
      SCRADDR1ST
       DB #E4 ;get-mem-4 ;RABBIT
      POKE
       DB #02 ;delete ;RABBIT SCRADDR
       ;stack:HEAD

        DB #34 ;stk-data ;=#5C08
        DB %01111111 ;2 b, EXP=#8F
        DB #38,#10
       DB #2B ;peek
       DB #C7 ;st-mem-7 ;KEY
       DB #20 ;cos
      DB #E8 ;get-mem-8 ;const 32
      DB #A2 ;stk-half
     DB #0F ;addition
      DB #0F ;addition
       DB #27 ;int
       DB #E6 ;get-mem-6 ;XPOS
      DB #0F ;addition
       DB #E8 ;get-mem-8 ;const 32
      DB #32 ;n-mod-m
      DB #02 ;delete ;XPOS/32 = 0/1/2
       DB #C6 ;st-mem-6 ;XPOS
      ;stack:HEAD,XPOS

       DB #E7 ;get-mem-7 ;KEY
      DB #1F ;sin
     DB #E9 ;get-mem-9 ;const 24
     DB #A2 ;stk-half
    DB #0F ;addition
     DB #0F ;addition
      DB #27 ;int
      DB #E3 ;get-mem-3 ;YPOS
     DB #0F ;addition
      DB #E9 ;get-mem-9 ;const 24
     DB #32 ;n-mod-m
     DB #02 ;delete ;YPOS/24 = 0/1/2
      DB #C3 ;st-mem-3 ;YPOS
      SCRADDR
      ;stack:HEAD,SCRADDR
dieloop
       DB #31 ;duplicate ;for POKE ATRSN
      DB #2B ;peek
      DB #C4 ;st-mem-4 ;RABBIT <>0 (if ATRRABB)
      DB #E8 ;get-mem-8 ;const 32 ;ATRSN
     DB #0E ;nos-eql ;TRUE if =
      DB #00 ;jump-true
      DB dieloop-$
       DB #E8 ;get-mem-8 ;const 32 ;ATRSN
      POKE
       DB #02 ;delete ;HEAD SCRADDR
       ;stack:HEAD
        DB #33 ;jump
        DB loop-$
User avatar
Shaos
Admin
Posts: 24128
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Ух ты - сам Alone Coder к нам пожаловал! :o

P.S. Я перенёс пост из топика Worm для IBM PC сюда
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Post by Mac Buster »

Shaos wrote:Ух ты - сам Alone Coder к нам пожаловал! :o
Здорово :D
Extreme Entertainment