Last active
October 3, 2021 03:12
-
-
Save 8051Enthusiast/f514237c095f359961ff1fb07c5e5888 to your computer and use it in GitHub Desktop.
cursed_jumptable.a51
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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