16ビットマイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第3回]
●16ビット版「TK−80」モニタプログラム
前回書きました通り、16ビット版「TK−80」モニタプログラムはすでに作成済みです。
下がそのアセンブルリストです。
2016/11/22 22:17 n16mon0e.txt [00001] ;am188 tk80 monitor [00002] ;16/11/19 11/20 11/21 11/22 [00003] ORG=F000 [00004] ; [00005] ; [00006] ; 83FF-83F8 7SEGMENT DISPLAY ADDRESS [00007] ; [00008] DIG=FFF8 [00009] ; [00010] ; RST7=FFCC [00011] ; RST6=FFC9 [00012] ; RST5=FFC6 [00013] ; RST4=FFC3 [00014] ; RST3=FFC0 [00015] ; RST2=FFBD [00016] ; RST1=FFBA [00017] ; SINERMK=FFB8 [00018] ;INT TABLE FF80-FFAF [00019] ; [00020] DISP=FFF4 [00021] KFLAG=FFF3 [00022] BRKCT=FFF2 [00023] BRKAD=FFF0 [00024] ADRES1=FFEF [00025] ADRES=FFEE [00026] DATA1=FFED [00027] DATA=FFEC [00028] FSAVE=FFEA [00029] ASAVE=FFE8 [00030] BSAVE=FFE6 [00031] CSAVE=FFE4 [00032] DSAVE=FFE2 [00033] SISAVE=FFE0 [00034] DISAVE=FFDE [00035] SSAVE=FFDC [00036] PSAVE=FFDA [00037] CALLCS=FFD8 [00038] CALLPC=FFD6 [00039] ; [00040] ; RST7=$0038 [00041] ; RST6=$83DD [00042] ; RST5=$83DA [00043] ; RST4=$83D7 [00044] ; RST3=$83D4 [00045] ; RST2=$83D1 [00046] ; [00047] MONSP=FFD0 [00048] USRSP=FFC0 [00049] ; [00050] TRA=0004 [00051] TRC=0006 [00052] ; [00053] F000 EB0490 START0:JMP START1 <F006> [00054] F003 E92301 BRK:JMP BRENT <F129> [00055] ; [00056] F006 BAA0FF START1:MOV DX,FFA0;umcs [00057] F009 B83FE0 MOV AX,E03F;128k,noready [00058] F00C EF OUT DX,AX [00059] F00D BAA2FF MOV DX,FFA2;lmcs [00060] F010 B83F1F MOV AX,1F3F [00061] F013 EF OUT DX,AX [00062] F014 BA70FF MOV DX,FF70;piomode0 [00063] F017 B80100 MOV AX,0001 [00064] F01A EF OUT DX,AX [00065] F01B BA72FF MOV DX,FF72;pdir0 [00066] F01E B80EFC MOV AX,FC0E [00067] F021 EF OUT DX,AX [00068] F022 BA78FF MOV DX,FF78;pdir1 [00069] F025 B8FEFF MOV AX,FFFE;pacs active [00070] F028 EF OUT DX,AX [00071] F029 BAA8FF MOV DX,FFA8;mpcs [00072] F02C B8B880 MOV AX,80B8 [00073] F02F EF OUT DX,AX [00074] F030 BAA4FF MOV DX,FFA4;pacs [00075] F033 B87608 MOV AX,0876;i/o base address=8000 [00076] F036 EF OUT DX,AX [00077] F037 BA8380 MOV DX,8083;**** 82c55 [00078] F03A B080 MOV AL,80;**** all port out [00079] F03C EE OUT DX,AL;**** [00080] F03D B800F0 MOV AX,F000 [00081] F040 8EC8 MOV CS,AX [00082] ; MOV AX,CS; [00083] ; MOV DX,8080; [00084] ; OUT DX,AX; [00085] ; [00086] ;monitor start [00087] ; [00088] F042 B0FF MONST:MOV AL,FF [00089] F044 BA9880 MOV DX,8098 [00090] F047 EE OUT DX,AL [00091] F048 BFD6FF MOV DI,*CALLPC [00092] F04B B322 MOV BL,22;34 [00093] F04D 32C0 XOR AL,AL [00094] F04F 8805 MONST2:MOV [DI],AL [00095] F051 47 INC DI [00096] F052 FECB DEC BL [00097] F054 75F9 JNZ MONST2 <F04F> [00098] F056 B8C0FF MOV AX,USRSP [00099] F059 A3DCFF MOV [SSAVE],AX [00100] F05C B803F0 MOV AX,*BRK [00101] F05F A30400 MOV [TRA],AX [00102] F062 B800F0 MOV AX,F000 [00103] F065 A30600 MOV [TRC],AX [00104] ; [00105] ; MONITOR START [00106] ; [00107] F068 BCD0FF START:MOV SP,MONSP [00108] F06B E81F01 CALL SEGCG <F18D> [00109] F06E E8E501 START2:CALL LEDDP <F256> [00110] F071 E86101 CALL KEYIN <F1D5> [00111] F074 8AD8 MOV BL,AL [00112] F076 2410 AND AL,10 [00113] F078 7411 JZ DIGIT <F08B> [00114] F07A 80E30F AND BL,0F [00115] F07D 8AFB MOV BH,BL [00116] F07F 02DB ADD BL,BL [00117] F081 02DF ADD BL,BH [00118] F083 B700 MOV BH,00 [00119] F085 81C39CF0 ADD BX,TABL [00120] F089 FFE3 JMP BX [00121] ; [00122] F08B E8F000 DIGIT:CALL SHIFT <F17E> [00123] F08E A0ECFF MOV AL,[*DATA] [00124] F091 0AC3 OR AL,BL [00125] F093 A2ECFF MOV [*DATA],AL [00126] F096 E8CF00 CALL RGDSP <F168> [00127] F099 EBCD90 JMP START <F068> [00128] ; [00129] F09C EB5290 TABL:JMP GOTO <F0F0> [00130] F09F EB5590 JMP RESRG <F0F6> [00131] F0A2 EB1090 JMP *ADSET <F0B4> [00132] F0A5 EB3290 JMP *ADDCX <F0D9> [00133] F0A8 EB1190 JMP *ADINX <F0BB> [00134] F0AB EB3790 JMP MEMW <F0E4> [00135] F0AE E9B500 JMP SDATA <F166> [00136] F0B1 E9B300 JMP LDATA <F167> [00137] ; [00138] ; ADDRESS SET [00139] ; [00140] F0B4 8B36ECFF ADSET:MOV SI,[*DATA] [00141] F0B8 EB0690 JMP ADINX2 <F0C0> [00142] ; [00143] ; MEMORY READ & ADDRESS INCREMENT [00144] ; [00145] F0BB 8B36EEFF ADINX:MOV SI,[*ADRES] [00146] F0BF 46 INC SI [00147] F0C0 E80A00 ADINX2:CALL MEMR <F0CD> [00148] F0C3 8936EEFF ADSTR:MOV [*ADRES],SI [00149] F0C7 E89E00 CALL RGDSP <F168> [00150] F0CA EB9C90 JMP START <F068> [00151] ; [00152] F0CD A0ECFF MEMR:MOV AL,[*DATA] [00153] F0D0 A2EDFF MOV [*DATA1],AL [00154] F0D3 8A04 MOV AL,[SI] [00155] F0D5 A2ECFF MOV [*DATA],AL [00156] F0D8 C3 RET [00157] ; [00158] ; MEMORY READ & ADDRESS DECREMENT [00159] ; [00160] F0D9 8B36EEFF ADDCX:MOV SI,[*ADRES] [00161] F0DD 4E DEC SI [00162] F0DE E8ECFF CALL MEMR <F0CD> [00163] F0E1 EBE090 JMP ADSTR <F0C3> [00164] ; [00165] ; MEMORY WRITE [00166] ; [00167] F0E4 8B36EEFF MEMW:MOV SI,[*ADRES] [00168] F0E8 A0ECFF MOV AL,[*DATA] [00169] F0EB 8804 MOV [SI],AL [00170] F0ED EBCC90 JMP ADINX <F0BB> [00171] ; [00172] ; [00173] ; MONITOR TO USER CONTROL ROUTINE [00174] ; [00175] F0F0 A1EEFF GOTO:MOV AX,[*ADRES] [00176] F0F3 A3DAFF MOV [PSAVE],AX [00177] ; REGISTER RESTORE [00178] ; [00179] F0F6 8B26DCFF RESRG:MOV SP,[SSAVE] [00180] F0FA 8B1EE6FF MOV BX,[*BSAVE] [00181] F0FE 8B0EE4FF MOV CX,[*CSAVE] [00182] F102 8B36E0FF MOV SI,[*SISAVE] [00183] F106 8B3EDEFF MOV DI,[*DISAVE] [00184] F10A BA9480 MOV DX,8094;trap switch check [00185] F10D EC IN AL,DX [00186] F10E 2480 AND AL,80 [00187] F110 A1EAFF MOV AX,[*FSAVE] [00188] F113 7503 JNZ NOSTEP <F118> [00189] F115 80CC01 OR AH,01;trap on [00190] F118 50 NOSTEP:PUSH AX;push FR [00191] F119 B80000 MOV AX,0000 [00192] F11C 50 PUSH AX;CS [00193] F11D A1DAFF MOV AX,[PSAVE] [00194] F120 50 PUSH AX [00195] F121 A1E8FF MOV AX,[*ASAVE] [00196] F124 8B16E2FF MOV DX,[*DSAVE] [00197] F128 CF IRET [00198] ; [00199] ;break entry [00200] F129 A3E8FF BRENT:MOV [*ASAVE],AX [00201] F12C 891EE6FF MOV [*BSAVE],BX [00202] F130 890EE4FF MOV [*CSAVE],CX [00203] F134 8916E2FF MOV [*DSAVE],DX [00204] F138 893EDEFF MOV [*DISAVE],DI [00205] F13C 8936E0FF MOV [*SISAVE],SI [00206] F140 58 POP AX;PC [00207] F141 A3DAFF MOV [PSAVE],AX [00208] F144 58 POP AX;CS [00209] F145 A3D8FF MOV [*CALLCS],AX [00210] F148 58 POP AX [00211] F149 A3EAFF MOV [*FSAVE],AX [00212] F14C 8BC4 MOV AX,SP [00213] F14E A3DCFF MOV [SSAVE],AX [00214] F151 BCD0FF MOV SP,MONSP [00215] F154 A1DAFF MOV AX,[PSAVE] [00216] F157 A3EEFF MOV [*ADRES],AX [00217] F15A A1E8FF MOV AX,[*ASAVE] [00218] F15D A3ECFF MOV [*DATA],AX [00219] F160 E80500 ADDSP:CALL RGDSP <F168> [00220] F163 E902FF JMP START <F068> [00221] ; [00222] F166 90 SDATA:NOP [00223] ; [00224] F167 90 LDATA:NOP [00225] ; [00226] ;;; SUBROUTINE [00227] ; [00228] ;move ADDRES,DATA to DISP & [00229] ;segment change & LED display [00230] F168 BEEFFF RGDSP:MOV SI,*ADRES1 [00231] F16B BFF4FF MOV DI,*DISP [00232] F16E B304 MOV BL,04 [00233] F170 8A04 RGDSP2:MOV AL,[SI] [00234] F172 8805 MOV [DI],AL [00235] F174 4E DEC SI [00236] F175 47 INC DI [00237] F176 FECB DEC BL [00238] F178 75F6 JNZ RGDSP2 <F170> [00239] F17A E81000 CALL SEGCG <F18D> [00240] F17D C3 RET [00241] ; [00242] ;DATA shift left(4bit) [00243] ; [00244] F17E A1ECFF SHIFT:MOV AX,[*DATA] [00245] F181 03C0 ADD AX,AX [00246] F183 03C0 ADD AX,AX [00247] F185 03C0 ADD AX,AX [00248] F187 03C0 ADD AX,AX [00249] F189 A3ECFF MOV [*DATA],AX [00250] F18C C3 RET [00251] ; [00252] ; SEGMENT CONVERT SUB [00253] ; [00254] F18D BEF4FF SEGCG:MOV SI,*DISP [00255] F190 BFF8FF MOV DI,*DIG [00256] F193 B104 MOV CL,04 [00257] F195 8A1C SEGCG2:MOV BL,[SI];high 4bit [00258] F197 D0CB ROR BL [00259] F199 D0CB ROR BL [00260] F19B D0CB ROR BL [00261] F19D D0CB ROR BL [00262] F19F 80E30F AND BL,0F [00263] F1A2 B700 MOV BH,00 [00264] F1A4 81C3C5F1 ADD BX,SEGD [00265] F1A8 2E CS: [00266] F1A9 8A07 MOV AL,[BX] [00267] F1AB 8805 MOV [DI],AL [00268] F1AD 47 INC DI [00269] F1AE 8A1C MOV BL,[SI];low 4bit [00270] F1B0 80E30F AND BL,0F [00271] F1B3 B700 MOV BH,00 [00272] F1B5 81C3C5F1 ADD BX,SEGD [00273] ; MOV DX,8080;**** [00274] ; MOV AX,CS;**** [00275] ; OUT DX,AX;**** [00276] F1B9 2E CS: [00277] F1BA 8A07 MOV AL,[BX] [00278] F1BC 8805 MOV [DI],AL [00279] ; MOV DX,8082;**** [00280] ; OUT DX,AL;**** [00281] F1BE 46 INC SI [00282] F1BF 47 INC DI [00283] F1C0 FEC9 DEC CL [00284] F1C2 75D1 JNZ SEGCG2 <F195> [00285] F1C4 C3 RET [00286] ; [00287] ; SEGMENT DATA [00288] ; [00289] F1C5 5C SEGD:DB 5C [00290] F1C6 06 DB 06 [00291] F1C7 5B DB 5B [00292] F1C8 4F DB 4F [00293] F1C9 66 DB 66 [00294] F1CA 6D DB 6D [00295] F1CB 7D DB 7D [00296] F1CC 27 DB 27 [00297] F1CD 7F DB 7F [00298] F1CE 6F DB 6F [00299] F1CF 77 DB 77 [00300] F1D0 7C DB 7C [00301] F1D1 39 DB 39 [00302] F1D2 5E DB 5E [00303] F1D3 79 DB 79 [00304] F1D4 71 DB 71 [00305] ; [00306] ; KEY INPUT [00307] ; [00308] F1D5 E80C00 KEYIN:CALL INPUT <F1E4> [00309] F1D8 8AD8 MOV BL,AL [00310] F1DA A0F3FF MOV AL,[KFLAG] [00311] F1DD 0AC0 OR AL,AL [00312] F1DF 74F4 JZ KEYIN <F1D5> [00313] F1E1 8AC3 MOV AL,BL [00314] F1E3 C3 RET [00315] ; [00316] ; KEY INPUT SUB [00317] ; [00318] F1E4 E82400 INPUT:CALL KEY <F20B> [00319] F1E7 FEC0 INC AL [00320] F1E9 741B JZ NOKEY <F206> [00321] F1EB E85100 INPUT2:CALL D1 <F23F> [00322] F1EE E81A00 CALL KEY <F20B> [00323] F1F1 8AD8 MOV BL,AL [00324] F1F3 FEC0 INC AL [00325] F1F5 740F JZ NOKEY <F206> [00326] F1F7 A0F3FF MOV AL,[KFLAG] [00327] F1FA 0AC0 OR AL,AL [00328] F1FC 75ED JNZ INPUT2 <F1EB> [00329] F1FE FEC8 DEC AL [00330] F200 A2F3FF INPUT3:MOV [KFLAG],AL [00331] F203 8AC3 MOV AL,BL [00332] F205 C3 RET [00333] F206 B3FF NOKEY:MOV BL,FF [00334] F208 EBF690 JMP INPUT3 <F200> [00335] ; [00336] ; KEY SCAN & CONVERT HEX DATA SUB [00337] ; [00338] F20B BA9C80 KEY:MOV DX,809C [00339] F20E B100 MOV CL,00 [00340] F210 B300 MOV BL,00 [00341] F212 B0F6 MOV AL,F6 [00342] F214 EE OUT DX,AL [00343] F215 EC IN AL,DX [00344] F216 34FF XOR AL,FF [00345] F218 7517 JNZ KEYI <F231> [00346] F21A B308 MOV BL,08 [00347] F21C B0F5 MOV AL,F5 [00348] F21E EE OUT DX,AL [00349] F21F EC IN AL,DX [00350] F220 34FF XOR AL,FF [00351] F222 750D JNZ KEYI <F231> [00352] F224 B310 MOV BL,10 [00353] F226 B0F3 MOV AL,F3 [00354] F228 EE OUT DX,AL [00355] F229 EC IN AL,DX [00356] F22A 34FF XOR AL,FF [00357] F22C 7503 JNZ KEYI <F231> [00358] F22E FEC8 DEC AL [00359] F230 C3 RET [00360] F231 D0C8 KEYI:ROR AL [00361] F233 7205 JC KEYI2 <F23A> [00362] F235 FEC1 INC CL [00363] F237 EBF890 JMP KEYI <F231> [00364] F23A 8AC1 KEYI2:MOV AL,CL [00365] F23C 0AC3 OR AL,BL [00366] F23E C3 RET [00367] ; [00368] ;CHATTERING TIMER [00369] ; [00370] F23F B524 D1:MOV CH,24;=36 ck=4 125.2*36=4507.2microsec [00371] F241 B19C D1_2:MOV CL,9C;=156 ck=4 4+8*156=1252 1252*0.1=125.2microsec [00372] F243 FEC9 D1_3:DEC CL; ck=2 [00373] F245 75FC JNZ D1_3; ck=6 <F243> [00374] F247 FECD DEC CH; ck=2 [00375] F249 75F6 JNZ D1_2; ck=6 <F241> [00376] F24B C3 RET; ck=6 [00377] F24C B548 D2:MOV CH,48;=72 125.2*72=9014.4microsec [00378] F24E EBF190 JMP D1_2 <F241> [00379] F251 B5D8 D3:MOV CH,D8;=216 125.2*216=27043.2microsec [00380] F253 EBEC90 JMP D1_2 <F241> [00381] ;;; [00382] ; [00383] F256 56 LEDDP:PUSH SI [00384] F257 52 PUSH DX [00385] F258 53 PUSH BX [00386] F259 51 PUSH CX [00387] F25A BEF8FF MOV SI,*DIG [00388] F25D B308 MOV BL,08 [00389] F25F B700 MOV BH,00 [00390] F261 E80C00 LEDDP2:CALL LEDDPS <F270> [00391] F264 46 INC SI [00392] F265 FEC7 INC BH [00393] F267 FECB DEC BL [00394] F269 75F6 JNZ LEDDP2 <F261> [00395] F26B 59 POP CX [00396] F26C 5B POP BX [00397] F26D 5A POP DX [00398] F26E 5E POP SI [00399] F26F C3 RET [00400] ; [00401] F270 BA8880 LEDDPS:MOV DX,8088 [00402] F273 B00E MOV AL,0E [00403] F275 EE OUT DX,AL;busy [00404] F276 8A04 MOV AL,[SI] [00405] F278 B28C MOV DL,8C [00406] F27A EE OUT DX,AL [00407] F27B 8AC7 MOV AL,BH [00408] F27D B288 MOV DL,88;adrs set [00409] F27F EE OUT DX,AL [00410] F280 B502 MOV CH,02 [00411] F282 E8BCFF CALL D1_2;0.5msec wait <F241> [00412] F285 B00E MOV AL,0E [00413] F287 EE OUT DX,AL [00414] F288 C3 RET [00415] ; [00416] ORG=FFF0 [00417] FFF0 E90DF0 JMP START0 <F000> [00418] ; F000-FFF2 ADDCX =F0D9 ADDSP =F160 ADINX =F0BB ADINX2 =F0C0 ADRES =FFEE ADRES1 =FFEF ADSET =F0B4 ADSTR =F0C3 ASAVE =FFE8 BRENT =F129 BRK =F003 BRKAD =FFF0 BRKCT =FFF2 BSAVE =FFE6 CALLCS =FFD8 CALLPC =FFD6 CSAVE =FFE4 D1 =F23F D1_2 =F241 D1_3 =F243 D2 =F24C D3 =F251 DATA =FFEC DATA1 =FFED DIG =FFF8 DIGIT =F08B DISAVE =FFDE DISP =FFF4 DSAVE =FFE2 FSAVE =FFEA GOTO =F0F0 INPUT =F1E4 INPUT2 =F1EB INPUT3 =F200 KEY =F20B KEYI =F231 KEYI2 =F23A KEYIN =F1D5 KFLAG =FFF3 LDATA =F167 LEDDP =F256 LEDDP2 =F261 LEDDPS =F270 MEMR =F0CD MEMW =F0E4 MONSP =FFD0 MONST =F042 MONST2 =F04F NOKEY =F206 NOSTEP =F118 PSAVE =FFDA RESRG =F0F6 RGDSP =F168 RGDSP2 =F170 SDATA =F166 SEGCG =F18D SEGCG2 =F195 SEGD =F1C5 SHIFT =F17E SISAVE =FFE0 SSAVE =FFDC START =F068 START0 =F000 START1 =F006 START2 =F06E TABL =F09C TRA =0004 TRC =0006 USRSP =FFC0 |
[2017.1.6追記]
アドレスFFF0にあるJMP START0は誤用でした([第8回]参照)。
[追記ここまで]
急ごしらえですから、後で修正するところが出てくるかもしれません。
リストトップに更新日付がつけてあります。
今から一ヶ月と少し前に作業完了しています。
11月19日〜22日の4日間で作り上げました。
なにしろ初めてさわるCPUでいろいろ約束事をdatasheetで確認しながらの作業でしたから結構大変でした。
8086のプログラムなんて超久しぶりですので、錆付いた頭の活性化のための練習を兼ねて、TK−80モニタプログラムリストを見ながら、それを8086のプログラムに置き換えるという方法で作成しました。
書き上げたソースプログラムを8086のマシン語コードに翻訳する8086アセンブラもずっと昔に自前で作成した自作アセンブラです。
この8086アセンブラも「AM188組立てキット」には付属する予定で考えています。
上のリストを見ていただければわかりますように、16ビットのマシン語プログラムにはアセンブラが必須だと思います。
なにしろJMPやCALLがすべて相対アドレスですから、たとえ短いプログラムでもそれをハンドアセンブルでやるのは困難です。
上のリストでCALLやJMPの後ろに<>で示されているアドレスはアセンブラが算出した絶対番地です。
ジャンプ先などのラベルのアドレスはリストの末尾にまとめて出力されますが、いちいちそこを見なくても楽に飛び先の確認ができるようにという考えでそのようにしてあります。
前回書きましたAM188のスタートアドレスはリストの最後にあります。
アドレスFFF0です。
ここにはプログラムトップへのJMP命令を置いてあります。
AM188は起動するためにいろいろ設定が必要です。
その設定はプログラムの先頭で行なっています。
そのあたりの説明については次回以降で少しずつ書いていくつもりです。
あっという間の一年でした。
年初の意気込みもむなしく、予定の半分もこなせずに終ってしまいました。
今年一年拙文にお付き合いいただき有難うございました。
心より厚く御礼申し上げます。
来年も倍旧のお引き立てを賜りますようお願い申し上げます。
皆様、よいお年をお迎えください。
16ビットマイコンボードの製作[第3回]
2016.12.31upload
2017.1.6追記
前へ
次へ
ホームページトップへ戻る