Help
[Prev][Next][Index][Thread]
Help
Do you just type the assembly program as you would basic programs or
do you need a program to type this program in.
> ----- HILO.ASM -----
> ;* * * Small-C/Plus Version 1.00 * * *
> ; Cain, Van Zandt, Hendrix, Yorston
> ; 25th February 1988
> ;
> ; Modified by Edward Thompson for TI-85
> ; Send Comments to edt@infinet.com
> #include "ti.h"
>
> .org 0
>
> .db "hilo",0
> CALL_(InitEmXX)
> JUMP_(qmain)
> .export qclearLCD
> qclearLCD:
> ROM_CALL(CLEARLCD)
> ld hl,0
> ld ($800C),hl ; reset XY position to top of screen
> RET
>
>
> .export qwaitExit
> qwaitExit:
> WaitKey:
> ld a,0
> call GET_KEY
> cp K_EXIT
> jr nz,WaitKey
> RET
>
>
> qwaitKey:
> LD A,0
> CALL GET_KEY
> CP 0
> JR Z,qwaitKey
> LD H,0
> LD L,A
> RET
> qchkEnter:
> CALL GET_KEY
> CP K_ENTER
> JR NZ,qchEn2
> LD HL,1
> RET
> qchEn2:
> LD HL,0
> RET
> qchkExit:
> CALL GET_KEY
> CP K_EXIT
> JR NZ,qchkE2
> LD HL,1
> RET
> qchkE2:
> LD HL,0
> RET
> qbusyOn:
> ROM_CALL(BUSY_ON)
> RET
> qbusyOff:
> ROM_CALL(BUSY_OFF)
> RET
> qputw:
> LD HL,2
> ADD HL,SP
> LD A,(HL)
> INC HL
> LD H,(HL)
> LD L,A
> ROM_CALL(D_HL_DECI)
> RET
> ; void putPixel(int x, int y)
> qputPixel:
> LD HL,4 ; first arg == x coordinate (just beyond
> ret adr)
> ADD HL,SP
> LD B,(HL)
> LD HL,2 ; second arg = y coordinate
> ADD HL,SP
> LD C,(HL)
> LD A,63
> SUB C
> LD C,A ; Pixel now in B,C in preperation for
> FindPixel
> LD A,4
> OUT (5),A ; select ROM page
> ROM_CALL(FIND_PIXEL)
> LD DE,$FC00
> ADD HL,DE ; HL holds the offset to the byte of
memory
> XOR (HL) ; A holds the pixel bit set.
> LD (HL),A
> RET
> qputs:
> LD HL,2
> ADD HL,SP
> LD A,(HL)
> INC HL
> LD H,(HL)
> LD L,A
> ROM_CALL(D_ZT_STR)
> RET
> ;
> ;Test if DE >= HL (unsigned)
> CCUGE:
> CALL_(CCUCMP)
> RET NC
> DEC HL
> RET
> ;
> ;Test if DE < HL (unsigned)
> CCULT:
> CALL_(CCUCMP)
> RET C
> DEC HL
> RET
> ;
> ;Test if DE > HL (unsigned)
> CCUGT:
> EX DE,HL
> CALL_(CCUCMP)
> RET C
> DEC HL
> RET
> ;
> ;Test if DE <= HL (unsigned)
> CCULE:
> CALL_(CCUCMP)
> RET Z
> RET C
> DEC HL
> RET
> ;
> ;Common routine to perform unsigned compare
> ;carry set if DE < HL
> ;zero/nonzero set accordingly
> CCUCMP: LD A,D
> CP H
> JR NZ,CUCMP1
> LD A,E
> CP L
> CUCMP1: LD HL,1
> RET
> ;
> ;Shift DE arithmetically right by HL and return in HL
> CCASR: EX DE,HL
> DEC E
> RET M ; 7/2/82 jrvz
> LD A,H
> RLA
> LD A,H
> RRA
> LD H,A
> LD A,L
> RRA
> LD L,A
> JR CCASR+1
> ;Shift DE arithmetically left by HL and return in HL
> CCASL: EX DE,HL
> CCASL4: DEC E
> RET M ; jrvz 7/2/82
> ADD HL,HL
> JR CCASL4
> ;Subtract HL from DE and return in HL
> CCSUB:
> EX DE,HL
> OR A
> SBC HL,DE
> RET
> ;return absolute value of argument on stack (under return address)
> QABS:
> POP BC
> POP HL
> PUSH HL
> PUSH BC
> LD A,H
> AND A
> RET P
> ;Form the two's complement of HL
> CCNEG: CALL_(CCCOM)
> INC HL
> RET
> ;Form the one's complement of HL
> CCCOM: LD A,H
> CPL
> LD H,A
> LD A,L
> CPL
> LD L,A
> RET
> ;Multiply DE by HL and return in HL
> CCMULT:
> LD B,H
> LD C,L
> LD HL,0
> CCMLT1: LD A,C
> RRCA
> JR NC,CMLT2
> ADD HL,DE
> CMLT2: XOR A
> LD A,B
> RRA
> LD B,A
> LD A,C
> RRA
> LD C,A
> OR B
> RET Z
> XOR A
> LD A,E
> RLA
> LD E,A
> LD A,D
> RLA
> LD D,A
> OR E
> RET Z
> JR CCMLT1
> ;Divide DE by HL and return quotient in HL, remainder in DE
> CCDIV: LD B,H
> LD C,L
> LD A,D
> XOR B
> PUSH AF
> LD A,D
> OR A
> BIT 7,A
> CALL_NZ(CCDENEG)
> LD A,B
> OR A
> BIT 7,A
> CALL_NZ(CCBCNEG)
> LD A,16
> PUSH AF
> EX DE,HL
> LD DE,0
> CCDIV1: ADD HL,HL
> LD A,E
> RLA
> LD E,A
> LD A,D
> RLA
> LD D,A
> OR E
> JR Z,CCDIV2
> CALL_(CCPBCDE)
> BIT 7,A
> JUMP_NZ(CCDIV2)
> LD A,L
> OR 1
> LD L,A
> LD A,E
> SUB C
> LD E,A
> LD A,D
> SBC A,B
> LD D,A
> CCDIV2: POP AF
> DEC A
> JR Z,CCDIV3
> PUSH AF
> JR CCDIV1
> CCDIV3: POP AF
> RET P
> CALL_(CCDENEG)
> EX DE,HL
> CALL_(CCDENEG)
> EX DE,HL
> RET
> CCDENEG: LD A,D
> CPL
> LD D,A
> LD A,E
> CPL
> LD E,A
> INC DE
> RET
> CCBCNEG: LD A,B
> CPL
> LD B,A
> LD A,C
> CPL
> LD C,A
> INC BC
> RET
> CCRDEL: LD A,E
> RLA
> LD E,A
> LD A,D
> RLA
> LD D,A
> OR E
> RET
> CCPBCDE: LD A,E
> SUB C
> LD A,D
> SBC A,B
> RET
> ;logical negation
> CCLNEG:
> LD A,H
> OR L
> JR NZ,$+5
> LD L,1
> RET
> LD HL,0
> RET
> ;
> ; EXECUTE SWITCH STATEMENT
> ;
> ; HL = SWITCH VALUE
> ;(SP) -> SWITCH TABLE
> ; DW ADDR1, VALUE1
> ; DW ADDR2, VALUE2
> ; ...
> ; DW 0
> ; [JMP DEFAULT]
> ;
> CCSWITCH:
> EX DE,HL ;DE = SWITCH VALUE
> POP HL ;HL -> SWITCH TABLE
> SWLOOP:
> LD C,(HL)
> INC HL
> LD B,(HL) ;BC -> CASE ADDR, ELSE 0
> INC HL
> LD A,B
> OR C
> JR Z,SWEND ;DEFAULT OR CONTINUATION CODE
> LD A,(HL)
> INC HL
> CP E
> LD A,(HL)
> INC HL
> JR NZ,SWLOOP
> CP D
> JR NZ,SWLOOP
> LD H,B ;CASES MATCHED
> LD L,C
> SWEND:
> LD DE,(PROGRAM_ADDR)
> ADD HL,DE
> JP (HL)
> ;
> ;Fetch a single byte from the address in HL and
> ; sign extend into HL
> CCGCHAR: LD A,(HL)
> Q_ARGCNT:
> CCSXT: LD L,A
> RLCA
> SBC A,A
> LD H,A
> RET
> ;Fetch integer from (HL+2)
> CCCDR: INC HL
> INC HL
> ;Fetch a full 16-bit integer from the address in HL
> CCCAR:
> CCGINT: LD A,(HL)
> INC HL
> LD H,(HL)
> LD L,A
> RET
> ;Store a 16-bit integer in HL at the address in TOS
> CCPINT: POP BC
> POP DE
> PUSH BC
> LD A,L
> LD (DE),A
> INC DE
> LD A,H
> LD (DE),A
> RET
> ;Inclusive "or" HL and DE into HL
> CCOR:
> LD A,L
> OR E
> LD L,A
> LD A,H
> OR D
> LD H,A
> RET
> ;Exclusive "or" HL and DE into HL
> CCXOR:
> LD A,L
> XOR E
> LD L,A
> LD A,H
> XOR D
> LD H,A
> RET
> ;"And" HL and DE into HL
> CCAND:
> LD A,L
> AND E
> LD L,A
> LD A,H
> AND D
> LD H,A
> RET
> ;Test if HL = DE and set HL = 1 if true else 0
> CCEQ:
> CALL_(CCCMP)
> RET Z
> DEC HL
> RET
> ;Test if DE ~= HL
> CCNE:
> CALL_(CCCMP)
> RET NZ
> DEC HL
> RET
> ;Test if DE > HL (signed)
> CCGT:
> EX DE,HL
> CALL_(CCCMP)
> RET C
> DEC HL
> RET
> ;Test if DE <= HL (signed)
> CCLE:
> CALL_(CCCMP)
> RET Z
> RET C
> DEC HL
> RET
> ;Test if DE >= HL (signed)
> CCGE:
> CALL_(CCCMP)
> RET NC
> DEC HL
> RET
> ;Test if DE < HL (signed)
> CCLT:
> CALL_(CCCMP)
> RET C
> DEC HL
> RET
> ;Common routine to perform a signed compare
> ; of DE and HL
> ;This routine performs DE - HL and sets the conditions:
> ; Carry reflects sign of difference (set means DE < HL)
> ; Zero/non-zero set according to equality.
> CCCMP: LD A,E
> SUB L
> LD E,A
> LD A,D
> SBC A,H
> LD HL,1 ;preset true condition
> BIT 7,A
> JUMP_NZ(CCCMP1) ; If bit is set, then we have minus
> ; or together E (low result) and A (high result) to detect 0
> OR E ;"OR" resets carry and detects 0
> RET
> CCCMP1: OR E
> SCF ;set carry to signal minus
> RET
> ;*******
> ;*******
> ;*******
> ;******* End of Zshell include
> ;*******
> ;*******
> ;*******
> qlastRand: .EQU $80FD
> litaa: .byte 2
> .export qlastRand
> qnumToGue: .EQU $80FF
> litab: .byte 2
> .export qnumToGue
> qkeys: .EQU $8101
> litac: .word 33,34,26,18,35,27,19,36,28,20
> .export qkeys
> .export qrand
> qrand:
> .export qabs
> LD HL,(qlastRand)
> PUSH HL
> LD HL,16388
> POP DE
> CALL_(ccmult)
> INC HL
> PUSH HL
> LD HL,16387
> POP DE
> CALL_(ccdiv)
> EX DE,HL
> PUSH HL
> CALL_(qabs)
> POP BC
> LD (qlastRand),HL
> LD HL,(qlastRand)
> RET
>
>
> .export qgetDigit
> qgetDigit:
> LD HL,-10
> ADD HL,SP
> LD SP,HL
> LD HL,8
> ADD HL,SP
> PUSH HL
> LD HL,10
> CALL_(ccpint)
> cc6:
> LD HL,8
> ADD HL,SP
> CALL_(ccgint)
> PUSH HL
> LD HL,10
> POP DE
> CALL_(cceq)
> LD A,H
> OR L
> JUMP_Z(cc7)
> LD HL,6
> ADD HL,SP
> PUSH HL
> .export qwaitKey
> CALL_(qwaitKey)
> CALL_(ccpint)
> LD HL,4
> ADD HL,SP
> PUSH HL
> LD HL,0
> CALL_(ccpint)
> cc10:
> LD HL,4
> ADD HL,SP
> CALL_(ccgint)
> PUSH HL
> LD HL,10
> POP DE
> CALL_(cclt)
> LD A,H
> OR L
> JUMP_Z(cc9)
> JUMP_(cc11)
> cc8:
> LD HL,4
> ADD HL,SP
> PUSH HL
> CALL_(ccgint)
> INC HL
> CALL_(ccpint)
> DEC HL
> JUMP_(cc10)
> cc11:
> LD HL,qkeys
> PUSH HL
> LD HL,6
> ADD HL,SP
> CALL_(ccgint)
> ADD HL,HL
> POP DE
> ADD HL,DE
> CALL_(ccgint)
> PUSH HL
> LD HL,8
> ADD HL,SP
> CALL_(ccgint)
> POP DE
> CALL_(cceq)
> LD A,H
> OR L
> JUMP_Z(cc12)
> LD HL,8
> ADD HL,SP
> PUSH HL
> LD HL,6
> ADD HL,SP
> CALL_(ccgint)
> CALL_(ccpint)
> cc12:
> JUMP_(cc8)
> cc9:
> JUMP_(cc6)
> cc7:
> LD HL,cc5+0
> POP DE
> POP BC
> PUSH HL
> PUSH DE
> LD HL,0
> ADD HL,SP
> PUSH HL
> LD HL,4
> ADD HL,SP
> CALL_(ccgint)
> PUSH HL
> LD HL,12
> ADD HL,SP
> CALL_(ccgint)
> POP DE
> ADD HL,DE
> CALL_(ccgchar)
> POP DE
> LD A,L
> LD (DE),A
> LD HL,1
> ADD HL,SP
> PUSH HL
> LD HL,0
> POP DE
> LD A,L
> LD (DE),A
> .export qputs
> LD HL,0
> ADD HL,SP
> PUSH HL
> CALL_(qputs)
> POP BC
> LD HL,8
> ADD HL,SP
> CALL_(ccgint)
> EX DE,HL
> LD HL,10
> ADD HL,SP
> LD SP,HL
> EX DE,HL
> RET
>
>
> cc5: .EQU $8115
> litad: .byte 48,49,50,51,52,53,54,55,56,57
> .byte 42,0
> .export qgetNum
> qgetNum:
> CALL_(qgetDigit)
> PUSH HL
> LD HL,10
> POP DE
> CALL_(ccmult)
> PUSH HL
> CALL_(qgetDigit)
> POP DE
> ADD HL,DE
> RET
>
>
> .export qmain
> qmain:
> PUSH BC
> PUSH BC
> PUSH BC
> CALL_(qclearLCD)
> LD HL,cc14+0
> PUSH HL
> CALL_(qputs)
> POP BC
> LD HL,cc14+22
> PUSH HL
> CALL_(qputs)
> POP BC
> LD HL,cc14+44
> PUSH HL
> CALL_(qputs)
> POP BC
> LD HL,cc14+66
> PUSH HL
> CALL_(qputs)
> POP BC
> LD HL,cc14+88
> PUSH HL
> CALL_(qputs)
> POP BC
> LD HL,cc14+110
> PUSH HL
> CALL_(qputs)
> POP BC
> cc15:
> .export qchkEnter
> CALL_(qchkEnter)
> CALL_(cclneg)
> LD A,H
> OR L
> JUMP_Z(cc16)
> LD HL,999
> LD (qnumToGue),HL
> cc17:
> LD HL,(qnumToGue)
> PUSH HL
> LD HL,100
> POP DE
> CALL_(ccgt)
> LD A,H
> OR L
> JUMP_Z(cc18)
> CALL_(qrand)
> PUSH HL
> LD HL,100
> POP DE
> CALL_(ccdiv)
> LD (qnumToGue),HL
> JUMP_(cc17)
> cc18:
> JUMP_(cc15)
> cc16:
> LD HL,1000
> POP DE
> POP BC
> PUSH HL
> PUSH DE
> LD HL,0
> POP BC
> PUSH HL
> cc19:
> LD HL,2
> ADD HL,SP
> CALL_(ccgint)
> PUSH HL
> LD HL,(qnumToGue)
> POP DE
> CALL_(ccne)
> LD A,H
> OR L
> JUMP_Z(cc20)
> LD HL,cc14+132
> PUSH HL
> CALL_(qputs)
> POP BC
> CALL_(qgetNum)
> POP DE
> POP BC
> PUSH HL
> PUSH DE
> LD HL,0
> ADD HL,SP
> PUSH HL
> CALL_(ccgint)
> INC HL
> CALL_(ccpint)
> DEC HL
> LD HL,2
> ADD HL,SP
> CALL_(ccgint)
> PUSH HL
> LD HL,(qnumToGue)
> POP DE
> CALL_(cceq)
> LD A,H
> OR L
> JUMP_Z(cc21)
> LD HL,cc14+152
> PUSH HL
> CALL_(qputs)
> POP BC
> LD HL,cc14+174
> PUSH HL
> CALL_(qputs)
> POP BC
> .export qputw
> LD HL,0
> ADD HL,SP
> CALL_(ccgint)
> PUSH HL
> CALL_(qputw)
> POP BC
> LD HL,cc14+187
> PUSH HL
> CALL_(qputs)
> POP BC
> cc21:
> LD HL,2
> ADD HL,SP
> CALL_(ccgint)
> PUSH HL
> LD HL,(qnumToGue)
> POP DE
> CALL_(cclt)
> LD A,H
> OR L
> JUMP_Z(cc22)
> LD HL,cc14+195
> PUSH HL
> CALL_(qputs)
> POP BC
> cc22:
> LD HL,2
> ADD HL,SP
> CALL_(ccgint)
> PUSH HL
> LD HL,(qnumToGue)
> POP DE
> CALL_(ccgt)
> LD A,H
> OR L
> JUMP_Z(cc23)
> LD HL,cc14+217
> PUSH HL
> CALL_(qputs)
> POP BC
> cc23:
> JUMP_(cc19)
> cc20:
> LD HL,cc14+239
> PUSH HL
> CALL_(qputs)
> POP BC
> CALL_(qwaitExit)
> POP BC
> POP BC
> POP BC
> RET
>
>
> cc14: .EQU $8641
> litae: .byte 84,104,101,32,72,105,103,104,32,45
> .byte 32,76,111,119,32,71,97,109,101,32
> .byte 32,0,61,61,61,61,61,61,61,61
> .byte 61,61,61,61,61,61,61,61,61,61
> .byte 61,61,61,0,73,39,109,32,116,104
> .byte 105,110,107,105,110,103,32,111,102,32
> .byte 97,32,32,32,32,0,110,117,109,98
> .byte 101,114,32,98,101,116,119,101,101,110
> .byte 32,49,32,97,110,100,32,0,49,48
> .byte 48,46,32,80,114,101,115,115,32,101
> .byte 110,116,101,114,32,119,104,101,110,0
> .byte 114,101,97,100,121,46,46,46,46,46
> .byte 46,46,46,46,46,46,46,46,46,46
> .byte 46,0,87,104,97,116,39,115,32,121
> .byte 111,117,114,32,103,117,101,115,115,63
> .byte 32,0,32,89,111,117,32,87,105,110
> .byte 33,33,33,33,32,32,32,32,32,32
> .byte 32,32,32,0,73,116,32,111,110,108
> .byte 121,32,116,111,111,107,0,32,116,114
> .byte 105,101,115,46,0,32,84,111,111,32
> .byte 76,111,119,46,46,46,32,32,32,32
> .byte 32,32,32,32,32,32,0,32,84,111
> .byte 111,32,72,105,103,104,32,46,46,46
> .byte 32,32,32,32,32,32,32,32,0,80
> .byte 114,101,115,115,32,69,120,105,116,32
> .byte 32,32,32,32,32,32,32,32,0
>
> InitEmXX:
> LD DE,litaa
> LD HL,(PROGRAM_ADDR)
> ADD HL,DE
> LD DE,$80FD
> LD BC,2
> LDIR
> LD DE,litab
> LD HL,(PROGRAM_ADDR)
> ADD HL,DE
> LD DE,$80FF
> LD BC,2
> LDIR
> LD DE,litac
> LD HL,(PROGRAM_ADDR)
> ADD HL,DE
> LD DE,$8101
> LD BC,20
> LDIR
> LD DE,litad
> LD HL,(PROGRAM_ADDR)
> ADD HL,DE
> LD DE,$8115
> LD BC,12
> LDIR
> LD DE,litae
> LD HL,(PROGRAM_ADDR)
> ADD HL,DE
> LD DE,$8641
> LD BC,259
> LDIR
> RET
>
> ; --- End of Compilation ---
> .end
>
>
> Not a very efficient implementation of the HILO game, but it works.
>