Skip to content

Instantly share code, notes, and snippets.

@8051Enthusiast
Last active October 3, 2021 03:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 8051Enthusiast/f514237c095f359961ff1fb07c5e5888 to your computer and use it in GitHub Desktop.
Save 8051Enthusiast/f514237c095f359961ff1fb07c5e5888 to your computer and use it in GitHub Desktop.
cursed_jumptable.a51
; Licensed under the MIT License:
; Copyright (c) 2021 8051Enthusiast
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
; The above copyright notice and this permission notice shall be included in all
; copies or substantial portions of the Software.
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
; SOFTWARE.
; -----------------------------------------------------------------------------
; a jumptable containing a function for each 8051 instruction
; (up to register choice and operands of same type, reti left out)
; I wanted to fit the table into 256 bytes, so I stuffed
; instructions into the immediate value and relative
; jump operands of other instructions (jumps always go to ret)
; bit addresses, direct addresses are left as is to be configurable,
; absolute/block jumps can't contain specific instructions either
; This is for the purpose of determining the timing of each instructions
; since I don't know the timings of some 8051 mcus
; most timings are just calculated by taking the base time by jumping to
; INSRET (directly returning) and then subtracting that from the time
; to execute the chosen function
; towards the end there are a few instructions which modify the stack
; and require a special treatment
; set to wherever you feel comfortable to write random data to
FREE_XDATA XDATA 08000h
; (not memory address of r0-r7, not sp)
FREE_DATA DATA ACC
FREE_BIT BIT ACC.0
INSTART:
INS3: LJMP retloc
INS2: AJMP retloc
INS15: DB 020h ;JB FREE_BIT, $+6
DB FREE_BIT
INS7: DB 006h ;INC @R0
INSRET: RET
INS104: MOV R1, A
RET
INS77: DB 0B4h ;CJNE A, #024h, $+0
INS17: DB 024h ;ADD A, #00
INS1: DB 000h ;NOP
RET
INS9: DB 010h ;JBC FREE_BIT, $+9
DB FREE_BIT
INS8: DB 009h ;INC R1
RET
INS101: CPL A
RET
INS102: MOV FREE_DATA, A
RET
INS21: DB 030h ;JNB FREE_BIT, $+0x13
DB FREE_BIT
INS10: DB 013h ;RRC A
RET
INS6: INC FREE_DATA
RET
INS79: DB 0B6h ;CJNE @R0, #040h, $+0x14
INS27: DB 040h ;JC jcr
INS11: DB 014h ;DEC A
RET
INS34: DB 050h ;JNC $+0x16
INS13: DB 016h ;DEC @R0
RET
INS41: DB 060h ;JZ $+0x19
INS14: DB 019h ;DEC R1
RET
INS48: DB 070h ;JNZ $+03
INS4: DB 003h ;RR A
RET
INS54: DB 080h ;SJMP $+0x26
INS19: DB 026h ;ADD A, @R0
RET
INS78: DB 0B5h ;CJNE A, FREE_DATA, $+0x29
DB FREE_DATA
INS20: DB 029h ;ADD A, R1
RET
INS80: DB 0B9h ;CJNE R1, #0D9h, $+0x33
INS92: DB 0D9h ;DJNZ R1, $+0x33
INS22: DB 033h ;RLC A
RET
INS12: DEC FREE_DATA
RET
INS98: MOV A, R1
RET
INS90: DB 0D5h ;DJNZ FREE_DATA, $+0x39
DB FREE_DATA
INS26: DB 039h ;ADDC A, R1
RET
INS103: MOV @R0, A
RET
INS88: SETB C
RET
INS89: DA A
RET
INS18: ADD A, FREE_DATA
RET
INS97: MOV A, @R0
RET
INS91: XCHD A, @R0
RET
INS23: DB 034h ;ADDC A, #23h
INS16: DB 023h ;RL A
RET
INS24: ADDC A, FREE_DATA
RET
INS85: XCH A, @R0
RET
INS28: ORL FREE_DATA, A
RET
INS29: DB 043h ;ORL FREE_DATA, #04h
DB FREE_DATA
INS5: DB 004h ;INC A
RET
INS96: MOV A, FREE_DATA
RET
INS30: DB 044h ;ORL A, #046h
INS32: DB 046h ;ORL A, @R0
RET
INS31: ORL A, FREE_DATA
RET
INS33: ORL A, R1
RET
INS35: ANL FREE_DATA, A
RET
INS86: XCH A, R1
RET
INS87: SETB FREE_BIT
RET
INS36: DB 053h ;ANL FREE_DATA, #059h
DB FREE_DATA
INS40: DB 059h ;ANL A, R1
RET
INS37: DB 054h ;ANL A, #056h
INS39: DB 056h ;ANL A, @R0
RET
INS38: ANL A, FREE_DATA
RET
INS42: XRL FREE_DATA, A
RET
INS43: DB 063h ;XRL FREE_DATA, #0A4h
DB FREE_DATA
INS71: DB 0A4h ;MUL AB
RET
INS44: DB 064h ;XRL A, #066h
INS46: DB 066h ;XRL A, @R0
RET
INS45: XRL A, FREE_DATA
RET
INS49: ORL C, FREE_BIT
RET
INS50: DB 074h ;MOV A, #084h
INS57: DB 084h ;DIV AB
RET
INS51: DB 075h ;MOV FREE_DATA, #0E4h
DB FREE_DATA
INS95: DB 0E4h ;CLR A
RET
INS52: DB 076h ;MOV @R0, #069h
INS47: DB 069h ;XRL A, R1
RET
INS53: DB 079h ;MOV R1, #036h
INS25: DB 036h ;ADDC A, @R0
RET
INS55: ANL C, FREE_BIT
RET
INS56: MOVC A, @A+PC
RET
INS58: MOV FREE_DATA, FREE_DATA
RET
INS59: MOV FREE_DATA, @R0
RET
INS60: MOV FREE_DATA, R1
RET
INS61: DB 090h ;MOV DPTR, #...
INS62: DB 092h ;MOV FREE_BIT, C
DB FREE_BIT
RET
INS63: MOVC A, @A+DPTR
RET
INS64: DB 094h ;SUBB A, #096h
INS66: DB 096h ;SUBB A, @R0
RET
INS65: SUBB A, FREE_DATA
RET
INS67: SUBB A, R1
RET
INS68: ORL C, /FREE_BIT
RET
INS69: MOV C, FREE_BIT
RET
INS70: INC DPTR
RET
INS72: MOV @R0, FREE_DATA
RET
INS73: MOV R1, FREE_DATA
RET
INS74: ANL C, /FREE_BIT
RET
INS75: CPL FREE_BIT
RET
INS76: CPL C
RET
INS81: CLR FREE_BIT
RET
INS82: CLR C
RET
INS83: SWAP A
RET
INS84: XCH A, FREE_DATA
RET
INS93: MOV DPTR, #FREE_XDATA
MOVX A, @DPTR
RET
INS94: MOVX A, @R0
RET
INS99: MOV DPTR, #FREE_XDATA
MOVX @DPTR, A
RET
INS100: MOVX @R0, A
RET
; -- these instructions modify the stack so they must be calculated specifically
POPI: INC SP ;t(pop) = t - t(inc direct) - t(base)
POP FREE_DATA
RET
PUSHI: PUSH FREE_DATA ;t(push) = t - t(dec direct) - t(base)
DEC SP
RET
RETIN: MOV DPTR, #retloc
PUSH DPL ;t(ret) = t - 2*t(push direct)
PUSH DPH ; - t(mov dptr, #immed16) - t(base)
retloc: RET
LCALLI: LCALL lcloc ;t(lcall) = t - t(ret) - t(base)
lcloc: RET
ACALLI: ACALL acloc ;t(acall) = t - t(ret) - t(base)
acloc: RET
JMPI: MOV DPTR, #retloc
CLR A ;t(jmp @a+dptr) = t - t(clr a) - t(base)
JMP @A+DPTR ; - t(mov dptr, #immed16)
TIME_ADDRESS_TABLE:
DB (INSRET - INSTART) ;t(base)
DB (INS1 - INSTART)
DB (INS2 - INSTART)
DB (INS3 - INSTART)
DB (INS4 - INSTART)
DB (INS5 - INSTART)
DB (INS6 - INSTART)
DB (INS7 - INSTART)
DB (INS8 - INSTART)
DB (INS9 - INSTART)
DB (INS10 - INSTART)
DB (INS11 - INSTART)
DB (INS12 - INSTART)
DB (INS13 - INSTART)
DB (INS14 - INSTART)
DB (INS15 - INSTART)
DB (INS16 - INSTART)
DB (INS17 - INSTART)
DB (INS18 - INSTART)
DB (INS19 - INSTART)
DB (INS20 - INSTART)
DB (INS21 - INSTART)
DB (INS22 - INSTART)
DB (INS23 - INSTART)
DB (INS24 - INSTART)
DB (INS25 - INSTART)
DB (INS26 - INSTART)
DB (INS27 - INSTART)
DB (INS28 - INSTART)
DB (INS29 - INSTART)
DB (INS30 - INSTART)
DB (INS31 - INSTART)
DB (INS32 - INSTART)
DB (INS33 - INSTART)
DB (INS34 - INSTART)
DB (INS35 - INSTART)
DB (INS36 - INSTART)
DB (INS37 - INSTART)
DB (INS38 - INSTART)
DB (INS39 - INSTART)
DB (INS40 - INSTART)
DB (INS41 - INSTART)
DB (INS42 - INSTART)
DB (INS43 - INSTART)
DB (INS44 - INSTART)
DB (INS45 - INSTART)
DB (INS46 - INSTART)
DB (INS47 - INSTART)
DB (INS48 - INSTART)
DB (INS49 - INSTART)
DB (INS50 - INSTART)
DB (INS51 - INSTART)
DB (INS52 - INSTART)
DB (INS53 - INSTART)
DB (INS54 - INSTART)
DB (INS55 - INSTART)
DB (INS56 - INSTART)
DB (INS57 - INSTART)
DB (INS58 - INSTART)
DB (INS59 - INSTART)
DB (INS60 - INSTART)
DB (INS61 - INSTART)
DB (INS62 - INSTART)
DB (INS63 - INSTART)
DB (INS64 - INSTART)
DB (INS65 - INSTART)
DB (INS66 - INSTART)
DB (INS67 - INSTART)
DB (INS68 - INSTART)
DB (INS69 - INSTART)
DB (INS70 - INSTART)
DB (INS71 - INSTART)
DB (INS72 - INSTART)
DB (INS73 - INSTART)
DB (INS74 - INSTART)
DB (INS75 - INSTART)
DB (INS76 - INSTART)
DB (INS77 - INSTART)
DB (INS78 - INSTART)
DB (INS79 - INSTART)
DB (INS80 - INSTART)
DB (INS81 - INSTART)
DB (INS82 - INSTART)
DB (INS83 - INSTART)
DB (INS84 - INSTART)
DB (INS85 - INSTART)
DB (INS86 - INSTART)
DB (INS87 - INSTART)
DB (INS88 - INSTART)
DB (INS89 - INSTART)
DB (INS90 - INSTART)
DB (INS91 - INSTART)
DB (INS92 - INSTART)
DB (INS93 - INSTART)
DB (INS94 - INSTART)
DB (INS95 - INSTART)
DB (INS96 - INSTART)
DB (INS97 - INSTART)
DB (INS98 - INSTART)
DB (INS99 - INSTART)
DB (INS100 - INSTART)
DB (INS101 - INSTART)
DB (INS102 - INSTART)
DB (INS103 - INSTART)
DB (INS104 - INSTART)
DB (POPI - INSTART)
DB (PUSHI - INSTART)
DB (RETIN - INSTART)
DB (LCALLI - INSTART)
DB (ACALLI - INSTART)
DB (JMPI - INSTART)
;note: RETI not implemented
TIME_ADDRESS_TABLE_END:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment