home *** CD-ROM | disk | FTP | other *** search
/ ticalc.org / ticalc_org_rev_b.iso / archives / 86 / asm / source / turing.asm < prev    next >
Encoding:
Assembly Source File  |  2001-07-01  |  13.8 KB  |  1,065 lines

  1. ; This source code is public domain.
  2. ; However, any changes to it should be of personal use only.
  3. ;
  4. ; //Jimmy MÃ¥rdell <yarin@acc.umu.se>
  5.  
  6. ;
  7. ; If you miss any of the include files below (or doesn't have the
  8. ; latest version of them), you'll find them at the TI headquarter
  9. ; http://www.ticalc.org
  10.  
  11. #include asm86.h
  12. #include ti86asm.inc
  13. #include ti86abs.inc
  14.  
  15. _jforcecmdnochar  equ  $409C
  16. _cphlde       equ  $403C
  17. _dispAHL      equ  $4A33
  18. _mov9B          equ  $427F
  19. _ldhlind      equ  $4010
  20. _hldiv10      equ  $4044
  21. _kbdGetKy      equ  $C006
  22. _kbdScanCode      equ  $C000
  23. _endSymbTable      equ  $D298
  24. _asapvar      equ  $D6FC
  25.  
  26. MaxStates  = 512
  27. TapeSize   = $4000
  28.  
  29. StatePtrs  = _plotSScreen
  30. Tape       = $8000
  31.  
  32. .org _asm_exec_ram
  33.  
  34.  call _flushallmenus
  35.  call _runindicoff
  36.  call Init
  37.  jr c,Quit
  38.  
  39.  call _flushallmenus
  40.  call _runindicon
  41.  call ReadProgram
  42.  jr c,Quit
  43.  
  44.  call _runindicoff
  45.  call InitTape
  46.  call SelectSpeed
  47.  jr c,Quit
  48.  
  49.  call _flushallmenus
  50.  call _runindicon
  51.  call Simulate
  52.  call _runindicoff
  53.  call ReadKey
  54.  
  55. Quit:
  56.  call SaveProgram
  57.  call _clrScrn
  58.  call _homeup
  59.  jp _jforcecmdnochar
  60.  
  61.  
  62. ; --- SAVE PROGRAM ---
  63.  
  64. SaveProgram:
  65.  xor a
  66.  ld hl,LastTuringProg
  67.  call _SET_ABS_SRC_ADDR
  68.  ld hl,19
  69.  call _SET_MM_NUM_BYTES
  70.  ld hl,_asapvar
  71.  rst 20h
  72.  rst 10h
  73.  ret c
  74.  ex de,hl
  75.  ld a,b
  76.  ld de,LastTuringProg-_asm_exec_ram+4
  77.  add hl,de
  78.  adc a,0
  79.  call _SET_ABS_DEST_ADDR
  80.  call _mm_ldir
  81.  ret
  82.  
  83. ; --- SIMULATE TURING MACHINE ---
  84.  
  85. Simulate:
  86.  call _clrLCD
  87.  res appAutoScroll,(iy+appFlags)
  88.  ld hl,$FDE0
  89.  ld bc,15
  90.  ld (hl),$FF
  91.  call Fill
  92.  ld hl,0
  93.  ld (state),hl
  94.  ld (shifts),hl
  95.  ld (shifts+1),hl
  96.  call ShowInfo
  97.  
  98. Repeat:
  99.  ld a,(speed)
  100.  or a
  101.  jr z,Proceed
  102.  push af
  103.  call ShowStat
  104.  pop af
  105.  cp 4
  106.  jr nz,PrepDelay
  107.  call ReadKey
  108.  jr CheckExit
  109. PrepDelay:
  110.  add a,a
  111.  add a,a
  112.  add a,a
  113.  add a,a
  114.  ld b,a
  115. Delay:
  116.  halt
  117.  djnz Delay
  118. Proceed:
  119.  ld a,(_kbdGetKy)
  120. CheckExit:
  121.  cp K_EXIT
  122.  jp z,Abort
  123.  ld ix,(tapeHead)
  124.  ld de,Tape
  125.  add ix,de
  126.  ld hl,(state)
  127.  ld d,h
  128.  ld e,l
  129.  add hl,hl
  130.  ld bc,StatePtrs
  131.  add hl,bc
  132.  call _ldhlind
  133. CheckEqu:
  134.  push hl
  135.  call _ldhlind
  136.  call CheckOnTape
  137.  ld a,(ix)
  138.  jr c,ReadOK
  139.  ld a,' '
  140. ReadOK:
  141.  call _cphlde
  142.  pop hl
  143.  jp nz,Reject
  144.  inc hl
  145.  inc hl
  146.  cp (hl)
  147.  jr z,Match
  148.  ld bc,5
  149.  add hl,bc
  150.  jr CheckEqu
  151. Match:
  152.  inc hl
  153.  call CheckOnTape
  154.  ld a,(hl)
  155.  jr c,WriteOK
  156.  cp ' '
  157.  jr z,NoWrite
  158.  jp OutsideTape
  159. WriteOK:
  160.  ld (ix),a
  161. NoWrite:
  162.  ld a,(speed)
  163.  or a
  164.  jr z,SkipCrsUpdate
  165.  push hl
  166.  ld hl,(lastLoc)
  167.  ld a,h
  168.  or l
  169.  jr z,NotOnScr
  170.  ld (_curRow),hl
  171.  ld a,(ix)
  172.  call _putc
  173. NotOnScr:
  174.  pop hl
  175. SkipCrsUpdate:
  176.  inc hl
  177.  ld a,(hl)
  178.  inc hl
  179.  ld c,(hl)
  180.  inc hl
  181.  ld b,(hl)
  182.  push bc
  183.  push ix
  184.  pop hl
  185.  or a
  186.  jr z,FindScrLoc
  187.  inc a
  188.  jr z,HeadLeft
  189.  inc hl
  190.  jr FindScrLoc
  191. HeadLeft:
  192.  dec hl
  193. FindScrLoc:
  194.  push hl
  195.  pop ix
  196.  ld de,Tape
  197.  sbc hl,de
  198.  ld (tapeHead),hl
  199.  ld a,(speed)
  200.  or a
  201.  jr z,Update
  202.  ld bc,0
  203.  ld de,84
  204.  call _cphlde
  205.  jr nc,SetLastLoc
  206.  ld c,3
  207.  ld de,21
  208.  or a
  209. FindRow:
  210.  inc c
  211.  sbc hl,de
  212.  jr nc,FindRow
  213. RowFound:
  214.  add hl,de
  215.  ld b,l
  216. SetLastLoc:
  217.  ld (lastLoc),bc
  218.  ld a,b
  219.  or c
  220.  jr z,Update
  221.  ld (_curRow),bc
  222.  set textInverse,(iy+textflags)
  223.  ld a,(ix)
  224.  call _putc
  225.  res textInverse,(iy+textflags)
  226. Update:
  227.  ld hl,(shifts)
  228.  ld a,(shifts+2)
  229.  call _inc_ptr_ahl
  230.  ld (shifts),hl
  231.  ld (shifts+2),a
  232.  pop hl
  233.  ld (state),hl
  234.  inc hl
  235.  ld a,h
  236.  or l
  237.  jp nz,Repeat
  238.  call ShowInfo
  239.  ret
  240.  
  241. Abort:
  242.  xor a
  243.  ld (_kbdScanCode),a
  244.  ld hl,AbortTxt
  245. DoneTxt:
  246.  push hl
  247.  call ShowInfo
  248.  ld hl,$0002
  249.  ld (_curRow),hl
  250.  pop hl
  251.  call _puts
  252.  ret
  253.  
  254. OutsideTape:
  255.  ld hl,OutsideTxt
  256.  jr DoneTxt
  257.  
  258. Reject:
  259.  ld hl,RejectTxt
  260.  jr DoneTxt
  261.  
  262. CheckOnTape:
  263.  push de
  264.  push hl
  265.  ld hl,(tapeHead)
  266.  ld de,TapeSize
  267.  call _cphlde
  268.  pop hl
  269.  pop de
  270.  ret
  271.  
  272. ShowInfo:
  273.  call _homeup
  274.  ld hl,StateTxt
  275.  call _puts
  276.  ld de,$0001
  277.  ld (_curRow),de
  278.  call _puts
  279.  call ShowStat
  280.  ld hl,$0004
  281.  ld (_curRow),hl
  282.  ld bc,84
  283.  call DispTape
  284.  ret
  285.  
  286. ShowStat:
  287.  ld hl,$0801
  288.  ld (_curRow),hl
  289.  ld hl,(shifts)
  290.  ld a,(shifts+2)
  291.  call _dispAHL
  292.  
  293.  ld hl,$0800
  294.  ld (_curRow),hl
  295.  ld hl,(state)
  296.  ld de,$FFFF
  297.  call _cphlde
  298.  jr z,HaltState
  299.  xor a
  300.  call _dispAHL
  301.  ret
  302. HaltState:
  303.  ld hl,HaltTxt
  304.  call _puts
  305.  call _newline
  306.  call _newline
  307.  call _puts
  308.  ret
  309.  
  310. StateTxt:
  311.  .db "State:",0
  312.  .db "Shifts:",0
  313. HaltTxt:
  314.  .db " HALT",0
  315.  .db "ACCEPTED",0
  316. RejectTxt:
  317.  .db "REJECTED",0
  318. OutsideTxt:
  319.  .db "WRITING OUTSIDE TAPE",0
  320. AbortTxt:
  321.  .db "USER ABORT",0
  322.  
  323. shifts:
  324.  .db 0,0,0
  325. state:
  326.  .dw 0
  327. tapeHead:
  328.  .dw 0
  329. lastLoc:
  330.  .dw 0
  331.  
  332.  
  333. ; --- SELECT SPEED ---
  334.  
  335. SelectSpeed:
  336.  ld hl,NoStatesTxt
  337.  call _puts
  338.  ld hl,StatePtrs
  339.  ld de,0
  340.  ld bc,MaxStates
  341. CountStates:
  342.  ld a,(hl)
  343.  inc hl
  344.  or (hl)
  345.  jr z,NotUsed
  346.  inc de
  347. NotUsed:
  348.  inc hl
  349.  dec bc
  350.  ld a,b
  351.  or c
  352.  jr nz,CountStates
  353.  ex de,hl
  354.  call DispHL
  355.  ld de,$0002
  356.  ld (_curRow),de
  357.  ld hl,TapeTxt
  358.  call _puts
  359.  inc e
  360.  ld (_curRow),de
  361.  ld bc,63
  362.  call DispTape
  363.  ld hl,SelMenu
  364.  call $49C8
  365.  call $49E8
  366. WaitSelKey:
  367.  call ReadKey
  368.  cp K_EXIT
  369.  scf
  370.  ret z
  371.  cp K_ENTER
  372.  ret z
  373.  sub K_F5
  374.  jr c,WaitSelKey
  375.  cp 5
  376.  jr nc,WaitSelKey
  377.  ld (speed),a
  378.  or a
  379.  ret
  380.  
  381. DispTape:
  382.  ld hl,Tape
  383.  ld de,(tapeHead)
  384. RepDispTape:
  385.  ld a,d
  386.  or e
  387.  jr nz,HeadNotHere
  388.  set textInverse,(iy+textflags)
  389.  push hl
  390.  ld hl,(_curRow)
  391.  ld (lastLoc),hl
  392.  pop hl
  393. HeadNotHere:
  394.  dec de
  395.  ld a,(hl)
  396.  inc hl
  397.  push hl
  398.  call _putc
  399.  pop hl
  400.  res textInverse,(iy+textflags)
  401.  dec bc
  402.  ld a,b
  403.  or c
  404.  jr nz,RepDispTape
  405.  ret
  406.  
  407. NoStatesTxt:
  408.  .db "States used: ",0
  409. TapeTxt:
  410.  .db "Tape:",0
  411. SelMenu:
  412.  .db $09,$05
  413.  .dw SpdStep,SpdSlow,SpdMed,SpdFast,SpdNoTrc
  414. SpdStep:
  415.  .db 0,"Step",0
  416. SpdSlow:
  417.  .db 0,"Slow",0
  418. SpdMed:
  419.  .db 0,"Med",0
  420. SpdFast:
  421.  .db 0,"Fast",0
  422. SpdNoTrc:
  423.  .db 0,"No trc",0
  424.  
  425.  
  426. ; --- INIT TAPE ---
  427.  
  428. InitTape:
  429.  call _RAM_PAGE_1
  430.  ld hl,(TapeHeadStart)
  431.  ld (tapeHead),hl
  432.  ld hl,Tape
  433.  ld bc,TapeSize-1
  434.  ld (hl),' '
  435.  call Fill
  436.  
  437.  ld hl,LastString-1
  438.  rst 20h
  439.  rst 10h
  440.  call ReadStrByte
  441.  ld l,a
  442.  call ReadStrByte
  443.  ld h,a
  444.  push de
  445.  ld de,TapeSize
  446.  ex de,hl
  447.  call _cphlde
  448.  ex de,hl
  449.  pop de
  450.  jr nc,TapeSizeOK
  451.  ld hl,TapeSize
  452. TapeSizeOK:
  453.  ld ix,Tape
  454. CopyString:
  455.  ld a,h
  456.  or l
  457.  ret z
  458.  call ReadStrByte
  459.  ld (ix),a
  460.  inc ix
  461.  dec hl
  462.  jr CopyString
  463.  
  464. ReadStrByte:
  465.  push hl
  466.  ld a,b
  467.  ld h,d
  468.  ld l,e
  469.  call _inc_ptr_bde
  470.  call _GETB_AHL
  471.  call _RAM_PAGE_1
  472.  pop hl
  473.  ret
  474.  
  475.  
  476. ; --- PROCESS PROGRAM ---
  477.  
  478. ReadProgram:
  479.  call _clrLCD
  480.  call _homeup
  481.  ld hl,ProgProcTxt
  482.  call _puts
  483.  call _newline
  484.  
  485.  ld hl,StatePtrs
  486.  ld bc,MaxStates*2-1
  487.  ld (hl),0
  488.  call Fill
  489.  
  490.  ld hl,StateList
  491.  ld (StatePtrs),hl
  492.  
  493.  ld hl,0
  494.  ld (lineNo),hl
  495.  ld (lastState),hl
  496.  ld ix,StateList
  497.  
  498.  ld hl,LastTuringProg-1
  499.  rst 20h
  500.  rst 10h
  501.  call ReadByte
  502.  ld l,a
  503.  call ReadByte
  504.  ld h,a
  505.  ld (sizeLeft),hl
  506.  call NextByte
  507.  
  508. ProcessRow:
  509.  ld hl,(lineNo)
  510.  inc hl
  511.  ld (lineNo),hl
  512.  call NextByte
  513.  or a
  514.  ret z
  515.  cp $D6
  516.  jr z,ProcessRow
  517.  cp '^'
  518.  jr nz,ParseRow
  519. FindEOL:
  520.  call NextByte
  521.  jr nc,FindEOL
  522.  jr ProcessRow
  523. ParseRow:
  524.  call PrevByte
  525.  ld hl,0
  526.  call ReadState
  527.  jp c,ErrorHandler
  528.  ld (inState),hl
  529.  push de
  530.  ld de,(lastState)
  531.  call _cphlde
  532.  pop de
  533.  ld c,5
  534.  jp c,ErrorHandler
  535.  call NextByte
  536.  ld c,1
  537.  jp c,ErrorHandler
  538.  ld (inChar),a
  539.  call ParseComma
  540.  call NextByte
  541.  ld c,1
  542.  jp c,ErrorHandler
  543.  ld (outChar),a
  544.  call ParseComma
  545.  call NextByte
  546.  ld c,1
  547.  jp c,ErrorHandler
  548.  cp 'R'
  549.  jr z,ShiftCharOK
  550.  dec c
  551.  cp 'S'
  552.  jr z,ShiftCharOK
  553.  ld c,4
  554.  cp 'L'
  555.  jp nz,ErrorHandler
  556.  ld c,-1
  557. ShiftCharOK:
  558.  ld a,c
  559.  ld (shiftChar),a
  560.  call ParseComma
  561.  ld hl,0
  562.  call NextByte
  563.  cp 'H'
  564.  jr nz,NotH
  565.  call NextByte
  566.  ld c,2
  567.  jp nc,ErrorHandler
  568.  dec hl
  569.  jr StoreInStateList
  570. NotH:
  571.  call PrevByte
  572.  call ReadState
  573.  jr nc,OutStateOK
  574.  bit 1,c
  575.  jp nz,ErrorHandler
  576. OutStateOK:
  577.  inc c
  578.  cp ','
  579.  jp z,ErrorHandler
  580. StoreInStateList:
  581.  ld (outState),hl
  582.  ld hl,inState
  583.  push bc
  584.  push de
  585.  push ix
  586.  pop de
  587.  call _mov9B
  588.  ld hl,(inState)
  589.  ld de,(lastState)
  590.  call _cphlde
  591.  jr z,NoPtrUpdate
  592.  ld (lastState),hl
  593.  add hl,hl
  594.  ld de,StatePtrs
  595.  add hl,de
  596.  push ix
  597.  pop de
  598.  ld (hl),e
  599.  inc hl
  600.  ld (hl),d
  601. NoPtrUpdate:
  602.  ld de,7
  603.  add ix,de
  604.  pop de
  605.  pop bc
  606.  jp ProcessRow
  607.  
  608. ParseComma:
  609.  call NextByte
  610.  cp ','
  611.  ret z
  612.  ld c,3
  613.  pop hl
  614.  jr ErrorHandler
  615.  
  616. ReadState:
  617.  call NextByte
  618.  ld c,1
  619.  ret c
  620.  cp ','
  621.  ret z
  622.  ld c,2
  623.  sub '0'
  624.  ret c
  625.  cp 10
  626.  ccf
  627.  ret c
  628.  push de
  629.  add hl,hl
  630.  ld d,h
  631.  ld e,l
  632.  add hl,hl
  633.  add hl,hl
  634.  add hl,de
  635.  ld d,0
  636.  ld e,a
  637.  add hl,de
  638.  ld de,MaxStates
  639.  call _cphlde
  640.  pop de
  641.  ccf
  642.  ret c
  643.  jr ReadState
  644.  
  645. PrevByte:
  646.  push hl
  647.  ld hl,(sizeLeft)
  648.  inc hl
  649.  ld (sizeLeft),hl
  650.  call _dec_ptr_bde
  651.  pop hl
  652.  ret
  653.  
  654. NextByte:
  655.  push hl
  656.  ld hl,(sizeLeft)
  657.  ld a,h
  658.  or l
  659.  scf
  660.  jr z,EndOfProg
  661.  ret z
  662.  dec hl
  663.  ld (sizeLeft),hl
  664.  pop hl
  665. ReadByte:
  666.  push hl
  667.  ld a,b
  668.  ld h,d
  669.  ld l,e
  670.  call _inc_ptr_bde
  671.  call _GETB_AHL
  672.  cp $D6
  673.  scf
  674.  jr z,EndOfProg
  675.  or a
  676. EndOfProg:
  677.  pop hl
  678.  ret
  679.  
  680. sizeleft:
  681.  .dw 0
  682. lastState:
  683.  .dw 0
  684. lineNo:
  685.  .dw 0
  686. inState:
  687.  .dw 0
  688. inChar:
  689.  .db 0
  690. outChar:
  691.  .db 0
  692. shiftChar:
  693.  .db 0
  694. outState:
  695.  .dw 0
  696. stopState:
  697.  .dw $FFFF
  698.  
  699. ErrorHandler:
  700.  ld hl,$0002
  701.  ld (_curRow),hl
  702.  ld hl,ErrorMsg+6
  703.  ld a,'0'
  704.  add a,c
  705.  ld (hl),a
  706.  ld hl,ErrorMsg
  707.  call _puts
  708.  ld hl,(lineNo)
  709.  call DispHL
  710.  ld a,':'
  711.  call _putc
  712.  ld hl,$0003
  713.  ld (_curRow),hl
  714.  ld hl,ErrorPtrTable-2
  715.  sla c
  716.  ld b,0
  717.  add hl,bc
  718.  call _ldhlind
  719.  call _puts
  720.  call _runindicoff
  721.  call ReadKey
  722.  scf
  723.  ret
  724.  
  725. ProgProcTxt:
  726.  .db "Processing...",0
  727.  
  728. ErrorMsg:
  729.  .db "Error   in line ",0
  730. ErrorPtrTable:
  731.  .dw Error1Msg,Error2Msg,Error3Msg,Error4Msg,Error5Msg
  732. Error1Msg:
  733.  .db "Unexpected EOL.",0
  734. Error2Msg:
  735.  .db "Illegal state.",0
  736. Error3Msg:
  737.  .db 34,',',34," expected.",0
  738. Error4Msg:
  739.  .db "Illegal shift char.",0
  740. Error5Msg:
  741.  .db "States not in order.",0
  742.  
  743.  
  744. ; --- SELECT PROGRAM, STRING, TAPE HEAD ---
  745.  
  746. Init:
  747.  call _clrLCD
  748.  call _RAM_PAGE_7
  749.  call _homeup
  750.  set textInverse,(iy+textflags)
  751.  ld hl,Title
  752.  call _puts
  753.  res textInverse,(iy+textflags)
  754.  ld de,$0822
  755.  ld (_penCol),de
  756.  call _vputs
  757.  
  758.  ld hl,$BFFF
  759.  ld (TuringProg),hl
  760.  ld (String),hl
  761.  
  762.  ld hl,LastTuringProg-1
  763.  rst 20h
  764.  rst 10h
  765.  jr c,LastProgNF
  766.  call CheckTuringProg
  767.  jr c,LastProgNF
  768.  ld (TuringProg),hl
  769.  jr CheckLastString
  770. LastProgNF:
  771.  call ScanTuringProg
  772.  
  773. CheckLastString:
  774.  ld hl,LastString-1
  775.  rst 20h
  776.  rst 10h
  777.  jr c,LastStringNF
  778.  call CheckString
  779.  jr c,LastStringNF
  780.  ld (String),hl
  781.  jr InvokeOptMenu
  782. LastStringNF:
  783.  call ScanString
  784.  
  785. InvokeOptMenu:
  786.  ld hl,OptMenu
  787.  call $49C8
  788.  call $49E8
  789.  
  790. DisplayOptions:
  791.  ld hl,$0003
  792.  ld (_curRow),hl
  793.  ld hl,TuringProgTxt
  794.  call _puts
  795.  ld hl,(TuringProg)
  796.  call CopyVarName
  797.  ld de,LastTuringProg
  798.  call _mov9B
  799.  ld hl,_OP1+1
  800.  call _puts
  801.  
  802.  ld hl,$0004
  803.  ld (_curRow),hl
  804.  ld hl,StringNameTxt
  805.  call _puts
  806.  ld hl,(String)
  807.  call CopyVarName
  808.  ld de,LastString
  809.  call _mov9B
  810.  ld hl,_OP1+1
  811.  call _puts
  812.  
  813. DisplayTapeHead:
  814.  ld hl,$0005
  815.  ld (_curRow),hl
  816.  ld hl,TapeHeadTxt
  817.  call _puts
  818.  ld hl,(TapeHeadStart)
  819.  call DispHL
  820.  ld a,' '
  821.  call _putc
  822.  
  823. WaitMenuKey:
  824.  call ReadKey
  825.  cp K_F1
  826.  jr z,MScanProg
  827.  cp K_F2
  828.  jr z,MScanString
  829.  cp K_F3
  830.  jr z,MIncTapeHead
  831.  cp K_F4
  832.  jr z,MDecTapeHead
  833.  cp K_ENTER
  834.  ret z
  835.  cp K_F5
  836.  ret z
  837.  cp K_EXIT
  838.  jr nz,WaitMenuKey
  839.  scf
  840.  ret
  841.  
  842. MScanProg:
  843.  call ScanTuringProg
  844.  jr DisplayOptions
  845.  
  846. MScanString:
  847.  call ScanString
  848.  jr DisplayOptions
  849.  
  850. MIncTapeHead:
  851.  ld hl,(TapeHeadStart)
  852.  inc hl
  853.  ld (TapeHeadStart),hl
  854.  jr DisplayTapeHead
  855.  
  856. MDecTapeHead:
  857.  ld hl,(TapeHeadStart)
  858.  dec hl
  859.  bit 7,h
  860.  jr nz,WaitMenuKey
  861.  ld (TapeHeadStart),hl
  862.  jr DisplayTapeHead
  863.  
  864. ScanTuringProg:
  865.  ld hl,(TuringProg)
  866. NextTuringProg:
  867.  call SkipVariable
  868.  call CheckTuringProg
  869.  jr nc,ProgFound
  870.  ld de,(TuringProg)
  871.  call _cphlde
  872.  jr z,NoTuringProg
  873.  jr NextTuringProg
  874. ProgFound:
  875.  ld (TuringProg),hl
  876.  ret
  877.  
  878. ScanString:
  879.  ld hl,(String)
  880. NextString:
  881.  call SkipVariable
  882.  call CheckString
  883.  jr nc,StringFound
  884.  ld de,(String)
  885.  call _cphlde
  886.  jr z,NoString
  887.  jr NextString
  888. StringFound:
  889.  ld (String),hl
  890.  ret
  891.  
  892. NoString:
  893.  ld hl,NoStringTxt
  894.  jr NotFound
  895. NoTuringProg:
  896.  ld hl,NoTuringProgTxt
  897. NotFound:
  898.  ld de,$0004
  899.  ld (_curRow),de
  900.  call _puts
  901.  call ReadKey
  902.  pop hl
  903.  scf
  904.  ret
  905.  
  906. CheckTuringProg:
  907.  ld a,(hl)
  908.  and $1F
  909.  cp $12
  910.  scf
  911.  ret nz
  912.  push hl
  913.  dec hl
  914.  ld e,(hl)
  915.  dec hl
  916.  ld d,(hl)
  917.  dec hl
  918.  ld a,(hl)
  919.  ex de,hl
  920.  call _inc_ptr_ahl
  921.  call _inc_ptr_ahl
  922.  call _inc_ptr_ahl
  923.  call _GETB_AHL
  924.  call _RAM_PAGE_7
  925.  cp '^'
  926.  scf
  927.  pop hl
  928.  ret nz
  929.  or a
  930.  ret
  931.  
  932. CheckString:
  933.  ld a,(hl)
  934.  and $1F
  935.  cp $0C
  936.  scf
  937.  ret nz
  938.  or a
  939.  ret
  940.  
  941. CopyVarName:
  942.  ld a,' '
  943.  ld de,_OP1
  944.  push de
  945.  ld b,9
  946. FillSpace:
  947.  ld (de),a
  948.  inc de
  949.  djnz FillSpace
  950.  xor a
  951.  ld (de),a
  952.  pop de
  953.  dec hl
  954.  dec hl
  955.  dec hl
  956.  dec hl
  957.  dec hl
  958.  ld b,(hl)
  959.  inc b
  960. CopyName:
  961.  ld a,(hl)
  962.  ld (de),a
  963.  dec hl
  964.  inc de
  965.  djnz CopyName
  966.  ld hl,_OP1
  967.  ret
  968.  
  969. SkipVariable:
  970.  dec hl
  971.  dec hl
  972.  dec hl
  973.  dec hl
  974.  dec hl
  975.  ld b,(hl)
  976.  inc b
  977. SkipName:
  978.  dec hl
  979.  djnz SkipName
  980.  ld de,(_endSymbTable)
  981.  inc de
  982.  call _cphlde
  983.  ret nc
  984.  ld hl,$BFFF
  985.  ret
  986.  
  987. Title:
  988.  .db " TURING MACHINE SIM. ",0
  989.  .db "by Jimmy Mardell",0
  990. TuringProgTxt:
  991.  .db "Turing prog: ",0
  992. StringNameTxt:
  993.  .db "Stringname.: ",0
  994. TapeHeadTxt:
  995.  .db "Tape head..: ",0
  996. NoTuringProgTxt:
  997.  .db "No Turing prog found!",0
  998. NoStringTxt:
  999.  .db "  No strings found!",0
  1000. OptMenu:
  1001.  .db $09,$05
  1002.  .dw M_NextProg,M_NextStr,M_IncTH,M_DecTH,M_Run
  1003. M_NextProg:
  1004.  .db 0,"+prog",0
  1005. M_NextStr:
  1006.  .db 0,"+str",0
  1007. M_IncTH:
  1008.  .db 0,"+head",0
  1009. M_DecTH:
  1010.  .db 0,"-head",0
  1011. M_RUN:
  1012.  .db 0,"RUN",0
  1013.  
  1014. TuringProg:
  1015.  .dw 0
  1016. String:
  1017.  .dw 0
  1018. TapeHeadStart:
  1019.  .dw 0
  1020. LastTuringProg:
  1021.  .db 0,0,0,0,0,0,0,0,0
  1022. LastString:
  1023.  .db 0,0,0,0,0,0,0,0,0
  1024. speed:
  1025.  .db 0
  1026.  
  1027.  
  1028. ; --- MISC. ROUTINES ---
  1029.  
  1030. ReadKey:
  1031.  call _getky
  1032.  or a
  1033.  jr z,ReadKey
  1034.  ret
  1035.  
  1036. DispHL:
  1037.  push de
  1038.  ld de,_OP3+5
  1039.  xor a
  1040.  ld (de),a
  1041. UnpackHL:
  1042.  call _hldiv10
  1043.  dec de
  1044.  add a,'0'
  1045.  ld (de),a
  1046.  ld a,h
  1047.  or l
  1048.  jr nz,UnpackHL
  1049.  ex de,hl
  1050.  call _puts
  1051.  pop de
  1052.  ret
  1053.  
  1054. Fill:
  1055.  ld d,h
  1056.  ld e,l
  1057.  inc de
  1058.  ldir
  1059.  ret
  1060.  
  1061. StateList:
  1062.  .dw $FFFF
  1063.  
  1064. .end
  1065.