;;THIS STEPPER MOTOR PROGRAM WORKED IN MS-DOS VERS5 AND
;;MY BONDWELL LAPTOP. IT WILL NEED TO BE ALTERED FOR
;;NEWER VERSIONS OF DOS AND IS NOT FULLY PORT TESTED
NAME STEPPER.ASM
TITLE DESIGNED: BY NICK K. VAN VLIET AUGUST/98 UPDATED OCT23/99
K0100 JMP K020B ;PROGRAM START
K0103 ;RAY OF CALL ROUTINE FOR MENU
K0106 ;frequency check = 1=AL
K0109 JMP K06F0 ;<- ->direction 4/2 = 110
K010C JMP K0760 ;^ v full/half step 10/8 = 1.1000
K010F ;step increments
K0112 ;motor selection =1110.0000=AL
K0115 JMP K07E6 ;program sample.stp
K0118 JMP K0200 ;RETURN TO DOS
K01F3 DW AX ;PORT INFO
K01F5 DW AX ;PORT ADDRESS
K01F7 DW DX ;?CALL OFFSET
K01F9 DW DX ;LINE CALL OFFSET
K01FB DW BX ;OLD BLUE LINE
K01FD DW AX ;NEW WHITE LINE
K07DC DW AX ;END OF FILE LOW
K07DE DW DX ;END OF FILE HIGH
K07E0 DW AX ;START OF FILE LOW
K07DE DW DX ;START OF FILE HIGH
K020B:
MOV AX,0003 ;16 COLOR TXT
K020E INT 10
K0210 MOV BH,03 ;CLS CYAN
K0212 MOV CX,0000
K0215 MOV DX,174F
K0218 MOV AX,0600
K021B INT 10
K021D MOV BH,0F ;CLS WHITE LINE TOP
K021F MOV CX,0000
K0222 MOV DX,004F
K0225 MOV AX,0600
K0228 INT 10
K022A MOV BH,01 ;CLS LBLUE
K022C MOV CX,0511
K022F MOV DX,1341
K0232 MOV AX,0600
K0235 INT 10
K0237 MOV BH,09 ;CLS LBLUE
K0239 MOV CX,040F
K023C MOV DX,123F
K023F MOV AX,0600
K0242 INT 10
K0244 MOV CX,0780
K0247:
MOV DL,DB
K0249 MOV AX,0200
K024C INT 21
K024E LOOP K0247 ;FILL SCREEN
K0250 CALL K02A4
K0253 DB 'STEPPER PROGRAM DESIGNED BY: NICK K. VAN VLIET AUG/98 (416) 921-4653 $'
K02A4 MOV AH,02 ;SET CRSR
K02A6 MOV DX,0101
K02A9 INT 10
K02AB MOV AH,0F
K02AD INT 10
K02AF MOV AX,0900 ;PRINT COMPANY LOGO
K02B2 POP DX
K02B3 INT 21
K02B5 CALL K0A70 ;CHANGE DEFAULT PORT 2F8 TO PORT ON PSP
K02B8 JMP K04B0
K02BB NOP
K02BC NOP
K02BD JMP K04B0
;QUESTIONS OFFSET
K02D0:
CALL K02FE
K02D3 DB 'PORT IS NOT ACTIVE $$.........Z.
K0300 CALL K032E
K0303 DB 'DELAY IN MILLISECONDS 200 $$.........Z.
K0330 CALL K035E
K0333 DB 'TOGGLE DIRECTIONS . / . $$.........Z.
K0360 CALL K038E
K0363 DB 'TOGGLE HALF/FULL STEP . / . $$.........Z.
K0390 CALL K03BE
K0393 DB 'ENTER NUMBER OF STEPS XXX $$.........Z.
K03C0 CALL K03EE
K03C3 DB 'ENTER MOTOR NUMBER XX $$.........Z.
K03F0 CALL K041E
K03F3 DB 'ENTER PROGRAM NAME XXXXXXXX$$.........Z.
K0420 CALL K044E
K0423 DB 'HIT ENTER TO QUIT$$$ XX $$.........Z.
K0450 CALL K047E
K0453 DB 'ERROR DETECTED$$$R XX $$.........Z.
K0480 CALL K04AE
K0483 DB 'STEPPER MOTOR MENU$$ XX $$.........Z.
K04B0:
MOV AH,02 ;SET CRSR
K04B2 MOV DX,0215
K04B5 INT 10
K04B7 PUSH DX
K04B8 PUSH AX
K04B9 CALL K0480 ;PRNT MAIN MENU TITLE
K04BC MOV AH,09
K04BE INT 21
K04C0 POP AX
K04C1 POP DX
K04C2 INC DH
K04C4 INC DH ;SKIP 2 LINES
K04C6 INC DH
K04C8 INT 10
K04CA PUSH DX
K04CB PUSH AX
K04CC CALL K02D0 ;PRNT 1. PORT ACTIVE YES/NO
K04CF MOV AH,09
K04D1 INT 21
K04D3 POP AX
K04D4 POP DX
K04D5 INC DH
K04D7 INT 10
K04D9 PUSH DX
K04DA PUSH AX
K04DB CALL K0300 ';PRNT 2. DELAY
K04DE MOV AH,09
K04E0 INT 21
K04E2 POP AX
K04E3 POP DX
K04E4 INC DH
K04E6 INT 10
K04E8 PUSH DX
K04E9 PUSH AX
K04EA CALL K0330 ;PRNT 3. DIRECTION
K04ED MOV AH,09
K04EF INT 21
K04F1 POP AX
K04F2 POP DX
K04F3 INC DH
K04F5 INT 10
K04F7 PUSH DX
K04F8 PUSH AX
K04F9 CALL K0360 ;PRNT 4. HALF/FULL STEP
K04FC MOV AH,09
K04FE INT 21
K0500 POP AX
K0501 POP DX
K0502 INC DH
K0504 INT 10
K0506 PUSH DX
K0507 PUSH AX
K0508 CALL K0390 ;PRNT 5. ENTER STEPS
K050B MOV AH,09
K050D INT 21
K050F POP AX
K0510 POP DX
K0511 INC DH
K0513 INT 10
K0515 PUSH DX
K0516 PUSH AX
K0517 CALL K03C0 ;PRNT 6. MOTOR #
K051A MOV AH,09
K051C INT 21
K051E POP AX
K051F POP DX
K0520 INC DH
K0522 INT 10
K0524 PUSH DX
K0525 PUSH AX
K0526 CALL K03F0 ;PRNT 7. ENTER FILE SAMPLE
K0529 MOV AH,09
K052B INT 21
K052D POP AX
K052E POP DX
K052F INC DH
K0531 INT 10
K0533 PUSH DX
K0534 PUSH AX
K0535 CALL K0420 ;PRNT 8. RETURN TO DOS
K0538 MOV AH,09
K053A INT 21
K053C POP AX
K053D POP DX
K053E MOV AX,0715 ;STORE WHITE LINE PRES LOCTN
K0541 MOV BX,0615 ;STORE OLD LOCTN
K0544 MOV SI,01FD ;ADDRESS NEW LINE
K0547 MOV [SI],AX
K0549 DEC SI
K054A DEC SI
K054B MOV [SI],BX ;ADDRESS OLD LINE
K054D:
NOP ;<<== MAIN LOOP
K054E MOV AH,0F ;PG #
K0550 INT 10
K0552 MOV DX,[01F5] ;PORT
K0556 MOV CX,FFFF
K0559:
IN AX,DX ;INPUT AX WORD FROM PORT
K055A AND AX,0001 ;IS STEPPER ATTACHED / CAME LOOSE
K055D CMP AX,0000
K0560 JZ K0564 ;LOW DETECTED
K0562 LOOP K0559
K0564:
XOR SI,SI
K0566 CMP AX,0000
K0569 JZ K056D ;OK LOW DETECTED
K056B JMP K05A0 ;NO LOW FREQUENCY
K056D:
MOV CX,FFFF ;FREQ ZERO START
K0570 MOV DI,0100
K0573:
DEC DI
K0574 JNZ K0573 ;DELAY
K0576:
IN AX,DX
K0577 AND AX,0001
K057A CMP AX,0000
K057D JNZ K0584 ;OK HIGH DETECTED
K057F INC SI
K0580 LOOP K0576
K0582 JMP K05A0 ;NO FREQUENCY DETECTED
K0584:
CMP SI,+00 ;??TEST NOT NEEDED ;OK FREQ
K0587 JZ K05A0
K0589 MOV AH,02 ;SET CRSR
K058B MOV DX,052B ;??NEW LOCTN
K058E INT 10
K0590 CALL K0598 ;POKE YES
K0593 DB 'YES'
K0597 NOP
K0598 POP DX
K0599 MOV AH,09 ;'YES ACTIVE'
K059B INT 21
K059D JMP K05B4
K059F NOP
K05A0:
MOV AH,02 ;SET CRSR
K05A2 MOV DX,052B ;??NEW LOCTN
K05A5 INT 10
K05A7 CALL K05AF
K05AA DB 'NOT'
K05AF POP DX
K05B0 MOV AH,09 ;'NOT ACTIVE'
K05B2 INT 21
K05B4:
MOV CX,0000
K05B7 CALL K05C7 ;ENTER KEY
K05BA CALL K069A ;ERASE MSSG
K05BD JMP K054D ;MAIN LOOP ==^
K05BF RET
;;;;;;;;;;;;;;;;;;;;;;;;;;; SUBROUTINES
K05C7:
MOV DX,[01FD] ;NEW WHITE LINE CURSOR LOCATION
K05CB MOV CX,DX
K05CD ADD DX,+15
K05D0 NOP
K05D1 MOV BH,0F ;WHITE HIGHLIGHTED LINE
K05D3 MOV AX,0601
K05D6 INT 10
K05D8 MOV DL,[01FD] ;NEW LINE CURSOR LOCATION
K05DC MOV DH,00
K05DE SUB DL,05
K05E1 MOV [01F9],DX ;STORE LINE #
K05E5 MOV AX,0030
K05E8 MUL DX ;AXxDX = DX:AX
K05EA ADD AX,02D0 ;OFFSET
K05ED PUSH AX ;AX=AXxDX+2D0
K05EE MOV AH,0F ;PG #
K05F0 INT 10
K05F2 MOV DX,[01FB] ;OLD
K05F6 MOV AH,02 ;SET CRSR
K05F8 INT 10
K05FA POP AX ;2D0+30xN=200/330/360/390/3C0/3F0/420/450/480
K05FB CALL KAX ;GET DX NEW LINE
K05FD MOV AH,09 ;PRINT PRESENT LINE WHITE
K05FF INT 21
K0601 NOP
K0602 MOV DX,[01FB] ;OLD LINE
K0606 MOV CX,DX
K0608 ADD DX,+15
K060B NOP
K060C MOV BH,09 ;BLUE DEHIGHLIGHT
K060E MOV AX,0601
K0611 INT 10
K0613 MOV DL,[01FB]
K0617 MOV DH,00
K0619 SUB DL,05
K061C MOV [01F7],DX ;TRUE LINE CALL OFFSET
K0620 MOV AX,0030
K0623 MUL DX
K0625 ADD AX,02D0
K0628 PUSH AX
K0629 MOV AH,0F ;FIND PG#
K062B INT 10
K062D MOV DX,[01FB] ;OLD
K0631 MOV AH,02 ;SET CRSR
K0633 INT 10
K0635 POP AX
K0636 CALL KAX ;GET DS:DX OLD LINE
K0638 MOV AH,09 ;PRINT OLD LINE
K063A INT 21
K063C MOV DX,[01FD] ;NEW LINE
K0640 MOV AX,[01FB] ;OLD LINE
K0643 MOV [01FB],DX ;STORE PRESENT LCTN IN OLD LOCTN
K0647 MOV CX,0000
K064A:
MOV AH,01 ;WAIT FOR KEY INPUT
K064C INT 16
K064E JZ K064A
K0650 MOV AH,08 ;READ KEY INTO AL
K0652:
INT 21
K0654 CMP AL,00 ;2 DIGIT ARROW KEY?
K0656 JZ K0652 ;YES
K0658 CMP AL,50 ;UP A LINE ^
K065A JZ K0668
K065C CMP AL,48 ;DOWN A LINE v
K065E JZ K0662
K0660 JMP K0683
K0662:
DEC BYTE PTR [01FD] ;NEW ;DEC CRSR
K0666 JMP K066C
K0668:
INC BYTE PTR [01FD] ;NEW ;INC CRSR
K066C:
MOV AL,[01FD] ;NEW
K066F CMP AL,0D
K0671 JC K0677
K0673 MOV AL,05 ;CHECK LIMITS
K0675 JMP K067D
K0677:
CMP AL,05
K0679 JNC K067D
K067B MOV AL,0C
K067D:
MOV [01FD],AL ;STORE NEW LOCTN
K0680 RET
K0681 RET
K0682 RET
K0683:
MOV BX,[01F9] ;LINE #
K0687 MOV AX,0003
K068A MUL BX
K068C ADD AX,0103
K068F CALL KAX ;RAY OF CALL ROUTINES TO LINES
K0691 RET
K0692 RET
K0693 RET
K0694 RET
K0695 RET
K0696 RET
K0697 RET
K0698 RET
K0699 RET
K069A MOV AH,0F
K069C INT 10
K069E MOV DX,[01FD] ;NEW
K06A2 MOV DH,0E ;CHNGE LINE Y
K06A4 MOV AH,02
K06A6 INT 10
K06A8 CALL K06E7 ;CLEAR REPLY LINE
K06Ab DB DB DB DB DB DB DB DB DB DB DB DB DB-DB DB DB DB DB DB DB DB
DB DB DB DB DB DB DB DB-DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB '$'
K06E7 POP DX
K06E8 MOV AH,09 ;CLEAR LINE
K06EA INT 21
K06EC RET
K06ED RET
K06EE RET
K06EF RET
K06F0:
NOP ;;<<<<>>>>>
K06F1 CALL K069A
K06F4 MOV DX,[01FD] ;NEW
K06F8 MOV DH,0E
K06FA MOV AH,02 ;SET REPLY CRSR
K06FC INT 10
K06FE CALL K072B ;PRNT PROMPT
K0701 DB 'ENTER CHANGE IN DIRECTION . / . / HOME$$N$.Z...!
K072B POP DX
K072C MOV AH,09 ;PRNT REPLY PROMPT
K072E INT 21
K0730 MOV DX,[01F5] ;PORT ADDRESS
K0734 MOV AL,[01F3] ;GET PORT INFO
K0737 AND AL,F9 ;MASK OFF F9 = 1111.1001
K0739 PUSH AX
K073A:
MOV AH,01 ;WAIT KEY INPUT
K073C INT 16
K073E JZ K073A
K0740 MOV AH,08
K0742 INT 21
K0744 INT 21
K0746 CMP AL,4B ;<- ANTI CLOCKWISE
K0748 JZ K0751
K074A CMP AL,4D ;-> CLOCKWISE
K074C JZ K0756
K074E POP AX
K074F RET
K0750 RET
K0751:
POP AX
K0752 OR AL,04
K0754 JMP K0759
K0756:
POP AX
K0757 OR AL,02
K0759:
OUT DX,AL ;DIRECTION OUT
K075A MOV [01F3],AL ;STORE PORT ECHO
K075D JMP K0B10
K0760: ;;<<<<>>>>>
NOP
K0761 CALL K069A ;CLEAR REPLY LINE
K0764 MOV DX,[01FD] ;NEW
K0768 MOV DH,0E
K076A MOV AH,02 ;SET CRSR REPLY LINE
K076C INT 10
K076E CALL K079B
K0771 DB 'ENTER CHANGE IN STEP ^ / v / HOME$$$TURN$.Z...!
K079B POP DX
K079C MOV AH,09 ;PRINT REPLY PROMPT
K079E INT 21
K07A0:
MOV DX,[01F5] ;PORT ADDRESS
K07A4 MOV AL,[01F3] ;GET PORT INFO
K07A7 AND AL,E7 ;MASK OFF E7 = 1110.0111
K07A9 PUSH AX
K07AA:
MOV AH,01 ;WAIT KEY INPUT
K07AC INT 16
K07AE JZ K07AA
K07B0 MOV AH,08
K07B2 INT 21 ;READ ZERO
K07B4 INT 21 ;READ ARROW CHOICE
K07B6 CMP AL,48 ;^ FULL STEP
K07B8 JZ K07C1
K07BA CMP AL,50 ;V HALF STEP
K07BC JZ K07C6
K07BE POP AX
K07BF RET
K07C0 RET
K07C1:
POP AX
K07C2 OR AL,10
K07C4 JMP K07C9
K07C6:
POP AX
K07C7 OR AL,08
K07C9:
OUT DX,AL ;STEP H/F OUT
K07CA MOV [01F3],AL ;STORE PORT ECHO
K07CD JMP K0B10
K07D0: ;NOT USED
CALL K07D8
K07D3 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
K07D8:
POP CX
K07DA RET
K07DB RET
;K07DC DW AX ;END OF FILE LOW
;K07DE DW DX ;END OF FILE HIGH
;K07E0 DW AX ;START OF FILE LOW
;K07DE DW DX ;START OF FILE HIGH
K07DC RET
K07DD RET
K07DE RET
K07DF RET
K07E0 RET
K07E1 RET
K07E2 RET
K07E3 RET
K07E4 RET
K07E5 RET
K07E6: ;;<<<<>>>>
NOP
K07E7 CALL K069A
K07EA MOV DX,[01FD] ;NEW
K07EE MOV DH,0E
K07F0 MOV AH,02 ;SET CRSR
K07F2 INT 10
K07F4 CALL K0821
K07F8 DB 'ENTER FILE NAME WITHOUT STP > $TURN$TURN$
K0821 POP DX
K0822 MOV AH,09
K0824 INT 21
K0826 MOV CX,09 ;READ FILE ON PSP
K0829 MOV SI,80
K082C MOV DI,SI
K082E:
NOP
K082F MOV AH,01 ;PRINT CHAR
K0831 INT 21
K0833 INC DI
K0834 CMP AL,0D ;END OF FILE NAME
K0836 JZ K0841
K0838 NOP
K0839 CMP AL,2E ;'.'
K083B JZ K0841
K083D MOV [DI],AL ;[PSP+I],AL
K083F LOOP K082E ;ENTER FILE NAME 8 BYTES
K0841:
MOV AL,2E ;'.' ;ADD EXTENSION
K0843 MOV [DI],AL
K0845 INC DI
K0846 MOV AL,53 ;'S'
K0848 MOV [DI],AL
K084A INC DI
K084B MOV AL,54 ;'T'
K084D MOV [DI],AL
K084F INC DI
K0850 MOV AL,50 ;'P'
K0852 MOV [DI],AL
K0854 INC DI
K0855 MOV BYTE PTR [DI],00 ;ADD .STP'0'
K0858 SUB DI,SI
K085A MOV AX,DI
K085C MOV [SI],AL
K085E MOV DX,SI
K0860 INC DX
K0861 MOV AX,3D02
K0864 INT 21 ;OPEN FILE
K0866 JC K086C ;ERROR
K0868 MOV BX,AX ;BX=HNDL #
K086A JMP K08B3
K086C:
NOP
K086D CALL K069A ;CLS
K0870 MOV DX,[01FD] ;PRES LOCTN
K0874 MOV DH,0E
K0876 MOV AH,02 ;ST CRSR
K0878 INT 10
K087A CALL K08A7
K087D DB 'ERROR: HIT ENTER $THOUT STP$ RETURN$TURN$.Z...!...!
K08A7 POP DX
K08A8 MOV AH,09 ;PRNT MSSG
K08AA INT 21
K08AC MOV AH,08 ;WAIT
K08AE INT 21
K08B0 JMP K07E6 ;RETRY
K08B3:
NOP
K08B4 MOV DI,DX
K08B6 PUSH DS
K08B7 POP ES
K08B8 PUSH CS
K08B9 POP DS
K08BA XOR CX,CX
K08BC XOR DX,DX
K08BE MOV AX,4202 ;OPEN FILE AT END # BYTES OFFST=DX:AX
K08C1 INT 21
K08C3 MOV [07DC],AX ;END TOTAL # BYTES
K08C6 MOV [07DE],DX
K08CA XOR CX,CX
K08CC XOR DX,DX
K08CE MOV AX,4200 ;OPEN AT START TOTAL # BYTES=DX:AX
K08D1 INT 21
K08D3 MOV [07E0],AX ;START TOTAL # BYTES
K08D6 MOV [07E2],DX
K08DA MOV CX,0001
K08DD PUSH BX ;PPG#
K08DE: ;<--. MAIN READING PROGRAM LOOP
NOP ;
K08DF POP BX
K08E0 PUSH BX
K08E1 CALL K095B ;READ 50 BYTES INTO BUFFER AT 80=PSP
K08E4 MOV AL,[80]
K08E7 CMP AL,3B ;';'=COMMENTED LINE
K08E9 JNZ K08EF
K08EB JMP K0935
K08ED JMP K0935
K08EF:
CMP AL,48 ;'H'=HALF STEP KEY
K08F1 JNZ K08F9
K08F3 CALL K0AF8 ;HALF STEP ECHO
K08F6 JMP K0935
K08F8 NOP
K08F9:
CMP AL,46 ;'F'=FULL STEP KEY
K08FB JNZ K0903
K08FD CALL K0AE0 ;FULL STEP ECHO
K0900 JMP K0935
K0902 NOP
K0903:
CMP AL,43 ;'C'=COUNTER CLOCKWISE KEY
K0905 JNZ K090D
K0907 CALL K0AB0 ;COUNTER CLOCKWISE ECHO
K090A JMP K0935
K090C NOP
K090D:
CMP AL,4B ;'K'=CLOCKWISE KEY
K090F JNZ K0917
K0911 CALL K0AC8 ;CLOCKWISE ECHO
K0914 JMP K0935
K0916 NOP
K0917:
CMP AL,4D ;'M'=MOTOR KEY
K0919 JNZ K0921
K091B CALL K09F5 ;MOTOR ECHO
K091E JMP K0935
K0920 NOP
K0921:
CMP AL,44 ;'D'=DELAY KEY
K0923 JNZ K092B
K0925 CALL K09A0
;DELAY ECHO
K0928 JMP K0935
K092A NOP
K092B:
CMP AL,53 ;'S'=STEP KEY
K092D JNZ K0935
K092F:
CALL K0A1A ;STEP ECHO
K0935:
NOP
K0936 MOV CX,0001
K0939 MOV DI,07E2 ;START/PRES LOCTN OF FILE HIGH
K093C MOV SI,07DE ;END OF FILE HIGH
K093F CMPSW ;CMP[ESDI],[DSSI]
K0940 JNZ K0951
K0942 MOV DI,07E0 ;START/PRES LOCTN OF FILE LOW
K0945 MOV SI,07DC ;END OF FILE LOW
K0948 CMPSW ;CMP[ESDI],[DSSI]
K0949 JZ K0953
K0951:
JMP K08DE ;-^ KEEP ON READING
K0953:
NOP ;FILE DONE
K0954 POP BX ;PG#
K0955 JMP K0B10 ;CONTINUE --,
; V
K0958 RET
K0959 RET
K095A RET
K095B: ;<<<<<>>>>>
NOP
K095C MOV DX,[07E0] ;CURENT FILE POINTER
K0960 MOV CX,[07E2]
K0964 MOV AX,4201
K0967 INT 21 ;OPEN FILE AT PRESENT=BYTE COUNT
K0969 MOV AX,3F00 ;READ 50 BYTES STORE INTO BUFFER AT 80
K096C MOV CX,0050
K096F MOV DX,0080
K0972 INT 21
K0974 MOV SI,0080
K0977 CLD
K0978:
LODSW ;AX,[DSSI] LOAD 2 BYTES AT DS:SI
K0979 MOV DX,[07E0] ;PRESENT ;INC LOW FILE POINTER
K097D INC DX
K097E MOV [07E0],DX ;INC LOW WORD
K0982 JNC K0988
K0984 INC WORD PTR [07E2] ;START ;INC HIGH WORD
K0988:
DEC SI ;1 BYTE AT A TIME
K0989 CMP AX,0A0D ;LOCATE END OF LINE 0D,0A
K098C JNZ K0978
K098E MOV DX,[07E0] ;START
K0992 INC DX ;ADD NEWLINE
K0993 MOV [07E0],DX ;START
K0997 JNZ K099D
K0999 INC WORD PTR [07E2] ;START HIGH ADD CARRY
K099D:
RET
K099E RET
K099F RET
K09A0: ;;<<<<>>>>>
NOP
K09A1: ;CALCULATE NUMBER OF DELAY ON PSP
CALL K095B ;PREPARE PSP AND ADD LINE TO POINTER
K09A4 MOV CX,0000
K09A7 MOV BX,0000
K09AA MOV SI,80 ;PSP
K09AD: ;<<==. LOOP
LODSB ;AL,[DSSI] LOAD CHAR ON PSP SI++
K09AE CMP AL,30 ;30='0'
K09B0 JC K09B8
K09B2 CMP AL,3A ;39='9'
K09B4 JNC K09B8
K09B6 JMP K09BB ;OK READ
K09B8:
JMP K09DD ;ERROR/DFLT=1
K09BA NOP
K09BB: ;CONVERT TO NUMBER
XCHG CX,AX
K09BC MOV CL,0A
K09BE MUL CL ;MUL OLD HIGH WORD BY 10d
K09C0 XCHG CX,AX
K09C1 XCHG BX,AX
K09C2 MOV BX,000A
K09C5 MUL BX ;MUL OLD LOW WORD BY 10d
K09C7 ADD CX,DX ;ADD CARRY TO HIGH WORD
K09C9 XCHG AX,BX
K09CB MOV AH,00
K09CD MOV AL,[SI-01] ;OLD SI
K09D0 SUB AL,30
K09D2 MOV DL,0A
K09D4 MUL DL ;MUL NEXT DIGIT BY 10d
K09D6 ADD BX,AX ;ADD TO OLD LOW WORD
K09D8 JNC K09DB
K09DA INC CX ;ADD CARRY TO HIGH WORD
K09DB: ;
JMP K09AD ;-' ;LOOP TOTAL
K09DD:
MOV DX,[01F5] ;GET PORT ADDRESS
K09E1 MOV AL,00
K09E3 INC BX
K09E4 INC CX
K09E5:
OUT DX,AL ;OUT SIGNAL PAUSE
K09E6 PUSH CX ;HIGH WORD DELAY
K09E7 MOV CX,BX ;LOW WORD DELAY
K09E9:
LOOP K09E9
K09EB POP CX
K09EC LOOP K09E5 ;DELAY
K09EE MOV AL,[01F3] ;GET PORT ECHO
K09F1 OUT DX,AL ;RESTORE PORT ECHO
K09F2 RET
K09F3 RET
K09F4:
K09F4 NOP
K09F5 CALL K095B ;PREPARE PSP AND ADD LINE TO POINTER ;GET MOTOR NUMBER FROM PSP
K09F8 MOV DL,[01F3] ;GET PORT ECHO
K09FC AND DL,9F
K09FF MOV AL,[80]
K0A02 AND AL,03 ;1/2/3 ;MASK OFF 0000.0011
K0A04 MOV CL,05
K0A06 ROL AL,CL ;0110.0000
K0A08 OR AL,DL
K0A0A MOV DX,[01F5] ;GET PORT ADDRESS
K0A0E OUT DX,AL
K0A0F MOV [01F3],AL ;STORE PORT ECHO
K0A12 RET
K0A13 RET
K0A14 RET
K0A15 RET
K0A16 RET
K0A17 RET
K0A18 RET
K0A19 RET
K0A1A: ;;<<<<>>>>>
NOP
K0A1B CALL K095B ;PREPARE PSP AND ADD LINE TO POINTER
K0A1E MOV CX,0000
K0A21 MOV BX,0000
K0A24 MOV SI,0080
K0A27: ;<<==. LOOP
LODSB
K0A28 CMP AL,30 ;30='0'
K0A2A JC K0A32
K0A2C CMP AL,3A ;39='9'
K0A2E JNC K0A32
K0A30 JMP K0A35
K0A32:
JMP K0A57 ;ERROR<0>/DONE
K0A34 NOP
K0A35:
XCHG CX,AX
K0A36 MOV CL,0A
K0A38 MUL CL ;MUL HIGH WORD BY 10d
K0A3A XCHG CX,AX
K0A3B XCHG BX,AX
K0A3C MOV BX,000A
K0A3F MUL BX ;MUL LOW WORD BY 10d
K0A41 ADD CX,DX ;ADD CARRY TO HIGH WORD
K0A43 XCHG AX,BX
K0A45 MOV AH,00
K0A47 MOV AL,[SI-01] ;OLD SI
K0A4A SUB AL,30
K0A4C MOV DL,0A
K0A4E MUL DL ;MUL NEXT DIGIT BY 10d
K0A50 ADD BX,AX
K0A52 JNC K0A55
K0A54 INC CX ;ADD CARRY TO HIGH WORD
K0A55:
JMP K0A27
;;;;;;;;;;;;;;
K0A53 JMP K0A27
K0A55 JMP K0A27
K0A57:
MOV DX,[01F5] ;PORT ADDRESS
K0A5B MOV AL,[01F3] ;PORT ECHO
K0A5E INC BX
K0A5F INC CX
K0A60:
PUSH CX
K0A61 MOV CX,BX
K0A63:
OUT DX,AL
K0A64 LOOP K0A63 ;>>==^ LOOP
K0A66 POP CX
K0A67 LOOP K0A60
K0A69 RET
K0A6A RET
K0A6B RET
K0A6C RET
K0A6D RET
K0A6E RET
K0A6F RET
K0A70: ;;<<<<>>>>>
NOP ;GET PORT ADDRESS DEFAULT 2F8
K0A71 MOV SI,80 ;80=PSP
K0A74 MOV AL,[SI]
K0A76 CMP AL,04 ;TRUE LENGTH=4
K0A78 JNZ K0AA0
K0A7A INC SI
K0A7B INC SI
K0A7C MOV DH,[SI]
K0A7E SUB DH,30 ;1ST BYTE=0/1/2/3
K0A81 CMP DH,04
K0A84 JNC K0AA0
K0A86 INC SI
K0A87 MOV DL,[SI]
K0A89 CMP DL,46 ;'F' 0/1/2/3F8 COM4/3/2/1
K0A8C JNZ K0A92
K0A8E MOV DL,F8
K0A90 JMP K0AA3
K0A92:
CMP DL,37 ;'7' 378 PTL1
K0A95 JNZ K0AA0
K0A97 MOV DL,78
K0A99 CMP DH,03
K0A9C JNZ K0AA0
K0A9E JMP K0AA3
K0AA0:
MOV DX,02F8 ;DEFAULT COM2=2F8
K0AA3:
MOV [01F5],DX ;STORE PORT ADDRESS
K0AA7 MOV AX,0000
K0AAA MOV [01F3],AX ;INIT PORT ECHO
K0AAD RET
K0AAE RET
K0AAF RET
K0AB0 RET
K0AB0: ;;<<<<>>>>>
NOP
K0AB1 MOV DX,[01F5] ;PORT ADDRESS
K0AB5 MOV AL,[01F3] ;PORT ECHO
K0AB8 AND AL,F9
K0ABA OR AL,04
K0ABC MOV [01F3],AL ;STORE PORT ECHO
K0ABF OUT DX,AL
K0AC0 RET
K0AC1 RET
K0AC2 RET
K0AC3 RET
K0AC4 RET
K0AC5 RET
K0AC6 RET
K0AC7 RET
K0AC8: ;;<<<<>>>>>
NOP
K0AC9 MOV DX,[01F5] ;PORT ADDRESS
K0ACD MOV AL,[01F3] ;PORT ECHO
K0AD0 AND AL,F9
K0AD2 OR AL,02
K0AD4 MOV [01F3],AL ;STORE PORT ECHO
K0AD7 OUT DX,AL
K0AD8 RET
K0AD9 RET
K0ADA RET
K0ADB RET
K0ADC RET
K0ADD RET
K0ADE RET
K0ADF RET
K0AE0: ;;<<<<>>>>>
NOP
K0AE1 MOV DX,[01F5] ;PORT ADDRESS
K0AE5 MOV AL,[01F3] ;PORT ECHO
K0AE8 AND AL,E7
K0AEA OR AL,10
K0AEC MOV [01F3],AL ;STORE PORT ECHO
K0AEF OUT DX,AL
K0AF0 JMP K0A1A
K0AF3 RET
K0AF4 RET
K0AF5 RET
K0AF6 RET
K0AF7 RET
K0AF8: ;;<<<<>>>>>
NOP
K0AF9 MOV DX,[01F5] ;PORT ADDRESS
K0AFD MOV AL,[01F3] ;PORT ECHO
K0B00 AND AL,E7
K0B02 OR AL,08
K0B04 MOV [01F3],AL ;STORE PORT ECHO
K0B07 OUT DX,AL
K0B08 JMP K0A1A
K0B0B RET
K0B0C RET
K0B0D RET
K0B0E RET
K0B0F RET
K0B10: ;;<<<<>>>>>
CALL K069A ;ERASE INPUTLINE
K0B13 INC BYTE PTR [01FD] ;NEW ;NEXT LINE
K0B17 CALL K05C7 ;HIGHLIGHT LINE
K0B1A RET
K0B1B RET
K0B1C RET
K0B1D RET
K0B1E RET
K0B1F RET
K0B20 RET
;;<<<<>>>>>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Sample Sepper Motor Control test Program AUG/98
;;;Only capital lettters are used. DESIGNED BY NICK K. VAN VLIET
M ;motor
1 ;motor #
D ;delay
100 ;# of .5 second delay
H ;half step mode
200 ;# of half steps
C ;counterclockwise direction
S ;step mode
50000 ;# of Step
K ;klockwise direction
F ;full steps
123 ;# of full steps
D
50
S
20
C
S
25
K
S
25
D
20
C
S
50
M ;motor
2
D
100
K
S
20
C
S
50
D
2
K
S
10
C
S
9
K
S
8
M ;motor
3
C
S
7
K
S
6
C
S
5
M ;motor
1
S
3000
;done
Would you like to order my
'Machine Code Training For The IBM-PC Using Debug.Exe'
which contains a complete desciption, with comments,
of all updated Chess COM programs and other COM programs.
Contact [email protected] at Xlibris.com.
(refer your order to BID 38633)