Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;0OPs
;

zero_ops:       ;0OP: 0   1     2      3      4       5       6        7
        defw    rtrue,  rfalse, print, prret, no_op,  d_save, d_restr, restart
        defw    rpop,   catch,  zquit, newln, sstatus,vrfy,   fail,    piracy
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;0OP returns
;
rpop:   call    zpop
        jr      z_ret
;
rfalse: ld      hl,0
        jr      z_ret
;
rtrue:  ld      hl,1
z_ret:  ex      de,hl   ;DE = returned value
        ld      ix,(zsp)
        ld      l,(ix+0)
        ld      h,(ix+1)
        ld      (zpc),hl
        ld      l,(ix+2)
        ld      h,(ix+3)
        ld      (zpc+2),hl
        ld      l,(ix+36)
        ld      h,(ix+37)       ;Routine stack pointer
        ld      (rsp),hl
        ld      a,(ix+34)       ;CALL type - 0 to return a result in DE
        ld      bc,38           ;1 to return nothing
        add     ix,bc           ;2,3 for timer interrupt returns
        ld      (zsp),ix        ;POP that frame
        cp      3
        jp      z,rchr_iret
        cp      2
        jp      z,timer_iret
        or      a
        scf
        ret     nz
        ex      de,hl           ;HL = returned value
        scf
        jp      ret_hl
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
prret:  call    print           ;Print_ret
        call    newln
        jp      rtrue
;
print:  call    zpcipeek
        ld      b,a
        call    zpcipeek
        ld      c,a             ;BC=packed word
        call    printwrd
        bit     7,b
        jr      z,print
        call    rshift
        scf
        ret
;
printwrd:
        push    bc
        ld      a,b
        rrca
        rrca
        and     1Fh
        call    op_zchar
        ld      a,b
        rla
        rla
        rla
        and     018h            ;
        ld      b,a
        ld      a,c
        rlca
        rlca
        rlca
        and     7
        or      b
        call    op_zchar
        ld      a,c
        and     1Fh
        call    op_zchar
        pop     bc
        ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
newln:  ld      hl,0dh
        call    ll_zchr
        scf
        ret
;
no_op:  scf
        ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
zquit:  xor     a
        ld      (running),a
        scf
        ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
piracy: jp      branch  ;Assume genuine

vrfy:   ld      hl,1ah
        ld      e,0
        call    ZXPKWD
        ld      l,c
        ld      h,b     ;HL = file length
        ld      e,0
        sla     l
        rl      h
        rl      e
        ld      a,(zver)
        cp      4
        jr      c,vrfy1 ;v1-3: Scale by factor of 2
        sla     l
        rl      h
        rl      e
        cp      6       ;v4-v5: Scale by factor of 4
        jr      c,vrfy1
        sla     l       ;v6: Scale by factor of 8
        rl      h
        rl      e       ;EHL = true file length
vrfy1:  ld      bc,40h  ;<< v0.02 >> This label moved down 3 lines, bug fix
        and     a
        sbc     hl,bc
        jr      nc,vrfy2
        dec     e
vrfy2:  push    hl      ;EHL = no. of bytes to verify
        pop     bc
        ld      d,e     ;DBC = no. of bytes to verify
        call    ZXVRFY
        push    hl      ;Calculated sum
        ld      hl,1ch
        ld      e,0
        call    ZXPKWI  ;BC = checksum
        pop     hl      ;Calculated sum
        and     a
        sbc     hl,bc
        jp      z,branch
        jp      nbranch
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
catch:  ld      a,(zver)
        cp      5
        jr      c,v1pop
        ld      hl,(zstop)      ;Top of z-stack
        ld      de,(zsp)
        and     a
        sbc     hl,de           ;HL = stack frame ID, independent of the
                                ;stack base (necessary for savefile
                                ;compatability).
        scf
        jp      ret_hl
;
v1pop:  call    zpop
        scf
        ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
restart:
        ld      a,2
        ld      (running),a
        scf
        ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;<< v0.04  show_status - draw the status line
;
sstatus:
        ld      a,(zver)
        cp      3
        scf
        ret     nz
        call    flush_buf
        ld      a,1             ;1 line for status line
        call    ZXSWND
        ld      a,1
        call    ZXUWND
        ld      a,1             ;Reverse on
        call    ZXSTYL

        call    ZXGETX          ;A = screen width
        ld      b,a
sblank: push    bc
        ld      hl,' '
        ld      a,1
        call    ZXZCHR
        pop     bc
        djnz    sblank
        ld      bc,0101h
        call    ZXSCUR

        ld      a,10h           ;1st global
        call    get_glb         ;HL := object number
        ex      de,hl
        ld      a,d             ;<< v1.01 Guard against object 0 errors
        or      e
        jr      z,noloc         ;>> v1.01
        call    objadd          ;Get address of object into HL
        ld      bc,7
        add     hl,bc
        ld      e,0
        call    ZXPKWI          ;BC = address
        inc     bc              ;skip count byte
        ld      h,b
        ld      l,c
        call    printp1         ;Print location object
        call    flush_buf
noloc:  ld      hl,1            ;<< v1.04 Flags 1 is at address 1 >>
        call    ZXPK64          ;Get Flags 1, bit 1
        bit     1,a
        ld      a,':'
        ld      de,stbuf
        jr      nz,sltime
        ld      a,'/'
sltime:
        ld      (statsep),a
;
;Status contains score/turns
;
        ld      a,11h           ;"Score" global
        push    de
        call    get_glb         ;Score/turns
        pop     de
        bit     7,h
        jr      z,pscore
        ld      a,'-'
        ld      (de),a
        inc     de
        call    neghl
pscore: call    spdec           ;Done score
        ld      a,(statsep)
        ld      (de),a
        inc     de
        ld      a,12h           ;"Turns" global
        push    de
        call    get_glb
        pop     de
        call    spdec
        ld      hl,stbuf
        ex      de,hl
        and     a
        sbc     hl,de           ;L = Length of the score/turns string
        ld      b,l
        push    bc
        ld      bc,0138h        ;8 characters in from the left
        call    ZXSCUR          ;Right-align the score/turns
        pop     bc
        ld      de,stbuf
        jr      ostbuf
;
ostbuf: push    bc
        push    de
        ld      a,(de)
        ld      l,a
        ld      h,0
        ld      a,1
        call    ZXZCHR
        pop     de
        pop     bc
        inc     de
        djnz    ostbuf
;
        xor     a
        call    ZXSTYL
        xor     a
        call    ZXUWND
        scf
        ret
;
statsep:
        defb    '/'
stbuf:  defb    '999/9999        '