123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- .define .rck
- .sect .text
- .sect .rom
- .sect .data
- .sect .bss
- .sect .text
- ! Range check
- ! Expects on stack: address of range check descriptor
- ! index
- ! Yields index on stack unchanged
- ! Causes a trap if index is out of bounds
- .rck: pop h
- shld .retadr
- mov h,b
- mov l,c
- shld .bcreg
- pop h ! hl = return address
- pop d ! de = index
- mov c,m ! bc = lower bound
- inx h
- mov b,m
- inx h
- mov a,d
- xra b
- jm 1f ! jump if index and l.b. have different signs
- mov a,e
- sub c
- mov a,d
- sbb b
- jmp 2f
- 1: xra b ! now a = d again
- 2: cm erange ! trap if index too small
- mov c,m
- inx h
- mov b,m
- mov a,d
- xra b
- jm 1f ! jump if index and u.b. have different signs
- mov a,c
- sub e
- mov a,b
- sbb d
- jmp 2f
- 1: xra d ! now a = b
- 2: cm erange ! trap if index is too large
- lhld .bcreg
- mov b,h
- mov c,l
- lhld .retadr
- pchl
|