A86: april fool's source code
[Prev][Next][Index][Thread]
A86: april fool's source code
people have been requesting the source for the april fool's joke so here it
is. i'm sure i could have optimized, etc. but i wanted to get it to you
before when you needed to use it :) probably look at it in
courier/monospaced font or notepad or something for best clarity kirk
=== begin source code
#include "asm86.h"
#include "ram86.inc"
#include "ti86abs.inc"
#include "ti86asm.inc"
#include "ti86ops.inc"
.org _asm_exec_ram
Start:
ld hl,op_info-1 ;this sees if (sqrt)KEY already exists
rst 20h
call _findsym
jr c,Install
call _delvar ;if so, delete it :)
Install:
ld hl,code_end-code ;hl = size of program
push hl ;we need this value again, so save it
call $474f ;creates program (name already was in OP1)
ld a,b
ex de,hl
call $4c3f
call _SET_ABS_DEST_ADDR
xor a
pop hl ;get back our saved value
call _SET_MM_NUM_BYTES
ld hl,code ;point to the code
call _SET_ABS_SRC_ADDR
call _mm_ldir ;copy the program to (sqrt)KEY
res 0,(iy+$25) ;set the user-defined flag
set 6,(iy+$24) ;enable (sqrt)KEY
jp $409c ;return
op_info:
.db $4,$10
.db "KEY",0
code:
.db $8e,$28
call $479f ;a call used in TI's demo program
ld a,(_asm_reg_a) ;get saved value of A - its the key code pressed
push af ;save this value
bit 0,(iy+$20)
jr nz,code_exit ;i dunno but i think it must be there
ld a,(_CXCURAPP) ;load the current screen of the calculator
cp $20 ;if they're not looking at the RAM...
jr nz,code_exit ;then skip everything
pop af ;get our getkey value back
push af ;then save it again
cp K_MORE ;if they aren't pushing MORE at this screen
jr nz,code_exit ;then skip everything
bit 0,(iy+$25) ;if it's already enabled, disable it
jr nz,is_going
set 0,(iy+$25) ;otherwise, enable it
call _clrScrn ;clear the screen
call _homeup ;and display the message
ld hl,the_message
call _puts
call _homeup
call $4ab5 ;this copies _textShadow to _cmdShadow i think
jp $409C ;return
is_going:
res 0,(iy+$25) ;reset the user flag
ld a,$1F ;something extra not in the release version
ld ($C008),a ;this turns the contrast all the way down but tells
xor a ;the 86 that it's all the way up. the effect is that
out (2),a ;they must turn the contrast down to turn it up :)
code_exit:
pop af ;pop our saved getkey
bit 0,(iy+$25) ;look at the user flag
jr z,code_done ;if not set, go to the ending
ld hl,key_table ;point to the translator table
ld d,0 ;de = the key pressed
ld e,a
add hl,de ;get offset into table
ld a,(hl) ;and get a byte
code_done:
cp a ;if the zero flag is set upon returning from
;(sqrt)KEY then it takes the value in A and makes
;that into the key that was pressed. if the not zero
;flag is set, then i think (i haven't tested this)
;that the value in A is taken as the key that was
;pressed also. however - when the zero flag is set,
;the key is a code associated with _getky (the
;one that doesn't loop). when the not zero flag is
;set, the key is a code associated with _getkey (the
;one that does loop and also saves energy).
ret ;return - could also use jp $409C if i felt like it
:)
the_message = $ - code + $D746
;123456789012345678901
.db " Hah! Did you forget "
.db "about April Fool",39,"s???"
.db " I rearranged your "
.db "keyboard for you. You"
.db "can eliminate this by"
.db " pushing MORE at the "
.db "memory check screen!!",0
;this is the table for the keyremapping
key_table = $ - code + $D746
.db $00
.db $13
.db $04
.db $09
.db $15
.db 0,0,0,0
.db $14
.db $02
.db $22
.db $27
.db $16
.db $1F
.db $19
.db 0
.db $0C
.db $0D
.db $17
.db $1C
.db $01
.db $0A
.db $0B
.db 0
.db $21
.db $33
.db $26
.db $34
.db $25
.db $1D
.db $23
.db $1A
.db $1B
.db $35
.db $1E
.db $0E
.db $36
.db $2C
.db $32
.db $37
.db 0
.db $24
.db $20
.db $2D
.db $28
.db $2A
.db $12
.db $38
.db $2E
.db $2B
.db $0F
.db $11
.db $2F
.db $30
.db $31
.db $03
code_end:
.end
Follow-Ups: