home *** CD-ROM | disk | FTP | other *** search
- ; This source code is public domain.
- ; However, any changes to it should be of personal use only.
- ;
- ; //Jimmy MÃ¥rdell <yarin@acc.umu.se>
-
- ;
- ; If you miss any of the include files below (or doesn't have the
- ; latest version of them), you'll find them at the TI headquarter
- ; http://www.ticalc.org
-
- #include asm86.h
- #include ti86asm.inc
- #include ti86abs.inc
-
- _jforcecmdnochar equ $409C
- _cphlde equ $403C
- _dispAHL equ $4A33
- _mov9B equ $427F
- _ldhlind equ $4010
- _hldiv10 equ $4044
- _kbdGetKy equ $C006
- _kbdScanCode equ $C000
- _endSymbTable equ $D298
- _asapvar equ $D6FC
-
- MaxStates = 512
- TapeSize = $4000
-
- StatePtrs = _plotSScreen
- Tape = $8000
-
- .org _asm_exec_ram
-
- call _flushallmenus
- call _runindicoff
- call Init
- jr c,Quit
-
- call _flushallmenus
- call _runindicon
- call ReadProgram
- jr c,Quit
-
- call _runindicoff
- call InitTape
- call SelectSpeed
- jr c,Quit
-
- call _flushallmenus
- call _runindicon
- call Simulate
- call _runindicoff
- call ReadKey
-
- Quit:
- call SaveProgram
- call _clrScrn
- call _homeup
- jp _jforcecmdnochar
-
-
- ; --- SAVE PROGRAM ---
-
- SaveProgram:
- xor a
- ld hl,LastTuringProg
- call _SET_ABS_SRC_ADDR
- ld hl,19
- call _SET_MM_NUM_BYTES
- ld hl,_asapvar
- rst 20h
- rst 10h
- ret c
- ex de,hl
- ld a,b
- ld de,LastTuringProg-_asm_exec_ram+4
- add hl,de
- adc a,0
- call _SET_ABS_DEST_ADDR
- call _mm_ldir
- ret
-
- ; --- SIMULATE TURING MACHINE ---
-
- Simulate:
- call _clrLCD
- res appAutoScroll,(iy+appFlags)
- ld hl,$FDE0
- ld bc,15
- ld (hl),$FF
- call Fill
- ld hl,0
- ld (state),hl
- ld (shifts),hl
- ld (shifts+1),hl
- call ShowInfo
-
- Repeat:
- ld a,(speed)
- or a
- jr z,Proceed
- push af
- call ShowStat
- pop af
- cp 4
- jr nz,PrepDelay
- call ReadKey
- jr CheckExit
- PrepDelay:
- add a,a
- add a,a
- add a,a
- add a,a
- ld b,a
- Delay:
- halt
- djnz Delay
- Proceed:
- ld a,(_kbdGetKy)
- CheckExit:
- cp K_EXIT
- jp z,Abort
- ld ix,(tapeHead)
- ld de,Tape
- add ix,de
- ld hl,(state)
- ld d,h
- ld e,l
- add hl,hl
- ld bc,StatePtrs
- add hl,bc
- call _ldhlind
- CheckEqu:
- push hl
- call _ldhlind
- call CheckOnTape
- ld a,(ix)
- jr c,ReadOK
- ld a,' '
- ReadOK:
- call _cphlde
- pop hl
- jp nz,Reject
- inc hl
- inc hl
- cp (hl)
- jr z,Match
- ld bc,5
- add hl,bc
- jr CheckEqu
- Match:
- inc hl
- call CheckOnTape
- ld a,(hl)
- jr c,WriteOK
- cp ' '
- jr z,NoWrite
- jp OutsideTape
- WriteOK:
- ld (ix),a
- NoWrite:
- ld a,(speed)
- or a
- jr z,SkipCrsUpdate
- push hl
- ld hl,(lastLoc)
- ld a,h
- or l
- jr z,NotOnScr
- ld (_curRow),hl
- ld a,(ix)
- call _putc
- NotOnScr:
- pop hl
- SkipCrsUpdate:
- inc hl
- ld a,(hl)
- inc hl
- ld c,(hl)
- inc hl
- ld b,(hl)
- push bc
- push ix
- pop hl
- or a
- jr z,FindScrLoc
- inc a
- jr z,HeadLeft
- inc hl
- jr FindScrLoc
- HeadLeft:
- dec hl
- FindScrLoc:
- push hl
- pop ix
- ld de,Tape
- sbc hl,de
- ld (tapeHead),hl
- ld a,(speed)
- or a
- jr z,Update
- ld bc,0
- ld de,84
- call _cphlde
- jr nc,SetLastLoc
- ld c,3
- ld de,21
- or a
- FindRow:
- inc c
- sbc hl,de
- jr nc,FindRow
- RowFound:
- add hl,de
- ld b,l
- SetLastLoc:
- ld (lastLoc),bc
- ld a,b
- or c
- jr z,Update
- ld (_curRow),bc
- set textInverse,(iy+textflags)
- ld a,(ix)
- call _putc
- res textInverse,(iy+textflags)
- Update:
- ld hl,(shifts)
- ld a,(shifts+2)
- call _inc_ptr_ahl
- ld (shifts),hl
- ld (shifts+2),a
- pop hl
- ld (state),hl
- inc hl
- ld a,h
- or l
- jp nz,Repeat
- call ShowInfo
- ret
-
- Abort:
- xor a
- ld (_kbdScanCode),a
- ld hl,AbortTxt
- DoneTxt:
- push hl
- call ShowInfo
- ld hl,$0002
- ld (_curRow),hl
- pop hl
- call _puts
- ret
-
- OutsideTape:
- ld hl,OutsideTxt
- jr DoneTxt
-
- Reject:
- ld hl,RejectTxt
- jr DoneTxt
-
- CheckOnTape:
- push de
- push hl
- ld hl,(tapeHead)
- ld de,TapeSize
- call _cphlde
- pop hl
- pop de
- ret
-
- ShowInfo:
- call _homeup
- ld hl,StateTxt
- call _puts
- ld de,$0001
- ld (_curRow),de
- call _puts
- call ShowStat
- ld hl,$0004
- ld (_curRow),hl
- ld bc,84
- call DispTape
- ret
-
- ShowStat:
- ld hl,$0801
- ld (_curRow),hl
- ld hl,(shifts)
- ld a,(shifts+2)
- call _dispAHL
-
- ld hl,$0800
- ld (_curRow),hl
- ld hl,(state)
- ld de,$FFFF
- call _cphlde
- jr z,HaltState
- xor a
- call _dispAHL
- ret
- HaltState:
- ld hl,HaltTxt
- call _puts
- call _newline
- call _newline
- call _puts
- ret
-
- StateTxt:
- .db "State:",0
- .db "Shifts:",0
- HaltTxt:
- .db " HALT",0
- .db "ACCEPTED",0
- RejectTxt:
- .db "REJECTED",0
- OutsideTxt:
- .db "WRITING OUTSIDE TAPE",0
- AbortTxt:
- .db "USER ABORT",0
-
- shifts:
- .db 0,0,0
- state:
- .dw 0
- tapeHead:
- .dw 0
- lastLoc:
- .dw 0
-
-
- ; --- SELECT SPEED ---
-
- SelectSpeed:
- ld hl,NoStatesTxt
- call _puts
- ld hl,StatePtrs
- ld de,0
- ld bc,MaxStates
- CountStates:
- ld a,(hl)
- inc hl
- or (hl)
- jr z,NotUsed
- inc de
- NotUsed:
- inc hl
- dec bc
- ld a,b
- or c
- jr nz,CountStates
- ex de,hl
- call DispHL
- ld de,$0002
- ld (_curRow),de
- ld hl,TapeTxt
- call _puts
- inc e
- ld (_curRow),de
- ld bc,63
- call DispTape
- ld hl,SelMenu
- call $49C8
- call $49E8
- WaitSelKey:
- call ReadKey
- cp K_EXIT
- scf
- ret z
- cp K_ENTER
- ret z
- sub K_F5
- jr c,WaitSelKey
- cp 5
- jr nc,WaitSelKey
- ld (speed),a
- or a
- ret
-
- DispTape:
- ld hl,Tape
- ld de,(tapeHead)
- RepDispTape:
- ld a,d
- or e
- jr nz,HeadNotHere
- set textInverse,(iy+textflags)
- push hl
- ld hl,(_curRow)
- ld (lastLoc),hl
- pop hl
- HeadNotHere:
- dec de
- ld a,(hl)
- inc hl
- push hl
- call _putc
- pop hl
- res textInverse,(iy+textflags)
- dec bc
- ld a,b
- or c
- jr nz,RepDispTape
- ret
-
- NoStatesTxt:
- .db "States used: ",0
- TapeTxt:
- .db "Tape:",0
- SelMenu:
- .db $09,$05
- .dw SpdStep,SpdSlow,SpdMed,SpdFast,SpdNoTrc
- SpdStep:
- .db 0,"Step",0
- SpdSlow:
- .db 0,"Slow",0
- SpdMed:
- .db 0,"Med",0
- SpdFast:
- .db 0,"Fast",0
- SpdNoTrc:
- .db 0,"No trc",0
-
-
- ; --- INIT TAPE ---
-
- InitTape:
- call _RAM_PAGE_1
- ld hl,(TapeHeadStart)
- ld (tapeHead),hl
- ld hl,Tape
- ld bc,TapeSize-1
- ld (hl),' '
- call Fill
-
- ld hl,LastString-1
- rst 20h
- rst 10h
- call ReadStrByte
- ld l,a
- call ReadStrByte
- ld h,a
- push de
- ld de,TapeSize
- ex de,hl
- call _cphlde
- ex de,hl
- pop de
- jr nc,TapeSizeOK
- ld hl,TapeSize
- TapeSizeOK:
- ld ix,Tape
- CopyString:
- ld a,h
- or l
- ret z
- call ReadStrByte
- ld (ix),a
- inc ix
- dec hl
- jr CopyString
-
- ReadStrByte:
- push hl
- ld a,b
- ld h,d
- ld l,e
- call _inc_ptr_bde
- call _GETB_AHL
- call _RAM_PAGE_1
- pop hl
- ret
-
-
- ; --- PROCESS PROGRAM ---
-
- ReadProgram:
- call _clrLCD
- call _homeup
- ld hl,ProgProcTxt
- call _puts
- call _newline
-
- ld hl,StatePtrs
- ld bc,MaxStates*2-1
- ld (hl),0
- call Fill
-
- ld hl,StateList
- ld (StatePtrs),hl
-
- ld hl,0
- ld (lineNo),hl
- ld (lastState),hl
- ld ix,StateList
-
- ld hl,LastTuringProg-1
- rst 20h
- rst 10h
- call ReadByte
- ld l,a
- call ReadByte
- ld h,a
- ld (sizeLeft),hl
- call NextByte
-
- ProcessRow:
- ld hl,(lineNo)
- inc hl
- ld (lineNo),hl
- call NextByte
- or a
- ret z
- cp $D6
- jr z,ProcessRow
- cp '^'
- jr nz,ParseRow
- FindEOL:
- call NextByte
- jr nc,FindEOL
- jr ProcessRow
- ParseRow:
- call PrevByte
- ld hl,0
- call ReadState
- jp c,ErrorHandler
- ld (inState),hl
- push de
- ld de,(lastState)
- call _cphlde
- pop de
- ld c,5
- jp c,ErrorHandler
- call NextByte
- ld c,1
- jp c,ErrorHandler
- ld (inChar),a
- call ParseComma
- call NextByte
- ld c,1
- jp c,ErrorHandler
- ld (outChar),a
- call ParseComma
- call NextByte
- ld c,1
- jp c,ErrorHandler
- cp 'R'
- jr z,ShiftCharOK
- dec c
- cp 'S'
- jr z,ShiftCharOK
- ld c,4
- cp 'L'
- jp nz,ErrorHandler
- ld c,-1
- ShiftCharOK:
- ld a,c
- ld (shiftChar),a
- call ParseComma
- ld hl,0
- call NextByte
- cp 'H'
- jr nz,NotH
- call NextByte
- ld c,2
- jp nc,ErrorHandler
- dec hl
- jr StoreInStateList
- NotH:
- call PrevByte
- call ReadState
- jr nc,OutStateOK
- bit 1,c
- jp nz,ErrorHandler
- OutStateOK:
- inc c
- cp ','
- jp z,ErrorHandler
- StoreInStateList:
- ld (outState),hl
- ld hl,inState
- push bc
- push de
- push ix
- pop de
- call _mov9B
- ld hl,(inState)
- ld de,(lastState)
- call _cphlde
- jr z,NoPtrUpdate
- ld (lastState),hl
- add hl,hl
- ld de,StatePtrs
- add hl,de
- push ix
- pop de
- ld (hl),e
- inc hl
- ld (hl),d
- NoPtrUpdate:
- ld de,7
- add ix,de
- pop de
- pop bc
- jp ProcessRow
-
- ParseComma:
- call NextByte
- cp ','
- ret z
- ld c,3
- pop hl
- jr ErrorHandler
-
- ReadState:
- call NextByte
- ld c,1
- ret c
- cp ','
- ret z
- ld c,2
- sub '0'
- ret c
- cp 10
- ccf
- ret c
- push de
- add hl,hl
- ld d,h
- ld e,l
- add hl,hl
- add hl,hl
- add hl,de
- ld d,0
- ld e,a
- add hl,de
- ld de,MaxStates
- call _cphlde
- pop de
- ccf
- ret c
- jr ReadState
-
- PrevByte:
- push hl
- ld hl,(sizeLeft)
- inc hl
- ld (sizeLeft),hl
- call _dec_ptr_bde
- pop hl
- ret
-
- NextByte:
- push hl
- ld hl,(sizeLeft)
- ld a,h
- or l
- scf
- jr z,EndOfProg
- ret z
- dec hl
- ld (sizeLeft),hl
- pop hl
- ReadByte:
- push hl
- ld a,b
- ld h,d
- ld l,e
- call _inc_ptr_bde
- call _GETB_AHL
- cp $D6
- scf
- jr z,EndOfProg
- or a
- EndOfProg:
- pop hl
- ret
-
- sizeleft:
- .dw 0
- lastState:
- .dw 0
- lineNo:
- .dw 0
- inState:
- .dw 0
- inChar:
- .db 0
- outChar:
- .db 0
- shiftChar:
- .db 0
- outState:
- .dw 0
- stopState:
- .dw $FFFF
-
- ErrorHandler:
- ld hl,$0002
- ld (_curRow),hl
- ld hl,ErrorMsg+6
- ld a,'0'
- add a,c
- ld (hl),a
- ld hl,ErrorMsg
- call _puts
- ld hl,(lineNo)
- call DispHL
- ld a,':'
- call _putc
- ld hl,$0003
- ld (_curRow),hl
- ld hl,ErrorPtrTable-2
- sla c
- ld b,0
- add hl,bc
- call _ldhlind
- call _puts
- call _runindicoff
- call ReadKey
- scf
- ret
-
- ProgProcTxt:
- .db "Processing...",0
-
- ErrorMsg:
- .db "Error in line ",0
- ErrorPtrTable:
- .dw Error1Msg,Error2Msg,Error3Msg,Error4Msg,Error5Msg
- Error1Msg:
- .db "Unexpected EOL.",0
- Error2Msg:
- .db "Illegal state.",0
- Error3Msg:
- .db 34,',',34," expected.",0
- Error4Msg:
- .db "Illegal shift char.",0
- Error5Msg:
- .db "States not in order.",0
-
-
- ; --- SELECT PROGRAM, STRING, TAPE HEAD ---
-
- Init:
- call _clrLCD
- call _RAM_PAGE_7
- call _homeup
- set textInverse,(iy+textflags)
- ld hl,Title
- call _puts
- res textInverse,(iy+textflags)
- ld de,$0822
- ld (_penCol),de
- call _vputs
-
- ld hl,$BFFF
- ld (TuringProg),hl
- ld (String),hl
-
- ld hl,LastTuringProg-1
- rst 20h
- rst 10h
- jr c,LastProgNF
- call CheckTuringProg
- jr c,LastProgNF
- ld (TuringProg),hl
- jr CheckLastString
- LastProgNF:
- call ScanTuringProg
-
- CheckLastString:
- ld hl,LastString-1
- rst 20h
- rst 10h
- jr c,LastStringNF
- call CheckString
- jr c,LastStringNF
- ld (String),hl
- jr InvokeOptMenu
- LastStringNF:
- call ScanString
-
- InvokeOptMenu:
- ld hl,OptMenu
- call $49C8
- call $49E8
-
- DisplayOptions:
- ld hl,$0003
- ld (_curRow),hl
- ld hl,TuringProgTxt
- call _puts
- ld hl,(TuringProg)
- call CopyVarName
- ld de,LastTuringProg
- call _mov9B
- ld hl,_OP1+1
- call _puts
-
- ld hl,$0004
- ld (_curRow),hl
- ld hl,StringNameTxt
- call _puts
- ld hl,(String)
- call CopyVarName
- ld de,LastString
- call _mov9B
- ld hl,_OP1+1
- call _puts
-
- DisplayTapeHead:
- ld hl,$0005
- ld (_curRow),hl
- ld hl,TapeHeadTxt
- call _puts
- ld hl,(TapeHeadStart)
- call DispHL
- ld a,' '
- call _putc
-
- WaitMenuKey:
- call ReadKey
- cp K_F1
- jr z,MScanProg
- cp K_F2
- jr z,MScanString
- cp K_F3
- jr z,MIncTapeHead
- cp K_F4
- jr z,MDecTapeHead
- cp K_ENTER
- ret z
- cp K_F5
- ret z
- cp K_EXIT
- jr nz,WaitMenuKey
- scf
- ret
-
- MScanProg:
- call ScanTuringProg
- jr DisplayOptions
-
- MScanString:
- call ScanString
- jr DisplayOptions
-
- MIncTapeHead:
- ld hl,(TapeHeadStart)
- inc hl
- ld (TapeHeadStart),hl
- jr DisplayTapeHead
-
- MDecTapeHead:
- ld hl,(TapeHeadStart)
- dec hl
- bit 7,h
- jr nz,WaitMenuKey
- ld (TapeHeadStart),hl
- jr DisplayTapeHead
-
- ScanTuringProg:
- ld hl,(TuringProg)
- NextTuringProg:
- call SkipVariable
- call CheckTuringProg
- jr nc,ProgFound
- ld de,(TuringProg)
- call _cphlde
- jr z,NoTuringProg
- jr NextTuringProg
- ProgFound:
- ld (TuringProg),hl
- ret
-
- ScanString:
- ld hl,(String)
- NextString:
- call SkipVariable
- call CheckString
- jr nc,StringFound
- ld de,(String)
- call _cphlde
- jr z,NoString
- jr NextString
- StringFound:
- ld (String),hl
- ret
-
- NoString:
- ld hl,NoStringTxt
- jr NotFound
- NoTuringProg:
- ld hl,NoTuringProgTxt
- NotFound:
- ld de,$0004
- ld (_curRow),de
- call _puts
- call ReadKey
- pop hl
- scf
- ret
-
- CheckTuringProg:
- ld a,(hl)
- and $1F
- cp $12
- scf
- ret nz
- push hl
- dec hl
- ld e,(hl)
- dec hl
- ld d,(hl)
- dec hl
- ld a,(hl)
- ex de,hl
- call _inc_ptr_ahl
- call _inc_ptr_ahl
- call _inc_ptr_ahl
- call _GETB_AHL
- call _RAM_PAGE_7
- cp '^'
- scf
- pop hl
- ret nz
- or a
- ret
-
- CheckString:
- ld a,(hl)
- and $1F
- cp $0C
- scf
- ret nz
- or a
- ret
-
- CopyVarName:
- ld a,' '
- ld de,_OP1
- push de
- ld b,9
- FillSpace:
- ld (de),a
- inc de
- djnz FillSpace
- xor a
- ld (de),a
- pop de
- dec hl
- dec hl
- dec hl
- dec hl
- dec hl
- ld b,(hl)
- inc b
- CopyName:
- ld a,(hl)
- ld (de),a
- dec hl
- inc de
- djnz CopyName
- ld hl,_OP1
- ret
-
- SkipVariable:
- dec hl
- dec hl
- dec hl
- dec hl
- dec hl
- ld b,(hl)
- inc b
- SkipName:
- dec hl
- djnz SkipName
- ld de,(_endSymbTable)
- inc de
- call _cphlde
- ret nc
- ld hl,$BFFF
- ret
-
- Title:
- .db " TURING MACHINE SIM. ",0
- .db "by Jimmy Mardell",0
- TuringProgTxt:
- .db "Turing prog: ",0
- StringNameTxt:
- .db "Stringname.: ",0
- TapeHeadTxt:
- .db "Tape head..: ",0
- NoTuringProgTxt:
- .db "No Turing prog found!",0
- NoStringTxt:
- .db " No strings found!",0
- OptMenu:
- .db $09,$05
- .dw M_NextProg,M_NextStr,M_IncTH,M_DecTH,M_Run
- M_NextProg:
- .db 0,"+prog",0
- M_NextStr:
- .db 0,"+str",0
- M_IncTH:
- .db 0,"+head",0
- M_DecTH:
- .db 0,"-head",0
- M_RUN:
- .db 0,"RUN",0
-
- TuringProg:
- .dw 0
- String:
- .dw 0
- TapeHeadStart:
- .dw 0
- LastTuringProg:
- .db 0,0,0,0,0,0,0,0,0
- LastString:
- .db 0,0,0,0,0,0,0,0,0
- speed:
- .db 0
-
-
- ; --- MISC. ROUTINES ---
-
- ReadKey:
- call _getky
- or a
- jr z,ReadKey
- ret
-
- DispHL:
- push de
- ld de,_OP3+5
- xor a
- ld (de),a
- UnpackHL:
- call _hldiv10
- dec de
- add a,'0'
- ld (de),a
- ld a,h
- or l
- jr nz,UnpackHL
- ex de,hl
- call _puts
- pop de
- ret
-
- Fill:
- ld d,h
- ld e,l
- inc de
- ldir
- ret
-
- StateList:
- .dw $FFFF
-
- .end
-